summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2023-06-13 13:33:20 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2023-06-28 10:28:01 +0000
commitb5eefeb8ec4af885f132e9bb71e64192d719309b (patch)
treee9d9e9b1a5248b0f65957d0908ac828746e40475
parentab965b1c2c3e7e4cd62a4b45abfaf393f4fb4618 (diff)
BASELINE: Update Chromium to 112.0.5615.213
Change-Id: I548d599551cd596df157e3c1b61382350dcda645 Reviewed-on: https://codereview.qt-project.org/c/qt/qtwebengine-chromium/+/484598 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
-rw-r--r--chromium/DEPS14
-rw-r--r--chromium/base/android/COMMON_METADATA1
-rw-r--r--chromium/base/android/DIR_METADATA1
-rw-r--r--chromium/base/android/OWNERS9
-rw-r--r--chromium/base/android/README.md69
-rw-r--r--chromium/base/android/android_hardware_buffer_compat.cc127
-rw-r--r--chromium/base/android/android_hardware_buffer_compat.h77
-rw-r--r--chromium/base/android/android_image_reader_abi.h116
-rw-r--r--chromium/base/android/android_image_reader_compat.cc166
-rw-r--r--chromium/base/android/android_image_reader_compat.h89
-rw-r--r--chromium/base/android/android_image_reader_compat_unittest.cc42
-rw-r--r--chromium/base/android/apk_assets.cc55
-rw-r--r--chromium/base/android/apk_assets.h43
-rw-r--r--chromium/base/android/application_status_listener.cc127
-rw-r--r--chromium/base/android/application_status_listener.h97
-rw-r--r--chromium/base/android/application_status_listener_unittest.cc128
-rw-r--r--chromium/base/android/base_feature_list.cc47
-rw-r--r--chromium/base/android/base_features.cc34
-rw-r--r--chromium/base/android/base_features.h22
-rw-r--r--chromium/base/android/base_jni_onload.cc23
-rw-r--r--chromium/base/android/base_jni_onload.h22
-rw-r--r--chromium/base/android/build_info.cc93
-rw-r--r--chromium/base/android/build_info.h192
-rw-r--r--chromium/base/android/bundle_utils.cc103
-rw-r--r--chromium/base/android/bundle_utils.h44
-rw-r--r--chromium/base/android/callback_android.cc58
-rw-r--r--chromium/base/android/callback_android.h47
-rw-r--r--chromium/base/android/child_process_binding_types.h26
-rw-r--r--chromium/base/android/child_process_service.cc83
-rw-r--r--chromium/base/android/child_process_unittest.cc42
-rw-r--r--chromium/base/android/command_line_android.cc100
-rw-r--r--chromium/base/android/content_uri_utils.cc86
-rw-r--r--chromium/base/android/content_uri_utils.h41
-rw-r--r--chromium/base/android/content_uri_utils_unittest.cc38
-rw-r--r--chromium/base/android/cpu_features.cc22
-rw-r--r--chromium/base/android/early_trace_event_binding.cc138
-rw-r--r--chromium/base/android/early_trace_event_binding.h24
-rw-r--r--chromium/base/android/event_log.cc16
-rw-r--r--chromium/base/android/event_log.h20
-rw-r--r--chromium/base/android/feature_list_jni.cc16
-rw-r--r--chromium/base/android/features_jni.cc31
-rw-r--r--chromium/base/android/field_trial_list.cc101
-rw-r--r--chromium/base/android/important_file_writer_android.cc37
-rw-r--r--chromium/base/android/int_string_callback.cc28
-rw-r--r--chromium/base/android/int_string_callback.h25
-rw-r--r--chromium/base/android/jank_metric_uma_recorder.cc99
-rw-r--r--chromium/base/android/jank_metric_uma_recorder.h24
-rw-r--r--chromium/base/android/jank_metric_uma_recorder_unittest.cc106
-rw-r--r--chromium/base/android/java_exception_reporter.cc100
-rw-r--r--chromium/base/android/java_exception_reporter.h42
-rw-r--r--chromium/base/android/java_handler_thread.cc182
-rw-r--r--chromium/base/android/java_handler_thread.h117
-rw-r--r--chromium/base/android/java_handler_thread_unittest.cc152
-rw-r--r--chromium/base/android/java_heap_dump_generator.cc22
-rw-r--r--chromium/base/android/java_heap_dump_generator.h23
-rw-r--r--chromium/base/android/java_runtime.cc25
-rw-r--r--chromium/base/android/java_runtime.h25
-rw-r--r--chromium/base/android/javatests/src/org/chromium/base/AdvancedMockContextTest.java78
-rw-r--r--chromium/base/android/javatests/src/org/chromium/base/AssertsTest.java43
-rw-r--r--chromium/base/android/javatests/src/org/chromium/base/CommandLineFlagsTest.java167
-rw-r--r--chromium/base/android/javatests/src/org/chromium/base/CommandLineInitUtilTest.java36
-rw-r--r--chromium/base/android/javatests/src/org/chromium/base/CommandLineTest.java194
-rw-r--r--chromium/base/android/javatests/src/org/chromium/base/EarlyTraceEventTest.java272
-rw-r--r--chromium/base/android/javatests/src/org/chromium/base/IntentUtilsTest.java81
-rw-r--r--chromium/base/android/javatests/src/org/chromium/base/LocaleUtilsTest.java395
-rw-r--r--chromium/base/android/javatests/src/org/chromium/base/ObserverListTest.java340
-rw-r--r--chromium/base/android/javatests/src/org/chromium/base/PackageUtilsTest.java63
-rw-r--r--chromium/base/android/javatests/src/org/chromium/base/StrictModeContextTest.java119
-rw-r--r--chromium/base/android/javatests/src/org/chromium/base/UserDataHostTest.java163
-rw-r--r--chromium/base/android/javatests/src/org/chromium/base/library_loader/EarlyNativeTest.java178
-rw-r--r--chromium/base/android/javatests/src/org/chromium/base/metrics/RecordHistogramTest.java196
-rw-r--r--chromium/base/android/javatests/src/org/chromium/base/profiler/TestSupport.java25
-rw-r--r--chromium/base/android/javatests/src/org/chromium/base/task/AsyncTaskTest.java147
-rw-r--r--chromium/base/android/javatests/src/org/chromium/base/task/PostTaskTest.java123
-rw-r--r--chromium/base/android/javatests/src/org/chromium/base/task/SequencedTaskRunnerImplTest.java42
-rw-r--r--chromium/base/android/javatests/src/org/chromium/base/task/SingleThreadTaskRunnerImplTest.java84
-rw-r--r--chromium/base/android/javatests/src/org/chromium/base/task/TaskRunnerImplTest.java33
-rw-r--r--chromium/base/android/javatests/src/org/chromium/base/util/GarbageCollectionTestUtilsTest.java43
-rw-r--r--chromium/base/android/jni_android.cc320
-rw-r--r--chromium/base/android/jni_android.h182
-rw-r--r--chromium/base/android/jni_android_unittest.cc62
-rw-r--r--chromium/base/android/jni_array.cc539
-rw-r--r--chromium/base/android/jni_array.h247
-rw-r--r--chromium/base/android/jni_array_unittest.cc626
-rw-r--r--chromium/base/android/jni_generator/.style.yapf4
-rw-r--r--chromium/base/android/jni_generator/AndroidManifest.xml12
-rw-r--r--chromium/base/android/jni_generator/DIR_METADATA4
-rw-r--r--chromium/base/android/jni_generator/OWNERS3
-rw-r--r--chromium/base/android/jni_generator/PRESUBMIT.py41
-rw-r--r--chromium/base/android/jni_generator/README.md274
-rw-r--r--chromium/base/android/jni_generator/android_jar.classes98
-rwxr-xr-xchromium/base/android/jni_generator/doc/jni-check-flow.puml29
-rw-r--r--chromium/base/android/jni_generator/doc/jni-check-flow.svg39
-rw-r--r--chromium/base/android/jni_generator/golden/HashedSampleForAnnotationProcessorGenJni.2.golden87
-rw-r--r--chromium/base/android/jni_generator/golden/HashedSampleForAnnotationProcessorGenJni.golden50
-rw-r--r--chromium/base/android/jni_generator/golden/HashedSampleForAnnotationProcessor_jni.golden265
-rw-r--r--chromium/base/android/jni_generator/golden/ModuleGenJni.golden23
-rw-r--r--chromium/base/android/jni_generator/golden/ModuleJN.golden18
-rw-r--r--chromium/base/android/jni_generator/golden/SampleForAnnotationProcessorGenJni.golden52
-rw-r--r--chromium/base/android/jni_generator/golden/SampleForAnnotationProcessorManualJni.golden250
-rw-r--r--chromium/base/android/jni_generator/golden/SampleForAnnotationProcessor_jni.golden283
-rw-r--r--chromium/base/android/jni_generator/golden/SampleForTestsWithSplit_jni.golden527
-rw-r--r--chromium/base/android/jni_generator/golden/SampleForTests_jni.golden527
-rw-r--r--chromium/base/android/jni_generator/golden/testCalledByNatives.golden500
-rw-r--r--chromium/base/android/jni_generator/golden/testConstantsFromJavaP.golden2320
-rw-r--r--chromium/base/android/jni_generator/golden/testFromJavaP.golden276
-rw-r--r--chromium/base/android/jni_generator/golden/testFromJavaPGenerics.golden131
-rw-r--r--chromium/base/android/jni_generator/golden/testGenJniFlagsDisabled.golden52
-rw-r--r--chromium/base/android/jni_generator/golden/testGenJniFlagsMocksEnabled.golden52
-rw-r--r--chromium/base/android/jni_generator/golden/testGenJniFlagsMocksRequired.golden52
-rw-r--r--chromium/base/android/jni_generator/golden/testInnerClassNatives.golden60
-rw-r--r--chromium/base/android/jni_generator/golden/testInnerClassNativesBothInnerAndOuter.golden70
-rw-r--r--chromium/base/android/jni_generator/golden/testInnerClassNativesBothInnerAndOuterRegistrations.golden115
-rw-r--r--chromium/base/android/jni_generator/golden/testInnerClassNativesMultiple.golden83
-rw-r--r--chromium/base/android/jni_generator/golden/testInputStream.javap228
-rw-r--r--chromium/base/android/jni_generator/golden/testMotionEvent.javap2295
-rw-r--r--chromium/base/android/jni_generator/golden/testMotionEvent.javap72370
-rw-r--r--chromium/base/android/jni_generator/golden/testMultipleJNIAdditionalImport.golden71
-rw-r--r--chromium/base/android/jni_generator/golden/testNativeExportsOnlyOption.golden229
-rw-r--r--chromium/base/android/jni_generator/golden/testNatives.golden216
-rw-r--r--chromium/base/android/jni_generator/golden/testNativesLong.golden49
-rw-r--r--chromium/base/android/jni_generator/golden/testNativesRegistrations.golden181
-rw-r--r--chromium/base/android/jni_generator/golden/testProxyMultiplexGenJni.2.golden87
-rw-r--r--chromium/base/android/jni_generator/golden/testProxyMultiplexGenJni.golden30
-rw-r--r--chromium/base/android/jni_generator/golden/testProxyMultiplexNatives.golden361
-rw-r--r--chromium/base/android/jni_generator/golden/testProxyMultiplexNativesRegistration.golden440
-rw-r--r--chromium/base/android/jni_generator/golden/testProxyNatives.golden63
-rw-r--r--chromium/base/android/jni_generator/golden/testProxyNativesJava.golden22
-rw-r--r--chromium/base/android/jni_generator/golden/testProxyNativesMainDex.golden84
-rw-r--r--chromium/base/android/jni_generator/golden/testProxyNativesMainDexAndNonMainDex.golden124
-rw-r--r--chromium/base/android/jni_generator/golden/testProxyNativesRegistrations.golden105
-rw-r--r--chromium/base/android/jni_generator/golden/testProxyNativesWithNatives.golden117
-rw-r--r--chromium/base/android/jni_generator/golden/testREForNatives.golden49
-rw-r--r--chromium/base/android/jni_generator/golden/testSingleJNIAdditionalImport.golden67
-rw-r--r--chromium/base/android/jni_generator/golden/testStaticBindingCaller.golden100
-rw-r--r--chromium/base/android/jni_generator/golden/testTracing.golden106
-rw-r--r--chromium/base/android/jni_generator/java/src/org/chromium/example/jni_generator/SampleForAnnotationProcessor.java69
-rw-r--r--chromium/base/android/jni_generator/java/src/org/chromium/example/jni_generator/SampleForTests.java280
-rw-r--r--chromium/base/android/jni_generator/java/src/org/chromium/example/jni_generator/SampleModule.java21
-rw-r--r--chromium/base/android/jni_generator/java/src/org/chromium/jni_generator/JniProcessor.java530
-rwxr-xr-xchromium/base/android/jni_generator/jni_generator.py1720
-rw-r--r--chromium/base/android/jni_generator/jni_generator_helper.h130
-rwxr-xr-xchromium/base/android/jni_generator/jni_generator_tests.py1901
-rwxr-xr-xchromium/base/android/jni_generator/jni_registration_generator.py928
-rw-r--r--chromium/base/android/jni_generator/sample_entry_point.cc27
-rw-r--r--chromium/base/android/jni_generator/sample_for_tests.cc281
-rw-r--r--chromium/base/android/jni_generator/sample_for_tests.h115
-rw-r--r--chromium/base/android/jni_int_wrapper.h56
-rw-r--r--chromium/base/android/jni_registrar.cc30
-rw-r--r--chromium/base/android/jni_registrar.h28
-rw-r--r--chromium/base/android/jni_string.cc126
-rw-r--r--chromium/base/android/jni_string.h51
-rw-r--r--chromium/base/android/jni_string_unittest.cc48
-rw-r--r--chromium/base/android/jni_utils.cc44
-rw-r--r--chromium/base/android/jni_utils.h34
-rw-r--r--chromium/base/android/jni_weak_ref.cc78
-rw-r--r--chromium/base/android/jni_weak_ref.h51
-rw-r--r--chromium/base/android/junit/src/org/chromium/base/ApplicationStatusTest.java309
-rw-r--r--chromium/base/android/junit/src/org/chromium/base/BuildInfoTest.java82
-rw-r--r--chromium/base/android/junit/src/org/chromium/base/CallbackControllerTest.java139
-rw-r--r--chromium/base/android/junit/src/org/chromium/base/CollectionUtilTest.java37
-rw-r--r--chromium/base/android/junit/src/org/chromium/base/DiscardableReferencePoolTest.java128
-rw-r--r--chromium/base/android/junit/src/org/chromium/base/FileUtilsTest.java552
-rw-r--r--chromium/base/android/junit/src/org/chromium/base/LifetimeAssertTest.java147
-rw-r--r--chromium/base/android/junit/src/org/chromium/base/LogTest.java84
-rw-r--r--chromium/base/android/junit/src/org/chromium/base/MathUtilsTest.java88
-rw-r--r--chromium/base/android/junit/src/org/chromium/base/PathUtilsTest.java86
-rw-r--r--chromium/base/android/junit/src/org/chromium/base/PiiEliderTest.java181
-rw-r--r--chromium/base/android/junit/src/org/chromium/base/PromiseTest.java270
-rw-r--r--chromium/base/android/junit/src/org/chromium/base/TimeUtilsTest.java57
-rw-r--r--chromium/base/android/junit/src/org/chromium/base/TraceEventTest.java69
-rw-r--r--chromium/base/android/junit/src/org/chromium/base/UnownedUserDataHostTest.java52
-rw-r--r--chromium/base/android/junit/src/org/chromium/base/UnownedUserDataKeyTest.java934
-rw-r--r--chromium/base/android/junit/src/org/chromium/base/jank_tracker/FrameMetricsListenerTest.java59
-rw-r--r--chromium/base/android/junit/src/org/chromium/base/jank_tracker/FrameMetricsStoreTest.java217
-rw-r--r--chromium/base/android/junit/src/org/chromium/base/jank_tracker/JankActivityTrackerTest.java157
-rw-r--r--chromium/base/android/junit/src/org/chromium/base/jank_tracker/JankMetricCalculatorTest.java107
-rw-r--r--chromium/base/android/junit/src/org/chromium/base/jank_tracker/JankMetricUMARecorderTest.java54
-rw-r--r--chromium/base/android/junit/src/org/chromium/base/jank_tracker/JankReportingRunnableTest.java91
-rw-r--r--chromium/base/android/junit/src/org/chromium/base/jank_tracker/JankReportingSchedulerTest.java146
-rw-r--r--chromium/base/android/junit/src/org/chromium/base/library_loader/LinkerTest.java271
-rw-r--r--chromium/base/android/junit/src/org/chromium/base/memory/MemoryPressureMonitorTest.java357
-rw-r--r--chromium/base/android/junit/src/org/chromium/base/memory/MemoryPurgeManagerTest.java216
-rw-r--r--chromium/base/android/junit/src/org/chromium/base/metrics/CachingUmaRecorderTest.java602
-rw-r--r--chromium/base/android/junit/src/org/chromium/base/process_launcher/ChildConnectionAllocatorTest.java455
-rw-r--r--chromium/base/android/junit/src/org/chromium/base/process_launcher/ChildProcessConnectionTest.java665
-rw-r--r--chromium/base/android/junit/src/org/chromium/base/supplier/ObservableSupplierImplTest.java190
-rw-r--r--chromium/base/android/junit/src/org/chromium/base/supplier/OneShotCallbackTest.java95
-rw-r--r--chromium/base/android/junit/src/org/chromium/base/supplier/OneshotSupplierImplTest.java79
-rw-r--r--chromium/base/android/junit/src/org/chromium/base/supplier/UnownedUserDataSupplierTest.java168
-rw-r--r--chromium/base/android/junit/src/org/chromium/base/task/AsyncTaskThreadTest.java264
-rw-r--r--chromium/base/android/junit/src/org/chromium/base/task/SequencedTaskRunnerTaskMigrationTest.java201
-rw-r--r--chromium/base/android/junit/src/org/chromium/base/task/TaskTraitsTest.java77
-rw-r--r--chromium/base/android/junit/src/org/chromium/base/util/GarbageCollectionTestUtilsUnitTest.java40
-rw-r--r--chromium/base/android/library_loader/README.md7
-rw-r--r--chromium/base/android/library_loader/anchor_functions.cc99
-rw-r--r--chromium/base/android/library_loader/anchor_functions.h35
-rw-r--r--chromium/base/android/library_loader/anchor_functions.lds7
-rw-r--r--chromium/base/android/library_loader/library_loader_hooks.cc116
-rw-r--r--chromium/base/android/library_loader/library_loader_hooks.h92
-rw-r--r--chromium/base/android/library_loader/library_prefetcher.cc345
-rw-r--r--chromium/base/android/library_loader/library_prefetcher.h71
-rw-r--r--chromium/base/android/library_loader/library_prefetcher_hooks.cc44
-rw-r--r--chromium/base/android/library_loader/library_prefetcher_unittest.cc49
-rw-r--r--chromium/base/android/linker/DEPS14
-rw-r--r--chromium/base/android/linker/linker_jni.cc865
-rw-r--r--chromium/base/android/linker/linker_jni.h405
-rw-r--r--chromium/base/android/linker/linker_jni_onload.cc36
-rw-r--r--chromium/base/android/linker/linker_minimal_libcxx.cc79
-rw-r--r--chromium/base/android/linker/linker_unittest.cc275
-rw-r--r--chromium/base/android/locale_utils.cc34
-rw-r--r--chromium/base/android/locale_utils.h29
-rw-r--r--chromium/base/android/meminfo_dump_provider.cc105
-rw-r--r--chromium/base/android/meminfo_dump_provider.h38
-rw-r--r--chromium/base/android/meminfo_dump_provider_unittest.cc101
-rw-r--r--chromium/base/android/memory_pressure_listener_android.cc29
-rw-r--r--chromium/base/android/memory_pressure_listener_android.h29
-rw-r--r--chromium/base/android/native_uma_recorder.cc333
-rw-r--r--chromium/base/android/orderfile/OWNERS2
-rw-r--r--chromium/base/android/orderfile/orderfile_call_graph_instrumentation.cc418
-rw-r--r--chromium/base/android/orderfile/orderfile_call_graph_instrumentation_perftest.cc155
-rw-r--r--chromium/base/android/orderfile/orderfile_instrumentation.cc361
-rw-r--r--chromium/base/android/orderfile/orderfile_instrumentation.h58
-rw-r--r--chromium/base/android/orderfile/orderfile_instrumentation_perftest.cc135
-rw-r--r--chromium/base/android/path_service_android.cc22
-rw-r--r--chromium/base/android/path_utils.cc94
-rw-r--r--chromium/base/android/path_utils.h59
-rw-r--r--chromium/base/android/path_utils_unittest.cc65
-rw-r--r--chromium/base/android/proguard/OWNERS1
-rw-r--r--chromium/base/android/proguard/chromium_apk.flags86
-rw-r--r--chromium/base/android/proguard/chromium_code.flags56
-rw-r--r--chromium/base/android/proguard/remove_logging.flags48
-rw-r--r--chromium/base/android/radio_utils.cc77
-rw-r--r--chromium/base/android/radio_utils.h65
-rw-r--r--chromium/base/android/radio_utils_unittest.cc26
-rw-r--r--chromium/base/android/reached_addresses_bitset.cc118
-rw-r--r--chromium/base/android/reached_addresses_bitset.h73
-rw-r--r--chromium/base/android/reached_addresses_bitset_unittest.cc78
-rw-r--r--chromium/base/android/reached_code_profiler.cc303
-rw-r--r--chromium/base/android/reached_code_profiler.h34
-rw-r--r--chromium/base/android/reached_code_profiler_stub.cc22
-rw-r--r--chromium/base/android/remove_stale_data.cc57
-rw-r--r--chromium/base/android/remove_stale_data.h25
-rw-r--r--chromium/base/android/scoped_hardware_buffer_fence_sync.cc37
-rw-r--r--chromium/base/android/scoped_hardware_buffer_fence_sync.h47
-rw-r--r--chromium/base/android/scoped_hardware_buffer_handle.cc121
-rw-r--r--chromium/base/android/scoped_hardware_buffer_handle.h92
-rw-r--r--chromium/base/android/scoped_java_ref.cc92
-rw-r--r--chromium/base/android/scoped_java_ref.h537
-rw-r--r--chromium/base/android/scoped_java_ref_unittest.cc340
-rw-r--r--chromium/base/android/statistics_recorder_android.cc28
-rw-r--r--chromium/base/android/sys_utils.cc55
-rw-r--r--chromium/base/android/sys_utils.h26
-rw-r--r--chromium/base/android/sys_utils_unittest.cc24
-rw-r--r--chromium/base/android/task_scheduler/post_task_android.cc39
-rw-r--r--chromium/base/android/task_scheduler/post_task_android.h31
-rw-r--r--chromium/base/android/task_scheduler/task_runner_android.cc183
-rw-r--r--chromium/base/android/task_scheduler/task_runner_android.h55
-rw-r--r--chromium/base/android/thread_instruction_count.cc90
-rw-r--r--chromium/base/android/thread_instruction_count.h63
-rw-r--r--chromium/base/android/timezone_utils.cc24
-rw-r--r--chromium/base/android/timezone_utils.h23
-rw-r--r--chromium/base/android/trace_event_binding.cc362
-rw-r--r--chromium/base/android/trace_event_binding.h19
-rw-r--r--chromium/base/android/unguessable_token_android.cc44
-rw-r--r--chromium/base/android/unguessable_token_android.h44
-rw-r--r--chromium/base/android/unguessable_token_android_unittest.cc46
-rw-r--r--chromium/base/files/file_path.cc24
-rw-r--r--chromium/base/files/file_path_unittest.cc7
-rw-r--r--chromium/build/util/LASTCHANGE2
-rw-r--r--chromium/build/util/LASTCHANGE.committime2
-rw-r--r--chromium/chrome/VERSION2
-rw-r--r--chromium/chrome/app/resources/chromium_strings_am.xtb12
-rw-r--r--chromium/chrome/app/resources/chromium_strings_da.xtb28
-rw-r--r--chromium/chrome/app/resources/chromium_strings_it.xtb4
-rw-r--r--chromium/chrome/app/resources/chromium_strings_kn.xtb6
-rw-r--r--chromium/chrome/app/resources/chromium_strings_ky.xtb14
-rw-r--r--chromium/chrome/app/resources/chromium_strings_mk.xtb2
-rw-r--r--chromium/chrome/app/resources/chromium_strings_mr.xtb4
-rw-r--r--chromium/chrome/app/resources/chromium_strings_ne.xtb2
-rw-r--r--chromium/chrome/app/resources/chromium_strings_nl.xtb2
-rw-r--r--chromium/chrome/app/resources/chromium_strings_sw.xtb2
-rw-r--r--chromium/chrome/app/resources/chromium_strings_te.xtb12
-rw-r--r--chromium/chrome/app/resources/chromium_strings_zh-TW.xtb2
-rw-r--r--chromium/chrome/app/resources/generated_resources_af.xtb4
-rw-r--r--chromium/chrome/app/resources/generated_resources_am.xtb540
-rw-r--r--chromium/chrome/app/resources/generated_resources_ar.xtb12
-rw-r--r--chromium/chrome/app/resources/generated_resources_as.xtb26
-rw-r--r--chromium/chrome/app/resources/generated_resources_az.xtb2
-rw-r--r--chromium/chrome/app/resources/generated_resources_be.xtb6
-rw-r--r--chromium/chrome/app/resources/generated_resources_bg.xtb4
-rw-r--r--chromium/chrome/app/resources/generated_resources_bn.xtb6
-rw-r--r--chromium/chrome/app/resources/generated_resources_bs.xtb14
-rw-r--r--chromium/chrome/app/resources/generated_resources_ca.xtb12
-rw-r--r--chromium/chrome/app/resources/generated_resources_cs.xtb4
-rw-r--r--chromium/chrome/app/resources/generated_resources_da.xtb92
-rw-r--r--chromium/chrome/app/resources/generated_resources_de.xtb12
-rw-r--r--chromium/chrome/app/resources/generated_resources_el.xtb2
-rw-r--r--chromium/chrome/app/resources/generated_resources_es-419.xtb36
-rw-r--r--chromium/chrome/app/resources/generated_resources_es.xtb6
-rw-r--r--chromium/chrome/app/resources/generated_resources_eu.xtb18
-rw-r--r--chromium/chrome/app/resources/generated_resources_fa.xtb54
-rw-r--r--chromium/chrome/app/resources/generated_resources_fi.xtb6
-rw-r--r--chromium/chrome/app/resources/generated_resources_fr-CA.xtb2
-rw-r--r--chromium/chrome/app/resources/generated_resources_fr.xtb24
-rw-r--r--chromium/chrome/app/resources/generated_resources_gl.xtb38
-rw-r--r--chromium/chrome/app/resources/generated_resources_hi.xtb30
-rw-r--r--chromium/chrome/app/resources/generated_resources_hr.xtb20
-rw-r--r--chromium/chrome/app/resources/generated_resources_hu.xtb6
-rw-r--r--chromium/chrome/app/resources/generated_resources_hy.xtb2
-rw-r--r--chromium/chrome/app/resources/generated_resources_id.xtb8
-rw-r--r--chromium/chrome/app/resources/generated_resources_is.xtb2
-rw-r--r--chromium/chrome/app/resources/generated_resources_it.xtb10
-rw-r--r--chromium/chrome/app/resources/generated_resources_iw.xtb4
-rw-r--r--chromium/chrome/app/resources/generated_resources_ja.xtb42
-rw-r--r--chromium/chrome/app/resources/generated_resources_ka.xtb4
-rw-r--r--chromium/chrome/app/resources/generated_resources_kk.xtb44
-rw-r--r--chromium/chrome/app/resources/generated_resources_kn.xtb130
-rw-r--r--chromium/chrome/app/resources/generated_resources_ko.xtb34
-rw-r--r--chromium/chrome/app/resources/generated_resources_ky.xtb280
-rw-r--r--chromium/chrome/app/resources/generated_resources_lo.xtb2
-rw-r--r--chromium/chrome/app/resources/generated_resources_lt.xtb2
-rw-r--r--chromium/chrome/app/resources/generated_resources_mk.xtb48
-rw-r--r--chromium/chrome/app/resources/generated_resources_ml.xtb30
-rw-r--r--chromium/chrome/app/resources/generated_resources_mr.xtb90
-rw-r--r--chromium/chrome/app/resources/generated_resources_my.xtb16
-rw-r--r--chromium/chrome/app/resources/generated_resources_ne.xtb48
-rw-r--r--chromium/chrome/app/resources/generated_resources_nl.xtb20
-rw-r--r--chromium/chrome/app/resources/generated_resources_no.xtb12
-rw-r--r--chromium/chrome/app/resources/generated_resources_or.xtb4
-rw-r--r--chromium/chrome/app/resources/generated_resources_pl.xtb64
-rw-r--r--chromium/chrome/app/resources/generated_resources_pt-BR.xtb18
-rw-r--r--chromium/chrome/app/resources/generated_resources_pt-PT.xtb4
-rw-r--r--chromium/chrome/app/resources/generated_resources_ro.xtb2
-rw-r--r--chromium/chrome/app/resources/generated_resources_ru.xtb18
-rw-r--r--chromium/chrome/app/resources/generated_resources_sk.xtb8
-rw-r--r--chromium/chrome/app/resources/generated_resources_sl.xtb2
-rw-r--r--chromium/chrome/app/resources/generated_resources_sq.xtb4
-rw-r--r--chromium/chrome/app/resources/generated_resources_sr-Latn.xtb14
-rw-r--r--chromium/chrome/app/resources/generated_resources_sr.xtb14
-rw-r--r--chromium/chrome/app/resources/generated_resources_sv.xtb8
-rw-r--r--chromium/chrome/app/resources/generated_resources_sw.xtb4
-rw-r--r--chromium/chrome/app/resources/generated_resources_ta.xtb4
-rw-r--r--chromium/chrome/app/resources/generated_resources_te.xtb182
-rw-r--r--chromium/chrome/app/resources/generated_resources_th.xtb6
-rw-r--r--chromium/chrome/app/resources/generated_resources_tr.xtb30
-rw-r--r--chromium/chrome/app/resources/generated_resources_uk.xtb22
-rw-r--r--chromium/chrome/app/resources/generated_resources_ur.xtb4
-rw-r--r--chromium/chrome/app/resources/generated_resources_uz.xtb8
-rw-r--r--chromium/chrome/app/resources/generated_resources_vi.xtb86
-rw-r--r--chromium/chrome/app/resources/generated_resources_zh-CN.xtb64
-rw-r--r--chromium/chrome/app/resources/generated_resources_zh-HK.xtb2
-rw-r--r--chromium/chrome/app/resources/generated_resources_zh-TW.xtb30
-rw-r--r--chromium/chrome/app/resources/generated_resources_zu.xtb2
-rw-r--r--chromium/chrome/app/resources/google_chrome_strings_am.xtb14
-rw-r--r--chromium/chrome/app/resources/google_chrome_strings_da.xtb28
-rw-r--r--chromium/chrome/app/resources/google_chrome_strings_es-419.xtb6
-rw-r--r--chromium/chrome/app/resources/google_chrome_strings_fr-CA.xtb2
-rw-r--r--chromium/chrome/app/resources/google_chrome_strings_it.xtb6
-rw-r--r--chromium/chrome/app/resources/google_chrome_strings_kk.xtb2
-rw-r--r--chromium/chrome/app/resources/google_chrome_strings_kn.xtb6
-rw-r--r--chromium/chrome/app/resources/google_chrome_strings_ky.xtb14
-rw-r--r--chromium/chrome/app/resources/google_chrome_strings_mk.xtb2
-rw-r--r--chromium/chrome/app/resources/google_chrome_strings_mr.xtb4
-rw-r--r--chromium/chrome/app/resources/google_chrome_strings_ne.xtb2
-rw-r--r--chromium/chrome/app/resources/google_chrome_strings_nl.xtb4
-rw-r--r--chromium/chrome/app/resources/google_chrome_strings_pt-BR.xtb2
-rw-r--r--chromium/chrome/app/resources/google_chrome_strings_sw.xtb2
-rw-r--r--chromium/chrome/app/resources/google_chrome_strings_ta.xtb4
-rw-r--r--chromium/chrome/app/resources/google_chrome_strings_te.xtb4
-rw-r--r--chromium/chrome/app/resources/google_chrome_strings_zh-TW.xtb4
-rw-r--r--chromium/chrome/browser/extensions/api/input_ime/input_ime_api_chromeos.cc2
-rw-r--r--chromium/chrome/browser/signin/signin_util.cc9
-rw-r--r--chromium/chrome/browser/signin/signin_util_unittest.cc90
-rw-r--r--chromium/chrome/browser/ui/webui/devtools_ui_data_source.cc10
-rw-r--r--chromium/chrome/browser/ui/webui/devtools_ui_data_source_unittest.cc37
-rw-r--r--chromium/chrome/common/extensions/api/input_method_private.json2
-rw-r--r--chromium/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb14
-rw-r--r--chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb2
-rw-r--r--chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb2
-rw-r--r--chromium/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb8
-rw-r--r--chromium/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb2
-rw-r--r--chromium/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb4
-rw-r--r--chromium/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb2
-rw-r--r--chromium/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb4
-rw-r--r--chromium/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb8
-rw-r--r--chromium/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb6
-rw-r--r--chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb16
-rw-r--r--chromium/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb6
-rw-r--r--chromium/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb8
-rw-r--r--chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb10
-rw-r--r--chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb8
-rw-r--r--chromium/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb4
-rw-r--r--chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb2
-rw-r--r--chromium/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb2
-rw-r--r--chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ne.xtb2
-rw-r--r--chromium/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb10
-rw-r--r--chromium/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb2
-rw-r--r--chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb4
-rw-r--r--chromium/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb12
-rw-r--r--chromium/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb6
-rw-r--r--chromium/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb4
-rw-r--r--chromium/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb2
-rw-r--r--chromium/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb10
-rw-r--r--chromium/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb4
-rw-r--r--chromium/components/certificate_transparency/data/log_list.json4
-rw-r--r--chromium/components/guest_view/browser/guest_view_base.cc8
-rw-r--r--chromium/components/guest_view/browser/guest_view_base.h2
-rw-r--r--chromium/components/javascript_dialogs/android/translations/javascript_dialogs_android_strings_am.xtb2
-rw-r--r--chromium/components/permissions/android/translations/permissions_android_strings_kn.xtb6
-rw-r--r--chromium/components/strings/components_chromium_strings_am.xtb4
-rw-r--r--chromium/components/strings/components_chromium_strings_mr.xtb2
-rw-r--r--chromium/components/strings/components_google_chrome_strings_am.xtb6
-rw-r--r--chromium/components/strings/components_google_chrome_strings_mr.xtb2
-rw-r--r--chromium/components/strings/components_strings_am.xtb210
-rw-r--r--chromium/components/strings/components_strings_ar.xtb6
-rw-r--r--chromium/components/strings/components_strings_as.xtb2
-rw-r--r--chromium/components/strings/components_strings_be.xtb2
-rw-r--r--chromium/components/strings/components_strings_cs.xtb4
-rw-r--r--chromium/components/strings/components_strings_cy.xtb2
-rw-r--r--chromium/components/strings/components_strings_da.xtb42
-rw-r--r--chromium/components/strings/components_strings_de.xtb4
-rw-r--r--chromium/components/strings/components_strings_en-GB.xtb6
-rw-r--r--chromium/components/strings/components_strings_es-419.xtb14
-rw-r--r--chromium/components/strings/components_strings_es.xtb8
-rw-r--r--chromium/components/strings/components_strings_eu.xtb12
-rw-r--r--chromium/components/strings/components_strings_fa.xtb2
-rw-r--r--chromium/components/strings/components_strings_fr.xtb10
-rw-r--r--chromium/components/strings/components_strings_gl.xtb32
-rw-r--r--chromium/components/strings/components_strings_hi.xtb20
-rw-r--r--chromium/components/strings/components_strings_it.xtb8
-rw-r--r--chromium/components/strings/components_strings_ja.xtb24
-rw-r--r--chromium/components/strings/components_strings_kk.xtb30
-rw-r--r--chromium/components/strings/components_strings_kn.xtb18
-rw-r--r--chromium/components/strings/components_strings_ko.xtb10
-rw-r--r--chromium/components/strings/components_strings_ky.xtb26
-rw-r--r--chromium/components/strings/components_strings_mk.xtb18
-rw-r--r--chromium/components/strings/components_strings_ml.xtb12
-rw-r--r--chromium/components/strings/components_strings_mr.xtb32
-rw-r--r--chromium/components/strings/components_strings_my.xtb8
-rw-r--r--chromium/components/strings/components_strings_ne.xtb10
-rw-r--r--chromium/components/strings/components_strings_nl.xtb24
-rw-r--r--chromium/components/strings/components_strings_pl.xtb6
-rw-r--r--chromium/components/strings/components_strings_pt-BR.xtb14
-rw-r--r--chromium/components/strings/components_strings_ru.xtb6
-rw-r--r--chromium/components/strings/components_strings_sl.xtb2
-rw-r--r--chromium/components/strings/components_strings_sr-Latn.xtb8
-rw-r--r--chromium/components/strings/components_strings_sr.xtb8
-rw-r--r--chromium/components/strings/components_strings_sv.xtb2
-rw-r--r--chromium/components/strings/components_strings_sw.xtb2
-rw-r--r--chromium/components/strings/components_strings_te.xtb30
-rw-r--r--chromium/components/strings/components_strings_th.xtb6
-rw-r--r--chromium/components/strings/components_strings_tr.xtb16
-rw-r--r--chromium/components/strings/components_strings_uz.xtb4
-rw-r--r--chromium/components/strings/components_strings_vi.xtb28
-rw-r--r--chromium/components/strings/components_strings_zh-CN.xtb4
-rw-r--r--chromium/components/strings/components_strings_zh-TW.xtb16
-rw-r--r--chromium/components/webapps/browser/android/translations/android_webapps_strings_am.xtb6
-rw-r--r--chromium/content/browser/browser_plugin/browser_plugin_guest.cc12
-rw-r--r--chromium/content/browser/browser_plugin/browser_plugin_guest.h5
-rw-r--r--chromium/content/browser/renderer_host/navigation_request.cc6
-rw-r--r--chromium/content/browser/renderer_host/navigation_request_browsertest.cc81
-rw-r--r--chromium/content/public/browser/browser_plugin_guest_delegate.cc6
-rw-r--r--chromium/content/public/browser/browser_plugin_guest_delegate.h3
-rw-r--r--chromium/device/bluetooth/strings/bluetooth_strings_eu.xtb2
-rw-r--r--chromium/device/fido/strings/fido_strings_da.xtb2
-rw-r--r--chromium/extensions/strings/extensions_strings_am.xtb4
-rw-r--r--chromium/extensions/strings/extensions_strings_mr.xtb4
-rw-r--r--chromium/extensions/strings/extensions_strings_te.xtb2
-rw-r--r--chromium/gpu/config/gpu_lists_version.h2
-rw-r--r--chromium/infra/config/generated/builders/ci/Cast Linux Debug/properties.json63
-rw-r--r--chromium/infra/config/generated/builders/ci/Cast Linux/properties.json63
-rw-r--r--chromium/infra/config/generated/builders/ci/Dawn Linux x64 DEPS Builder/properties.json137
-rw-r--r--chromium/infra/config/generated/builders/ci/Dawn Linux x64 DEPS Release (Intel UHD 630)/properties.json90
-rw-r--r--chromium/infra/config/generated/builders/ci/Dawn Linux x64 DEPS Release (NVIDIA)/properties.json90
-rw-r--r--chromium/infra/config/generated/builders/ci/GPU Linux Builder/properties.json104
-rw-r--r--chromium/infra/config/generated/builders/ci/GPU Mac Builder/properties.json9
-rw-r--r--chromium/infra/config/generated/builders/ci/Linux ASan LSan Builder/properties.json133
-rw-r--r--chromium/infra/config/generated/builders/ci/Linux ASan LSan Tests (1)/properties.json88
-rw-r--r--chromium/infra/config/generated/builders/ci/Linux ASan Tests (sandboxed)/properties.json81
-rw-r--r--chromium/infra/config/generated/builders/ci/Linux Builder (Wayland)/properties.json104
-rw-r--r--chromium/infra/config/generated/builders/ci/Linux Builder (dbg)/properties.json102
-rw-r--r--chromium/infra/config/generated/builders/ci/Linux Builder/properties.json104
-rw-r--r--chromium/infra/config/generated/builders/ci/Linux Release (NVIDIA)/properties.json92
-rw-r--r--chromium/infra/config/generated/builders/ci/Linux TSan Builder/properties.json98
-rw-r--r--chromium/infra/config/generated/builders/ci/Linux TSan Tests/properties.json91
-rw-r--r--chromium/infra/config/generated/builders/ci/Linux Tests (Wayland)/properties.json92
-rw-r--r--chromium/infra/config/generated/builders/ci/Linux Tests (dbg)(1)/properties.json90
-rw-r--r--chromium/infra/config/generated/builders/ci/Linux Tests/properties.json92
-rw-r--r--chromium/infra/config/generated/builders/ci/Mac Builder/properties.json18
-rw-r--r--chromium/infra/config/generated/builders/ci/Mac Release (Intel)/properties.json6
-rw-r--r--chromium/infra/config/generated/builders/ci/Mac Retina Release (AMD)/properties.json6
-rw-r--r--chromium/infra/config/generated/builders/ci/Mac10.13 Tests/properties.json6
-rw-r--r--chromium/infra/config/generated/builders/ci/Mac10.14 Tests/properties.json6
-rw-r--r--chromium/infra/config/generated/builders/ci/Mac10.15 Tests/properties.json6
-rw-r--r--chromium/infra/config/generated/builders/ci/Mac11 Tests/properties.json6
-rw-r--r--chromium/infra/config/generated/builders/ci/Mac12 Tests/properties.json6
-rw-r--r--chromium/infra/config/generated/builders/ci/VR Linux/properties.json63
-rw-r--r--chromium/infra/config/generated/builders/ci/Win Builder/properties.json1
-rw-r--r--chromium/infra/config/generated/builders/ci/chromeos-amd64-generic-dbg/properties.json71
-rw-r--r--chromium/infra/config/generated/builders/ci/chromeos-amd64-generic-lacros-dbg/properties.json72
-rw-r--r--chromium/infra/config/generated/builders/ci/chromeos-amd64-generic-rel/properties.json75
-rw-r--r--chromium/infra/config/generated/builders/ci/chromeos-arm-generic-rel/properties.json70
-rw-r--r--chromium/infra/config/generated/builders/ci/chromeos-arm64-generic-rel/properties.json70
-rw-r--r--chromium/infra/config/generated/builders/ci/chromeos-jacuzzi-rel/properties.json72
-rw-r--r--chromium/infra/config/generated/builders/ci/chromeos-octopus-rel/properties.json71
-rw-r--r--chromium/infra/config/generated/builders/ci/fuchsia-arm64-cast-receiver-rel/properties.json2
-rw-r--r--chromium/infra/config/generated/builders/ci/fuchsia-arm64-rel/properties.json2
-rw-r--r--chromium/infra/config/generated/builders/ci/fuchsia-official/properties.json2
-rw-r--r--chromium/infra/config/generated/builders/ci/fuchsia-x64-cast-receiver-rel/properties.json2
-rw-r--r--chromium/infra/config/generated/builders/ci/fuchsia-x64-rel/properties.json2
-rw-r--r--chromium/infra/config/generated/builders/ci/ios-simulator-cronet/properties.json67
-rw-r--r--chromium/infra/config/generated/builders/ci/ios-simulator-full-configs/properties.json70
-rw-r--r--chromium/infra/config/generated/builders/ci/ios-simulator/properties.json70
-rw-r--r--chromium/infra/config/generated/builders/ci/lacros-amd64-generic-rel/properties.json79
-rw-r--r--chromium/infra/config/generated/builders/ci/lacros-arm-generic-rel/properties.json73
-rw-r--r--chromium/infra/config/generated/builders/ci/lacros-arm64-generic-rel/properties.json72
-rw-r--r--chromium/infra/config/generated/builders/ci/linux-chromeos-dbg/properties.json71
-rw-r--r--chromium/infra/config/generated/builders/ci/linux-chromeos-rel/properties.json68
-rw-r--r--chromium/infra/config/generated/builders/ci/linux-lacros-builder-rel/properties.json107
-rw-r--r--chromium/infra/config/generated/builders/ci/linux-lacros-dbg/properties.json61
-rw-r--r--chromium/infra/config/generated/builders/ci/linux-lacros-tester-rel/properties.json95
-rw-r--r--chromium/infra/config/generated/builders/ci/linux-official/properties.json64
-rw-r--r--chromium/infra/config/generated/builders/try/chromeos-amd64-generic-dbg/properties.json62
-rw-r--r--chromium/infra/config/generated/builders/try/chromeos-amd64-generic-lacros-dbg/properties.json63
-rw-r--r--chromium/infra/config/generated/builders/try/chromeos-amd64-generic-rel-compilator/properties.json66
-rw-r--r--chromium/infra/config/generated/builders/try/chromeos-amd64-generic-rel/properties.json65
-rw-r--r--chromium/infra/config/generated/builders/try/chromeos-arm-generic-rel/properties.json61
-rw-r--r--chromium/infra/config/generated/builders/try/chromeos-arm64-generic-rel/properties.json61
-rw-r--r--chromium/infra/config/generated/builders/try/chromeos-jacuzzi-rel/properties.json68
-rw-r--r--chromium/infra/config/generated/builders/try/chromeos-octopus-rel/properties.json67
-rw-r--r--chromium/infra/config/generated/builders/try/dawn-linux-x64-deps-rel/properties.json129
-rw-r--r--chromium/infra/config/generated/builders/try/ios-simulator-compilator/properties.json72
-rw-r--r--chromium/infra/config/generated/builders/try/ios-simulator-cronet/properties.json61
-rw-r--r--chromium/infra/config/generated/builders/try/ios-simulator-full-configs/properties.json75
-rw-r--r--chromium/infra/config/generated/builders/try/ios-simulator/properties.json69
-rw-r--r--chromium/infra/config/generated/builders/try/lacros-amd64-generic-rel-compilator/properties.json71
-rw-r--r--chromium/infra/config/generated/builders/try/lacros-amd64-generic-rel-orchestrator/properties.json65
-rw-r--r--chromium/infra/config/generated/builders/try/lacros-amd64-generic-rel-skylab-fyi/properties.json73
-rw-r--r--chromium/infra/config/generated/builders/try/lacros-amd64-generic-rel-skylab/properties.json66
-rw-r--r--chromium/infra/config/generated/builders/try/lacros-amd64-generic-rel/properties.json66
-rw-r--r--chromium/infra/config/generated/builders/try/lacros-arm-generic-rel/properties.json64
-rw-r--r--chromium/infra/config/generated/builders/try/lacros-arm64-generic-rel/properties.json68
-rw-r--r--chromium/infra/config/generated/builders/try/linux-blink-rel/properties.json54
-rw-r--r--chromium/infra/config/generated/builders/try/linux-chromeos-compile-dbg/properties.json59
-rw-r--r--chromium/infra/config/generated/builders/try/linux-chromeos-dbg/properties.json58
-rw-r--r--chromium/infra/config/generated/builders/try/linux-chromeos-rel-compilator/properties.json66
-rw-r--r--chromium/infra/config/generated/builders/try/linux-chromeos-rel/properties.json65
-rw-r--r--chromium/infra/config/generated/builders/try/linux-lacros-rel-compilator/properties.json101
-rw-r--r--chromium/infra/config/generated/builders/try/linux-lacros-rel/properties.json100
-rw-r--r--chromium/infra/config/generated/builders/try/linux-official/properties.json55
-rw-r--r--chromium/infra/config/generated/builders/try/linux-rel-compilator/properties.json175
-rw-r--r--chromium/infra/config/generated/builders/try/linux-rel/properties.json174
-rw-r--r--chromium/infra/config/generated/builders/try/linux-wayland-rel-compilator/properties.json98
-rw-r--r--chromium/infra/config/generated/builders/try/linux-wayland-rel/properties.json97
-rw-r--r--chromium/infra/config/generated/builders/try/linux-x64-castos-dbg/properties.json54
-rw-r--r--chromium/infra/config/generated/builders/try/linux-x64-castos/properties.json54
-rw-r--r--chromium/infra/config/generated/builders/try/linux_chromium_asan_rel_ng-compilator/properties.json94
-rw-r--r--chromium/infra/config/generated/builders/try/linux_chromium_asan_rel_ng/properties.json93
-rw-r--r--chromium/infra/config/generated/builders/try/linux_chromium_compile_dbg_ng/properties.json90
-rw-r--r--chromium/infra/config/generated/builders/try/linux_chromium_dbg_ng/properties.json89
-rw-r--r--chromium/infra/config/generated/builders/try/linux_chromium_tsan_rel_ng-compilator/properties.json92
-rw-r--r--chromium/infra/config/generated/builders/try/linux_chromium_tsan_rel_ng/properties.json91
-rw-r--r--chromium/infra/config/generated/builders/try/linux_optional_gpu_tests_rel/properties.json57
-rw-r--r--chromium/infra/config/generated/builders/try/linux_vr/properties.json54
-rw-r--r--chromium/infra/config/generated/builders/try/mac-rel-compilator/properties.json12
-rw-r--r--chromium/infra/config/generated/builders/try/mac-rel/properties.json12
-rw-r--r--chromium/infra/config/generated/builders/try/mac_optional_gpu_tests_rel/properties.json57
-rw-r--r--chromium/infra/config/generated/cq-usage/default.cfg45
-rw-r--r--chromium/infra/config/generated/cq-usage/full.cfg846
-rw-r--r--chromium/infra/config/generated/health-specs/health-specs.json70
-rw-r--r--chromium/infra/config/generated/luci/commit-queue.cfg943
-rw-r--r--chromium/infra/config/generated/luci/cr-buildbucket.cfg7308
-rw-r--r--chromium/infra/config/generated/luci/luci-milo.cfg1071
-rw-r--r--chromium/infra/config/generated/luci/luci-notify.cfg424
-rw-r--r--chromium/infra/config/generated/luci/luci-scheduler.cfg370
-rw-r--r--chromium/infra/config/generated/luci/project.cfg2
-rw-r--r--chromium/infra/config/generated/luci/realms.cfg11
-rw-r--r--chromium/infra/config/settings.json44
-rw-r--r--chromium/infra/config/subprojects/chromium/ci/chromium.clang.star4
-rw-r--r--chromium/infra/config/subprojects/chromium/ci/chromium.fyi.star1
-rw-r--r--chromium/infra/config/subprojects/chromium/ci/chromium.gpu.star3
-rw-r--r--chromium/infra/config/subprojects/chromium/ci/chromium.mac.star6
-rw-r--r--chromium/infra/config/subprojects/chromium/ci/chromium.memory.star2
-rw-r--r--chromium/infra/config/subprojects/chromium/ci/chromium.star2
-rw-r--r--chromium/infra/config/subprojects/chromium/ci/chromium.win.star2
-rw-r--r--chromium/infra/config/subprojects/chromium/try.star14
-rw-r--r--chromium/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star2
-rw-r--r--chromium/ios/features.gni4
-rw-r--r--chromium/media/capture/video/mac/video_capture_device_mac.mm21
-rw-r--r--chromium/net/http/http_cache_unittest.cc41
-rw-r--r--chromium/net/http/partial_data.cc22
-rw-r--r--chromium/net/http/transport_security_state_static.pins4
-rw-r--r--chromium/skia/ext/skia_commit_hash.h2
-rw-r--r--chromium/third_party/angle/src/compiler/translator/ValidateTypeSizeLimitations.cpp32
-rw-r--r--chromium/third_party/angle/src/libANGLE/formatutils.cpp19
-rw-r--r--chromium/third_party/angle/src/libANGLE/formatutils.h2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp2
-rw-r--r--chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_caps_utils.cpp2
-rw-r--r--chromium/third_party/blink/public/strings/translations/blink_accessibility_strings_am.xtb2
-rw-r--r--chromium/third_party/blink/public/strings/translations/blink_strings_am.xtb8
-rw-r--r--chromium/third_party/blink/public/strings/translations/blink_strings_es.xtb2
-rw-r--r--chromium/third_party/blink/public/strings/translations/blink_strings_hi.xtb2
-rw-r--r--chromium/third_party/blink/public/strings/translations/blink_strings_it.xtb10
-rw-r--r--chromium/third_party/blink/public/strings/translations/blink_strings_ja.xtb4
-rw-r--r--chromium/third_party/blink/public/strings/translations/blink_strings_my.xtb2
-rw-r--r--chromium/third_party/blink/public/strings/translations/blink_strings_pt-BR.xtb2
-rw-r--r--chromium/third_party/blink/public/strings/translations/blink_strings_te.xtb6
-rw-r--r--chromium/third_party/blink/renderer/core/editing/editing_utilities.cc2
-rw-r--r--chromium/third_party/blink/renderer/core/loader/mixed_content_checker.cc17
-rw-r--r--chromium/third_party/blink/renderer/core/loader/mixed_content_checker_test.cc14
-rw-r--r--chromium/third_party/dawn/src/dawn/native/d3d12/ShaderVisibleDescriptorAllocatorD3D12.cpp8
-rw-r--r--chromium/third_party/devtools-frontend/src/third_party/image_diff/README.chromium12
-rwxr-xr-xchromium/third_party/devtools-frontend/src/third_party/image_diff/linux/image_diffbin152016 -> 0 bytes
-rwxr-xr-xchromium/third_party/devtools-frontend/src/third_party/image_diff/linux/libbase.sobin3225776 -> 0 bytes
-rwxr-xr-xchromium/third_party/devtools-frontend/src/third_party/image_diff/linux/libboringssl.sobin2172216 -> 0 bytes
-rwxr-xr-xchromium/third_party/devtools-frontend/src/third_party/image_diff/linux/libc++.sobin1150368 -> 0 bytes
-rwxr-xr-xchromium/third_party/devtools-frontend/src/third_party/image_diff/linux/libchrome_zlib.sobin119056 -> 0 bytes
-rwxr-xr-xchromium/third_party/devtools-frontend/src/third_party/image_diff/mac/image_diffbin535396 -> 0 bytes
-rwxr-xr-xchromium/third_party/devtools-frontend/src/third_party/image_diff/mac/libc++.dylibbin2499152 -> 0 bytes
-rwxr-xr-xchromium/third_party/devtools-frontend/src/third_party/image_diff/mac/libchrome_zlib.dylibbin186564 -> 0 bytes
-rw-r--r--chromium/third_party/devtools-frontend/src/third_party/image_diff/win32/image_diff.exebin919552 -> 0 bytes
-rw-r--r--chromium/third_party/libxml/README.chromium1
-rw-r--r--chromium/third_party/libxml/linux/doc/Makefile2
-rw-r--r--chromium/third_party/libxml/linux/doc/devhelp/Makefile2
-rw-r--r--chromium/third_party/libxml/linux/doc/examples/Makefile2
-rw-r--r--chromium/third_party/libxml/linux/example/Makefile2
-rw-r--r--chromium/third_party/libxml/linux/include/private/Makefile2
-rw-r--r--chromium/third_party/libxml/linux/python/Makefile2
-rw-r--r--chromium/third_party/libxml/linux/xstc/Makefile2
-rw-r--r--chromium/third_party/libxml/src/dict.c3
-rw-r--r--chromium/third_party/node/node_modules.tar.gz.sha12
-rw-r--r--chromium/third_party/node/node_modules/@jridgewell/gen-mapping/LICENSE19
-rw-r--r--chromium/third_party/node/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.mjs230
-rw-r--r--chromium/third_party/node/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.umd.js236
-rw-r--r--chromium/third_party/node/node_modules/@jridgewell/gen-mapping/package.json78
-rw-r--r--chromium/third_party/node/node_modules/@jridgewell/resolve-uri/LICENSE19
-rw-r--r--chromium/third_party/node/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.mjs242
-rw-r--r--chromium/third_party/node/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js250
-rw-r--r--chromium/third_party/node/node_modules/@jridgewell/resolve-uri/package.json69
-rw-r--r--chromium/third_party/node/node_modules/@jridgewell/set-array/LICENSE19
-rw-r--r--chromium/third_party/node/node_modules/@jridgewell/set-array/dist/set-array.mjs48
-rw-r--r--chromium/third_party/node/node_modules/@jridgewell/set-array/dist/set-array.umd.js58
-rw-r--r--chromium/third_party/node/node_modules/@jridgewell/set-array/package.json66
-rw-r--r--chromium/third_party/node/node_modules/@jridgewell/source-map/LICENSE19
-rw-r--r--chromium/third_party/node/node_modules/@jridgewell/source-map/dist/source-map.mjs928
-rw-r--r--chromium/third_party/node/node_modules/@jridgewell/source-map/dist/source-map.umd.js939
-rw-r--r--chromium/third_party/node/node_modules/@jridgewell/source-map/package.json67
-rw-r--r--chromium/third_party/node/node_modules/@jridgewell/sourcemap-codec/LICENSE21
-rw-r--r--chromium/third_party/node/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs164
-rw-r--r--chromium/third_party/node/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js175
-rw-r--r--chromium/third_party/node/node_modules/@jridgewell/sourcemap-codec/package.json75
-rw-r--r--chromium/third_party/node/node_modules/@jridgewell/trace-mapping/LICENSE19
-rw-r--r--chromium/third_party/node/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs552
-rw-r--r--chromium/third_party/node/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js566
-rw-r--r--chromium/third_party/node/node_modules/@jridgewell/trace-mapping/package.json75
-rw-r--r--chromium/third_party/skia/gn/sksl_tests.gni2
-rw-r--r--chromium/third_party/skia/resources/sksl/BUILD.bazel2
-rw-r--r--chromium/third_party/skia/resources/sksl/errors/ProgramTooLarge_Globals.rts9
-rw-r--r--chromium/third_party/skia/resources/sksl/errors/ProgramTooLarge_Parameters.rts17
-rw-r--r--chromium/third_party/skia/resources/sksl/errors/ProgramTooLarge_Stack.rts4
-rw-r--r--chromium/third_party/skia/resources/sksl/errors/ProgramTooLarge_Struct.rts24
-rw-r--r--chromium/third_party/skia/src/sksl/dsl/DSLType.cpp4
-rw-r--r--chromium/third_party/skia/src/sksl/ir/SkSLFunctionDefinition.cpp43
-rw-r--r--chromium/third_party/skia/src/sksl/ir/SkSLType.cpp20
-rw-r--r--chromium/tools/mb/mb_config.pyl78
-rw-r--r--chromium/tools/mb/mb_config_expectations/tryserver.chrome.json38
-rw-r--r--chromium/tools/mb/mb_config_expectations/tryserver.chromium.mac.json6
-rw-r--r--chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_am.xtb4
-rw-r--r--chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_it.xtb2
-rw-r--r--chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_te.xtb2
-rw-r--r--chromium/ui/base/ime/ash/input_method_ash.cc8
-rw-r--r--chromium/ui/base/ime/ash/input_method_ash_unittest.cc14
-rw-r--r--chromium/ui/base/ime/ash/text_input_method.h1
-rw-r--r--chromium/ui/base/ime/fake_text_input_client.cc6
-rw-r--r--chromium/ui/base/ime/fake_text_input_client.h3
-rw-r--r--chromium/ui/base/ime/input_method_base.cc7
-rw-r--r--chromium/ui/base/ime/input_method_base_unittest.cc14
-rw-r--r--chromium/ui/strings/translations/ax_strings_am.xtb4
-rw-r--r--chromium/ui/strings/translations/ax_strings_it.xtb2
-rw-r--r--chromium/ui/strings/translations/ax_strings_ja.xtb2
-rw-r--r--chromium/ui/strings/translations/ui_strings_am.xtb6
-rw-r--r--chromium/ui/strings/translations/ui_strings_da.xtb8
-rw-r--r--chromium/ui/strings/translations/ui_strings_fi.xtb2
-rw-r--r--chromium/ui/strings/translations/ui_strings_ja.xtb2
-rw-r--r--chromium/ui/strings/translations/ui_strings_mk.xtb2
-rw-r--r--chromium/ui/strings/translations/ui_strings_ne.xtb4
-rw-r--r--chromium/ui/strings/translations/ui_strings_no.xtb2
-rw-r--r--chromium/ui/strings/translations/ui_strings_sq.xtb2
-rw-r--r--chromium/ui/strings/translations/ui_strings_te.xtb6
-rw-r--r--chromium/ui/views/bubble/bubble_dialog_delegate_view.cc7
-rw-r--r--chromium/v8/include/v8-object.h70
-rw-r--r--chromium/v8/include/v8-version.h2
-rw-r--r--chromium/v8/src/api/api-natives.cc8
-rw-r--r--chromium/v8/src/api/api.cc19
-rw-r--r--chromium/v8/src/compiler/backend/loong64/instruction-selector-loong64.cc13
-rw-r--r--chromium/v8/src/compiler/backend/mips64/instruction-selector-mips64.cc13
-rw-r--r--chromium/v8/src/init/bootstrapper.cc7
-rw-r--r--chromium/v8/src/objects/js-objects.cc24
-rw-r--r--chromium/v8/src/objects/js-objects.h15
-rw-r--r--chromium/v8/src/regexp/arm/regexp-macro-assembler-arm.cc12
-rw-r--r--chromium/v8/src/regexp/ia32/regexp-macro-assembler-ia32.cc13
-rw-r--r--chromium/v8/src/regexp/loong64/regexp-macro-assembler-loong64.cc12
-rw-r--r--chromium/v8/src/regexp/mips64/regexp-macro-assembler-mips64.cc14
-rw-r--r--chromium/v8/src/regexp/regexp-parser.cc8
-rw-r--r--chromium/v8/src/regexp/riscv/regexp-macro-assembler-riscv.cc14
-rw-r--r--chromium/v8/src/regexp/s390/regexp-macro-assembler-s390.cc12
-rw-r--r--chromium/v8/src/regexp/x64/regexp-macro-assembler-x64.cc12
-rw-r--r--chromium/v8/src/runtime/runtime-object.cc11
-rw-r--r--chromium/v8/src/sandbox/testing.cc3
711 files changed, 52104 insertions, 19872 deletions
diff --git a/chromium/DEPS b/chromium/DEPS
index 96b2dc5352d..cf0e5c80cec 100644
--- a/chromium/DEPS
+++ b/chromium/DEPS
@@ -299,15 +299,15 @@ vars = {
# Three lines of non-changing comments so that
# the commit queue can handle CLs rolling Skia
# and whatever else without interference from each other.
- 'skia_revision': 'f5715362aac554ff3108b9e2a56b8ac8a6ef1acb',
+ 'skia_revision': '4dc670a8c5575180caa3d4d03f1e05da0177240d',
# Three lines of non-changing comments so that
# the commit queue can handle CLs rolling V8
# and whatever else without interference from each other.
- 'v8_revision': '6538a20aa097f9c05ead98eb88c71819aa1e65aa',
+ 'v8_revision': 'c5ce393a9aa4ef905916bf5adb38ea7f61751370',
# Three lines of non-changing comments so that
# the commit queue can handle CLs rolling ANGLE
# and whatever else without interference from each other.
- 'angle_revision': '5becbed305e3da317f8c35150c24639e6590bba9',
+ 'angle_revision': 'a1abaf29e18910ca70547165018f8a1b9bf49a7d',
# Three lines of non-changing comments so that
# the commit queue can handle CLs rolling SwiftShader
# and whatever else without interference from each other.
@@ -426,7 +426,7 @@ vars = {
# Three lines of non-changing comments so that
# the commit queue can handle CLs rolling feed
# and whatever else without interference from each other.
- 'dawn_revision': '5767f435195311b3c471ecca2b0836d512a75271',
+ 'dawn_revision': 'bae60787d3e95ea25e5b3d2b98f896dab1d30932',
# Three lines of non-changing comments so that
# the commit queue can handle CLs rolling feed
# and whatever else without interference from each other.
@@ -764,7 +764,7 @@ deps = {
'src/clank': {
'url': 'https://chrome-internal.googlesource.com/clank/internal/apps.git' + '@' +
- '3ed767a7f1e0623a95e2234cee67f15c8f40c183',
+ 'edd2ee196941cd7f5a393412aa39cf1803ba7c71',
'condition': 'checkout_android and checkout_src_internal',
},
@@ -1212,7 +1212,7 @@ deps = {
Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
'src/third_party/devtools-frontend-internal': {
- 'url': 'https://chrome-internal.googlesource.com/devtools/devtools-internal.git' + '@' + '2eaca08bd59e69459116d485a0872576f75ef906',
+ 'url': 'https://chrome-internal.googlesource.com/devtools/devtools-internal.git' + '@' + '3be2291baa1a047b42663b7ab4fab19a12c70d69',
'condition': 'checkout_src_internal',
},
@@ -1939,7 +1939,7 @@ deps = {
Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'),
'src-internal': {
- 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@7b4a6105118e6a2f7a7a5e2b257bf20b99d7e485',
+ 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@3e42909cf541e1365b19eb3234dacdcb5f41e7c6',
'condition': 'checkout_src_internal',
},
diff --git a/chromium/base/android/COMMON_METADATA b/chromium/base/android/COMMON_METADATA
new file mode 100644
index 00000000000..7a2580a646c
--- /dev/null
+++ b/chromium/base/android/COMMON_METADATA
@@ -0,0 +1 @@
+os: ANDROID
diff --git a/chromium/base/android/DIR_METADATA b/chromium/base/android/DIR_METADATA
new file mode 100644
index 00000000000..70d749fafae
--- /dev/null
+++ b/chromium/base/android/DIR_METADATA
@@ -0,0 +1 @@
+mixins: "//base/android/COMMON_METADATA"
diff --git a/chromium/base/android/OWNERS b/chromium/base/android/OWNERS
new file mode 100644
index 00000000000..9e5445294ab
--- /dev/null
+++ b/chromium/base/android/OWNERS
@@ -0,0 +1,9 @@
+agrieve@chromium.org
+lizeb@chromium.org
+nyquist@chromium.org
+pasko@chromium.org
+torne@chromium.org
+yfriedman@chromium.org
+
+per-file *.aidl=set noparent
+per-file *.aidl=file://ipc/SECURITY_OWNERS
diff --git a/chromium/base/android/README.md b/chromium/base/android/README.md
new file mode 100644
index 00000000000..9b5a9930416
--- /dev/null
+++ b/chromium/base/android/README.md
@@ -0,0 +1,69 @@
+# //base/android
+
+This directory contains:
+
+* C++ APIs that are broadly useful and are unique to `target_os="android"`, and
+* Java APIs that are broadly useful, along C++ bindings when necessary.
+
+This directory does not contain Android-specific implementations / extensions
+to APIs declared directly in `//base`. Those live in `//base/*_android.cc`, or
+behind `#ifdef`s.
+
+## Adding New APIs
+
+The advice laid out in [//base/README.md] applies to this directory as well.
+The bars for what APIs should exist and for code quality are generally higher
+than for other directories. If you find yourself wanting to add a new API, you
+should expect that code reviews take multiple revisions and that they be met
+with (respectful) scrutiny.
+
+If you are not sure whether an API would make sense to add, you can ask via
+java@chromium.org.
+It is common to add APIs to `//chrome` (or elsewhere) first, and move them into
+`//base` after their usefulness has been proven.
+
+[//base/README.md]: /base/README.md
+
+### What Uses //base/android?
+
+The main two clients are Chrome and WebView, but it is also used by other
+Chromium-based apps, such as Chromecast and Chrome Remote desktop. Some
+`//base/android` classes are used by `//build` (this is a layering violation,
+tracked in [crbug/1364192] and [crbug/1377351]).
+
+Two considerations for WebView:
+
+1. The application Context is that of the host app's.
+2. The UI thread might be different from the main thread.
+
+[crbug/1364192]: https://crbug.com/1364192
+[crbug/1377351]: https://crbug.com/1377351
+
+
+### New API Checklist
+
+Here is a list of checks you should go through when adding a new API:
+
+1. The functionality does not already exist in system libraries (Java APIs,
+ Android SDK) or in already adopted `third_party` libraries, such as AndroidX.
+2. Reasonable effort has been made to ensure the new API is discoverable. E.g.:
+ Coordinate refactorings of existing patterns to it, add a [presubmit check],
+ to recommend it, etc.
+3. Tests (ideally Robolectric) are added.
+4. Thought has been put into API design.
+ * E.g. adding `@Nullable`, or `@DoNotMock`
+ * E.g. adding test helpers, such as `ForTesting()` methods or `TestRule`s
+ * E.g. adding asserts or comments about thread-safety
+ * E.g. could usage of the API be made harder to get wrong?
+
+[presumbit check]: https://chromium.googlesource.com/chromium/src/+/main/build/android/docs/java_toolchain.md#Static-Analysis-Code-Checks
+
+### Choosing a Reviewer
+
+All members of [`//base/android/OWNERS`] will be CC'ed on reviews through a
+[`//WATCHLIST`] entry. For new APIs, feel free to pick a reviewer at random.
+For modifying existing files, it is best to use a reviewer from prior changes to
+the file.
+
+[`//base/android/OWNERS`]: /base/android/OWNERS
+[`//WATCHLIST`]: /WATCHLIST
diff --git a/chromium/base/android/android_hardware_buffer_compat.cc b/chromium/base/android/android_hardware_buffer_compat.cc
new file mode 100644
index 00000000000..eeb87c10b6b
--- /dev/null
+++ b/chromium/base/android/android_hardware_buffer_compat.cc
@@ -0,0 +1,127 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/android_hardware_buffer_compat.h"
+
+#include <dlfcn.h>
+
+#include "base/android/build_info.h"
+#include "base/check.h"
+
+namespace base {
+
+AndroidHardwareBufferCompat::AndroidHardwareBufferCompat() {
+ DCHECK(IsSupportAvailable());
+
+ // TODO(https://crbug.com/1382595): If the Chromium build requires
+ // __ANDROID_API__ >= 26 at some point in the future, we could directly use
+ // the global functions instead of dynamic loading. However, since this would
+ // be incompatible with pre-Oreo devices, this is unlikely to happen in the
+ // foreseeable future, so just unconditionally use dynamic loading.
+
+ // cf. base/android/linker/linker_jni.cc
+ void* main_dl_handle = dlopen(nullptr, RTLD_NOW);
+
+ *reinterpret_cast<void**>(&allocate_) =
+ dlsym(main_dl_handle, "AHardwareBuffer_allocate");
+ DCHECK(allocate_);
+
+ *reinterpret_cast<void**>(&acquire_) =
+ dlsym(main_dl_handle, "AHardwareBuffer_acquire");
+ DCHECK(acquire_);
+
+ *reinterpret_cast<void**>(&describe_) =
+ dlsym(main_dl_handle, "AHardwareBuffer_describe");
+ DCHECK(describe_);
+
+ *reinterpret_cast<void**>(&lock_) =
+ dlsym(main_dl_handle, "AHardwareBuffer_lock");
+ DCHECK(lock_);
+
+ *reinterpret_cast<void**>(&recv_handle_) =
+ dlsym(main_dl_handle, "AHardwareBuffer_recvHandleFromUnixSocket");
+ DCHECK(recv_handle_);
+
+ *reinterpret_cast<void**>(&release_) =
+ dlsym(main_dl_handle, "AHardwareBuffer_release");
+ DCHECK(release_);
+
+ *reinterpret_cast<void**>(&send_handle_) =
+ dlsym(main_dl_handle, "AHardwareBuffer_sendHandleToUnixSocket");
+ DCHECK(send_handle_);
+
+ *reinterpret_cast<void**>(&unlock_) =
+ dlsym(main_dl_handle, "AHardwareBuffer_unlock");
+ DCHECK(unlock_);
+}
+
+// static
+bool AndroidHardwareBufferCompat::IsSupportAvailable() {
+ return base::android::BuildInfo::GetInstance()->sdk_int() >=
+ base::android::SDK_VERSION_OREO;
+}
+
+// static
+AndroidHardwareBufferCompat& AndroidHardwareBufferCompat::GetInstance() {
+ static AndroidHardwareBufferCompat compat;
+ return compat;
+}
+
+void AndroidHardwareBufferCompat::Allocate(const AHardwareBuffer_Desc* desc,
+ AHardwareBuffer** out_buffer) {
+ DCHECK(IsSupportAvailable());
+ allocate_(desc, out_buffer);
+}
+
+void AndroidHardwareBufferCompat::Acquire(AHardwareBuffer* buffer) {
+ DCHECK(IsSupportAvailable());
+
+ // Null |buffer| is not allowed by |acquire_| and it fails somewhere in
+ // android framework code. Hence adding a DCHECK here for documenting this
+ // info and fail before.
+ DCHECK(buffer);
+ acquire_(buffer);
+}
+
+void AndroidHardwareBufferCompat::Describe(const AHardwareBuffer* buffer,
+ AHardwareBuffer_Desc* out_desc) {
+ DCHECK(IsSupportAvailable());
+ describe_(buffer, out_desc);
+}
+
+int AndroidHardwareBufferCompat::Lock(AHardwareBuffer* buffer,
+ uint64_t usage,
+ int32_t fence,
+ const ARect* rect,
+ void** out_virtual_address) {
+ DCHECK(IsSupportAvailable());
+ return lock_(buffer, usage, fence, rect, out_virtual_address);
+}
+
+int AndroidHardwareBufferCompat::RecvHandleFromUnixSocket(
+ int socket_fd,
+ AHardwareBuffer** out_buffer) {
+ DCHECK(IsSupportAvailable());
+ return recv_handle_(socket_fd, out_buffer);
+}
+
+void AndroidHardwareBufferCompat::Release(AHardwareBuffer* buffer) {
+ DCHECK(IsSupportAvailable());
+ release_(buffer);
+}
+
+int AndroidHardwareBufferCompat::SendHandleToUnixSocket(
+ const AHardwareBuffer* buffer,
+ int socket_fd) {
+ DCHECK(IsSupportAvailable());
+ return send_handle_(buffer, socket_fd);
+}
+
+int AndroidHardwareBufferCompat::Unlock(AHardwareBuffer* buffer,
+ int32_t* fence) {
+ DCHECK(IsSupportAvailable());
+ return unlock_(buffer, fence);
+}
+
+} // namespace base
diff --git a/chromium/base/android/android_hardware_buffer_compat.h b/chromium/base/android/android_hardware_buffer_compat.h
new file mode 100644
index 00000000000..99053ae7bad
--- /dev/null
+++ b/chromium/base/android/android_hardware_buffer_compat.h
@@ -0,0 +1,77 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_ANDROID_HARDWARE_BUFFER_COMPAT_H_
+#define BASE_ANDROID_ANDROID_HARDWARE_BUFFER_COMPAT_H_
+
+#include <android/hardware_buffer.h>
+#include <android/sensor.h>
+
+#include "base/base_export.h"
+#include "base/no_destructor.h"
+
+extern "C" {
+using PFAHardwareBuffer_allocate = void (*)(const AHardwareBuffer_Desc* desc,
+ AHardwareBuffer** outBuffer);
+using PFAHardwareBuffer_acquire = void (*)(AHardwareBuffer* buffer);
+using PFAHardwareBuffer_describe = void (*)(const AHardwareBuffer* buffer,
+ AHardwareBuffer_Desc* outDesc);
+using PFAHardwareBuffer_lock = int (*)(AHardwareBuffer* buffer,
+ uint64_t usage,
+ int32_t fence,
+ const ARect* rect,
+ void** outVirtualAddress);
+using PFAHardwareBuffer_recvHandleFromUnixSocket =
+ int (*)(int socketFd, AHardwareBuffer** outBuffer);
+using PFAHardwareBuffer_release = void (*)(AHardwareBuffer* buffer);
+using PFAHardwareBuffer_sendHandleToUnixSocket =
+ int (*)(const AHardwareBuffer* buffer, int socketFd);
+using PFAHardwareBuffer_unlock = int (*)(AHardwareBuffer* buffer,
+ int32_t* fence);
+}
+
+namespace base {
+
+// This class provides runtime support for working with AHardwareBuffer objects
+// on Android O systems without requiring building for the Android O NDK level.
+// Don't call GetInstance() unless IsSupportAvailable() returns true.
+class BASE_EXPORT AndroidHardwareBufferCompat {
+ public:
+ static bool IsSupportAvailable();
+ static AndroidHardwareBufferCompat& GetInstance();
+
+ AndroidHardwareBufferCompat(const AndroidHardwareBufferCompat&) = delete;
+ AndroidHardwareBufferCompat& operator=(const AndroidHardwareBufferCompat&) =
+ delete;
+
+ void Allocate(const AHardwareBuffer_Desc* desc, AHardwareBuffer** outBuffer);
+ void Acquire(AHardwareBuffer* buffer);
+ void Describe(const AHardwareBuffer* buffer, AHardwareBuffer_Desc* outDesc);
+ int Lock(AHardwareBuffer* buffer,
+ uint64_t usage,
+ int32_t fence,
+ const ARect* rect,
+ void** out_virtual_address);
+ int RecvHandleFromUnixSocket(int socketFd, AHardwareBuffer** outBuffer);
+ void Release(AHardwareBuffer* buffer);
+ int SendHandleToUnixSocket(const AHardwareBuffer* buffer, int socketFd);
+ int Unlock(AHardwareBuffer* buffer, int32_t* fence);
+
+ private:
+ friend class NoDestructor<AndroidHardwareBufferCompat>;
+ AndroidHardwareBufferCompat();
+
+ PFAHardwareBuffer_allocate allocate_;
+ PFAHardwareBuffer_acquire acquire_;
+ PFAHardwareBuffer_describe describe_;
+ PFAHardwareBuffer_lock lock_;
+ PFAHardwareBuffer_recvHandleFromUnixSocket recv_handle_;
+ PFAHardwareBuffer_release release_;
+ PFAHardwareBuffer_sendHandleToUnixSocket send_handle_;
+ PFAHardwareBuffer_unlock unlock_;
+};
+
+} // namespace base
+
+#endif // BASE_ANDROID_ANDROID_HARDWARE_BUFFER_COMPAT_H_
diff --git a/chromium/base/android/android_image_reader_abi.h b/chromium/base/android/android_image_reader_abi.h
new file mode 100644
index 00000000000..730055da8c9
--- /dev/null
+++ b/chromium/base/android/android_image_reader_abi.h
@@ -0,0 +1,116 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_ANDROID_IMAGE_READER_ABI_H_
+#define BASE_ANDROID_ANDROID_IMAGE_READER_ABI_H_
+
+// Minimal binary interface definitions for AImage,AImageReader
+// and ANativeWindow based on include/media/NdkImage.h,
+// include/media/NdkImageReader.h and include/android/native_window_jni.h
+// from the Android NDK for platform level 26+. This is only
+// intended for use from the AndroidImageReader wrapper for building
+// without NDK platform level support, it is not a general-use header
+// and is not complete. Only the functions/data types which
+// are currently needed by media/gpu/android/image_reader_gl_owner.h are
+// included in this ABI
+//
+// Please refer to the API documentation for details:
+// https://developer.android.com/ndk/reference/group/media (AIMage and
+// AImageReader)
+// https://developer.android.com/ndk/reference/group/native-activity
+// (ANativeWindow)
+
+#include <android/native_window.h>
+#include <media/NdkMediaError.h>
+
+#include <jni.h>
+#include <stdint.h>
+
+// Use "C" linkage to match the original header file. This isn't strictly
+// required since the file is not declaring global functions, but the types
+// should remain in the global namespace for compatibility, and it's a reminder
+// that forward declarations elsewhere should use "extern "C" to avoid
+// namespace issues.
+extern "C" {
+
+// For AImage
+typedef struct AHardwareBuffer AHardwareBuffer;
+
+typedef struct AImage AImage;
+
+typedef struct AImageCropRect {
+ int32_t left;
+ int32_t top;
+ int32_t right;
+ int32_t bottom;
+} AImageCropRect;
+
+enum AIMAGE_FORMATS {
+ AIMAGE_FORMAT_YUV_420_888 = 0x23,
+ AIMAGE_FORMAT_PRIVATE = 0x22
+};
+
+using pAImage_delete = void (*)(AImage* image);
+
+using pAImage_deleteAsync = void (*)(AImage* image, int releaseFenceFd);
+
+using pAImage_getHardwareBuffer = media_status_t (*)(const AImage* image,
+ AHardwareBuffer** buffer);
+
+using pAImage_getWidth = media_status_t (*)(const AImage* image,
+ int32_t* width);
+
+using pAImage_getHeight = media_status_t (*)(const AImage* image,
+ int32_t* height);
+
+using pAImage_getCropRect = media_status_t (*)(const AImage* image,
+ AImageCropRect* rect);
+
+// For AImageReader
+
+typedef struct AImageReader AImageReader;
+
+typedef void (*AImageReader_ImageCallback)(void* context, AImageReader* reader);
+
+typedef struct AImageReader_ImageListener {
+ void* context;
+ AImageReader_ImageCallback onImageAvailable;
+} AImageReader_ImageListener;
+
+using pAImageReader_newWithUsage = media_status_t (*)(int32_t width,
+ int32_t height,
+ int32_t format,
+ uint64_t usage,
+ int32_t maxImages,
+ AImageReader** reader);
+
+using pAImageReader_setImageListener =
+ media_status_t (*)(AImageReader* reader,
+ AImageReader_ImageListener* listener);
+
+using pAImageReader_delete = void (*)(AImageReader* reader);
+
+using pAImageReader_getWindow = media_status_t (*)(AImageReader* reader,
+ ANativeWindow** window);
+
+using pAImageReader_getFormat = media_status_t (*)(const AImageReader* reader,
+ int32_t* format);
+
+using pAImageReader_acquireLatestImageAsync =
+ media_status_t (*)(AImageReader* reader,
+ AImage** image,
+ int* acquireFenceFd);
+
+using pAImageReader_acquireNextImageAsync =
+ media_status_t (*)(AImageReader* reader,
+ AImage** image,
+ int* acquireFenceFd);
+
+// For ANativeWindow
+using pANativeWindow_toSurface = jobject (*)(JNIEnv* env,
+ ANativeWindow* window);
+
+} // extern "C"
+
+#endif // BASE_ANDROID_ANDROID_IMAGE_READER_ABI_H_
diff --git a/chromium/base/android/android_image_reader_compat.cc b/chromium/base/android/android_image_reader_compat.cc
new file mode 100644
index 00000000000..d26f7e8a195
--- /dev/null
+++ b/chromium/base/android/android_image_reader_compat.cc
@@ -0,0 +1,166 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/android_image_reader_compat.h"
+
+#include <dlfcn.h>
+
+#include "base/android/build_info.h"
+#include "base/feature_list.h"
+#include "base/logging.h"
+#include "base/strings/string_util.h"
+
+#define LOAD_FUNCTION(lib, func) \
+ do { \
+ func##_ = reinterpret_cast<p##func>(dlsym(lib, #func)); \
+ if (!func##_) { \
+ DLOG(ERROR) << "Unable to load function " << #func; \
+ return false; \
+ } \
+ } while (0)
+
+namespace base {
+namespace android {
+
+AndroidImageReader& AndroidImageReader::GetInstance() {
+ // C++11 static local variable initialization is
+ // thread-safe.
+ static AndroidImageReader instance;
+ return instance;
+}
+
+bool AndroidImageReader::IsSupported() {
+ return is_supported_;
+}
+
+AndroidImageReader::AndroidImageReader() : is_supported_(LoadFunctions()) {}
+
+bool AndroidImageReader::LoadFunctions() {
+ // If the Chromium build requires __ANDROID_API__ >= 26 at some
+ // point in the future, we could directly use the global functions instead of
+ // dynamic loading. However, since this would be incompatible with pre-Oreo
+ // devices, this is unlikely to happen in the foreseeable future, so we use
+ // dynamic loading.
+
+ // Functions are not present for android version older than OREO.
+ // Currently we want to enable AImageReader only for android P+ devices.
+ if (base::android::BuildInfo::GetInstance()->sdk_int() <
+ base::android::SDK_VERSION_P) {
+ return false;
+ }
+
+ void* libmediandk = dlopen("libmediandk.so", RTLD_NOW);
+ if (libmediandk == nullptr) {
+ LOG(ERROR) << "Couldnt open libmediandk.so";
+ return false;
+ }
+
+ LOAD_FUNCTION(libmediandk, AImage_delete);
+ LOAD_FUNCTION(libmediandk, AImage_deleteAsync);
+ LOAD_FUNCTION(libmediandk, AImage_getHardwareBuffer);
+ LOAD_FUNCTION(libmediandk, AImage_getWidth);
+ LOAD_FUNCTION(libmediandk, AImage_getHeight);
+ LOAD_FUNCTION(libmediandk, AImage_getCropRect);
+ LOAD_FUNCTION(libmediandk, AImageReader_newWithUsage);
+ LOAD_FUNCTION(libmediandk, AImageReader_setImageListener);
+ LOAD_FUNCTION(libmediandk, AImageReader_delete);
+ LOAD_FUNCTION(libmediandk, AImageReader_getFormat);
+ LOAD_FUNCTION(libmediandk, AImageReader_getWindow);
+ LOAD_FUNCTION(libmediandk, AImageReader_acquireLatestImageAsync);
+ LOAD_FUNCTION(libmediandk, AImageReader_acquireNextImageAsync);
+
+ void* libandroid = dlopen("libandroid.so", RTLD_NOW);
+ if (libandroid == nullptr) {
+ LOG(ERROR) << "Couldnt open libandroid.so";
+ return false;
+ }
+
+ LOAD_FUNCTION(libandroid, ANativeWindow_toSurface);
+
+ return true;
+}
+
+void AndroidImageReader::AImage_delete(AImage* image) {
+ AImage_delete_(image);
+}
+
+void AndroidImageReader::AImage_deleteAsync(AImage* image, int releaseFenceFd) {
+ AImage_deleteAsync_(image, releaseFenceFd);
+}
+
+media_status_t AndroidImageReader::AImage_getHardwareBuffer(
+ const AImage* image,
+ AHardwareBuffer** buffer) {
+ return AImage_getHardwareBuffer_(image, buffer);
+}
+
+media_status_t AndroidImageReader::AImage_getWidth(const AImage* image,
+ int32_t* width) {
+ return AImage_getWidth_(image, width);
+}
+
+media_status_t AndroidImageReader::AImage_getHeight(const AImage* image,
+ int32_t* height) {
+ return AImage_getHeight_(image, height);
+}
+
+media_status_t AndroidImageReader::AImage_getCropRect(const AImage* image,
+ AImageCropRect* rect) {
+ return AImage_getCropRect_(image, rect);
+}
+
+media_status_t AndroidImageReader::AImageReader_newWithUsage(
+ int32_t width,
+ int32_t height,
+ int32_t format,
+ uint64_t usage,
+ int32_t maxImages,
+ AImageReader** reader) {
+ return AImageReader_newWithUsage_(width, height, format, usage, maxImages,
+ reader);
+}
+
+media_status_t AndroidImageReader::AImageReader_setImageListener(
+ AImageReader* reader,
+ AImageReader_ImageListener* listener) {
+ return AImageReader_setImageListener_(reader, listener);
+}
+
+void AndroidImageReader::AImageReader_delete(AImageReader* reader) {
+ AImageReader_delete_(reader);
+}
+
+media_status_t AndroidImageReader::AImageReader_getFormat(
+ const AImageReader* reader,
+ int32_t* format) {
+ return AImageReader_getFormat_(reader, format);
+}
+
+media_status_t AndroidImageReader::AImageReader_getWindow(
+ AImageReader* reader,
+ ANativeWindow** window) {
+ return AImageReader_getWindow_(reader, window);
+}
+
+media_status_t AndroidImageReader::AImageReader_acquireLatestImageAsync(
+ AImageReader* reader,
+ AImage** image,
+ int* acquireFenceFd) {
+ return AImageReader_acquireLatestImageAsync_(reader, image, acquireFenceFd);
+}
+
+media_status_t AndroidImageReader::AImageReader_acquireNextImageAsync(
+ AImageReader* reader,
+ AImage** image,
+ int* acquireFenceFd) {
+ return AImageReader_acquireNextImageAsync_(reader, image, acquireFenceFd);
+}
+
+jobject AndroidImageReader::ANativeWindow_toSurface(JNIEnv* env,
+ ANativeWindow* window) {
+ return ANativeWindow_toSurface_(env, window);
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/android_image_reader_compat.h b/chromium/base/android/android_image_reader_compat.h
new file mode 100644
index 00000000000..bef2ae10323
--- /dev/null
+++ b/chromium/base/android/android_image_reader_compat.h
@@ -0,0 +1,89 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_ANDROID_IMAGE_READER_COMPAT_H_
+#define BASE_ANDROID_ANDROID_IMAGE_READER_COMPAT_H_
+
+#include "base/android/android_image_reader_abi.h"
+#include "base/base_export.h"
+#include "base/no_destructor.h"
+
+namespace base {
+namespace android {
+
+// This class provides runtime support for working with AImage, AImageReader and
+// ANativeWindow objects on Android O systems without requiring building for the
+// Android O NDK level. Don't call GetInstance() unless IsSupported() returns
+// true.
+class BASE_EXPORT AndroidImageReader {
+ public:
+ // Thread safe GetInstance.
+ static AndroidImageReader& GetInstance();
+
+ AndroidImageReader(const AndroidImageReader&) = delete;
+ AndroidImageReader& operator=(const AndroidImageReader&) = delete;
+
+ // Check if the image reader usage is supported. This function returns TRUE
+ // if android version is >=OREO, image reader support is not disabled and all
+ // the required functions are loaded.
+ bool IsSupported();
+
+ // Naming convention of all the below functions are chosen to exactly match
+ // the function names in the NDK.
+ void AImage_delete(AImage* image);
+ void AImage_deleteAsync(AImage* image, int releaseFenceFd);
+ media_status_t AImage_getHardwareBuffer(const AImage* image,
+ AHardwareBuffer** buffer);
+ media_status_t AImage_getWidth(const AImage* image, int32_t* width);
+ media_status_t AImage_getHeight(const AImage* image, int32_t* height);
+ media_status_t AImage_getCropRect(const AImage* image, AImageCropRect* rect);
+ media_status_t AImageReader_newWithUsage(int32_t width,
+ int32_t height,
+ int32_t format,
+ uint64_t usage,
+ int32_t maxImages,
+ AImageReader** reader);
+ media_status_t AImageReader_setImageListener(
+ AImageReader* reader,
+ AImageReader_ImageListener* listener);
+ void AImageReader_delete(AImageReader* reader);
+ media_status_t AImageReader_getFormat(const AImageReader* reader,
+ int32_t* format);
+ media_status_t AImageReader_getWindow(AImageReader* reader,
+ ANativeWindow** window);
+ media_status_t AImageReader_acquireLatestImageAsync(AImageReader* reader,
+ AImage** image,
+ int* acquireFenceFd);
+ media_status_t AImageReader_acquireNextImageAsync(AImageReader* reader,
+ AImage** image,
+ int* acquireFenceFd);
+ jobject ANativeWindow_toSurface(JNIEnv* env, ANativeWindow* window);
+
+ private:
+ friend class base::NoDestructor<AndroidImageReader>;
+
+ AndroidImageReader();
+ bool LoadFunctions();
+
+ const bool is_supported_;
+ pAImage_delete AImage_delete_;
+ pAImage_deleteAsync AImage_deleteAsync_;
+ pAImage_getHardwareBuffer AImage_getHardwareBuffer_;
+ pAImage_getWidth AImage_getWidth_;
+ pAImage_getHeight AImage_getHeight_;
+ pAImage_getCropRect AImage_getCropRect_;
+ pAImageReader_newWithUsage AImageReader_newWithUsage_;
+ pAImageReader_setImageListener AImageReader_setImageListener_;
+ pAImageReader_delete AImageReader_delete_;
+ pAImageReader_getFormat AImageReader_getFormat_;
+ pAImageReader_getWindow AImageReader_getWindow_;
+ pAImageReader_acquireLatestImageAsync AImageReader_acquireLatestImageAsync_;
+ pAImageReader_acquireNextImageAsync AImageReader_acquireNextImageAsync_;
+ pANativeWindow_toSurface ANativeWindow_toSurface_;
+};
+
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_ANDROID_IMAGE_READER_COMPAT_H_
diff --git a/chromium/base/android/android_image_reader_compat_unittest.cc b/chromium/base/android/android_image_reader_compat_unittest.cc
new file mode 100644
index 00000000000..af31ec02fae
--- /dev/null
+++ b/chromium/base/android/android_image_reader_compat_unittest.cc
@@ -0,0 +1,42 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/android_image_reader_compat.h"
+
+#include <stdint.h>
+#include <memory>
+
+#include "base/android/build_info.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace base {
+namespace android {
+
+class AndroidImageReaderTest : public testing::Test {
+ public:
+ AndroidImageReaderTest() = default;
+ ~AndroidImageReaderTest() override = default;
+};
+
+// Getting instance of AndroidImageReader will invoke AndroidImageReader
+// constructor which will dlopen the mediandk and androidndk .so files and do
+// all the required symbol lookups.
+TEST_F(AndroidImageReaderTest, GetImageReaderInstance) {
+ // It is expected that image reader support will be available from android
+ // version OREO.
+ EXPECT_EQ(AndroidImageReader::GetInstance().IsSupported(),
+ base::android::BuildInfo::GetInstance()->sdk_int() >=
+ base::android::SDK_VERSION_P);
+}
+
+// There should be only 1 instance of AndroidImageReader im memory. Hence 2
+// instances should have same memory address.
+TEST_F(AndroidImageReaderTest, CompareImageReaderInstance) {
+ AndroidImageReader& a1 = AndroidImageReader::GetInstance();
+ AndroidImageReader& a2 = AndroidImageReader::GetInstance();
+ ASSERT_EQ(&a1, &a2);
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/apk_assets.cc b/chromium/base/android/apk_assets.cc
new file mode 100644
index 00000000000..7a1b1d181f8
--- /dev/null
+++ b/chromium/base/android/apk_assets.cc
@@ -0,0 +1,55 @@
+// Copyright 2015 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <jni.h>
+
+#include "base/android/apk_assets.h"
+
+#include "base/android/jni_array.h"
+#include "base/android/jni_string.h"
+#include "base/android/scoped_java_ref.h"
+#include "base/base_jni_headers/ApkAssets_jni.h"
+#include "base/file_descriptor_store.h"
+
+namespace base {
+namespace android {
+
+int OpenApkAsset(const std::string& file_path,
+ const std::string& split_name,
+ base::MemoryMappedFile::Region* region) {
+ // The AssetManager API of the NDK does not expose a method for accessing raw
+ // resources :(
+ JNIEnv* env = base::android::AttachCurrentThread();
+ ScopedJavaLocalRef<jlongArray> jarr =
+ Java_ApkAssets_open(env, ConvertUTF8ToJavaString(env, file_path),
+ ConvertUTF8ToJavaString(env, split_name));
+ std::vector<jlong> results;
+ base::android::JavaLongArrayToLongVector(env, jarr, &results);
+ CHECK_EQ(3U, results.size());
+ int fd = static_cast<int>(results[0]);
+ region->offset = results[1];
+ // Not a checked_cast because open() may return -1.
+ region->size = static_cast<size_t>(results[2]);
+ return fd;
+}
+
+int OpenApkAsset(const std::string& file_path,
+ base::MemoryMappedFile::Region* region) {
+ return OpenApkAsset(file_path, std::string(), region);
+}
+
+bool RegisterApkAssetWithFileDescriptorStore(const std::string& key,
+ const base::FilePath& file_path) {
+ base::MemoryMappedFile::Region region =
+ base::MemoryMappedFile::Region::kWholeFile;
+ int asset_fd = OpenApkAsset(file_path.value(), &region);
+ if (asset_fd == -1)
+ return false;
+ base::FileDescriptorStore::GetInstance().Set(key, base::ScopedFD(asset_fd),
+ region);
+ return true;
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/apk_assets.h b/chromium/base/android/apk_assets.h
new file mode 100644
index 00000000000..69909689f19
--- /dev/null
+++ b/chromium/base/android/apk_assets.h
@@ -0,0 +1,43 @@
+// Copyright 2015 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_APK_ASSETS_H_
+#define BASE_ANDROID_APK_ASSETS_H_
+
+#include <string>
+
+#include "base/android/jni_android.h"
+#include "base/files/file_path.h"
+#include "base/files/memory_mapped_file.h"
+
+namespace base {
+namespace android {
+
+// Opens an asset (e.g. a .pak file) from the apk.
+// Can be used from renderer process.
+// Fails if the asset is not stored uncompressed within the .apk.
+// Returns: The File Descriptor of the asset, or -1 upon failure.
+// Input arguments:
+// - |file_path|: Path to file within .apk. e.g.: assets/foo.pak
+// - |split_name|: If non-empty, refers to the split where the asset is located.
+// Output arguments:
+// - |region|: size & offset (in bytes) within the .apk of the asset.
+BASE_EXPORT int OpenApkAsset(const std::string& file_path,
+ const std::string& split_name,
+ base::MemoryMappedFile::Region* region);
+BASE_EXPORT int OpenApkAsset(
+ const std::string& file_path,
+ base::MemoryMappedFile::Region* region);
+
+// Registers an uncompressed asset from within the apk in the
+// FileDescriptorStore.
+// Returns: true in case of success, false otherwise.
+BASE_EXPORT bool RegisterApkAssetWithFileDescriptorStore(
+ const std::string& key,
+ const base::FilePath& file_path);
+
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_APK_ASSETS_H_
diff --git a/chromium/base/android/application_status_listener.cc b/chromium/base/android/application_status_listener.cc
new file mode 100644
index 00000000000..464343f31cb
--- /dev/null
+++ b/chromium/base/android/application_status_listener.cc
@@ -0,0 +1,127 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/application_status_listener.h"
+
+#include <jni.h>
+
+#include "base/base_jni_headers/ApplicationStatus_jni.h"
+#include "base/functional/callback.h"
+#include "base/lazy_instance.h"
+#include "base/metrics/user_metrics.h"
+#include "base/observer_list_threadsafe.h"
+#include "base/trace_event/base_tracing.h"
+
+#if BUILDFLAG(ENABLE_BASE_TRACING)
+#include "base/trace_event/application_state_proto_android.h" // no-presubmit-check
+#endif // BUILDFLAG(ENABLE_BASE_TRACING)
+
+namespace base {
+namespace android {
+
+namespace {
+
+class ApplicationStatusListenerImpl;
+
+struct LeakyLazyObserverListTraits
+ : base::internal::LeakyLazyInstanceTraits<
+ ObserverListThreadSafe<ApplicationStatusListenerImpl>> {
+ static ObserverListThreadSafe<ApplicationStatusListenerImpl>* New(
+ void* instance) {
+ ObserverListThreadSafe<ApplicationStatusListenerImpl>* ret =
+ base::internal::LeakyLazyInstanceTraits<ObserverListThreadSafe<
+ ApplicationStatusListenerImpl>>::New(instance);
+ // Leaky.
+ ret->AddRef();
+ return ret;
+ }
+};
+
+LazyInstance<ObserverListThreadSafe<ApplicationStatusListenerImpl>,
+ LeakyLazyObserverListTraits>
+ g_observers = LAZY_INSTANCE_INITIALIZER;
+
+class ApplicationStatusListenerImpl : public ApplicationStatusListener {
+ public:
+ ApplicationStatusListenerImpl(
+ const ApplicationStateChangeCallback& callback) {
+ SetCallback(callback);
+ g_observers.Get().AddObserver(this);
+
+ Java_ApplicationStatus_registerThreadSafeNativeApplicationStateListener(
+ AttachCurrentThread());
+ }
+
+ ~ApplicationStatusListenerImpl() override {
+ g_observers.Get().RemoveObserver(this);
+ }
+
+ void SetCallback(const ApplicationStateChangeCallback& callback) override {
+ DCHECK(!callback_);
+ DCHECK(callback);
+ callback_ = callback;
+ }
+
+ void Notify(ApplicationState state) override {
+ if (callback_)
+ callback_.Run(state);
+ }
+
+ private:
+ ApplicationStateChangeCallback callback_;
+};
+
+} // namespace
+
+ApplicationStatusListener::ApplicationStatusListener() = default;
+ApplicationStatusListener::~ApplicationStatusListener() = default;
+
+// static
+std::unique_ptr<ApplicationStatusListener> ApplicationStatusListener::New(
+ const ApplicationStateChangeCallback& callback) {
+ return std::make_unique<ApplicationStatusListenerImpl>(callback);
+}
+
+// static
+void ApplicationStatusListener::NotifyApplicationStateChange(
+ ApplicationState state) {
+ TRACE_APPLICATION_STATE(state);
+ switch (state) {
+ case APPLICATION_STATE_UNKNOWN:
+ case APPLICATION_STATE_HAS_DESTROYED_ACTIVITIES:
+ break;
+ case APPLICATION_STATE_HAS_RUNNING_ACTIVITIES:
+ RecordAction(UserMetricsAction("Android.LifeCycle.HasRunningActivities"));
+ break;
+ case APPLICATION_STATE_HAS_PAUSED_ACTIVITIES:
+ RecordAction(UserMetricsAction("Android.LifeCycle.HasPausedActivities"));
+ break;
+ case APPLICATION_STATE_HAS_STOPPED_ACTIVITIES:
+ RecordAction(UserMetricsAction("Android.LifeCycle.HasStoppedActivities"));
+ break;
+ }
+ g_observers.Get().Notify(FROM_HERE, &ApplicationStatusListenerImpl::Notify,
+ state);
+}
+
+// static
+ApplicationState ApplicationStatusListener::GetState() {
+ return static_cast<ApplicationState>(
+ Java_ApplicationStatus_getStateForApplication(AttachCurrentThread()));
+}
+
+static void JNI_ApplicationStatus_OnApplicationStateChange(
+ JNIEnv* env,
+ jint new_state) {
+ ApplicationState application_state = static_cast<ApplicationState>(new_state);
+ ApplicationStatusListener::NotifyApplicationStateChange(application_state);
+}
+
+// static
+bool ApplicationStatusListener::HasVisibleActivities() {
+ return Java_ApplicationStatus_hasVisibleActivities(AttachCurrentThread());
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/application_status_listener.h b/chromium/base/android/application_status_listener.h
new file mode 100644
index 00000000000..dbbc36b58bf
--- /dev/null
+++ b/chromium/base/android/application_status_listener.h
@@ -0,0 +1,97 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_APPLICATION_STATUS_LISTENER_H_
+#define BASE_ANDROID_APPLICATION_STATUS_LISTENER_H_
+
+#include <jni.h>
+#include <memory>
+
+#include "base/android/jni_android.h"
+#include "base/base_export.h"
+#include "base/functional/callback_forward.h"
+
+namespace base {
+namespace android {
+
+// Define application state values like APPLICATION_STATE_VISIBLE in a
+// way that ensures they're always the same than their Java counterpart.
+//
+// Note that these states represent the most visible Activity state.
+// If there are activities with states paused and stopped, only
+// HAS_PAUSED_ACTIVITIES should be returned.
+//
+// A Java counterpart will be generated for this enum.
+// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.base
+enum ApplicationState {
+ APPLICATION_STATE_UNKNOWN = 0,
+ APPLICATION_STATE_HAS_RUNNING_ACTIVITIES = 1,
+ APPLICATION_STATE_HAS_PAUSED_ACTIVITIES = 2,
+ APPLICATION_STATE_HAS_STOPPED_ACTIVITIES = 3,
+ APPLICATION_STATE_HAS_DESTROYED_ACTIVITIES = 4
+};
+
+// A native helper class to listen to state changes of the Android
+// Application. This mirrors org.chromium.base.ApplicationStatus.
+// any thread.
+//
+// To start listening, create a new instance, passing a callback to a
+// function that takes an ApplicationState parameter. To stop listening,
+// simply delete the listener object. The implementation guarantees
+// that the callback will always be called on the thread that created
+// the listener.
+//
+// Example:
+//
+// void OnApplicationStateChange(ApplicationState state) {
+// ...
+// }
+//
+// // Start listening.
+// auto my_listener = ApplicationStatusListener::New(
+// base::BindRepeating(&OnApplicationStateChange));
+//
+// ...
+//
+// // Stop listening.
+// my_listener.reset();
+//
+class BASE_EXPORT ApplicationStatusListener {
+ public:
+ using ApplicationStateChangeCallback =
+ base::RepeatingCallback<void(ApplicationState)>;
+
+ ApplicationStatusListener(const ApplicationStatusListener&) = delete;
+ ApplicationStatusListener& operator=(const ApplicationStatusListener&) =
+ delete;
+
+ virtual ~ApplicationStatusListener();
+
+ // Sets the callback to call when application state changes.
+ virtual void SetCallback(const ApplicationStateChangeCallback& callback) = 0;
+
+ // Notify observers that application state has changed.
+ virtual void Notify(ApplicationState state) = 0;
+
+ // Create a new listener. This object should only be used on a single thread.
+ static std::unique_ptr<ApplicationStatusListener> New(
+ const ApplicationStateChangeCallback& callback);
+
+ // Internal use only: must be public to be called from JNI and unit tests.
+ static void NotifyApplicationStateChange(ApplicationState state);
+
+ // Expose jni call for ApplicationStatus.getStateForApplication.
+ static ApplicationState GetState();
+
+ // Returns true if the app is currently foregrounded.
+ static bool HasVisibleActivities();
+
+ protected:
+ ApplicationStatusListener();
+};
+
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_APPLICATION_STATUS_LISTENER_H_
diff --git a/chromium/base/android/application_status_listener_unittest.cc b/chromium/base/android/application_status_listener_unittest.cc
new file mode 100644
index 00000000000..224732c5221
--- /dev/null
+++ b/chromium/base/android/application_status_listener_unittest.cc
@@ -0,0 +1,128 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/application_status_listener.h"
+
+#include <memory>
+
+#include "base/functional/bind.h"
+#include "base/run_loop.h"
+#include "base/synchronization/waitable_event.h"
+#include "base/test/task_environment.h"
+#include "base/threading/thread.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace base {
+namespace android {
+
+namespace {
+
+using base::android::ScopedJavaLocalRef;
+
+// An invalid ApplicationState value.
+const ApplicationState kInvalidApplicationState =
+ static_cast<ApplicationState>(100);
+
+// Used to generate a callback that stores the new state at a given location.
+void StoreStateTo(ApplicationState* target, ApplicationState state) {
+ *target = state;
+}
+
+void RunTasksUntilIdle() {
+ RunLoop run_loop;
+ run_loop.RunUntilIdle();
+}
+
+// Shared state for the multi-threaded test.
+// This uses a thread to register for events and listen to them, while state
+// changes are forced on the main thread.
+class MultiThreadedTest {
+ public:
+ MultiThreadedTest()
+ : state_(kInvalidApplicationState),
+ event_(WaitableEvent::ResetPolicy::AUTOMATIC,
+ WaitableEvent::InitialState::NOT_SIGNALED),
+ thread_("ApplicationStatusTest thread") {}
+
+ void Run() {
+ // Start the thread and tell it to register for events.
+ thread_.Start();
+ thread_.task_runner()->PostTask(
+ FROM_HERE, base::BindOnce(&MultiThreadedTest::RegisterThreadForEvents,
+ base::Unretained(this)));
+
+ // Wait for its completion.
+ event_.Wait();
+
+ // Change state, then wait for the thread to modify state.
+ ApplicationStatusListener::NotifyApplicationStateChange(
+ APPLICATION_STATE_HAS_RUNNING_ACTIVITIES);
+ event_.Wait();
+ EXPECT_EQ(APPLICATION_STATE_HAS_RUNNING_ACTIVITIES, state_);
+
+ // Again
+ ApplicationStatusListener::NotifyApplicationStateChange(
+ APPLICATION_STATE_HAS_DESTROYED_ACTIVITIES);
+ event_.Wait();
+ EXPECT_EQ(APPLICATION_STATE_HAS_DESTROYED_ACTIVITIES, state_);
+ }
+
+ private:
+ void ExpectOnThread() {
+ EXPECT_TRUE(thread_.task_runner()->BelongsToCurrentThread());
+ }
+
+ void RegisterThreadForEvents() {
+ ExpectOnThread();
+ listener_ = ApplicationStatusListener::New(base::BindRepeating(
+ &MultiThreadedTest::StoreStateAndSignal, base::Unretained(this)));
+ EXPECT_TRUE(listener_.get());
+ event_.Signal();
+ }
+
+ void StoreStateAndSignal(ApplicationState state) {
+ ExpectOnThread();
+ state_ = state;
+ event_.Signal();
+ }
+
+ ApplicationState state_;
+ base::WaitableEvent event_;
+ base::Thread thread_;
+ test::TaskEnvironment task_environment_;
+ std::unique_ptr<ApplicationStatusListener> listener_;
+};
+
+} // namespace
+
+TEST(ApplicationStatusListenerTest, SingleThread) {
+ test::TaskEnvironment task_environment;
+
+ ApplicationState result = kInvalidApplicationState;
+
+ // Create a new listener that stores the new state into |result| on every
+ // state change.
+ auto listener = ApplicationStatusListener::New(
+ base::BindRepeating(&StoreStateTo, base::Unretained(&result)));
+
+ EXPECT_EQ(kInvalidApplicationState, result);
+
+ ApplicationStatusListener::NotifyApplicationStateChange(
+ APPLICATION_STATE_HAS_RUNNING_ACTIVITIES);
+ RunTasksUntilIdle();
+ EXPECT_EQ(APPLICATION_STATE_HAS_RUNNING_ACTIVITIES, result);
+
+ ApplicationStatusListener::NotifyApplicationStateChange(
+ APPLICATION_STATE_HAS_DESTROYED_ACTIVITIES);
+ RunTasksUntilIdle();
+ EXPECT_EQ(APPLICATION_STATE_HAS_DESTROYED_ACTIVITIES, result);
+}
+
+TEST(ApplicationStatusListenerTest, TwoThreads) {
+ MultiThreadedTest test;
+ test.Run();
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/base_feature_list.cc b/chromium/base/android/base_feature_list.cc
new file mode 100644
index 00000000000..349c543ffba
--- /dev/null
+++ b/chromium/base/android/base_feature_list.cc
@@ -0,0 +1,47 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/base_features.h"
+#include "base/android/jni_string.h"
+#include "base/base_jni_headers/BaseFeatureList_jni.h"
+#include "base/feature_list.h"
+#include "base/notreached.h"
+
+using base::android::ConvertJavaStringToUTF8;
+using base::android::JavaParamRef;
+
+namespace base::android {
+
+namespace {
+
+// Array of features exposed through the Java ContentFeatureList API. Entries in
+// this array may either refer to features defined in the header of this file or
+// in other locations in the code base (e.g. content_features.h).
+const base::Feature* const kFeaturesExposedToJava[] = {
+ &features::kBrowserProcessMemoryPurge,
+ &features::kCrashBrowserOnChildMismatchIfBrowserChanged,
+ &features::kCrashBrowserOnAnyChildMismatch,
+}; // namespace
+
+const base::Feature* FindFeatureExposedToJava(const std::string& feature_name) {
+ for (const base::Feature* feature : kFeaturesExposedToJava) {
+ if (feature->name == feature_name)
+ return feature;
+ }
+ NOTREACHED() << "Queried feature cannot be found in BaseFeatureList: "
+ << feature_name;
+ return nullptr;
+}
+
+} // namespace
+
+static jboolean JNI_BaseFeatureList_IsEnabled(
+ JNIEnv* env,
+ const JavaParamRef<jstring>& jfeature_name) {
+ const base::Feature* feature =
+ FindFeatureExposedToJava(ConvertJavaStringToUTF8(env, jfeature_name));
+ return base::FeatureList::IsEnabled(*feature);
+}
+
+} // namespace base::android
diff --git a/chromium/base/android/base_features.cc b/chromium/base/android/base_features.cc
new file mode 100644
index 00000000000..4050c5a914e
--- /dev/null
+++ b/chromium/base/android/base_features.cc
@@ -0,0 +1,34 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/base_features.h"
+#include "base/feature_list.h"
+
+namespace base::android::features {
+
+// Alphabetical:
+
+// When the browser process has been in the background for several minutes at a
+// time, trigger an artificial critical memory pressure notification. This is
+// intended to reduce memory footprint.
+BASE_FEATURE(kBrowserProcessMemoryPurge,
+ "BrowserProcessMemoryPurge",
+ FEATURE_ENABLED_BY_DEFAULT);
+
+// Crash the browser process if a child process is created which does not match
+// the browser process and the browser package appears to have changed since the
+// browser process was launched, so that the browser process will be started
+// fresh when next used, hopefully resolving the issue.
+BASE_FEATURE(kCrashBrowserOnChildMismatchIfBrowserChanged,
+ "CrashBrowserOnChildMismatchIfBrowserChanged",
+ FEATURE_DISABLED_BY_DEFAULT);
+
+// Crash the browser process if a child process is created which does not match
+// the browser process regardless of whether the browser package appears to have
+// changed.
+BASE_FEATURE(kCrashBrowserOnAnyChildMismatch,
+ "CrashBrowserOnAnyChildMismatch",
+ FEATURE_DISABLED_BY_DEFAULT);
+
+} // namespace base::android::features
diff --git a/chromium/base/android/base_features.h b/chromium/base/android/base_features.h
new file mode 100644
index 00000000000..f49a9f6e57d
--- /dev/null
+++ b/chromium/base/android/base_features.h
@@ -0,0 +1,22 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_BASE_FEATURES_H_
+#define BASE_ANDROID_BASE_FEATURES_H_
+
+#include "base/feature_list.h"
+
+namespace base::android::features {
+
+// All features in alphabetical order. The features should be documented
+// alongside the definition of their values in the .cc file.
+
+// Alphabetical:
+BASE_DECLARE_FEATURE(kBrowserProcessMemoryPurge);
+BASE_DECLARE_FEATURE(kCrashBrowserOnChildMismatchIfBrowserChanged);
+BASE_DECLARE_FEATURE(kCrashBrowserOnAnyChildMismatch);
+
+} // namespace base::android::features
+
+#endif // BASE_ANDROID_BASE_FEATURES_H_
diff --git a/chromium/base/android/base_jni_onload.cc b/chromium/base/android/base_jni_onload.cc
new file mode 100644
index 00000000000..0b64a91e4ac
--- /dev/null
+++ b/chromium/base/android/base_jni_onload.cc
@@ -0,0 +1,23 @@
+// Copyright 2015 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/base_jni_onload.h"
+
+#include "base/android/jni_android.h"
+#include "base/android/jni_utils.h"
+#include "base/android/library_loader/library_loader_hooks.h"
+#include "base/functional/bind.h"
+
+namespace base {
+namespace android {
+
+bool OnJNIOnLoadInit() {
+ InitAtExitManager();
+ JNIEnv* env = base::android::AttachCurrentThread();
+ base::android::InitGlobalClassLoader(env);
+ return true;
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/base_jni_onload.h b/chromium/base/android/base_jni_onload.h
new file mode 100644
index 00000000000..5f989033a47
--- /dev/null
+++ b/chromium/base/android/base_jni_onload.h
@@ -0,0 +1,22 @@
+// Copyright 2015 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_BASE_JNI_ONLOAD_H_
+#define BASE_ANDROID_BASE_JNI_ONLOAD_H_
+
+#include <jni.h>
+
+#include "base/base_export.h"
+#include "base/functional/callback.h"
+
+namespace base {
+namespace android {
+
+// Returns whether initialization succeeded.
+BASE_EXPORT bool OnJNIOnLoadInit();
+
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_BASE_JNI_ONLOAD_H_
diff --git a/chromium/base/android/build_info.cc b/chromium/base/android/build_info.cc
new file mode 100644
index 00000000000..14a72674104
--- /dev/null
+++ b/chromium/base/android/build_info.cc
@@ -0,0 +1,93 @@
+// Copyright 2012 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/build_info.h"
+
+#include <string>
+
+#include "base/android/jni_android.h"
+#include "base/android/jni_array.h"
+#include "base/android/scoped_java_ref.h"
+#include "base/base_jni_headers/BuildInfo_jni.h"
+#include "base/check_op.h"
+#include "base/memory/singleton.h"
+#include "base/notreached.h"
+#include "base/strings/string_number_conversions.h"
+
+namespace base {
+namespace android {
+
+namespace {
+
+// We are leaking these strings.
+const char* StrDupParam(const std::vector<std::string>& params, size_t index) {
+ return strdup(params[index].c_str());
+}
+
+int GetIntParam(const std::vector<std::string>& params, size_t index) {
+ int ret = 0;
+ bool success = StringToInt(params[index], &ret);
+ DCHECK(success);
+ return ret;
+}
+
+} // namespace
+
+struct BuildInfoSingletonTraits {
+ static BuildInfo* New() {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jobjectArray> params_objs = Java_BuildInfo_getAll(env);
+ std::vector<std::string> params;
+ AppendJavaStringArrayToStringVector(env, params_objs, &params);
+ return new BuildInfo(params);
+ }
+
+ static void Delete(BuildInfo* x) {
+ // We're leaking this type, see kRegisterAtExit.
+ NOTREACHED();
+ }
+
+ static const bool kRegisterAtExit = false;
+#if DCHECK_IS_ON()
+ static const bool kAllowedToAccessOnNonjoinableThread = true;
+#endif
+};
+
+BuildInfo::BuildInfo(const std::vector<std::string>& params)
+ : brand_(StrDupParam(params, 0)),
+ device_(StrDupParam(params, 1)),
+ android_build_id_(StrDupParam(params, 2)),
+ manufacturer_(StrDupParam(params, 3)),
+ model_(StrDupParam(params, 4)),
+ sdk_int_(GetIntParam(params, 5)),
+ build_type_(StrDupParam(params, 6)),
+ board_(StrDupParam(params, 7)),
+ host_package_name_(StrDupParam(params, 8)),
+ host_version_code_(StrDupParam(params, 9)),
+ host_package_label_(StrDupParam(params, 10)),
+ package_name_(StrDupParam(params, 11)),
+ package_version_code_(StrDupParam(params, 12)),
+ package_version_name_(StrDupParam(params, 13)),
+ android_build_fp_(StrDupParam(params, 14)),
+ gms_version_code_(StrDupParam(params, 15)),
+ installer_package_name_(StrDupParam(params, 16)),
+ abi_name_(StrDupParam(params, 17)),
+ firebase_app_id_(StrDupParam(params, 18)),
+ custom_themes_(StrDupParam(params, 19)),
+ resources_version_(StrDupParam(params, 20)),
+ target_sdk_version_(GetIntParam(params, 21)),
+ is_debug_android_(GetIntParam(params, 22)),
+ is_tv_(GetIntParam(params, 23)),
+ version_incremental_(StrDupParam(params, 24)),
+ hardware_(StrDupParam(params, 25)),
+ is_at_least_t_(GetIntParam(params, 26)),
+ is_automotive_(GetIntParam(params, 27)) {}
+
+// static
+BuildInfo* BuildInfo::GetInstance() {
+ return Singleton<BuildInfo, BuildInfoSingletonTraits >::get();
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/build_info.h b/chromium/base/android/build_info.h
new file mode 100644
index 00000000000..b1aaa680c64
--- /dev/null
+++ b/chromium/base/android/build_info.h
@@ -0,0 +1,192 @@
+// Copyright 2012 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_BUILD_INFO_H_
+#define BASE_ANDROID_BUILD_INFO_H_
+
+#include <jni.h>
+
+#include <string>
+#include <vector>
+
+#include "base/base_export.h"
+#include "base/memory/singleton.h"
+
+namespace base {
+namespace android {
+
+// This enumeration maps to the values returned by BuildInfo::sdk_int(),
+// indicating the Android release associated with a given SDK version.
+enum SdkVersion {
+ SDK_VERSION_JELLY_BEAN = 16,
+ SDK_VERSION_JELLY_BEAN_MR1 = 17,
+ SDK_VERSION_JELLY_BEAN_MR2 = 18,
+ SDK_VERSION_KITKAT = 19,
+ SDK_VERSION_KITKAT_WEAR = 20,
+ SDK_VERSION_LOLLIPOP = 21,
+ SDK_VERSION_LOLLIPOP_MR1 = 22,
+ SDK_VERSION_MARSHMALLOW = 23,
+ SDK_VERSION_NOUGAT = 24,
+ SDK_VERSION_NOUGAT_MR1 = 25,
+ SDK_VERSION_OREO = 26,
+ SDK_VERSION_O_MR1 = 27,
+ SDK_VERSION_P = 28,
+ SDK_VERSION_Q = 29,
+ SDK_VERSION_R = 30,
+ SDK_VERSION_S = 31,
+ SDK_VERSION_Sv2 = 32,
+ SDK_VERSION_T = 33,
+};
+
+// BuildInfo is a singleton class that stores android build and device
+// information. It will be called from Android specific code and gets used
+// primarily in crash reporting.
+class BASE_EXPORT BuildInfo {
+ public:
+ BuildInfo(const BuildInfo&) = delete;
+ BuildInfo& operator=(const BuildInfo&) = delete;
+
+ ~BuildInfo() {}
+
+ // Static factory method for getting the singleton BuildInfo instance.
+ // Note that ownership is not conferred on the caller and the BuildInfo in
+ // question isn't actually freed until shutdown. This is ok because there
+ // should only be one instance of BuildInfo ever created.
+ static BuildInfo* GetInstance();
+
+ // Const char* is used instead of std::strings because these values must be
+ // available even if the process is in a crash state. Sadly
+ // std::string.c_str() doesn't guarantee that memory won't be allocated when
+ // it is called.
+ const char* device() const {
+ return device_;
+ }
+
+ const char* manufacturer() const {
+ return manufacturer_;
+ }
+
+ const char* model() const {
+ return model_;
+ }
+
+ const char* brand() const {
+ return brand_;
+ }
+
+ const char* android_build_id() const {
+ return android_build_id_;
+ }
+
+ const char* android_build_fp() const {
+ return android_build_fp_;
+ }
+
+ const char* gms_version_code() const {
+ return gms_version_code_;
+ }
+
+ const char* host_package_name() const { return host_package_name_; }
+
+ const char* host_version_code() const { return host_version_code_; }
+
+ const char* host_package_label() const { return host_package_label_; }
+
+ const char* package_version_code() const {
+ return package_version_code_;
+ }
+
+ const char* package_version_name() const {
+ return package_version_name_;
+ }
+
+ const char* package_name() const {
+ return package_name_;
+ }
+
+ // Will be empty string if no app id is assigned.
+ const char* firebase_app_id() const { return firebase_app_id_; }
+
+ const char* custom_themes() const { return custom_themes_; }
+
+ const char* resources_version() const { return resources_version_; }
+
+ const char* build_type() const {
+ return build_type_;
+ }
+
+ const char* board() const { return board_; }
+
+ const char* installer_package_name() const { return installer_package_name_; }
+
+ const char* abi_name() const { return abi_name_; }
+
+ int sdk_int() const {
+ return sdk_int_;
+ }
+
+ // Returns the targetSdkVersion of the currently running app. If called from a
+ // library, this returns the embedding app's targetSdkVersion.
+ //
+ // This can only be compared to finalized SDK versions, never against
+ // pre-release Android versions. For pre-release Android versions, see the
+ // targetsAtLeast*() methods in BuildInfo.java.
+ int target_sdk_version() const { return target_sdk_version_; }
+
+ bool is_debug_android() const { return is_debug_android_; }
+
+ bool is_tv() const { return is_tv_; }
+
+ const char* version_incremental() const { return version_incremental_; }
+
+ const char* hardware() const { return hardware_; }
+
+ bool is_at_least_t() const { return is_at_least_t_; }
+
+ bool is_automotive() const { return is_automotive_; }
+
+ private:
+ friend struct BuildInfoSingletonTraits;
+
+ explicit BuildInfo(const std::vector<std::string>& params);
+
+ // Const char* is used instead of std::strings because these values must be
+ // available even if the process is in a crash state. Sadly
+ // std::string.c_str() doesn't guarantee that memory won't be allocated when
+ // it is called.
+ const char* const brand_;
+ const char* const device_;
+ const char* const android_build_id_;
+ const char* const manufacturer_;
+ const char* const model_;
+ const int sdk_int_;
+ const char* const build_type_;
+ const char* const board_;
+ const char* const host_package_name_;
+ const char* const host_version_code_;
+ const char* const host_package_label_;
+ const char* const package_name_;
+ const char* const package_version_code_;
+ const char* const package_version_name_;
+ const char* const android_build_fp_;
+ const char* const gms_version_code_;
+ const char* const installer_package_name_;
+ const char* const abi_name_;
+ const char* const firebase_app_id_;
+ const char* const custom_themes_;
+ const char* const resources_version_;
+ // Not needed by breakpad.
+ const int target_sdk_version_;
+ const bool is_debug_android_;
+ const bool is_tv_;
+ const char* const version_incremental_;
+ const char* const hardware_;
+ const bool is_at_least_t_;
+ const bool is_automotive_;
+};
+
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_BUILD_INFO_H_
diff --git a/chromium/base/android/bundle_utils.cc b/chromium/base/android/bundle_utils.cc
new file mode 100644
index 00000000000..800e97bcfd5
--- /dev/null
+++ b/chromium/base/android/bundle_utils.cc
@@ -0,0 +1,103 @@
+// Copyright 2019 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/bundle_utils.h"
+
+#include <android/dlext.h>
+#include <dlfcn.h>
+
+#include "base/android/jni_android.h"
+#include "base/android/jni_string.h"
+#include "base/base_jni_headers/BundleUtils_jni.h"
+#include "base/check.h"
+#include "base/files/file_path.h"
+#include "base/notreached.h"
+
+// These symbols are added by the lld linker when creating a partitioned shared
+// library. The symbols live in the base library, and are used to properly load
+// the other partitions (feature libraries) when needed.
+struct PartitionIndexEntry {
+ int32_t name_relptr;
+ int32_t addr_relptr;
+ uint32_t size;
+};
+static_assert(sizeof(PartitionIndexEntry) == 12U,
+ "Unexpected PartitionIndexEntry size");
+
+// Marked as weak_import because these symbols are lld-specific. The method that
+// uses them will only be invoked in builds that have lld-generated partitions.
+extern PartitionIndexEntry __part_index_begin[] __attribute__((weak_import));
+extern PartitionIndexEntry __part_index_end[] __attribute__((weak_import));
+
+namespace base {
+namespace android {
+
+namespace {
+
+const void* ReadRelPtr(const int32_t* relptr) {
+ return reinterpret_cast<const char*>(relptr) + *relptr;
+}
+
+} // namespace
+
+// static
+std::string BundleUtils::ResolveLibraryPath(const std::string& library_name,
+ const std::string& split_name) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jstring> java_path = Java_BundleUtils_getNativeLibraryPath(
+ env, ConvertUTF8ToJavaString(env, library_name),
+ ConvertUTF8ToJavaString(env, split_name));
+ // TODO(https://crbug.com/1019853): Remove this tolerance.
+ if (!java_path) {
+ return std::string();
+ }
+ return ConvertJavaStringToUTF8(env, java_path);
+}
+
+// static
+bool BundleUtils::IsBundle() {
+ return Java_BundleUtils_isBundleForNative(AttachCurrentThread());
+}
+
+// static
+void* BundleUtils::DlOpenModuleLibraryPartition(const std::string& library_name,
+ const std::string& partition,
+ const std::string& split_name) {
+ // TODO(https://crbug.com/1019853): Remove this tolerance.
+ std::string library_path = ResolveLibraryPath(library_name, split_name);
+ if (library_path.empty()) {
+ return nullptr;
+ }
+
+ // Linear search is required here because the partition descriptors are not
+ // ordered. If a large number of partitions come into existence, lld could be
+ // modified to sort the partitions.
+ DCHECK(__part_index_begin != nullptr);
+ DCHECK(__part_index_end != nullptr);
+ for (const PartitionIndexEntry* part = __part_index_begin;
+ part != __part_index_end; ++part) {
+ std::string name(
+ reinterpret_cast<const char*>(ReadRelPtr(&part->name_relptr)));
+ if (name == partition) {
+ android_dlextinfo info = {};
+ info.flags = ANDROID_DLEXT_RESERVED_ADDRESS;
+ info.reserved_addr = const_cast<void*>(ReadRelPtr(&part->addr_relptr));
+ info.reserved_size = part->size;
+
+#if __ANDROID_API__ >= 24
+ return android_dlopen_ext(library_path.c_str(), RTLD_LOCAL, &info);
+#else
+ // When targeting pre-N, such as for Cronet, android_dlopen_ext() might
+ // not be available on the system.
+ CHECK(0) << "android_dlopen_ext not available";
+#endif
+ }
+ }
+
+ NOTREACHED();
+ return nullptr;
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/bundle_utils.h b/chromium/base/android/bundle_utils.h
new file mode 100644
index 00000000000..f217454b41b
--- /dev/null
+++ b/chromium/base/android/bundle_utils.h
@@ -0,0 +1,44 @@
+// Copyright 2019 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_BUNDLE_UTILS_H_
+#define BASE_ANDROID_BUNDLE_UTILS_H_
+
+#include <string>
+
+#include "base/base_export.h"
+
+namespace base {
+namespace android {
+
+// Utils to help working with android app bundles.
+class BASE_EXPORT BundleUtils {
+ public:
+ // Returns true if the current build is a bundle.
+ static bool IsBundle();
+
+ // Helper function asking Java to resolve a library path. This is required for
+ // resolving a module library made available via SplitCompat, rather than in
+ // its eventual fully-installed state.
+ static std::string ResolveLibraryPath(const std::string& library_name,
+ const std::string& split_name);
+
+ // dlopen wrapper that works for partitioned native libraries in dynamic
+ // feature modules. This routine looks up the partition's address space in a
+ // table of main library symbols, and uses it when loading the feature
+ // library. It requires |library_name| (eg. chrome_foo) to resolve the file
+ // path (which may be in an interesting location due to SplitCompat) and
+ // |partition_name| to look up the load parameters in the main library. These
+ // two values may be identical, but since the partition name is set at compile
+ // time, and the code is linked into multiple libraries (eg. Chrome vs
+ // Monochrome), they may not be.
+ static void* DlOpenModuleLibraryPartition(const std::string& library_name,
+ const std::string& partition,
+ const std::string& split_name);
+};
+
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_BUNDLE_UTILS_H_
diff --git a/chromium/base/android/callback_android.cc b/chromium/base/android/callback_android.cc
new file mode 100644
index 00000000000..d3f6da54522
--- /dev/null
+++ b/chromium/base/android/callback_android.cc
@@ -0,0 +1,58 @@
+// Copyright 2016 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/callback_android.h"
+
+#include "base/android/jni_array.h"
+#include "base/android/jni_string.h"
+#include "base/android/scoped_java_ref.h"
+#include "base/base_jni_headers/Callback_jni.h"
+#include "base/time/time.h"
+
+namespace base {
+namespace android {
+
+void RunObjectCallbackAndroid(const JavaRef<jobject>& callback,
+ const JavaRef<jobject>& arg) {
+ Java_Helper_onObjectResultFromNative(AttachCurrentThread(), callback, arg);
+}
+
+void RunBooleanCallbackAndroid(const JavaRef<jobject>& callback, bool arg) {
+ Java_Helper_onBooleanResultFromNative(AttachCurrentThread(), callback,
+ static_cast<jboolean>(arg));
+}
+
+void RunIntCallbackAndroid(const JavaRef<jobject>& callback, int32_t arg) {
+ Java_Helper_onIntResultFromNative(AttachCurrentThread(), callback, arg);
+}
+
+void RunLongCallbackAndroid(const JavaRef<jobject>& callback, int64_t arg) {
+ Java_Helper_onLongResultFromNative(AttachCurrentThread(), callback, arg);
+}
+
+void RunTimeCallbackAndroid(const JavaRef<jobject>& callback, base::Time time) {
+ Java_Helper_onTimeResultFromNative(AttachCurrentThread(), callback,
+ time.ToJavaTime());
+}
+
+void RunStringCallbackAndroid(const JavaRef<jobject>& callback,
+ const std::string& arg) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jstring> java_string = ConvertUTF8ToJavaString(env, arg);
+ Java_Helper_onObjectResultFromNative(env, callback, java_string);
+}
+
+void RunByteArrayCallbackAndroid(const JavaRef<jobject>& callback,
+ const std::vector<uint8_t>& arg) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jbyteArray> j_bytes = ToJavaByteArray(env, arg);
+ Java_Helper_onObjectResultFromNative(env, callback, j_bytes);
+}
+
+void RunRunnableAndroid(const JavaRef<jobject>& runnable) {
+ Java_Helper_runRunnable(AttachCurrentThread(), runnable);
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/callback_android.h b/chromium/base/android/callback_android.h
new file mode 100644
index 00000000000..fa2420c816f
--- /dev/null
+++ b/chromium/base/android/callback_android.h
@@ -0,0 +1,47 @@
+// Copyright 2016 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_CALLBACK_ANDROID_H_
+#define BASE_ANDROID_CALLBACK_ANDROID_H_
+
+#include <jni.h>
+#include <string>
+#include <vector>
+
+#include "base/android/scoped_java_ref.h"
+#include "base/base_export.h"
+#include "base/time/time.h"
+
+// Provides helper utility methods that run the given callback with the
+// specified argument.
+namespace base {
+namespace android {
+
+void BASE_EXPORT RunObjectCallbackAndroid(const JavaRef<jobject>& callback,
+ const JavaRef<jobject>& arg);
+
+void BASE_EXPORT RunBooleanCallbackAndroid(const JavaRef<jobject>& callback,
+ bool arg);
+
+void BASE_EXPORT RunIntCallbackAndroid(const JavaRef<jobject>& callback,
+ int32_t arg);
+
+void BASE_EXPORT RunLongCallbackAndroid(const JavaRef<jobject>& callback,
+ int64_t arg);
+
+void BASE_EXPORT RunTimeCallbackAndroid(const JavaRef<jobject>& callback,
+ base::Time time);
+
+void BASE_EXPORT RunStringCallbackAndroid(const JavaRef<jobject>& callback,
+ const std::string& arg);
+
+void BASE_EXPORT RunByteArrayCallbackAndroid(const JavaRef<jobject>& callback,
+ const std::vector<uint8_t>& arg);
+
+void BASE_EXPORT RunRunnableAndroid(const JavaRef<jobject>& runnable);
+
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_CALLBACK_ANDROID_H_
diff --git a/chromium/base/android/child_process_binding_types.h b/chromium/base/android/child_process_binding_types.h
new file mode 100644
index 00000000000..9d45897b91a
--- /dev/null
+++ b/chromium/base/android/child_process_binding_types.h
@@ -0,0 +1,26 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_CHILD_PROCESS_BINDING_TYPES_H_
+#define BASE_ANDROID_CHILD_PROCESS_BINDING_TYPES_H_
+
+namespace base {
+namespace android {
+
+// Defines the state of bindgings with child process. See ChildProcessConnection
+// to see what the bindings are.
+// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.base
+enum class ChildBindingState {
+ UNBOUND,
+ WAIVED,
+ NOT_PERCEPTIBLE,
+ VISIBLE,
+ STRONG,
+ MAX_VALUE = STRONG
+};
+
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_CHILD_PROCESS_BINDING_TYPES_H_
diff --git a/chromium/base/android/child_process_service.cc b/chromium/base/android/child_process_service.cc
new file mode 100644
index 00000000000..5b853c8e089
--- /dev/null
+++ b/chromium/base/android/child_process_service.cc
@@ -0,0 +1,83 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/jni_array.h"
+#include "base/android/jni_string.h"
+#include "base/android/library_loader/library_loader_hooks.h"
+#include "base/base_jni_headers/ChildProcessService_jni.h"
+#include "base/debug/dump_without_crashing.h"
+#include "base/file_descriptor_store.h"
+#include "base/logging.h"
+#include "base/posix/global_descriptors.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+
+using base::android::JavaIntArrayToIntVector;
+using base::android::JavaParamRef;
+
+namespace base {
+namespace android {
+
+void JNI_ChildProcessService_RegisterFileDescriptors(
+ JNIEnv* env,
+ const JavaParamRef<jobjectArray>& j_keys,
+ const JavaParamRef<jintArray>& j_ids,
+ const JavaParamRef<jintArray>& j_fds,
+ const JavaParamRef<jlongArray>& j_offsets,
+ const JavaParamRef<jlongArray>& j_sizes) {
+ std::vector<absl::optional<std::string>> keys;
+ JavaObjectArrayReader<jstring> keys_array(j_keys);
+ keys.reserve(checked_cast<size_t>(keys_array.size()));
+ for (auto str : keys_array) {
+ absl::optional<std::string> key;
+ if (str) {
+ key = base::android::ConvertJavaStringToUTF8(env, str);
+ }
+ keys.push_back(std::move(key));
+ }
+
+ std::vector<int> ids;
+ base::android::JavaIntArrayToIntVector(env, j_ids, &ids);
+ std::vector<int> fds;
+ base::android::JavaIntArrayToIntVector(env, j_fds, &fds);
+ std::vector<int64_t> offsets;
+ base::android::JavaLongArrayToInt64Vector(env, j_offsets, &offsets);
+ std::vector<int64_t> sizes;
+ base::android::JavaLongArrayToInt64Vector(env, j_sizes, &sizes);
+
+ DCHECK_EQ(keys.size(), ids.size());
+ DCHECK_EQ(ids.size(), fds.size());
+ DCHECK_EQ(fds.size(), offsets.size());
+ DCHECK_EQ(offsets.size(), sizes.size());
+
+ for (size_t i = 0; i < ids.size(); i++) {
+ base::MemoryMappedFile::Region region = {offsets.at(i),
+ static_cast<size_t>(sizes.at(i))};
+ const absl::optional<std::string>& key = keys.at(i);
+ const auto id = static_cast<GlobalDescriptors::Key>(ids.at(i));
+ int fd = fds.at(i);
+ if (key) {
+ base::FileDescriptorStore::GetInstance().Set(*key, base::ScopedFD(fd),
+ region);
+ } else {
+ base::GlobalDescriptors::GetInstance()->Set(id, fd, region);
+ }
+ }
+}
+
+void JNI_ChildProcessService_ExitChildProcess(JNIEnv* env) {
+ VLOG(0) << "ChildProcessService: Exiting child process.";
+ base::android::LibraryLoaderExitHook();
+ _exit(0);
+}
+
+// Make sure this isn't inlined so it shows up in stack traces.
+// the function body unique by adding a log line, so it doesn't get merged
+// with other functions by link time optimizations (ICF).
+NOINLINE void JNI_ChildProcessService_DumpProcessStack(JNIEnv* env) {
+ LOG(ERROR) << "Dumping as requested.";
+ base::debug::DumpWithoutCrashing();
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/child_process_unittest.cc b/chromium/base/android/child_process_unittest.cc
new file mode 100644
index 00000000000..46fc5297983
--- /dev/null
+++ b/chromium/base/android/child_process_unittest.cc
@@ -0,0 +1,42 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/jni_android.h"
+#include "base/run_loop.h"
+#include "base/test/multiprocess_test.h"
+#include "base/test/test_timeouts.h"
+#include "testing/multiprocess_func_list.h"
+
+namespace base {
+namespace android {
+
+MULTIPROCESS_TEST_MAIN(BasicMain) {
+ return 0;
+}
+
+MULTIPROCESS_TEST_MAIN(WaitingMain) {
+ base::RunLoop().Run();
+ return 0;
+}
+
+class ChildProcessTest : public MultiProcessTest {};
+
+// Test disabled due to flakiness: https://crbug.com/950772.
+TEST_F(ChildProcessTest, DISABLED_ChildHasCleanExit) {
+ Process process = SpawnChild("BasicMain");
+ int exit_code = 0;
+ EXPECT_TRUE(WaitForMultiprocessTestChildExit(
+ process, TestTimeouts::action_timeout(), &exit_code));
+ EXPECT_EQ(exit_code, 0);
+ EXPECT_TRUE(MultiProcessTestChildHasCleanExit(process));
+}
+
+TEST_F(ChildProcessTest, ChildTerminated) {
+ Process process = SpawnChild("WaitingMain");
+ EXPECT_TRUE(TerminateMultiProcessTestChild(process, 0, true));
+ EXPECT_FALSE(MultiProcessTestChildHasCleanExit(process));
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/command_line_android.cc b/chromium/base/android/command_line_android.cc
new file mode 100644
index 00000000000..75783d3bced
--- /dev/null
+++ b/chromium/base/android/command_line_android.cc
@@ -0,0 +1,100 @@
+// Copyright 2013 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/jni_array.h"
+#include "base/android/jni_string.h"
+#include "base/base_jni_headers/CommandLine_jni.h"
+#include "base/command_line.h"
+
+using base::android::ConvertUTF8ToJavaString;
+using base::android::ConvertJavaStringToUTF8;
+using base::android::JavaParamRef;
+using base::android::ScopedJavaLocalRef;
+using base::CommandLine;
+
+namespace {
+
+void JNI_CommandLine_AppendJavaStringArrayToCommandLine(
+ JNIEnv* env,
+ const JavaParamRef<jobjectArray>& array,
+ bool includes_program) {
+ std::vector<std::string> vec;
+ if (array)
+ base::android::AppendJavaStringArrayToStringVector(env, array, &vec);
+ if (!includes_program)
+ vec.insert(vec.begin(), std::string());
+ CommandLine extra_command_line(vec);
+ CommandLine::ForCurrentProcess()->AppendArguments(extra_command_line,
+ includes_program);
+}
+
+} // namespace
+
+static jboolean JNI_CommandLine_HasSwitch(
+ JNIEnv* env,
+ const JavaParamRef<jstring>& jswitch) {
+ std::string switch_string(ConvertJavaStringToUTF8(env, jswitch));
+ return CommandLine::ForCurrentProcess()->HasSwitch(switch_string);
+}
+
+static ScopedJavaLocalRef<jstring> JNI_CommandLine_GetSwitchValue(
+ JNIEnv* env,
+ const JavaParamRef<jstring>& jswitch) {
+ std::string switch_string(ConvertJavaStringToUTF8(env, jswitch));
+ std::string value(CommandLine::ForCurrentProcess()->GetSwitchValueNative(
+ switch_string));
+ if (value.empty())
+ return ScopedJavaLocalRef<jstring>();
+ return ConvertUTF8ToJavaString(env, value);
+}
+
+static ScopedJavaLocalRef<jobjectArray> JNI_CommandLine_GetSwitchesFlattened(
+ JNIEnv* env) {
+ // JNI doesn't support returning Maps. Instead, express this map as a 1
+ // dimensional array: [ key1, value1, key2, value2, ... ]
+ std::vector<std::string> keys_and_values;
+ for (const auto& entry : CommandLine::ForCurrentProcess()->GetSwitches()) {
+ keys_and_values.push_back(entry.first);
+ keys_and_values.push_back(entry.second);
+ }
+ return base::android::ToJavaArrayOfStrings(env, keys_and_values);
+}
+
+static void JNI_CommandLine_AppendSwitch(JNIEnv* env,
+ const JavaParamRef<jstring>& jswitch) {
+ std::string switch_string(ConvertJavaStringToUTF8(env, jswitch));
+ CommandLine::ForCurrentProcess()->AppendSwitch(switch_string);
+}
+
+static void JNI_CommandLine_AppendSwitchWithValue(
+ JNIEnv* env,
+ const JavaParamRef<jstring>& jswitch,
+ const JavaParamRef<jstring>& jvalue) {
+ std::string switch_string(ConvertJavaStringToUTF8(env, jswitch));
+ std::string value_string(ConvertJavaStringToUTF8(env, jvalue));
+ CommandLine::ForCurrentProcess()->AppendSwitchASCII(switch_string,
+ value_string);
+}
+
+static void JNI_CommandLine_AppendSwitchesAndArguments(
+ JNIEnv* env,
+ const JavaParamRef<jobjectArray>& array) {
+ JNI_CommandLine_AppendJavaStringArrayToCommandLine(env, array, false);
+}
+
+static void JNI_CommandLine_RemoveSwitch(JNIEnv* env,
+ const JavaParamRef<jstring>& jswitch) {
+ std::string switch_string(ConvertJavaStringToUTF8(env, jswitch));
+ CommandLine::ForCurrentProcess()->RemoveSwitch(switch_string);
+}
+
+static void JNI_CommandLine_Init(
+ JNIEnv* env,
+ const JavaParamRef<jobjectArray>& init_command_line) {
+ // TODO(port): Make an overload of Init() that takes StringVector rather than
+ // have to round-trip via AppendArguments.
+ CommandLine::Init(0, nullptr);
+ JNI_CommandLine_AppendJavaStringArrayToCommandLine(env, init_command_line,
+ true);
+}
diff --git a/chromium/base/android/content_uri_utils.cc b/chromium/base/android/content_uri_utils.cc
new file mode 100644
index 00000000000..c3fb589ebb8
--- /dev/null
+++ b/chromium/base/android/content_uri_utils.cc
@@ -0,0 +1,86 @@
+// Copyright 2013 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/content_uri_utils.h"
+
+#include "base/android/jni_android.h"
+#include "base/android/jni_string.h"
+#include "base/base_jni_headers/ContentUriUtils_jni.h"
+
+using base::android::ConvertUTF8ToJavaString;
+using base::android::ScopedJavaLocalRef;
+
+namespace base {
+
+bool ContentUriExists(const FilePath& content_uri) {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ ScopedJavaLocalRef<jstring> j_uri =
+ ConvertUTF8ToJavaString(env, content_uri.value());
+ return Java_ContentUriUtils_contentUriExists(env, j_uri);
+}
+
+File OpenContentUriForRead(const FilePath& content_uri) {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ ScopedJavaLocalRef<jstring> j_uri =
+ ConvertUTF8ToJavaString(env, content_uri.value());
+ jint fd = Java_ContentUriUtils_openContentUriForRead(env, j_uri);
+ if (fd < 0)
+ return File();
+ return File(fd);
+}
+
+std::string GetContentUriMimeType(const FilePath& content_uri) {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ ScopedJavaLocalRef<jstring> j_uri =
+ ConvertUTF8ToJavaString(env, content_uri.value());
+ ScopedJavaLocalRef<jstring> j_mime =
+ Java_ContentUriUtils_getMimeType(env, j_uri);
+ if (j_mime.is_null())
+ return std::string();
+
+ return base::android::ConvertJavaStringToUTF8(env, j_mime.obj());
+}
+
+bool MaybeGetFileDisplayName(const FilePath& content_uri,
+ std::u16string* file_display_name) {
+ if (!content_uri.IsContentUri())
+ return false;
+
+ DCHECK(file_display_name);
+
+ JNIEnv* env = base::android::AttachCurrentThread();
+ ScopedJavaLocalRef<jstring> j_uri =
+ ConvertUTF8ToJavaString(env, content_uri.value());
+ ScopedJavaLocalRef<jstring> j_display_name =
+ Java_ContentUriUtils_maybeGetDisplayName(env, j_uri);
+
+ if (j_display_name.is_null())
+ return false;
+
+ *file_display_name = base::android::ConvertJavaStringToUTF16(j_display_name);
+ return true;
+}
+
+bool DeleteContentUri(const FilePath& content_uri) {
+ DCHECK(content_uri.IsContentUri());
+ JNIEnv* env = base::android::AttachCurrentThread();
+ ScopedJavaLocalRef<jstring> j_uri =
+ ConvertUTF8ToJavaString(env, content_uri.value());
+
+ return Java_ContentUriUtils_delete(env, j_uri);
+}
+
+FilePath GetContentUriFromFilePath(const FilePath& file_path) {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ ScopedJavaLocalRef<jstring> j_file_path =
+ ConvertUTF8ToJavaString(env, file_path.value());
+ ScopedJavaLocalRef<jstring> j_content_uri =
+ Java_ContentUriUtils_getContentUriFromFilePath(env, j_file_path);
+ if (j_content_uri.is_null())
+ return FilePath();
+
+ return FilePath(base::android::ConvertJavaStringToUTF8(env, j_content_uri));
+}
+
+} // namespace base
diff --git a/chromium/base/android/content_uri_utils.h b/chromium/base/android/content_uri_utils.h
new file mode 100644
index 00000000000..33665f6cf70
--- /dev/null
+++ b/chromium/base/android/content_uri_utils.h
@@ -0,0 +1,41 @@
+// Copyright 2013 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_CONTENT_URI_UTILS_H_
+#define BASE_ANDROID_CONTENT_URI_UTILS_H_
+
+#include <jni.h>
+#include <string>
+
+#include "base/base_export.h"
+#include "base/files/file.h"
+#include "base/files/file_path.h"
+
+namespace base {
+
+// Opens a content URI for read and returns the file descriptor to the caller.
+// Returns -1 if the URI is invalid.
+BASE_EXPORT File OpenContentUriForRead(const FilePath& content_uri);
+
+// Check whether a content URI exists.
+BASE_EXPORT bool ContentUriExists(const FilePath& content_uri);
+
+// Gets MIME type from a content URI. Returns an empty string if the URI is
+// invalid.
+BASE_EXPORT std::string GetContentUriMimeType(const FilePath& content_uri);
+
+// Gets the display name from a content URI. Returns true if the name was found.
+BASE_EXPORT bool MaybeGetFileDisplayName(const FilePath& content_uri,
+ std::u16string* file_display_name);
+
+// Deletes a content URI.
+BASE_EXPORT bool DeleteContentUri(const FilePath& content_uri);
+
+// Gets content URI's file path (eg: "content://org.chromium...") from normal
+// file path (eg: "/data/user/0/...").
+BASE_EXPORT FilePath GetContentUriFromFilePath(const FilePath& file_path);
+
+} // namespace base
+
+#endif // BASE_ANDROID_CONTENT_URI_UTILS_H_
diff --git a/chromium/base/android/content_uri_utils_unittest.cc b/chromium/base/android/content_uri_utils_unittest.cc
new file mode 100644
index 00000000000..3d5c1ac23a7
--- /dev/null
+++ b/chromium/base/android/content_uri_utils_unittest.cc
@@ -0,0 +1,38 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/content_uri_utils.h"
+#include "base/files/file_util.h"
+#include "base/path_service.h"
+#include "base/test/test_file_util.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace base {
+namespace android {
+
+// Disable test on Android due to flakiness: crbug.com/807080, crbug/1054637.
+TEST(ContentUriUtilsTest, DISABLED_ContentUriMimeTest) {
+ // Get the test image path.
+ FilePath data_dir;
+ ASSERT_TRUE(PathService::Get(DIR_TEST_DATA, &data_dir));
+ data_dir = data_dir.AppendASCII("file_util");
+ ASSERT_TRUE(PathExists(data_dir));
+ FilePath image_file = data_dir.Append(FILE_PATH_LITERAL("red.png"));
+
+ // Insert the image into MediaStore. MediaStore will do some conversions, and
+ // return the content URI.
+ FilePath path = base::InsertImageIntoMediaStore(image_file);
+ EXPECT_TRUE(path.IsContentUri());
+ EXPECT_TRUE(PathExists(path));
+
+ std::string mime = GetContentUriMimeType(path);
+ EXPECT_EQ(mime, std::string("image/png"));
+
+ FilePath invalid_path("content://foo.bar");
+ mime = GetContentUriMimeType(invalid_path);
+ EXPECT_TRUE(mime.empty());
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/cpu_features.cc b/chromium/base/android/cpu_features.cc
new file mode 100644
index 00000000000..a29ed6eb472
--- /dev/null
+++ b/chromium/base/android/cpu_features.cc
@@ -0,0 +1,22 @@
+// Copyright 2012 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <cpu-features.h>
+
+#include "base/android/jni_android.h"
+#include "base/base_jni_headers/CpuFeatures_jni.h"
+
+namespace base {
+namespace android {
+
+jint JNI_CpuFeatures_GetCoreCount(JNIEnv*) {
+ return android_getCpuCount();
+}
+
+jlong JNI_CpuFeatures_GetCpuFeatures(JNIEnv*) {
+ return static_cast<jlong>(android_getCpuFeatures());
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/early_trace_event_binding.cc b/chromium/base/android/early_trace_event_binding.cc
new file mode 100644
index 00000000000..83ef516b7ae
--- /dev/null
+++ b/chromium/base/android/early_trace_event_binding.cc
@@ -0,0 +1,138 @@
+// Copyright 2016 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/early_trace_event_binding.h"
+
+#include <stdint.h>
+
+#include "base/android/jni_string.h"
+#include "base/android/trace_event_binding.h"
+#include "base/base_jni_headers/EarlyTraceEvent_jni.h"
+#include "base/time/time.h"
+#include "base/trace_event/base_tracing.h"
+#include "base/tracing_buildflags.h"
+
+namespace base {
+namespace android {
+
+static void JNI_EarlyTraceEvent_RecordEarlyBeginEvent(
+ JNIEnv* env,
+ const JavaParamRef<jstring>& jname,
+ jlong time_ns,
+ jint thread_id,
+ jlong thread_time_ms) {
+#if BUILDFLAG(ENABLE_BASE_TRACING)
+ std::string name = ConvertJavaStringToUTF8(env, jname);
+
+ static const unsigned char* category_group_enabled =
+ TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED(internal::kJavaTraceCategory);
+ trace_event_internal::AddTraceEventWithThreadIdAndTimestamps(
+ TRACE_EVENT_PHASE_BEGIN, category_group_enabled, name.c_str(),
+ /*scope=*/nullptr, trace_event_internal::kNoId, thread_id,
+ TimeTicks::FromJavaNanoTime(time_ns),
+ ThreadTicks() + Milliseconds(thread_time_ms),
+ TRACE_EVENT_FLAG_JAVA_STRING_LITERALS | TRACE_EVENT_FLAG_COPY);
+#endif // BUILDFLAG(ENABLE_BASE_TRACING)
+}
+
+static void JNI_EarlyTraceEvent_RecordEarlyEndEvent(
+ JNIEnv* env,
+ const JavaParamRef<jstring>& jname,
+ jlong time_ns,
+ jint thread_id,
+ jlong thread_time_ms) {
+#if BUILDFLAG(ENABLE_BASE_TRACING)
+ std::string name = ConvertJavaStringToUTF8(env, jname);
+
+ static const unsigned char* category_group_enabled =
+ TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED(internal::kJavaTraceCategory);
+ trace_event_internal::AddTraceEventWithThreadIdAndTimestamps(
+ TRACE_EVENT_PHASE_END, category_group_enabled, name.c_str(),
+ /*scope=*/nullptr, trace_event_internal::kNoId, thread_id,
+ TimeTicks::FromJavaNanoTime(time_ns),
+ ThreadTicks() + Milliseconds(thread_time_ms),
+ TRACE_EVENT_FLAG_JAVA_STRING_LITERALS | TRACE_EVENT_FLAG_COPY);
+#endif // BUILDFLAG(ENABLE_BASE_TRACING)
+}
+
+static void JNI_EarlyTraceEvent_RecordEarlyToplevelBeginEvent(
+ JNIEnv* env,
+ const JavaParamRef<jstring>& jname,
+ jlong time_ns,
+ jint thread_id,
+ jlong thread_time_ms) {
+#if BUILDFLAG(ENABLE_BASE_TRACING)
+ std::string name = ConvertJavaStringToUTF8(env, jname);
+
+ static const unsigned char* category_group_enabled =
+ TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED(
+ internal::kToplevelTraceCategory);
+ trace_event_internal::AddTraceEventWithThreadIdAndTimestamps(
+ TRACE_EVENT_PHASE_BEGIN, category_group_enabled, name.c_str(),
+ /*scope=*/nullptr, trace_event_internal::kNoId, thread_id,
+ TimeTicks::FromJavaNanoTime(time_ns),
+ ThreadTicks() + Milliseconds(thread_time_ms),
+ TRACE_EVENT_FLAG_JAVA_STRING_LITERALS | TRACE_EVENT_FLAG_COPY);
+#endif // BUILDFLAG(ENABLE_BASE_TRACING)
+}
+
+static void JNI_EarlyTraceEvent_RecordEarlyToplevelEndEvent(
+ JNIEnv* env,
+ const JavaParamRef<jstring>& jname,
+ jlong time_ns,
+ jint thread_id,
+ jlong thread_time_ms) {
+#if BUILDFLAG(ENABLE_BASE_TRACING)
+ std::string name = ConvertJavaStringToUTF8(env, jname);
+
+ static const unsigned char* category_group_enabled =
+ TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED(
+ internal::kToplevelTraceCategory);
+ trace_event_internal::AddTraceEventWithThreadIdAndTimestamps(
+ TRACE_EVENT_PHASE_END, category_group_enabled, name.c_str(),
+ /*scope=*/nullptr, trace_event_internal::kNoId, thread_id,
+ TimeTicks::FromJavaNanoTime(time_ns),
+ ThreadTicks() + Milliseconds(thread_time_ms),
+ TRACE_EVENT_FLAG_JAVA_STRING_LITERALS | TRACE_EVENT_FLAG_COPY);
+#endif // BUILDFLAG(ENABLE_BASE_TRACING)
+}
+
+static void JNI_EarlyTraceEvent_RecordEarlyAsyncBeginEvent(
+ JNIEnv* env,
+ const JavaParamRef<jstring>& jname,
+ jlong id,
+ jlong time_ns) {
+ std::string name = ConvertJavaStringToUTF8(env, jname);
+ TRACE_EVENT_BEGIN(internal::kJavaTraceCategory, nullptr,
+ perfetto::Track(static_cast<uint64_t>(id)),
+ TimeTicks::FromJavaNanoTime(time_ns),
+ [&](::perfetto::EventContext& ctx) {
+ ctx.event()->set_name(name.c_str());
+ });
+}
+
+static void JNI_EarlyTraceEvent_RecordEarlyAsyncEndEvent(
+ JNIEnv* env,
+ const JavaParamRef<jstring>& jname,
+ jlong id,
+ jlong time_ns) {
+ std::string name = ConvertJavaStringToUTF8(env, jname);
+ TRACE_EVENT_END(internal::kJavaTraceCategory,
+ perfetto::Track(static_cast<uint64_t>(id)));
+}
+
+bool GetBackgroundStartupTracingFlag() {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ return base::android::Java_EarlyTraceEvent_getBackgroundStartupTracingFlag(
+ env);
+}
+
+void SetBackgroundStartupTracingFlag(bool enabled) {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ base::android::Java_EarlyTraceEvent_setBackgroundStartupTracingFlag(env,
+ enabled);
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/early_trace_event_binding.h b/chromium/base/android/early_trace_event_binding.h
new file mode 100644
index 00000000000..f1e600e1409
--- /dev/null
+++ b/chromium/base/android/early_trace_event_binding.h
@@ -0,0 +1,24 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_EARLY_TRACE_EVENT_BINDING_H_
+#define BASE_ANDROID_EARLY_TRACE_EVENT_BINDING_H_
+
+#include "base/base_export.h"
+
+namespace base {
+namespace android {
+
+// Returns true if background startup tracing flag was set on the previous
+// startup.
+BASE_EXPORT bool GetBackgroundStartupTracingFlag();
+
+// Sets a flag to chrome application preferences to enable startup tracing next
+// time the app is started.
+BASE_EXPORT void SetBackgroundStartupTracingFlag(bool enabled);
+
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_EARLY_TRACE_EVENT_BINDING_H_
diff --git a/chromium/base/android/event_log.cc b/chromium/base/android/event_log.cc
new file mode 100644
index 00000000000..7f99d66b131
--- /dev/null
+++ b/chromium/base/android/event_log.cc
@@ -0,0 +1,16 @@
+// Copyright 2013 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/event_log.h"
+#include "base/base_jni_headers/EventLog_jni.h"
+
+namespace base {
+namespace android {
+
+void EventLogWriteInt(int tag, int value) {
+ Java_EventLog_writeEvent(AttachCurrentThread(), tag, value);
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/event_log.h b/chromium/base/android/event_log.h
new file mode 100644
index 00000000000..9131f55edf4
--- /dev/null
+++ b/chromium/base/android/event_log.h
@@ -0,0 +1,20 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_EVENT_LOG_H_
+#define BASE_ANDROID_EVENT_LOG_H_
+
+#include <jni.h>
+
+#include "base/base_export.h"
+
+namespace base {
+namespace android {
+
+void BASE_EXPORT EventLogWriteInt(int tag, int value);
+
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_EVENT_LOG_H_
diff --git a/chromium/base/android/feature_list_jni.cc b/chromium/base/android/feature_list_jni.cc
new file mode 100644
index 00000000000..bb10d3cd412
--- /dev/null
+++ b/chromium/base/android/feature_list_jni.cc
@@ -0,0 +1,16 @@
+// Copyright 2020 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/base_jni_headers/FeatureList_jni.h"
+#include "base/feature_list.h"
+
+namespace base {
+namespace android {
+
+static jboolean JNI_FeatureList_IsInitialized(JNIEnv* env) {
+ return !!base::FeatureList::GetInstance();
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/features_jni.cc b/chromium/base/android/features_jni.cc
new file mode 100644
index 00000000000..0128651b8dc
--- /dev/null
+++ b/chromium/base/android/features_jni.cc
@@ -0,0 +1,31 @@
+// Copyright 2021 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/base_jni_headers/Features_jni.h"
+#include "base/android/jni_string.h"
+#include "base/feature_list.h"
+#include "base/metrics/field_trial_params.h"
+
+namespace base {
+namespace android {
+
+jboolean JNI_Features_IsEnabled(JNIEnv* env, jlong native_feature_pointer) {
+ return base::FeatureList::IsEnabled(
+ *reinterpret_cast<base::Feature*>(native_feature_pointer));
+}
+
+jboolean JNI_Features_GetFieldTrialParamByFeatureAsBoolean(
+ JNIEnv* env,
+ jlong native_feature_pointer,
+ const JavaParamRef<jstring>& jparam_name,
+ const jboolean jdefault_value) {
+ const base::Feature& feature =
+ *reinterpret_cast<base::Feature*>(native_feature_pointer);
+ const std::string& param_name = ConvertJavaStringToUTF8(env, jparam_name);
+ return base::GetFieldTrialParamByFeatureAsBool(feature, param_name,
+ jdefault_value);
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/field_trial_list.cc b/chromium/base/android/field_trial_list.cc
new file mode 100644
index 00000000000..64b1763529b
--- /dev/null
+++ b/chromium/base/android/field_trial_list.cc
@@ -0,0 +1,101 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <jni.h>
+
+#include <map>
+#include <string>
+
+#include "base/android/jni_string.h"
+#include "base/base_jni_headers/FieldTrialList_jni.h"
+#include "base/lazy_instance.h"
+#include "base/metrics/field_trial.h"
+#include "base/metrics/field_trial_params.h"
+
+using base::android::ConvertJavaStringToUTF8;
+using base::android::ConvertUTF8ToJavaString;
+using base::android::JavaParamRef;
+using base::android::ScopedJavaLocalRef;
+
+namespace {
+
+// Log trials and their groups on activation, for debugging purposes.
+class TrialLogger : public base::FieldTrialList::Observer {
+ public:
+ TrialLogger() {}
+
+ TrialLogger(const TrialLogger&) = delete;
+ TrialLogger& operator=(const TrialLogger&) = delete;
+
+ void OnFieldTrialGroupFinalized(const std::string& trial_name,
+ const std::string& group_name) override {
+ Log(trial_name, group_name);
+ }
+
+ static void Log(const std::string& trial_name,
+ const std::string& group_name) {
+ // Changes to format of the log message below must be accompanied by
+ // changes to finch smoke tests since they look for this log message
+ // in the logcat.
+ LOG(INFO) << "Active field trial \"" << trial_name
+ << "\" in group \"" << group_name<< '"';
+ }
+
+ protected:
+ ~TrialLogger() override {}
+};
+
+base::LazyInstance<TrialLogger>::Leaky g_trial_logger =
+ LAZY_INSTANCE_INITIALIZER;
+
+} // namespace
+
+static ScopedJavaLocalRef<jstring> JNI_FieldTrialList_FindFullName(
+ JNIEnv* env,
+ const JavaParamRef<jstring>& jtrial_name) {
+ std::string trial_name(ConvertJavaStringToUTF8(env, jtrial_name));
+ return ConvertUTF8ToJavaString(
+ env, base::FieldTrialList::FindFullName(trial_name));
+}
+
+static jboolean JNI_FieldTrialList_TrialExists(
+ JNIEnv* env,
+ const JavaParamRef<jstring>& jtrial_name) {
+ std::string trial_name(ConvertJavaStringToUTF8(env, jtrial_name));
+ return base::FieldTrialList::TrialExists(trial_name);
+}
+
+static ScopedJavaLocalRef<jstring> JNI_FieldTrialList_GetVariationParameter(
+ JNIEnv* env,
+ const JavaParamRef<jstring>& jtrial_name,
+ const JavaParamRef<jstring>& jparameter_key) {
+ std::map<std::string, std::string> parameters;
+ base::GetFieldTrialParams(ConvertJavaStringToUTF8(env, jtrial_name),
+ &parameters);
+ return ConvertUTF8ToJavaString(
+ env, parameters[ConvertJavaStringToUTF8(env, jparameter_key)]);
+}
+
+static void JNI_FieldTrialList_LogActiveTrials(JNIEnv* env) {
+ DCHECK(!g_trial_logger.IsCreated()); // This need only be called once.
+
+ LOG(INFO) << "Logging active field trials...";
+ base::FieldTrialList::AddObserver(&g_trial_logger.Get());
+
+ // Log any trials that were already active before adding the observer.
+ std::vector<base::FieldTrial::ActiveGroup> active_groups;
+ base::FieldTrialList::GetActiveFieldTrialGroups(&active_groups);
+ for (const base::FieldTrial::ActiveGroup& group : active_groups) {
+ TrialLogger::Log(group.trial_name, group.group_name);
+ }
+}
+
+static jboolean JNI_FieldTrialList_CreateFieldTrial(
+ JNIEnv* env,
+ const JavaParamRef<jstring>& jtrial_name,
+ const JavaParamRef<jstring>& jgroup_name) {
+ return base::FieldTrialList::CreateFieldTrial(
+ ConvertJavaStringToUTF8(env, jtrial_name),
+ ConvertJavaStringToUTF8(env, jgroup_name)) != nullptr;
+}
diff --git a/chromium/base/android/important_file_writer_android.cc b/chromium/base/android/important_file_writer_android.cc
new file mode 100644
index 00000000000..4ccc0885a08
--- /dev/null
+++ b/chromium/base/android/important_file_writer_android.cc
@@ -0,0 +1,37 @@
+// Copyright 2013 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <string>
+
+#include "base/android/jni_array.h"
+#include "base/android/jni_string.h"
+#include "base/base_jni_headers/ImportantFileWriterAndroid_jni.h"
+#include "base/files/important_file_writer.h"
+#include "base/threading/thread_restrictions.h"
+
+namespace base {
+namespace android {
+
+class ScopedAllowBlockingForImportantFileWriter
+ : public base::ScopedAllowBlocking {};
+
+static jboolean JNI_ImportantFileWriterAndroid_WriteFileAtomically(
+ JNIEnv* env,
+ const JavaParamRef<jstring>& file_name,
+ const JavaParamRef<jbyteArray>& data) {
+ // This is called on the UI thread during shutdown to save tab data, so
+ // needs to enable IO.
+ ScopedAllowBlockingForImportantFileWriter allow_blocking;
+ std::string native_file_name;
+ base::android::ConvertJavaStringToUTF8(env, file_name, &native_file_name);
+ base::FilePath path(native_file_name);
+ std::string native_data_string;
+ JavaByteArrayToString(env, data, &native_data_string);
+ bool result = base::ImportantFileWriter::WriteFileAtomically(
+ path, native_data_string);
+ return result;
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/int_string_callback.cc b/chromium/base/android/int_string_callback.cc
new file mode 100644
index 00000000000..4ad27b64db9
--- /dev/null
+++ b/chromium/base/android/int_string_callback.cc
@@ -0,0 +1,28 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file encapsulates the JNI headers generated for IntStringCallback, so
+// that the methods defined in the generated headers only end up in one object
+// file. This is similar to //base/android/callback_android.*.
+
+#include "base/android/int_string_callback.h"
+
+#include <jni.h>
+
+#include "base/android/jni_string.h"
+#include "base/base_jni_headers/IntStringCallback_jni.h"
+
+namespace base {
+namespace android {
+
+void RunIntStringCallbackAndroid(const JavaRef<jobject>& callback,
+ int int_arg,
+ const std::string& str_arg) {
+ JNIEnv* env = AttachCurrentThread();
+ Java_IntStringCallback_onResult(env, callback, int_arg,
+ ConvertUTF8ToJavaString(env, str_arg));
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/int_string_callback.h b/chromium/base/android/int_string_callback.h
new file mode 100644
index 00000000000..5412d445161
--- /dev/null
+++ b/chromium/base/android/int_string_callback.h
@@ -0,0 +1,25 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_INT_STRING_CALLBACK_H_
+#define BASE_ANDROID_INT_STRING_CALLBACK_H_
+
+#include <string>
+
+#include "base/android/scoped_java_ref.h"
+#include "base/base_export.h"
+
+namespace base {
+namespace android {
+
+// Runs the Java |callback| by calling its onResult method and passing the
+// integer and string as its arguments.
+void BASE_EXPORT RunIntStringCallbackAndroid(const JavaRef<jobject>& callback,
+ int int_arg,
+ const std::string& str_arg);
+
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_INT_STRING_CALLBACK_H_
diff --git a/chromium/base/android/jank_metric_uma_recorder.cc b/chromium/base/android/jank_metric_uma_recorder.cc
new file mode 100644
index 00000000000..826bb9b1f71
--- /dev/null
+++ b/chromium/base/android/jank_metric_uma_recorder.cc
@@ -0,0 +1,99 @@
+// Copyright 2021 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/jank_metric_uma_recorder.h"
+
+#include <cstdint>
+
+#include "base/android/jni_android.h"
+#include "base/android/jni_array.h"
+#include "base/android/jni_string.h"
+#include "base/base_jni_headers/JankMetricUMARecorder_jni.h"
+#include "base/metrics/histogram_functions.h"
+#include "base/strings/strcat.h"
+#include "base/time/time.h"
+#include "base/trace_event/base_tracing.h"
+#include "base/tracing_buildflags.h"
+
+namespace base {
+namespace android {
+
+namespace {
+
+void AddFrameToTrace(int64_t timestamp_ns, int64_t durations_ns) {
+#if BUILDFLAG(ENABLE_BASE_TRACING)
+ if (timestamp_ns < 0)
+ return;
+ auto t = perfetto::Track(static_cast<uint64_t>(timestamp_ns));
+ TRACE_EVENT_BEGIN(
+ "ui", "AndroidFrameVsync", t, [&](perfetto::EventContext ctx) {
+ ctx.event()->set_timestamp_absolute_us(timestamp_ns / 1000);
+ });
+ TRACE_EVENT_END("ui", t, [&](perfetto::EventContext ctx) {
+ ctx.event()->set_timestamp_absolute_us((timestamp_ns + durations_ns) /
+ 1000);
+ });
+#endif // BUILDFLAG(ENABLE_BASE_TRACING)
+}
+
+} // namespace
+
+// This function is called from Java with JNI, it's declared in
+// base/base_jni_headers/JankMetricUMARecorder_jni.h which is an autogenerated
+// header. The actual implementation is in RecordJankMetrics for simpler
+// testing.
+void JNI_JankMetricUMARecorder_RecordJankMetrics(
+ JNIEnv* env,
+ const base::android::JavaParamRef<jstring>& java_scenario_name,
+ const base::android::JavaParamRef<jlongArray>& java_timestamps_ns,
+ const base::android::JavaParamRef<jlongArray>& java_durations_ns,
+ const base::android::JavaParamRef<jlongArray>& java_jank_bursts_ns,
+ jint java_missed_frames) {
+ RecordJankMetrics(env, java_scenario_name, java_timestamps_ns,
+ java_durations_ns, java_jank_bursts_ns, java_missed_frames);
+}
+
+void RecordJankMetrics(
+ JNIEnv* env,
+ const base::android::JavaParamRef<jstring>& java_scenario_name,
+ const base::android::JavaParamRef<jlongArray>& java_timestamps_ns,
+ const base::android::JavaParamRef<jlongArray>& java_durations_ns,
+ const base::android::JavaParamRef<jlongArray>& java_jank_bursts_ns,
+ jint java_missed_frames) {
+ std::string scenario_name = ConvertJavaStringToUTF8(env, java_scenario_name);
+ std::vector<int64_t> timestamps_ns;
+ std::vector<int64_t> durations_ns;
+ std::vector<int64_t> jank_bursts_ns;
+
+ JavaLongArrayToInt64Vector(env, java_timestamps_ns, &timestamps_ns);
+ JavaLongArrayToInt64Vector(env, java_durations_ns, &durations_ns);
+ JavaLongArrayToInt64Vector(env, java_jank_bursts_ns, &jank_bursts_ns);
+
+ std::string frame_duration_histogram_name =
+ base::StrCat({"Android.Jank.FrameDuration.", scenario_name});
+ std::string jank_burst_histogram_name =
+ base::StrCat({"Android.Jank.JankBursts.", scenario_name});
+ std::string missed_frames_histogram_name =
+ base::StrCat({"Android.Jank.MissedFrames.", scenario_name});
+
+ for (size_t i = 0; i < timestamps_ns.size(); ++i) {
+ AddFrameToTrace(timestamps_ns[i], durations_ns[i]);
+ }
+
+ for (const int64_t frame_duration_ns : durations_ns) {
+ base::UmaHistogramTimes(frame_duration_histogram_name,
+ base::Nanoseconds(frame_duration_ns));
+ }
+
+ for (const int64_t jank_burst_duration_ns : jank_bursts_ns) {
+ base::UmaHistogramTimes(jank_burst_histogram_name,
+ base::Nanoseconds(jank_burst_duration_ns));
+ }
+
+ base::UmaHistogramCounts1000(missed_frames_histogram_name,
+ java_missed_frames);
+}
+
+} // namespace android
+} // namespace base \ No newline at end of file
diff --git a/chromium/base/android/jank_metric_uma_recorder.h b/chromium/base/android/jank_metric_uma_recorder.h
new file mode 100644
index 00000000000..743e1a1fa74
--- /dev/null
+++ b/chromium/base/android/jank_metric_uma_recorder.h
@@ -0,0 +1,24 @@
+// Copyright 2021 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_JANK_METRIC_UMA_RECORDER_H_
+#define BASE_ANDROID_JANK_METRIC_UMA_RECORDER_H_
+
+#include "base/android/jni_android.h"
+#include "base/base_export.h"
+
+namespace base {
+namespace android {
+
+BASE_EXPORT void RecordJankMetrics(
+ JNIEnv* env,
+ const base::android::JavaParamRef<jstring>& java_scenario_name,
+ const base::android::JavaParamRef<jlongArray>& java_timestamps_ns,
+ const base::android::JavaParamRef<jlongArray>& java_durations_ns,
+ const base::android::JavaParamRef<jlongArray>& java_jank_bursts_ns,
+ jint java_missed_frames);
+
+} // namespace android
+} // namespace base
+#endif // BASE_ANDROID_JANK_METRIC_UMA_RECORDER_H_
diff --git a/chromium/base/android/jank_metric_uma_recorder_unittest.cc b/chromium/base/android/jank_metric_uma_recorder_unittest.cc
new file mode 100644
index 00000000000..3df4cf7fdd0
--- /dev/null
+++ b/chromium/base/android/jank_metric_uma_recorder_unittest.cc
@@ -0,0 +1,106 @@
+// Copyright 2021 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/jank_metric_uma_recorder.h"
+
+#include <jni.h>
+
+#include <cstddef>
+#include <cstdint>
+
+#include "base/android/jni_android.h"
+#include "base/android/jni_array.h"
+#include "base/android/jni_string.h"
+#include "base/metrics/histogram.h"
+#include "base/test/metrics/histogram_tester.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using ::testing::ElementsAre;
+
+namespace base {
+namespace android {
+namespace {
+
+jlongArray GenerateJavaLongArray(JNIEnv* env,
+ const int64_t long_array[],
+ const size_t array_length) {
+ ScopedJavaLocalRef<jlongArray> java_long_array =
+ ToJavaLongArray(env, long_array, array_length);
+
+ return java_long_array.Release();
+}
+
+const int64_t kTimestampsNs[] = {
+ 100'000'000, 116'000'000, 132'000'000, 148'000'000,
+ 164'000'000, 180'000'000, 196'000'000, 212'000'000,
+};
+
+// Durations are received in nanoseconds, but are recorded to UMA in
+// milliseconds.
+const int64_t kDurations[] = {
+ 1'000'000, // 1ms
+ 2'000'000, // 2ms
+ 30'000'000, // 30ms
+ 10'000'000, // 10ms
+ 60'000'000, // 60ms
+ 1'000'000, // 1ms
+ 1'000'000, // 1ms
+ 20'000'000, // 20ms
+};
+const size_t kDurationsLen = std::size(kDurations);
+
+static_assert(std::size(kDurations) == std::size(kTimestampsNs),
+ "Length of timestamps and durations should be equal.");
+
+// Jank bursts are calculated based on durations.
+const int64_t kJankBursts[] = {
+ 100'000'000, // 100ms
+ 20'000'000, // 20ms
+};
+const size_t kJankBurstsLen = std::size(kJankBursts);
+
+} // namespace
+
+TEST(JankMetricUMARecorder, TestUMARecording) {
+ HistogramTester histogram_tester;
+
+ JNIEnv* env = AttachCurrentThread();
+
+ jstring java_scenario_name =
+ ConvertUTF8ToJavaString(env, "PeriodicReporting").Release();
+ jlongArray java_timestamps =
+ GenerateJavaLongArray(env, kTimestampsNs, kDurationsLen);
+ jlongArray java_durations =
+ GenerateJavaLongArray(env, kDurations, kDurationsLen);
+ jlongArray java_jank_bursts =
+ GenerateJavaLongArray(env, kJankBursts, kJankBurstsLen);
+
+ RecordJankMetrics(
+ env,
+ /* java_scenario_name= */
+ base::android::JavaParamRef<jstring>(env, java_scenario_name),
+ /* java_timestamps_ns= */
+ base::android::JavaParamRef<jlongArray>(env, java_timestamps),
+ /* java_durations_ns= */
+ base::android::JavaParamRef<jlongArray>(env, java_durations),
+ /* java_jank_bursts_ns=*/
+ base::android::JavaParamRef<jlongArray>(env, java_jank_bursts),
+ /* java_missed_frames = */ 2);
+
+ EXPECT_THAT(histogram_tester.GetAllSamples(
+ "Android.Jank.FrameDuration.PeriodicReporting"),
+ ElementsAre(Bucket(1, 3), Bucket(2, 1), Bucket(10, 1),
+ Bucket(20, 1), Bucket(29, 1), Bucket(57, 1)));
+
+ EXPECT_THAT(histogram_tester.GetAllSamples(
+ "Android.Jank.JankBursts.PeriodicReporting"),
+ ElementsAre(Bucket(20, 1), Bucket(96, 1)));
+
+ histogram_tester.ExpectUniqueSample(
+ "Android.Jank.MissedFrames.PeriodicReporting", 2, 1);
+}
+
+} // namespace android
+} // namespace base \ No newline at end of file
diff --git a/chromium/base/android/java_exception_reporter.cc b/chromium/base/android/java_exception_reporter.cc
new file mode 100644
index 00000000000..395e9763b00
--- /dev/null
+++ b/chromium/base/android/java_exception_reporter.cc
@@ -0,0 +1,100 @@
+// Copyright 2015 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/java_exception_reporter.h"
+
+#include "base/android/jni_android.h"
+#include "base/android/jni_string.h"
+#include "base/android/scoped_java_ref.h"
+#include "base/base_jni_headers/JavaExceptionReporter_jni.h"
+#include "base/debug/dump_without_crashing.h"
+#include "base/functional/bind.h"
+#include "base/functional/callback.h"
+#include "base/lazy_instance.h"
+
+using base::android::JavaParamRef;
+using base::android::JavaRef;
+
+namespace base {
+namespace android {
+
+namespace {
+
+void (*g_java_exception_callback)(const char*);
+
+using JavaExceptionFilter =
+ base::RepeatingCallback<bool(const JavaRef<jthrowable>&)>;
+
+LazyInstance<JavaExceptionFilter>::Leaky g_java_exception_filter =
+ LAZY_INSTANCE_INITIALIZER;
+
+} // namespace
+
+void InitJavaExceptionReporter() {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ // Since JavaExceptionReporter#installHandler will chain through to the
+ // default handler, the default handler should cause a crash as if it's a
+ // normal java exception. Prefer to crash the browser process in java rather
+ // than native since for webview, the embedding app may have installed its
+ // own JavaExceptionReporter handler and would expect it to be called.
+ constexpr bool crash_after_report = false;
+ SetJavaExceptionFilter(
+ base::BindRepeating([](const JavaRef<jthrowable>&) { return true; }));
+ Java_JavaExceptionReporter_installHandler(env, crash_after_report);
+}
+
+void InitJavaExceptionReporterForChildProcess() {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ constexpr bool crash_after_report = true;
+ SetJavaExceptionFilter(
+ base::BindRepeating([](const JavaRef<jthrowable>&) { return true; }));
+ Java_JavaExceptionReporter_installHandler(env, crash_after_report);
+}
+
+void SetJavaExceptionFilter(JavaExceptionFilter java_exception_filter) {
+ g_java_exception_filter.Get() = std::move(java_exception_filter);
+}
+
+void SetJavaExceptionCallback(void (*callback)(const char*)) {
+ DCHECK(!g_java_exception_callback);
+ g_java_exception_callback = callback;
+}
+
+void SetJavaException(const char* exception) {
+ // No need to print exception because they are already logged via
+ // env->ExceptionDescribe() within jni_android.cc.
+ if (g_java_exception_callback) {
+ g_java_exception_callback(exception);
+ }
+}
+
+void JNI_JavaExceptionReporter_ReportJavaException(
+ JNIEnv* env,
+ jboolean crash_after_report,
+ const JavaParamRef<jthrowable>& e) {
+ std::string exception_info = base::android::GetJavaExceptionInfo(env, e);
+ bool should_report_exception = g_java_exception_filter.Get().Run(e);
+ if (should_report_exception) {
+ SetJavaException(exception_info.c_str());
+ }
+ if (crash_after_report) {
+ LOG(ERROR) << exception_info;
+ LOG(FATAL) << "Uncaught exception";
+ }
+ if (should_report_exception) {
+ base::debug::DumpWithoutCrashing();
+ SetJavaException(nullptr);
+ }
+}
+
+void JNI_JavaExceptionReporter_ReportJavaStackTrace(
+ JNIEnv* env,
+ const JavaParamRef<jstring>& stack_trace) {
+ SetJavaException(ConvertJavaStringToUTF8(stack_trace).c_str());
+ base::debug::DumpWithoutCrashing();
+ SetJavaException(nullptr);
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/java_exception_reporter.h b/chromium/base/android/java_exception_reporter.h
new file mode 100644
index 00000000000..50c3cabfb26
--- /dev/null
+++ b/chromium/base/android/java_exception_reporter.h
@@ -0,0 +1,42 @@
+// Copyright 2015 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_JAVA_EXCEPTION_REPORTER_H_
+#define BASE_ANDROID_JAVA_EXCEPTION_REPORTER_H_
+
+#include <jni.h>
+
+#include "base/android/scoped_java_ref.h"
+#include "base/base_export.h"
+#include "base/functional/callback_forward.h"
+
+namespace base {
+namespace android {
+
+// Install the exception handler. This should only be called once per process.
+BASE_EXPORT void InitJavaExceptionReporter();
+
+// Same as above except the handler ensures child process exists immediately
+// after an unhandled exception. This is used for child processes because
+// DumpWithoutCrashing does not work for child processes on Android.
+BASE_EXPORT void InitJavaExceptionReporterForChildProcess();
+
+// Sets a callback to be called with the contents of a Java exception, which may
+// be nullptr.
+BASE_EXPORT void SetJavaExceptionCallback(void (*)(const char* exception));
+
+// Calls the Java exception callback, if any, with exception.
+void SetJavaException(const char* exception);
+
+// Sets a filter that determines whether a java exception should cause a crash
+// report. |java_exception_filter| should return true if a crash report should
+// be generated.
+BASE_EXPORT void SetJavaExceptionFilter(
+ base::RepeatingCallback<bool(const JavaRef<jthrowable>&)>
+ java_exception_filter);
+
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_JAVA_EXCEPTION_REPORTER_H_
diff --git a/chromium/base/android/java_handler_thread.cc b/chromium/base/android/java_handler_thread.cc
new file mode 100644
index 00000000000..74fb75bfe82
--- /dev/null
+++ b/chromium/base/android/java_handler_thread.cc
@@ -0,0 +1,182 @@
+// Copyright 2013 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/java_handler_thread.h"
+
+#include <jni.h>
+
+#include "base/android/jni_android.h"
+#include "base/android/jni_string.h"
+#include "base/base_jni_headers/JavaHandlerThread_jni.h"
+#include "base/functional/bind.h"
+#include "base/message_loop/message_pump.h"
+#include "base/message_loop/message_pump_type.h"
+#include "base/run_loop.h"
+#include "base/synchronization/waitable_event.h"
+#include "base/task/sequence_manager/sequence_manager_impl.h"
+#include "base/threading/platform_thread_internal_posix.h"
+#include "base/threading/thread_id_name_manager.h"
+#include "base/threading/thread_restrictions.h"
+
+using base::android::AttachCurrentThread;
+
+namespace base {
+
+namespace android {
+
+JavaHandlerThread::JavaHandlerThread(const char* name,
+ base::ThreadType thread_type)
+ : JavaHandlerThread(
+ name,
+ Java_JavaHandlerThread_create(
+ AttachCurrentThread(),
+ ConvertUTF8ToJavaString(AttachCurrentThread(), name),
+ base::internal::ThreadTypeToNiceValue(thread_type))) {}
+
+JavaHandlerThread::JavaHandlerThread(
+ const char* name,
+ const base::android::ScopedJavaLocalRef<jobject>& obj)
+ : name_(name), java_thread_(obj) {}
+
+JavaHandlerThread::~JavaHandlerThread() {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ DCHECK(!Java_JavaHandlerThread_isAlive(env, java_thread_));
+ DCHECK(!state_ || state_->pump->IsAborted());
+ // TODO(mthiesse): We shouldn't leak the MessageLoop as this could affect
+ // future tests.
+ if (state_ && state_->pump->IsAborted()) {
+ // When the Pump has been aborted due to a crash, we intentionally leak the
+ // SequenceManager because the SequenceManager hasn't been shut down
+ // properly and would trigger DCHECKS. This should only happen in tests,
+ // where we handle the exception instead of letting it take down the
+ // process.
+ state_.release();
+ }
+}
+
+void JavaHandlerThread::Start() {
+ // Check the thread has not already been started.
+ DCHECK(!state_);
+
+ JNIEnv* env = base::android::AttachCurrentThread();
+ base::WaitableEvent initialize_event(
+ WaitableEvent::ResetPolicy::AUTOMATIC,
+ WaitableEvent::InitialState::NOT_SIGNALED);
+ Java_JavaHandlerThread_startAndInitialize(
+ env, java_thread_, reinterpret_cast<intptr_t>(this),
+ reinterpret_cast<intptr_t>(&initialize_event));
+ // Wait for thread to be initialized so it is ready to be used when Start
+ // returns.
+ base::ScopedAllowBaseSyncPrimitivesOutsideBlockingScope wait_allowed;
+ initialize_event.Wait();
+}
+
+void JavaHandlerThread::Stop() {
+ DCHECK(!task_runner()->BelongsToCurrentThread());
+ task_runner()->PostTask(
+ FROM_HERE,
+ base::BindOnce(&JavaHandlerThread::StopOnThread, base::Unretained(this)));
+ JNIEnv* env = base::android::AttachCurrentThread();
+ Java_JavaHandlerThread_joinThread(env, java_thread_);
+}
+
+void JavaHandlerThread::InitializeThread(JNIEnv* env,
+ jlong event) {
+ base::ThreadIdNameManager::GetInstance()->RegisterThread(
+ base::PlatformThread::CurrentHandle().platform_handle(),
+ base::PlatformThread::CurrentId());
+
+ if (name_)
+ PlatformThread::SetName(name_);
+
+ thread_id_ = base::PlatformThread::CurrentId();
+ state_ = std::make_unique<State>();
+#if DCHECK_IS_ON()
+ initialized_ = true;
+#endif
+ Init();
+ reinterpret_cast<base::WaitableEvent*>(event)->Signal();
+}
+
+void JavaHandlerThread::OnLooperStopped(JNIEnv* env) {
+ DCHECK(task_runner()->BelongsToCurrentThread());
+ state_.reset();
+
+ CleanUp();
+
+ base::ThreadIdNameManager::GetInstance()->RemoveName(
+ base::PlatformThread::CurrentHandle().platform_handle(),
+ base::PlatformThread::CurrentId());
+}
+
+void JavaHandlerThread::StopSequenceManagerForTesting() {
+ DCHECK(task_runner()->BelongsToCurrentThread());
+ StopOnThread();
+}
+
+void JavaHandlerThread::JoinForTesting() {
+ DCHECK(!task_runner()->BelongsToCurrentThread());
+ JNIEnv* env = base::android::AttachCurrentThread();
+ Java_JavaHandlerThread_joinThread(env, java_thread_);
+}
+
+void JavaHandlerThread::ListenForUncaughtExceptionsForTesting() {
+ DCHECK(!task_runner()->BelongsToCurrentThread());
+ JNIEnv* env = base::android::AttachCurrentThread();
+ Java_JavaHandlerThread_listenForUncaughtExceptionsForTesting(env,
+ java_thread_);
+}
+
+ScopedJavaLocalRef<jthrowable> JavaHandlerThread::GetUncaughtExceptionIfAny() {
+ DCHECK(!task_runner()->BelongsToCurrentThread());
+ JNIEnv* env = base::android::AttachCurrentThread();
+ return Java_JavaHandlerThread_getUncaughtExceptionIfAny(env, java_thread_);
+}
+
+PlatformThreadId JavaHandlerThread::GetThreadId() const {
+#if DCHECK_IS_ON()
+ DCHECK(initialized_);
+#endif
+ return thread_id_;
+}
+
+void JavaHandlerThread::StopOnThread() {
+ DCHECK(task_runner()->BelongsToCurrentThread());
+ DCHECK(state_);
+ state_->pump->QuitWhenIdle(base::BindOnce(
+ &JavaHandlerThread::QuitThreadSafely, base::Unretained(this)));
+}
+
+void JavaHandlerThread::QuitThreadSafely() {
+ DCHECK(task_runner()->BelongsToCurrentThread());
+ JNIEnv* env = base::android::AttachCurrentThread();
+ Java_JavaHandlerThread_quitThreadSafely(env, java_thread_,
+ reinterpret_cast<intptr_t>(this));
+}
+
+JavaHandlerThread::State::State()
+ : sequence_manager(sequence_manager::CreateUnboundSequenceManager(
+ sequence_manager::SequenceManager::Settings::Builder()
+ .SetMessagePumpType(base::MessagePumpType::JAVA)
+ .Build())),
+ default_task_queue(
+ sequence_manager->CreateTaskQueue(sequence_manager::TaskQueue::Spec(
+ sequence_manager::QueueName::DEFAULT_TQ))) {
+ // TYPE_JAVA to get the Android java style message loop.
+ std::unique_ptr<MessagePump> message_pump =
+ MessagePump::Create(base::MessagePumpType::JAVA);
+ pump = static_cast<MessagePumpForUI*>(message_pump.get());
+
+ // We must set SetTaskRunner before binding because the Android UI pump
+ // creates a RunLoop which samples SingleThreadTaskRunner::GetCurrentDefault.
+ static_cast<sequence_manager::internal::SequenceManagerImpl*>(
+ sequence_manager.get())
+ ->SetTaskRunner(default_task_queue->task_runner());
+ sequence_manager->BindToMessagePump(std::move(message_pump));
+}
+
+JavaHandlerThread::State::~State() = default;
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/java_handler_thread.h b/chromium/base/android/java_handler_thread.h
new file mode 100644
index 00000000000..4c24a0d21d9
--- /dev/null
+++ b/chromium/base/android/java_handler_thread.h
@@ -0,0 +1,117 @@
+// Copyright 2013 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_JAVA_HANDLER_THREAD_H_
+#define BASE_ANDROID_JAVA_HANDLER_THREAD_H_
+
+#include <jni.h>
+
+#include <memory>
+
+#include "base/android/scoped_java_ref.h"
+#include "base/dcheck_is_on.h"
+#include "base/memory/raw_ptr.h"
+#include "base/task/sequence_manager/sequence_manager.h"
+#include "base/task/sequence_manager/task_queue.h"
+#include "base/task/single_thread_task_runner.h"
+
+namespace base {
+
+class MessagePumpForUI;
+
+namespace android {
+
+// A Java Thread with a native message loop. To run tasks, post them
+// to the message loop and they will be scheduled along with Java tasks
+// on the thread.
+// This is useful for callbacks where the receiver expects a thread
+// with a prepared Looper.
+class BASE_EXPORT JavaHandlerThread {
+ public:
+ // Create new thread.
+ explicit JavaHandlerThread(
+ const char* name,
+ base::ThreadType thread_type = base::ThreadType::kDefault);
+ // Wrap and connect to an existing JavaHandlerThread.
+ // |obj| is an instance of JavaHandlerThread.
+ explicit JavaHandlerThread(
+ const char* name,
+ const base::android::ScopedJavaLocalRef<jobject>& obj);
+ virtual ~JavaHandlerThread();
+
+ // Gets the TaskRunner associated with the message loop.
+ // Called from any thread.
+ scoped_refptr<SingleThreadTaskRunner> task_runner() const {
+ return state_ ? state_->default_task_queue->task_runner() : nullptr;
+ }
+
+ // Called from the parent thread.
+ void Start();
+ void Stop();
+
+ // Called from java on the newly created thread.
+ // Start() will not return before this methods has finished.
+ void InitializeThread(JNIEnv* env,
+ jlong event);
+ // Called from java on this thread.
+ void OnLooperStopped(JNIEnv* env);
+
+ // Called from this thread.
+ void StopSequenceManagerForTesting();
+ // Called from this thread.
+ void JoinForTesting();
+
+ // Called from this thread.
+ // See comment in JavaHandlerThread.java regarding use of this function.
+ void ListenForUncaughtExceptionsForTesting();
+ // Called from this thread.
+ ScopedJavaLocalRef<jthrowable> GetUncaughtExceptionIfAny();
+
+ // Returns the thread ID. Should not be called before the first Start*()
+ // call. This method is thread-safe.
+ PlatformThreadId GetThreadId() const;
+
+ protected:
+ // Struct exists so JavaHandlerThread destructor can intentionally leak in an
+ // abort scenario.
+ struct State {
+ State();
+ ~State();
+
+ std::unique_ptr<sequence_manager::SequenceManager> sequence_manager;
+ scoped_refptr<sequence_manager::TaskQueue> default_task_queue;
+ raw_ptr<MessagePumpForUI> pump = nullptr;
+ };
+
+ State* state() const { return state_.get(); }
+
+ // Semantically the same as base::Thread#Init(), but unlike base::Thread the
+ // Android Looper will already be running. This Init() call will still run
+ // before other tasks are posted to the thread.
+ virtual void Init() {}
+
+ // Semantically the same as base::Thread#CleanUp(), called after the message
+ // loop ends. The Android Looper will also have been quit by this point.
+ virtual void CleanUp() {}
+
+ std::unique_ptr<State> state_;
+
+ private:
+ void StartMessageLoop();
+
+ void StopOnThread();
+ void QuitThreadSafely();
+
+ const char* name_;
+ base::PlatformThreadId thread_id_{};
+ ScopedJavaGlobalRef<jobject> java_thread_;
+#if DCHECK_IS_ON()
+ bool initialized_ = false;
+#endif
+};
+
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_JAVA_HANDLER_THREAD_H_
diff --git a/chromium/base/android/java_handler_thread_unittest.cc b/chromium/base/android/java_handler_thread_unittest.cc
new file mode 100644
index 00000000000..f72a5864b2e
--- /dev/null
+++ b/chromium/base/android/java_handler_thread_unittest.cc
@@ -0,0 +1,152 @@
+// Copyright 2019 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/java_handler_thread.h"
+
+#include "base/synchronization/waitable_event.h"
+#include "base/task/sequence_manager/sequence_manager_impl.h"
+#include "base/task/task_observer.h"
+#include "base/test/android/java_handler_thread_helpers.h"
+#include "base/test/bind.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace base {
+namespace {
+
+class JavaHandlerThreadForTest : public android::JavaHandlerThread {
+ public:
+ explicit JavaHandlerThreadForTest(
+ const char* name,
+ base::ThreadType thread_type = base::ThreadType::kDefault)
+ : android::JavaHandlerThread(name, thread_type) {}
+
+ using android::JavaHandlerThread::state;
+ using android::JavaHandlerThread::State;
+};
+
+class DummyTaskObserver : public TaskObserver {
+ public:
+ explicit DummyTaskObserver(int num_tasks)
+ : num_tasks_started_(0), num_tasks_processed_(0), num_tasks_(num_tasks) {}
+
+ DummyTaskObserver(int num_tasks, int num_tasks_started)
+ : num_tasks_started_(num_tasks_started),
+ num_tasks_processed_(0),
+ num_tasks_(num_tasks) {}
+
+ DummyTaskObserver(const DummyTaskObserver&) = delete;
+ DummyTaskObserver& operator=(const DummyTaskObserver&) = delete;
+
+ ~DummyTaskObserver() override = default;
+
+ void WillProcessTask(const PendingTask& /* pending_task */,
+ bool /* was_blocked_or_low_priority */) override {
+ num_tasks_started_++;
+ EXPECT_LE(num_tasks_started_, num_tasks_);
+ EXPECT_EQ(num_tasks_started_, num_tasks_processed_ + 1);
+ }
+
+ void DidProcessTask(const PendingTask& pending_task) override {
+ num_tasks_processed_++;
+ EXPECT_LE(num_tasks_started_, num_tasks_);
+ EXPECT_EQ(num_tasks_started_, num_tasks_processed_);
+ }
+
+ int num_tasks_started() const { return num_tasks_started_; }
+ int num_tasks_processed() const { return num_tasks_processed_; }
+
+ private:
+ int num_tasks_started_;
+ int num_tasks_processed_;
+ const int num_tasks_;
+};
+
+void PostNTasks(int posts_remaining) {
+ if (posts_remaining > 1) {
+ SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
+ FROM_HERE, BindOnce(&PostNTasks, posts_remaining - 1));
+ }
+}
+
+} // namespace
+
+class JavaHandlerThreadTest : public ::testing::Test {};
+
+void RunTest_AbortDontRunMoreTasks(bool delayed, bool init_java_first) {
+ WaitableEvent test_done_event;
+ std::unique_ptr<android::JavaHandlerThread> java_thread;
+ if (init_java_first) {
+ java_thread = android::JavaHandlerThreadHelpers::CreateJavaFirst();
+ } else {
+ java_thread = std::make_unique<android::JavaHandlerThread>(
+ "JavaHandlerThreadForTesting from AbortDontRunMoreTasks");
+ }
+ java_thread->Start();
+ java_thread->ListenForUncaughtExceptionsForTesting();
+
+ auto target =
+ BindOnce(&android::JavaHandlerThreadHelpers::ThrowExceptionAndAbort,
+ &test_done_event);
+ if (delayed) {
+ java_thread->task_runner()->PostDelayedTask(FROM_HERE, std::move(target),
+ Milliseconds(10));
+ } else {
+ java_thread->task_runner()->PostTask(FROM_HERE, std::move(target));
+ java_thread->task_runner()->PostTask(FROM_HERE,
+ MakeExpectedNotRunClosure(FROM_HERE));
+ }
+ test_done_event.Wait();
+ java_thread->Stop();
+ android::ScopedJavaLocalRef<jthrowable> exception =
+ java_thread->GetUncaughtExceptionIfAny();
+ ASSERT_TRUE(
+ android::JavaHandlerThreadHelpers::IsExceptionTestException(exception));
+}
+
+TEST_F(JavaHandlerThreadTest, JavaExceptionAbort) {
+ constexpr bool delayed = false;
+ constexpr bool init_java_first = false;
+ RunTest_AbortDontRunMoreTasks(delayed, init_java_first);
+}
+
+TEST_F(JavaHandlerThreadTest, DelayedJavaExceptionAbort) {
+ constexpr bool delayed = true;
+ constexpr bool init_java_first = false;
+ RunTest_AbortDontRunMoreTasks(delayed, init_java_first);
+}
+
+TEST_F(JavaHandlerThreadTest, JavaExceptionAbortInitJavaFirst) {
+ constexpr bool delayed = false;
+ constexpr bool init_java_first = true;
+ RunTest_AbortDontRunMoreTasks(delayed, init_java_first);
+}
+
+TEST_F(JavaHandlerThreadTest, RunTasksWhileShuttingDownJavaThread) {
+ const int kNumPosts = 6;
+ DummyTaskObserver observer(kNumPosts, 1);
+
+ auto java_thread = std::make_unique<JavaHandlerThreadForTest>("test");
+ java_thread->Start();
+
+ sequence_manager::internal::SequenceManagerImpl* sequence_manager =
+ static_cast<sequence_manager::internal::SequenceManagerImpl*>(
+ java_thread->state()->sequence_manager.get());
+
+ java_thread->task_runner()->PostTask(
+ FROM_HERE, BindLambdaForTesting([&]() {
+ sequence_manager->AddTaskObserver(&observer);
+ SingleThreadTaskRunner::GetCurrentDefault()->PostDelayedTask(
+ FROM_HERE, MakeExpectedNotRunClosure(FROM_HERE), Days(1));
+ java_thread->StopSequenceManagerForTesting();
+ PostNTasks(kNumPosts);
+ }));
+
+ java_thread->JoinForTesting();
+ java_thread.reset();
+
+ EXPECT_EQ(kNumPosts, observer.num_tasks_started());
+ EXPECT_EQ(kNumPosts, observer.num_tasks_processed());
+}
+
+} // namespace base
diff --git a/chromium/base/android/java_heap_dump_generator.cc b/chromium/base/android/java_heap_dump_generator.cc
new file mode 100644
index 00000000000..f6188951658
--- /dev/null
+++ b/chromium/base/android/java_heap_dump_generator.cc
@@ -0,0 +1,22 @@
+// Copyright 2019 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/java_heap_dump_generator.h"
+
+#include <jni.h>
+
+#include "base/android/jni_string.h"
+#include "base/base_jni_headers/JavaHeapDumpGenerator_jni.h"
+
+namespace base {
+namespace android {
+
+bool WriteJavaHeapDumpToPath(base::StringPiece filePath) {
+ JNIEnv* env = AttachCurrentThread();
+ return Java_JavaHeapDumpGenerator_generateHprof(
+ env, base::android::ConvertUTF8ToJavaString(env, filePath));
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/java_heap_dump_generator.h b/chromium/base/android/java_heap_dump_generator.h
new file mode 100644
index 00000000000..18aaa802aed
--- /dev/null
+++ b/chromium/base/android/java_heap_dump_generator.h
@@ -0,0 +1,23 @@
+// Copyright 2019 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_JAVA_HEAP_DUMP_GENERATOR_H_
+#define BASE_ANDROID_JAVA_HEAP_DUMP_GENERATOR_H_
+
+#include "base/android/scoped_java_ref.h"
+#include "base/base_export.h"
+#include "base/strings/string_piece.h"
+
+namespace base {
+namespace android {
+
+// Generates heap dump and writes it to a file at |file_path|. Returns true on
+// success. The heap dump is generated through the Android Java system API
+// android.os.Debug#dumpHprofData(...)
+BASE_EXPORT bool WriteJavaHeapDumpToPath(base::StringPiece file_path);
+
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_JAVA_HEAP_DUMP_GENERATOR_H_
diff --git a/chromium/base/android/java_runtime.cc b/chromium/base/android/java_runtime.cc
new file mode 100644
index 00000000000..c22132694b0
--- /dev/null
+++ b/chromium/base/android/java_runtime.cc
@@ -0,0 +1,25 @@
+// Copyright 2015 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/java_runtime.h"
+
+#include "base/android_runtime_jni_headers/Runtime_jni.h"
+#include "base/numerics/safe_conversions.h"
+
+namespace base {
+namespace android {
+
+void JavaRuntime::GetMemoryUsage(uint64_t* total_memory,
+ uint64_t* free_memory) {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ base::android::ScopedJavaLocalRef<jobject> runtime =
+ JNI_Runtime::Java_Runtime_getRuntime(env);
+ *total_memory = checked_cast<uint64_t>(
+ JNI_Runtime::Java_Runtime_totalMemory(env, runtime));
+ *free_memory = checked_cast<uint64_t>(
+ JNI_Runtime::Java_Runtime_freeMemory(env, runtime));
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/java_runtime.h b/chromium/base/android/java_runtime.h
new file mode 100644
index 00000000000..eb67eec3b12
--- /dev/null
+++ b/chromium/base/android/java_runtime.h
@@ -0,0 +1,25 @@
+// Copyright 2015 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_JAVA_RUNTIME_H_
+#define BASE_ANDROID_JAVA_RUNTIME_H_
+
+#include "base/android/scoped_java_ref.h"
+#include "base/base_export.h"
+
+namespace base {
+namespace android {
+
+// Wrapper class for using the java.lang.Runtime object from jni.
+class BASE_EXPORT JavaRuntime {
+ public:
+ // Fills the total memory used and memory allocated for objects by the java
+ // heap in the current process. Returns true on success.
+ static void GetMemoryUsage(uint64_t* total_memory, uint64_t* free_memory);
+};
+
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_JAVA_RUNTIME_H_
diff --git a/chromium/base/android/javatests/src/org/chromium/base/AdvancedMockContextTest.java b/chromium/base/android/javatests/src/org/chromium/base/AdvancedMockContextTest.java
new file mode 100644
index 00000000000..245885ef0f7
--- /dev/null
+++ b/chromium/base/android/javatests/src/org/chromium/base/AdvancedMockContextTest.java
@@ -0,0 +1,78 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base;
+
+import android.app.Application;
+import android.content.ComponentCallbacks;
+import android.content.ComponentCallbacks2;
+import android.content.Context;
+import android.content.res.Configuration;
+import android.support.test.InstrumentationRegistry;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.test.BaseJUnit4ClassRunner;
+import org.chromium.base.test.util.AdvancedMockContext;
+
+/**
+ * Tests for {@link org.chromium.base.test.util.AdvancedMockContext}.
+ */
+@RunWith(BaseJUnit4ClassRunner.class)
+public class AdvancedMockContextTest {
+ private static class Callback1 implements ComponentCallbacks {
+ protected Configuration mConfiguration;
+ protected boolean mOnLowMemoryCalled;
+
+ @Override
+ public void onConfigurationChanged(Configuration configuration) {
+ mConfiguration = configuration;
+ }
+
+ @Override
+ public void onLowMemory() {
+ mOnLowMemoryCalled = true;
+ }
+ }
+
+ private static class Callback2 extends Callback1 implements ComponentCallbacks2 {
+ private int mLevel;
+
+ @Override
+ public void onTrimMemory(int level) {
+ mLevel = level;
+ }
+ }
+
+ @Test
+ @SmallTest
+ public void testComponentCallbacksForTargetContext() {
+ Context targetContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ Application targetApplication = BaseJUnit4ClassRunner.getApplication();
+ AdvancedMockContext context = new AdvancedMockContext(targetContext);
+ Callback1 callback1 = new Callback1();
+ Callback2 callback2 = new Callback2();
+ context.registerComponentCallbacks(callback1);
+ context.registerComponentCallbacks(callback2);
+
+ targetApplication.onLowMemory();
+ Assert.assertTrue("onLowMemory should have been called.", callback1.mOnLowMemoryCalled);
+ Assert.assertTrue("onLowMemory should have been called.", callback2.mOnLowMemoryCalled);
+
+ Configuration configuration = new Configuration();
+ targetApplication.onConfigurationChanged(configuration);
+ Assert.assertEquals("onConfigurationChanged should have been called.", configuration,
+ callback1.mConfiguration);
+ Assert.assertEquals("onConfigurationChanged should have been called.", configuration,
+ callback2.mConfiguration);
+
+ targetApplication.onTrimMemory(ComponentCallbacks2.TRIM_MEMORY_MODERATE);
+ Assert.assertEquals("onTrimMemory should have been called.",
+ ComponentCallbacks2.TRIM_MEMORY_MODERATE, callback2.mLevel);
+ }
+}
diff --git a/chromium/base/android/javatests/src/org/chromium/base/AssertsTest.java b/chromium/base/android/javatests/src/org/chromium/base/AssertsTest.java
new file mode 100644
index 00000000000..c2363f4f618
--- /dev/null
+++ b/chromium/base/android/javatests/src/org/chromium/base/AssertsTest.java
@@ -0,0 +1,43 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.test.BaseJUnit4ClassRunner;
+import org.chromium.build.BuildConfig;
+
+/**
+ * Test that ensures Java asserts are working.
+ *
+ * Not a robolectric test because we want to make sure asserts are enabled after dexing.
+ */
+@RunWith(BaseJUnit4ClassRunner.class)
+public class AssertsTest {
+ private static final String TAG = "AssertsTest";
+
+ @Test
+ @SmallTest
+ @SuppressWarnings("UseCorrectAssertInTests")
+ public void testAssertsWorkAsExpected() {
+ Log.i(TAG, "BuildConfig.ENABLE_ASSERTS=%b", BuildConfig.ENABLE_ASSERTS);
+ if (BuildConfig.ENABLE_ASSERTS) {
+ try {
+ assert false;
+ } catch (AssertionError e) {
+ // When asserts are enabled, asserts should throw AssertionErrors.
+ return;
+ }
+ Assert.fail("Java assert unexpectedly didn't fire.");
+ } else {
+ // When asserts are disabled, asserts should be removed by proguard.
+ assert false : "Java assert unexpectedly fired.";
+ }
+ }
+}
diff --git a/chromium/base/android/javatests/src/org/chromium/base/CommandLineFlagsTest.java b/chromium/base/android/javatests/src/org/chromium/base/CommandLineFlagsTest.java
new file mode 100644
index 00000000000..5c3f6aed5d3
--- /dev/null
+++ b/chromium/base/android/javatests/src/org/chromium/base/CommandLineFlagsTest.java
@@ -0,0 +1,167 @@
+// Copyright 2020 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestRule;
+import org.junit.runner.Description;
+import org.junit.runner.RunWith;
+import org.junit.runners.model.InitializationError;
+import org.junit.runners.model.Statement;
+
+import org.chromium.base.library_loader.LibraryLoader;
+import org.chromium.base.test.BaseJUnit4ClassRunner;
+import org.chromium.base.test.util.Batch;
+import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.base.test.util.Feature;
+
+import java.util.List;
+
+/**
+ * Test class for {@link CommandLineFlags}.
+ */
+@RunWith(CommandLineFlagsTest.ClassRunner.class)
+@Batch(Batch.UNIT_TESTS)
+@CommandLineFlags.
+Add({CommandLineFlagsTest.FLAG_1, "flagwithvalue=foo", "enable-features=feature1,feature2"})
+public class CommandLineFlagsTest {
+ public static class ClassRunner extends BaseJUnit4ClassRunner {
+ public ClassRunner(final Class<?> klass) throws InitializationError {
+ super(klass);
+ }
+
+ // Verify class-level modifications are reset after class finishes.
+ @Override
+ protected List<ClassHook> getPostClassHooks() {
+ return addToList(ClassRunner.super.getPostClassHooks(), (targetContext, testClass) -> {
+ verifyCommandLine(false, false, false, false, false, false, false);
+ Assert.assertFalse(CommandLine.getInstance().hasSwitch("flagwithvalue"));
+ String enabledFeatures =
+ CommandLine.getInstance().getSwitchValue("enable-features");
+ if (enabledFeatures != null) {
+ Assert.assertFalse(enabledFeatures.contains("feature1"));
+ Assert.assertFalse(enabledFeatures.contains("feature2"));
+ }
+ });
+ }
+
+ // Verify that after each test, flags are reset to class-level state.
+ @Override
+ protected List<TestHook> getPostTestHooks() {
+ return addToList(ClassRunner.super.getPostTestHooks(),
+ (targetContext, testMethod) -> { verifyClassLevelStateOnly(); });
+ }
+ }
+
+ static final String FLAG_1 = "flag1";
+ private static final String FLAG_2 = "flag2";
+ private static final String FLAG_3 = "flag3";
+ private static final String FLAG_4 = "flag4";
+ private static final String FLAG_5 = "flag5";
+ private static final String FLAG_6 = "flag6";
+ private static final String FLAG_7 = "flag7";
+
+ @CommandLineFlags.Add(FLAG_2)
+ private static class EmptyRule implements TestRule {
+ @Override
+ public Statement apply(Statement base, Description description) {
+ return base;
+ }
+ }
+
+ @CommandLineFlags.Add(FLAG_3)
+ private static class MyRule extends EmptyRule {
+ @CommandLineFlags.Add(FLAG_4)
+ private static class InnerRule extends EmptyRule {}
+
+ @SuppressWarnings("UnusedNestedClass")
+ @CommandLineFlags.Add(FLAG_5)
+ private static class UnusedRule extends EmptyRule {}
+
+ @Rule
+ public InnerRule mInnerRule = new InnerRule();
+ }
+
+ @Rule
+ public MyRule mRule = new MyRule();
+
+ @Before
+ public void setUp() {
+ LibraryLoader.getInstance().ensureInitialized();
+ }
+
+ private static void verifyCommandLine(boolean flag1, boolean flag2, boolean flag3,
+ boolean flag4, boolean flag5, boolean flag6, boolean flag7) {
+ CommandLine cmdLine = CommandLine.getInstance();
+ Assert.assertEquals(flag1, cmdLine.hasSwitch(FLAG_1));
+ Assert.assertEquals(flag2, cmdLine.hasSwitch(FLAG_2));
+ Assert.assertEquals(flag3, cmdLine.hasSwitch(FLAG_3));
+ Assert.assertEquals(flag4, cmdLine.hasSwitch(FLAG_4));
+ Assert.assertEquals(flag5, cmdLine.hasSwitch(FLAG_5));
+ Assert.assertEquals(flag6, cmdLine.hasSwitch(FLAG_6));
+ Assert.assertEquals(flag7, cmdLine.hasSwitch(FLAG_7));
+ }
+
+ private static void verifyClassLevelStateOnly() {
+ verifyCommandLine(true, true, true, true, false, false, false);
+ Assert.assertEquals("foo", CommandLine.getInstance().getSwitchValue("flagwithvalue"));
+ String enabledFeatures = CommandLine.getInstance().getSwitchValue("enable-features");
+ Assert.assertTrue(enabledFeatures.contains("feature1"));
+ Assert.assertTrue(enabledFeatures.contains("feature2"));
+ Assert.assertFalse(
+ CommandLine.getInstance().getSwitchValue("enable-features").contains("feature3"));
+ String disabledFeatures = CommandLine.getInstance().getSwitchValue("disable-features");
+ if (disabledFeatures != null) Assert.assertFalse(disabledFeatures.contains("feature2"));
+ }
+
+ @Test
+ @SmallTest
+ @Feature({"CommandLine"})
+ public void testNoMethodModifications() {
+ verifyClassLevelStateOnly();
+ }
+
+ @Test
+ @SmallTest
+ @Feature({"CommandLine"})
+ @CommandLineFlags.Add({FLAG_1, FLAG_6})
+ public void testMethodAdd() {
+ verifyCommandLine(true, true, true, true, false, true, false);
+ }
+
+ @Test
+ @SmallTest
+ @Feature({"CommandLine"})
+ @CommandLineFlags.Remove({FLAG_4, FLAG_7})
+ public void testMethodRemove() {
+ verifyCommandLine(true, true, true, false, false, false, false);
+ }
+
+ @Test
+ @SmallTest
+ @Feature({"CommandLine"})
+ @CommandLineFlags.Add({"flagwithvalue=bar"})
+ public void testOverrideFlagValue() {
+ Assert.assertEquals("bar", CommandLine.getInstance().getSwitchValue("flagwithvalue"));
+ }
+
+ @Test
+ @SmallTest
+ @Feature({"CommandLine"})
+ @CommandLineFlags.Add({"enable-features=feature3", "disable-features=feature2"})
+ public void testFeatures() {
+ String enabledFeatures = CommandLine.getInstance().getSwitchValue("enable-features");
+ Assert.assertTrue(enabledFeatures.contains("feature1"));
+ Assert.assertTrue(enabledFeatures.contains("feature2"));
+ Assert.assertTrue(enabledFeatures.contains("feature3"));
+ Assert.assertTrue(
+ CommandLine.getInstance().getSwitchValue("disable-features").contains("feature2"));
+ }
+}
diff --git a/chromium/base/android/javatests/src/org/chromium/base/CommandLineInitUtilTest.java b/chromium/base/android/javatests/src/org/chromium/base/CommandLineInitUtilTest.java
new file mode 100644
index 00000000000..448b3a51140
--- /dev/null
+++ b/chromium/base/android/javatests/src/org/chromium/base/CommandLineInitUtilTest.java
@@ -0,0 +1,36 @@
+// Copyright 2016 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base;
+
+import android.support.test.runner.AndroidJUnit4;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.base.test.util.Feature;
+
+/**
+ * Test class for {@link CommandLineInitUtil}.
+ */
+@RunWith(AndroidJUnit4.class)
+public class CommandLineInitUtilTest {
+ /**
+ * Verifies that the default command line flags get set for Chrome Public tests.
+ */
+ @Test
+ @SmallTest
+ @Feature({"CommandLine"})
+ public void testDefaultCommandLineFlagsSet() {
+ CommandLineInitUtil.initCommandLine(CommandLineFlags.getTestCmdLineFile());
+ Assert.assertTrue("CommandLine not initialized.", CommandLine.isInitialized());
+
+ final CommandLine commandLine = CommandLine.getInstance();
+ Assert.assertTrue(commandLine.hasSwitch("enable-test-intents"));
+ }
+}
diff --git a/chromium/base/android/javatests/src/org/chromium/base/CommandLineTest.java b/chromium/base/android/javatests/src/org/chromium/base/CommandLineTest.java
new file mode 100644
index 00000000000..b8a0bc202fe
--- /dev/null
+++ b/chromium/base/android/javatests/src/org/chromium/base/CommandLineTest.java
@@ -0,0 +1,194 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.test.BaseJUnit4ClassRunner;
+import org.chromium.base.test.util.Feature;
+
+import java.util.Map;
+
+/**
+ * Tests for {@link CommandLine}.
+ * TODO(bauerb): Convert to local JUnit test
+ */
+@RunWith(BaseJUnit4ClassRunner.class)
+public class CommandLineTest {
+ // A reference command line. Note that switch2 is [brea\d], switch3 is [and "butter"],
+ // and switch4 is [a "quoted" 'food'!]
+ static final String INIT_SWITCHES[] = { "init_command", "--SWITCH", "Arg",
+ "--switch2=brea\\d", "--switch3=and \"butter\"",
+ "--switch4=a \"quoted\" 'food'!",
+ "--", "--actually_an_arg" };
+
+ // The same command line, but in quoted string format.
+ static final char INIT_SWITCHES_BUFFER[] =
+ ("init_command --SWITCH Arg --switch2=brea\\d --switch3=\"and \\\"butt\"er\\\" "
+ + "--switch4='a \"quoted\" \\'food\\'!' "
+ + "-- --actually_an_arg").toCharArray();
+
+ static final String CL_ADDED_SWITCH = "zappo-dappo-doggy-trainer";
+ static final String CL_ADDED_SWITCH_2 = "username";
+ static final String CL_ADDED_VALUE_2 = "bozo";
+
+ @Before
+ public void setUp() {
+ CommandLine.reset();
+ }
+
+ void checkInitSwitches() {
+ CommandLine cl = CommandLine.getInstance();
+ Assert.assertFalse(cl.hasSwitch("init_command"));
+ Assert.assertFalse(cl.hasSwitch("switch"));
+ Assert.assertTrue(cl.hasSwitch("SWITCH"));
+ Assert.assertFalse(cl.hasSwitch("--SWITCH"));
+ Assert.assertFalse(cl.hasSwitch("Arg"));
+ Assert.assertFalse(cl.hasSwitch("actually_an_arg"));
+ Assert.assertEquals("brea\\d", cl.getSwitchValue("switch2"));
+ Assert.assertEquals("and \"butter\"", cl.getSwitchValue("switch3"));
+ Assert.assertEquals("a \"quoted\" 'food'!", cl.getSwitchValue("switch4"));
+ Assert.assertNull(cl.getSwitchValue("SWITCH"));
+ Assert.assertNull(cl.getSwitchValue("non-existant"));
+ }
+
+ void checkSettingThenGettingThenRemoving() {
+ CommandLine cl = CommandLine.getInstance();
+
+ // Add a plain switch.
+ Assert.assertFalse(cl.hasSwitch(CL_ADDED_SWITCH));
+ cl.appendSwitch(CL_ADDED_SWITCH);
+ Assert.assertTrue(cl.hasSwitch(CL_ADDED_SWITCH));
+
+ // Add a switch paired with a value.
+ Assert.assertFalse(cl.hasSwitch(CL_ADDED_SWITCH_2));
+ Assert.assertNull(cl.getSwitchValue(CL_ADDED_SWITCH_2));
+ cl.appendSwitchWithValue(CL_ADDED_SWITCH_2, CL_ADDED_VALUE_2);
+ Assert.assertEquals(CL_ADDED_VALUE_2, cl.getSwitchValue(CL_ADDED_SWITCH_2));
+
+ // Update a switch's value.
+ cl.appendSwitchWithValue(CL_ADDED_SWITCH_2, "updatedValue");
+ Assert.assertEquals("updatedValue", cl.getSwitchValue(CL_ADDED_SWITCH_2));
+
+ // Append a few new things.
+ final String switchesAndArgs[] = { "dummy", "--superfast", "--speed=turbo" };
+ Assert.assertFalse(cl.hasSwitch("dummy"));
+ Assert.assertFalse(cl.hasSwitch("superfast"));
+ Assert.assertNull(cl.getSwitchValue("speed"));
+ cl.appendSwitchesAndArguments(switchesAndArgs);
+ Assert.assertFalse(cl.hasSwitch("dummy"));
+ Assert.assertFalse(cl.hasSwitch("command"));
+ Assert.assertTrue(cl.hasSwitch("superfast"));
+ Assert.assertEquals("turbo", cl.getSwitchValue("speed"));
+
+ // Get all switches
+ Map<String, String> switches = cl.getSwitches();
+ Assert.assertTrue(switches.containsKey(CL_ADDED_SWITCH));
+ Assert.assertTrue(switches.containsKey(CL_ADDED_SWITCH_2));
+
+ // Remove a plain switch.
+ cl.removeSwitch(CL_ADDED_SWITCH);
+ Assert.assertFalse(cl.hasSwitch(CL_ADDED_SWITCH));
+
+ // Remove a switch with a value.
+ cl.removeSwitch(CL_ADDED_SWITCH_2);
+ Assert.assertFalse(cl.hasSwitch(CL_ADDED_SWITCH_2));
+ Assert.assertNull(cl.getSwitchValue(CL_ADDED_SWITCH_2));
+
+ // Get all switches again to verify it updated.
+ switches = cl.getSwitches();
+ Assert.assertFalse(switches.containsKey(CL_ADDED_SWITCH));
+ Assert.assertFalse(switches.containsKey(CL_ADDED_SWITCH_2));
+ }
+
+ void checkTokenizer(String[] expected, String toParse) {
+ String[] actual = CommandLine.tokenizeQuotedArguments(toParse.toCharArray());
+ Assert.assertEquals(expected.length, actual.length);
+ for (int i = 0; i < expected.length; ++i) {
+ Assert.assertEquals("comparing element " + i, expected[i], actual[i]);
+ }
+ }
+
+ @Test
+ @SmallTest
+ @Feature({"Android-AppBase"})
+ public void testJavaInitialization() {
+ CommandLine.init(INIT_SWITCHES);
+ checkInitSwitches();
+ checkSettingThenGettingThenRemoving();
+ }
+
+ @Test
+ @SmallTest
+ @Feature({"Android-AppBase"})
+ public void testBufferInitialization() {
+ CommandLine.init(CommandLine.tokenizeQuotedArguments(INIT_SWITCHES_BUFFER));
+ checkInitSwitches();
+ checkSettingThenGettingThenRemoving();
+ }
+
+ @Test
+ @SmallTest
+ @Feature({"Android-AppBase"})
+ public void testArgumentTokenizer() {
+ String toParse = " a\"\\bc de\\\"f g\"\\h ij k\" \"lm";
+ String[] expected = { "a\\bc de\"f g\\h",
+ "ij",
+ "k lm" };
+ checkTokenizer(expected, toParse);
+
+ toParse = "";
+ expected = new String[0];
+ checkTokenizer(expected, toParse);
+
+ toParse = " \t\n";
+ checkTokenizer(expected, toParse);
+
+ toParse = " \"a'b\" 'c\"d' \"e\\\"f\" 'g\\'h' \"i\\'j\" 'k\\\"l'"
+ + " m\"n\\'o\"p q'r\\\"s't";
+ expected = new String[] { "a'b",
+ "c\"d",
+ "e\"f",
+ "g'h",
+ "i\\'j",
+ "k\\\"l",
+ "mn\\'op",
+ "qr\\\"st"};
+ checkTokenizer(expected, toParse);
+ }
+
+ @Test
+ @SmallTest
+ @Feature({"Android-AppBase"})
+ public void testUpdatingArgList() {
+ CommandLine.init(null);
+ CommandLine cl = CommandLine.getInstance();
+ cl.appendSwitch(CL_ADDED_SWITCH);
+ cl.appendSwitchWithValue(CL_ADDED_SWITCH_2, CL_ADDED_VALUE_2);
+ cl.appendSwitchWithValue(CL_ADDED_SWITCH_2, "updatedValue");
+
+ final String[] expectedValueForBothSwitches = {
+ "",
+ "--" + CL_ADDED_SWITCH,
+ "--" + CL_ADDED_SWITCH_2 + "=" + CL_ADDED_VALUE_2,
+ "--" + CL_ADDED_SWITCH_2 + "=updatedValue",
+ };
+ Assert.assertArrayEquals("Appending a switch multiple times should add multiple args",
+ expectedValueForBothSwitches, CommandLine.getJavaSwitchesOrNull());
+
+ cl.removeSwitch(CL_ADDED_SWITCH_2);
+ final String[] expectedValueWithSecondSwitchRemoved = {
+ "",
+ "--" + CL_ADDED_SWITCH,
+ };
+ Assert.assertArrayEquals("Removing a switch should remove all its args",
+ expectedValueWithSecondSwitchRemoved, CommandLine.getJavaSwitchesOrNull());
+ }
+}
diff --git a/chromium/base/android/javatests/src/org/chromium/base/EarlyTraceEventTest.java b/chromium/base/android/javatests/src/org/chromium/base/EarlyTraceEventTest.java
new file mode 100644
index 00000000000..47e572d35ed
--- /dev/null
+++ b/chromium/base/android/javatests/src/org/chromium/base/EarlyTraceEventTest.java
@@ -0,0 +1,272 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base;
+
+import android.os.Process;
+import android.os.SystemClock;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.EarlyTraceEvent.AsyncEvent;
+import org.chromium.base.EarlyTraceEvent.Event;
+import org.chromium.base.library_loader.LibraryLoader;
+import org.chromium.base.test.BaseJUnit4ClassRunner;
+import org.chromium.base.test.util.Feature;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Tests for {@link EarlyTraceEvent}.
+ *
+ * TODO(lizeb): Move to robolectric tests.
+ */
+@RunWith(BaseJUnit4ClassRunner.class)
+public class EarlyTraceEventTest {
+ private static final String EVENT_NAME = "MyEvent";
+ private static final String EVENT_NAME2 = "MyOtherEvent";
+ private static final long EVENT_ID = 1;
+
+ @Before
+ public void setUp() {
+ LibraryLoader.getInstance().ensureInitialized();
+ EarlyTraceEvent.reset();
+ }
+
+ @Test
+ @SmallTest
+ @Feature({"Android-AppBase"})
+ public void testCanRecordEvent() {
+ EarlyTraceEvent.enable();
+ long myThreadId = Process.myTid();
+ long beforeNanos = System.nanoTime();
+ long beforeThreadMillis = SystemClock.currentThreadTimeMillis();
+ EarlyTraceEvent.begin(EVENT_NAME, false /*isToplevel*/);
+ EarlyTraceEvent.end(EVENT_NAME, false /*isToplevel*/);
+ Assert.assertTrue(EarlyTraceEvent.enabled());
+ long afterNanos = System.nanoTime();
+ long afterThreadMillis = SystemClock.currentThreadTimeMillis();
+
+ List<Event> matchingEvents =
+ EarlyTraceEvent.getMatchingCompletedEventsForTesting(EVENT_NAME);
+ Assert.assertEquals(2, matchingEvents.size());
+ Event beginEvent = matchingEvents.get(0);
+ Event endEvent = matchingEvents.get(1);
+ Assert.assertEquals(EVENT_NAME, beginEvent.mName);
+ Assert.assertEquals(myThreadId, beginEvent.mThreadId);
+ Assert.assertEquals(EVENT_NAME, endEvent.mName);
+ Assert.assertEquals(myThreadId, endEvent.mThreadId);
+ Assert.assertFalse(beginEvent.mIsToplevel);
+ Assert.assertFalse(endEvent.mIsToplevel);
+ Assert.assertTrue(beforeNanos <= beginEvent.mTimeNanos);
+ Assert.assertTrue(endEvent.mTimeNanos <= afterNanos);
+ Assert.assertTrue(beforeThreadMillis <= beginEvent.mThreadTimeMillis);
+ Assert.assertTrue(endEvent.mThreadTimeMillis <= afterThreadMillis);
+ }
+
+ @Test
+ @SmallTest
+ @Feature({"Android-AppBase"})
+ public void testCanRecordAsyncEvent() {
+ EarlyTraceEvent.enable();
+ long beforeNanos = System.nanoTime();
+ EarlyTraceEvent.startAsync(EVENT_NAME, EVENT_ID);
+ EarlyTraceEvent.finishAsync(EVENT_NAME, EVENT_ID);
+ long afterNanos = System.nanoTime();
+
+ List<AsyncEvent> matchingEvents = new ArrayList<AsyncEvent>();
+ synchronized (EarlyTraceEvent.sLock) {
+ for (AsyncEvent evt : EarlyTraceEvent.sAsyncEvents) {
+ if (evt.mName.equals(EVENT_NAME)) {
+ matchingEvents.add(evt);
+ }
+ }
+ }
+ Assert.assertEquals(2, matchingEvents.size());
+ AsyncEvent eventStart = matchingEvents.get(0);
+ AsyncEvent eventEnd = matchingEvents.get(1);
+ Assert.assertEquals(EVENT_NAME, eventStart.mName);
+ Assert.assertEquals(EVENT_ID, eventStart.mId);
+ Assert.assertEquals(EVENT_NAME, eventEnd.mName);
+ Assert.assertEquals(EVENT_ID, eventEnd.mId);
+ Assert.assertTrue(
+ beforeNanos <= eventStart.mTimeNanos && eventEnd.mTimeNanos <= afterNanos);
+ Assert.assertTrue(eventStart.mTimeNanos <= eventEnd.mTimeNanos);
+ }
+
+ @Test
+ @SmallTest
+ @Feature({"Android-AppBase"})
+ public void testCanRecordEventUsingTryWith() {
+ EarlyTraceEvent.enable();
+ long myThreadId = Process.myTid();
+ long beforeNanos = System.nanoTime();
+ try (TraceEvent e = TraceEvent.scoped(EVENT_NAME)) {
+ // Required comment to pass presubmit checks.
+ }
+ long afterNanos = System.nanoTime();
+
+ List<Event> matchingEvents =
+ EarlyTraceEvent.getMatchingCompletedEventsForTesting(EVENT_NAME);
+ Assert.assertEquals(2, matchingEvents.size());
+ Event beginEvent = matchingEvents.get(0);
+ Event endEvent = matchingEvents.get(1);
+ Assert.assertEquals(EVENT_NAME, beginEvent.mName);
+ Assert.assertEquals(myThreadId, beginEvent.mThreadId);
+ Assert.assertEquals(EVENT_NAME, endEvent.mName);
+ Assert.assertEquals(myThreadId, endEvent.mThreadId);
+ Assert.assertTrue(beforeNanos <= beginEvent.mTimeNanos);
+ Assert.assertTrue(endEvent.mTimeNanos <= afterNanos);
+ }
+
+ @Test
+ @SmallTest
+ @Feature({"Android-AppBase"})
+ public void testIncompleteEvent() {
+ EarlyTraceEvent.enable();
+ EarlyTraceEvent.begin(EVENT_NAME, true /*isToplevel*/);
+
+ List<Event> matchingEvents =
+ EarlyTraceEvent.getMatchingCompletedEventsForTesting(EVENT_NAME);
+ Assert.assertEquals(1, matchingEvents.size());
+ Event beginEvent = matchingEvents.get(0);
+ Assert.assertEquals(EVENT_NAME, beginEvent.mName);
+ Assert.assertTrue(beginEvent.mIsToplevel);
+ }
+
+ @Test
+ @SmallTest
+ @Feature({"Android-AppBase"})
+ public void testIgnoreEventsWhenDisabled() {
+ EarlyTraceEvent.begin(EVENT_NAME, false /*isToplevel*/);
+ EarlyTraceEvent.end(EVENT_NAME, false /*isToplevel*/);
+ try (TraceEvent e = TraceEvent.scoped(EVENT_NAME2)) {
+ // Required comment to pass presubmit checks.
+ }
+ synchronized (EarlyTraceEvent.sLock) {
+ Assert.assertNull(EarlyTraceEvent.sEvents);
+ }
+ }
+
+ @Test
+ @SmallTest
+ @Feature({"Android-AppBase"})
+ public void testIgnoreAsyncEventsWhenDisabled() {
+ EarlyTraceEvent.startAsync(EVENT_NAME, EVENT_ID);
+ EarlyTraceEvent.finishAsync(EVENT_NAME, EVENT_ID);
+ synchronized (EarlyTraceEvent.sLock) {
+ Assert.assertNull(EarlyTraceEvent.sAsyncEvents);
+ }
+ }
+
+ @Test
+ @SmallTest
+ @Feature({"Android-AppBase"})
+ public void testCannotBeReenabledOnceFinished() {
+ EarlyTraceEvent.enable();
+ EarlyTraceEvent.begin(EVENT_NAME, false /*isToplevel*/);
+ EarlyTraceEvent.end(EVENT_NAME, false /*isToplevel*/);
+ EarlyTraceEvent.disable();
+ Assert.assertEquals(EarlyTraceEvent.STATE_FINISHED, EarlyTraceEvent.sState);
+
+ EarlyTraceEvent.enable();
+ Assert.assertEquals(EarlyTraceEvent.STATE_FINISHED, EarlyTraceEvent.sState);
+ }
+
+ @Test
+ @SmallTest
+ @Feature({"Android-AppBase"})
+ public void testThreadIdIsRecorded() throws Exception {
+ EarlyTraceEvent.enable();
+ final long[] threadId = {0};
+
+ Thread thread = new Thread() {
+ @Override
+ public void run() {
+ TraceEvent.begin(EVENT_NAME);
+ threadId[0] = Process.myTid();
+ TraceEvent.end(EVENT_NAME);
+ }
+ };
+ thread.start();
+ thread.join();
+
+ List<Event> matchingEvents =
+ EarlyTraceEvent.getMatchingCompletedEventsForTesting(EVENT_NAME);
+ Assert.assertEquals(2, matchingEvents.size());
+ Event beginEvent = matchingEvents.get(0);
+ Event endEvent = matchingEvents.get(1);
+ Assert.assertEquals(threadId[0], beginEvent.mThreadId);
+ Assert.assertEquals(threadId[0], endEvent.mThreadId);
+ }
+
+ @Test
+ @SmallTest
+ @Feature({"Android-AppBase"})
+ public void testEnableAtStartup() {
+ ThreadUtils.setThreadAssertsDisabledForTesting(true);
+ EarlyTraceEvent.maybeEnableInBrowserProcess();
+ Assert.assertFalse(EarlyTraceEvent.enabled());
+ EarlyTraceEvent.setBackgroundStartupTracingFlag(false);
+ Assert.assertFalse(EarlyTraceEvent.enabled());
+
+ EarlyTraceEvent.setBackgroundStartupTracingFlag(true);
+ EarlyTraceEvent.maybeEnableInBrowserProcess();
+ Assert.assertTrue(EarlyTraceEvent.getBackgroundStartupTracingFlag());
+ Assert.assertTrue(EarlyTraceEvent.enabled());
+ EarlyTraceEvent.disable();
+ EarlyTraceEvent.setBackgroundStartupTracingFlag(false);
+ }
+
+ @Test
+ @SmallTest
+ @Feature({"Android-AppBase"})
+ public void testUserOverrideBackgroundTracing() {
+ ThreadUtils.setThreadAssertsDisabledForTesting(true);
+ // Setting command line should disable the background tracing flag.
+ CommandLine.getInstance().appendSwitch("trace-startup");
+ EarlyTraceEvent.setBackgroundStartupTracingFlag(true);
+ EarlyTraceEvent.maybeEnableInBrowserProcess();
+ Assert.assertFalse(EarlyTraceEvent.getBackgroundStartupTracingFlag());
+ Assert.assertTrue(EarlyTraceEvent.enabled());
+ EarlyTraceEvent.disable();
+ EarlyTraceEvent.setBackgroundStartupTracingFlag(false);
+ }
+
+ @Test
+ @SmallTest
+ @Feature({"Android-AppBase"})
+ public void testEnableInChildProcess() {
+ ThreadUtils.setThreadAssertsDisabledForTesting(true);
+ EarlyTraceEvent.earlyEnableInChildWithoutCommandLine();
+ Assert.assertTrue(EarlyTraceEvent.enabled());
+ CommandLine.getInstance().appendSwitch("trace-early-java-in-child");
+ EarlyTraceEvent.onCommandLineAvailableInChildProcess();
+ Assert.assertTrue(EarlyTraceEvent.enabled());
+
+ // Eliminate side effects.
+ CommandLine.getInstance().removeSwitch("trace-early-java-in-child");
+ }
+
+ @Test
+ @SmallTest
+ @Feature({"Android-AppBase"})
+ public void testEnableInChildProcessCommandLineLaterOverrides() {
+ ThreadUtils.setThreadAssertsDisabledForTesting(true);
+ EarlyTraceEvent.earlyEnableInChildWithoutCommandLine();
+ Assert.assertTrue(EarlyTraceEvent.enabled());
+ CommandLine.getInstance().removeSwitch("trace-early-java-in-child");
+ EarlyTraceEvent.onCommandLineAvailableInChildProcess();
+ Assert.assertFalse(EarlyTraceEvent.enabled());
+ synchronized (EarlyTraceEvent.sLock) {
+ Assert.assertNull(EarlyTraceEvent.sEvents);
+ }
+ }
+}
diff --git a/chromium/base/android/javatests/src/org/chromium/base/IntentUtilsTest.java b/chromium/base/android/javatests/src/org/chromium/base/IntentUtilsTest.java
new file mode 100644
index 00000000000..c89141df97f
--- /dev/null
+++ b/chromium/base/android/javatests/src/org/chromium/base/IntentUtilsTest.java
@@ -0,0 +1,81 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Assert;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.mockito.quality.Strictness;
+
+import org.chromium.base.test.BaseJUnit4ClassRunner;
+import org.chromium.base.test.util.Batch;
+import org.chromium.build.BuildConfig;
+
+/**
+ * Tests for {@link IntentUtils}.
+ */
+@RunWith(BaseJUnit4ClassRunner.class)
+@Batch(Batch.UNIT_TESTS)
+public class IntentUtilsTest {
+ @Mock
+ private Context mContext;
+
+ @Rule
+ public MockitoRule mMockitoRule = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS);
+
+ private void assertTargetsSelf(boolean targetsSelf, Intent intent, boolean expectAssertion) {
+ boolean asserted = false;
+ try {
+ Assert.assertEquals(targetsSelf, IntentUtils.intentTargetsSelf(mContext, intent));
+ } catch (AssertionError e) {
+ asserted = true;
+ if (!expectAssertion) throw e;
+ }
+ if (BuildConfig.ENABLE_ASSERTS) Assert.assertEquals(expectAssertion, asserted);
+ }
+
+ @Test
+ @SmallTest
+ public void testIntentTargetsSelf() {
+ String packageName = "package.name";
+ Mockito.when(mContext.getPackageName()).thenReturn(packageName);
+ assertTargetsSelf(false, new Intent(), false);
+ assertTargetsSelf(true, new Intent(mContext, IntentUtilsTest.class), false);
+
+ Intent intent = new Intent();
+ intent.setComponent(new ComponentName(packageName, ""));
+ assertTargetsSelf(true, intent, false);
+
+ intent.setComponent(
+ new ComponentName("other.package", "org.chromium.base.IntentUtilsTest"));
+ assertTargetsSelf(false, intent, false);
+
+ intent.setPackage(packageName);
+ assertTargetsSelf(false, intent, true);
+
+ intent.setComponent(null);
+ assertTargetsSelf(true, intent, false);
+
+ intent.setPackage("other.package");
+ assertTargetsSelf(false, intent, false);
+
+ intent.setComponent(new ComponentName(packageName, ""));
+ assertTargetsSelf(false, intent, true);
+
+ intent.setPackage(null);
+ assertTargetsSelf(true, intent, false);
+ }
+}
diff --git a/chromium/base/android/javatests/src/org/chromium/base/LocaleUtilsTest.java b/chromium/base/android/javatests/src/org/chromium/base/LocaleUtilsTest.java
new file mode 100644
index 00000000000..4aed4cb4a48
--- /dev/null
+++ b/chromium/base/android/javatests/src/org/chromium/base/LocaleUtilsTest.java
@@ -0,0 +1,395 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base;
+
+import android.annotation.SuppressLint;
+import android.content.res.Configuration;
+import android.os.Build;
+import android.os.LocaleList;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.test.BaseJUnit4ClassRunner;
+import org.chromium.base.test.util.MinAndroidSdkLevel;
+
+import java.util.Locale;
+
+/**
+ * Tests for the LocaleUtils class.
+ */
+@RunWith(BaseJUnit4ClassRunner.class)
+public class LocaleUtilsTest {
+ // This is also a part of test for toLanguageTag when API level is lower than 24
+ @Test
+ @SmallTest
+ public void testGetUpdatedLanguageForChromium() {
+ String language = "en";
+ String updatedLanguage = LocaleUtils.getUpdatedLanguageForChromium(language);
+ Assert.assertEquals(language, updatedLanguage);
+
+ language = "iw";
+ updatedLanguage = LocaleUtils.getUpdatedLanguageForChromium(language);
+ Assert.assertEquals("he", updatedLanguage);
+
+ language = "ji";
+ updatedLanguage = LocaleUtils.getUpdatedLanguageForChromium(language);
+ Assert.assertEquals("yi", updatedLanguage);
+
+ language = "in";
+ updatedLanguage = LocaleUtils.getUpdatedLanguageForChromium(language);
+ Assert.assertEquals("id", updatedLanguage);
+
+ language = "tl";
+ updatedLanguage = LocaleUtils.getUpdatedLanguageForChromium(language);
+ Assert.assertEquals("fil", updatedLanguage);
+ }
+
+ // This is also a part of test for toLanguageTags when API level is 24 or higher
+ @Test
+ @SmallTest
+ @MinAndroidSdkLevel(Build.VERSION_CODES.LOLLIPOP)
+ public void testGetUpdatedLocaleForChromium() {
+ Locale locale = new Locale("jp");
+ Locale updatedLocale = LocaleUtils.getUpdatedLocaleForChromium(locale);
+ Assert.assertEquals(locale, updatedLocale);
+
+ locale = new Locale("iw");
+ updatedLocale = LocaleUtils.getUpdatedLocaleForChromium(locale);
+ Assert.assertEquals(new Locale("he"), updatedLocale);
+
+ locale = new Locale("ji");
+ updatedLocale = LocaleUtils.getUpdatedLocaleForChromium(locale);
+ Assert.assertEquals(new Locale("yi"), updatedLocale);
+
+ locale = new Locale("in");
+ updatedLocale = LocaleUtils.getUpdatedLocaleForChromium(locale);
+ Assert.assertEquals(new Locale("id"), updatedLocale);
+
+ locale = new Locale("tl");
+ updatedLocale = LocaleUtils.getUpdatedLocaleForChromium(locale);
+ Assert.assertEquals(new Locale("fil"), updatedLocale);
+ }
+
+ // This is also a part of test for forLanguageTag when API level is lower than 21
+ @Test
+ @SmallTest
+ public void testGetUpdatedLanguageForAndroid() {
+ String language = "en";
+ String updatedLanguage = LocaleUtils.getUpdatedLanguageForAndroid(language);
+ Assert.assertEquals(language, updatedLanguage);
+
+ language = "und";
+ updatedLanguage = LocaleUtils.getUpdatedLanguageForAndroid(language);
+ Assert.assertEquals("", updatedLanguage);
+
+ language = "fil";
+ updatedLanguage = LocaleUtils.getUpdatedLanguageForAndroid(language);
+ Assert.assertEquals("tl", updatedLanguage);
+ }
+
+ // This is also a part of test for forLanguageTag when API level is 21 or higher
+ @Test
+ @SmallTest
+ @MinAndroidSdkLevel(Build.VERSION_CODES.LOLLIPOP)
+ public void testGetUpdatedLocaleForAndroid() {
+ Locale locale = new Locale("jp");
+ Locale updatedLocale = LocaleUtils.getUpdatedLocaleForAndroid(locale);
+ Assert.assertEquals(locale, updatedLocale);
+
+ locale = new Locale("und");
+ updatedLocale = LocaleUtils.getUpdatedLocaleForAndroid(locale);
+ Assert.assertEquals(new Locale(""), updatedLocale);
+
+ locale = new Locale("fil");
+ updatedLocale = LocaleUtils.getUpdatedLocaleForAndroid(locale);
+ Assert.assertEquals(new Locale("tl"), updatedLocale);
+ }
+
+ // Test for toLanguageTag when API level is lower than 24
+ @Test
+ @SmallTest
+ public void testToLanguageTag() {
+ Locale locale = new Locale("en", "US");
+ String localeString = LocaleUtils.toLanguageTag(locale);
+ Assert.assertEquals("en-US", localeString);
+
+ locale = new Locale("jp");
+ localeString = LocaleUtils.toLanguageTag(locale);
+ Assert.assertEquals("jp", localeString);
+
+ locale = new Locale("mas");
+ localeString = LocaleUtils.toLanguageTag(locale);
+ Assert.assertEquals("mas", localeString);
+
+ locale = new Locale("es", "005");
+ localeString = LocaleUtils.toLanguageTag(locale);
+ Assert.assertEquals("es-005", localeString);
+
+ locale = new Locale("iw");
+ localeString = LocaleUtils.toLanguageTag(locale);
+ Assert.assertEquals("he", localeString);
+
+ locale = new Locale("ji");
+ localeString = LocaleUtils.toLanguageTag(locale);
+ Assert.assertEquals("yi", localeString);
+
+ locale = new Locale("in", "ID");
+ localeString = LocaleUtils.toLanguageTag(locale);
+ Assert.assertEquals("id-ID", localeString);
+
+ locale = new Locale("tl", "PH");
+ localeString = LocaleUtils.toLanguageTag(locale);
+ Assert.assertEquals("fil-PH", localeString);
+
+ locale = new Locale("no", "NO", "NY");
+ localeString = LocaleUtils.toLanguageTag(locale);
+ Assert.assertEquals("nn-NO", localeString);
+ }
+
+ // Test for toLanguageTags when API level is 24 or higher
+ @Test
+ @SmallTest
+ @MinAndroidSdkLevel(Build.VERSION_CODES.N)
+ @SuppressLint("NewApi")
+ public void testToLanguageTags() {
+ Locale locale1 = new Locale("en", "US");
+ Locale locale2 = new Locale("es", "005");
+ LocaleList localeList = new LocaleList(locale1, locale2);
+ String localeString = LocaleUtils.toLanguageTags(localeList);
+ Assert.assertEquals("en-US,es-005", localeString);
+
+ locale1 = new Locale("jp");
+ locale2 = new Locale("mas");
+ localeList = new LocaleList(locale1, locale2);
+ localeString = LocaleUtils.toLanguageTags(localeList);
+ Assert.assertEquals("jp,mas", localeString);
+
+ locale1 = new Locale("iw");
+ locale2 = new Locale("ji");
+ localeList = new LocaleList(locale1, locale2);
+ localeString = LocaleUtils.toLanguageTags(localeList);
+ Assert.assertEquals("he,yi", localeString);
+
+ locale1 = new Locale("in", "ID");
+ locale2 = new Locale("tl", "PH");
+ localeList = new LocaleList(locale1, locale2);
+ localeString = LocaleUtils.toLanguageTags(localeList);
+ Assert.assertEquals("id-ID,fil-PH", localeString);
+
+ locale1 = new Locale("no", "NO", "NY");
+ localeList = new LocaleList(locale1);
+ localeString = LocaleUtils.toLanguageTags(localeList);
+ Assert.assertEquals("nn-NO", localeString);
+ }
+
+ // Test for forLanguageTag when API level is lower than 21
+ @Test
+ @SmallTest
+ public void testForLanguageTagCompat() {
+ String languageTag = "";
+ Locale locale = new Locale("");
+ Assert.assertEquals(locale, LocaleUtils.forLanguageTagCompat(languageTag));
+
+ languageTag = "und";
+ locale = new Locale("");
+ Assert.assertEquals(locale, LocaleUtils.forLanguageTagCompat(languageTag));
+
+ languageTag = "en";
+ locale = new Locale("en");
+ Assert.assertEquals(locale, LocaleUtils.forLanguageTagCompat(languageTag));
+
+ languageTag = "mas";
+ locale = new Locale("mas");
+ Assert.assertEquals(locale, LocaleUtils.forLanguageTagCompat(languageTag));
+
+ languageTag = "en-GB";
+ locale = new Locale("en", "GB");
+ Assert.assertEquals(locale, LocaleUtils.forLanguageTagCompat(languageTag));
+
+ languageTag = "es-419";
+ locale = new Locale("es", "419");
+ Assert.assertEquals(locale, LocaleUtils.forLanguageTagCompat(languageTag));
+
+ // Tests if updated Chromium language code and deprecated language code
+ // are pointing to the same Locale Object.
+ languageTag = "he";
+ locale = new Locale("iw");
+ Assert.assertEquals(locale, LocaleUtils.forLanguageTagCompat(languageTag));
+
+ languageTag = "iw";
+ locale = new Locale("he");
+ Assert.assertEquals(locale, LocaleUtils.forLanguageTagCompat(languageTag));
+
+ languageTag = "ji";
+ locale = new Locale("yi");
+ Assert.assertEquals(locale, LocaleUtils.forLanguageTagCompat(languageTag));
+
+ languageTag = "yi";
+ locale = new Locale("ji");
+ Assert.assertEquals(locale, LocaleUtils.forLanguageTagCompat(languageTag));
+
+ languageTag = "in";
+ locale = new Locale("id");
+ Assert.assertEquals(locale, LocaleUtils.forLanguageTagCompat(languageTag));
+
+ languageTag = "id";
+ locale = new Locale("in");
+ Assert.assertEquals(locale, LocaleUtils.forLanguageTagCompat(languageTag));
+
+ // Tests for Tagalog/Filipino if updated Chromium language code and
+ // language code are pointing to the same Locale Object.
+ languageTag = "tl";
+ locale = new Locale("tl");
+ Assert.assertEquals(locale, LocaleUtils.forLanguageTagCompat(languageTag));
+
+ languageTag = "fil";
+ locale = new Locale("tl");
+ Assert.assertEquals(locale, LocaleUtils.forLanguageTagCompat(languageTag));
+
+ // Test with invalid inputs.
+ languageTag = "notValidLanguage";
+ locale = new Locale("");
+ Assert.assertEquals(locale, LocaleUtils.forLanguageTagCompat(languageTag));
+
+ languageTag = "en-notValidCountry";
+ locale = new Locale("en");
+ Assert.assertEquals(locale, LocaleUtils.forLanguageTagCompat(languageTag));
+ }
+
+ // Test for toLanguage.
+ @Test
+ @SmallTest
+ public void testToLanguage() {
+ Assert.assertEquals("en", LocaleUtils.toBaseLanguage("en-US"));
+ Assert.assertEquals("en", LocaleUtils.toBaseLanguage("en"));
+ Assert.assertEquals("", LocaleUtils.toBaseLanguage("-"));
+ Assert.assertEquals("", LocaleUtils.toBaseLanguage("-US"));
+ Assert.assertEquals("", LocaleUtils.toBaseLanguage(""));
+ Assert.assertEquals("fil", LocaleUtils.toBaseLanguage("fil"));
+ }
+
+ // Test for isBaseLanguageEqual
+ @Test
+ @SmallTest
+ public void testIsBaseLanguageEqual() {
+ Assert.assertTrue(LocaleUtils.isBaseLanguageEqual("pt-PT", "pt-PT"));
+ Assert.assertTrue(LocaleUtils.isBaseLanguageEqual("pt-PT", "pt"));
+ Assert.assertTrue(LocaleUtils.isBaseLanguageEqual("pt", "pt-PT-xx"));
+ Assert.assertTrue(LocaleUtils.isBaseLanguageEqual("zh-Hans-CN", "zh-HK"));
+ Assert.assertTrue(LocaleUtils.isBaseLanguageEqual("", ""));
+
+ Assert.assertFalse(LocaleUtils.isBaseLanguageEqual("en-US", "es-US"));
+ Assert.assertFalse(LocaleUtils.isBaseLanguageEqual("af", "zu"));
+ Assert.assertFalse(LocaleUtils.isBaseLanguageEqual("af", ""));
+ Assert.assertFalse(LocaleUtils.isBaseLanguageEqual("", "zu"));
+ }
+
+ // Test for getConfigurationLocale < N
+ @Test
+ @SmallTest
+ public void testGetConfigurationLocale() {
+ Configuration config = new Configuration();
+ Assert.assertEquals("", LocaleUtils.getConfigurationLanguage(config));
+
+ config.setLocale(Locale.forLanguageTag("hi-IN"));
+ Assert.assertEquals("hi-IN", LocaleUtils.getConfigurationLanguage(config));
+
+ config.setLocale(new Locale("ar"));
+ Assert.assertEquals("ar", LocaleUtils.getConfigurationLanguage(config));
+ }
+
+ // Test for getConfigurationLocale N+ (with LocaleList)
+ @Test
+ @SmallTest
+ @MinAndroidSdkLevel(Build.VERSION_CODES.N)
+ public void testGetConfigurationN() {
+ Configuration config = new Configuration();
+
+ Locale locale1 = new Locale("hi", "IN");
+ Locale locale2 = new Locale("tl", "PH");
+ LocaleList localeList = new LocaleList(locale1, locale2);
+ config.setLocales(localeList);
+ Assert.assertEquals("hi-IN", LocaleUtils.getConfigurationLanguage(config));
+
+ locale1 = new Locale("ceb");
+ locale2 = new Locale("tl", "PH");
+ localeList = new LocaleList(locale1, locale2);
+ config.setLocales(localeList);
+ Assert.assertEquals("ceb", LocaleUtils.getConfigurationLanguage(config));
+ }
+
+ // Test for setDefaultLocalesFromConfiguration
+ @Test
+ @SmallTest
+ public void testSetDefaultLocalesFromConfiguration() {
+ Configuration config = new Configuration();
+ config.setLocale(new Locale("tl", "PH"));
+ LocaleUtils.setDefaultLocalesFromConfiguration(config);
+ Assert.assertEquals("tl-PH", Locale.getDefault().toLanguageTag());
+
+ config.setLocale(new Locale("es", "AR"));
+ LocaleUtils.setDefaultLocalesFromConfiguration(config);
+ Assert.assertEquals("es-AR", Locale.getDefault().toLanguageTag());
+ }
+
+ // Test for setDefaultLocalesFromConfiguration N+ (with LocaleList)
+ @Test
+ @SmallTest
+ @MinAndroidSdkLevel(Build.VERSION_CODES.N)
+ public void testSetDefaultLocalesFromConfigurationN() {
+ Configuration config = new Configuration();
+ String tags = "tl-PH,es-AR,en";
+ config.setLocales(LocaleList.forLanguageTags(tags));
+ LocaleUtils.setDefaultLocalesFromConfiguration(config);
+ Assert.assertEquals("tl-PH", Locale.getDefault().toLanguageTag());
+ Assert.assertEquals(tags, LocaleList.getDefault().toLanguageTags());
+
+ tags = "en,en-US,en-GB";
+ config.setLocales(LocaleList.forLanguageTags(tags));
+ LocaleUtils.setDefaultLocalesFromConfiguration(config);
+ Assert.assertEquals("en", Locale.getDefault().toLanguageTag());
+ Assert.assertEquals(tags, LocaleList.getDefault().toLanguageTags());
+ }
+
+ // Test for prependToLocaleList
+ @Test
+ @SmallTest
+ @MinAndroidSdkLevel(Build.VERSION_CODES.N)
+ public void testPrependToLocaleList() {
+ // Prepend to empty list
+ LocaleList resultList = LocaleUtils.ApisN.prependToLocaleList("ceb-PH", new LocaleList());
+ Assert.assertEquals("ceb-PH", resultList.toLanguageTags());
+
+ // Prepend and not in list
+ LocaleList baseList = LocaleList.forLanguageTags("en,es-ES,fr");
+ resultList = LocaleUtils.ApisN.prependToLocaleList("zu", baseList);
+ Assert.assertEquals("zu,en,es-ES,fr", resultList.toLanguageTags());
+
+ // Prepend and in middle of list
+ resultList = LocaleUtils.ApisN.prependToLocaleList("es-ES", baseList);
+ Assert.assertEquals("es-ES,en,fr", resultList.toLanguageTags());
+
+ // Prepend and at end of list
+ resultList = LocaleUtils.ApisN.prependToLocaleList("fr", baseList);
+ Assert.assertEquals("fr,en,es-ES", resultList.toLanguageTags());
+
+ // Prepend and at front of list
+ resultList = LocaleUtils.ApisN.prependToLocaleList("en", baseList);
+ Assert.assertEquals("en,es-ES,fr", resultList.toLanguageTags());
+
+ // Prepend to list of one
+ baseList = LocaleList.forLanguageTags("fr");
+ resultList = LocaleUtils.ApisN.prependToLocaleList("en", baseList);
+ Assert.assertEquals("en,fr", resultList.toLanguageTags());
+
+ // Prepend to list of one (self)
+ resultList = LocaleUtils.ApisN.prependToLocaleList("fr", baseList);
+ Assert.assertEquals("fr", resultList.toLanguageTags());
+ }
+}
diff --git a/chromium/base/android/javatests/src/org/chromium/base/ObserverListTest.java b/chromium/base/android/javatests/src/org/chromium/base/ObserverListTest.java
new file mode 100644
index 00000000000..8e031bd04b7
--- /dev/null
+++ b/chromium/base/android/javatests/src/org/chromium/base/ObserverListTest.java
@@ -0,0 +1,340 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.test.BaseJUnit4ClassRunner;
+import org.chromium.base.test.util.Feature;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+/**
+ * Tests for (@link ObserverList}.
+ */
+@RunWith(BaseJUnit4ClassRunner.class)
+public class ObserverListTest {
+ interface Observer {
+ void observe(int x);
+ }
+
+ private static class Foo implements Observer {
+ private final int mScalar;
+ private int mTotal;
+
+ Foo(int scalar) {
+ mScalar = scalar;
+ }
+
+ @Override
+ public void observe(int x) {
+ mTotal += x * mScalar;
+ }
+ }
+
+ /**
+ * An observer which add a given Observer object to the list when observe is called.
+ */
+ private static class FooAdder implements Observer {
+ private final ObserverList<Observer> mList;
+ private final Observer mLucky;
+
+ FooAdder(ObserverList<Observer> list, Observer oblivious) {
+ mList = list;
+ mLucky = oblivious;
+ }
+
+ @Override
+ public void observe(int x) {
+ mList.addObserver(mLucky);
+ }
+ }
+
+ /**
+ * An observer which removes a given Observer object from the list when observe is called.
+ */
+ private static class FooRemover implements Observer {
+ private final ObserverList<Observer> mList;
+ private final Observer mDoomed;
+
+ FooRemover(ObserverList<Observer> list, Observer innocent) {
+ mList = list;
+ mDoomed = innocent;
+ }
+
+ @Override
+ public void observe(int x) {
+ mList.removeObserver(mDoomed);
+ }
+ }
+
+ private static <T> int getSizeOfIterable(Iterable<T> iterable) {
+ if (iterable instanceof Collection<?>) return ((Collection<?>) iterable).size();
+ int num = 0;
+ for (T el : iterable) num++;
+ return num;
+ }
+
+ @Test
+ @SmallTest
+ @Feature({"Android-AppBase"})
+ public void testRemoveWhileIteration() {
+ ObserverList<Observer> observerList = new ObserverList<Observer>();
+ Foo a = new Foo(1);
+ Foo b = new Foo(-1);
+ Foo c = new Foo(1);
+ Foo d = new Foo(-1);
+ Foo e = new Foo(-1);
+ FooRemover evil = new FooRemover(observerList, c);
+
+ observerList.addObserver(a);
+ observerList.addObserver(b);
+
+ for (Observer obs : observerList) obs.observe(10);
+
+ // Removing an observer not in the list should do nothing.
+ observerList.removeObserver(e);
+
+ observerList.addObserver(evil);
+ observerList.addObserver(c);
+ observerList.addObserver(d);
+
+ for (Observer obs : observerList) obs.observe(10);
+
+ // observe should be called twice on a.
+ Assert.assertEquals(20, a.mTotal);
+ // observe should be called twice on b.
+ Assert.assertEquals(-20, b.mTotal);
+ // evil removed c from the observerList before it got any callbacks.
+ Assert.assertEquals(0, c.mTotal);
+ // observe should be called once on d.
+ Assert.assertEquals(-10, d.mTotal);
+ // e was never added to the list, observe should not be called.
+ Assert.assertEquals(0, e.mTotal);
+ }
+
+ @Test
+ @SmallTest
+ @Feature({"Android-AppBase"})
+ public void testAddWhileIteration() {
+ ObserverList<Observer> observerList = new ObserverList<Observer>();
+ Foo a = new Foo(1);
+ Foo b = new Foo(-1);
+ Foo c = new Foo(1);
+ FooAdder evil = new FooAdder(observerList, c);
+
+ observerList.addObserver(evil);
+ observerList.addObserver(a);
+ observerList.addObserver(b);
+
+ for (Observer obs : observerList) obs.observe(10);
+
+ Assert.assertTrue(observerList.hasObserver(c));
+ Assert.assertEquals(10, a.mTotal);
+ Assert.assertEquals(-10, b.mTotal);
+ Assert.assertEquals(0, c.mTotal);
+ }
+
+ @Test
+ @SmallTest
+ @Feature({"Android-AppBase"})
+ public void testIterator() {
+ ObserverList<Integer> observerList = new ObserverList<Integer>();
+ observerList.addObserver(5);
+ observerList.addObserver(10);
+ observerList.addObserver(15);
+ Assert.assertEquals(3, getSizeOfIterable(observerList));
+
+ observerList.removeObserver(10);
+ Assert.assertEquals(2, getSizeOfIterable(observerList));
+
+ Iterator<Integer> it = observerList.iterator();
+ Assert.assertTrue(it.hasNext());
+ Assert.assertEquals(5, (int) it.next());
+ Assert.assertTrue(it.hasNext());
+ Assert.assertEquals(15, (int) it.next());
+ Assert.assertFalse(it.hasNext());
+
+ boolean removeExceptionThrown = false;
+ try {
+ it.remove();
+ Assert.fail("Expecting UnsupportedOperationException to be thrown here.");
+ } catch (UnsupportedOperationException e) {
+ removeExceptionThrown = true;
+ }
+ Assert.assertTrue(removeExceptionThrown);
+ Assert.assertEquals(2, getSizeOfIterable(observerList));
+
+ boolean noElementExceptionThrown = false;
+ try {
+ it.next();
+ Assert.fail("Expecting NoSuchElementException to be thrown here.");
+ } catch (NoSuchElementException e) {
+ noElementExceptionThrown = true;
+ }
+ Assert.assertTrue(noElementExceptionThrown);
+ }
+
+ @Test
+ @SmallTest
+ @Feature({"Android-AppBase"})
+ public void testRewindableIterator() {
+ ObserverList<Integer> observerList = new ObserverList<Integer>();
+ observerList.addObserver(5);
+ observerList.addObserver(10);
+ observerList.addObserver(15);
+ Assert.assertEquals(3, getSizeOfIterable(observerList));
+
+ ObserverList.RewindableIterator<Integer> it = observerList.rewindableIterator();
+ Assert.assertTrue(it.hasNext());
+ Assert.assertEquals(5, (int) it.next());
+ Assert.assertTrue(it.hasNext());
+ Assert.assertEquals(10, (int) it.next());
+ Assert.assertTrue(it.hasNext());
+ Assert.assertEquals(15, (int) it.next());
+ Assert.assertFalse(it.hasNext());
+
+ it.rewind();
+
+ Assert.assertTrue(it.hasNext());
+ Assert.assertEquals(5, (int) it.next());
+ Assert.assertTrue(it.hasNext());
+ Assert.assertEquals(10, (int) it.next());
+ Assert.assertTrue(it.hasNext());
+ Assert.assertEquals(15, (int) it.next());
+ Assert.assertEquals(5, (int) observerList.mObservers.get(0));
+ observerList.removeObserver(5);
+ Assert.assertEquals(null, observerList.mObservers.get(0));
+
+ it.rewind();
+
+ Assert.assertEquals(10, (int) observerList.mObservers.get(0));
+ Assert.assertTrue(it.hasNext());
+ Assert.assertEquals(10, (int) it.next());
+ Assert.assertTrue(it.hasNext());
+ Assert.assertEquals(15, (int) it.next());
+ }
+
+ @Test
+ @SmallTest
+ @Feature({"Android-AppBase"})
+ public void testAddObserverReturnValue() {
+ ObserverList<Object> observerList = new ObserverList<Object>();
+
+ Object a = new Object();
+ Assert.assertTrue(observerList.addObserver(a));
+ Assert.assertFalse(observerList.addObserver(a));
+
+ Object b = new Object();
+ Assert.assertTrue(observerList.addObserver(b));
+ Assert.assertFalse(observerList.addObserver(null));
+ }
+
+ @Test
+ @SmallTest
+ @Feature({"Android-AppBase"})
+ public void testRemoveObserverReturnValue() {
+ ObserverList<Object> observerList = new ObserverList<Object>();
+
+ Object a = new Object();
+ Object b = new Object();
+ observerList.addObserver(a);
+ observerList.addObserver(b);
+
+ Assert.assertTrue(observerList.removeObserver(a));
+ Assert.assertFalse(observerList.removeObserver(a));
+ Assert.assertFalse(observerList.removeObserver(new Object()));
+ Assert.assertTrue(observerList.removeObserver(b));
+ Assert.assertFalse(observerList.removeObserver(null));
+
+ // If we remove an object while iterating, it will be replaced by 'null'.
+ observerList.addObserver(a);
+ Assert.assertTrue(observerList.removeObserver(a));
+ Assert.assertFalse(observerList.removeObserver(null));
+ }
+
+ @Test
+ @SmallTest
+ @Feature({"Android-AppBase"})
+ public void testSize() {
+ ObserverList<Object> observerList = new ObserverList<Object>();
+
+ Assert.assertEquals(0, observerList.size());
+ Assert.assertTrue(observerList.isEmpty());
+
+ observerList.addObserver(null);
+ Assert.assertEquals(0, observerList.size());
+ Assert.assertTrue(observerList.isEmpty());
+
+ Object a = new Object();
+ observerList.addObserver(a);
+ Assert.assertEquals(1, observerList.size());
+ Assert.assertFalse(observerList.isEmpty());
+
+ observerList.addObserver(a);
+ Assert.assertEquals(1, observerList.size());
+ Assert.assertFalse(observerList.isEmpty());
+
+ observerList.addObserver(null);
+ Assert.assertEquals(1, observerList.size());
+ Assert.assertFalse(observerList.isEmpty());
+
+ Object b = new Object();
+ observerList.addObserver(b);
+ Assert.assertEquals(2, observerList.size());
+ Assert.assertFalse(observerList.isEmpty());
+
+ observerList.removeObserver(null);
+ Assert.assertEquals(2, observerList.size());
+ Assert.assertFalse(observerList.isEmpty());
+
+ observerList.removeObserver(new Object());
+ Assert.assertEquals(2, observerList.size());
+ Assert.assertFalse(observerList.isEmpty());
+
+ observerList.removeObserver(b);
+ Assert.assertEquals(1, observerList.size());
+ Assert.assertFalse(observerList.isEmpty());
+
+ observerList.removeObserver(b);
+ Assert.assertEquals(1, observerList.size());
+ Assert.assertFalse(observerList.isEmpty());
+
+ observerList.removeObserver(a);
+ Assert.assertEquals(0, observerList.size());
+ Assert.assertTrue(observerList.isEmpty());
+
+ observerList.removeObserver(a);
+ observerList.removeObserver(b);
+ observerList.removeObserver(null);
+ observerList.removeObserver(new Object());
+ Assert.assertEquals(0, observerList.size());
+ Assert.assertTrue(observerList.isEmpty());
+
+ observerList.addObserver(new Object());
+ observerList.addObserver(new Object());
+ observerList.addObserver(new Object());
+ observerList.addObserver(a);
+ Assert.assertEquals(4, observerList.size());
+ Assert.assertFalse(observerList.isEmpty());
+
+ observerList.clear();
+ Assert.assertEquals(0, observerList.size());
+ Assert.assertTrue(observerList.isEmpty());
+
+ observerList.removeObserver(a);
+ observerList.removeObserver(b);
+ observerList.removeObserver(null);
+ observerList.removeObserver(new Object());
+ Assert.assertEquals(0, observerList.size());
+ Assert.assertTrue(observerList.isEmpty());
+ }
+}
diff --git a/chromium/base/android/javatests/src/org/chromium/base/PackageUtilsTest.java b/chromium/base/android/javatests/src/org/chromium/base/PackageUtilsTest.java
new file mode 100644
index 00000000000..7bb53ea5315
--- /dev/null
+++ b/chromium/base/android/javatests/src/org/chromium/base/PackageUtilsTest.java
@@ -0,0 +1,63 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base;
+
+import static org.hamcrest.CoreMatchers.anyOf;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+import static org.chromium.base.PackageUtils.byteArrayToHexString;
+import static org.chromium.base.PackageUtils.getCertificateSHA256FingerprintForPackage;
+
+import android.content.pm.PackageManager;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.test.BaseJUnit4ClassRunner;
+import org.chromium.base.test.util.Batch;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Tests for {@link PackageUtils}.
+ */
+@RunWith(BaseJUnit4ClassRunner.class)
+@Batch(Batch.UNIT_TESTS)
+public class PackageUtilsTest {
+ private static final byte[] BYTE_ARRAY = new byte[] {(byte) 0xaa, (byte) 0xbb, (byte) 0xcc,
+ (byte) 0x10, (byte) 0x20, (byte) 0x30, (byte) 0x01, (byte) 0x02};
+ private static final String STRING_ARRAY = "AA:BB:CC:10:20:30:01:02";
+
+ private static final String SHA_256_FINGERPRINT_PUBLIC =
+ "32:A2:FC:74:D7:31:10:58:59:E5:A8:5D:F1:6D:95:F1:02:D8:5B"
+ + ":22:09:9B:80:64:C5:D8:91:5C:61:DA:D1:E0";
+ private static final String SHA_256_FINGERPRINT_OFFICIAL =
+ "19:75:B2:F1:71:77:BC:89:A5:DF:F3:1F:9E:64:A6:CA:E2:81:A5"
+ + ":3D:C1:D1:D5:9B:1D:14:7F:E1:C8:2A:FA:00";
+ private static final String PACKAGE_NAME =
+ ContextUtils.getApplicationContext().getPackageName();
+
+ @Test
+ @SmallTest
+ public void testByteArrayToHexString() {
+ Assert.assertEquals(STRING_ARRAY, byteArrayToHexString(BYTE_ARRAY));
+ }
+
+ @Test
+ @SmallTest
+ public void testSHA256CertificateChecks() {
+ PackageManager pm = ContextUtils.getApplicationContext().getPackageManager();
+ List<String> fingerprints = getCertificateSHA256FingerprintForPackage(PACKAGE_NAME);
+
+ assertThat(fingerprints,
+ anyOf(is(Collections.singletonList(SHA_256_FINGERPRINT_PUBLIC)),
+ is(Collections.singletonList(SHA_256_FINGERPRINT_OFFICIAL))));
+ }
+}
diff --git a/chromium/base/android/javatests/src/org/chromium/base/StrictModeContextTest.java b/chromium/base/android/javatests/src/org/chromium/base/StrictModeContextTest.java
new file mode 100644
index 00000000000..59671303ebd
--- /dev/null
+++ b/chromium/base/android/javatests/src/org/chromium/base/StrictModeContextTest.java
@@ -0,0 +1,119 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base;
+
+import android.os.StrictMode;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.test.BaseJUnit4ClassRunner;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+/**
+ * Tests for the StrictModeContext class.
+ */
+@RunWith(BaseJUnit4ClassRunner.class)
+public class StrictModeContextTest {
+ private StrictMode.ThreadPolicy mOldThreadPolicy;
+ private StrictMode.VmPolicy mOldVmPolicy;
+ private FileOutputStream mFosForWriting;
+ private FileInputStream mFisForReading;
+
+ @Before
+ public void setUp() throws Exception {
+ mFosForWriting = new FileOutputStream(File.createTempFile("foo", "bar"));
+ mFisForReading = new FileInputStream(File.createTempFile("foo", "baz"));
+ enableStrictMode();
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ disableStrictMode();
+ mFosForWriting.close();
+ mFisForReading.close();
+ }
+
+ private void enableStrictMode() {
+ mOldThreadPolicy = StrictMode.getThreadPolicy();
+ mOldVmPolicy = StrictMode.getVmPolicy();
+ StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
+ .detectAll()
+ .penaltyLog()
+ .penaltyDeath()
+ .build());
+ StrictMode.setVmPolicy(
+ new StrictMode.VmPolicy.Builder().detectAll().penaltyLog().penaltyDeath().build());
+ }
+
+ private void disableStrictMode() {
+ StrictMode.setThreadPolicy(mOldThreadPolicy);
+ StrictMode.setVmPolicy(mOldVmPolicy);
+ }
+
+ private void writeToDisk() {
+ try {
+ mFosForWriting.write(ApiCompatibilityUtils.getBytesUtf8("Foo"));
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private void assertWriteToDiskThrows() {
+ boolean didThrow = false;
+ try {
+ writeToDisk();
+ } catch (Exception e) {
+ didThrow = true;
+ }
+ Assert.assertTrue("Expected disk write to throw.", didThrow);
+ }
+
+ private void readFromDisk() {
+ try {
+ mFisForReading.read();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private void assertReadFromDiskThrows() {
+ boolean didThrow = false;
+ try {
+ readFromDisk();
+ } catch (Exception e) {
+ didThrow = true;
+ }
+ Assert.assertTrue("Expected disk read to throw.", didThrow);
+ }
+
+ @Test
+ @SmallTest
+ public void testAllowDiskWrites() {
+ try (StrictModeContext ignored = StrictModeContext.allowDiskWrites()) {
+ writeToDisk();
+ }
+ assertWriteToDiskThrows();
+ }
+
+ @Test
+ @SmallTest
+ public void testAllowDiskReads() {
+ try (StrictModeContext ignored = StrictModeContext.allowDiskReads()) {
+ readFromDisk();
+ assertWriteToDiskThrows();
+ }
+ assertReadFromDiskThrows();
+ }
+}
diff --git a/chromium/base/android/javatests/src/org/chromium/base/UserDataHostTest.java b/chromium/base/android/javatests/src/org/chromium/base/UserDataHostTest.java
new file mode 100644
index 00000000000..ff3a3bcf4c3
--- /dev/null
+++ b/chromium/base/android/javatests/src/org/chromium/base/UserDataHostTest.java
@@ -0,0 +1,163 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.test.BaseJUnit4ClassRunner;
+
+/**
+ * Test class for {@link UserDataHost}.
+ */
+@RunWith(BaseJUnit4ClassRunner.class)
+public class UserDataHostTest {
+ private final UserDataHost mHost = new UserDataHost();
+
+ private static class TestObjectA implements UserData {
+ private boolean mDestroyed;
+
+ @Override
+ public void destroy() {
+ mDestroyed = true;
+ }
+
+ private boolean isDestroyed() {
+ return mDestroyed;
+ }
+ }
+
+ private static class TestObjectB implements UserData {
+ private boolean mDestroyed;
+
+ @Override
+ public void destroy() {
+ mDestroyed = true;
+ }
+
+ private boolean isDestroyed() {
+ return mDestroyed;
+ }
+ }
+
+ private <T extends UserData, E extends RuntimeException> void getUserDataException(
+ Class<T> key, Class<E> exceptionType) {
+ try {
+ mHost.getUserData(key);
+ } catch (Exception e) {
+ if (!exceptionType.isInstance(e)) throw e;
+ }
+ }
+
+ private <T extends UserData, E extends RuntimeException> void setUserDataException(
+ Class<T> key, T obj, Class<E> exceptionType) {
+ try {
+ mHost.setUserData(key, obj);
+ } catch (Exception e) {
+ if (!exceptionType.isInstance(e)) throw e;
+ }
+ }
+
+ private <T extends UserData, E extends RuntimeException> void removeUserDataException(
+ Class<T> key, Class<E> exceptionType) {
+ try {
+ mHost.removeUserData(key);
+ } catch (Exception e) {
+ if (!exceptionType.isInstance(e)) throw e;
+ }
+ }
+
+ /**
+ * Verifies basic operations.
+ */
+ @Test
+ @SmallTest
+ public void testBasicOperations() {
+ TestObjectA obj = new TestObjectA();
+ mHost.setUserData(TestObjectA.class, obj);
+ Assert.assertEquals(obj, mHost.getUserData(TestObjectA.class));
+ Assert.assertEquals(obj, mHost.removeUserData(TestObjectA.class));
+ Assert.assertNull(mHost.getUserData(TestObjectA.class));
+ removeUserDataException(TestObjectA.class, IllegalStateException.class);
+ }
+
+ /**
+ * Verifies nulled key or data are not allowed.
+ */
+ @Test
+ @SmallTest
+ public void testNullKeyOrDataAreDisallowed() {
+ TestObjectA obj = new TestObjectA();
+ setUserDataException(null, null, IllegalArgumentException.class);
+ setUserDataException(TestObjectA.class, null, IllegalArgumentException.class);
+ setUserDataException(null, obj, IllegalArgumentException.class);
+ getUserDataException(null, IllegalArgumentException.class);
+ removeUserDataException(null, IllegalArgumentException.class);
+ }
+
+ /**
+ * Verifies {@link #setUserData()} overwrites current data.
+ */
+ @Test
+ @SmallTest
+ public void testSetUserDataOverwrites() {
+ TestObjectA obj1 = new TestObjectA();
+ mHost.setUserData(TestObjectA.class, obj1);
+ Assert.assertEquals(obj1, mHost.getUserData(TestObjectA.class));
+
+ TestObjectA obj2 = new TestObjectA();
+ mHost.setUserData(TestObjectA.class, obj2);
+ Assert.assertEquals(obj2, mHost.getUserData(TestObjectA.class));
+ }
+
+ /**
+ * Verifies operation on a different thread is not allowed.
+ */
+ @Test
+ @SmallTest
+ public void testSingleThreadPolicy() {
+ TestObjectA obj = new TestObjectA();
+ mHost.setUserData(TestObjectA.class, obj);
+ ThreadUtils.runOnUiThreadBlocking(
+ () -> getUserDataException(TestObjectA.class, IllegalStateException.class));
+ }
+
+ /**
+ * Verifies {@link UserHostData#destroy()} detroyes each {@link UserData} object.
+ */
+ @Test
+ @SmallTest
+ public void testDestroy() {
+ TestObjectA objA = new TestObjectA();
+ TestObjectB objB = new TestObjectB();
+ mHost.setUserData(TestObjectA.class, objA);
+ mHost.setUserData(TestObjectB.class, objB);
+ Assert.assertEquals(objA, mHost.getUserData(TestObjectA.class));
+ Assert.assertEquals(objB, mHost.getUserData(TestObjectB.class));
+
+ mHost.destroy();
+ Assert.assertTrue(objA.isDestroyed());
+ Assert.assertTrue(objB.isDestroyed());
+ }
+
+ /**
+ * Verifies that no operation is allowed after {@link #destroy()} is called.
+ */
+ @Test
+ @SmallTest
+ public void testOperationsDisallowedAfterDestroy() {
+ TestObjectA obj = new TestObjectA();
+ mHost.setUserData(TestObjectA.class, obj);
+ Assert.assertEquals(obj, mHost.getUserData(TestObjectA.class));
+
+ mHost.destroy();
+ getUserDataException(TestObjectA.class, IllegalStateException.class);
+ setUserDataException(TestObjectA.class, obj, IllegalStateException.class);
+ removeUserDataException(TestObjectA.class, IllegalStateException.class);
+ }
+}
diff --git a/chromium/base/android/javatests/src/org/chromium/base/library_loader/EarlyNativeTest.java b/chromium/base/android/javatests/src/org/chromium/base/library_loader/EarlyNativeTest.java
new file mode 100644
index 00000000000..f1175da2fa7
--- /dev/null
+++ b/chromium/base/android/javatests/src/org/chromium/base/library_loader/EarlyNativeTest.java
@@ -0,0 +1,178 @@
+// Copyright 2019 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.library_loader;
+
+import android.content.pm.ApplicationInfo;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.JniException;
+import org.chromium.base.NativeLibraryLoadedStatus;
+import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
+import org.chromium.base.test.BaseJUnit4ClassRunner;
+import org.chromium.base.test.util.Batch;
+import org.chromium.base.test.util.CallbackHelper;
+import org.chromium.base.test.util.RequiresRestart;
+import org.chromium.build.BuildConfig;
+import org.chromium.build.annotations.MainDex;
+
+import java.util.concurrent.TimeoutException;
+
+/**
+ * Tests for early JNI initialization.
+ */
+@RunWith(BaseJUnit4ClassRunner.class)
+@JNINamespace("base")
+@MainDex
+@Batch(Batch.UNIT_TESTS)
+public class EarlyNativeTest {
+ private boolean mWasInitialized;
+ private CallbackHelper mLoadMainDexStarted;
+ private CallbackHelper mEnsureMainDexInitializedFinished;
+
+ @Before
+ public void setUp() {
+ mWasInitialized = LibraryLoader.getInstance().isInitialized();
+ LibraryLoader.getInstance().resetForTesting();
+ mLoadMainDexStarted = new CallbackHelper();
+ mEnsureMainDexInitializedFinished = new CallbackHelper();
+ }
+
+ @After
+ public void tearDown() {
+ // Restore the simulated library state (due to the resetForTesting() call).
+ if (mWasInitialized) {
+ LibraryLoader.getInstance().ensureInitialized();
+ }
+ }
+
+ private class TestLibraryLoader extends LibraryLoader {
+ @Override
+ @SuppressWarnings("GuardedBy") // ErrorProne: should be guarded by 'mLock'
+ protected void loadMainDexAlreadyLocked(ApplicationInfo appInfo, boolean inZygote) {
+ mLoadMainDexStarted.notifyCalled();
+ super.loadMainDexAlreadyLocked(appInfo, inZygote);
+ }
+
+ @Override
+ protected void loadNonMainDex() {
+ try {
+ mEnsureMainDexInitializedFinished.waitForCallback(0);
+ } catch (TimeoutException e) {
+ throw new RuntimeException(e);
+ }
+ super.loadNonMainDex();
+ }
+ }
+
+ @NativeMethods
+ interface Natives {
+ boolean isCommandLineInitialized();
+ boolean isProcessNameEmpty();
+ }
+
+ @Test
+ @SmallTest
+ public void testEnsureMainDexInitialized() {
+ LibraryLoader.getInstance().ensureMainDexInitialized();
+ // Some checks to ensure initialization has taken place.
+ Assert.assertTrue(EarlyNativeTestJni.get().isCommandLineInitialized());
+ Assert.assertFalse(EarlyNativeTestJni.get().isProcessNameEmpty());
+
+ // Make sure the Native library isn't considered ready for general use.
+ Assert.assertFalse(LibraryLoader.getInstance().isInitialized());
+
+ LibraryLoader.getInstance().ensureInitialized();
+ Assert.assertTrue(LibraryLoader.getInstance().isInitialized());
+
+ // Test resetForTesting().
+ LibraryLoader.getInstance().resetForTesting();
+ Assert.assertFalse(LibraryLoader.getInstance().isInitialized());
+ LibraryLoader.getInstance().ensureInitialized();
+ Assert.assertTrue(LibraryLoader.getInstance().isInitialized());
+ }
+
+ private void doTestFullInitializationDoesntBlockMainDexInitialization(final boolean initialize)
+ throws Exception {
+ final TestLibraryLoader loader = new TestLibraryLoader();
+ loader.setLibraryProcessType(LibraryProcessType.PROCESS_BROWSER);
+ final Thread t1 = new Thread(() -> {
+ if (initialize) {
+ loader.ensureInitialized();
+ } else {
+ loader.loadNow();
+ }
+ });
+ t1.start();
+ mLoadMainDexStarted.waitForCallback(0);
+ final Thread t2 = new Thread(() -> {
+ loader.ensureMainDexInitialized();
+ Assert.assertFalse(loader.isInitialized());
+ mEnsureMainDexInitializedFinished.notifyCalled();
+ });
+ t2.start();
+ t2.join();
+ t1.join();
+ Assert.assertTrue(loader.isInitialized());
+ }
+
+ @Test
+ @SmallTest
+ @RequiresRestart("Uses custom LibraryLoader")
+ public void testFullInitializationDoesntBlockMainDexInitialization() throws Exception {
+ doTestFullInitializationDoesntBlockMainDexInitialization(true);
+ }
+
+ @Test
+ @SmallTest
+ @RequiresRestart("Uses custom LibraryLoader")
+ public void testLoadDoesntBlockMainDexInitialization() throws Exception {
+ doTestFullInitializationDoesntBlockMainDexInitialization(false);
+ }
+
+ @Test
+ @SmallTest
+ public void testNativeMethodsReadyAfterLibraryInitialized() {
+ // Test is a no-op if DCHECK isn't on.
+ if (!BuildConfig.ENABLE_ASSERTS) return;
+
+ Assert.assertFalse(
+ NativeLibraryLoadedStatus.getProviderForTesting().areMainDexNativeMethodsReady());
+ Assert.assertFalse(
+ NativeLibraryLoadedStatus.getProviderForTesting().areNativeMethodsReady());
+
+ LibraryLoader.getInstance().ensureMainDexInitialized();
+ Assert.assertTrue(
+ NativeLibraryLoadedStatus.getProviderForTesting().areMainDexNativeMethodsReady());
+ Assert.assertFalse(
+ NativeLibraryLoadedStatus.getProviderForTesting().areNativeMethodsReady());
+
+ LibraryLoader.getInstance().ensureInitialized();
+ Assert.assertTrue(
+ NativeLibraryLoadedStatus.getProviderForTesting().areMainDexNativeMethodsReady());
+ Assert.assertTrue(
+ NativeLibraryLoadedStatus.getProviderForTesting().areNativeMethodsReady());
+ }
+
+ @Test
+ @SmallTest
+ public void testNativeMethodsNotReadyThrows() {
+ // Test is a no-op if dcheck isn't on.
+ if (!BuildConfig.ENABLE_ASSERTS) return;
+
+ try {
+ EarlyNativeTestJni.get().isCommandLineInitialized();
+ Assert.fail("Using JNI before the library is loaded should throw an exception.");
+ } catch (JniException e) {
+ }
+ }
+}
diff --git a/chromium/base/android/javatests/src/org/chromium/base/metrics/RecordHistogramTest.java b/chromium/base/android/javatests/src/org/chromium/base/metrics/RecordHistogramTest.java
new file mode 100644
index 00000000000..605046e96da
--- /dev/null
+++ b/chromium/base/android/javatests/src/org/chromium/base/metrics/RecordHistogramTest.java
@@ -0,0 +1,196 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.metrics;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.library_loader.LibraryLoader;
+import org.chromium.base.test.BaseJUnit4ClassRunner;
+import org.chromium.base.test.util.MetricsUtils.HistogramDelta;
+
+/**
+ * Tests for the Java API for recording UMA histograms.
+ */
+@RunWith(BaseJUnit4ClassRunner.class)
+public class RecordHistogramTest {
+ @Before
+ public void setUp() {
+ LibraryLoader.getInstance().ensureInitialized();
+ }
+
+ /**
+ * Tests recording of boolean histograms.
+ */
+ @Test
+ @SmallTest
+ public void testRecordBooleanHistogram() {
+ String histogram = "HelloWorld.BooleanMetric";
+ HistogramDelta falseCount = new HistogramDelta(histogram, 0);
+ HistogramDelta trueCount = new HistogramDelta(histogram, 1);
+ Assert.assertEquals(0, trueCount.getDelta());
+ Assert.assertEquals(0, falseCount.getDelta());
+
+ RecordHistogram.recordBooleanHistogram(histogram, true);
+ Assert.assertEquals(1, trueCount.getDelta());
+ Assert.assertEquals(0, falseCount.getDelta());
+
+ RecordHistogram.recordBooleanHistogram(histogram, true);
+ Assert.assertEquals(2, trueCount.getDelta());
+ Assert.assertEquals(0, falseCount.getDelta());
+
+ RecordHistogram.recordBooleanHistogram(histogram, false);
+ Assert.assertEquals(2, trueCount.getDelta());
+ Assert.assertEquals(1, falseCount.getDelta());
+ }
+
+ /**
+ * Tests recording of enumerated histograms.
+ */
+ @Test
+ @SmallTest
+ public void testRecordEnumeratedHistogram() {
+ String histogram = "HelloWorld.EnumeratedMetric";
+ HistogramDelta zeroCount = new HistogramDelta(histogram, 0);
+ HistogramDelta oneCount = new HistogramDelta(histogram, 1);
+ HistogramDelta twoCount = new HistogramDelta(histogram, 2);
+ final int boundary = 3;
+
+ Assert.assertEquals(0, zeroCount.getDelta());
+ Assert.assertEquals(0, oneCount.getDelta());
+ Assert.assertEquals(0, twoCount.getDelta());
+
+ RecordHistogram.recordEnumeratedHistogram(histogram, 0, boundary);
+ Assert.assertEquals(1, zeroCount.getDelta());
+ Assert.assertEquals(0, oneCount.getDelta());
+ Assert.assertEquals(0, twoCount.getDelta());
+
+ RecordHistogram.recordEnumeratedHistogram(histogram, 0, boundary);
+ Assert.assertEquals(2, zeroCount.getDelta());
+ Assert.assertEquals(0, oneCount.getDelta());
+ Assert.assertEquals(0, twoCount.getDelta());
+
+ RecordHistogram.recordEnumeratedHistogram(histogram, 2, boundary);
+ Assert.assertEquals(2, zeroCount.getDelta());
+ Assert.assertEquals(0, oneCount.getDelta());
+ Assert.assertEquals(1, twoCount.getDelta());
+ }
+
+ /**
+ * Tests recording of count histograms.
+ */
+ @Test
+ @SmallTest
+ public void testRecordCount1MHistogram() {
+ String histogram = "HelloWorld.CountMetric";
+ HistogramDelta zeroCount = new HistogramDelta(histogram, 0);
+ HistogramDelta oneCount = new HistogramDelta(histogram, 1);
+ HistogramDelta twoCount = new HistogramDelta(histogram, 2);
+ HistogramDelta eightThousandCount = new HistogramDelta(histogram, 8000);
+
+ Assert.assertEquals(0, zeroCount.getDelta());
+ Assert.assertEquals(0, oneCount.getDelta());
+ Assert.assertEquals(0, twoCount.getDelta());
+ Assert.assertEquals(0, eightThousandCount.getDelta());
+
+ RecordHistogram.recordCount1MHistogram(histogram, 0);
+ Assert.assertEquals(1, zeroCount.getDelta());
+ Assert.assertEquals(0, oneCount.getDelta());
+ Assert.assertEquals(0, twoCount.getDelta());
+ Assert.assertEquals(0, eightThousandCount.getDelta());
+
+ RecordHistogram.recordCount1MHistogram(histogram, 0);
+ Assert.assertEquals(2, zeroCount.getDelta());
+ Assert.assertEquals(0, oneCount.getDelta());
+ Assert.assertEquals(0, twoCount.getDelta());
+ Assert.assertEquals(0, eightThousandCount.getDelta());
+
+ RecordHistogram.recordCount1MHistogram(histogram, 2);
+ Assert.assertEquals(2, zeroCount.getDelta());
+ Assert.assertEquals(0, oneCount.getDelta());
+ Assert.assertEquals(1, twoCount.getDelta());
+ Assert.assertEquals(0, eightThousandCount.getDelta());
+
+ RecordHistogram.recordCount1MHistogram(histogram, 8000);
+ Assert.assertEquals(2, zeroCount.getDelta());
+ Assert.assertEquals(0, oneCount.getDelta());
+ Assert.assertEquals(1, twoCount.getDelta());
+ Assert.assertEquals(1, eightThousandCount.getDelta());
+ }
+
+ /**
+ * Tests recording of custom times histograms.
+ */
+ @Test
+ @SmallTest
+ public void testRecordCustomTimesHistogram() {
+ String histogram = "HelloWorld.CustomTimesMetric";
+ HistogramDelta zeroCount = new HistogramDelta(histogram, 0);
+ HistogramDelta oneCount = new HistogramDelta(histogram, 1);
+ HistogramDelta twoCount = new HistogramDelta(histogram, 100);
+
+ Assert.assertEquals(0, zeroCount.getDelta());
+ Assert.assertEquals(0, oneCount.getDelta());
+ Assert.assertEquals(0, twoCount.getDelta());
+
+ RecordHistogram.recordCustomTimesHistogram(histogram, 0, 1, 100, 3);
+ Assert.assertEquals(1, zeroCount.getDelta());
+ Assert.assertEquals(0, oneCount.getDelta());
+ Assert.assertEquals(0, twoCount.getDelta());
+
+ RecordHistogram.recordCustomTimesHistogram(histogram, 0, 1, 100, 3);
+ Assert.assertEquals(2, zeroCount.getDelta());
+ Assert.assertEquals(0, oneCount.getDelta());
+ Assert.assertEquals(0, twoCount.getDelta());
+
+ RecordHistogram.recordCustomTimesHistogram(histogram, 95, 1, 100, 3);
+ Assert.assertEquals(2, zeroCount.getDelta());
+ Assert.assertEquals(1, oneCount.getDelta());
+ Assert.assertEquals(0, twoCount.getDelta());
+
+ RecordHistogram.recordCustomTimesHistogram(histogram, 200, 1, 100, 3);
+ Assert.assertEquals(2, zeroCount.getDelta());
+ Assert.assertEquals(1, oneCount.getDelta());
+ Assert.assertEquals(1, twoCount.getDelta());
+ }
+
+ /**
+ * Tests recording of linear count histograms.
+ */
+ @Test
+ @SmallTest
+ public void testRecordLinearCountHistogram() {
+ String histogram = "HelloWorld.LinearCountMetric";
+ HistogramDelta zeroCount = new HistogramDelta(histogram, 0);
+ HistogramDelta oneCount = new HistogramDelta(histogram, 1);
+ HistogramDelta twoCount = new HistogramDelta(histogram, 2);
+ final int min = 1;
+ final int max = 3;
+ final int numBuckets = 4;
+
+ Assert.assertEquals(0, zeroCount.getDelta());
+ Assert.assertEquals(0, oneCount.getDelta());
+ Assert.assertEquals(0, twoCount.getDelta());
+
+ RecordHistogram.recordLinearCountHistogram(histogram, 0, min, max, numBuckets);
+ Assert.assertEquals(1, zeroCount.getDelta());
+ Assert.assertEquals(0, oneCount.getDelta());
+ Assert.assertEquals(0, twoCount.getDelta());
+
+ RecordHistogram.recordLinearCountHistogram(histogram, 0, min, max, numBuckets);
+ Assert.assertEquals(2, zeroCount.getDelta());
+ Assert.assertEquals(0, oneCount.getDelta());
+ Assert.assertEquals(0, twoCount.getDelta());
+
+ RecordHistogram.recordLinearCountHistogram(histogram, 2, min, max, numBuckets);
+ Assert.assertEquals(2, zeroCount.getDelta());
+ Assert.assertEquals(0, oneCount.getDelta());
+ Assert.assertEquals(1, twoCount.getDelta());
+ }
+}
diff --git a/chromium/base/android/javatests/src/org/chromium/base/profiler/TestSupport.java b/chromium/base/android/javatests/src/org/chromium/base/profiler/TestSupport.java
new file mode 100644
index 00000000000..4bbf3f2102e
--- /dev/null
+++ b/chromium/base/android/javatests/src/org/chromium/base/profiler/TestSupport.java
@@ -0,0 +1,25 @@
+// Copyright 2020 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.profiler;
+
+import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
+
+/**
+ * Helper to run code through JNI layer to test JNI unwinding.
+ */
+@JNINamespace("base")
+public final class TestSupport {
+ @CalledByNative
+ public static void callWithJavaFunction(long context) {
+ TestSupportJni.get().invokeCallbackFunction(context);
+ }
+
+ @NativeMethods
+ interface Natives {
+ void invokeCallbackFunction(long context);
+ }
+}
diff --git a/chromium/base/android/javatests/src/org/chromium/base/task/AsyncTaskTest.java b/chromium/base/android/javatests/src/org/chromium/base/task/AsyncTaskTest.java
new file mode 100644
index 00000000000..17fe56f71ba
--- /dev/null
+++ b/chromium/base/android/javatests/src/org/chromium/base/task/AsyncTaskTest.java
@@ -0,0 +1,147 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.task;
+
+import androidx.annotation.NonNull;
+import androidx.test.filters.SmallTest;
+
+import org.hamcrest.CoreMatchers;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.test.BaseJUnit4ClassRunner;
+
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.Executor;
+import java.util.concurrent.RejectedExecutionException;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Tests for our AsyncTask modifications
+ *
+ * Not a robolectric test because the reflection doesn't work with ShadowAsyncTask.
+ */
+@RunWith(BaseJUnit4ClassRunner.class)
+public class AsyncTaskTest {
+ private static class SpecialChromeAsyncTask extends BackgroundOnlyAsyncTask<Void> {
+ @Override
+ protected Void doInBackground() {
+ return null;
+ }
+ }
+
+ @SuppressWarnings("NoAndroidAsyncTaskCheck")
+ private static class SpecialOsAsyncTask extends android.os.AsyncTask<Void, Void, Void> {
+ @Override
+ protected Void doInBackground(Void... params) {
+ return null;
+ }
+ }
+
+ private static class SpecialRunnable implements Runnable {
+ @Override
+ public void run() {}
+ }
+
+ private static final int QUEUE_SIZE = 40;
+
+ @Rule
+ public ExpectedException thrown = ExpectedException.none();
+
+ /**
+ * Test filling the queue with basic Runnables, then add a final AsyncTask to overfill it, and
+ * ensure the Runnable is the one blamed in the exception message.
+ */
+ @Test
+ @SmallTest
+ public void testChromeThreadPoolExecutorRunnables() {
+ Executor executor = new ChromeThreadPoolExecutor(1, 1, 1, TimeUnit.SECONDS,
+ new ArrayBlockingQueue<Runnable>(QUEUE_SIZE), new ThreadFactory() {
+ @Override
+ public Thread newThread(@NonNull Runnable r) {
+ return null;
+ }
+ });
+ for (int i = 0; i < QUEUE_SIZE; i++) {
+ executor.execute(new SpecialRunnable());
+ }
+ thrown.expect(RejectedExecutionException.class);
+ thrown.expectMessage(CoreMatchers.containsString(
+ "org.chromium.base.task.AsyncTaskTest$SpecialRunnable"));
+ thrown.expectMessage(
+ CoreMatchers.not(CoreMatchers.containsString("SpecialChromeAsyncTask")));
+ new SpecialChromeAsyncTask().executeOnExecutor(executor);
+ }
+
+ /**
+ * Test filling the queue with Chrome AsyncTasks, then add a final OS AsyncTask to
+ * overfill it and ensure the Chrome AsyncTask is the one blamed in the exception message.
+ */
+ @Test
+ @SmallTest
+ public void testChromeThreadPoolExecutorChromeAsyncTask() {
+ Executor executor = new ChromeThreadPoolExecutor(1, 1, 1, TimeUnit.SECONDS,
+ new ArrayBlockingQueue<Runnable>(QUEUE_SIZE), new ThreadFactory() {
+ @Override
+ public Thread newThread(@NonNull Runnable r) {
+ return null;
+ }
+ });
+ for (int i = 0; i < QUEUE_SIZE; i++) {
+ new SpecialChromeAsyncTask().executeOnExecutor(executor);
+ }
+ thrown.expect(RejectedExecutionException.class);
+ thrown.expectMessage(CoreMatchers.containsString(
+ "org.chromium.base.task.AsyncTaskTest$SpecialChromeAsyncTask"));
+ thrown.expectMessage(CoreMatchers.not(CoreMatchers.containsString("SpecialOsAsyncTask")));
+ new SpecialOsAsyncTask().executeOnExecutor(executor);
+ }
+
+ /**
+ * Test filling the queue with android.os.AsyncTasks, then add a final ChromeAsyncTask to
+ * overfill it and ensure the OsAsyncTask is the one blamed in the exception message.
+ */
+ @Test
+ @SmallTest
+ public void testChromeThreadPoolExecutorOsAsyncTask() {
+ Executor executor = new ChromeThreadPoolExecutor(1, 1, 1, TimeUnit.SECONDS,
+ new ArrayBlockingQueue<Runnable>(QUEUE_SIZE), new ThreadFactory() {
+ @Override
+ public Thread newThread(@NonNull Runnable r) {
+ return null;
+ }
+ });
+ for (int i = 0; i < QUEUE_SIZE; i++) {
+ new SpecialOsAsyncTask().executeOnExecutor(executor);
+ }
+ thrown.expect(RejectedExecutionException.class);
+ thrown.expectMessage(CoreMatchers.containsString(
+ "org.chromium.base.task.AsyncTaskTest$SpecialOsAsyncTask"));
+ thrown.expectMessage(
+ CoreMatchers.not(CoreMatchers.containsString("SpecialChromeAsyncTask")));
+ new SpecialChromeAsyncTask().executeOnExecutor(executor);
+ }
+
+ /**
+ * Test verifying that tasks which specify that they are not using onPostExecute
+ * don't trigger it.
+ */
+ @Test
+ @SmallTest
+ public void testTaskNotNeedingPostExecutionDoesNotTriggerIt() {
+ new BackgroundOnlyAsyncTask<Void>() {
+ @Override
+ protected Void doInBackground() {
+ return null;
+ }
+ // Calling onPostExecute on this class causes failure.
+ }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+ }
+
+ // TODO(ksolt): do we need any post execution tests here?
+}
diff --git a/chromium/base/android/javatests/src/org/chromium/base/task/PostTaskTest.java b/chromium/base/android/javatests/src/org/chromium/base/task/PostTaskTest.java
new file mode 100644
index 00000000000..dbb729f2d2b
--- /dev/null
+++ b/chromium/base/android/javatests/src/org/chromium/base/task/PostTaskTest.java
@@ -0,0 +1,123 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.task;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.collection.IsIterableContainingInOrder.contains;
+import static org.junit.Assert.assertNotNull;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.ThreadUtils;
+import org.chromium.base.test.BaseJUnit4ClassRunner;
+import org.chromium.base.test.task.SchedulerTestHelpers;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/**
+ * Test class for {@link PostTask}.
+ *
+ * Note due to layering concerns we can't test post native functionality in a
+ * base javatest. Instead see:
+ * content/public/android/javatests/src/org/chromium/content/browser/scheduler/
+ * NativePostTaskTest.java
+ */
+@RunWith(BaseJUnit4ClassRunner.class)
+public class PostTaskTest {
+ @Test
+ @SmallTest
+ public void testPreNativePostTask() {
+ // This test should not timeout.
+ final Object lock = new Object();
+ final AtomicBoolean taskExecuted = new AtomicBoolean();
+ PostTask.postTask(TaskTraits.USER_BLOCKING, new Runnable() {
+ @Override
+ public void run() {
+ synchronized (lock) {
+ taskExecuted.set(true);
+ lock.notify();
+ }
+ }
+ });
+ synchronized (lock) {
+ try {
+ while (!taskExecuted.get()) {
+ lock.wait();
+ }
+ } catch (InterruptedException ie) {
+ ie.printStackTrace();
+ }
+ }
+ }
+
+ @Test
+ @SmallTest
+ public void testCreateSingleThreadTaskRunner() {
+ TaskRunner taskQueue = PostTask.createSingleThreadTaskRunner(TaskTraits.USER_BLOCKING);
+ // A SingleThreadTaskRunner with default traits will run in the native thread pool
+ // and tasks posted won't run until after the native library has loaded.
+ assertNotNull(taskQueue);
+ }
+
+ @Test
+ @SmallTest
+ public void testCreateSequencedTaskRunner() {
+ TaskRunner taskQueue = PostTask.createSequencedTaskRunner(TaskTraits.USER_BLOCKING);
+ List<Integer> orderList = new ArrayList<>();
+ SchedulerTestHelpers.postRecordOrderTask(taskQueue, orderList, 1);
+ SchedulerTestHelpers.postRecordOrderTask(taskQueue, orderList, 2);
+ SchedulerTestHelpers.postRecordOrderTask(taskQueue, orderList, 3);
+ SchedulerTestHelpers.postTaskAndBlockUntilRun(taskQueue);
+
+ assertThat(orderList, contains(1, 2, 3));
+ }
+
+ @Test
+ @SmallTest
+ public void testCreateTaskRunner() {
+ TaskRunner taskQueue = PostTask.createTaskRunner(TaskTraits.USER_BLOCKING);
+
+ // This should not timeout.
+ SchedulerTestHelpers.postTaskAndBlockUntilRun(taskQueue);
+ }
+
+ @Test
+ @SmallTest
+ public void testChoreographerFrameTrait() throws Exception {
+ List<Integer> orderList = new ArrayList<>();
+ CountDownLatch latch = new CountDownLatch(2);
+ PostTask.postTask(TaskTraits.CHOREOGRAPHER_FRAME, new Runnable() {
+ @Override
+ public void run() {
+ ThreadUtils.assertOnUiThread();
+ synchronized (orderList) {
+ orderList.add(1);
+ latch.countDown();
+ }
+ }
+ });
+
+ PostTask.postTask(TaskTraits.CHOREOGRAPHER_FRAME, new Runnable() {
+ @Override
+ public void run() {
+ ThreadUtils.assertOnUiThread();
+ synchronized (orderList) {
+ orderList.add(2);
+ latch.countDown();
+ }
+ }
+ });
+
+ latch.await();
+
+ assertThat(orderList, contains(1, 2));
+ }
+}
diff --git a/chromium/base/android/javatests/src/org/chromium/base/task/SequencedTaskRunnerImplTest.java b/chromium/base/android/javatests/src/org/chromium/base/task/SequencedTaskRunnerImplTest.java
new file mode 100644
index 00000000000..641dabed78e
--- /dev/null
+++ b/chromium/base/android/javatests/src/org/chromium/base/task/SequencedTaskRunnerImplTest.java
@@ -0,0 +1,42 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.task;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.collection.IsIterableContainingInOrder.contains;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.test.BaseJUnit4ClassRunner;
+import org.chromium.base.test.task.SchedulerTestHelpers;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Test class for {@link SequencedTaskRunnerImpl}.
+ *
+ * Note due to layering concerns we can't test post native functionality in a
+ * base javatest. Instead see:
+ * content/public/android/javatests/src/org/chromium/content/browser/scheduler/
+ * NativePostTaskTest.java
+ */
+@RunWith(BaseJUnit4ClassRunner.class)
+public class SequencedTaskRunnerImplTest {
+ @Test
+ @SmallTest
+ public void testPreNativeTasksRunInOrder() {
+ TaskRunner taskQueue = new SequencedTaskRunnerImpl(TaskTraits.USER_BLOCKING);
+ List<Integer> orderList = new ArrayList<>();
+ SchedulerTestHelpers.postRecordOrderTask(taskQueue, orderList, 1);
+ SchedulerTestHelpers.postRecordOrderTask(taskQueue, orderList, 2);
+ SchedulerTestHelpers.postRecordOrderTask(taskQueue, orderList, 3);
+ SchedulerTestHelpers.postTaskAndBlockUntilRun(taskQueue);
+ assertThat(orderList, contains(1, 2, 3));
+ }
+}
diff --git a/chromium/base/android/javatests/src/org/chromium/base/task/SingleThreadTaskRunnerImplTest.java b/chromium/base/android/javatests/src/org/chromium/base/task/SingleThreadTaskRunnerImplTest.java
new file mode 100644
index 00000000000..2cb4978e5d9
--- /dev/null
+++ b/chromium/base/android/javatests/src/org/chromium/base/task/SingleThreadTaskRunnerImplTest.java
@@ -0,0 +1,84 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.task;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.collection.IsIterableContainingInOrder.contains;
+
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.test.BaseJUnit4ClassRunner;
+import org.chromium.base.test.task.SchedulerTestHelpers;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Test class for {@link SingleThreadTaskRunnerImpl}.
+ *
+ * Note due to layering concerns we can't test post native functionality in a
+ * base javatest. Instead see:
+ * content/public/android/javatests/src/org/chromium/content/browser/scheduler/
+ * NativePostTaskTest.java
+ */
+@RunWith(BaseJUnit4ClassRunner.class)
+public class SingleThreadTaskRunnerImplTest {
+ @Before
+ public void setUp() {
+ mHandlerThread = new HandlerThread("SingleThreadTaskRunnerImplTest thread");
+ mHandlerThread.start();
+ mHandler = new Handler(mHandlerThread.getLooper());
+ }
+
+ @After
+ public void tearDown() throws InterruptedException {
+ Looper looper = mHandlerThread.getLooper();
+ if (looper != null) {
+ looper.quitSafely();
+ }
+ mHandlerThread.join();
+ }
+
+ private HandlerThread mHandlerThread;
+ private Handler mHandler;
+
+ @Test
+ @SmallTest
+ public void testPreNativePostTask() {
+ TaskRunner taskQueue = new SingleThreadTaskRunnerImpl(mHandler, TaskTraits.USER_BLOCKING);
+ List<Integer> orderList = new ArrayList<>();
+ SchedulerTestHelpers.postRecordOrderTask(taskQueue, orderList, 1);
+ SchedulerTestHelpers.postRecordOrderTask(taskQueue, orderList, 2);
+ SchedulerTestHelpers.postRecordOrderTask(taskQueue, orderList, 3);
+
+ SchedulerTestHelpers.preNativeRunUntilIdle(mHandlerThread);
+ assertThat(orderList, contains(1, 2, 3));
+ }
+
+ @Test
+ @SmallTest
+ public void testBelongsToCurrentThread() {
+ // The handler created during test setup belongs to a different thread.
+ SingleThreadTaskRunner taskQueue =
+ new SingleThreadTaskRunnerImpl(mHandler, TaskTraits.USER_BLOCKING);
+ Assert.assertFalse(taskQueue.belongsToCurrentThread());
+
+ // We create a handler belonging to current thread.
+ Looper.prepare();
+ SingleThreadTaskRunner taskQueueCurrentThread =
+ new SingleThreadTaskRunnerImpl(new Handler(), TaskTraits.USER_BLOCKING);
+ Assert.assertTrue(taskQueueCurrentThread.belongsToCurrentThread());
+ }
+}
diff --git a/chromium/base/android/javatests/src/org/chromium/base/task/TaskRunnerImplTest.java b/chromium/base/android/javatests/src/org/chromium/base/task/TaskRunnerImplTest.java
new file mode 100644
index 00000000000..e098c0c1d05
--- /dev/null
+++ b/chromium/base/android/javatests/src/org/chromium/base/task/TaskRunnerImplTest.java
@@ -0,0 +1,33 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.task;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.test.BaseJUnit4ClassRunner;
+import org.chromium.base.test.task.SchedulerTestHelpers;
+
+/**
+ * Test class for {@link TaskRunner}.
+ *
+ * Note due to layering concerns we can't test post native functionality in a
+ * base javatest. Instead see:
+ * content/public/android/javatests/src/org/chromium/content/browser/scheduler/
+ * NativePostTaskTest.java
+ */
+@RunWith(BaseJUnit4ClassRunner.class)
+public class TaskRunnerImplTest {
+ @Test
+ @SmallTest
+ public void testPreNativePostTask() {
+ TaskRunner taskQueue = new TaskRunnerImpl(TaskTraits.USER_BLOCKING);
+
+ // This should not time out.
+ SchedulerTestHelpers.postTaskAndBlockUntilRun(taskQueue);
+ }
+}
diff --git a/chromium/base/android/javatests/src/org/chromium/base/util/GarbageCollectionTestUtilsTest.java b/chromium/base/android/javatests/src/org/chromium/base/util/GarbageCollectionTestUtilsTest.java
new file mode 100644
index 00000000000..341f330bffe
--- /dev/null
+++ b/chromium/base/android/javatests/src/org/chromium/base/util/GarbageCollectionTestUtilsTest.java
@@ -0,0 +1,43 @@
+// Copyright 2019 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.util;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import static org.chromium.base.GarbageCollectionTestUtils.canBeGarbageCollected;
+
+import android.graphics.Bitmap;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.GarbageCollectionTestUtils;
+import org.chromium.base.test.BaseJUnit4ClassRunner;
+import org.chromium.base.test.UiThreadTest;
+
+import java.lang.ref.WeakReference;
+
+/**
+ * Tests for {@link GarbageCollectionTestUtils}.
+ */
+@RunWith(BaseJUnit4ClassRunner.class)
+public class GarbageCollectionTestUtilsTest {
+ @Test
+ @SmallTest
+ @UiThreadTest
+ public void testCanBeGarbageCollected() {
+ Bitmap bitmap = Bitmap.createBitmap(1, 2, Bitmap.Config.ARGB_8888);
+ WeakReference<Bitmap> bitmapWeakReference = new WeakReference<>(bitmap);
+ assertNotNull(bitmapWeakReference.get());
+ assertFalse(canBeGarbageCollected(bitmapWeakReference));
+
+ bitmap = null;
+ assertTrue(canBeGarbageCollected(bitmapWeakReference));
+ }
+}
diff --git a/chromium/base/android/jni_android.cc b/chromium/base/android/jni_android.cc
new file mode 100644
index 00000000000..55fe882dc3d
--- /dev/null
+++ b/chromium/base/android/jni_android.cc
@@ -0,0 +1,320 @@
+// Copyright 2012 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/jni_android.h"
+
+#include <stddef.h>
+#include <sys/prctl.h>
+
+#include "base/android/java_exception_reporter.h"
+#include "base/android/jni_string.h"
+#include "base/android/jni_utils.h"
+#include "base/base_jni_headers/PiiElider_jni.h"
+#include "base/debug/debugging_buildflags.h"
+#include "base/lazy_instance.h"
+#include "base/logging.h"
+#include "base/threading/thread_local.h"
+#include "build/build_config.h"
+
+namespace base {
+namespace android {
+namespace {
+
+JavaVM* g_jvm = nullptr;
+jobject g_class_loader = nullptr;
+jmethodID g_class_loader_load_class_method_id = 0;
+
+#if BUILDFLAG(CAN_UNWIND_WITH_FRAME_POINTERS)
+base::LazyInstance<base::ThreadLocalPointer<void>>::Leaky
+ g_stack_frame_pointer = LAZY_INSTANCE_INITIALIZER;
+#endif
+
+bool g_fatal_exception_occurred = false;
+
+ScopedJavaLocalRef<jclass> GetClassInternal(JNIEnv* env,
+ const char* class_name,
+ jobject class_loader) {
+ jclass clazz;
+ if (class_loader != nullptr) {
+ // ClassLoader.loadClass expects a classname with components separated by
+ // dots instead of the slashes that JNIEnv::FindClass expects. The JNI
+ // generator generates names with slashes, so we have to replace them here.
+ // TODO(torne): move to an approach where we always use ClassLoader except
+ // for the special case of base::android::GetClassLoader(), and change the
+ // JNI generator to generate dot-separated names. http://crbug.com/461773
+ size_t bufsize = strlen(class_name) + 1;
+ char dotted_name[bufsize];
+ memmove(dotted_name, class_name, bufsize);
+ for (size_t i = 0; i < bufsize; ++i) {
+ if (dotted_name[i] == '/') {
+ dotted_name[i] = '.';
+ }
+ }
+
+ clazz = static_cast<jclass>(
+ env->CallObjectMethod(class_loader, g_class_loader_load_class_method_id,
+ ConvertUTF8ToJavaString(env, dotted_name).obj()));
+ } else {
+ clazz = env->FindClass(class_name);
+ }
+ if (ClearException(env) || !clazz) {
+ LOG(FATAL) << "Failed to find class " << class_name;
+ }
+ return ScopedJavaLocalRef<jclass>(env, clazz);
+}
+
+} // namespace
+
+JNIEnv* AttachCurrentThread() {
+ DCHECK(g_jvm);
+ JNIEnv* env = nullptr;
+ jint ret = g_jvm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_2);
+ if (ret == JNI_EDETACHED || !env) {
+ JavaVMAttachArgs args;
+ args.version = JNI_VERSION_1_2;
+ args.group = nullptr;
+
+ // 16 is the maximum size for thread names on Android.
+ char thread_name[16];
+ int err = prctl(PR_GET_NAME, thread_name);
+ if (err < 0) {
+ DPLOG(ERROR) << "prctl(PR_GET_NAME)";
+ args.name = nullptr;
+ } else {
+ args.name = thread_name;
+ }
+
+#if BUILDFLAG(IS_ANDROID)
+ ret = g_jvm->AttachCurrentThread(&env, &args);
+#else
+ ret = g_jvm->AttachCurrentThread(reinterpret_cast<void**>(&env), &args);
+#endif
+ CHECK_EQ(JNI_OK, ret);
+ }
+ return env;
+}
+
+JNIEnv* AttachCurrentThreadWithName(const std::string& thread_name) {
+ DCHECK(g_jvm);
+ JavaVMAttachArgs args;
+ args.version = JNI_VERSION_1_2;
+ args.name = const_cast<char*>(thread_name.c_str());
+ args.group = nullptr;
+ JNIEnv* env = nullptr;
+#if BUILDFLAG(IS_ANDROID)
+ jint ret = g_jvm->AttachCurrentThread(&env, &args);
+#else
+ jint ret = g_jvm->AttachCurrentThread(reinterpret_cast<void**>(&env), &args);
+#endif
+ CHECK_EQ(JNI_OK, ret);
+ return env;
+}
+
+void DetachFromVM() {
+ // Ignore the return value, if the thread is not attached, DetachCurrentThread
+ // will fail. But it is ok as the native thread may never be attached.
+ if (g_jvm)
+ g_jvm->DetachCurrentThread();
+}
+
+void InitVM(JavaVM* vm) {
+ DCHECK(!g_jvm || g_jvm == vm);
+ g_jvm = vm;
+}
+
+bool IsVMInitialized() {
+ return g_jvm != nullptr;
+}
+
+JavaVM* GetVM() {
+ return g_jvm;
+}
+
+void InitGlobalClassLoader(JNIEnv* env) {
+ DCHECK(g_class_loader == nullptr);
+
+ ScopedJavaLocalRef<jclass> class_loader_clazz =
+ GetClass(env, "java/lang/ClassLoader");
+ CHECK(!ClearException(env));
+ g_class_loader_load_class_method_id =
+ env->GetMethodID(class_loader_clazz.obj(),
+ "loadClass",
+ "(Ljava/lang/String;)Ljava/lang/Class;");
+ CHECK(!ClearException(env));
+
+ // GetClassLoader() caches the reference, so we do not need to wrap it in a
+ // smart pointer as well.
+ g_class_loader = GetClassLoader(env);
+}
+
+ScopedJavaLocalRef<jclass> GetClass(JNIEnv* env,
+ const char* class_name,
+ const char* split_name) {
+ return GetClassInternal(env, class_name,
+ GetSplitClassLoader(env, split_name));
+}
+
+ScopedJavaLocalRef<jclass> GetClass(JNIEnv* env, const char* class_name) {
+ return GetClassInternal(env, class_name, g_class_loader);
+}
+
+// This is duplicated with LazyGetClass below because these are performance
+// sensitive.
+jclass LazyGetClass(JNIEnv* env,
+ const char* class_name,
+ const char* split_name,
+ std::atomic<jclass>* atomic_class_id) {
+ const jclass value = atomic_class_id->load(std::memory_order_acquire);
+ if (value)
+ return value;
+ ScopedJavaGlobalRef<jclass> clazz;
+ clazz.Reset(GetClass(env, class_name, split_name));
+ jclass cas_result = nullptr;
+ if (atomic_class_id->compare_exchange_strong(cas_result, clazz.obj(),
+ std::memory_order_acq_rel)) {
+ // We intentionally leak the global ref since we now storing it as a raw
+ // pointer in |atomic_class_id|.
+ return clazz.Release();
+ } else {
+ return cas_result;
+ }
+}
+
+// This is duplicated with LazyGetClass above because these are performance
+// sensitive.
+jclass LazyGetClass(JNIEnv* env,
+ const char* class_name,
+ std::atomic<jclass>* atomic_class_id) {
+ const jclass value = atomic_class_id->load(std::memory_order_acquire);
+ if (value)
+ return value;
+ ScopedJavaGlobalRef<jclass> clazz;
+ clazz.Reset(GetClass(env, class_name));
+ jclass cas_result = nullptr;
+ if (atomic_class_id->compare_exchange_strong(cas_result, clazz.obj(),
+ std::memory_order_acq_rel)) {
+ // We intentionally leak the global ref since we now storing it as a raw
+ // pointer in |atomic_class_id|.
+ return clazz.Release();
+ } else {
+ return cas_result;
+ }
+}
+
+template<MethodID::Type type>
+jmethodID MethodID::Get(JNIEnv* env,
+ jclass clazz,
+ const char* method_name,
+ const char* jni_signature) {
+ auto get_method_ptr = type == MethodID::TYPE_STATIC ?
+ &JNIEnv::GetStaticMethodID :
+ &JNIEnv::GetMethodID;
+ jmethodID id = (env->*get_method_ptr)(clazz, method_name, jni_signature);
+ if (base::android::ClearException(env) || !id) {
+ LOG(FATAL) << "Failed to find " <<
+ (type == TYPE_STATIC ? "static " : "") <<
+ "method " << method_name << " " << jni_signature;
+ }
+ return id;
+}
+
+// If |atomic_method_id| set, it'll return immediately. Otherwise, it'll call
+// into ::Get() above. If there's a race, it's ok since the values are the same
+// (and the duplicated effort will happen only once).
+template <MethodID::Type type>
+jmethodID MethodID::LazyGet(JNIEnv* env,
+ jclass clazz,
+ const char* method_name,
+ const char* jni_signature,
+ std::atomic<jmethodID>* atomic_method_id) {
+ const jmethodID value = atomic_method_id->load(std::memory_order_acquire);
+ if (value)
+ return value;
+ jmethodID id = MethodID::Get<type>(env, clazz, method_name, jni_signature);
+ atomic_method_id->store(id, std::memory_order_release);
+ return id;
+}
+
+// Various template instantiations.
+template jmethodID MethodID::Get<MethodID::TYPE_STATIC>(
+ JNIEnv* env, jclass clazz, const char* method_name,
+ const char* jni_signature);
+
+template jmethodID MethodID::Get<MethodID::TYPE_INSTANCE>(
+ JNIEnv* env, jclass clazz, const char* method_name,
+ const char* jni_signature);
+
+template jmethodID MethodID::LazyGet<MethodID::TYPE_STATIC>(
+ JNIEnv* env, jclass clazz, const char* method_name,
+ const char* jni_signature, std::atomic<jmethodID>* atomic_method_id);
+
+template jmethodID MethodID::LazyGet<MethodID::TYPE_INSTANCE>(
+ JNIEnv* env, jclass clazz, const char* method_name,
+ const char* jni_signature, std::atomic<jmethodID>* atomic_method_id);
+
+bool HasException(JNIEnv* env) {
+ return env->ExceptionCheck() != JNI_FALSE;
+}
+
+bool ClearException(JNIEnv* env) {
+ if (!HasException(env))
+ return false;
+ env->ExceptionDescribe();
+ env->ExceptionClear();
+ return true;
+}
+
+void CheckException(JNIEnv* env) {
+ if (!HasException(env))
+ return;
+
+ jthrowable java_throwable = env->ExceptionOccurred();
+ if (java_throwable) {
+ // Clear the pending exception, since a local reference is now held.
+ env->ExceptionDescribe();
+ env->ExceptionClear();
+
+ if (g_fatal_exception_occurred) {
+ // Another exception (probably OOM) occurred during GetJavaExceptionInfo.
+ base::android::SetJavaException(
+ "Java OOM'ed in exception handling, check logcat");
+ } else {
+ g_fatal_exception_occurred = true;
+ // RVO should avoid any extra copies of the exception string.
+ base::android::SetJavaException(
+ GetJavaExceptionInfo(env, java_throwable).c_str());
+ }
+ }
+
+ // Now, feel good about it and die.
+ LOG(FATAL) << "Please include Java exception stack in crash report";
+}
+
+std::string GetJavaExceptionInfo(JNIEnv* env, jthrowable java_throwable) {
+ ScopedJavaLocalRef<jstring> sanitized_exception_string =
+ Java_PiiElider_getSanitizedStacktrace(
+ env, ScopedJavaLocalRef(env, java_throwable));
+
+ return ConvertJavaStringToUTF8(sanitized_exception_string);
+}
+
+#if BUILDFLAG(CAN_UNWIND_WITH_FRAME_POINTERS)
+
+JNIStackFrameSaver::JNIStackFrameSaver(void* current_fp) {
+ previous_fp_ = g_stack_frame_pointer.Pointer()->Get();
+ g_stack_frame_pointer.Pointer()->Set(current_fp);
+}
+
+JNIStackFrameSaver::~JNIStackFrameSaver() {
+ g_stack_frame_pointer.Pointer()->Set(previous_fp_);
+}
+
+void* JNIStackFrameSaver::SavedFrame() {
+ return g_stack_frame_pointer.Pointer()->Get();
+}
+
+#endif // BUILDFLAG(CAN_UNWIND_WITH_FRAME_POINTERS)
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/jni_android.h b/chromium/base/android/jni_android.h
new file mode 100644
index 00000000000..652a7cd6e9b
--- /dev/null
+++ b/chromium/base/android/jni_android.h
@@ -0,0 +1,182 @@
+// Copyright 2012 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_JNI_ANDROID_H_
+#define BASE_ANDROID_JNI_ANDROID_H_
+
+#include <jni.h>
+#include <sys/types.h>
+
+#include <atomic>
+#include <string>
+
+#include "base/android/scoped_java_ref.h"
+#include "base/base_export.h"
+#include "base/compiler_specific.h"
+#include "base/debug/debugging_buildflags.h"
+#include "base/debug/stack_trace.h"
+
+#if BUILDFLAG(CAN_UNWIND_WITH_FRAME_POINTERS)
+
+// When profiling is enabled (enable_profiling=true) this macro is added to
+// all generated JNI stubs so that it becomes the last thing that runs before
+// control goes into Java.
+//
+// This macro saves stack frame pointer of the current function. Saved value
+// used later by JNI_LINK_SAVED_FRAME_POINTER.
+#define JNI_SAVE_FRAME_POINTER \
+ base::android::JNIStackFrameSaver jni_frame_saver(__builtin_frame_address(0))
+
+// When profiling is enabled (enable_profiling=true) this macro is added to
+// all generated JNI callbacks so that it becomes the first thing that runs
+// after control returns from Java.
+//
+// This macro links stack frame of the current function to the stack frame
+// saved by JNI_SAVE_FRAME_POINTER, allowing frame-based unwinding
+// (used by the heap profiler) to produce complete traces.
+#define JNI_LINK_SAVED_FRAME_POINTER \
+ base::debug::ScopedStackFrameLinker jni_frame_linker( \
+ __builtin_frame_address(0), \
+ base::android::JNIStackFrameSaver::SavedFrame())
+
+#else
+
+// Frame-based stack unwinding is not supported, do nothing.
+#define JNI_SAVE_FRAME_POINTER
+#define JNI_LINK_SAVED_FRAME_POINTER
+
+#endif // BUILDFLAG(CAN_UNWIND_WITH_FRAME_POINTERS)
+
+namespace base {
+namespace android {
+
+// Used to mark symbols to be exported in a shared library's symbol table.
+#define JNI_EXPORT __attribute__ ((visibility("default")))
+
+// Contains the registration method information for initializing JNI bindings.
+struct RegistrationMethod {
+ const char* name;
+ bool (*func)(JNIEnv* env);
+};
+
+// Attaches the current thread to the VM (if necessary) and return the JNIEnv*.
+BASE_EXPORT JNIEnv* AttachCurrentThread();
+
+// Same to AttachCurrentThread except that thread name will be set to
+// |thread_name| if it is the first call. Otherwise, thread_name won't be
+// changed. AttachCurrentThread() doesn't regard underlying platform thread
+// name, but just resets it to "Thread-???". This function should be called
+// right after new thread is created if it is important to keep thread name.
+BASE_EXPORT JNIEnv* AttachCurrentThreadWithName(const std::string& thread_name);
+
+// Detaches the current thread from VM if it is attached.
+BASE_EXPORT void DetachFromVM();
+
+// Initializes the global JVM.
+BASE_EXPORT void InitVM(JavaVM* vm);
+
+// Returns true if the global JVM has been initialized.
+BASE_EXPORT bool IsVMInitialized();
+
+// Returns the global JVM, or nullptr if it has not been initialized.
+BASE_EXPORT JavaVM* GetVM();
+
+// Initializes the global ClassLoader used by the GetClass and LazyGetClass
+// methods. This is needed because JNI will use the base ClassLoader when there
+// is no Java code on the stack. The base ClassLoader doesn't know about any of
+// the application classes and will fail to lookup anything other than system
+// classes.
+void InitGlobalClassLoader(JNIEnv* env);
+
+// Finds the class named |class_name| and returns it.
+// Use this method instead of invoking directly the JNI FindClass method (to
+// prevent leaking local references).
+// This method triggers a fatal assertion if the class could not be found.
+// Use HasClass if you need to check whether the class exists.
+BASE_EXPORT ScopedJavaLocalRef<jclass> GetClass(JNIEnv* env,
+ const char* class_name,
+ const char* split_name);
+BASE_EXPORT ScopedJavaLocalRef<jclass> GetClass(JNIEnv* env,
+ const char* class_name);
+
+// The method will initialize |atomic_class_id| to contain a global ref to the
+// class. And will return that ref on subsequent calls. It's the caller's
+// responsibility to release the ref when it is no longer needed.
+// The caller is responsible to zero-initialize |atomic_method_id|.
+// It's fine to simultaneously call this on multiple threads referencing the
+// same |atomic_method_id|.
+BASE_EXPORT jclass LazyGetClass(JNIEnv* env,
+ const char* class_name,
+ const char* split_name,
+ std::atomic<jclass>* atomic_class_id);
+BASE_EXPORT jclass LazyGetClass(
+ JNIEnv* env,
+ const char* class_name,
+ std::atomic<jclass>* atomic_class_id);
+
+// This class is a wrapper for JNIEnv Get(Static)MethodID.
+class BASE_EXPORT MethodID {
+ public:
+ enum Type {
+ TYPE_STATIC,
+ TYPE_INSTANCE,
+ };
+
+ // Returns the method ID for the method with the specified name and signature.
+ // This method triggers a fatal assertion if the method could not be found.
+ template<Type type>
+ static jmethodID Get(JNIEnv* env,
+ jclass clazz,
+ const char* method_name,
+ const char* jni_signature);
+
+ // The caller is responsible to zero-initialize |atomic_method_id|.
+ // It's fine to simultaneously call this on multiple threads referencing the
+ // same |atomic_method_id|.
+ template<Type type>
+ static jmethodID LazyGet(JNIEnv* env,
+ jclass clazz,
+ const char* method_name,
+ const char* jni_signature,
+ std::atomic<jmethodID>* atomic_method_id);
+};
+
+// Returns true if an exception is pending in the provided JNIEnv*.
+BASE_EXPORT bool HasException(JNIEnv* env);
+
+// If an exception is pending in the provided JNIEnv*, this function clears it
+// and returns true.
+BASE_EXPORT bool ClearException(JNIEnv* env);
+
+// This function will call CHECK() macro if there's any pending exception.
+BASE_EXPORT void CheckException(JNIEnv* env);
+
+// This returns a string representation of the java stack trace.
+BASE_EXPORT std::string GetJavaExceptionInfo(JNIEnv* env,
+ jthrowable java_throwable);
+
+#if BUILDFLAG(CAN_UNWIND_WITH_FRAME_POINTERS)
+
+// Saves caller's PC and stack frame in a thread-local variable.
+// Implemented only when profiling is enabled (enable_profiling=true).
+class BASE_EXPORT JNIStackFrameSaver {
+ public:
+ JNIStackFrameSaver(void* current_fp);
+
+ JNIStackFrameSaver(const JNIStackFrameSaver&) = delete;
+ JNIStackFrameSaver& operator=(const JNIStackFrameSaver&) = delete;
+
+ ~JNIStackFrameSaver();
+ static void* SavedFrame();
+
+ private:
+ void* previous_fp_;
+};
+
+#endif // BUILDFLAG(CAN_UNWIND_WITH_FRAME_POINTERS)
+
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_JNI_ANDROID_H_
diff --git a/chromium/base/android/jni_android_unittest.cc b/chromium/base/android/jni_android_unittest.cc
new file mode 100644
index 00000000000..8f04d829430
--- /dev/null
+++ b/chromium/base/android/jni_android_unittest.cc
@@ -0,0 +1,62 @@
+// Copyright 2012 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/jni_android.h"
+
+#include "base/at_exit.h"
+#include "base/logging.h"
+#include "base/time/time.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace base {
+namespace android {
+
+namespace {
+
+std::atomic<jmethodID> g_atomic_id(nullptr);
+int LazyMethodIDCall(JNIEnv* env, jclass clazz, int p) {
+ jmethodID id = base::android::MethodID::LazyGet<
+ base::android::MethodID::TYPE_STATIC>(
+ env, clazz,
+ "abs",
+ "(I)I",
+ &g_atomic_id);
+
+ return env->CallStaticIntMethod(clazz, id, p);
+}
+
+int MethodIDCall(JNIEnv* env, jclass clazz, jmethodID id, int p) {
+ return env->CallStaticIntMethod(clazz, id, p);
+}
+
+} // namespace
+
+TEST(JNIAndroidMicrobenchmark, MethodId) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jclass> clazz(GetClass(env, "java/lang/Math"));
+ base::Time start_lazy = base::Time::Now();
+ int o = 0;
+ for (int i = 0; i < 1024; ++i)
+ o += LazyMethodIDCall(env, clazz.obj(), i);
+ base::Time end_lazy = base::Time::Now();
+
+ jmethodID id = g_atomic_id;
+ base::Time start = base::Time::Now();
+ for (int i = 0; i < 1024; ++i)
+ o += MethodIDCall(env, clazz.obj(), id, i);
+ base::Time end = base::Time::Now();
+
+ // On a Galaxy Nexus, results were in the range of:
+ // JNI LazyMethodIDCall (us) 1984
+ // JNI MethodIDCall (us) 1861
+ LOG(ERROR) << "JNI LazyMethodIDCall (us) " <<
+ base::TimeDelta(end_lazy - start_lazy).InMicroseconds();
+ LOG(ERROR) << "JNI MethodIDCall (us) " <<
+ base::TimeDelta(end - start).InMicroseconds();
+ LOG(ERROR) << "JNI " << o;
+}
+
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/jni_array.cc b/chromium/base/android/jni_array.cc
new file mode 100644
index 00000000000..2de7862b08a
--- /dev/null
+++ b/chromium/base/android/jni_array.cc
@@ -0,0 +1,539 @@
+// Copyright 2012 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/jni_array.h"
+
+#include "base/android/jni_android.h"
+#include "base/android/jni_string.h"
+#include "base/check_op.h"
+#include "base/numerics/safe_conversions.h"
+
+namespace base::android {
+
+ScopedJavaLocalRef<jbyteArray> ToJavaByteArray(JNIEnv* env,
+ const uint8_t* bytes,
+ size_t len) {
+ const jsize len_jsize = checked_cast<jsize>(len);
+ jbyteArray byte_array = env->NewByteArray(len_jsize);
+ CheckException(env);
+ DCHECK(byte_array);
+
+ env->SetByteArrayRegion(byte_array, 0, len_jsize,
+ reinterpret_cast<const jbyte*>(bytes));
+ CheckException(env);
+
+ return ScopedJavaLocalRef<jbyteArray>(env, byte_array);
+}
+
+ScopedJavaLocalRef<jbyteArray> ToJavaByteArray(
+ JNIEnv* env,
+ base::span<const uint8_t> bytes) {
+ return ToJavaByteArray(env, bytes.data(), bytes.size());
+}
+
+ScopedJavaLocalRef<jbyteArray> ToJavaByteArray(JNIEnv* env,
+ const std::string& str) {
+ return ToJavaByteArray(env, reinterpret_cast<const uint8_t*>(str.data()),
+ str.size());
+}
+
+ScopedJavaLocalRef<jbooleanArray> ToJavaBooleanArray(JNIEnv* env,
+ const bool* bools,
+ size_t len) {
+ const jsize len_jsize = checked_cast<jsize>(len);
+ jbooleanArray boolean_array = env->NewBooleanArray(len_jsize);
+ CheckException(env);
+ DCHECK(boolean_array);
+
+ env->SetBooleanArrayRegion(boolean_array, 0, len_jsize,
+ reinterpret_cast<const jboolean*>(bools));
+ CheckException(env);
+
+ return ScopedJavaLocalRef<jbooleanArray>(env, boolean_array);
+}
+
+ScopedJavaLocalRef<jintArray> ToJavaIntArray(JNIEnv* env,
+ const int* ints,
+ size_t len) {
+ const jsize len_jsize = checked_cast<jsize>(len);
+ jintArray int_array = env->NewIntArray(len_jsize);
+ CheckException(env);
+ DCHECK(int_array);
+
+ env->SetIntArrayRegion(int_array, 0, len_jsize,
+ reinterpret_cast<const jint*>(ints));
+ CheckException(env);
+
+ return ScopedJavaLocalRef<jintArray>(env, int_array);
+}
+
+ScopedJavaLocalRef<jintArray> ToJavaIntArray(JNIEnv* env,
+ base::span<const int> ints) {
+ return ToJavaIntArray(env, ints.data(), ints.size());
+}
+
+ScopedJavaLocalRef<jlongArray> ToJavaLongArray(JNIEnv* env,
+ const int64_t* longs,
+ size_t len) {
+ const jsize len_jsize = checked_cast<jsize>(len);
+ jlongArray long_array = env->NewLongArray(len_jsize);
+ CheckException(env);
+ DCHECK(long_array);
+
+ env->SetLongArrayRegion(long_array, 0, len_jsize,
+ reinterpret_cast<const jlong*>(longs));
+ CheckException(env);
+
+ return ScopedJavaLocalRef<jlongArray>(env, long_array);
+}
+
+// Returns a new Java long array converted from the given int64_t array.
+BASE_EXPORT ScopedJavaLocalRef<jlongArray> ToJavaLongArray(
+ JNIEnv* env,
+ base::span<const int64_t> longs) {
+ return ToJavaLongArray(env, longs.data(), longs.size());
+}
+
+// Returns a new Java float array converted from the given C++ float array.
+BASE_EXPORT ScopedJavaLocalRef<jfloatArray>
+ToJavaFloatArray(JNIEnv* env, const float* floats, size_t len) {
+ const jsize len_jsize = checked_cast<jsize>(len);
+ jfloatArray float_array = env->NewFloatArray(len_jsize);
+ CheckException(env);
+ DCHECK(float_array);
+
+ env->SetFloatArrayRegion(float_array, 0, len_jsize,
+ reinterpret_cast<const jfloat*>(floats));
+ CheckException(env);
+
+ return ScopedJavaLocalRef<jfloatArray>(env, float_array);
+}
+
+BASE_EXPORT ScopedJavaLocalRef<jfloatArray> ToJavaFloatArray(
+ JNIEnv* env,
+ base::span<const float> floats) {
+ return ToJavaFloatArray(env, floats.data(), floats.size());
+}
+
+BASE_EXPORT ScopedJavaLocalRef<jdoubleArray>
+ToJavaDoubleArray(JNIEnv* env, const double* doubles, size_t len) {
+ const jsize len_jsize = checked_cast<jsize>(len);
+ jdoubleArray double_array = env->NewDoubleArray(len_jsize);
+ CheckException(env);
+ DCHECK(double_array);
+
+ env->SetDoubleArrayRegion(double_array, 0, len_jsize,
+ reinterpret_cast<const jdouble*>(doubles));
+ CheckException(env);
+
+ return ScopedJavaLocalRef<jdoubleArray>(env, double_array);
+}
+
+BASE_EXPORT ScopedJavaLocalRef<jdoubleArray> ToJavaDoubleArray(
+ JNIEnv* env,
+ base::span<const double> doubles) {
+ return ToJavaDoubleArray(env, doubles.data(), doubles.size());
+}
+
+BASE_EXPORT ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfObjects(
+ JNIEnv* env,
+ ScopedJavaLocalRef<jclass> clazz,
+ base::span<const ScopedJavaLocalRef<jobject>> v) {
+ jobjectArray joa =
+ env->NewObjectArray(checked_cast<jsize>(v.size()), clazz.obj(), nullptr);
+ CheckException(env);
+
+ for (size_t i = 0; i < v.size(); ++i) {
+ env->SetObjectArrayElement(joa, static_cast<jsize>(i), v[i].obj());
+ }
+ return ScopedJavaLocalRef<jobjectArray>(env, joa);
+}
+
+BASE_EXPORT ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfObjects(
+ JNIEnv* env,
+ base::span<const ScopedJavaLocalRef<jobject>> v) {
+ return ToJavaArrayOfObjects(env, GetClass(env, "java/lang/Object"), v);
+}
+
+BASE_EXPORT ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfObjects(
+ JNIEnv* env,
+ base::span<const ScopedJavaGlobalRef<jobject>> v) {
+ ScopedJavaLocalRef<jclass> object_array_clazz =
+ GetClass(env, "java/lang/Object");
+ jobjectArray joa = env->NewObjectArray(checked_cast<jsize>(v.size()),
+ object_array_clazz.obj(), nullptr);
+ CheckException(env);
+
+ for (size_t i = 0; i < v.size(); ++i) {
+ env->SetObjectArrayElement(joa, static_cast<jsize>(i), v[i].obj());
+ }
+ return ScopedJavaLocalRef<jobjectArray>(env, joa);
+}
+
+BASE_EXPORT ScopedJavaLocalRef<jobjectArray> ToTypedJavaArrayOfObjects(
+ JNIEnv* env,
+ base::span<const ScopedJavaLocalRef<jobject>> v,
+ ScopedJavaLocalRef<jclass> type) {
+ jobjectArray joa =
+ env->NewObjectArray(checked_cast<jsize>(v.size()), type.obj(), nullptr);
+ CheckException(env);
+
+ for (size_t i = 0; i < v.size(); ++i) {
+ env->SetObjectArrayElement(joa, static_cast<jsize>(i), v[i].obj());
+ }
+ return ScopedJavaLocalRef<jobjectArray>(env, joa);
+}
+
+BASE_EXPORT ScopedJavaLocalRef<jobjectArray> ToTypedJavaArrayOfObjects(
+ JNIEnv* env,
+ base::span<const ScopedJavaGlobalRef<jobject>> v,
+ ScopedJavaLocalRef<jclass> type) {
+ jobjectArray joa =
+ env->NewObjectArray(checked_cast<jsize>(v.size()), type.obj(), nullptr);
+ CheckException(env);
+
+ for (size_t i = 0; i < v.size(); ++i) {
+ env->SetObjectArrayElement(joa, static_cast<jsize>(i), v[i].obj());
+ }
+ return ScopedJavaLocalRef<jobjectArray>(env, joa);
+}
+
+ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfByteArray(
+ JNIEnv* env,
+ base::span<const std::string> v) {
+ ScopedJavaLocalRef<jclass> byte_array_clazz = GetClass(env, "[B");
+ jobjectArray joa = env->NewObjectArray(checked_cast<jsize>(v.size()),
+ byte_array_clazz.obj(), nullptr);
+ CheckException(env);
+
+ for (size_t i = 0; i < v.size(); ++i) {
+ ScopedJavaLocalRef<jbyteArray> byte_array = ToJavaByteArray(
+ env, reinterpret_cast<const uint8_t*>(v[i].data()), v[i].length());
+ env->SetObjectArrayElement(joa, static_cast<jsize>(i), byte_array.obj());
+ }
+ return ScopedJavaLocalRef<jobjectArray>(env, joa);
+}
+
+ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfByteArray(
+ JNIEnv* env,
+ base::span<const std::vector<uint8_t>> v) {
+ ScopedJavaLocalRef<jclass> byte_array_clazz = GetClass(env, "[B");
+ jobjectArray joa = env->NewObjectArray(checked_cast<jsize>(v.size()),
+ byte_array_clazz.obj(), nullptr);
+ CheckException(env);
+
+ for (size_t i = 0; i < v.size(); ++i) {
+ ScopedJavaLocalRef<jbyteArray> byte_array =
+ ToJavaByteArray(env, v[i].data(), v[i].size());
+ env->SetObjectArrayElement(joa, static_cast<jsize>(i), byte_array.obj());
+ }
+ return ScopedJavaLocalRef<jobjectArray>(env, joa);
+}
+
+ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfStrings(
+ JNIEnv* env,
+ base::span<const std::string> v) {
+ ScopedJavaLocalRef<jclass> string_clazz = GetClass(env, "java/lang/String");
+ jobjectArray joa = env->NewObjectArray(checked_cast<jsize>(v.size()),
+ string_clazz.obj(), nullptr);
+ CheckException(env);
+
+ for (size_t i = 0; i < v.size(); ++i) {
+ ScopedJavaLocalRef<jstring> item = ConvertUTF8ToJavaString(env, v[i]);
+ env->SetObjectArrayElement(joa, static_cast<jsize>(i), item.obj());
+ }
+ return ScopedJavaLocalRef<jobjectArray>(env, joa);
+}
+
+ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfStringArray(
+ JNIEnv* env,
+ base::span<const std::vector<std::string>> vec_outer) {
+ ScopedJavaLocalRef<jclass> string_array_clazz =
+ GetClass(env, "[Ljava/lang/String;");
+
+ jobjectArray joa = env->NewObjectArray(checked_cast<jsize>(vec_outer.size()),
+ string_array_clazz.obj(), nullptr);
+ CheckException(env);
+
+ for (size_t i = 0; i < vec_outer.size(); ++i) {
+ ScopedJavaLocalRef<jobjectArray> inner =
+ ToJavaArrayOfStrings(env, vec_outer[i]);
+ env->SetObjectArrayElement(joa, static_cast<jsize>(i), inner.obj());
+ }
+
+ return ScopedJavaLocalRef<jobjectArray>(env, joa);
+}
+
+ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfStringArray(
+ JNIEnv* env,
+ base::span<const std::vector<std::u16string>> vec_outer) {
+ ScopedJavaLocalRef<jclass> string_array_clazz =
+ GetClass(env, "[Ljava/lang/String;");
+
+ jobjectArray joa = env->NewObjectArray(checked_cast<jsize>(vec_outer.size()),
+ string_array_clazz.obj(), nullptr);
+ CheckException(env);
+
+ for (size_t i = 0; i < vec_outer.size(); ++i) {
+ ScopedJavaLocalRef<jobjectArray> inner =
+ ToJavaArrayOfStrings(env, vec_outer[i]);
+ env->SetObjectArrayElement(joa, static_cast<jsize>(i), inner.obj());
+ }
+
+ return ScopedJavaLocalRef<jobjectArray>(env, joa);
+}
+
+ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfStrings(
+ JNIEnv* env,
+ base::span<const std::u16string> v) {
+ ScopedJavaLocalRef<jclass> string_clazz = GetClass(env, "java/lang/String");
+ jobjectArray joa = env->NewObjectArray(checked_cast<jsize>(v.size()),
+ string_clazz.obj(), nullptr);
+ CheckException(env);
+
+ for (size_t i = 0; i < v.size(); ++i) {
+ ScopedJavaLocalRef<jstring> item = ConvertUTF16ToJavaString(env, v[i]);
+ env->SetObjectArrayElement(joa, static_cast<jsize>(i), item.obj());
+ }
+ return ScopedJavaLocalRef<jobjectArray>(env, joa);
+}
+
+void AppendJavaStringArrayToStringVector(JNIEnv* env,
+ const JavaRef<jobjectArray>& array,
+ std::vector<std::u16string>* out) {
+ DCHECK(out);
+ if (!array)
+ return;
+ size_t len = SafeGetArrayLength(env, array);
+ size_t back = out->size();
+ out->resize(back + len);
+ for (size_t i = 0; i < len; ++i) {
+ ScopedJavaLocalRef<jstring> str(
+ env, static_cast<jstring>(env->GetObjectArrayElement(
+ array.obj(), static_cast<jsize>(i))));
+ ConvertJavaStringToUTF16(env, str.obj(), out->data() + back + i);
+ }
+}
+
+void AppendJavaStringArrayToStringVector(JNIEnv* env,
+ const JavaRef<jobjectArray>& array,
+ std::vector<std::string>* out) {
+ DCHECK(out);
+ if (!array)
+ return;
+ size_t len = SafeGetArrayLength(env, array);
+ size_t back = out->size();
+ out->resize(back + len);
+ for (size_t i = 0; i < len; ++i) {
+ ScopedJavaLocalRef<jstring> str(
+ env, static_cast<jstring>(env->GetObjectArrayElement(
+ array.obj(), static_cast<jsize>(i))));
+ ConvertJavaStringToUTF8(env, str.obj(), out->data() + back + i);
+ }
+}
+
+void AppendJavaByteArrayToByteVector(JNIEnv* env,
+ const JavaRef<jbyteArray>& byte_array,
+ std::vector<uint8_t>* out) {
+ DCHECK(out);
+ if (!byte_array)
+ return;
+ size_t len = SafeGetArrayLength(env, byte_array);
+ if (!len)
+ return;
+ size_t back = out->size();
+ out->resize(back + len);
+ env->GetByteArrayRegion(byte_array.obj(), 0, static_cast<jsize>(len),
+ reinterpret_cast<int8_t*>(out->data() + back));
+}
+
+void JavaByteArrayToByteVector(JNIEnv* env,
+ const JavaRef<jbyteArray>& byte_array,
+ std::vector<uint8_t>* out) {
+ DCHECK(out);
+ DCHECK(byte_array);
+ out->clear();
+ AppendJavaByteArrayToByteVector(env, byte_array, out);
+}
+
+size_t JavaByteArrayToByteSpan(JNIEnv* env,
+ const JavaRef<jbyteArray>& byte_array,
+ base::span<uint8_t> dest) {
+ CHECK(byte_array);
+ size_t len = SafeGetArrayLength(env, byte_array);
+ size_t span_len = dest.size_bytes();
+ CHECK_GE(span_len, len) << "Target span is too small, java array size: "
+ << len << ", span size: " << span_len;
+ env->GetByteArrayRegion(byte_array.obj(), 0, static_cast<jsize>(len),
+ reinterpret_cast<int8_t*>(dest.data()));
+ return len;
+}
+
+void JavaByteArrayToString(JNIEnv* env,
+ const JavaRef<jbyteArray>& byte_array,
+ std::string* out) {
+ DCHECK(out);
+ DCHECK(byte_array);
+
+ std::vector<uint8_t> byte_vector;
+ JavaByteArrayToByteVector(env, byte_array, &byte_vector);
+ out->assign(byte_vector.begin(), byte_vector.end());
+}
+
+void JavaBooleanArrayToBoolVector(JNIEnv* env,
+ const JavaRef<jbooleanArray>& boolean_array,
+ std::vector<bool>* out) {
+ DCHECK(out);
+ if (!boolean_array)
+ return;
+ size_t len = SafeGetArrayLength(env, boolean_array);
+ if (!len)
+ return;
+ out->resize(len);
+ // It is not possible to get bool* out of vector<bool>.
+ jboolean* values = env->GetBooleanArrayElements(boolean_array.obj(), nullptr);
+ for (size_t i = 0; i < len; ++i) {
+ out->at(i) = static_cast<bool>(values[i]);
+ }
+ env->ReleaseBooleanArrayElements(boolean_array.obj(), values, JNI_ABORT);
+}
+
+void JavaIntArrayToIntVector(JNIEnv* env,
+ const JavaRef<jintArray>& int_array,
+ std::vector<int>* out) {
+ DCHECK(out);
+ size_t len = SafeGetArrayLength(env, int_array);
+ out->resize(len);
+ if (!len)
+ return;
+ env->GetIntArrayRegion(int_array.obj(), 0, static_cast<jsize>(len),
+ out->data());
+}
+
+void JavaLongArrayToInt64Vector(JNIEnv* env,
+ const JavaRef<jlongArray>& long_array,
+ std::vector<int64_t>* out) {
+ DCHECK(out);
+ std::vector<jlong> temp;
+ JavaLongArrayToLongVector(env, long_array, &temp);
+ out->resize(0);
+ out->insert(out->begin(), temp.begin(), temp.end());
+}
+
+void JavaLongArrayToLongVector(JNIEnv* env,
+ const JavaRef<jlongArray>& long_array,
+ std::vector<jlong>* out) {
+ DCHECK(out);
+ size_t len = SafeGetArrayLength(env, long_array);
+ out->resize(len);
+ if (!len)
+ return;
+ env->GetLongArrayRegion(long_array.obj(), 0, static_cast<jsize>(len),
+ out->data());
+}
+
+void JavaFloatArrayToFloatVector(JNIEnv* env,
+ const JavaRef<jfloatArray>& float_array,
+ std::vector<float>* out) {
+ DCHECK(out);
+ size_t len = SafeGetArrayLength(env, float_array);
+ out->resize(len);
+ if (!len)
+ return;
+ env->GetFloatArrayRegion(float_array.obj(), 0, static_cast<jsize>(len),
+ out->data());
+}
+
+void JavaDoubleArrayToDoubleVector(JNIEnv* env,
+ const JavaRef<jdoubleArray>& double_array,
+ std::vector<double>* out) {
+ DCHECK(out);
+ size_t len = SafeGetArrayLength(env, double_array);
+ out->resize(len);
+ if (!len)
+ return;
+ env->GetDoubleArrayRegion(double_array.obj(), 0, static_cast<jsize>(len),
+ out->data());
+}
+
+void JavaArrayOfByteArrayToStringVector(JNIEnv* env,
+ const JavaRef<jobjectArray>& array,
+ std::vector<std::string>* out) {
+ DCHECK(out);
+ size_t len = SafeGetArrayLength(env, array);
+ out->resize(len);
+ for (size_t i = 0; i < len; ++i) {
+ ScopedJavaLocalRef<jbyteArray> bytes_array(
+ env, static_cast<jbyteArray>(env->GetObjectArrayElement(
+ array.obj(), static_cast<jsize>(i))));
+ size_t bytes_len = SafeGetArrayLength(env, bytes_array);
+ jbyte* bytes = env->GetByteArrayElements(bytes_array.obj(), nullptr);
+ (*out)[i].assign(reinterpret_cast<const char*>(bytes), bytes_len);
+ env->ReleaseByteArrayElements(bytes_array.obj(), bytes, JNI_ABORT);
+ }
+}
+
+void JavaArrayOfByteArrayToBytesVector(JNIEnv* env,
+ const JavaRef<jobjectArray>& array,
+ std::vector<std::vector<uint8_t>>* out) {
+ DCHECK(out);
+ const size_t len = SafeGetArrayLength(env, array);
+ out->resize(len);
+ for (size_t i = 0; i < len; ++i) {
+ ScopedJavaLocalRef<jbyteArray> bytes_array(
+ env, static_cast<jbyteArray>(env->GetObjectArrayElement(
+ array.obj(), static_cast<jsize>(i))));
+ JavaByteArrayToByteVector(env, bytes_array, &(*out)[i]);
+ }
+}
+
+void Java2dStringArrayTo2dStringVector(
+ JNIEnv* env,
+ const JavaRef<jobjectArray>& array,
+ std::vector<std::vector<std::u16string>>* out) {
+ DCHECK(out);
+ size_t len = SafeGetArrayLength(env, array);
+ out->resize(len);
+ for (size_t i = 0; i < len; ++i) {
+ ScopedJavaLocalRef<jobjectArray> strings_array(
+ env, static_cast<jobjectArray>(env->GetObjectArrayElement(
+ array.obj(), static_cast<jsize>(i))));
+
+ out->at(i).clear();
+ AppendJavaStringArrayToStringVector(env, strings_array, &out->at(i));
+ }
+}
+
+void Java2dStringArrayTo2dStringVector(
+ JNIEnv* env,
+ const JavaRef<jobjectArray>& array,
+ std::vector<std::vector<std::string>>* out) {
+ DCHECK(out);
+ size_t len = SafeGetArrayLength(env, array);
+ out->resize(len);
+ for (size_t i = 0; i < len; ++i) {
+ ScopedJavaLocalRef<jobjectArray> strings_array(
+ env, static_cast<jobjectArray>(env->GetObjectArrayElement(
+ array.obj(), static_cast<jsize>(i))));
+
+ out->at(i).clear();
+ AppendJavaStringArrayToStringVector(env, strings_array, &out->at(i));
+ }
+}
+
+void JavaArrayOfIntArrayToIntVector(JNIEnv* env,
+ const JavaRef<jobjectArray>& array,
+ std::vector<std::vector<int>>* out) {
+ DCHECK(out);
+ size_t len = SafeGetArrayLength(env, array);
+ out->resize(len);
+ for (size_t i = 0; i < len; ++i) {
+ ScopedJavaLocalRef<jintArray> int_array(
+ env, static_cast<jintArray>(env->GetObjectArrayElement(
+ array.obj(), static_cast<jsize>(i))));
+ JavaIntArrayToIntVector(env, int_array, &out->at(i));
+ }
+}
+
+} // namespace base::android
diff --git a/chromium/base/android/jni_array.h b/chromium/base/android/jni_array.h
new file mode 100644
index 00000000000..ee3bbb504d9
--- /dev/null
+++ b/chromium/base/android/jni_array.h
@@ -0,0 +1,247 @@
+// Copyright 2012 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_JNI_ARRAY_H_
+#define BASE_ANDROID_JNI_ARRAY_H_
+
+#include <jni.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <ostream>
+#include <string>
+#include <vector>
+
+#include "base/android/scoped_java_ref.h"
+#include "base/check_op.h"
+#include "base/containers/span.h"
+
+namespace base::android {
+
+// As |GetArrayLength| makes no guarantees about the returned value (e.g., it
+// may be -1 if |array| is not a valid Java array), provide a safe wrapper
+// that always returns a valid, non-negative size.
+// Returns the length of Java array.
+template <typename JavaArrayType>
+BASE_EXPORT size_t SafeGetArrayLength(JNIEnv* env,
+ const JavaRef<JavaArrayType>& jarray) {
+ DCHECK(jarray);
+ jsize length = env->GetArrayLength(jarray.obj());
+ DCHECK_GE(length, 0) << "Invalid array length: " << length;
+ return static_cast<size_t>(std::max(0, length));
+}
+
+// Returns a new Java byte array converted from the given bytes array.
+BASE_EXPORT ScopedJavaLocalRef<jbyteArray> ToJavaByteArray(JNIEnv* env,
+ const uint8_t* bytes,
+ size_t len);
+
+BASE_EXPORT ScopedJavaLocalRef<jbyteArray> ToJavaByteArray(
+ JNIEnv* env,
+ base::span<const uint8_t> bytes);
+
+// Returns a new Java byte array converted from the given string. No UTF-8
+// conversion is performed.
+BASE_EXPORT ScopedJavaLocalRef<jbyteArray> ToJavaByteArray(
+ JNIEnv* env,
+ const std::string& str);
+
+// Returns a new Java boolean array converted from the given bool array.
+BASE_EXPORT ScopedJavaLocalRef<jbooleanArray>
+ToJavaBooleanArray(JNIEnv* env, const bool* bools, size_t len);
+
+// Returns a new Java int array converted from the given int array.
+BASE_EXPORT ScopedJavaLocalRef<jintArray> ToJavaIntArray(
+ JNIEnv* env, const int* ints, size_t len);
+
+BASE_EXPORT ScopedJavaLocalRef<jintArray> ToJavaIntArray(
+ JNIEnv* env,
+ base::span<const int> ints);
+
+// Returns a new Java long array converted from the given int64_t array.
+BASE_EXPORT ScopedJavaLocalRef<jlongArray> ToJavaLongArray(JNIEnv* env,
+ const int64_t* longs,
+ size_t len);
+
+BASE_EXPORT ScopedJavaLocalRef<jlongArray> ToJavaLongArray(
+ JNIEnv* env,
+ base::span<const int64_t> longs);
+
+// Returns a new Java float array converted from the given C++ float array.
+BASE_EXPORT ScopedJavaLocalRef<jfloatArray> ToJavaFloatArray(
+ JNIEnv* env, const float* floats, size_t len);
+
+BASE_EXPORT ScopedJavaLocalRef<jfloatArray> ToJavaFloatArray(
+ JNIEnv* env,
+ base::span<const float> floats);
+
+// Returns a new Java double array converted from the given C++ double array.
+BASE_EXPORT ScopedJavaLocalRef<jdoubleArray>
+ToJavaDoubleArray(JNIEnv* env, const double* doubles, size_t len);
+
+BASE_EXPORT ScopedJavaLocalRef<jdoubleArray> ToJavaDoubleArray(
+ JNIEnv* env,
+ base::span<const double> doubles);
+
+// Returns a new clazz[] with the content of |v|.
+BASE_EXPORT ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfObjects(
+ JNIEnv* env,
+ ScopedJavaLocalRef<jclass> clazz,
+ base::span<const ScopedJavaLocalRef<jobject>> v);
+
+// Returns a new Object[] with the content of |v|.
+BASE_EXPORT ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfObjects(
+ JNIEnv* env,
+ base::span<const ScopedJavaLocalRef<jobject>> v);
+BASE_EXPORT ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfObjects(
+ JNIEnv* env,
+ base::span<const ScopedJavaGlobalRef<jobject>> v);
+
+// Returns a new Type[] with the content of |v|.
+BASE_EXPORT ScopedJavaLocalRef<jobjectArray> ToTypedJavaArrayOfObjects(
+ JNIEnv* env,
+ base::span<const ScopedJavaLocalRef<jobject>> v,
+ ScopedJavaLocalRef<jclass> type);
+BASE_EXPORT ScopedJavaLocalRef<jobjectArray> ToTypedJavaArrayOfObjects(
+ JNIEnv* env,
+ base::span<const ScopedJavaGlobalRef<jobject>> v,
+ ScopedJavaLocalRef<jclass> type);
+
+// Returns a array of Java byte array converted from |v|.
+BASE_EXPORT ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfByteArray(
+ JNIEnv* env,
+ base::span<const std::string> v);
+
+BASE_EXPORT ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfByteArray(
+ JNIEnv* env,
+ base::span<const std::vector<uint8_t>> v);
+
+BASE_EXPORT ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfStrings(
+ JNIEnv* env,
+ base::span<const std::string> v);
+
+BASE_EXPORT ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfStrings(
+ JNIEnv* env,
+ base::span<const std::u16string> v);
+
+BASE_EXPORT ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfStringArray(
+ JNIEnv* env,
+ base::span<const std::vector<std::string>> v);
+
+BASE_EXPORT ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfStringArray(
+ JNIEnv* env,
+ base::span<const std::vector<std::u16string>> v);
+
+// Converts a Java string array to a native array.
+BASE_EXPORT void AppendJavaStringArrayToStringVector(
+ JNIEnv* env,
+ const JavaRef<jobjectArray>& array,
+ std::vector<std::u16string>* out);
+
+BASE_EXPORT void AppendJavaStringArrayToStringVector(
+ JNIEnv* env,
+ const JavaRef<jobjectArray>& array,
+ std::vector<std::string>* out);
+
+// Appends the Java bytes in |bytes_array| onto the end of |out|.
+BASE_EXPORT void AppendJavaByteArrayToByteVector(
+ JNIEnv* env,
+ const JavaRef<jbyteArray>& byte_array,
+ std::vector<uint8_t>* out);
+
+// Replaces the content of |out| with the Java bytes in |byte_array|.
+BASE_EXPORT void JavaByteArrayToByteVector(
+ JNIEnv* env,
+ const JavaRef<jbyteArray>& byte_array,
+ std::vector<uint8_t>* out);
+
+// Copy the contents of java |byte_array| into |dest|. The span must be larger
+// than or equal to the array.
+// Returns the number of bytes copied.
+BASE_EXPORT size_t
+JavaByteArrayToByteSpan(JNIEnv* env,
+ const JavaRef<jbyteArray>& byte_array,
+ base::span<uint8_t> dest);
+
+// Replaces the content of |out| with the Java bytes in |byte_array|. No UTF-8
+// conversion is performed.
+BASE_EXPORT void JavaByteArrayToString(JNIEnv* env,
+ const JavaRef<jbyteArray>& byte_array,
+ std::string* out);
+
+// Replaces the content of |out| with the Java booleans in |boolean_array|.
+BASE_EXPORT void JavaBooleanArrayToBoolVector(
+ JNIEnv* env,
+ const JavaRef<jbooleanArray>& boolean_array,
+ std::vector<bool>* out);
+
+// Replaces the content of |out| with the Java ints in |int_array|.
+BASE_EXPORT void JavaIntArrayToIntVector(JNIEnv* env,
+ const JavaRef<jintArray>& int_array,
+ std::vector<int>* out);
+
+// Replaces the content of |out| with the Java longs in |long_array|.
+BASE_EXPORT void JavaLongArrayToInt64Vector(
+ JNIEnv* env,
+ const JavaRef<jlongArray>& long_array,
+ std::vector<int64_t>* out);
+
+// Replaces the content of |out| with the Java longs in |long_array|.
+BASE_EXPORT void JavaLongArrayToLongVector(
+ JNIEnv* env,
+ const JavaRef<jlongArray>& long_array,
+ std::vector<jlong>* out);
+
+// Replaces the content of |out| with the Java floats in |float_array|.
+BASE_EXPORT void JavaFloatArrayToFloatVector(
+ JNIEnv* env,
+ const JavaRef<jfloatArray>& float_array,
+ std::vector<float>* out);
+
+// Replaces the content of |out| with the Java doubles in |double_array|.
+BASE_EXPORT void JavaDoubleArrayToDoubleVector(
+ JNIEnv* env,
+ const JavaRef<jdoubleArray>& double_array,
+ std::vector<double>* out);
+
+// Assuming |array| is an byte[][] (array of byte arrays), replaces the
+// content of |out| with the corresponding vector of strings. No UTF-8
+// conversion is performed.
+BASE_EXPORT void JavaArrayOfByteArrayToStringVector(
+ JNIEnv* env,
+ const JavaRef<jobjectArray>& array,
+ std::vector<std::string>* out);
+
+// Assuming |array| is an byte[][] (array of byte arrays), replaces the
+// content of |out| with the corresponding vector of vector of uint8. No UTF-8
+// conversion is performed.
+BASE_EXPORT void JavaArrayOfByteArrayToBytesVector(
+ JNIEnv* env,
+ const JavaRef<jobjectArray>& array,
+ std::vector<std::vector<uint8_t>>* out);
+
+// Assuming |array| is an String[][] (array of String arrays), replaces the
+// content of |out| with the corresponding vector of string vectors.
+BASE_EXPORT void Java2dStringArrayTo2dStringVector(
+ JNIEnv* env,
+ const JavaRef<jobjectArray>& array,
+ std::vector<std::vector<std::string>>* out);
+
+// Assuming |array| is an String[][] (array of String arrays), replaces the
+// content of |out| with the corresponding vector of string vectors. No UTF-8
+// conversion is performed.
+BASE_EXPORT void Java2dStringArrayTo2dStringVector(
+ JNIEnv* env,
+ const JavaRef<jobjectArray>& array,
+ std::vector<std::vector<std::u16string>>* out);
+
+// Assuming |array| is an int[][] (array of int arrays), replaces the
+// contents of |out| with the corresponding vectors of ints.
+BASE_EXPORT void JavaArrayOfIntArrayToIntVector(
+ JNIEnv* env,
+ const JavaRef<jobjectArray>& array,
+ std::vector<std::vector<int>>* out);
+
+} // namespace base::android
+
+#endif // BASE_ANDROID_JNI_ARRAY_H_
diff --git a/chromium/base/android/jni_array_unittest.cc b/chromium/base/android/jni_array_unittest.cc
new file mode 100644
index 00000000000..0bf7228130e
--- /dev/null
+++ b/chromium/base/android/jni_array_unittest.cc
@@ -0,0 +1,626 @@
+// Copyright 2012 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/jni_array.h"
+
+#include <stddef.h>
+#include <stdint.h>
+
+#include <algorithm>
+#include <limits>
+
+#include "base/android/jni_android.h"
+#include "base/android/jni_string.h"
+#include "base/android/scoped_java_ref.h"
+#include "base/containers/span.h"
+#include "base/strings/utf_string_conversions.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace base::android {
+
+TEST(JniArray, GetLength) {
+ const uint8_t bytes[] = {0, 1, 2, 3};
+ const size_t len = std::size(bytes);
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jbyteArray> j_bytes = ToJavaByteArray(env, bytes, len);
+ ASSERT_TRUE(j_bytes);
+ ASSERT_EQ(4U, SafeGetArrayLength(env, j_bytes));
+
+ ScopedJavaLocalRef<jbyteArray> j_empty_bytes =
+ ToJavaByteArray(env, base::span<uint8_t>());
+ ASSERT_TRUE(j_empty_bytes);
+ ASSERT_EQ(0U, SafeGetArrayLength(env, j_empty_bytes));
+}
+
+TEST(JniArray, BasicConversions) {
+ const uint8_t kBytes[] = {0, 1, 2, 3};
+ const size_t kLen = std::size(kBytes);
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jbyteArray> bytes = ToJavaByteArray(env, kBytes, kLen);
+ ASSERT_TRUE(bytes);
+
+ std::vector<uint8_t> inputVector(kBytes, kBytes + kLen);
+ ScopedJavaLocalRef<jbyteArray> bytesFromVector =
+ ToJavaByteArray(env, inputVector);
+ ASSERT_TRUE(bytesFromVector);
+
+ std::vector<uint8_t> vectorFromBytes(5);
+ std::vector<uint8_t> vectorFromVector(5);
+ JavaByteArrayToByteVector(env, bytes, &vectorFromBytes);
+ JavaByteArrayToByteVector(env, bytesFromVector, &vectorFromVector);
+ EXPECT_EQ(4U, vectorFromBytes.size());
+ EXPECT_EQ(4U, vectorFromVector.size());
+ std::vector<uint8_t> expected_vec(kBytes, kBytes + kLen);
+ EXPECT_EQ(expected_vec, vectorFromBytes);
+ EXPECT_EQ(expected_vec, vectorFromVector);
+
+ std::vector<uint8_t> vector_for_span_test(expected_vec.size());
+ JavaByteArrayToByteSpan(env, bytes, base::make_span(vector_for_span_test));
+ EXPECT_EQ(expected_vec, vector_for_span_test);
+
+ AppendJavaByteArrayToByteVector(env, bytes, &vectorFromBytes);
+ EXPECT_EQ(8U, vectorFromBytes.size());
+ expected_vec.insert(expected_vec.end(), kBytes, kBytes + kLen);
+ EXPECT_EQ(expected_vec, vectorFromBytes);
+}
+
+TEST(JniArray, ByteArrayStringConversions) {
+ JNIEnv* env = AttachCurrentThread();
+ std::string inputString("hello\0world");
+ ScopedJavaLocalRef<jbyteArray> bytesFromString =
+ ToJavaByteArray(env, inputString);
+ ASSERT_TRUE(bytesFromString);
+
+ std::string stringFromString;
+ JavaByteArrayToString(env, bytesFromString, &stringFromString);
+ EXPECT_EQ(inputString, stringFromString);
+}
+
+void CheckBoolConversion(JNIEnv* env,
+ const bool* bool_array,
+ const size_t len,
+ const ScopedJavaLocalRef<jbooleanArray>& booleans) {
+ ASSERT_TRUE(booleans);
+
+ jsize java_array_len = env->GetArrayLength(booleans.obj());
+ ASSERT_EQ(static_cast<jsize>(len), java_array_len);
+
+ jboolean value;
+ for (size_t i = 0; i < len; ++i) {
+ env->GetBooleanArrayRegion(booleans.obj(), i, 1, &value);
+ ASSERT_EQ(bool_array[i], value);
+ }
+}
+
+TEST(JniArray, BoolConversions) {
+ const bool kBools[] = {false, true, false};
+ const size_t kLen = std::size(kBools);
+
+ JNIEnv* env = AttachCurrentThread();
+ CheckBoolConversion(env, kBools, kLen, ToJavaBooleanArray(env, kBools, kLen));
+}
+
+void CheckIntConversion(
+ JNIEnv* env,
+ const int* int_array,
+ const size_t len,
+ const ScopedJavaLocalRef<jintArray>& ints) {
+ ASSERT_TRUE(ints);
+
+ jsize java_array_len = env->GetArrayLength(ints.obj());
+ ASSERT_EQ(static_cast<jsize>(len), java_array_len);
+
+ jint value;
+ for (size_t i = 0; i < len; ++i) {
+ env->GetIntArrayRegion(ints.obj(), i, 1, &value);
+ ASSERT_EQ(int_array[i], value);
+ }
+}
+
+TEST(JniArray, IntConversions) {
+ const int kInts[] = {0, 1, -1, std::numeric_limits<int32_t>::min(),
+ std::numeric_limits<int32_t>::max()};
+ const size_t kLen = std::size(kInts);
+
+ JNIEnv* env = AttachCurrentThread();
+ CheckIntConversion(env, kInts, kLen, ToJavaIntArray(env, kInts, kLen));
+
+ const std::vector<int> vec(kInts, kInts + kLen);
+ CheckIntConversion(env, kInts, kLen, ToJavaIntArray(env, vec));
+}
+
+void CheckLongConversion(JNIEnv* env,
+ const int64_t* long_array,
+ const size_t len,
+ const ScopedJavaLocalRef<jlongArray>& longs) {
+ ASSERT_TRUE(longs);
+
+ jsize java_array_len = env->GetArrayLength(longs.obj());
+ ASSERT_EQ(static_cast<jsize>(len), java_array_len);
+
+ jlong value;
+ for (size_t i = 0; i < len; ++i) {
+ env->GetLongArrayRegion(longs.obj(), i, 1, &value);
+ ASSERT_EQ(long_array[i], value);
+ }
+}
+
+TEST(JniArray, LongConversions) {
+ const int64_t kLongs[] = {0, 1, -1, std::numeric_limits<int64_t>::min(),
+ std::numeric_limits<int64_t>::max()};
+ const size_t kLen = std::size(kLongs);
+
+ JNIEnv* env = AttachCurrentThread();
+ CheckLongConversion(env, kLongs, kLen, ToJavaLongArray(env, kLongs, kLen));
+
+ const std::vector<int64_t> vec(kLongs, kLongs + kLen);
+ CheckLongConversion(env, kLongs, kLen, ToJavaLongArray(env, vec));
+}
+
+void CheckIntArrayConversion(JNIEnv* env,
+ ScopedJavaLocalRef<jintArray> jints,
+ std::vector<int> int_vector,
+ const size_t len) {
+ jint value;
+ for (size_t i = 0; i < len; ++i) {
+ env->GetIntArrayRegion(jints.obj(), i, 1, &value);
+ ASSERT_EQ(int_vector[i], value);
+ }
+}
+
+void CheckBoolArrayConversion(JNIEnv* env,
+ ScopedJavaLocalRef<jbooleanArray> jbooleans,
+ std::vector<bool> bool_vector,
+ const size_t len) {
+ jboolean value;
+ for (size_t i = 0; i < len; ++i) {
+ env->GetBooleanArrayRegion(jbooleans.obj(), i, 1, &value);
+ ASSERT_EQ(bool_vector[i], value);
+ }
+}
+
+void CheckFloatConversion(
+ JNIEnv* env,
+ const float* float_array,
+ const size_t len,
+ const ScopedJavaLocalRef<jfloatArray>& floats) {
+ ASSERT_TRUE(floats);
+
+ jsize java_array_len = env->GetArrayLength(floats.obj());
+ ASSERT_EQ(static_cast<jsize>(len), java_array_len);
+
+ jfloat value;
+ for (size_t i = 0; i < len; ++i) {
+ env->GetFloatArrayRegion(floats.obj(), i, 1, &value);
+ ASSERT_EQ(float_array[i], value);
+ }
+}
+
+TEST(JniArray, ArrayOfStringArrayConversionUTF8) {
+ std::vector<std::vector<std::string>> kArrays = {
+ {"a", "f"}, {"a", ""}, {}, {""}, {"今日は"}};
+
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jobjectArray> joa = ToJavaArrayOfStringArray(env, kArrays);
+
+ std::vector<std::vector<std::string>> out;
+ Java2dStringArrayTo2dStringVector(env, joa, &out);
+ ASSERT_TRUE(kArrays == out);
+}
+
+TEST(JniArray, ArrayOfStringArrayConversionUTF16) {
+ std::vector<std::vector<std::u16string>> kArrays = {
+ {u"a", u"f"}, {u"a", u""}, {}, {u""}};
+
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jobjectArray> joa = ToJavaArrayOfStringArray(env, kArrays);
+
+ std::vector<std::vector<std::u16string>> out;
+ Java2dStringArrayTo2dStringVector(env, joa, &out);
+ ASSERT_TRUE(kArrays == out);
+}
+
+TEST(JniArray, FloatConversions) {
+ const float kFloats[] = { 0.0f, 1.0f, -10.0f};
+ const size_t kLen = std::size(kFloats);
+
+ JNIEnv* env = AttachCurrentThread();
+ CheckFloatConversion(env, kFloats, kLen,
+ ToJavaFloatArray(env, kFloats, kLen));
+
+ const std::vector<float> vec(kFloats, kFloats + kLen);
+ CheckFloatConversion(env, kFloats, kLen, ToJavaFloatArray(env, vec));
+}
+
+TEST(JniArray, JavaBooleanArrayToBoolVector) {
+ const bool kBools[] = {false, true, false};
+ const size_t kLen = std::size(kBools);
+
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jbooleanArray> jbooleans(env, env->NewBooleanArray(kLen));
+ ASSERT_TRUE(jbooleans);
+
+ for (size_t i = 0; i < kLen; ++i) {
+ jboolean j = static_cast<jboolean>(kBools[i]);
+ env->SetBooleanArrayRegion(jbooleans.obj(), i, 1, &j);
+ ASSERT_FALSE(HasException(env));
+ }
+
+ std::vector<bool> bools;
+ JavaBooleanArrayToBoolVector(env, jbooleans, &bools);
+
+ ASSERT_EQ(static_cast<jsize>(bools.size()),
+ env->GetArrayLength(jbooleans.obj()));
+
+ CheckBoolArrayConversion(env, jbooleans, bools, kLen);
+}
+
+TEST(JniArray, JavaIntArrayToIntVector) {
+ const int kInts[] = {0, 1, -1};
+ const size_t kLen = std::size(kInts);
+
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jintArray> jints(env, env->NewIntArray(kLen));
+ ASSERT_TRUE(jints);
+
+ for (size_t i = 0; i < kLen; ++i) {
+ jint j = static_cast<jint>(kInts[i]);
+ env->SetIntArrayRegion(jints.obj(), i, 1, &j);
+ ASSERT_FALSE(HasException(env));
+ }
+
+ std::vector<int> ints;
+ JavaIntArrayToIntVector(env, jints, &ints);
+
+ ASSERT_EQ(static_cast<jsize>(ints.size()), env->GetArrayLength(jints.obj()));
+
+ CheckIntArrayConversion(env, jints, ints, kLen);
+}
+
+TEST(JniArray, JavaLongArrayToInt64Vector) {
+ const int64_t kInt64s[] = {0LL, 1LL, -1LL};
+ const size_t kLen = std::size(kInt64s);
+
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jlongArray> jlongs(env, env->NewLongArray(kLen));
+ ASSERT_TRUE(jlongs);
+
+ for (size_t i = 0; i < kLen; ++i) {
+ jlong j = static_cast<jlong>(kInt64s[i]);
+ env->SetLongArrayRegion(jlongs.obj(), i, 1, &j);
+ ASSERT_FALSE(HasException(env));
+ }
+
+ std::vector<int64_t> int64s;
+ JavaLongArrayToInt64Vector(env, jlongs, &int64s);
+
+ ASSERT_EQ(static_cast<jsize>(int64s.size()),
+ env->GetArrayLength(jlongs.obj()));
+
+ jlong value;
+ for (size_t i = 0; i < kLen; ++i) {
+ env->GetLongArrayRegion(jlongs.obj(), i, 1, &value);
+ ASSERT_EQ(int64s[i], value);
+ ASSERT_EQ(kInt64s[i], int64s[i]);
+ }
+}
+
+TEST(JniArray, JavaLongArrayToLongVector) {
+ const int64_t kInt64s[] = {0LL, 1LL, -1LL};
+ const size_t kLen = std::size(kInt64s);
+
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jlongArray> jlongs(env, env->NewLongArray(kLen));
+ ASSERT_TRUE(jlongs);
+
+ for (size_t i = 0; i < kLen; ++i) {
+ jlong j = static_cast<jlong>(kInt64s[i]);
+ env->SetLongArrayRegion(jlongs.obj(), i, 1, &j);
+ ASSERT_FALSE(HasException(env));
+ }
+
+ std::vector<jlong> jlongs_vector;
+ JavaLongArrayToLongVector(env, jlongs, &jlongs_vector);
+
+ ASSERT_EQ(static_cast<jsize>(jlongs_vector.size()),
+ env->GetArrayLength(jlongs.obj()));
+
+ jlong value;
+ for (size_t i = 0; i < kLen; ++i) {
+ env->GetLongArrayRegion(jlongs.obj(), i, 1, &value);
+ ASSERT_EQ(jlongs_vector[i], value);
+ }
+}
+
+TEST(JniArray, JavaFloatArrayToFloatVector) {
+ const float kFloats[] = {0.0, 0.5, -0.5};
+ const size_t kLen = std::size(kFloats);
+
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jfloatArray> jfloats(env, env->NewFloatArray(kLen));
+ ASSERT_TRUE(jfloats);
+
+ for (size_t i = 0; i < kLen; ++i) {
+ jfloat j = static_cast<jfloat>(kFloats[i]);
+ env->SetFloatArrayRegion(jfloats.obj(), i, 1, &j);
+ ASSERT_FALSE(HasException(env));
+ }
+
+ std::vector<float> floats;
+ JavaFloatArrayToFloatVector(env, jfloats, &floats);
+
+ ASSERT_EQ(static_cast<jsize>(floats.size()),
+ env->GetArrayLength(jfloats.obj()));
+
+ jfloat value;
+ for (size_t i = 0; i < kLen; ++i) {
+ env->GetFloatArrayRegion(jfloats.obj(), i, 1, &value);
+ ASSERT_EQ(floats[i], value);
+ }
+}
+
+TEST(JniArray, JavaDoubleArrayToDoubleVector) {
+ const std::vector<double> kDoubles = {0.0, 0.5, -0.5,
+ std::numeric_limits<double>::min()};
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jdoubleArray> jdoubles(
+ env, env->NewDoubleArray(kDoubles.size()));
+ ASSERT_TRUE(jdoubles);
+
+ env->SetDoubleArrayRegion(jdoubles.obj(), 0, kDoubles.size(),
+ reinterpret_cast<const jdouble*>(kDoubles.data()));
+ ASSERT_FALSE(HasException(env));
+
+ std::vector<double> doubles;
+ JavaDoubleArrayToDoubleVector(env, jdoubles, &doubles);
+ ASSERT_EQ(kDoubles, doubles);
+}
+
+TEST(JniArray, JavaArrayOfByteArrayToStringVector) {
+ const int kMaxItems = 50;
+ JNIEnv* env = AttachCurrentThread();
+
+ // Create a byte[][] object.
+ ScopedJavaLocalRef<jclass> byte_array_clazz(env, env->FindClass("[B"));
+ ASSERT_TRUE(byte_array_clazz);
+
+ ScopedJavaLocalRef<jobjectArray> array(
+ env, env->NewObjectArray(kMaxItems, byte_array_clazz.obj(), NULL));
+ ASSERT_TRUE(array);
+
+ // Create kMaxItems byte buffers.
+ char text[16];
+ for (int i = 0; i < kMaxItems; ++i) {
+ snprintf(text, sizeof text, "%d", i);
+ ScopedJavaLocalRef<jbyteArray> byte_array =
+ ToJavaByteArray(env, reinterpret_cast<uint8_t*>(text),
+ static_cast<size_t>(strlen(text)));
+ ASSERT_TRUE(byte_array);
+
+ env->SetObjectArrayElement(array.obj(), i, byte_array.obj());
+ ASSERT_FALSE(HasException(env));
+ }
+
+ // Convert to std::vector<std::string>, check the content.
+ std::vector<std::string> vec;
+ JavaArrayOfByteArrayToStringVector(env, array, &vec);
+
+ EXPECT_EQ(static_cast<size_t>(kMaxItems), vec.size());
+ for (int i = 0; i < kMaxItems; ++i) {
+ snprintf(text, sizeof text, "%d", i);
+ EXPECT_STREQ(text, vec[i].c_str());
+ }
+}
+
+TEST(JniArray, JavaArrayOfByteArrayToBytesVector) {
+ const size_t kMaxItems = 50;
+ const uint8_t kStep = 37;
+ JNIEnv* env = AttachCurrentThread();
+
+ // Create a byte[][] object.
+ ScopedJavaLocalRef<jclass> byte_array_clazz(env, env->FindClass("[B"));
+ ASSERT_TRUE(byte_array_clazz);
+
+ ScopedJavaLocalRef<jobjectArray> array(
+ env, env->NewObjectArray(kMaxItems, byte_array_clazz.obj(), nullptr));
+ ASSERT_TRUE(array);
+
+ // Create kMaxItems byte buffers with size |i|+1 on each step;
+ std::vector<std::vector<uint8_t>> input_bytes;
+ input_bytes.reserve(kMaxItems);
+ for (size_t i = 0; i < kMaxItems; ++i) {
+ std::vector<uint8_t> cur_bytes(i + 1);
+ for (size_t j = 0; j < cur_bytes.size(); ++j)
+ cur_bytes[j] = static_cast<uint8_t>(i + j * kStep);
+ ScopedJavaLocalRef<jbyteArray> byte_array =
+ ToJavaByteArray(env, cur_bytes.data(), cur_bytes.size());
+ ASSERT_TRUE(byte_array);
+
+ env->SetObjectArrayElement(array.obj(), i, byte_array.obj());
+ ASSERT_FALSE(HasException(env));
+
+ input_bytes.push_back(std::move(cur_bytes));
+ }
+ ASSERT_EQ(kMaxItems, input_bytes.size());
+
+ // Convert to std::vector<std::vector<uint8_t>>, check the content.
+ std::vector<std::vector<uint8_t>> result;
+ JavaArrayOfByteArrayToBytesVector(env, array, &result);
+
+ EXPECT_EQ(input_bytes.size(), result.size());
+ for (size_t i = 0; i < kMaxItems; ++i)
+ EXPECT_THAT(result[i], ::testing::ElementsAreArray(input_bytes.at(i)));
+}
+
+TEST(JniArray, JavaArrayOfStringArrayToVectorOfStringVector) {
+ const std::vector<std::vector<std::u16string>> kArrays = {
+ {u"a", u"f"}, {u"a", u""}, {}, {u""}};
+
+ JNIEnv* env = AttachCurrentThread();
+
+ ScopedJavaLocalRef<jobjectArray> array(
+ env, env->NewObjectArray(kArrays.size(),
+ env->FindClass("[Ljava/lang/String;"), NULL));
+ ASSERT_TRUE(array);
+
+ ScopedJavaLocalRef<jclass> string_clazz(env,
+ env->FindClass("java/lang/String"));
+ ASSERT_TRUE(string_clazz);
+
+ for (size_t i = 0; i < kArrays.size(); ++i) {
+ const std::vector<std::u16string>& child_data = kArrays[i];
+
+ ScopedJavaLocalRef<jobjectArray> child_array(
+ env, env->NewObjectArray(child_data.size(), string_clazz.obj(), NULL));
+ ASSERT_TRUE(child_array);
+
+ for (size_t j = 0; j < child_data.size(); ++j) {
+ ScopedJavaLocalRef<jstring> item =
+ base::android::ConvertUTF16ToJavaString(env, child_data[j]);
+ env->SetObjectArrayElement(child_array.obj(), j, item.obj());
+ ASSERT_FALSE(HasException(env));
+ }
+ env->SetObjectArrayElement(array.obj(), i, child_array.obj());
+ }
+
+ std::vector<std::vector<std::u16string>> vec;
+ Java2dStringArrayTo2dStringVector(env, array, &vec);
+
+ ASSERT_EQ(kArrays, vec);
+}
+
+TEST(JniArray, JavaArrayOfIntArrayToIntVector) {
+ const size_t kNumItems = 4;
+ JNIEnv* env = AttachCurrentThread();
+
+ // Create an int[][] object.
+ ScopedJavaLocalRef<jclass> int_array_clazz(env, env->FindClass("[I"));
+ ASSERT_TRUE(int_array_clazz);
+
+ ScopedJavaLocalRef<jobjectArray> array(
+ env, env->NewObjectArray(kNumItems, int_array_clazz.obj(), nullptr));
+ ASSERT_TRUE(array);
+
+ // Populate int[][] object.
+ const int kInts0[] = {0, 1, -1, std::numeric_limits<int32_t>::min(),
+ std::numeric_limits<int32_t>::max()};
+ const size_t kLen0 = std::size(kInts0);
+ ScopedJavaLocalRef<jintArray> int_array0 = ToJavaIntArray(env, kInts0, kLen0);
+ env->SetObjectArrayElement(array.obj(), 0, int_array0.obj());
+
+ const int kInts1[] = {3, 4, 5};
+ const size_t kLen1 = std::size(kInts1);
+ ScopedJavaLocalRef<jintArray> int_array1 = ToJavaIntArray(env, kInts1, kLen1);
+ env->SetObjectArrayElement(array.obj(), 1, int_array1.obj());
+
+ const int kInts2[] = {};
+ const size_t kLen2 = 0;
+ ScopedJavaLocalRef<jintArray> int_array2 = ToJavaIntArray(env, kInts2, kLen2);
+ env->SetObjectArrayElement(array.obj(), 2, int_array2.obj());
+
+ const int kInts3[] = {16};
+ const size_t kLen3 = std::size(kInts3);
+ ScopedJavaLocalRef<jintArray> int_array3 = ToJavaIntArray(env, kInts3, kLen3);
+ env->SetObjectArrayElement(array.obj(), 3, int_array3.obj());
+
+ // Convert to std::vector<std::vector<int>>, check the content.
+ std::vector<std::vector<int>> out;
+ JavaArrayOfIntArrayToIntVector(env, array, &out);
+
+ EXPECT_EQ(kNumItems, out.size());
+ CheckIntArrayConversion(env, int_array0, out[0], kLen0);
+ CheckIntArrayConversion(env, int_array1, out[1], kLen1);
+ CheckIntArrayConversion(env, int_array2, out[2], kLen2);
+ CheckIntArrayConversion(env, int_array3, out[3], kLen3);
+}
+
+TEST(JniArray, ToJavaArrayOfObjectsOfClass) {
+ JNIEnv* env = AttachCurrentThread();
+
+ std::vector<ScopedJavaLocalRef<jobject>> objects = {
+ ScopedJavaLocalRef<jobject>(ConvertUTF8ToJavaString(env, "one")),
+ ScopedJavaLocalRef<jobject>(ConvertUTF8ToJavaString(env, "two")),
+ ScopedJavaLocalRef<jobject>(ConvertUTF8ToJavaString(env, "three")),
+ };
+
+ ScopedJavaLocalRef<jobjectArray> j_array =
+ ToJavaArrayOfObjects(env, GetClass(env, "java/lang/String"), objects);
+ ASSERT_TRUE(j_array);
+
+ EXPECT_EQ("one",
+ ConvertJavaStringToUTF8(
+ env, ScopedJavaLocalRef<jstring>(
+ env, static_cast<jstring>(env->GetObjectArrayElement(
+ j_array.obj(), 0)))));
+ EXPECT_EQ("two",
+ ConvertJavaStringToUTF8(
+ env, ScopedJavaLocalRef<jstring>(
+ env, static_cast<jstring>(env->GetObjectArrayElement(
+ j_array.obj(), 1)))));
+ EXPECT_EQ("three",
+ ConvertJavaStringToUTF8(
+ env, ScopedJavaLocalRef<jstring>(
+ env, static_cast<jstring>(env->GetObjectArrayElement(
+ j_array.obj(), 2)))));
+}
+
+TEST(JniArray, ToJavaArrayOfObjectLocalRef) {
+ JNIEnv* env = AttachCurrentThread();
+
+ std::vector<ScopedJavaLocalRef<jobject>> objects = {
+ ScopedJavaLocalRef<jobject>(ConvertUTF8ToJavaString(env, "one")),
+ ScopedJavaLocalRef<jobject>(ConvertUTF8ToJavaString(env, "two")),
+ ScopedJavaLocalRef<jobject>(ConvertUTF8ToJavaString(env, "three")),
+ };
+
+ ScopedJavaLocalRef<jobjectArray> j_array = ToJavaArrayOfObjects(env, objects);
+ ASSERT_TRUE(j_array);
+
+ EXPECT_EQ("one",
+ ConvertJavaStringToUTF8(
+ env, ScopedJavaLocalRef<jstring>(
+ env, static_cast<jstring>(env->GetObjectArrayElement(
+ j_array.obj(), 0)))));
+ EXPECT_EQ("two",
+ ConvertJavaStringToUTF8(
+ env, ScopedJavaLocalRef<jstring>(
+ env, static_cast<jstring>(env->GetObjectArrayElement(
+ j_array.obj(), 1)))));
+ EXPECT_EQ("three",
+ ConvertJavaStringToUTF8(
+ env, ScopedJavaLocalRef<jstring>(
+ env, static_cast<jstring>(env->GetObjectArrayElement(
+ j_array.obj(), 2)))));
+}
+
+TEST(JniArray, ToJavaArrayOfObjectGlobalRef) {
+ JNIEnv* env = AttachCurrentThread();
+
+ std::vector<ScopedJavaGlobalRef<jobject>> objects = {
+ ScopedJavaGlobalRef<jobject>(ConvertUTF8ToJavaString(env, "one")),
+ ScopedJavaGlobalRef<jobject>(ConvertUTF8ToJavaString(env, "two")),
+ ScopedJavaGlobalRef<jobject>(ConvertUTF8ToJavaString(env, "three")),
+ };
+
+ ScopedJavaLocalRef<jobjectArray> j_array = ToJavaArrayOfObjects(env, objects);
+ ASSERT_TRUE(j_array);
+
+ EXPECT_EQ("one",
+ ConvertJavaStringToUTF8(
+ env, ScopedJavaLocalRef<jstring>(
+ env, static_cast<jstring>(env->GetObjectArrayElement(
+ j_array.obj(), 0)))));
+ EXPECT_EQ("two",
+ ConvertJavaStringToUTF8(
+ env, ScopedJavaLocalRef<jstring>(
+ env, static_cast<jstring>(env->GetObjectArrayElement(
+ j_array.obj(), 1)))));
+ EXPECT_EQ("three",
+ ConvertJavaStringToUTF8(
+ env, ScopedJavaLocalRef<jstring>(
+ env, static_cast<jstring>(env->GetObjectArrayElement(
+ j_array.obj(), 2)))));
+}
+} // namespace base::android
diff --git a/chromium/base/android/jni_generator/.style.yapf b/chromium/base/android/jni_generator/.style.yapf
new file mode 100644
index 00000000000..5e055c89722
--- /dev/null
+++ b/chromium/base/android/jni_generator/.style.yapf
@@ -0,0 +1,4 @@
+[style]
+based_on_style = pep8
+column_limit = 80
+indent_width = 2
diff --git a/chromium/base/android/jni_generator/AndroidManifest.xml b/chromium/base/android/jni_generator/AndroidManifest.xml
new file mode 100644
index 00000000000..8fd983c53c5
--- /dev/null
+++ b/chromium/base/android/jni_generator/AndroidManifest.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2017 The Chromium Authors
+ Use of this source code is governed by a BSD-style license that can be
+ found in the LICENSE file.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.jni.generator">
+
+ <application></application>
+
+</manifest>
diff --git a/chromium/base/android/jni_generator/DIR_METADATA b/chromium/base/android/jni_generator/DIR_METADATA
new file mode 100644
index 00000000000..96010007c3b
--- /dev/null
+++ b/chromium/base/android/jni_generator/DIR_METADATA
@@ -0,0 +1,4 @@
+monorail {
+ component: "Build"
+}
+team_email: "build@chromium.org"
diff --git a/chromium/base/android/jni_generator/OWNERS b/chromium/base/android/jni_generator/OWNERS
new file mode 100644
index 00000000000..0afb5372719
--- /dev/null
+++ b/chromium/base/android/jni_generator/OWNERS
@@ -0,0 +1,3 @@
+agrieve@chromium.org
+mthiesse@chromium.org
+smaier@chromium.org
diff --git a/chromium/base/android/jni_generator/PRESUBMIT.py b/chromium/base/android/jni_generator/PRESUBMIT.py
new file mode 100644
index 00000000000..c6b13128c55
--- /dev/null
+++ b/chromium/base/android/jni_generator/PRESUBMIT.py
@@ -0,0 +1,41 @@
+# Copyright 2018 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Presubmit script for android buildbot.
+
+See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts for
+details on the presubmit API built into depot_tools.
+"""
+
+USE_PYTHON3 = True
+
+
+def CommonChecks(input_api, output_api):
+ base_android_jni_generator_dir = input_api.PresubmitLocalPath()
+
+ env = dict(input_api.environ)
+ env.update({
+ 'PYTHONPATH': base_android_jni_generator_dir,
+ 'PYTHONDONTWRITEBYTECODE': '1',
+ })
+
+ return input_api.RunTests(
+ input_api.canned_checks.GetUnitTests(
+ input_api,
+ output_api,
+ run_on_python2=False,
+ unit_tests=[
+ input_api.os_path.join(base_android_jni_generator_dir,
+ 'jni_generator_tests.py')
+ ],
+ env=env,
+ ))
+
+
+def CheckChangeOnUpload(input_api, output_api):
+ return CommonChecks(input_api, output_api)
+
+
+def CheckChangeOnCommit(input_api, output_api):
+ return CommonChecks(input_api, output_api)
diff --git a/chromium/base/android/jni_generator/README.md b/chromium/base/android/jni_generator/README.md
new file mode 100644
index 00000000000..e4ea9c037bb
--- /dev/null
+++ b/chromium/base/android/jni_generator/README.md
@@ -0,0 +1,274 @@
+# Overview
+JNI (Java Native Interface) is the mechanism that enables Java code to call
+native functions, and native code to call Java functions.
+
+ * Native code calls into Java using apis from `<jni.h>`, which basically mirror
+ Java's reflection APIs.
+ * Java code calls native functions by declaring body-less functions with the
+ `native` keyword, and then calling them as normal Java functions.
+
+`jni_generator` generates boiler-plate code with the goal of making our code:
+ 1. easier to write, and
+ 2. typesafe.
+
+`jni_generator` uses regular expressions to parse .Java files, so don't do
+anything too fancy. E.g.:
+ * Classes must be either explicitly imported, or are assumed to be in
+the same package. To use `java.lang` classes, add an explicit import.
+ * Inner classes need to be referenced through the outer class. E.g.:
+ `void call(Outer.Inner inner)`
+
+The presense of any JNI within a class will result in ProGuard obfuscation for
+the class to be disabled.
+
+### Exposing Native Methods
+
+Generally Java->Native calls are exported from the shared library and lazily
+resolved by the runtime (via `dlsym()`). There are a number of notable
+exceptions to this. See usage of `jni_registration_generator.py` in the
+codebase.
+
+The `jni_registration_generator.py` exposes two registration methods:
+* `RegisterNonMainDexNatives` - Registers native functions needed by multiple
+ process types (e.g. Rendereres, GPU process).
+* `RegisterMainDexNatives` - Registers native functions needed only by the
+ browser process.
+
+### Exposing Java Methods
+
+Java methods just need to be annotated with `@CalledByNative`. The generated
+functions can be put into a namespace using `@JNINamespace("your_namespace")`.
+
+## Usage
+
+Because the generator does not generate any source files, generated headers must
+not be `#included` by multiple sources. If there are Java functions that need to
+be called by multiple sources, one source should be chosen to expose the
+functions to the others via additional wrapper functions.
+
+### Calling Java -> Native
+
+- Declare methods using a nested interface annotated with `@NativeMethods`.
+- The JNI annotation processor generates a class named `${OriginalClassName}Jni`
+ with a `get()` method that returns an implementation of the annotated
+ interface. The C++ function that it routes to is the same as if it would be
+ in the legacy method.
+- For each JNI method:
+ - C++ stubs are generated that forward to C++ functions that you must write.
+ - If the first parameter is a C++ object (e.g.
+ `long native${OriginalClassName}`), then the bindings will generate the
+ appropriate cast and call into C++ code.
+
+To add JNI to a class:
+
+1. Enable the JNI processor by adding to your `android_library` target:
+ ```python
+ annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
+ deps = [ "//base:jni_java" ]
+ ```
+2. Create a nested-interface annotated with `@NativeMethods` that contains
+ the declaration of the corresponding static methods you wish to have
+ implemented.
+3. Call native functions using `${OriginalClassName}Jni.get().${method}`
+4. In C++ code, #include the header `${OriginalClassName}_jni.h`. (The path will
+ depend on the location of the `generate_jni` BUILD rule that lists your Java
+ source code.) Only include this header from a single `.cc` file as the
+ header defines functions. That `.cc` must implement your native code by
+ defining non-member functions named `JNI_${OriginalClassName}_${UpperCamelCaseMethod}`
+ for static methods and member functions named `${OriginalClassName}::${UpperCamelCaseMethod}`
+ for non-static methods. Member functions need be declared in the header
+ file as well.
+
+Example:
+#### Java
+```java
+class MyClass {
+ // Cannot be private. Must be package or public.
+ @NativeMethods
+ /* package */ interface Natives {
+ void foo();
+ double bar(int a, int b);
+ // Either the |MyClass| part of the |nativeMyClass| parameter name must
+ // match the native class name exactly, or the method annotation
+ // @NativeClassQualifiedName("MyClass") must be used.
+ //
+ // If the native class is nested, use
+ // @NativeClassQualifiedName("FooClassName::BarClassName") and call the
+ // parameter |nativePointer|.
+ void nonStatic(long nativeMyClass);
+ }
+
+ void callNatives() {
+ // MyClassJni is generated by the JNI annotation processor.
+ // Storing MyClassJni.get() in a field defeats some of the desired R8
+ // optimizations, but local variables are fine.
+ Natives jni = MyClassJni.get();
+ jni.foo();
+ jni.bar(1,2);
+ jni.nonStatic(mNativePointer);
+ }
+}
+```
+#### C++
+```c++
+#include "base/android/jni_android.h"
+#include "<path to BUILD.gn>/<generate_jni target name>/MyClass_jni.h"
+
+class MyClass {
+public:
+ void NonStatic(JNIEnv* env);
+}
+
+// Notice that unlike Java, function names are capitalized in C++.
+// Static function names should follow this format and don't need to be declared.
+void JNI_MyClass_Foo(JNIEnv* env) { ... }
+void JNI_MyClass_Bar(JNIEnv* env, jint a, jint b) { ... }
+
+// Member functions need to be declared.
+void MyClass::NonStatic(JNIEnv* env) { ... }
+```
+
+**Using the 'native' keyword**
+
+- The binding generator also looks for `native` JNI method declarations and
+ generates stubs for them. This used to be the norm, but is now obsolete.
+- If you have native methods that you don't want stubs generated for, you should
+ add @JniIgnoreNatives to the class.
+
+#### Testing Mockable Natives
+
+1. Add the `JniMocker` rule to your test.
+2. Call `JniMocker#mock` in a `setUp()` method for each interface you want to
+ stub out.
+
+`JniMocker` will reset the stubs during `tearDown()`.
+
+```java
+/**
+ * Tests for {@link AnimationFrameTimeHistogram}
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+public class AnimationFrameTimeHistogramTest {
+ @Rule
+ public JniMocker mocker = new JniMocker();
+
+ @Mock
+ AnimationFrameTimeHistogram.Natives mNativeMock;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mocker.mock(AnimationFrameTimeHistogramJni.TEST_HOOKS, mNativeMock);
+ }
+
+ @Test
+ public void testNatives() {
+ AnimationFrameTimeHistogram hist = new AnimationFrameTimeHistogram("histName");
+ hist.startRecording();
+ hist.endRecording();
+ verify(mNativeMock).saveHistogram(eq("histName"), any(long[].class), anyInt());
+ }
+}
+```
+
+If a native method is called without setting a mock in a unit test, an
+`UnsupportedOperationException` will be thrown.
+
+#### Special case: DFMs
+DFMs have their own generated `GEN_JNI`s, which are `<module_name>_GEN_JNI`. In
+order to get your DFM's JNI to use the `<module_name>` prefix, you must add your
+module name into the argument of the `@NativeMethods` annotation.
+
+So, for example, say your module was named `test_module`. You would annotate
+your `Natives` interface with `@NativeMethods("test_module")`, and this would
+result in `test_module_GEN_JNI`.
+
+
+### Testing for readiness: use `get()`
+
+JNI Generator automatically produces checks that verify that the Natives interface can be safely
+called. These checks are compiled out of Release builds, making these an excellent way to determine
+whether your code is called safely.
+
+![Check Flow](doc/jni-check-flow.svg)
+
+Most of the time you would write your code so that you only use JNI once the native libraries are
+loaded. There's nothing extra you need to do here.
+
+If you expect your code to be called by an external caller, it's often helpful to know _ahead of
+time_ that the context is valid (ie. either native libraries are loaded or mocks are installed).
+In this case it is helpful to call `get()` method, that performs all the Debug checks listed
+above, but does not instantiate a new object for interfacing Native libraries.
+Note that the unused value returned by the `get()` method will be optimized away in release builds
+so there's no harm in ignoring it.
+
+#### Addressing `Jni.get()` exceptions.
+
+When you identify a scenario leading to an exception, relocate (or defer) the appropriate call to
+be made to a place where (or time when) you know the native libraries have been initialized (eg.
+`onStartWithNative`, `onNativeInitialized` etc).
+
+Please avoid calling `LibraryLoader.isInitialized()` / `LibraryLoader.isLoaded()` in new code.
+Using `LibraryLoader` calls makes unit-testing more difficult:
+* this call can not verify whether Mock object is used, making the use of mocks more complicated,
+* using `LibraryLoader.setLibrariesLoadedForNativeTests()` alters the state for subsequently
+executed tests, inaccurately reporting flakiness and failures of these victim tests.
+* Introducing `LibraryLoader.is*()` calls in your code immediately affects all callers, forcing
+the authors of the code up the call stack to override `LibraryLoader` internal state in order to be
+able to unit-test their code.
+
+### Calling Native -> Java
+
+ * Methods annotated with `@CalledByNative` will have stubs generated for them.
+ * Inner class methods must provide the inner class name explicitly
+ (ex. `@CalledByNative("InnerClassName")`)
+ * Just call the generated stubs defined in generated `.h` files.
+
+### Java Objects and Garbage Collection
+
+All pointers to Java objects must be registered with JNI in order to prevent
+garbage collection from invalidating them.
+
+For Strings & Arrays - it's common practice to use the `//base/android/jni_*`
+helpers to convert them to `std::vectors` and `std::strings` as soon as
+possible.
+
+For other objects - use smart pointers to store them:
+ * `ScopedJavaLocalRef<>` - When lifetime is the current function's scope.
+ * `ScopedJavaGlobalRef<>` - When lifetime is longer than the current function's
+ scope.
+ * `JavaObjectWeakGlobalRef<>` - Weak reference (do not prevent garbage
+ collection).
+ * `JavaParamRef<>` - Use to accept any of the above as a parameter to a
+ function without creating a redundant registration.
+
+### Additional Guidelines / Advice
+
+Minimize the surface API between the two sides. Rather than calling multiple
+functions across boundaries, call only one (and then on the other side, call as
+many little functions as required).
+
+If a Java object "owns" a native one, store the pointer via
+`"long mNativeClassName"`. Ensure to eventually call a native method to delete
+the object. For example, have a `close()` that deletes the native object.
+
+The best way to pass "compound" types across in either direction is to
+create an inner class with PODs and a factory function. If possible, mark
+all the fields as "final".
+
+## Build Rules
+
+ * `generate_jni` - Generates a header file with stubs for given `.java` files
+ * `generate_jar_jni` - Generates a header file with stubs for a given `.jar`
+ file
+ * `generate_jni_registration` - Generates a header file with functions to
+ register native-side JNI methods.
+
+Refer to [//build/config/android/rules.gni](https://cs.chromium.org/chromium/src/build/config/android/rules.gni)
+for more about the GN templates.
+
+## Changing `jni_generator`
+
+ * Python unit tests live in `jni_generator_tests.py`
+ * A working demo app exists as `//base/android/jni_generator:sample_jni_apk`
diff --git a/chromium/base/android/jni_generator/android_jar.classes b/chromium/base/android/jni_generator/android_jar.classes
new file mode 100644
index 00000000000..7d412cee471
--- /dev/null
+++ b/chromium/base/android/jni_generator/android_jar.classes
@@ -0,0 +1,98 @@
+java/lang/AbstractMethodError.class
+java/lang/AbstractStringBuilder.class
+java/lang/Appendable.class
+java/lang/ArithmeticException.class
+java/lang/ArrayIndexOutOfBoundsException.class
+java/lang/ArrayStoreException.class
+java/lang/AssertionError.class
+java/lang/AutoCloseable.class
+java/lang/Boolean.class
+java/lang/Byte.class
+java/lang/Character.class
+java/lang/Character$Subset.class
+java/lang/Character$UnicodeBlock.class
+java/lang/CharSequence.class
+java/lang/ClassCastException.class
+java/lang/ClassCircularityError.class
+java/lang/Class.class
+java/lang/ClassFormatError.class
+java/lang/ClassLoader.class
+java/lang/ClassNotFoundException.class
+java/lang/Cloneable.class
+java/lang/CloneNotSupportedException.class
+java/lang/Comparable.class
+java/lang/Compiler.class
+java/lang/Deprecated.class
+java/lang/Double.class
+java/lang/Enum.class
+java/lang/EnumConstantNotPresentException.class
+java/lang/Error.class
+java/lang/Exception.class
+java/lang/ExceptionInInitializerError.class
+java/lang/Float.class
+java/lang/IllegalAccessError.class
+java/lang/IllegalAccessException.class
+java/lang/IllegalArgumentException.class
+java/lang/IllegalMonitorStateException.class
+java/lang/IllegalStateException.class
+java/lang/IncompatibleClassChangeError.class
+java/lang/IndexOutOfBoundsException.class
+java/lang/InheritableThreadLocal.class
+java/lang/InstantiationError.class
+java/lang/InstantiationException.class
+java/lang/Integer.class
+java/lang/InternalError.class
+java/lang/InterruptedException.class
+java/lang/Iterable.class
+java/lang/LinkageError.class
+java/lang/Long.class
+java/lang/Math.class
+java/lang/NegativeArraySizeException.class
+java/lang/NoClassDefFoundError.class
+java/lang/NoSuchFieldError.class
+java/lang/NoSuchFieldException.class
+java/lang/NoSuchMethodError.class
+java/lang/NoSuchMethodException.class
+java/lang/NullPointerException.class
+java/lang/Number.class
+java/lang/NumberFormatException.class
+java/lang/Object.class
+java/lang/OutOfMemoryError.class
+java/lang/Override.class
+java/lang/Package.class
+java/lang/ProcessBuilder.class
+java/lang/Process.class
+java/lang/Readable.class
+java/lang/ReflectiveOperationException.class
+java/lang/Runnable.class
+java/lang/Runtime.class
+java/lang/RuntimeException.class
+java/lang/RuntimePermission.class
+java/lang/SafeVarargs.class
+java/lang/SecurityException.class
+java/lang/SecurityManager.class
+java/lang/Short.class
+java/lang/StackOverflowError.class
+java/lang/StackTraceElement.class
+java/lang/StrictMath.class
+java/lang/StringBuffer.class
+java/lang/StringBuilder.class
+java/lang/String.class
+java/lang/StringIndexOutOfBoundsException.class
+java/lang/SuppressWarnings.class
+java/lang/System.class
+java/lang/Thread.class
+java/lang/ThreadDeath.class
+java/lang/ThreadGroup.class
+java/lang/ThreadLocal.class
+java/lang/Thread$State.class
+java/lang/Thread$UncaughtExceptionHandler.class
+java/lang/Throwable.class
+java/lang/TypeNotPresentException.class
+java/lang/UnknownError.class
+java/lang/UnsatisfiedLinkError.class
+java/lang/UnsupportedClassVersionError.class
+java/lang/UnsupportedOperationException.class
+java/lang/VerifyError.class
+java/lang/VirtualMachineError.class
+java/lang/Void.class
diff --git a/chromium/base/android/jni_generator/doc/jni-check-flow.puml b/chromium/base/android/jni_generator/doc/jni-check-flow.puml
new file mode 100755
index 00000000000..861ec21777f
--- /dev/null
+++ b/chromium/base/android/jni_generator/doc/jni-check-flow.puml
@@ -0,0 +1,29 @@
+#!/bin/env plantuml -tsvg
+
+@startuml
+scale 1
+
+skinparam shadowing false
+skinparam monochrome true
+
+if (\nTesting enabled?\n) then (Yes)
+ -[#black,dotted]->
+
+partition "//Debug builds only//" #ddd {
+ if (\nMocks installed?\n) then (Yes)
+ :**Return mocks**;
+ detach
+ elseif (\nMocks required?\n) then (Yes)
+ #ffa0a0:throw;
+ detach
+ elseif (\nNative libraries loaded?\n) then (No)
+ #ffa0a0:throw;
+ detach
+ endif
+}
+
+endif
+
+:**Return live instance**;
+
+@enduml
diff --git a/chromium/base/android/jni_generator/doc/jni-check-flow.svg b/chromium/base/android/jni_generator/doc/jni-check-flow.svg
new file mode 100644
index 00000000000..c7a5e485a03
--- /dev/null
+++ b/chromium/base/android/jni_generator/doc/jni-check-flow.svg
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="337px" preserveAspectRatio="none" style="width:500px;height:337px;" version="1.1" viewBox="0 0 500 337" width="500px" zoomAndPan="magnify"><defs/><g><rect fill="#DDDDDD" height="156.4844" style="stroke: #000000; stroke-width: 2.0;" width="454" x="10" y="72.0205"/><path d="M144,73.0205 L144,81.3174 L134,91.3174 L10,91.3174 " fill="none" style="stroke: #000000; stroke-width: 2.0;"/><text fill="#000000" font-family="sans-serif" font-size="14" font-style="italic" lengthAdjust="spacingAndGlyphs" textLength="124" x="13" y="86.0156">Debug builds only</text><polygon fill="#F8F8F8" points="32,111.3174,125,111.3174,137,130.5244,125,149.7314,32,149.7314,20,130.5244,32,111.3174" style="stroke: #383838; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="21" x="82.5" y="159.9419">Yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="0" x="36" y="121.5278"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="93" x="32" y="134.3325">Mocks installed?</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="0" x="36" y="147.1372"/><rect fill="#F8F8F8" height="33.9688" rx="12.5" ry="12.5" style="stroke: #383838; stroke-width: 1.5;" width="116" x="20.5" y="182.5361"/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="96" x="30.5" y="203.6748">Return mocks</text><polygon fill="#F8F8F8" points="169,111.3174,262,111.3174,274,130.5244,262,149.7314,169,149.7314,157,130.5244,169,111.3174" style="stroke: #383838; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="21" x="219.5" y="159.9419">Yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="0" x="173" y="121.5278"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="93" x="169" y="134.3325">Mocks required?</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="0" x="173" y="147.1372"/><rect fill="#BCBCBC" height="33.9688" rx="12.5" ry="12.5" style="stroke: #383838; stroke-width: 1.5;" width="55" x="188" y="182.5361"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="35" x="198" y="203.6748">throw</text><polygon fill="#F8F8F8" points="306,111.3174,440,111.3174,452,130.5244,440,149.7314,306,149.7314,294,130.5244,306,111.3174" style="stroke: #383838; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="15" x="377" y="159.9419">No</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="0" x="310" y="121.5278"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="134" x="306" y="134.3325">Native libraries loaded?</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="0" x="310" y="147.1372"/><rect fill="#BCBCBC" height="33.9688" rx="12.5" ry="12.5" style="stroke: #383838; stroke-width: 1.5;" width="55" x="345.5" y="182.5361"/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="35" x="355.5" y="203.6748">throw</text><polygon fill="#F8F8F8" points="212.5,11.0942,309.5,11.0942,321.5,30.3013,309.5,49.5083,212.5,49.5083,200.5,30.3013,212.5,11.0942" style="stroke: #383838; stroke-width: 1.5;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="21" x="265" y="59.7188">Yes</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="0" x="216.5" y="21.3047"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="97" x="212.5" y="34.1094">Testing enabled?</text><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="0" x="216.5" y="46.9141"/><polygon fill="#F8F8F8" points="261,248.5049,273,260.5049,261,272.5049,249,260.5049,261,248.5049" style="stroke: #383838; stroke-width: 1.5;"/><rect fill="#F8F8F8" height="33.9688" rx="12.5" ry="12.5" style="stroke: #383838; stroke-width: 1.5;" width="161" x="180.5" y="292.5049"/><text fill="#000000" font-family="sans-serif" font-size="12" font-weight="bold" lengthAdjust="spacingAndGlyphs" textLength="141" x="190.5" y="313.6436">Return live instance</text><line style="stroke: #383838; stroke-width: 1.5;" x1="78.5" x2="78.5" y1="149.7314" y2="182.5361"/><polygon fill="#383838" points="74.5,172.5361,78.5,182.5361,82.5,172.5361,78.5,176.5361" style="stroke: #383838; stroke-width: 1.0;"/><line style="stroke: #383838; stroke-width: 1.5;" x1="215.5" x2="215.5" y1="149.7314" y2="182.5361"/><polygon fill="#383838" points="211.5,172.5361,215.5,182.5361,219.5,172.5361,215.5,176.5361" style="stroke: #383838; stroke-width: 1.0;"/><line style="stroke: #383838; stroke-width: 1.5;" x1="373" x2="373" y1="149.7314" y2="182.5361"/><polygon fill="#383838" points="369,172.5361,373,182.5361,377,172.5361,373,176.5361" style="stroke: #383838; stroke-width: 1.0;"/><line style="stroke: #383838; stroke-width: 1.5;" x1="137" x2="157" y1="130.5244" y2="130.5244"/><polygon fill="#383838" points="147,126.5244,157,130.5244,147,134.5244,151,130.5244" style="stroke: #383838; stroke-width: 1.0;"/><line style="stroke: #383838; stroke-width: 1.5;" x1="274" x2="294" y1="130.5244" y2="130.5244"/><polygon fill="#383838" points="284,126.5244,294,130.5244,284,134.5244,288,130.5244" style="stroke: #383838; stroke-width: 1.0;"/><line style="stroke: #000000; stroke-width: 1.5; stroke-dasharray: 1.0,3.0;" x1="261" x2="261" y1="49.5083" y2="96.3174"/><line style="stroke: #000000; stroke-width: 1.5; stroke-dasharray: 1.0,3.0;" x1="261" x2="78.5" y1="96.3174" y2="96.3174"/><line style="stroke: #000000; stroke-width: 1.5; stroke-dasharray: 1.0,3.0;" x1="78.5" x2="78.5" y1="96.3174" y2="111.3174"/><polygon fill="#000000" points="74.5,101.3174,78.5,111.3174,82.5,101.3174,78.5,105.3174" style="stroke: #000000; stroke-width: 1.0;"/><line style="stroke: #383838; stroke-width: 1.5;" x1="452" x2="457" y1="130.5244" y2="130.5244"/><line style="stroke: #383838; stroke-width: 1.5;" x1="457" x2="457" y1="130.5244" y2="221.5049"/><line style="stroke: #383838; stroke-width: 1.5;" x1="457" x2="261" y1="221.5049" y2="221.5049"/><line style="stroke: #383838; stroke-width: 1.5;" x1="261" x2="261" y1="221.5049" y2="248.5049"/><polygon fill="#383838" points="257,238.5049,261,248.5049,265,238.5049,261,242.5049" style="stroke: #383838; stroke-width: 1.0;"/><line style="stroke: #383838; stroke-width: 1.5;" x1="321.5" x2="474" y1="30.3013" y2="30.3013"/><polygon fill="#383838" points="470,167.1592,474,177.1592,478,167.1592,474,171.1592" style="stroke: #383838; stroke-width: 1.5;"/><line style="stroke: #383838; stroke-width: 1.5;" x1="474" x2="474" y1="30.3013" y2="260.5049"/><line style="stroke: #383838; stroke-width: 1.5;" x1="474" x2="273" y1="260.5049" y2="260.5049"/><polygon fill="#383838" points="283,256.5049,273,260.5049,283,264.5049,279,260.5049" style="stroke: #383838; stroke-width: 1.0;"/><line style="stroke: #383838; stroke-width: 1.5;" x1="261" x2="261" y1="272.5049" y2="292.5049"/><polygon fill="#383838" points="257,282.5049,261,292.5049,265,282.5049,261,286.5049" style="stroke: #383838; stroke-width: 1.0;"/><!--MD5=[cbe3f124b10974ef39a80a87295eedae]
+@startuml
+scale 1
+
+skinparam shadowing false
+skinparam monochrome true
+
+if (\nTesting enabled?\n) then (Yes)
+ -[#black,dotted]->
+
+partition "//Debug builds only//" #ddd {
+ if (\nMocks installed?\n) then (Yes)
+ :**Return mocks**;
+ detach
+ elseif (\nMocks required?\n) then (Yes)
+ #ffa0a0:throw;
+ detach
+ elseif (\nNative libraries loaded?\n) then (No)
+ #ffa0a0:throw;
+ detach
+ endif
+}
+
+endif
+
+:**Return live instance**;
+
+@enduml
+
+PlantUML version 1.2020.02(Sun Mar 01 02:22:07 PST 2020)
+(GPL source distribution)
+Java Runtime: OpenJDK Runtime Environment
+JVM: OpenJDK 64-Bit Server VM
+Java Version: 11.0.16+8-post-Debian-1
+Operating System: Linux
+Default Encoding: UTF-8
+Language: en
+Country: US
+--></g></svg> \ No newline at end of file
diff --git a/chromium/base/android/jni_generator/golden/HashedSampleForAnnotationProcessorGenJni.2.golden b/chromium/base/android/jni_generator/golden/HashedSampleForAnnotationProcessorGenJni.2.golden
new file mode 100644
index 00000000000..e971eb809d9
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/HashedSampleForAnnotationProcessorGenJni.2.golden
@@ -0,0 +1,87 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.natives;
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_registration_generator.py
+// Please do not change its content.
+
+public class GEN_JNI {
+ public static final boolean TESTING_ENABLED = false;
+ public static final boolean REQUIRE_MOCK = false;
+
+
+ public static void org_chromium_example_jni_1generator_SampleForAnnotationProcessor_foo() {
+ J.N.MygCV2jQ();
+ }
+
+ public static Object org_chromium_example_jni_1generator_SampleForAnnotationProcessor_bar(Object sample) {
+ return J.N.MHuqnmXT(sample);
+ }
+
+ public static String org_chromium_example_jni_1generator_SampleForAnnotationProcessor_revString(String stringToReverse) {
+ return J.N.MM5Xkwyy(stringToReverse);
+ }
+
+ public static String[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendToNative(String[] strs) {
+ return J.N.MAC2QhR9(strs);
+ }
+
+ public static Object[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendSamplesToNative(Object[] strs) {
+ return J.N.MGhRh4Nd(strs);
+ }
+
+ public static boolean org_chromium_example_jni_1generator_SampleForAnnotationProcessor_hasPhalange() {
+ return J.N.MW0aEs4h();
+ }
+
+ public static int[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testAllPrimitives(int zint, int[] ints, long zlong, long[] longs, short zshort, short[] shorts, char zchar, char[] chars, byte zbyte, byte[] bytes, double zdouble, double[] doubles, float zfloat, float[] floats, boolean zbool, boolean[] bools) {
+ return J.N.MlVFI4RX(zint, ints, zlong, longs, zshort, shorts, zchar, chars, zbyte, bytes, zdouble, doubles, zfloat, floats, zbool, bools);
+ }
+
+ public static void org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testSpecialTypes(Class clazz, Class[] classes, Throwable throwable, Throwable[] throwables, String string, String[] strings, Object tStruct, Object[] structs, Object obj, Object[] objects) {
+ J.N.MqOnlud7(clazz, classes, throwable, throwables, string, strings, tStruct, structs, obj, objects);
+ }
+
+ public static Throwable org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowable() {
+ return J.N.MuZc76Vt();
+ }
+
+ public static Throwable[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowables() {
+ return J.N.MAD53J7V();
+ }
+
+ public static Class org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClass() {
+ return J.N.M$ZgOi4g();
+ }
+
+ public static Class[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClasses() {
+ return J.N.M$hL1577();
+ }
+
+ public static String org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnString() {
+ return J.N.M0k1OjBK();
+ }
+
+ public static String[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStrings() {
+ return J.N.Mssfs54E();
+ }
+
+ public static Object org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStruct() {
+ return J.N.MSzcel_H();
+ }
+
+ public static Object[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStructs() {
+ return J.N.MIBrQLK4();
+ }
+
+ public static Object org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObject() {
+ return J.N.M$hPywjv();
+ }
+
+ public static Object[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObjects() {
+ return J.N.MPpCU1l5();
+ }
+}
diff --git a/chromium/base/android/jni_generator/golden/HashedSampleForAnnotationProcessorGenJni.golden b/chromium/base/android/jni_generator/golden/HashedSampleForAnnotationProcessorGenJni.golden
new file mode 100644
index 00000000000..a817e3e3d9b
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/HashedSampleForAnnotationProcessorGenJni.golden
@@ -0,0 +1,50 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package J;
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_registration_generator.py
+// Please do not change its content.
+
+public class N {
+
+
+ // Original name: org_chromium_example_jni_1generator_SampleForAnnotationProcessor_foo
+ public static native void MygCV2jQ();
+ // Original name: org_chromium_example_jni_1generator_SampleForAnnotationProcessor_bar
+ public static native Object MHuqnmXT(Object sample);
+ // Original name: org_chromium_example_jni_1generator_SampleForAnnotationProcessor_revString
+ public static native String MM5Xkwyy(String stringToReverse);
+ // Original name: org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendToNative
+ public static native String[] MAC2QhR9(String[] strs);
+ // Original name: org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendSamplesToNative
+ public static native Object[] MGhRh4Nd(Object[] strs);
+ // Original name: org_chromium_example_jni_1generator_SampleForAnnotationProcessor_hasPhalange
+ public static native boolean MW0aEs4h();
+ // Original name: org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testAllPrimitives
+ public static native int[] MlVFI4RX(int zint, int[] ints, long zlong, long[] longs, short zshort, short[] shorts, char zchar, char[] chars, byte zbyte, byte[] bytes, double zdouble, double[] doubles, float zfloat, float[] floats, boolean zbool, boolean[] bools);
+ // Original name: org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testSpecialTypes
+ public static native void MqOnlud7(Class clazz, Class[] classes, Throwable throwable, Throwable[] throwables, String string, String[] strings, Object tStruct, Object[] structs, Object obj, Object[] objects);
+ // Original name: org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowable
+ public static native Throwable MuZc76Vt();
+ // Original name: org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowables
+ public static native Throwable[] MAD53J7V();
+ // Original name: org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClass
+ public static native Class M$ZgOi4g();
+ // Original name: org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClasses
+ public static native Class[] M$hL1577();
+ // Original name: org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnString
+ public static native String M0k1OjBK();
+ // Original name: org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStrings
+ public static native String[] Mssfs54E();
+ // Original name: org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStruct
+ public static native Object MSzcel_H();
+ // Original name: org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStructs
+ public static native Object[] MIBrQLK4();
+ // Original name: org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObject
+ public static native Object M$hPywjv();
+ // Original name: org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObjects
+ public static native Object[] MPpCU1l5();
+}
diff --git a/chromium/base/android/jni_generator/golden/HashedSampleForAnnotationProcessor_jni.golden b/chromium/base/android/jni_generator/golden/HashedSampleForAnnotationProcessor_jni.golden
new file mode 100644
index 00000000000..ba6bebefbfb
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/HashedSampleForAnnotationProcessor_jni.golden
@@ -0,0 +1,265 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_generator.py
+// For
+// org/chromium/example/jni_generator/SampleForAnnotationProcessor
+
+#ifndef org_chromium_example_jni_generator_SampleForAnnotationProcessor_JNI
+#define org_chromium_example_jni_generator_SampleForAnnotationProcessor_JNI
+
+#include <jni.h>
+
+#include "base/android/jni_generator/jni_generator_helper.h"
+
+
+// Step 1: Forward declarations.
+
+
+// Step 2: Constants (optional).
+
+
+// Step 3: Method stubs.
+static void JNI_SampleForAnnotationProcessor_Foo(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT void Java_J_N_MygCV2jQ(
+ JNIEnv* env,
+ jclass jcaller) {
+ return JNI_SampleForAnnotationProcessor_Foo(env);
+}
+
+static base::android::ScopedJavaLocalRef<jobject> JNI_SampleForAnnotationProcessor_Bar(JNIEnv* env,
+ const base::android::JavaParamRef<jobject>& sample);
+
+JNI_GENERATOR_EXPORT jobject Java_J_N_MHuqnmXT(
+ JNIEnv* env,
+ jclass jcaller,
+ jobject sample) {
+ return JNI_SampleForAnnotationProcessor_Bar(env, base::android::JavaParamRef<jobject>(env,
+ sample)).Release();
+}
+
+static base::android::ScopedJavaLocalRef<jstring> JNI_SampleForAnnotationProcessor_RevString(JNIEnv*
+ env, const base::android::JavaParamRef<jstring>& stringToReverse);
+
+JNI_GENERATOR_EXPORT jstring Java_J_N_MM5Xkwyy(
+ JNIEnv* env,
+ jclass jcaller,
+ jstring stringToReverse) {
+ return JNI_SampleForAnnotationProcessor_RevString(env, base::android::JavaParamRef<jstring>(env,
+ stringToReverse)).Release();
+}
+
+static base::android::ScopedJavaLocalRef<jobjectArray>
+ JNI_SampleForAnnotationProcessor_SendToNative(JNIEnv* env, const
+ base::android::JavaParamRef<jobjectArray>& strs);
+
+JNI_GENERATOR_EXPORT jobjectArray Java_J_N_MAC2QhR9(
+ JNIEnv* env,
+ jclass jcaller,
+ jobjectArray strs) {
+ return JNI_SampleForAnnotationProcessor_SendToNative(env,
+ base::android::JavaParamRef<jobjectArray>(env, strs)).Release();
+}
+
+static base::android::ScopedJavaLocalRef<jobjectArray>
+ JNI_SampleForAnnotationProcessor_SendSamplesToNative(JNIEnv* env, const
+ base::android::JavaParamRef<jobjectArray>& strs);
+
+JNI_GENERATOR_EXPORT jobjectArray Java_J_N_MGhRh4Nd(
+ JNIEnv* env,
+ jclass jcaller,
+ jobjectArray strs) {
+ return JNI_SampleForAnnotationProcessor_SendSamplesToNative(env,
+ base::android::JavaParamRef<jobjectArray>(env, strs)).Release();
+}
+
+static jboolean JNI_SampleForAnnotationProcessor_HasPhalange(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT jboolean Java_J_N_MW0aEs4h(
+ JNIEnv* env,
+ jclass jcaller) {
+ return JNI_SampleForAnnotationProcessor_HasPhalange(env);
+}
+
+static base::android::ScopedJavaLocalRef<jintArray>
+ JNI_SampleForAnnotationProcessor_TestAllPrimitives(JNIEnv* env, jint zint,
+ const base::android::JavaParamRef<jintArray>& ints,
+ jlong zlong,
+ const base::android::JavaParamRef<jlongArray>& longs,
+ jshort zshort,
+ const base::android::JavaParamRef<jshortArray>& shorts,
+ jchar zchar,
+ const base::android::JavaParamRef<jcharArray>& chars,
+ jbyte zbyte,
+ const base::android::JavaParamRef<jbyteArray>& bytes,
+ jdouble zdouble,
+ const base::android::JavaParamRef<jdoubleArray>& doubles,
+ jfloat zfloat,
+ const base::android::JavaParamRef<jfloatArray>& floats,
+ jboolean zbool,
+ const base::android::JavaParamRef<jbooleanArray>& bools);
+
+JNI_GENERATOR_EXPORT jintArray Java_J_N_MlVFI4RX(
+ JNIEnv* env,
+ jclass jcaller,
+ jint zint,
+ jintArray ints,
+ jlong zlong,
+ jlongArray longs,
+ jshort zshort,
+ jshortArray shorts,
+ jchar zchar,
+ jcharArray chars,
+ jbyte zbyte,
+ jbyteArray bytes,
+ jdouble zdouble,
+ jdoubleArray doubles,
+ jfloat zfloat,
+ jfloatArray floats,
+ jboolean zbool,
+ jbooleanArray bools) {
+ return JNI_SampleForAnnotationProcessor_TestAllPrimitives(env, zint,
+ base::android::JavaParamRef<jintArray>(env, ints), zlong,
+ base::android::JavaParamRef<jlongArray>(env, longs), zshort,
+ base::android::JavaParamRef<jshortArray>(env, shorts), zchar,
+ base::android::JavaParamRef<jcharArray>(env, chars), zbyte,
+ base::android::JavaParamRef<jbyteArray>(env, bytes), zdouble,
+ base::android::JavaParamRef<jdoubleArray>(env, doubles), zfloat,
+ base::android::JavaParamRef<jfloatArray>(env, floats), zbool,
+ base::android::JavaParamRef<jbooleanArray>(env, bools)).Release();
+}
+
+static void JNI_SampleForAnnotationProcessor_TestSpecialTypes(JNIEnv* env, const
+ base::android::JavaParamRef<jclass>& clazz,
+ const base::android::JavaParamRef<jobjectArray>& classes,
+ const base::android::JavaParamRef<jthrowable>& throwable,
+ const base::android::JavaParamRef<jobjectArray>& throwables,
+ const base::android::JavaParamRef<jstring>& string,
+ const base::android::JavaParamRef<jobjectArray>& strings,
+ const base::android::JavaParamRef<jobject>& tStruct,
+ const base::android::JavaParamRef<jobjectArray>& structs,
+ const base::android::JavaParamRef<jobject>& obj,
+ const base::android::JavaParamRef<jobjectArray>& objects);
+
+JNI_GENERATOR_EXPORT void Java_J_N_MqOnlud7(
+ JNIEnv* env,
+ jclass jcaller,
+ jclass clazz,
+ jobjectArray classes,
+ jthrowable throwable,
+ jobjectArray throwables,
+ jstring string,
+ jobjectArray strings,
+ jobject tStruct,
+ jobjectArray structs,
+ jobject obj,
+ jobjectArray objects) {
+ return JNI_SampleForAnnotationProcessor_TestSpecialTypes(env,
+ base::android::JavaParamRef<jclass>(env, clazz),
+ base::android::JavaParamRef<jobjectArray>(env, classes),
+ base::android::JavaParamRef<jthrowable>(env, throwable),
+ base::android::JavaParamRef<jobjectArray>(env, throwables),
+ base::android::JavaParamRef<jstring>(env, string),
+ base::android::JavaParamRef<jobjectArray>(env, strings),
+ base::android::JavaParamRef<jobject>(env, tStruct),
+ base::android::JavaParamRef<jobjectArray>(env, structs),
+ base::android::JavaParamRef<jobject>(env, obj), base::android::JavaParamRef<jobjectArray>(env,
+ objects));
+}
+
+static base::android::ScopedJavaLocalRef<jthrowable>
+ JNI_SampleForAnnotationProcessor_ReturnThrowable(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT jthrowable Java_J_N_MuZc76Vt(
+ JNIEnv* env,
+ jclass jcaller) {
+ return JNI_SampleForAnnotationProcessor_ReturnThrowable(env).Release();
+}
+
+static base::android::ScopedJavaLocalRef<jobjectArray>
+ JNI_SampleForAnnotationProcessor_ReturnThrowables(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT jobjectArray Java_J_N_MAD53J7V(
+ JNIEnv* env,
+ jclass jcaller) {
+ return JNI_SampleForAnnotationProcessor_ReturnThrowables(env).Release();
+}
+
+static base::android::ScopedJavaLocalRef<jclass>
+ JNI_SampleForAnnotationProcessor_ReturnClass(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT jclass Java_J_N_M_00024ZgOi4g(
+ JNIEnv* env,
+ jclass jcaller) {
+ return JNI_SampleForAnnotationProcessor_ReturnClass(env).Release();
+}
+
+static base::android::ScopedJavaLocalRef<jobjectArray>
+ JNI_SampleForAnnotationProcessor_ReturnClasses(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT jobjectArray Java_J_N_M_00024hL1577(
+ JNIEnv* env,
+ jclass jcaller) {
+ return JNI_SampleForAnnotationProcessor_ReturnClasses(env).Release();
+}
+
+static base::android::ScopedJavaLocalRef<jstring>
+ JNI_SampleForAnnotationProcessor_ReturnString(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT jstring Java_J_N_M0k1OjBK(
+ JNIEnv* env,
+ jclass jcaller) {
+ return JNI_SampleForAnnotationProcessor_ReturnString(env).Release();
+}
+
+static base::android::ScopedJavaLocalRef<jobjectArray>
+ JNI_SampleForAnnotationProcessor_ReturnStrings(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT jobjectArray Java_J_N_Mssfs54E(
+ JNIEnv* env,
+ jclass jcaller) {
+ return JNI_SampleForAnnotationProcessor_ReturnStrings(env).Release();
+}
+
+static base::android::ScopedJavaLocalRef<jobject>
+ JNI_SampleForAnnotationProcessor_ReturnStruct(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT jobject Java_J_N_MSzcel_1H(
+ JNIEnv* env,
+ jclass jcaller) {
+ return JNI_SampleForAnnotationProcessor_ReturnStruct(env).Release();
+}
+
+static base::android::ScopedJavaLocalRef<jobjectArray>
+ JNI_SampleForAnnotationProcessor_ReturnStructs(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT jobjectArray Java_J_N_MIBrQLK4(
+ JNIEnv* env,
+ jclass jcaller) {
+ return JNI_SampleForAnnotationProcessor_ReturnStructs(env).Release();
+}
+
+static base::android::ScopedJavaLocalRef<jobject>
+ JNI_SampleForAnnotationProcessor_ReturnObject(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT jobject Java_J_N_M_00024hPywjv(
+ JNIEnv* env,
+ jclass jcaller) {
+ return JNI_SampleForAnnotationProcessor_ReturnObject(env).Release();
+}
+
+static base::android::ScopedJavaLocalRef<jobjectArray>
+ JNI_SampleForAnnotationProcessor_ReturnObjects(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT jobjectArray Java_J_N_MPpCU1l5(
+ JNIEnv* env,
+ jclass jcaller) {
+ return JNI_SampleForAnnotationProcessor_ReturnObjects(env).Release();
+}
+
+
+#endif // org_chromium_example_jni_generator_SampleForAnnotationProcessor_JNI
diff --git a/chromium/base/android/jni_generator/golden/ModuleGenJni.golden b/chromium/base/android/jni_generator/golden/ModuleGenJni.golden
new file mode 100644
index 00000000000..83b251f56cf
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/ModuleGenJni.golden
@@ -0,0 +1,23 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.natives;
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_registration_generator.py
+// Please do not change its content.
+
+public class module_GEN_JNI {
+ public static final boolean TESTING_ENABLED = false;
+ public static final boolean REQUIRE_MOCK = false;
+
+
+ public static void org_chromium_example_jni_1generator_SampleModule_foo() {
+ J.module_N.M$$EIl9t();
+ }
+
+ public static boolean org_chromium_example_jni_1generator_SampleModule_bar(int a) {
+ return J.module_N.Mc2WZLnF(a);
+ }
+}
diff --git a/chromium/base/android/jni_generator/golden/ModuleJN.golden b/chromium/base/android/jni_generator/golden/ModuleJN.golden
new file mode 100644
index 00000000000..dca60bb01dc
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/ModuleJN.golden
@@ -0,0 +1,18 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package J;
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_registration_generator.py
+// Please do not change its content.
+
+public class module_N {
+
+
+ // Original name: org_chromium_example_jni_1generator_SampleModule_foo
+ public static native void M$$EIl9t();
+ // Original name: org_chromium_example_jni_1generator_SampleModule_bar
+ public static native boolean Mc2WZLnF(int a);
+}
diff --git a/chromium/base/android/jni_generator/golden/SampleForAnnotationProcessorGenJni.golden b/chromium/base/android/jni_generator/golden/SampleForAnnotationProcessorGenJni.golden
new file mode 100644
index 00000000000..efb1f72e07e
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/SampleForAnnotationProcessorGenJni.golden
@@ -0,0 +1,52 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.natives;
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_registration_generator.py
+// Please do not change its content.
+
+public class GEN_JNI {
+ public static final boolean TESTING_ENABLED = false;
+ public static final boolean REQUIRE_MOCK = false;
+
+
+ // Hashed name: Java_J_N_MygCV2jQ
+ public static native void org_chromium_example_jni_1generator_SampleForAnnotationProcessor_foo();
+ // Hashed name: Java_J_N_MHuqnmXT
+ public static native Object org_chromium_example_jni_1generator_SampleForAnnotationProcessor_bar(Object sample);
+ // Hashed name: Java_J_N_MM5Xkwyy
+ public static native String org_chromium_example_jni_1generator_SampleForAnnotationProcessor_revString(String stringToReverse);
+ // Hashed name: Java_J_N_MAC2QhR9
+ public static native String[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendToNative(String[] strs);
+ // Hashed name: Java_J_N_MGhRh4Nd
+ public static native Object[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendSamplesToNative(Object[] strs);
+ // Hashed name: Java_J_N_MW0aEs4h
+ public static native boolean org_chromium_example_jni_1generator_SampleForAnnotationProcessor_hasPhalange();
+ // Hashed name: Java_J_N_MlVFI4RX
+ public static native int[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testAllPrimitives(int zint, int[] ints, long zlong, long[] longs, short zshort, short[] shorts, char zchar, char[] chars, byte zbyte, byte[] bytes, double zdouble, double[] doubles, float zfloat, float[] floats, boolean zbool, boolean[] bools);
+ // Hashed name: Java_J_N_MqOnlud7
+ public static native void org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testSpecialTypes(Class clazz, Class[] classes, Throwable throwable, Throwable[] throwables, String string, String[] strings, Object tStruct, Object[] structs, Object obj, Object[] objects);
+ // Hashed name: Java_J_N_MuZc76Vt
+ public static native Throwable org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowable();
+ // Hashed name: Java_J_N_MAD53J7V
+ public static native Throwable[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowables();
+ // Hashed name: Java_J_N_M$ZgOi4g
+ public static native Class org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClass();
+ // Hashed name: Java_J_N_M$hL1577
+ public static native Class[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClasses();
+ // Hashed name: Java_J_N_M0k1OjBK
+ public static native String org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnString();
+ // Hashed name: Java_J_N_Mssfs54E
+ public static native String[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStrings();
+ // Hashed name: Java_J_N_MSzcel_H
+ public static native Object org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStruct();
+ // Hashed name: Java_J_N_MIBrQLK4
+ public static native Object[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStructs();
+ // Hashed name: Java_J_N_M$hPywjv
+ public static native Object org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObject();
+ // Hashed name: Java_J_N_MPpCU1l5
+ public static native Object[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObjects();
+}
diff --git a/chromium/base/android/jni_generator/golden/SampleForAnnotationProcessorManualJni.golden b/chromium/base/android/jni_generator/golden/SampleForAnnotationProcessorManualJni.golden
new file mode 100644
index 00000000000..a9239302796
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/SampleForAnnotationProcessorManualJni.golden
@@ -0,0 +1,250 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_registration_generator.py
+// Please do not change its content.
+
+#ifndef TEMP_DIR_HEADER_
+#define TEMP_DIR_HEADER_
+
+#include <jni.h>
+
+#include <iterator>
+
+#include "base/android/jni_generator/jni_generator_helper.h"
+#include "base/android/jni_int_wrapper.h"
+
+
+// Step 1: Forward declarations (classes).
+
+
+// Step 2: Forward declarations (methods).
+
+JNI_GENERATOR_EXPORT void
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1foo(
+ JNIEnv* env,
+ jclass jcaller);
+JNI_GENERATOR_EXPORT jobject
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1bar(
+ JNIEnv* env,
+ jclass jcaller,
+ jobject sample);
+JNI_GENERATOR_EXPORT jstring
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1revString(
+ JNIEnv* env,
+ jclass jcaller,
+ jstring stringToReverse);
+JNI_GENERATOR_EXPORT jobjectArray
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1sendToNative(
+ JNIEnv* env,
+ jclass jcaller,
+ jobjectArray strs);
+JNI_GENERATOR_EXPORT jobjectArray
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1sendSamplesToNative(
+ JNIEnv* env,
+ jclass jcaller,
+ jobjectArray strs);
+JNI_GENERATOR_EXPORT jboolean
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1hasPhalange(
+ JNIEnv* env,
+ jclass jcaller);
+JNI_GENERATOR_EXPORT jintArray
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1testAllPrimitives(
+ JNIEnv* env,
+ jclass jcaller,
+ jint zint,
+ jintArray ints,
+ jlong zlong,
+ jlongArray longs,
+ jshort zshort,
+ jshortArray shorts,
+ jchar zchar,
+ jcharArray chars,
+ jbyte zbyte,
+ jbyteArray bytes,
+ jdouble zdouble,
+ jdoubleArray doubles,
+ jfloat zfloat,
+ jfloatArray floats,
+ jboolean zbool,
+ jbooleanArray bools);
+JNI_GENERATOR_EXPORT void
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1testSpecialTypes(
+ JNIEnv* env,
+ jclass jcaller,
+ jclass clazz,
+ jobjectArray classes,
+ jthrowable throwable,
+ jobjectArray throwables,
+ jstring string,
+ jobjectArray strings,
+ jobject tStruct,
+ jobjectArray structs,
+ jobject obj,
+ jobjectArray objects);
+JNI_GENERATOR_EXPORT jthrowable
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnThrowable(
+ JNIEnv* env,
+ jclass jcaller);
+JNI_GENERATOR_EXPORT jobjectArray
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnThrowables(
+ JNIEnv* env,
+ jclass jcaller);
+JNI_GENERATOR_EXPORT jclass
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnClass(
+ JNIEnv* env,
+ jclass jcaller);
+JNI_GENERATOR_EXPORT jobjectArray
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnClasses(
+ JNIEnv* env,
+ jclass jcaller);
+JNI_GENERATOR_EXPORT jstring
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnString(
+ JNIEnv* env,
+ jclass jcaller);
+JNI_GENERATOR_EXPORT jobjectArray
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStrings(
+ JNIEnv* env,
+ jclass jcaller);
+JNI_GENERATOR_EXPORT jobject
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStruct(
+ JNIEnv* env,
+ jclass jcaller);
+JNI_GENERATOR_EXPORT jobjectArray
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStructs(
+ JNIEnv* env,
+ jclass jcaller);
+JNI_GENERATOR_EXPORT jobject
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnObject(
+ JNIEnv* env,
+ jclass jcaller);
+JNI_GENERATOR_EXPORT jobjectArray
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnObjects(
+ JNIEnv* env,
+ jclass jcaller);
+
+
+// Step 3: Method declarations.
+
+
+static const JNINativeMethod kMethods_org_chromium_base_natives_GEN_1JNI[] = {
+ { "org_chromium_example_jni_1generator_SampleForAnnotationProcessor_foo", "()V",
+ reinterpret_cast<void*>(Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1foo)
+ },
+ { "org_chromium_example_jni_1generator_SampleForAnnotationProcessor_bar",
+ "(Ljava/lang/Object;)Ljava/lang/Object;",
+ reinterpret_cast<void*>(Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1bar)
+ },
+ { "org_chromium_example_jni_1generator_SampleForAnnotationProcessor_revString",
+ "(Ljava/lang/String;)Ljava/lang/String;",
+ reinterpret_cast<void*>(Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1revString)
+ },
+ { "org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendToNative",
+ "([Ljava/lang/String;)[Ljava/lang/String;",
+ reinterpret_cast<void*>(Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1sendToNative)
+ },
+ { "org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendSamplesToNative",
+ "([Ljava/lang/Object;)[Ljava/lang/Object;",
+ reinterpret_cast<void*>(Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1sendSamplesToNative)
+ },
+ { "org_chromium_example_jni_1generator_SampleForAnnotationProcessor_hasPhalange", "()Z",
+ reinterpret_cast<void*>(Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1hasPhalange)
+ },
+ { "org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testAllPrimitives",
+ "(I[IJ[JS[SC[CB[BD[DF[FZ[Z)[I",
+ reinterpret_cast<void*>(Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1testAllPrimitives)
+ },
+ { "org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testSpecialTypes",
+ "(Ljava/lang/Class;[Ljava/lang/Class;Ljava/lang/Throwable;[Ljava/lang/Throwable;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/Object;[Ljava/lang/Object;Ljava/lang/Object;[Ljava/lang/Object;)V",
+ reinterpret_cast<void*>(Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1testSpecialTypes)
+ },
+ { "org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowable",
+ "()Ljava/lang/Throwable;",
+ reinterpret_cast<void*>(Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnThrowable)
+ },
+ { "org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowables",
+ "()[Ljava/lang/Throwable;",
+ reinterpret_cast<void*>(Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnThrowables)
+ },
+ { "org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClass",
+ "()Ljava/lang/Class;",
+ reinterpret_cast<void*>(Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnClass)
+ },
+ { "org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClasses",
+ "()[Ljava/lang/Class;",
+ reinterpret_cast<void*>(Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnClasses)
+ },
+ { "org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnString",
+ "()Ljava/lang/String;",
+ reinterpret_cast<void*>(Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnString)
+ },
+ { "org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStrings",
+ "()[Ljava/lang/String;",
+ reinterpret_cast<void*>(Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStrings)
+ },
+ { "org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStruct",
+ "()Ljava/lang/Object;",
+ reinterpret_cast<void*>(Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStruct)
+ },
+ { "org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStructs",
+ "()[Ljava/lang/Object;",
+ reinterpret_cast<void*>(Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStructs)
+ },
+ { "org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObject",
+ "()Ljava/lang/Object;",
+ reinterpret_cast<void*>(Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnObject)
+ },
+ { "org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObjects",
+ "()[Ljava/lang/Object;",
+ reinterpret_cast<void*>(Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnObjects)
+ },
+
+};
+
+namespace {
+
+JNI_REGISTRATION_EXPORT bool RegisterNative_org_chromium_base_natives_GEN_1JNI(JNIEnv* env) {
+ const int number_of_methods = std::size(kMethods_org_chromium_base_natives_GEN_1JNI);
+
+ base::android::ScopedJavaLocalRef<jclass> native_clazz =
+ base::android::GetClass(env, "org/chromium/base/natives/GEN_JNI");
+ if (env->RegisterNatives(
+ native_clazz.obj(),
+ kMethods_org_chromium_base_natives_GEN_1JNI,
+ number_of_methods) < 0) {
+
+ jni_generator::HandleRegistrationError(env, native_clazz.obj(), __FILE__);
+ return false;
+ }
+
+ return true;
+}
+
+} // namespace
+
+
+// Step 4: Main dex and non-main dex registration functions.
+
+namespace None {
+
+bool RegisterMainDexNatives(JNIEnv* env) {
+
+ return true;
+}
+
+bool RegisterNonMainDexNatives(JNIEnv* env) {
+ // Register natives in a proxy.
+ if (!RegisterNative_org_chromium_base_natives_GEN_1JNI(env)) {
+ return false;
+ }
+
+
+ return true;
+}
+
+} // namespace None
+
+#endif // TEMP_DIR_HEADER_
diff --git a/chromium/base/android/jni_generator/golden/SampleForAnnotationProcessor_jni.golden b/chromium/base/android/jni_generator/golden/SampleForAnnotationProcessor_jni.golden
new file mode 100644
index 00000000000..130ac300c86
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/SampleForAnnotationProcessor_jni.golden
@@ -0,0 +1,283 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_generator.py
+// For
+// org/chromium/example/jni_generator/SampleForAnnotationProcessor
+
+#ifndef org_chromium_example_jni_generator_SampleForAnnotationProcessor_JNI
+#define org_chromium_example_jni_generator_SampleForAnnotationProcessor_JNI
+
+#include <jni.h>
+
+#include "base/android/jni_generator/jni_generator_helper.h"
+
+
+// Step 1: Forward declarations.
+
+
+// Step 2: Constants (optional).
+
+
+// Step 3: Method stubs.
+static void JNI_SampleForAnnotationProcessor_Foo(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT void
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1foo(
+ JNIEnv* env,
+ jclass jcaller) {
+ return JNI_SampleForAnnotationProcessor_Foo(env);
+}
+
+static base::android::ScopedJavaLocalRef<jobject> JNI_SampleForAnnotationProcessor_Bar(JNIEnv* env,
+ const base::android::JavaParamRef<jobject>& sample);
+
+JNI_GENERATOR_EXPORT jobject
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1bar(
+ JNIEnv* env,
+ jclass jcaller,
+ jobject sample) {
+ return JNI_SampleForAnnotationProcessor_Bar(env, base::android::JavaParamRef<jobject>(env,
+ sample)).Release();
+}
+
+static base::android::ScopedJavaLocalRef<jstring> JNI_SampleForAnnotationProcessor_RevString(JNIEnv*
+ env, const base::android::JavaParamRef<jstring>& stringToReverse);
+
+JNI_GENERATOR_EXPORT jstring
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1revString(
+ JNIEnv* env,
+ jclass jcaller,
+ jstring stringToReverse) {
+ return JNI_SampleForAnnotationProcessor_RevString(env, base::android::JavaParamRef<jstring>(env,
+ stringToReverse)).Release();
+}
+
+static base::android::ScopedJavaLocalRef<jobjectArray>
+ JNI_SampleForAnnotationProcessor_SendToNative(JNIEnv* env, const
+ base::android::JavaParamRef<jobjectArray>& strs);
+
+JNI_GENERATOR_EXPORT jobjectArray
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1sendToNative(
+ JNIEnv* env,
+ jclass jcaller,
+ jobjectArray strs) {
+ return JNI_SampleForAnnotationProcessor_SendToNative(env,
+ base::android::JavaParamRef<jobjectArray>(env, strs)).Release();
+}
+
+static base::android::ScopedJavaLocalRef<jobjectArray>
+ JNI_SampleForAnnotationProcessor_SendSamplesToNative(JNIEnv* env, const
+ base::android::JavaParamRef<jobjectArray>& strs);
+
+JNI_GENERATOR_EXPORT jobjectArray
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1sendSamplesToNative(
+ JNIEnv* env,
+ jclass jcaller,
+ jobjectArray strs) {
+ return JNI_SampleForAnnotationProcessor_SendSamplesToNative(env,
+ base::android::JavaParamRef<jobjectArray>(env, strs)).Release();
+}
+
+static jboolean JNI_SampleForAnnotationProcessor_HasPhalange(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT jboolean
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1hasPhalange(
+ JNIEnv* env,
+ jclass jcaller) {
+ return JNI_SampleForAnnotationProcessor_HasPhalange(env);
+}
+
+static base::android::ScopedJavaLocalRef<jintArray>
+ JNI_SampleForAnnotationProcessor_TestAllPrimitives(JNIEnv* env, jint zint,
+ const base::android::JavaParamRef<jintArray>& ints,
+ jlong zlong,
+ const base::android::JavaParamRef<jlongArray>& longs,
+ jshort zshort,
+ const base::android::JavaParamRef<jshortArray>& shorts,
+ jchar zchar,
+ const base::android::JavaParamRef<jcharArray>& chars,
+ jbyte zbyte,
+ const base::android::JavaParamRef<jbyteArray>& bytes,
+ jdouble zdouble,
+ const base::android::JavaParamRef<jdoubleArray>& doubles,
+ jfloat zfloat,
+ const base::android::JavaParamRef<jfloatArray>& floats,
+ jboolean zbool,
+ const base::android::JavaParamRef<jbooleanArray>& bools);
+
+JNI_GENERATOR_EXPORT jintArray
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1testAllPrimitives(
+ JNIEnv* env,
+ jclass jcaller,
+ jint zint,
+ jintArray ints,
+ jlong zlong,
+ jlongArray longs,
+ jshort zshort,
+ jshortArray shorts,
+ jchar zchar,
+ jcharArray chars,
+ jbyte zbyte,
+ jbyteArray bytes,
+ jdouble zdouble,
+ jdoubleArray doubles,
+ jfloat zfloat,
+ jfloatArray floats,
+ jboolean zbool,
+ jbooleanArray bools) {
+ return JNI_SampleForAnnotationProcessor_TestAllPrimitives(env, zint,
+ base::android::JavaParamRef<jintArray>(env, ints), zlong,
+ base::android::JavaParamRef<jlongArray>(env, longs), zshort,
+ base::android::JavaParamRef<jshortArray>(env, shorts), zchar,
+ base::android::JavaParamRef<jcharArray>(env, chars), zbyte,
+ base::android::JavaParamRef<jbyteArray>(env, bytes), zdouble,
+ base::android::JavaParamRef<jdoubleArray>(env, doubles), zfloat,
+ base::android::JavaParamRef<jfloatArray>(env, floats), zbool,
+ base::android::JavaParamRef<jbooleanArray>(env, bools)).Release();
+}
+
+static void JNI_SampleForAnnotationProcessor_TestSpecialTypes(JNIEnv* env, const
+ base::android::JavaParamRef<jclass>& clazz,
+ const base::android::JavaParamRef<jobjectArray>& classes,
+ const base::android::JavaParamRef<jthrowable>& throwable,
+ const base::android::JavaParamRef<jobjectArray>& throwables,
+ const base::android::JavaParamRef<jstring>& string,
+ const base::android::JavaParamRef<jobjectArray>& strings,
+ const base::android::JavaParamRef<jobject>& tStruct,
+ const base::android::JavaParamRef<jobjectArray>& structs,
+ const base::android::JavaParamRef<jobject>& obj,
+ const base::android::JavaParamRef<jobjectArray>& objects);
+
+JNI_GENERATOR_EXPORT void
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1testSpecialTypes(
+ JNIEnv* env,
+ jclass jcaller,
+ jclass clazz,
+ jobjectArray classes,
+ jthrowable throwable,
+ jobjectArray throwables,
+ jstring string,
+ jobjectArray strings,
+ jobject tStruct,
+ jobjectArray structs,
+ jobject obj,
+ jobjectArray objects) {
+ return JNI_SampleForAnnotationProcessor_TestSpecialTypes(env,
+ base::android::JavaParamRef<jclass>(env, clazz),
+ base::android::JavaParamRef<jobjectArray>(env, classes),
+ base::android::JavaParamRef<jthrowable>(env, throwable),
+ base::android::JavaParamRef<jobjectArray>(env, throwables),
+ base::android::JavaParamRef<jstring>(env, string),
+ base::android::JavaParamRef<jobjectArray>(env, strings),
+ base::android::JavaParamRef<jobject>(env, tStruct),
+ base::android::JavaParamRef<jobjectArray>(env, structs),
+ base::android::JavaParamRef<jobject>(env, obj), base::android::JavaParamRef<jobjectArray>(env,
+ objects));
+}
+
+static base::android::ScopedJavaLocalRef<jthrowable>
+ JNI_SampleForAnnotationProcessor_ReturnThrowable(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT jthrowable
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnThrowable(
+ JNIEnv* env,
+ jclass jcaller) {
+ return JNI_SampleForAnnotationProcessor_ReturnThrowable(env).Release();
+}
+
+static base::android::ScopedJavaLocalRef<jobjectArray>
+ JNI_SampleForAnnotationProcessor_ReturnThrowables(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT jobjectArray
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnThrowables(
+ JNIEnv* env,
+ jclass jcaller) {
+ return JNI_SampleForAnnotationProcessor_ReturnThrowables(env).Release();
+}
+
+static base::android::ScopedJavaLocalRef<jclass>
+ JNI_SampleForAnnotationProcessor_ReturnClass(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT jclass
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnClass(
+ JNIEnv* env,
+ jclass jcaller) {
+ return JNI_SampleForAnnotationProcessor_ReturnClass(env).Release();
+}
+
+static base::android::ScopedJavaLocalRef<jobjectArray>
+ JNI_SampleForAnnotationProcessor_ReturnClasses(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT jobjectArray
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnClasses(
+ JNIEnv* env,
+ jclass jcaller) {
+ return JNI_SampleForAnnotationProcessor_ReturnClasses(env).Release();
+}
+
+static base::android::ScopedJavaLocalRef<jstring>
+ JNI_SampleForAnnotationProcessor_ReturnString(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT jstring
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnString(
+ JNIEnv* env,
+ jclass jcaller) {
+ return JNI_SampleForAnnotationProcessor_ReturnString(env).Release();
+}
+
+static base::android::ScopedJavaLocalRef<jobjectArray>
+ JNI_SampleForAnnotationProcessor_ReturnStrings(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT jobjectArray
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStrings(
+ JNIEnv* env,
+ jclass jcaller) {
+ return JNI_SampleForAnnotationProcessor_ReturnStrings(env).Release();
+}
+
+static base::android::ScopedJavaLocalRef<jobject>
+ JNI_SampleForAnnotationProcessor_ReturnStruct(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT jobject
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStruct(
+ JNIEnv* env,
+ jclass jcaller) {
+ return JNI_SampleForAnnotationProcessor_ReturnStruct(env).Release();
+}
+
+static base::android::ScopedJavaLocalRef<jobjectArray>
+ JNI_SampleForAnnotationProcessor_ReturnStructs(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT jobjectArray
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStructs(
+ JNIEnv* env,
+ jclass jcaller) {
+ return JNI_SampleForAnnotationProcessor_ReturnStructs(env).Release();
+}
+
+static base::android::ScopedJavaLocalRef<jobject>
+ JNI_SampleForAnnotationProcessor_ReturnObject(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT jobject
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnObject(
+ JNIEnv* env,
+ jclass jcaller) {
+ return JNI_SampleForAnnotationProcessor_ReturnObject(env).Release();
+}
+
+static base::android::ScopedJavaLocalRef<jobjectArray>
+ JNI_SampleForAnnotationProcessor_ReturnObjects(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT jobjectArray
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnObjects(
+ JNIEnv* env,
+ jclass jcaller) {
+ return JNI_SampleForAnnotationProcessor_ReturnObjects(env).Release();
+}
+
+
+#endif // org_chromium_example_jni_generator_SampleForAnnotationProcessor_JNI
diff --git a/chromium/base/android/jni_generator/golden/SampleForTestsWithSplit_jni.golden b/chromium/base/android/jni_generator/golden/SampleForTestsWithSplit_jni.golden
new file mode 100644
index 00000000000..6b835a7ffe3
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/SampleForTestsWithSplit_jni.golden
@@ -0,0 +1,527 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_generator.py
+// For
+// org/chromium/example/jni_generator/SampleForTests
+
+#ifndef org_chromium_example_jni_generator_SampleForTests_JNI
+#define org_chromium_example_jni_generator_SampleForTests_JNI
+
+#include <jni.h>
+
+#include "base/android/jni_generator/jni_generator_helper.h"
+
+
+// Step 1: Forward declarations.
+
+JNI_REGISTRATION_EXPORT extern const char
+ kClassPath_org_chromium_example_jni_1generator_SampleForTests[];
+const char kClassPath_org_chromium_example_jni_1generator_SampleForTests[] =
+ "org/chromium/example/jni_generator/SampleForTests";
+
+JNI_REGISTRATION_EXPORT extern const char
+ kClassPath_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA[];
+const char kClassPath_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA[] =
+ "org/chromium/example/jni_generator/SampleForTests$InnerStructA";
+
+JNI_REGISTRATION_EXPORT extern const char
+ kClassPath_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB[];
+const char kClassPath_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB[] =
+ "org/chromium/example/jni_generator/SampleForTests$InnerStructB";
+// Leaking this jclass as we cannot use LazyInstance from some threads.
+JNI_REGISTRATION_EXPORT std::atomic<jclass>
+ g_org_chromium_example_jni_1generator_SampleForTests_clazz(nullptr);
+#ifndef org_chromium_example_jni_1generator_SampleForTests_clazz_defined
+#define org_chromium_example_jni_1generator_SampleForTests_clazz_defined
+inline jclass org_chromium_example_jni_1generator_SampleForTests_clazz(JNIEnv* env) {
+ return base::android::LazyGetClass(env,
+ kClassPath_org_chromium_example_jni_1generator_SampleForTests, "sample",
+ &g_org_chromium_example_jni_1generator_SampleForTests_clazz);
+}
+#endif
+// Leaking this jclass as we cannot use LazyInstance from some threads.
+JNI_REGISTRATION_EXPORT std::atomic<jclass>
+ g_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA_clazz(nullptr);
+#ifndef org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA_clazz_defined
+#define org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA_clazz_defined
+inline jclass org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA_clazz(JNIEnv*
+ env) {
+ return base::android::LazyGetClass(env,
+ kClassPath_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA, "sample",
+ &g_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA_clazz);
+}
+#endif
+// Leaking this jclass as we cannot use LazyInstance from some threads.
+JNI_REGISTRATION_EXPORT std::atomic<jclass>
+ g_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_clazz(nullptr);
+#ifndef org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_clazz_defined
+#define org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_clazz_defined
+inline jclass org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_clazz(JNIEnv*
+ env) {
+ return base::android::LazyGetClass(env,
+ kClassPath_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB, "sample",
+ &g_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_clazz);
+}
+#endif
+
+
+// Step 2: Constants (optional).
+
+
+// Step 3: Method stubs.
+namespace base {
+namespace android {
+
+static jlong JNI_SampleForTests_Init(JNIEnv* env, const base::android::JavaParamRef<jobject>&
+ caller,
+ const base::android::JavaParamRef<jstring>& param);
+
+JNI_GENERATOR_EXPORT jlong
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForTests_1init(
+ JNIEnv* env,
+ jclass jcaller,
+ jobject caller,
+ jstring param) {
+ return JNI_SampleForTests_Init(env, base::android::JavaParamRef<jobject>(env, caller),
+ base::android::JavaParamRef<jstring>(env, param));
+}
+
+JNI_GENERATOR_EXPORT void
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForTests_1destroy(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong nativeCPPClass,
+ jobject caller) {
+ CPPClass* native = reinterpret_cast<CPPClass*>(nativeCPPClass);
+ CHECK_NATIVE_PTR(env, jcaller, native, "Destroy");
+ return native->Destroy(env, base::android::JavaParamRef<jobject>(env, caller));
+}
+
+static jdouble JNI_SampleForTests_GetDoubleFunction(JNIEnv* env, const
+ base::android::JavaParamRef<jobject>& caller);
+
+JNI_GENERATOR_EXPORT jdouble
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForTests_1getDoubleFunction(
+ JNIEnv* env,
+ jclass jcaller,
+ jobject caller) {
+ return JNI_SampleForTests_GetDoubleFunction(env, base::android::JavaParamRef<jobject>(env,
+ caller));
+}
+
+static jfloat JNI_SampleForTests_GetFloatFunction(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT jfloat
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForTests_1getFloatFunction(
+ JNIEnv* env,
+ jclass jcaller) {
+ return JNI_SampleForTests_GetFloatFunction(env);
+}
+
+static void JNI_SampleForTests_SetNonPODDatatype(JNIEnv* env, const
+ base::android::JavaParamRef<jobject>& caller,
+ const base::android::JavaParamRef<jobject>& rect);
+
+JNI_GENERATOR_EXPORT void
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForTests_1setNonPODDatatype(
+ JNIEnv* env,
+ jclass jcaller,
+ jobject caller,
+ jobject rect) {
+ return JNI_SampleForTests_SetNonPODDatatype(env, base::android::JavaParamRef<jobject>(env,
+ caller), base::android::JavaParamRef<jobject>(env, rect));
+}
+
+static base::android::ScopedJavaLocalRef<jobject> JNI_SampleForTests_GetNonPODDatatype(JNIEnv* env,
+ const base::android::JavaParamRef<jobject>& caller);
+
+JNI_GENERATOR_EXPORT jobject
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForTests_1getNonPODDatatype(
+ JNIEnv* env,
+ jclass jcaller,
+ jobject caller) {
+ return JNI_SampleForTests_GetNonPODDatatype(env, base::android::JavaParamRef<jobject>(env,
+ caller)).Release();
+}
+
+JNI_GENERATOR_EXPORT jint
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForTests_1method(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong nativeCPPClass,
+ jobject caller) {
+ CPPClass* native = reinterpret_cast<CPPClass*>(nativeCPPClass);
+ CHECK_NATIVE_PTR(env, jcaller, native, "Method", 0);
+ return native->Method(env, base::android::JavaParamRef<jobject>(env, caller));
+}
+
+JNI_GENERATOR_EXPORT jdouble
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForTests_1methodOtherP0(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong nativePtr,
+ jobject caller) {
+ CPPClass::InnerClass* native = reinterpret_cast<CPPClass::InnerClass*>(nativePtr);
+ CHECK_NATIVE_PTR(env, jcaller, native, "MethodOtherP0", 0);
+ return native->MethodOtherP0(env, base::android::JavaParamRef<jobject>(env, caller));
+}
+
+JNI_GENERATOR_EXPORT void
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForTests_1addStructB(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong nativeCPPClass,
+ jobject caller,
+ jobject b) {
+ CPPClass* native = reinterpret_cast<CPPClass*>(nativeCPPClass);
+ CHECK_NATIVE_PTR(env, jcaller, native, "AddStructB");
+ return native->AddStructB(env, base::android::JavaParamRef<jobject>(env, caller),
+ base::android::JavaParamRef<jobject>(env, b));
+}
+
+JNI_GENERATOR_EXPORT void
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForTests_1iterateAndDoSomethingWithStructB(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong nativeCPPClass,
+ jobject caller) {
+ CPPClass* native = reinterpret_cast<CPPClass*>(nativeCPPClass);
+ CHECK_NATIVE_PTR(env, jcaller, native, "IterateAndDoSomethingWithStructB");
+ return native->IterateAndDoSomethingWithStructB(env, base::android::JavaParamRef<jobject>(env,
+ caller));
+}
+
+JNI_GENERATOR_EXPORT jstring
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForTests_1returnAString(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong nativeCPPClass,
+ jobject caller) {
+ CPPClass* native = reinterpret_cast<CPPClass*>(nativeCPPClass);
+ CHECK_NATIVE_PTR(env, jcaller, native, "ReturnAString", NULL);
+ return native->ReturnAString(env, base::android::JavaParamRef<jobject>(env, caller)).Release();
+}
+
+
+static std::atomic<jmethodID>
+ g_org_chromium_example_jni_1generator_SampleForTests_javaMethod(nullptr);
+static jint Java_SampleForTests_javaMethod(JNIEnv* env, const base::android::JavaRef<jobject>& obj,
+ JniIntWrapper foo,
+ JniIntWrapper bar) {
+ jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_example_jni_1generator_SampleForTests_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "javaMethod",
+ "(II)I",
+ &g_org_chromium_example_jni_1generator_SampleForTests_javaMethod);
+
+ jint ret =
+ env->CallIntMethod(obj.obj(),
+ call_context.base.method_id, as_jint(foo), as_jint(bar));
+ return ret;
+}
+
+static std::atomic<jmethodID>
+ g_org_chromium_example_jni_1generator_SampleForTests_staticJavaMethod(nullptr);
+static jboolean Java_SampleForTests_staticJavaMethod(JNIEnv* env) {
+ jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
+ CHECK_CLAZZ(env, clazz,
+ org_chromium_example_jni_1generator_SampleForTests_clazz(env), false);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_STATIC>(
+ env,
+ clazz,
+ "staticJavaMethod",
+ "()Z",
+ &g_org_chromium_example_jni_1generator_SampleForTests_staticJavaMethod);
+
+ jboolean ret =
+ env->CallStaticBooleanMethod(clazz,
+ call_context.base.method_id);
+ return ret;
+}
+
+static std::atomic<jmethodID>
+ g_org_chromium_example_jni_1generator_SampleForTests_packagePrivateJavaMethod(nullptr);
+static void Java_SampleForTests_packagePrivateJavaMethod(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj) {
+ jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_example_jni_1generator_SampleForTests_clazz(env));
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "packagePrivateJavaMethod",
+ "()V",
+ &g_org_chromium_example_jni_1generator_SampleForTests_packagePrivateJavaMethod);
+
+ env->CallVoidMethod(obj.obj(),
+ call_context.base.method_id);
+}
+
+static std::atomic<jmethodID>
+ g_org_chromium_example_jni_1generator_SampleForTests_methodWithGenericParams(nullptr);
+static void Java_SampleForTests_methodWithGenericParams(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, const base::android::JavaRef<jobject>& foo,
+ const base::android::JavaRef<jobject>& bar) {
+ jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_example_jni_1generator_SampleForTests_clazz(env));
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "methodWithGenericParams",
+ "(Ljava/util/Map;Ljava/util/LinkedList;)V",
+ &g_org_chromium_example_jni_1generator_SampleForTests_methodWithGenericParams);
+
+ env->CallVoidMethod(obj.obj(),
+ call_context.base.method_id, foo.obj(), bar.obj());
+}
+
+static std::atomic<jmethodID>
+ g_org_chromium_example_jni_1generator_SampleForTests_Constructor(nullptr);
+static base::android::ScopedJavaLocalRef<jobject> Java_SampleForTests_Constructor(JNIEnv* env,
+ JniIntWrapper foo,
+ JniIntWrapper bar) {
+ jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
+ CHECK_CLAZZ(env, clazz,
+ org_chromium_example_jni_1generator_SampleForTests_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "<init>",
+ "(II)V",
+ &g_org_chromium_example_jni_1generator_SampleForTests_Constructor);
+
+ jobject ret =
+ env->NewObject(clazz,
+ call_context.base.method_id, as_jint(foo), as_jint(bar));
+ return base::android::ScopedJavaLocalRef<jobject>(env, ret);
+}
+
+static std::atomic<jmethodID>
+ g_org_chromium_example_jni_1generator_SampleForTests_methodThatThrowsException(nullptr);
+static void Java_SampleForTests_methodThatThrowsException(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj) {
+ jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_example_jni_1generator_SampleForTests_clazz(env));
+
+ jni_generator::JniJavaCallContextUnchecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "methodThatThrowsException",
+ "()V",
+ &g_org_chromium_example_jni_1generator_SampleForTests_methodThatThrowsException);
+
+ env->CallVoidMethod(obj.obj(),
+ call_context.method_id);
+}
+
+static std::atomic<jmethodID>
+ g_org_chromium_example_jni_1generator_SampleForTests_javaMethodWithAnnotatedParam(nullptr);
+static void Java_SampleForTests_javaMethodWithAnnotatedParam(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper foo,
+ JniIntWrapper bar,
+ JniIntWrapper baz,
+ JniIntWrapper bat) {
+ jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_example_jni_1generator_SampleForTests_clazz(env));
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "javaMethodWithAnnotatedParam",
+ "(IIII)V",
+ &g_org_chromium_example_jni_1generator_SampleForTests_javaMethodWithAnnotatedParam);
+
+ env->CallVoidMethod(obj.obj(),
+ call_context.base.method_id, as_jint(foo), as_jint(bar), as_jint(baz), as_jint(bat));
+}
+
+static std::atomic<jmethodID>
+ g_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA_create(nullptr);
+static base::android::ScopedJavaLocalRef<jobject> Java_InnerStructA_create(JNIEnv* env, jlong l,
+ JniIntWrapper i,
+ const base::android::JavaRef<jstring>& s) {
+ jclass clazz = org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA_clazz(env);
+ CHECK_CLAZZ(env, clazz,
+ org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_STATIC>(
+ env,
+ clazz,
+ "create",
+ "(JILjava/lang/String;)Lorg/chromium/example/jni_generator/SampleForTests$InnerStructA;",
+ &g_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA_create);
+
+ jobject ret =
+ env->CallStaticObjectMethod(clazz,
+ call_context.base.method_id, l, as_jint(i), s.obj());
+ return base::android::ScopedJavaLocalRef<jobject>(env, ret);
+}
+
+static std::atomic<jmethodID>
+ g_org_chromium_example_jni_1generator_SampleForTests_addStructA(nullptr);
+static void Java_SampleForTests_addStructA(JNIEnv* env, const base::android::JavaRef<jobject>& obj,
+ const base::android::JavaRef<jobject>& a) {
+ jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_example_jni_1generator_SampleForTests_clazz(env));
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "addStructA",
+ "(Lorg/chromium/example/jni_generator/SampleForTests$InnerStructA;)V",
+ &g_org_chromium_example_jni_1generator_SampleForTests_addStructA);
+
+ env->CallVoidMethod(obj.obj(),
+ call_context.base.method_id, a.obj());
+}
+
+static std::atomic<jmethodID>
+ g_org_chromium_example_jni_1generator_SampleForTests_iterateAndDoSomething(nullptr);
+static void Java_SampleForTests_iterateAndDoSomething(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj) {
+ jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_example_jni_1generator_SampleForTests_clazz(env));
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "iterateAndDoSomething",
+ "()V",
+ &g_org_chromium_example_jni_1generator_SampleForTests_iterateAndDoSomething);
+
+ env->CallVoidMethod(obj.obj(),
+ call_context.base.method_id);
+}
+
+static std::atomic<jmethodID>
+ g_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_getKey(nullptr);
+static jlong Java_InnerStructB_getKey(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
+ jclass clazz = org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getKey",
+ "()J",
+ &g_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_getKey);
+
+ jlong ret =
+ env->CallLongMethod(obj.obj(),
+ call_context.base.method_id);
+ return ret;
+}
+
+static std::atomic<jmethodID>
+ g_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_getValue(nullptr);
+static base::android::ScopedJavaLocalRef<jstring> Java_InnerStructB_getValue(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj) {
+ jclass clazz = org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getValue",
+ "()Ljava/lang/String;",
+ &g_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_getValue);
+
+ jstring ret =
+ static_cast<jstring>(env->CallObjectMethod(obj.obj(),
+ call_context.base.method_id));
+ return base::android::ScopedJavaLocalRef<jstring>(env, ret);
+}
+
+static std::atomic<jmethodID>
+ g_org_chromium_example_jni_1generator_SampleForTests_getInnerInterface(nullptr);
+static base::android::ScopedJavaLocalRef<jobject> Java_SampleForTests_getInnerInterface(JNIEnv* env)
+ {
+ jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
+ CHECK_CLAZZ(env, clazz,
+ org_chromium_example_jni_1generator_SampleForTests_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_STATIC>(
+ env,
+ clazz,
+ "getInnerInterface",
+ "()Lorg/chromium/example/jni_generator/SampleForTests$InnerInterface;",
+ &g_org_chromium_example_jni_1generator_SampleForTests_getInnerInterface);
+
+ jobject ret =
+ env->CallStaticObjectMethod(clazz,
+ call_context.base.method_id);
+ return base::android::ScopedJavaLocalRef<jobject>(env, ret);
+}
+
+static std::atomic<jmethodID>
+ g_org_chromium_example_jni_1generator_SampleForTests_getInnerEnum(nullptr);
+static base::android::ScopedJavaLocalRef<jobject> Java_SampleForTests_getInnerEnum(JNIEnv* env) {
+ jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
+ CHECK_CLAZZ(env, clazz,
+ org_chromium_example_jni_1generator_SampleForTests_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_STATIC>(
+ env,
+ clazz,
+ "getInnerEnum",
+ "()Lorg/chromium/example/jni_generator/SampleForTests$InnerEnum;",
+ &g_org_chromium_example_jni_1generator_SampleForTests_getInnerEnum);
+
+ jobject ret =
+ env->CallStaticObjectMethod(clazz,
+ call_context.base.method_id);
+ return base::android::ScopedJavaLocalRef<jobject>(env, ret);
+}
+
+} // namespace android
+} // namespace base
+
+#endif // org_chromium_example_jni_generator_SampleForTests_JNI
diff --git a/chromium/base/android/jni_generator/golden/SampleForTests_jni.golden b/chromium/base/android/jni_generator/golden/SampleForTests_jni.golden
new file mode 100644
index 00000000000..65d821a572c
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/SampleForTests_jni.golden
@@ -0,0 +1,527 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_generator.py
+// For
+// org/chromium/example/jni_generator/SampleForTests
+
+#ifndef org_chromium_example_jni_generator_SampleForTests_JNI
+#define org_chromium_example_jni_generator_SampleForTests_JNI
+
+#include <jni.h>
+
+#include "base/android/jni_generator/jni_generator_helper.h"
+
+
+// Step 1: Forward declarations.
+
+JNI_REGISTRATION_EXPORT extern const char
+ kClassPath_org_chromium_example_jni_1generator_SampleForTests[];
+const char kClassPath_org_chromium_example_jni_1generator_SampleForTests[] =
+ "org/chromium/example/jni_generator/SampleForTests";
+
+JNI_REGISTRATION_EXPORT extern const char
+ kClassPath_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA[];
+const char kClassPath_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA[] =
+ "org/chromium/example/jni_generator/SampleForTests$InnerStructA";
+
+JNI_REGISTRATION_EXPORT extern const char
+ kClassPath_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB[];
+const char kClassPath_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB[] =
+ "org/chromium/example/jni_generator/SampleForTests$InnerStructB";
+// Leaking this jclass as we cannot use LazyInstance from some threads.
+JNI_REGISTRATION_EXPORT std::atomic<jclass>
+ g_org_chromium_example_jni_1generator_SampleForTests_clazz(nullptr);
+#ifndef org_chromium_example_jni_1generator_SampleForTests_clazz_defined
+#define org_chromium_example_jni_1generator_SampleForTests_clazz_defined
+inline jclass org_chromium_example_jni_1generator_SampleForTests_clazz(JNIEnv* env) {
+ return base::android::LazyGetClass(env,
+ kClassPath_org_chromium_example_jni_1generator_SampleForTests,
+ &g_org_chromium_example_jni_1generator_SampleForTests_clazz);
+}
+#endif
+// Leaking this jclass as we cannot use LazyInstance from some threads.
+JNI_REGISTRATION_EXPORT std::atomic<jclass>
+ g_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA_clazz(nullptr);
+#ifndef org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA_clazz_defined
+#define org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA_clazz_defined
+inline jclass org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA_clazz(JNIEnv*
+ env) {
+ return base::android::LazyGetClass(env,
+ kClassPath_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA,
+ &g_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA_clazz);
+}
+#endif
+// Leaking this jclass as we cannot use LazyInstance from some threads.
+JNI_REGISTRATION_EXPORT std::atomic<jclass>
+ g_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_clazz(nullptr);
+#ifndef org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_clazz_defined
+#define org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_clazz_defined
+inline jclass org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_clazz(JNIEnv*
+ env) {
+ return base::android::LazyGetClass(env,
+ kClassPath_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB,
+ &g_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_clazz);
+}
+#endif
+
+
+// Step 2: Constants (optional).
+
+
+// Step 3: Method stubs.
+namespace base {
+namespace android {
+
+static jlong JNI_SampleForTests_Init(JNIEnv* env, const base::android::JavaParamRef<jobject>&
+ caller,
+ const base::android::JavaParamRef<jstring>& param);
+
+JNI_GENERATOR_EXPORT jlong
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForTests_1init(
+ JNIEnv* env,
+ jclass jcaller,
+ jobject caller,
+ jstring param) {
+ return JNI_SampleForTests_Init(env, base::android::JavaParamRef<jobject>(env, caller),
+ base::android::JavaParamRef<jstring>(env, param));
+}
+
+JNI_GENERATOR_EXPORT void
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForTests_1destroy(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong nativeCPPClass,
+ jobject caller) {
+ CPPClass* native = reinterpret_cast<CPPClass*>(nativeCPPClass);
+ CHECK_NATIVE_PTR(env, jcaller, native, "Destroy");
+ return native->Destroy(env, base::android::JavaParamRef<jobject>(env, caller));
+}
+
+static jdouble JNI_SampleForTests_GetDoubleFunction(JNIEnv* env, const
+ base::android::JavaParamRef<jobject>& caller);
+
+JNI_GENERATOR_EXPORT jdouble
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForTests_1getDoubleFunction(
+ JNIEnv* env,
+ jclass jcaller,
+ jobject caller) {
+ return JNI_SampleForTests_GetDoubleFunction(env, base::android::JavaParamRef<jobject>(env,
+ caller));
+}
+
+static jfloat JNI_SampleForTests_GetFloatFunction(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT jfloat
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForTests_1getFloatFunction(
+ JNIEnv* env,
+ jclass jcaller) {
+ return JNI_SampleForTests_GetFloatFunction(env);
+}
+
+static void JNI_SampleForTests_SetNonPODDatatype(JNIEnv* env, const
+ base::android::JavaParamRef<jobject>& caller,
+ const base::android::JavaParamRef<jobject>& rect);
+
+JNI_GENERATOR_EXPORT void
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForTests_1setNonPODDatatype(
+ JNIEnv* env,
+ jclass jcaller,
+ jobject caller,
+ jobject rect) {
+ return JNI_SampleForTests_SetNonPODDatatype(env, base::android::JavaParamRef<jobject>(env,
+ caller), base::android::JavaParamRef<jobject>(env, rect));
+}
+
+static base::android::ScopedJavaLocalRef<jobject> JNI_SampleForTests_GetNonPODDatatype(JNIEnv* env,
+ const base::android::JavaParamRef<jobject>& caller);
+
+JNI_GENERATOR_EXPORT jobject
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForTests_1getNonPODDatatype(
+ JNIEnv* env,
+ jclass jcaller,
+ jobject caller) {
+ return JNI_SampleForTests_GetNonPODDatatype(env, base::android::JavaParamRef<jobject>(env,
+ caller)).Release();
+}
+
+JNI_GENERATOR_EXPORT jint
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForTests_1method(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong nativeCPPClass,
+ jobject caller) {
+ CPPClass* native = reinterpret_cast<CPPClass*>(nativeCPPClass);
+ CHECK_NATIVE_PTR(env, jcaller, native, "Method", 0);
+ return native->Method(env, base::android::JavaParamRef<jobject>(env, caller));
+}
+
+JNI_GENERATOR_EXPORT jdouble
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForTests_1methodOtherP0(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong nativePtr,
+ jobject caller) {
+ CPPClass::InnerClass* native = reinterpret_cast<CPPClass::InnerClass*>(nativePtr);
+ CHECK_NATIVE_PTR(env, jcaller, native, "MethodOtherP0", 0);
+ return native->MethodOtherP0(env, base::android::JavaParamRef<jobject>(env, caller));
+}
+
+JNI_GENERATOR_EXPORT void
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForTests_1addStructB(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong nativeCPPClass,
+ jobject caller,
+ jobject b) {
+ CPPClass* native = reinterpret_cast<CPPClass*>(nativeCPPClass);
+ CHECK_NATIVE_PTR(env, jcaller, native, "AddStructB");
+ return native->AddStructB(env, base::android::JavaParamRef<jobject>(env, caller),
+ base::android::JavaParamRef<jobject>(env, b));
+}
+
+JNI_GENERATOR_EXPORT void
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForTests_1iterateAndDoSomethingWithStructB(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong nativeCPPClass,
+ jobject caller) {
+ CPPClass* native = reinterpret_cast<CPPClass*>(nativeCPPClass);
+ CHECK_NATIVE_PTR(env, jcaller, native, "IterateAndDoSomethingWithStructB");
+ return native->IterateAndDoSomethingWithStructB(env, base::android::JavaParamRef<jobject>(env,
+ caller));
+}
+
+JNI_GENERATOR_EXPORT jstring
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1jni_11generator_1SampleForTests_1returnAString(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong nativeCPPClass,
+ jobject caller) {
+ CPPClass* native = reinterpret_cast<CPPClass*>(nativeCPPClass);
+ CHECK_NATIVE_PTR(env, jcaller, native, "ReturnAString", NULL);
+ return native->ReturnAString(env, base::android::JavaParamRef<jobject>(env, caller)).Release();
+}
+
+
+static std::atomic<jmethodID>
+ g_org_chromium_example_jni_1generator_SampleForTests_javaMethod(nullptr);
+static jint Java_SampleForTests_javaMethod(JNIEnv* env, const base::android::JavaRef<jobject>& obj,
+ JniIntWrapper foo,
+ JniIntWrapper bar) {
+ jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_example_jni_1generator_SampleForTests_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "javaMethod",
+ "(II)I",
+ &g_org_chromium_example_jni_1generator_SampleForTests_javaMethod);
+
+ jint ret =
+ env->CallIntMethod(obj.obj(),
+ call_context.base.method_id, as_jint(foo), as_jint(bar));
+ return ret;
+}
+
+static std::atomic<jmethodID>
+ g_org_chromium_example_jni_1generator_SampleForTests_staticJavaMethod(nullptr);
+static jboolean Java_SampleForTests_staticJavaMethod(JNIEnv* env) {
+ jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
+ CHECK_CLAZZ(env, clazz,
+ org_chromium_example_jni_1generator_SampleForTests_clazz(env), false);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_STATIC>(
+ env,
+ clazz,
+ "staticJavaMethod",
+ "()Z",
+ &g_org_chromium_example_jni_1generator_SampleForTests_staticJavaMethod);
+
+ jboolean ret =
+ env->CallStaticBooleanMethod(clazz,
+ call_context.base.method_id);
+ return ret;
+}
+
+static std::atomic<jmethodID>
+ g_org_chromium_example_jni_1generator_SampleForTests_packagePrivateJavaMethod(nullptr);
+static void Java_SampleForTests_packagePrivateJavaMethod(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj) {
+ jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_example_jni_1generator_SampleForTests_clazz(env));
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "packagePrivateJavaMethod",
+ "()V",
+ &g_org_chromium_example_jni_1generator_SampleForTests_packagePrivateJavaMethod);
+
+ env->CallVoidMethod(obj.obj(),
+ call_context.base.method_id);
+}
+
+static std::atomic<jmethodID>
+ g_org_chromium_example_jni_1generator_SampleForTests_methodWithGenericParams(nullptr);
+static void Java_SampleForTests_methodWithGenericParams(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, const base::android::JavaRef<jobject>& foo,
+ const base::android::JavaRef<jobject>& bar) {
+ jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_example_jni_1generator_SampleForTests_clazz(env));
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "methodWithGenericParams",
+ "(Ljava/util/Map;Ljava/util/LinkedList;)V",
+ &g_org_chromium_example_jni_1generator_SampleForTests_methodWithGenericParams);
+
+ env->CallVoidMethod(obj.obj(),
+ call_context.base.method_id, foo.obj(), bar.obj());
+}
+
+static std::atomic<jmethodID>
+ g_org_chromium_example_jni_1generator_SampleForTests_Constructor(nullptr);
+static base::android::ScopedJavaLocalRef<jobject> Java_SampleForTests_Constructor(JNIEnv* env,
+ JniIntWrapper foo,
+ JniIntWrapper bar) {
+ jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
+ CHECK_CLAZZ(env, clazz,
+ org_chromium_example_jni_1generator_SampleForTests_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "<init>",
+ "(II)V",
+ &g_org_chromium_example_jni_1generator_SampleForTests_Constructor);
+
+ jobject ret =
+ env->NewObject(clazz,
+ call_context.base.method_id, as_jint(foo), as_jint(bar));
+ return base::android::ScopedJavaLocalRef<jobject>(env, ret);
+}
+
+static std::atomic<jmethodID>
+ g_org_chromium_example_jni_1generator_SampleForTests_methodThatThrowsException(nullptr);
+static void Java_SampleForTests_methodThatThrowsException(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj) {
+ jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_example_jni_1generator_SampleForTests_clazz(env));
+
+ jni_generator::JniJavaCallContextUnchecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "methodThatThrowsException",
+ "()V",
+ &g_org_chromium_example_jni_1generator_SampleForTests_methodThatThrowsException);
+
+ env->CallVoidMethod(obj.obj(),
+ call_context.method_id);
+}
+
+static std::atomic<jmethodID>
+ g_org_chromium_example_jni_1generator_SampleForTests_javaMethodWithAnnotatedParam(nullptr);
+static void Java_SampleForTests_javaMethodWithAnnotatedParam(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper foo,
+ JniIntWrapper bar,
+ JniIntWrapper baz,
+ JniIntWrapper bat) {
+ jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_example_jni_1generator_SampleForTests_clazz(env));
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "javaMethodWithAnnotatedParam",
+ "(IIII)V",
+ &g_org_chromium_example_jni_1generator_SampleForTests_javaMethodWithAnnotatedParam);
+
+ env->CallVoidMethod(obj.obj(),
+ call_context.base.method_id, as_jint(foo), as_jint(bar), as_jint(baz), as_jint(bat));
+}
+
+static std::atomic<jmethodID>
+ g_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA_create(nullptr);
+static base::android::ScopedJavaLocalRef<jobject> Java_InnerStructA_create(JNIEnv* env, jlong l,
+ JniIntWrapper i,
+ const base::android::JavaRef<jstring>& s) {
+ jclass clazz = org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA_clazz(env);
+ CHECK_CLAZZ(env, clazz,
+ org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_STATIC>(
+ env,
+ clazz,
+ "create",
+ "(JILjava/lang/String;)Lorg/chromium/example/jni_generator/SampleForTests$InnerStructA;",
+ &g_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA_create);
+
+ jobject ret =
+ env->CallStaticObjectMethod(clazz,
+ call_context.base.method_id, l, as_jint(i), s.obj());
+ return base::android::ScopedJavaLocalRef<jobject>(env, ret);
+}
+
+static std::atomic<jmethodID>
+ g_org_chromium_example_jni_1generator_SampleForTests_addStructA(nullptr);
+static void Java_SampleForTests_addStructA(JNIEnv* env, const base::android::JavaRef<jobject>& obj,
+ const base::android::JavaRef<jobject>& a) {
+ jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_example_jni_1generator_SampleForTests_clazz(env));
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "addStructA",
+ "(Lorg/chromium/example/jni_generator/SampleForTests$InnerStructA;)V",
+ &g_org_chromium_example_jni_1generator_SampleForTests_addStructA);
+
+ env->CallVoidMethod(obj.obj(),
+ call_context.base.method_id, a.obj());
+}
+
+static std::atomic<jmethodID>
+ g_org_chromium_example_jni_1generator_SampleForTests_iterateAndDoSomething(nullptr);
+static void Java_SampleForTests_iterateAndDoSomething(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj) {
+ jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_example_jni_1generator_SampleForTests_clazz(env));
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "iterateAndDoSomething",
+ "()V",
+ &g_org_chromium_example_jni_1generator_SampleForTests_iterateAndDoSomething);
+
+ env->CallVoidMethod(obj.obj(),
+ call_context.base.method_id);
+}
+
+static std::atomic<jmethodID>
+ g_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_getKey(nullptr);
+static jlong Java_InnerStructB_getKey(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
+ jclass clazz = org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getKey",
+ "()J",
+ &g_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_getKey);
+
+ jlong ret =
+ env->CallLongMethod(obj.obj(),
+ call_context.base.method_id);
+ return ret;
+}
+
+static std::atomic<jmethodID>
+ g_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_getValue(nullptr);
+static base::android::ScopedJavaLocalRef<jstring> Java_InnerStructB_getValue(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj) {
+ jclass clazz = org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getValue",
+ "()Ljava/lang/String;",
+ &g_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_getValue);
+
+ jstring ret =
+ static_cast<jstring>(env->CallObjectMethod(obj.obj(),
+ call_context.base.method_id));
+ return base::android::ScopedJavaLocalRef<jstring>(env, ret);
+}
+
+static std::atomic<jmethodID>
+ g_org_chromium_example_jni_1generator_SampleForTests_getInnerInterface(nullptr);
+static base::android::ScopedJavaLocalRef<jobject> Java_SampleForTests_getInnerInterface(JNIEnv* env)
+ {
+ jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
+ CHECK_CLAZZ(env, clazz,
+ org_chromium_example_jni_1generator_SampleForTests_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_STATIC>(
+ env,
+ clazz,
+ "getInnerInterface",
+ "()Lorg/chromium/example/jni_generator/SampleForTests$InnerInterface;",
+ &g_org_chromium_example_jni_1generator_SampleForTests_getInnerInterface);
+
+ jobject ret =
+ env->CallStaticObjectMethod(clazz,
+ call_context.base.method_id);
+ return base::android::ScopedJavaLocalRef<jobject>(env, ret);
+}
+
+static std::atomic<jmethodID>
+ g_org_chromium_example_jni_1generator_SampleForTests_getInnerEnum(nullptr);
+static base::android::ScopedJavaLocalRef<jobject> Java_SampleForTests_getInnerEnum(JNIEnv* env) {
+ jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
+ CHECK_CLAZZ(env, clazz,
+ org_chromium_example_jni_1generator_SampleForTests_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_STATIC>(
+ env,
+ clazz,
+ "getInnerEnum",
+ "()Lorg/chromium/example/jni_generator/SampleForTests$InnerEnum;",
+ &g_org_chromium_example_jni_1generator_SampleForTests_getInnerEnum);
+
+ jobject ret =
+ env->CallStaticObjectMethod(clazz,
+ call_context.base.method_id);
+ return base::android::ScopedJavaLocalRef<jobject>(env, ret);
+}
+
+} // namespace android
+} // namespace base
+
+#endif // org_chromium_example_jni_generator_SampleForTests_JNI
diff --git a/chromium/base/android/jni_generator/golden/testCalledByNatives.golden b/chromium/base/android/jni_generator/golden/testCalledByNatives.golden
new file mode 100644
index 00000000000..2b34c97b2c2
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/testCalledByNatives.golden
@@ -0,0 +1,500 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_generator.py
+// For
+// org/chromium/TestJni
+
+#ifndef org_chromium_TestJni_JNI
+#define org_chromium_TestJni_JNI
+
+#include <jni.h>
+
+#include "base/android/jni_generator/jni_generator_helper.h"
+
+
+// Step 1: Forward declarations.
+
+JNI_REGISTRATION_EXPORT extern const char kClassPath_org_chromium_TestJni[];
+const char kClassPath_org_chromium_TestJni[] = "org/chromium/TestJni";
+
+JNI_REGISTRATION_EXPORT extern const char kClassPath_org_chromium_TestJni_00024InfoBar[];
+const char kClassPath_org_chromium_TestJni_00024InfoBar[] = "org/chromium/TestJni$InfoBar";
+// Leaking this jclass as we cannot use LazyInstance from some threads.
+JNI_REGISTRATION_EXPORT std::atomic<jclass> g_org_chromium_TestJni_clazz(nullptr);
+#ifndef org_chromium_TestJni_clazz_defined
+#define org_chromium_TestJni_clazz_defined
+inline jclass org_chromium_TestJni_clazz(JNIEnv* env) {
+ return base::android::LazyGetClass(env, kClassPath_org_chromium_TestJni,
+ &g_org_chromium_TestJni_clazz);
+}
+#endif
+// Leaking this jclass as we cannot use LazyInstance from some threads.
+JNI_REGISTRATION_EXPORT std::atomic<jclass> g_org_chromium_TestJni_00024InfoBar_clazz(nullptr);
+#ifndef org_chromium_TestJni_00024InfoBar_clazz_defined
+#define org_chromium_TestJni_00024InfoBar_clazz_defined
+inline jclass org_chromium_TestJni_00024InfoBar_clazz(JNIEnv* env) {
+ return base::android::LazyGetClass(env, kClassPath_org_chromium_TestJni_00024InfoBar,
+ &g_org_chromium_TestJni_00024InfoBar_clazz);
+}
+#endif
+
+
+// Step 2: Constants (optional).
+
+
+// Step 3: Method stubs.
+
+static std::atomic<jmethodID> g_org_chromium_TestJni_showConfirmInfoBar(nullptr);
+static base::android::ScopedJavaLocalRef<jobject> Java_TestJni_showConfirmInfoBar(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper nativeInfoBar,
+ const base::android::JavaRef<jstring>& buttonOk,
+ const base::android::JavaRef<jstring>& buttonCancel,
+ const base::android::JavaRef<jstring>& title,
+ const base::android::JavaRef<jobject>& icon) {
+ jclass clazz = org_chromium_TestJni_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_TestJni_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "showConfirmInfoBar",
+"(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/graphics/Bitmap;)Lorg/chromium/Foo$InnerClass;",
+ &g_org_chromium_TestJni_showConfirmInfoBar);
+
+ jobject ret =
+ env->CallObjectMethod(obj.obj(),
+ call_context.base.method_id, as_jint(nativeInfoBar), buttonOk.obj(), buttonCancel.obj(),
+ title.obj(), icon.obj());
+ return base::android::ScopedJavaLocalRef<jobject>(env, ret);
+}
+
+static std::atomic<jmethodID> g_org_chromium_TestJni_showAutoLoginInfoBar(nullptr);
+static base::android::ScopedJavaLocalRef<jobject> Java_TestJni_showAutoLoginInfoBar(JNIEnv* env,
+ const base::android::JavaRef<jobject>& obj, JniIntWrapper nativeInfoBar,
+ const base::android::JavaRef<jstring>& realm,
+ const base::android::JavaRef<jstring>& account,
+ const base::android::JavaRef<jstring>& args) {
+ jclass clazz = org_chromium_TestJni_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_TestJni_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "showAutoLoginInfoBar",
+ "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/chromium/Foo$InnerClass;",
+ &g_org_chromium_TestJni_showAutoLoginInfoBar);
+
+ jobject ret =
+ env->CallObjectMethod(obj.obj(),
+ call_context.base.method_id, as_jint(nativeInfoBar), realm.obj(), account.obj(),
+ args.obj());
+ return base::android::ScopedJavaLocalRef<jobject>(env, ret);
+}
+
+static std::atomic<jmethodID> g_org_chromium_TestJni_00024InfoBar_dismiss(nullptr);
+static void Java_InfoBar_dismiss(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
+ jclass clazz = org_chromium_TestJni_00024InfoBar_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_TestJni_00024InfoBar_clazz(env));
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "dismiss",
+ "()V",
+ &g_org_chromium_TestJni_00024InfoBar_dismiss);
+
+ env->CallVoidMethod(obj.obj(),
+ call_context.base.method_id);
+}
+
+static std::atomic<jmethodID> g_org_chromium_TestJni_shouldShowAutoLogin(nullptr);
+static jboolean Java_TestJni_shouldShowAutoLogin(JNIEnv* env, const base::android::JavaRef<jobject>&
+ view,
+ const base::android::JavaRef<jstring>& realm,
+ const base::android::JavaRef<jstring>& account,
+ const base::android::JavaRef<jstring>& args) {
+ jclass clazz = org_chromium_TestJni_clazz(env);
+ CHECK_CLAZZ(env, clazz,
+ org_chromium_TestJni_clazz(env), false);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_STATIC>(
+ env,
+ clazz,
+ "shouldShowAutoLogin",
+ "(Landroid/view/View;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z",
+ &g_org_chromium_TestJni_shouldShowAutoLogin);
+
+ jboolean ret =
+ env->CallStaticBooleanMethod(clazz,
+ call_context.base.method_id, view.obj(), realm.obj(), account.obj(), args.obj());
+ return ret;
+}
+
+static std::atomic<jmethodID> g_org_chromium_TestJni_openUrl(nullptr);
+static base::android::ScopedJavaLocalRef<jobject> Java_TestJni_openUrl(JNIEnv* env, const
+ base::android::JavaRef<jstring>& url) {
+ jclass clazz = org_chromium_TestJni_clazz(env);
+ CHECK_CLAZZ(env, clazz,
+ org_chromium_TestJni_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_STATIC>(
+ env,
+ clazz,
+ "openUrl",
+ "(Ljava/lang/String;)Ljava/io/InputStream;",
+ &g_org_chromium_TestJni_openUrl);
+
+ jobject ret =
+ env->CallStaticObjectMethod(clazz,
+ call_context.base.method_id, url.obj());
+ return base::android::ScopedJavaLocalRef<jobject>(env, ret);
+}
+
+static std::atomic<jmethodID> g_org_chromium_TestJni_activateHardwareAcceleration(nullptr);
+static void Java_TestJni_activateHardwareAcceleration(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, jboolean activated,
+ JniIntWrapper iPid,
+ JniIntWrapper iType,
+ JniIntWrapper iPrimaryID,
+ JniIntWrapper iSecondaryID) {
+ jclass clazz = org_chromium_TestJni_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_TestJni_clazz(env));
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "activateHardwareAcceleration",
+ "(ZIIII)V",
+ &g_org_chromium_TestJni_activateHardwareAcceleration);
+
+ env->CallVoidMethod(obj.obj(),
+ call_context.base.method_id, activated, as_jint(iPid), as_jint(iType),
+ as_jint(iPrimaryID), as_jint(iSecondaryID));
+}
+
+static std::atomic<jmethodID> g_org_chromium_TestJni_updateStatus(nullptr);
+static jint Java_TestJni_updateStatus(JNIEnv* env, JniIntWrapper status) {
+ jclass clazz = org_chromium_TestJni_clazz(env);
+ CHECK_CLAZZ(env, clazz,
+ org_chromium_TestJni_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_STATIC>(
+ env,
+ clazz,
+ "updateStatus",
+ "(I)I",
+ &g_org_chromium_TestJni_updateStatus);
+
+ jint ret =
+ env->CallStaticIntMethod(clazz,
+ call_context.base.method_id, as_jint(status));
+ return ret;
+}
+
+static std::atomic<jmethodID> g_org_chromium_TestJni_uncheckedCall(nullptr);
+static void Java_TestJni_uncheckedCall(JNIEnv* env, const base::android::JavaRef<jobject>& obj,
+ JniIntWrapper iParam) {
+ jclass clazz = org_chromium_TestJni_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_TestJni_clazz(env));
+
+ jni_generator::JniJavaCallContextUnchecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "uncheckedCall",
+ "(I)V",
+ &g_org_chromium_TestJni_uncheckedCall);
+
+ env->CallVoidMethod(obj.obj(),
+ call_context.method_id, as_jint(iParam));
+}
+
+static std::atomic<jmethodID> g_org_chromium_TestJni_returnByteArray(nullptr);
+static base::android::ScopedJavaLocalRef<jbyteArray> Java_TestJni_returnByteArray(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj) {
+ jclass clazz = org_chromium_TestJni_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_TestJni_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "returnByteArray",
+ "()[B",
+ &g_org_chromium_TestJni_returnByteArray);
+
+ jbyteArray ret =
+ static_cast<jbyteArray>(env->CallObjectMethod(obj.obj(),
+ call_context.base.method_id));
+ return base::android::ScopedJavaLocalRef<jbyteArray>(env, ret);
+}
+
+static std::atomic<jmethodID> g_org_chromium_TestJni_returnBooleanArray(nullptr);
+static base::android::ScopedJavaLocalRef<jbooleanArray> Java_TestJni_returnBooleanArray(JNIEnv* env,
+ const base::android::JavaRef<jobject>& obj) {
+ jclass clazz = org_chromium_TestJni_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_TestJni_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "returnBooleanArray",
+ "()[Z",
+ &g_org_chromium_TestJni_returnBooleanArray);
+
+ jbooleanArray ret =
+ static_cast<jbooleanArray>(env->CallObjectMethod(obj.obj(),
+ call_context.base.method_id));
+ return base::android::ScopedJavaLocalRef<jbooleanArray>(env, ret);
+}
+
+static std::atomic<jmethodID> g_org_chromium_TestJni_returnCharArray(nullptr);
+static base::android::ScopedJavaLocalRef<jcharArray> Java_TestJni_returnCharArray(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj) {
+ jclass clazz = org_chromium_TestJni_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_TestJni_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "returnCharArray",
+ "()[C",
+ &g_org_chromium_TestJni_returnCharArray);
+
+ jcharArray ret =
+ static_cast<jcharArray>(env->CallObjectMethod(obj.obj(),
+ call_context.base.method_id));
+ return base::android::ScopedJavaLocalRef<jcharArray>(env, ret);
+}
+
+static std::atomic<jmethodID> g_org_chromium_TestJni_returnShortArray(nullptr);
+static base::android::ScopedJavaLocalRef<jshortArray> Java_TestJni_returnShortArray(JNIEnv* env,
+ const base::android::JavaRef<jobject>& obj) {
+ jclass clazz = org_chromium_TestJni_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_TestJni_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "returnShortArray",
+ "()[S",
+ &g_org_chromium_TestJni_returnShortArray);
+
+ jshortArray ret =
+ static_cast<jshortArray>(env->CallObjectMethod(obj.obj(),
+ call_context.base.method_id));
+ return base::android::ScopedJavaLocalRef<jshortArray>(env, ret);
+}
+
+static std::atomic<jmethodID> g_org_chromium_TestJni_returnIntArray(nullptr);
+static base::android::ScopedJavaLocalRef<jintArray> Java_TestJni_returnIntArray(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj) {
+ jclass clazz = org_chromium_TestJni_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_TestJni_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "returnIntArray",
+ "()[I",
+ &g_org_chromium_TestJni_returnIntArray);
+
+ jintArray ret =
+ static_cast<jintArray>(env->CallObjectMethod(obj.obj(),
+ call_context.base.method_id));
+ return base::android::ScopedJavaLocalRef<jintArray>(env, ret);
+}
+
+static std::atomic<jmethodID> g_org_chromium_TestJni_returnLongArray(nullptr);
+static base::android::ScopedJavaLocalRef<jlongArray> Java_TestJni_returnLongArray(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj) {
+ jclass clazz = org_chromium_TestJni_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_TestJni_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "returnLongArray",
+ "()[J",
+ &g_org_chromium_TestJni_returnLongArray);
+
+ jlongArray ret =
+ static_cast<jlongArray>(env->CallObjectMethod(obj.obj(),
+ call_context.base.method_id));
+ return base::android::ScopedJavaLocalRef<jlongArray>(env, ret);
+}
+
+static std::atomic<jmethodID> g_org_chromium_TestJni_returnDoubleArray(nullptr);
+static base::android::ScopedJavaLocalRef<jdoubleArray> Java_TestJni_returnDoubleArray(JNIEnv* env,
+ const base::android::JavaRef<jobject>& obj) {
+ jclass clazz = org_chromium_TestJni_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_TestJni_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "returnDoubleArray",
+ "()[D",
+ &g_org_chromium_TestJni_returnDoubleArray);
+
+ jdoubleArray ret =
+ static_cast<jdoubleArray>(env->CallObjectMethod(obj.obj(),
+ call_context.base.method_id));
+ return base::android::ScopedJavaLocalRef<jdoubleArray>(env, ret);
+}
+
+static std::atomic<jmethodID> g_org_chromium_TestJni_returnObjectArray(nullptr);
+static base::android::ScopedJavaLocalRef<jobjectArray> Java_TestJni_returnObjectArray(JNIEnv* env,
+ const base::android::JavaRef<jobject>& obj) {
+ jclass clazz = org_chromium_TestJni_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_TestJni_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "returnObjectArray",
+ "()[Ljava/lang/Object;",
+ &g_org_chromium_TestJni_returnObjectArray);
+
+ jobjectArray ret =
+ static_cast<jobjectArray>(env->CallObjectMethod(obj.obj(),
+ call_context.base.method_id));
+ return base::android::ScopedJavaLocalRef<jobjectArray>(env, ret);
+}
+
+static std::atomic<jmethodID> g_org_chromium_TestJni_returnArrayOfByteArray(nullptr);
+static base::android::ScopedJavaLocalRef<jobjectArray> Java_TestJni_returnArrayOfByteArray(JNIEnv*
+ env, const base::android::JavaRef<jobject>& obj) {
+ jclass clazz = org_chromium_TestJni_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_TestJni_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "returnArrayOfByteArray",
+ "()[[B",
+ &g_org_chromium_TestJni_returnArrayOfByteArray);
+
+ jobjectArray ret =
+ static_cast<jobjectArray>(env->CallObjectMethod(obj.obj(),
+ call_context.base.method_id));
+ return base::android::ScopedJavaLocalRef<jobjectArray>(env, ret);
+}
+
+static std::atomic<jmethodID> g_org_chromium_TestJni_getCompressFormat(nullptr);
+static base::android::ScopedJavaLocalRef<jobject> Java_TestJni_getCompressFormat(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj) {
+ jclass clazz = org_chromium_TestJni_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_TestJni_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getCompressFormat",
+ "()Landroid/graphics/Bitmap$CompressFormat;",
+ &g_org_chromium_TestJni_getCompressFormat);
+
+ jobject ret =
+ env->CallObjectMethod(obj.obj(),
+ call_context.base.method_id);
+ return base::android::ScopedJavaLocalRef<jobject>(env, ret);
+}
+
+static std::atomic<jmethodID> g_org_chromium_TestJni_getCompressFormatList(nullptr);
+static base::android::ScopedJavaLocalRef<jobject> Java_TestJni_getCompressFormatList(JNIEnv* env,
+ const base::android::JavaRef<jobject>& obj) {
+ jclass clazz = org_chromium_TestJni_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_TestJni_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getCompressFormatList",
+ "()Ljava/util/List;",
+ &g_org_chromium_TestJni_getCompressFormatList);
+
+ jobject ret =
+ env->CallObjectMethod(obj.obj(),
+ call_context.base.method_id);
+ return base::android::ScopedJavaLocalRef<jobject>(env, ret);
+}
+
+static std::atomic<jmethodID> g_org_chromium_TestJni_returnIntArrayForTesting(nullptr);
+static base::android::ScopedJavaLocalRef<jintArray> Java_TestJni_returnIntArrayForTesting(JNIEnv*
+ env, const base::android::JavaRef<jobject>& obj) {
+ jclass clazz = org_chromium_TestJni_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_TestJni_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "returnIntArrayForTesting",
+ "()[I",
+ &g_org_chromium_TestJni_returnIntArrayForTesting);
+
+ jintArray ret =
+ static_cast<jintArray>(env->CallObjectMethod(obj.obj(),
+ call_context.base.method_id));
+ return base::android::ScopedJavaLocalRef<jintArray>(env, ret);
+}
+
+#endif // org_chromium_TestJni_JNI
diff --git a/chromium/base/android/jni_generator/golden/testConstantsFromJavaP.golden b/chromium/base/android/jni_generator/golden/testConstantsFromJavaP.golden
new file mode 100644
index 00000000000..0a787724e28
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/testConstantsFromJavaP.golden
@@ -0,0 +1,2320 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_generator.py
+// For
+// android/view/MotionEvent
+
+#ifndef android_view_MotionEvent_JNI
+#define android_view_MotionEvent_JNI
+
+#include <jni.h>
+
+#include "base/android/jni_generator/jni_generator_helper.h"
+
+
+// Step 1: Forward declarations.
+
+JNI_REGISTRATION_EXPORT extern const char kClassPath_android_view_MotionEvent[];
+const char kClassPath_android_view_MotionEvent[] = "android/view/MotionEvent";
+// Leaking this jclass as we cannot use LazyInstance from some threads.
+JNI_REGISTRATION_EXPORT std::atomic<jclass> g_android_view_MotionEvent_clazz(nullptr);
+#ifndef android_view_MotionEvent_clazz_defined
+#define android_view_MotionEvent_clazz_defined
+inline jclass android_view_MotionEvent_clazz(JNIEnv* env) {
+ return base::android::LazyGetClass(env, kClassPath_android_view_MotionEvent,
+ &g_android_view_MotionEvent_clazz);
+}
+#endif
+
+
+// Step 2: Constants (optional).
+
+namespace JNI_MotionEvent {
+
+enum Java_MotionEvent_constant_fields {
+ INVALID_POINTER_ID = -1,
+ ACTION_MASK = 255,
+ ACTION_DOWN = 0,
+ ACTION_UP = 1,
+ ACTION_MOVE = 2,
+ ACTION_CANCEL = 3,
+ ACTION_OUTSIDE = 4,
+ ACTION_POINTER_DOWN = 5,
+ ACTION_POINTER_UP = 6,
+ ACTION_HOVER_MOVE = 7,
+ ACTION_SCROLL = 8,
+ ACTION_HOVER_ENTER = 9,
+ ACTION_HOVER_EXIT = 10,
+ ACTION_POINTER_INDEX_MASK = 65280,
+ ACTION_POINTER_INDEX_SHIFT = 8,
+ ACTION_POINTER_1_DOWN = 5,
+ ACTION_POINTER_2_DOWN = 261,
+ ACTION_POINTER_3_DOWN = 517,
+ ACTION_POINTER_1_UP = 6,
+ ACTION_POINTER_2_UP = 262,
+ ACTION_POINTER_3_UP = 518,
+ ACTION_POINTER_ID_MASK = 65280,
+ ACTION_POINTER_ID_SHIFT = 8,
+ FLAG_WINDOW_IS_OBSCURED = 1,
+ EDGE_TOP = 1,
+ EDGE_BOTTOM = 2,
+ EDGE_LEFT = 4,
+ EDGE_RIGHT = 8,
+ AXIS_X = 0,
+ AXIS_Y = 1,
+ AXIS_PRESSURE = 2,
+ AXIS_SIZE = 3,
+ AXIS_TOUCH_MAJOR = 4,
+ AXIS_TOUCH_MINOR = 5,
+ AXIS_TOOL_MAJOR = 6,
+ AXIS_TOOL_MINOR = 7,
+ AXIS_ORIENTATION = 8,
+ AXIS_VSCROLL = 9,
+ AXIS_HSCROLL = 10,
+ AXIS_Z = 11,
+ AXIS_RX = 12,
+ AXIS_RY = 13,
+ AXIS_RZ = 14,
+ AXIS_HAT_X = 15,
+ AXIS_HAT_Y = 16,
+ AXIS_LTRIGGER = 17,
+ AXIS_RTRIGGER = 18,
+ AXIS_THROTTLE = 19,
+ AXIS_RUDDER = 20,
+ AXIS_WHEEL = 21,
+ AXIS_GAS = 22,
+ AXIS_BRAKE = 23,
+ AXIS_DISTANCE = 24,
+ AXIS_TILT = 25,
+ AXIS_GENERIC_1 = 32,
+ AXIS_GENERIC_2 = 33,
+ AXIS_GENERIC_3 = 34,
+ AXIS_GENERIC_4 = 35,
+ AXIS_GENERIC_5 = 36,
+ AXIS_GENERIC_6 = 37,
+ AXIS_GENERIC_7 = 38,
+ AXIS_GENERIC_8 = 39,
+ AXIS_GENERIC_9 = 40,
+ AXIS_GENERIC_10 = 41,
+ AXIS_GENERIC_11 = 42,
+ AXIS_GENERIC_12 = 43,
+ AXIS_GENERIC_13 = 44,
+ AXIS_GENERIC_14 = 45,
+ AXIS_GENERIC_15 = 46,
+ AXIS_GENERIC_16 = 47,
+ BUTTON_PRIMARY = 1,
+ BUTTON_SECONDARY = 2,
+ BUTTON_TERTIARY = 4,
+ BUTTON_BACK = 8,
+ BUTTON_FORWARD = 16,
+ TOOL_TYPE_UNKNOWN = 0,
+ TOOL_TYPE_FINGER = 1,
+ TOOL_TYPE_STYLUS = 2,
+ TOOL_TYPE_MOUSE = 3,
+ TOOL_TYPE_ERASER = 4,
+};
+
+
+} // namespace JNI_MotionEvent
+// Step 3: Method stubs.
+namespace JNI_MotionEvent {
+
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_finalize(nullptr);
+[[maybe_unused]] static void Java_MotionEvent_finalize(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj);
+static void Java_MotionEvent_finalize(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env));
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "finalize",
+ "()V",
+ &g_android_view_MotionEvent_finalize);
+
+ env->CallVoidMethod(obj.obj(),
+ call_context.base.method_id);
+}
+
+static std::atomic<jmethodID>
+ g_android_view_MotionEvent_obtainAVME_J_J_I_I_LAVMEPP_LAVMEPC_I_I_F_F_I_I_I_I(nullptr);
+[[maybe_unused]] static base::android::ScopedJavaLocalRef<jobject>
+ Java_MotionEvent_obtainAVME_J_J_I_I_LAVMEPP_LAVMEPC_I_I_F_F_I_I_I_I(JNIEnv* env, jlong p0,
+ jlong p1,
+ JniIntWrapper p2,
+ JniIntWrapper p3,
+ const base::android::JavaRef<jobjectArray>& p4,
+ const base::android::JavaRef<jobjectArray>& p5,
+ JniIntWrapper p6,
+ JniIntWrapper p7,
+ jfloat p8,
+ jfloat p9,
+ JniIntWrapper p10,
+ JniIntWrapper p11,
+ JniIntWrapper p12,
+ JniIntWrapper p13);
+static base::android::ScopedJavaLocalRef<jobject>
+ Java_MotionEvent_obtainAVME_J_J_I_I_LAVMEPP_LAVMEPC_I_I_F_F_I_I_I_I(JNIEnv* env, jlong p0,
+ jlong p1,
+ JniIntWrapper p2,
+ JniIntWrapper p3,
+ const base::android::JavaRef<jobjectArray>& p4,
+ const base::android::JavaRef<jobjectArray>& p5,
+ JniIntWrapper p6,
+ JniIntWrapper p7,
+ jfloat p8,
+ jfloat p9,
+ JniIntWrapper p10,
+ JniIntWrapper p11,
+ JniIntWrapper p12,
+ JniIntWrapper p13) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, clazz,
+ android_view_MotionEvent_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_STATIC>(
+ env,
+ clazz,
+ "obtain",
+"(JJII[Landroid/view/MotionEvent$PointerProperties;[Landroid/view/MotionEvent$PointerCoords;IIFFIIII)Landroid/view/MotionEvent;",
+ &g_android_view_MotionEvent_obtainAVME_J_J_I_I_LAVMEPP_LAVMEPC_I_I_F_F_I_I_I_I);
+
+ jobject ret =
+ env->CallStaticObjectMethod(clazz,
+ call_context.base.method_id, p0, p1, as_jint(p2), as_jint(p3), p4.obj(), p5.obj(),
+ as_jint(p6), as_jint(p7), p8, p9, as_jint(p10), as_jint(p11), as_jint(p12),
+ as_jint(p13));
+ return base::android::ScopedJavaLocalRef<jobject>(env, ret);
+}
+
+static std::atomic<jmethodID>
+ g_android_view_MotionEvent_obtainAVME_J_J_I_I_AI_LAVMEPC_I_F_F_I_I_I_I(nullptr);
+[[maybe_unused]] static base::android::ScopedJavaLocalRef<jobject>
+ Java_MotionEvent_obtainAVME_J_J_I_I_AI_LAVMEPC_I_F_F_I_I_I_I(JNIEnv* env, jlong p0,
+ jlong p1,
+ JniIntWrapper p2,
+ JniIntWrapper p3,
+ const base::android::JavaRef<jintArray>& p4,
+ const base::android::JavaRef<jobjectArray>& p5,
+ JniIntWrapper p6,
+ jfloat p7,
+ jfloat p8,
+ JniIntWrapper p9,
+ JniIntWrapper p10,
+ JniIntWrapper p11,
+ JniIntWrapper p12);
+static base::android::ScopedJavaLocalRef<jobject>
+ Java_MotionEvent_obtainAVME_J_J_I_I_AI_LAVMEPC_I_F_F_I_I_I_I(JNIEnv* env, jlong p0,
+ jlong p1,
+ JniIntWrapper p2,
+ JniIntWrapper p3,
+ const base::android::JavaRef<jintArray>& p4,
+ const base::android::JavaRef<jobjectArray>& p5,
+ JniIntWrapper p6,
+ jfloat p7,
+ jfloat p8,
+ JniIntWrapper p9,
+ JniIntWrapper p10,
+ JniIntWrapper p11,
+ JniIntWrapper p12) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, clazz,
+ android_view_MotionEvent_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_STATIC>(
+ env,
+ clazz,
+ "obtain",
+ "(JJII[I[Landroid/view/MotionEvent$PointerCoords;IFFIIII)Landroid/view/MotionEvent;",
+ &g_android_view_MotionEvent_obtainAVME_J_J_I_I_AI_LAVMEPC_I_F_F_I_I_I_I);
+
+ jobject ret =
+ env->CallStaticObjectMethod(clazz,
+ call_context.base.method_id, p0, p1, as_jint(p2), as_jint(p3), p4.obj(), p5.obj(),
+ as_jint(p6), p7, p8, as_jint(p9), as_jint(p10), as_jint(p11), as_jint(p12));
+ return base::android::ScopedJavaLocalRef<jobject>(env, ret);
+}
+
+static std::atomic<jmethodID>
+ g_android_view_MotionEvent_obtainAVME_J_J_I_F_F_F_F_I_F_F_I_I(nullptr);
+[[maybe_unused]] static base::android::ScopedJavaLocalRef<jobject>
+ Java_MotionEvent_obtainAVME_J_J_I_F_F_F_F_I_F_F_I_I(JNIEnv* env, jlong p0,
+ jlong p1,
+ JniIntWrapper p2,
+ jfloat p3,
+ jfloat p4,
+ jfloat p5,
+ jfloat p6,
+ JniIntWrapper p7,
+ jfloat p8,
+ jfloat p9,
+ JniIntWrapper p10,
+ JniIntWrapper p11);
+static base::android::ScopedJavaLocalRef<jobject>
+ Java_MotionEvent_obtainAVME_J_J_I_F_F_F_F_I_F_F_I_I(JNIEnv* env, jlong p0,
+ jlong p1,
+ JniIntWrapper p2,
+ jfloat p3,
+ jfloat p4,
+ jfloat p5,
+ jfloat p6,
+ JniIntWrapper p7,
+ jfloat p8,
+ jfloat p9,
+ JniIntWrapper p10,
+ JniIntWrapper p11) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, clazz,
+ android_view_MotionEvent_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_STATIC>(
+ env,
+ clazz,
+ "obtain",
+ "(JJIFFFFIFFII)Landroid/view/MotionEvent;",
+ &g_android_view_MotionEvent_obtainAVME_J_J_I_F_F_F_F_I_F_F_I_I);
+
+ jobject ret =
+ env->CallStaticObjectMethod(clazz,
+ call_context.base.method_id, p0, p1, as_jint(p2), p3, p4, p5, p6, as_jint(p7), p8, p9,
+ as_jint(p10), as_jint(p11));
+ return base::android::ScopedJavaLocalRef<jobject>(env, ret);
+}
+
+static std::atomic<jmethodID>
+ g_android_view_MotionEvent_obtainAVME_J_J_I_I_F_F_F_F_I_F_F_I_I(nullptr);
+[[maybe_unused]] static base::android::ScopedJavaLocalRef<jobject>
+ Java_MotionEvent_obtainAVME_J_J_I_I_F_F_F_F_I_F_F_I_I(JNIEnv* env, jlong p0,
+ jlong p1,
+ JniIntWrapper p2,
+ JniIntWrapper p3,
+ jfloat p4,
+ jfloat p5,
+ jfloat p6,
+ jfloat p7,
+ JniIntWrapper p8,
+ jfloat p9,
+ jfloat p10,
+ JniIntWrapper p11,
+ JniIntWrapper p12);
+static base::android::ScopedJavaLocalRef<jobject>
+ Java_MotionEvent_obtainAVME_J_J_I_I_F_F_F_F_I_F_F_I_I(JNIEnv* env, jlong p0,
+ jlong p1,
+ JniIntWrapper p2,
+ JniIntWrapper p3,
+ jfloat p4,
+ jfloat p5,
+ jfloat p6,
+ jfloat p7,
+ JniIntWrapper p8,
+ jfloat p9,
+ jfloat p10,
+ JniIntWrapper p11,
+ JniIntWrapper p12) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, clazz,
+ android_view_MotionEvent_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_STATIC>(
+ env,
+ clazz,
+ "obtain",
+ "(JJIIFFFFIFFII)Landroid/view/MotionEvent;",
+ &g_android_view_MotionEvent_obtainAVME_J_J_I_I_F_F_F_F_I_F_F_I_I);
+
+ jobject ret =
+ env->CallStaticObjectMethod(clazz,
+ call_context.base.method_id, p0, p1, as_jint(p2), as_jint(p3), p4, p5, p6, p7,
+ as_jint(p8), p9, p10, as_jint(p11), as_jint(p12));
+ return base::android::ScopedJavaLocalRef<jobject>(env, ret);
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_obtainAVME_J_J_I_F_F_I(nullptr);
+[[maybe_unused]] static base::android::ScopedJavaLocalRef<jobject>
+ Java_MotionEvent_obtainAVME_J_J_I_F_F_I(JNIEnv* env, jlong p0,
+ jlong p1,
+ JniIntWrapper p2,
+ jfloat p3,
+ jfloat p4,
+ JniIntWrapper p5);
+static base::android::ScopedJavaLocalRef<jobject> Java_MotionEvent_obtainAVME_J_J_I_F_F_I(JNIEnv*
+ env, jlong p0,
+ jlong p1,
+ JniIntWrapper p2,
+ jfloat p3,
+ jfloat p4,
+ JniIntWrapper p5) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, clazz,
+ android_view_MotionEvent_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_STATIC>(
+ env,
+ clazz,
+ "obtain",
+ "(JJIFFI)Landroid/view/MotionEvent;",
+ &g_android_view_MotionEvent_obtainAVME_J_J_I_F_F_I);
+
+ jobject ret =
+ env->CallStaticObjectMethod(clazz,
+ call_context.base.method_id, p0, p1, as_jint(p2), p3, p4, as_jint(p5));
+ return base::android::ScopedJavaLocalRef<jobject>(env, ret);
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_obtainAVME_AVME(nullptr);
+[[maybe_unused]] static base::android::ScopedJavaLocalRef<jobject>
+ Java_MotionEvent_obtainAVME_AVME(JNIEnv* env, const base::android::JavaRef<jobject>& p0);
+static base::android::ScopedJavaLocalRef<jobject> Java_MotionEvent_obtainAVME_AVME(JNIEnv* env,
+ const base::android::JavaRef<jobject>& p0) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, clazz,
+ android_view_MotionEvent_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_STATIC>(
+ env,
+ clazz,
+ "obtain",
+ "(Landroid/view/MotionEvent;)Landroid/view/MotionEvent;",
+ &g_android_view_MotionEvent_obtainAVME_AVME);
+
+ jobject ret =
+ env->CallStaticObjectMethod(clazz,
+ call_context.base.method_id, p0.obj());
+ return base::android::ScopedJavaLocalRef<jobject>(env, ret);
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_obtainNoHistory(nullptr);
+[[maybe_unused]] static base::android::ScopedJavaLocalRef<jobject>
+ Java_MotionEvent_obtainNoHistory(JNIEnv* env, const base::android::JavaRef<jobject>& p0);
+static base::android::ScopedJavaLocalRef<jobject> Java_MotionEvent_obtainNoHistory(JNIEnv* env,
+ const base::android::JavaRef<jobject>& p0) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, clazz,
+ android_view_MotionEvent_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_STATIC>(
+ env,
+ clazz,
+ "obtainNoHistory",
+ "(Landroid/view/MotionEvent;)Landroid/view/MotionEvent;",
+ &g_android_view_MotionEvent_obtainNoHistory);
+
+ jobject ret =
+ env->CallStaticObjectMethod(clazz,
+ call_context.base.method_id, p0.obj());
+ return base::android::ScopedJavaLocalRef<jobject>(env, ret);
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_recycle(nullptr);
+[[maybe_unused]] static void Java_MotionEvent_recycle(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj);
+static void Java_MotionEvent_recycle(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env));
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "recycle",
+ "()V",
+ &g_android_view_MotionEvent_recycle);
+
+ env->CallVoidMethod(obj.obj(),
+ call_context.base.method_id);
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getDeviceId(nullptr);
+[[maybe_unused]] static jint Java_MotionEvent_getDeviceId(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj);
+static jint Java_MotionEvent_getDeviceId(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getDeviceId",
+ "()I",
+ &g_android_view_MotionEvent_getDeviceId);
+
+ jint ret =
+ env->CallIntMethod(obj.obj(),
+ call_context.base.method_id);
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getSource(nullptr);
+[[maybe_unused]] static jint Java_MotionEvent_getSource(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj);
+static jint Java_MotionEvent_getSource(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getSource",
+ "()I",
+ &g_android_view_MotionEvent_getSource);
+
+ jint ret =
+ env->CallIntMethod(obj.obj(),
+ call_context.base.method_id);
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_setSource(nullptr);
+[[maybe_unused]] static void Java_MotionEvent_setSource(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
+static void Java_MotionEvent_setSource(JNIEnv* env, const base::android::JavaRef<jobject>& obj,
+ JniIntWrapper p0) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env));
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "setSource",
+ "(I)V",
+ &g_android_view_MotionEvent_setSource);
+
+ env->CallVoidMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0));
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getAction(nullptr);
+[[maybe_unused]] static jint Java_MotionEvent_getAction(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj);
+static jint Java_MotionEvent_getAction(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getAction",
+ "()I",
+ &g_android_view_MotionEvent_getAction);
+
+ jint ret =
+ env->CallIntMethod(obj.obj(),
+ call_context.base.method_id);
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getActionMasked(nullptr);
+[[maybe_unused]] static jint Java_MotionEvent_getActionMasked(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj);
+static jint Java_MotionEvent_getActionMasked(JNIEnv* env, const base::android::JavaRef<jobject>&
+ obj) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getActionMasked",
+ "()I",
+ &g_android_view_MotionEvent_getActionMasked);
+
+ jint ret =
+ env->CallIntMethod(obj.obj(),
+ call_context.base.method_id);
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getActionIndex(nullptr);
+[[maybe_unused]] static jint Java_MotionEvent_getActionIndex(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj);
+static jint Java_MotionEvent_getActionIndex(JNIEnv* env, const base::android::JavaRef<jobject>& obj)
+ {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getActionIndex",
+ "()I",
+ &g_android_view_MotionEvent_getActionIndex);
+
+ jint ret =
+ env->CallIntMethod(obj.obj(),
+ call_context.base.method_id);
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getFlags(nullptr);
+[[maybe_unused]] static jint Java_MotionEvent_getFlags(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj);
+static jint Java_MotionEvent_getFlags(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getFlags",
+ "()I",
+ &g_android_view_MotionEvent_getFlags);
+
+ jint ret =
+ env->CallIntMethod(obj.obj(),
+ call_context.base.method_id);
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getDownTime(nullptr);
+[[maybe_unused]] static jlong Java_MotionEvent_getDownTime(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj);
+static jlong Java_MotionEvent_getDownTime(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getDownTime",
+ "()J",
+ &g_android_view_MotionEvent_getDownTime);
+
+ jlong ret =
+ env->CallLongMethod(obj.obj(),
+ call_context.base.method_id);
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getEventTime(nullptr);
+[[maybe_unused]] static jlong Java_MotionEvent_getEventTime(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj);
+static jlong Java_MotionEvent_getEventTime(JNIEnv* env, const base::android::JavaRef<jobject>& obj)
+ {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getEventTime",
+ "()J",
+ &g_android_view_MotionEvent_getEventTime);
+
+ jlong ret =
+ env->CallLongMethod(obj.obj(),
+ call_context.base.method_id);
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getXF(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getXF(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj);
+static jfloat Java_MotionEvent_getXF(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getX",
+ "()F",
+ &g_android_view_MotionEvent_getXF);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id);
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getYF(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getYF(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj);
+static jfloat Java_MotionEvent_getYF(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getY",
+ "()F",
+ &g_android_view_MotionEvent_getYF);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id);
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getPressureF(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getPressureF(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj);
+static jfloat Java_MotionEvent_getPressureF(JNIEnv* env, const base::android::JavaRef<jobject>& obj)
+ {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getPressure",
+ "()F",
+ &g_android_view_MotionEvent_getPressureF);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id);
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getSizeF(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getSizeF(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj);
+static jfloat Java_MotionEvent_getSizeF(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getSize",
+ "()F",
+ &g_android_view_MotionEvent_getSizeF);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id);
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getTouchMajorF(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getTouchMajorF(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj);
+static jfloat Java_MotionEvent_getTouchMajorF(JNIEnv* env, const base::android::JavaRef<jobject>&
+ obj) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getTouchMajor",
+ "()F",
+ &g_android_view_MotionEvent_getTouchMajorF);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id);
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getTouchMinorF(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getTouchMinorF(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj);
+static jfloat Java_MotionEvent_getTouchMinorF(JNIEnv* env, const base::android::JavaRef<jobject>&
+ obj) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getTouchMinor",
+ "()F",
+ &g_android_view_MotionEvent_getTouchMinorF);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id);
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getToolMajorF(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getToolMajorF(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj);
+static jfloat Java_MotionEvent_getToolMajorF(JNIEnv* env, const base::android::JavaRef<jobject>&
+ obj) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getToolMajor",
+ "()F",
+ &g_android_view_MotionEvent_getToolMajorF);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id);
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getToolMinorF(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getToolMinorF(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj);
+static jfloat Java_MotionEvent_getToolMinorF(JNIEnv* env, const base::android::JavaRef<jobject>&
+ obj) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getToolMinor",
+ "()F",
+ &g_android_view_MotionEvent_getToolMinorF);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id);
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getOrientationF(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getOrientationF(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj);
+static jfloat Java_MotionEvent_getOrientationF(JNIEnv* env, const base::android::JavaRef<jobject>&
+ obj) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getOrientation",
+ "()F",
+ &g_android_view_MotionEvent_getOrientationF);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id);
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getAxisValueF_I(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getAxisValueF_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
+static jfloat Java_MotionEvent_getAxisValueF_I(JNIEnv* env, const base::android::JavaRef<jobject>&
+ obj, JniIntWrapper p0) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getAxisValue",
+ "(I)F",
+ &g_android_view_MotionEvent_getAxisValueF_I);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0));
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getPointerCount(nullptr);
+[[maybe_unused]] static jint Java_MotionEvent_getPointerCount(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj);
+static jint Java_MotionEvent_getPointerCount(JNIEnv* env, const base::android::JavaRef<jobject>&
+ obj) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getPointerCount",
+ "()I",
+ &g_android_view_MotionEvent_getPointerCount);
+
+ jint ret =
+ env->CallIntMethod(obj.obj(),
+ call_context.base.method_id);
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getPointerId(nullptr);
+[[maybe_unused]] static jint Java_MotionEvent_getPointerId(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
+static jint Java_MotionEvent_getPointerId(JNIEnv* env, const base::android::JavaRef<jobject>& obj,
+ JniIntWrapper p0) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getPointerId",
+ "(I)I",
+ &g_android_view_MotionEvent_getPointerId);
+
+ jint ret =
+ env->CallIntMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0));
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getToolType(nullptr);
+[[maybe_unused]] static jint Java_MotionEvent_getToolType(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
+static jint Java_MotionEvent_getToolType(JNIEnv* env, const base::android::JavaRef<jobject>& obj,
+ JniIntWrapper p0) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getToolType",
+ "(I)I",
+ &g_android_view_MotionEvent_getToolType);
+
+ jint ret =
+ env->CallIntMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0));
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_findPointerIndex(nullptr);
+[[maybe_unused]] static jint Java_MotionEvent_findPointerIndex(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
+static jint Java_MotionEvent_findPointerIndex(JNIEnv* env, const base::android::JavaRef<jobject>&
+ obj, JniIntWrapper p0) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "findPointerIndex",
+ "(I)I",
+ &g_android_view_MotionEvent_findPointerIndex);
+
+ jint ret =
+ env->CallIntMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0));
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getXF_I(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getXF_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
+static jfloat Java_MotionEvent_getXF_I(JNIEnv* env, const base::android::JavaRef<jobject>& obj,
+ JniIntWrapper p0) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getX",
+ "(I)F",
+ &g_android_view_MotionEvent_getXF_I);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0));
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getYF_I(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getYF_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
+static jfloat Java_MotionEvent_getYF_I(JNIEnv* env, const base::android::JavaRef<jobject>& obj,
+ JniIntWrapper p0) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getY",
+ "(I)F",
+ &g_android_view_MotionEvent_getYF_I);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0));
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getPressureF_I(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getPressureF_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
+static jfloat Java_MotionEvent_getPressureF_I(JNIEnv* env, const base::android::JavaRef<jobject>&
+ obj, JniIntWrapper p0) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getPressure",
+ "(I)F",
+ &g_android_view_MotionEvent_getPressureF_I);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0));
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getSizeF_I(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getSizeF_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
+static jfloat Java_MotionEvent_getSizeF_I(JNIEnv* env, const base::android::JavaRef<jobject>& obj,
+ JniIntWrapper p0) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getSize",
+ "(I)F",
+ &g_android_view_MotionEvent_getSizeF_I);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0));
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getTouchMajorF_I(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getTouchMajorF_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
+static jfloat Java_MotionEvent_getTouchMajorF_I(JNIEnv* env, const base::android::JavaRef<jobject>&
+ obj, JniIntWrapper p0) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getTouchMajor",
+ "(I)F",
+ &g_android_view_MotionEvent_getTouchMajorF_I);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0));
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getTouchMinorF_I(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getTouchMinorF_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
+static jfloat Java_MotionEvent_getTouchMinorF_I(JNIEnv* env, const base::android::JavaRef<jobject>&
+ obj, JniIntWrapper p0) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getTouchMinor",
+ "(I)F",
+ &g_android_view_MotionEvent_getTouchMinorF_I);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0));
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getToolMajorF_I(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getToolMajorF_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
+static jfloat Java_MotionEvent_getToolMajorF_I(JNIEnv* env, const base::android::JavaRef<jobject>&
+ obj, JniIntWrapper p0) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getToolMajor",
+ "(I)F",
+ &g_android_view_MotionEvent_getToolMajorF_I);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0));
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getToolMinorF_I(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getToolMinorF_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
+static jfloat Java_MotionEvent_getToolMinorF_I(JNIEnv* env, const base::android::JavaRef<jobject>&
+ obj, JniIntWrapper p0) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getToolMinor",
+ "(I)F",
+ &g_android_view_MotionEvent_getToolMinorF_I);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0));
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getOrientationF_I(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getOrientationF_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
+static jfloat Java_MotionEvent_getOrientationF_I(JNIEnv* env, const base::android::JavaRef<jobject>&
+ obj, JniIntWrapper p0) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getOrientation",
+ "(I)F",
+ &g_android_view_MotionEvent_getOrientationF_I);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0));
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getAxisValueF_I_I(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getAxisValueF_I_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
+ JniIntWrapper p1);
+static jfloat Java_MotionEvent_getAxisValueF_I_I(JNIEnv* env, const base::android::JavaRef<jobject>&
+ obj, JniIntWrapper p0,
+ JniIntWrapper p1) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getAxisValue",
+ "(II)F",
+ &g_android_view_MotionEvent_getAxisValueF_I_I);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0), as_jint(p1));
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getPointerCoords(nullptr);
+[[maybe_unused]] static void Java_MotionEvent_getPointerCoords(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
+ const base::android::JavaRef<jobject>& p1);
+static void Java_MotionEvent_getPointerCoords(JNIEnv* env, const base::android::JavaRef<jobject>&
+ obj, JniIntWrapper p0,
+ const base::android::JavaRef<jobject>& p1) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env));
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getPointerCoords",
+ "(ILandroid/view/MotionEvent$PointerCoords;)V",
+ &g_android_view_MotionEvent_getPointerCoords);
+
+ env->CallVoidMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0), p1.obj());
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getPointerProperties(nullptr);
+[[maybe_unused]] static void Java_MotionEvent_getPointerProperties(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
+ const base::android::JavaRef<jobject>& p1);
+static void Java_MotionEvent_getPointerProperties(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
+ const base::android::JavaRef<jobject>& p1) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env));
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getPointerProperties",
+ "(ILandroid/view/MotionEvent$PointerProperties;)V",
+ &g_android_view_MotionEvent_getPointerProperties);
+
+ env->CallVoidMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0), p1.obj());
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getMetaState(nullptr);
+[[maybe_unused]] static jint Java_MotionEvent_getMetaState(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj);
+static jint Java_MotionEvent_getMetaState(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getMetaState",
+ "()I",
+ &g_android_view_MotionEvent_getMetaState);
+
+ jint ret =
+ env->CallIntMethod(obj.obj(),
+ call_context.base.method_id);
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getButtonState(nullptr);
+[[maybe_unused]] static jint Java_MotionEvent_getButtonState(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj);
+static jint Java_MotionEvent_getButtonState(JNIEnv* env, const base::android::JavaRef<jobject>& obj)
+ {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getButtonState",
+ "()I",
+ &g_android_view_MotionEvent_getButtonState);
+
+ jint ret =
+ env->CallIntMethod(obj.obj(),
+ call_context.base.method_id);
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getRawX(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getRawX(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj);
+static jfloat Java_MotionEvent_getRawX(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getRawX",
+ "()F",
+ &g_android_view_MotionEvent_getRawX);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id);
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getRawY(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getRawY(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj);
+static jfloat Java_MotionEvent_getRawY(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getRawY",
+ "()F",
+ &g_android_view_MotionEvent_getRawY);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id);
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getXPrecision(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getXPrecision(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj);
+static jfloat Java_MotionEvent_getXPrecision(JNIEnv* env, const base::android::JavaRef<jobject>&
+ obj) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getXPrecision",
+ "()F",
+ &g_android_view_MotionEvent_getXPrecision);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id);
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getYPrecision(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getYPrecision(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj);
+static jfloat Java_MotionEvent_getYPrecision(JNIEnv* env, const base::android::JavaRef<jobject>&
+ obj) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getYPrecision",
+ "()F",
+ &g_android_view_MotionEvent_getYPrecision);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id);
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getHistorySize(nullptr);
+[[maybe_unused]] static jint Java_MotionEvent_getHistorySize(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj);
+static jint Java_MotionEvent_getHistorySize(JNIEnv* env, const base::android::JavaRef<jobject>& obj)
+ {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getHistorySize",
+ "()I",
+ &g_android_view_MotionEvent_getHistorySize);
+
+ jint ret =
+ env->CallIntMethod(obj.obj(),
+ call_context.base.method_id);
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalEventTime(nullptr);
+[[maybe_unused]] static jlong Java_MotionEvent_getHistoricalEventTime(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
+static jlong Java_MotionEvent_getHistoricalEventTime(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getHistoricalEventTime",
+ "(I)J",
+ &g_android_view_MotionEvent_getHistoricalEventTime);
+
+ jlong ret =
+ env->CallLongMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0));
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalXF_I(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalXF_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
+static jfloat Java_MotionEvent_getHistoricalXF_I(JNIEnv* env, const base::android::JavaRef<jobject>&
+ obj, JniIntWrapper p0) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getHistoricalX",
+ "(I)F",
+ &g_android_view_MotionEvent_getHistoricalXF_I);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0));
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalYF_I(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalYF_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
+static jfloat Java_MotionEvent_getHistoricalYF_I(JNIEnv* env, const base::android::JavaRef<jobject>&
+ obj, JniIntWrapper p0) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getHistoricalY",
+ "(I)F",
+ &g_android_view_MotionEvent_getHistoricalYF_I);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0));
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalPressureF_I(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalPressureF_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
+static jfloat Java_MotionEvent_getHistoricalPressureF_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getHistoricalPressure",
+ "(I)F",
+ &g_android_view_MotionEvent_getHistoricalPressureF_I);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0));
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalSizeF_I(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalSizeF_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
+static jfloat Java_MotionEvent_getHistoricalSizeF_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getHistoricalSize",
+ "(I)F",
+ &g_android_view_MotionEvent_getHistoricalSizeF_I);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0));
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalTouchMajorF_I(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalTouchMajorF_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
+static jfloat Java_MotionEvent_getHistoricalTouchMajorF_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getHistoricalTouchMajor",
+ "(I)F",
+ &g_android_view_MotionEvent_getHistoricalTouchMajorF_I);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0));
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalTouchMinorF_I(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalTouchMinorF_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
+static jfloat Java_MotionEvent_getHistoricalTouchMinorF_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getHistoricalTouchMinor",
+ "(I)F",
+ &g_android_view_MotionEvent_getHistoricalTouchMinorF_I);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0));
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalToolMajorF_I(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalToolMajorF_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
+static jfloat Java_MotionEvent_getHistoricalToolMajorF_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getHistoricalToolMajor",
+ "(I)F",
+ &g_android_view_MotionEvent_getHistoricalToolMajorF_I);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0));
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalToolMinorF_I(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalToolMinorF_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
+static jfloat Java_MotionEvent_getHistoricalToolMinorF_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getHistoricalToolMinor",
+ "(I)F",
+ &g_android_view_MotionEvent_getHistoricalToolMinorF_I);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0));
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalOrientationF_I(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalOrientationF_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
+static jfloat Java_MotionEvent_getHistoricalOrientationF_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getHistoricalOrientation",
+ "(I)F",
+ &g_android_view_MotionEvent_getHistoricalOrientationF_I);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0));
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalAxisValueF_I_I(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalAxisValueF_I_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
+ JniIntWrapper p1);
+static jfloat Java_MotionEvent_getHistoricalAxisValueF_I_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
+ JniIntWrapper p1) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getHistoricalAxisValue",
+ "(II)F",
+ &g_android_view_MotionEvent_getHistoricalAxisValueF_I_I);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0), as_jint(p1));
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalXF_I_I(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalXF_I_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
+ JniIntWrapper p1);
+static jfloat Java_MotionEvent_getHistoricalXF_I_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
+ JniIntWrapper p1) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getHistoricalX",
+ "(II)F",
+ &g_android_view_MotionEvent_getHistoricalXF_I_I);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0), as_jint(p1));
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalYF_I_I(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalYF_I_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
+ JniIntWrapper p1);
+static jfloat Java_MotionEvent_getHistoricalYF_I_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
+ JniIntWrapper p1) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getHistoricalY",
+ "(II)F",
+ &g_android_view_MotionEvent_getHistoricalYF_I_I);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0), as_jint(p1));
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalPressureF_I_I(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalPressureF_I_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
+ JniIntWrapper p1);
+static jfloat Java_MotionEvent_getHistoricalPressureF_I_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
+ JniIntWrapper p1) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getHistoricalPressure",
+ "(II)F",
+ &g_android_view_MotionEvent_getHistoricalPressureF_I_I);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0), as_jint(p1));
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalSizeF_I_I(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalSizeF_I_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
+ JniIntWrapper p1);
+static jfloat Java_MotionEvent_getHistoricalSizeF_I_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
+ JniIntWrapper p1) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getHistoricalSize",
+ "(II)F",
+ &g_android_view_MotionEvent_getHistoricalSizeF_I_I);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0), as_jint(p1));
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalTouchMajorF_I_I(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalTouchMajorF_I_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
+ JniIntWrapper p1);
+static jfloat Java_MotionEvent_getHistoricalTouchMajorF_I_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
+ JniIntWrapper p1) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getHistoricalTouchMajor",
+ "(II)F",
+ &g_android_view_MotionEvent_getHistoricalTouchMajorF_I_I);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0), as_jint(p1));
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalTouchMinorF_I_I(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalTouchMinorF_I_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
+ JniIntWrapper p1);
+static jfloat Java_MotionEvent_getHistoricalTouchMinorF_I_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
+ JniIntWrapper p1) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getHistoricalTouchMinor",
+ "(II)F",
+ &g_android_view_MotionEvent_getHistoricalTouchMinorF_I_I);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0), as_jint(p1));
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalToolMajorF_I_I(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalToolMajorF_I_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
+ JniIntWrapper p1);
+static jfloat Java_MotionEvent_getHistoricalToolMajorF_I_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
+ JniIntWrapper p1) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getHistoricalToolMajor",
+ "(II)F",
+ &g_android_view_MotionEvent_getHistoricalToolMajorF_I_I);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0), as_jint(p1));
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalToolMinorF_I_I(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalToolMinorF_I_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
+ JniIntWrapper p1);
+static jfloat Java_MotionEvent_getHistoricalToolMinorF_I_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
+ JniIntWrapper p1) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getHistoricalToolMinor",
+ "(II)F",
+ &g_android_view_MotionEvent_getHistoricalToolMinorF_I_I);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0), as_jint(p1));
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalOrientationF_I_I(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalOrientationF_I_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
+ JniIntWrapper p1);
+static jfloat Java_MotionEvent_getHistoricalOrientationF_I_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
+ JniIntWrapper p1) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getHistoricalOrientation",
+ "(II)F",
+ &g_android_view_MotionEvent_getHistoricalOrientationF_I_I);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0), as_jint(p1));
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalAxisValueF_I_I_I(nullptr);
+[[maybe_unused]] static jfloat Java_MotionEvent_getHistoricalAxisValueF_I_I_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
+ JniIntWrapper p1,
+ JniIntWrapper p2);
+static jfloat Java_MotionEvent_getHistoricalAxisValueF_I_I_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
+ JniIntWrapper p1,
+ JniIntWrapper p2) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getHistoricalAxisValue",
+ "(III)F",
+ &g_android_view_MotionEvent_getHistoricalAxisValueF_I_I_I);
+
+ jfloat ret =
+ env->CallFloatMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0), as_jint(p1), as_jint(p2));
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getHistoricalPointerCoords(nullptr);
+[[maybe_unused]] static void Java_MotionEvent_getHistoricalPointerCoords(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
+ JniIntWrapper p1,
+ const base::android::JavaRef<jobject>& p2);
+static void Java_MotionEvent_getHistoricalPointerCoords(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0,
+ JniIntWrapper p1,
+ const base::android::JavaRef<jobject>& p2) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env));
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getHistoricalPointerCoords",
+ "(IILandroid/view/MotionEvent$PointerCoords;)V",
+ &g_android_view_MotionEvent_getHistoricalPointerCoords);
+
+ env->CallVoidMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0), as_jint(p1), p2.obj());
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_getEdgeFlags(nullptr);
+[[maybe_unused]] static jint Java_MotionEvent_getEdgeFlags(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj);
+static jint Java_MotionEvent_getEdgeFlags(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getEdgeFlags",
+ "()I",
+ &g_android_view_MotionEvent_getEdgeFlags);
+
+ jint ret =
+ env->CallIntMethod(obj.obj(),
+ call_context.base.method_id);
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_setEdgeFlags(nullptr);
+[[maybe_unused]] static void Java_MotionEvent_setEdgeFlags(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
+static void Java_MotionEvent_setEdgeFlags(JNIEnv* env, const base::android::JavaRef<jobject>& obj,
+ JniIntWrapper p0) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env));
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "setEdgeFlags",
+ "(I)V",
+ &g_android_view_MotionEvent_setEdgeFlags);
+
+ env->CallVoidMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0));
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_setAction(nullptr);
+[[maybe_unused]] static void Java_MotionEvent_setAction(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
+static void Java_MotionEvent_setAction(JNIEnv* env, const base::android::JavaRef<jobject>& obj,
+ JniIntWrapper p0) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env));
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "setAction",
+ "(I)V",
+ &g_android_view_MotionEvent_setAction);
+
+ env->CallVoidMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0));
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_offsetLocation(nullptr);
+[[maybe_unused]] static void Java_MotionEvent_offsetLocation(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, jfloat p0,
+ jfloat p1);
+static void Java_MotionEvent_offsetLocation(JNIEnv* env, const base::android::JavaRef<jobject>& obj,
+ jfloat p0,
+ jfloat p1) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env));
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "offsetLocation",
+ "(FF)V",
+ &g_android_view_MotionEvent_offsetLocation);
+
+ env->CallVoidMethod(obj.obj(),
+ call_context.base.method_id, p0, p1);
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_setLocation(nullptr);
+[[maybe_unused]] static void Java_MotionEvent_setLocation(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, jfloat p0,
+ jfloat p1);
+static void Java_MotionEvent_setLocation(JNIEnv* env, const base::android::JavaRef<jobject>& obj,
+ jfloat p0,
+ jfloat p1) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env));
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "setLocation",
+ "(FF)V",
+ &g_android_view_MotionEvent_setLocation);
+
+ env->CallVoidMethod(obj.obj(),
+ call_context.base.method_id, p0, p1);
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_transform(nullptr);
+[[maybe_unused]] static void Java_MotionEvent_transform(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, const base::android::JavaRef<jobject>& p0);
+static void Java_MotionEvent_transform(JNIEnv* env, const base::android::JavaRef<jobject>& obj,
+ const base::android::JavaRef<jobject>& p0) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env));
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "transform",
+ "(Landroid/graphics/Matrix;)V",
+ &g_android_view_MotionEvent_transform);
+
+ env->CallVoidMethod(obj.obj(),
+ call_context.base.method_id, p0.obj());
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_addBatchV_J_F_F_F_F_I(nullptr);
+[[maybe_unused]] static void Java_MotionEvent_addBatchV_J_F_F_F_F_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, jlong p0,
+ jfloat p1,
+ jfloat p2,
+ jfloat p3,
+ jfloat p4,
+ JniIntWrapper p5);
+static void Java_MotionEvent_addBatchV_J_F_F_F_F_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, jlong p0,
+ jfloat p1,
+ jfloat p2,
+ jfloat p3,
+ jfloat p4,
+ JniIntWrapper p5) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env));
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "addBatch",
+ "(JFFFFI)V",
+ &g_android_view_MotionEvent_addBatchV_J_F_F_F_F_I);
+
+ env->CallVoidMethod(obj.obj(),
+ call_context.base.method_id, p0, p1, p2, p3, p4, as_jint(p5));
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_addBatchV_J_LAVMEPC_I(nullptr);
+[[maybe_unused]] static void Java_MotionEvent_addBatchV_J_LAVMEPC_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, jlong p0,
+ const base::android::JavaRef<jobjectArray>& p1,
+ JniIntWrapper p2);
+static void Java_MotionEvent_addBatchV_J_LAVMEPC_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, jlong p0,
+ const base::android::JavaRef<jobjectArray>& p1,
+ JniIntWrapper p2) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env));
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "addBatch",
+ "(J[Landroid/view/MotionEvent$PointerCoords;I)V",
+ &g_android_view_MotionEvent_addBatchV_J_LAVMEPC_I);
+
+ env->CallVoidMethod(obj.obj(),
+ call_context.base.method_id, p0, p1.obj(), as_jint(p2));
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_toString(nullptr);
+[[maybe_unused]] static base::android::ScopedJavaLocalRef<jstring> Java_MotionEvent_toString(JNIEnv*
+ env, const base::android::JavaRef<jobject>& obj);
+static base::android::ScopedJavaLocalRef<jstring> Java_MotionEvent_toString(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "toString",
+ "()Ljava/lang/String;",
+ &g_android_view_MotionEvent_toString);
+
+ jstring ret =
+ static_cast<jstring>(env->CallObjectMethod(obj.obj(),
+ call_context.base.method_id));
+ return base::android::ScopedJavaLocalRef<jstring>(env, ret);
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_actionToString(nullptr);
+[[maybe_unused]] static base::android::ScopedJavaLocalRef<jstring>
+ Java_MotionEvent_actionToString(JNIEnv* env, JniIntWrapper p0);
+static base::android::ScopedJavaLocalRef<jstring> Java_MotionEvent_actionToString(JNIEnv* env,
+ JniIntWrapper p0) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, clazz,
+ android_view_MotionEvent_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_STATIC>(
+ env,
+ clazz,
+ "actionToString",
+ "(I)Ljava/lang/String;",
+ &g_android_view_MotionEvent_actionToString);
+
+ jstring ret =
+ static_cast<jstring>(env->CallStaticObjectMethod(clazz,
+ call_context.base.method_id, as_jint(p0)));
+ return base::android::ScopedJavaLocalRef<jstring>(env, ret);
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_axisToString(nullptr);
+[[maybe_unused]] static base::android::ScopedJavaLocalRef<jstring>
+ Java_MotionEvent_axisToString(JNIEnv* env, JniIntWrapper p0);
+static base::android::ScopedJavaLocalRef<jstring> Java_MotionEvent_axisToString(JNIEnv* env,
+ JniIntWrapper p0) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, clazz,
+ android_view_MotionEvent_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_STATIC>(
+ env,
+ clazz,
+ "axisToString",
+ "(I)Ljava/lang/String;",
+ &g_android_view_MotionEvent_axisToString);
+
+ jstring ret =
+ static_cast<jstring>(env->CallStaticObjectMethod(clazz,
+ call_context.base.method_id, as_jint(p0)));
+ return base::android::ScopedJavaLocalRef<jstring>(env, ret);
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_axisFromString(nullptr);
+[[maybe_unused]] static jint Java_MotionEvent_axisFromString(JNIEnv* env, const
+ base::android::JavaRef<jstring>& p0);
+static jint Java_MotionEvent_axisFromString(JNIEnv* env, const base::android::JavaRef<jstring>& p0)
+ {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, clazz,
+ android_view_MotionEvent_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_STATIC>(
+ env,
+ clazz,
+ "axisFromString",
+ "(Ljava/lang/String;)I",
+ &g_android_view_MotionEvent_axisFromString);
+
+ jint ret =
+ env->CallStaticIntMethod(clazz,
+ call_context.base.method_id, p0.obj());
+ return ret;
+}
+
+static std::atomic<jmethodID> g_android_view_MotionEvent_writeToParcel(nullptr);
+[[maybe_unused]] static void Java_MotionEvent_writeToParcel(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, const base::android::JavaRef<jobject>& p0,
+ JniIntWrapper p1);
+static void Java_MotionEvent_writeToParcel(JNIEnv* env, const base::android::JavaRef<jobject>& obj,
+ const base::android::JavaRef<jobject>& p0,
+ JniIntWrapper p1) {
+ jclass clazz = android_view_MotionEvent_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ android_view_MotionEvent_clazz(env));
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "writeToParcel",
+ "(Landroid/os/Parcel;I)V",
+ &g_android_view_MotionEvent_writeToParcel);
+
+ env->CallVoidMethod(obj.obj(),
+ call_context.base.method_id, p0.obj(), as_jint(p1));
+}
+
+} // namespace JNI_MotionEvent
+
+#endif // android_view_MotionEvent_JNI
diff --git a/chromium/base/android/jni_generator/golden/testFromJavaP.golden b/chromium/base/android/jni_generator/golden/testFromJavaP.golden
new file mode 100644
index 00000000000..aba554d2429
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/testFromJavaP.golden
@@ -0,0 +1,276 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_generator.py
+// For
+// java/io/InputStream
+
+#ifndef java_io_InputStream_JNI
+#define java_io_InputStream_JNI
+
+#include <jni.h>
+
+#include "base/android/jni_generator/jni_generator_helper.h"
+
+
+// Step 1: Forward declarations.
+
+JNI_REGISTRATION_EXPORT extern const char kClassPath_java_io_InputStream[];
+const char kClassPath_java_io_InputStream[] = "java/io/InputStream";
+// Leaking this jclass as we cannot use LazyInstance from some threads.
+JNI_REGISTRATION_EXPORT std::atomic<jclass> g_java_io_InputStream_clazz(nullptr);
+#ifndef java_io_InputStream_clazz_defined
+#define java_io_InputStream_clazz_defined
+inline jclass java_io_InputStream_clazz(JNIEnv* env) {
+ return base::android::LazyGetClass(env, kClassPath_java_io_InputStream,
+ &g_java_io_InputStream_clazz);
+}
+#endif
+
+
+// Step 2: Constants (optional).
+
+
+// Step 3: Method stubs.
+namespace JNI_InputStream {
+
+
+static std::atomic<jmethodID> g_java_io_InputStream_available(nullptr);
+[[maybe_unused]] static jint Java_InputStream_available(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj);
+static jint Java_InputStream_available(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
+ jclass clazz = java_io_InputStream_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ java_io_InputStream_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "available",
+ "()I",
+ &g_java_io_InputStream_available);
+
+ jint ret =
+ env->CallIntMethod(obj.obj(),
+ call_context.base.method_id);
+ return ret;
+}
+
+static std::atomic<jmethodID> g_java_io_InputStream_close(nullptr);
+[[maybe_unused]] static void Java_InputStream_close(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj);
+static void Java_InputStream_close(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
+ jclass clazz = java_io_InputStream_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ java_io_InputStream_clazz(env));
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "close",
+ "()V",
+ &g_java_io_InputStream_close);
+
+ env->CallVoidMethod(obj.obj(),
+ call_context.base.method_id);
+}
+
+static std::atomic<jmethodID> g_java_io_InputStream_mark(nullptr);
+[[maybe_unused]] static void Java_InputStream_mark(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper p0);
+static void Java_InputStream_mark(JNIEnv* env, const base::android::JavaRef<jobject>& obj,
+ JniIntWrapper p0) {
+ jclass clazz = java_io_InputStream_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ java_io_InputStream_clazz(env));
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "mark",
+ "(I)V",
+ &g_java_io_InputStream_mark);
+
+ env->CallVoidMethod(obj.obj(),
+ call_context.base.method_id, as_jint(p0));
+}
+
+static std::atomic<jmethodID> g_java_io_InputStream_markSupported(nullptr);
+[[maybe_unused]] static jboolean Java_InputStream_markSupported(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj);
+static jboolean Java_InputStream_markSupported(JNIEnv* env, const base::android::JavaRef<jobject>&
+ obj) {
+ jclass clazz = java_io_InputStream_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ java_io_InputStream_clazz(env), false);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "markSupported",
+ "()Z",
+ &g_java_io_InputStream_markSupported);
+
+ jboolean ret =
+ env->CallBooleanMethod(obj.obj(),
+ call_context.base.method_id);
+ return ret;
+}
+
+static std::atomic<jmethodID> g_java_io_InputStream_readI(nullptr);
+[[maybe_unused]] static jint Java_InputStream_readI(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj);
+static jint Java_InputStream_readI(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
+ jclass clazz = java_io_InputStream_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ java_io_InputStream_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "read",
+ "()I",
+ &g_java_io_InputStream_readI);
+
+ jint ret =
+ env->CallIntMethod(obj.obj(),
+ call_context.base.method_id);
+ return ret;
+}
+
+static std::atomic<jmethodID> g_java_io_InputStream_readI_AB(nullptr);
+[[maybe_unused]] static jint Java_InputStream_readI_AB(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, const base::android::JavaRef<jbyteArray>& p0);
+static jint Java_InputStream_readI_AB(JNIEnv* env, const base::android::JavaRef<jobject>& obj, const
+ base::android::JavaRef<jbyteArray>& p0) {
+ jclass clazz = java_io_InputStream_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ java_io_InputStream_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "read",
+ "([B)I",
+ &g_java_io_InputStream_readI_AB);
+
+ jint ret =
+ env->CallIntMethod(obj.obj(),
+ call_context.base.method_id, p0.obj());
+ return ret;
+}
+
+static std::atomic<jmethodID> g_java_io_InputStream_readI_AB_I_I(nullptr);
+[[maybe_unused]] static jint Java_InputStream_readI_AB_I_I(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, const base::android::JavaRef<jbyteArray>& p0,
+ JniIntWrapper p1,
+ JniIntWrapper p2);
+static jint Java_InputStream_readI_AB_I_I(JNIEnv* env, const base::android::JavaRef<jobject>& obj,
+ const base::android::JavaRef<jbyteArray>& p0,
+ JniIntWrapper p1,
+ JniIntWrapper p2) {
+ jclass clazz = java_io_InputStream_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ java_io_InputStream_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "read",
+ "([BII)I",
+ &g_java_io_InputStream_readI_AB_I_I);
+
+ jint ret =
+ env->CallIntMethod(obj.obj(),
+ call_context.base.method_id, p0.obj(), as_jint(p1), as_jint(p2));
+ return ret;
+}
+
+static std::atomic<jmethodID> g_java_io_InputStream_reset(nullptr);
+[[maybe_unused]] static void Java_InputStream_reset(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj);
+static void Java_InputStream_reset(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
+ jclass clazz = java_io_InputStream_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ java_io_InputStream_clazz(env));
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "reset",
+ "()V",
+ &g_java_io_InputStream_reset);
+
+ env->CallVoidMethod(obj.obj(),
+ call_context.base.method_id);
+}
+
+static std::atomic<jmethodID> g_java_io_InputStream_skip(nullptr);
+[[maybe_unused]] static jlong Java_InputStream_skip(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, jlong p0);
+static jlong Java_InputStream_skip(JNIEnv* env, const base::android::JavaRef<jobject>& obj, jlong
+ p0) {
+ jclass clazz = java_io_InputStream_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ java_io_InputStream_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "skip",
+ "(J)J",
+ &g_java_io_InputStream_skip);
+
+ jlong ret =
+ env->CallLongMethod(obj.obj(),
+ call_context.base.method_id, p0);
+ return ret;
+}
+
+static std::atomic<jmethodID> g_java_io_InputStream_Constructor(nullptr);
+[[maybe_unused]] static base::android::ScopedJavaLocalRef<jobject>
+ Java_InputStream_Constructor(JNIEnv* env);
+static base::android::ScopedJavaLocalRef<jobject> Java_InputStream_Constructor(JNIEnv* env) {
+ jclass clazz = java_io_InputStream_clazz(env);
+ CHECK_CLAZZ(env, clazz,
+ java_io_InputStream_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "<init>",
+ "()V",
+ &g_java_io_InputStream_Constructor);
+
+ jobject ret =
+ env->NewObject(clazz,
+ call_context.base.method_id);
+ return base::android::ScopedJavaLocalRef<jobject>(env, ret);
+}
+
+} // namespace JNI_InputStream
+
+#endif // java_io_InputStream_JNI
diff --git a/chromium/base/android/jni_generator/golden/testFromJavaPGenerics.golden b/chromium/base/android/jni_generator/golden/testFromJavaPGenerics.golden
new file mode 100644
index 00000000000..c98bc40ba3e
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/testFromJavaPGenerics.golden
@@ -0,0 +1,131 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_generator.py
+// For
+// java/util/HashSet
+
+#ifndef java_util_HashSet_JNI
+#define java_util_HashSet_JNI
+
+#include <jni.h>
+
+#include "base/android/jni_generator/jni_generator_helper.h"
+
+
+// Step 1: Forward declarations.
+
+JNI_REGISTRATION_EXPORT extern const char kClassPath_java_util_HashSet[];
+const char kClassPath_java_util_HashSet[] = "java/util/HashSet";
+// Leaking this jclass as we cannot use LazyInstance from some threads.
+JNI_REGISTRATION_EXPORT std::atomic<jclass> g_java_util_HashSet_clazz(nullptr);
+#ifndef java_util_HashSet_clazz_defined
+#define java_util_HashSet_clazz_defined
+inline jclass java_util_HashSet_clazz(JNIEnv* env) {
+ return base::android::LazyGetClass(env, kClassPath_java_util_HashSet, &g_java_util_HashSet_clazz);
+}
+#endif
+
+
+// Step 2: Constants (optional).
+
+
+// Step 3: Method stubs.
+namespace JNI_HashSet {
+
+
+static std::atomic<jmethodID> g_java_util_HashSet_dummy(nullptr);
+[[maybe_unused]] static void Java_HashSet_dummy(JNIEnv* env, const base::android::JavaRef<jobject>&
+ obj);
+static void Java_HashSet_dummy(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
+ jclass clazz = java_util_HashSet_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ java_util_HashSet_clazz(env));
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "dummy",
+ "()V",
+ &g_java_util_HashSet_dummy);
+
+ env->CallVoidMethod(obj.obj(),
+ call_context.base.method_id);
+}
+
+static std::atomic<jmethodID> g_java_util_HashSet_getClass(nullptr);
+[[maybe_unused]] static base::android::ScopedJavaLocalRef<jclass> Java_HashSet_getClass(JNIEnv* env,
+ const base::android::JavaRef<jobject>& obj);
+static base::android::ScopedJavaLocalRef<jclass> Java_HashSet_getClass(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj) {
+ jclass clazz = java_util_HashSet_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ java_util_HashSet_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "getClass",
+ "()Ljava/lang/Class<*>;",
+ &g_java_util_HashSet_getClass);
+
+ jclass ret =
+ static_cast<jclass>(env->CallObjectMethod(obj.obj(),
+ call_context.base.method_id));
+ return base::android::ScopedJavaLocalRef<jclass>(env, ret);
+}
+
+static std::atomic<jmethodID> g_java_util_HashSet_overloadWithVarargsV_LJLS(nullptr);
+[[maybe_unused]] static void Java_HashSet_overloadWithVarargsV_LJLS(JNIEnv* env, const
+ base::android::JavaRef<jobjectArray>& p0);
+static void Java_HashSet_overloadWithVarargsV_LJLS(JNIEnv* env, const
+ base::android::JavaRef<jobjectArray>& p0) {
+ jclass clazz = java_util_HashSet_clazz(env);
+ CHECK_CLAZZ(env, clazz,
+ java_util_HashSet_clazz(env));
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_STATIC>(
+ env,
+ clazz,
+ "overloadWithVarargs",
+ "([Ljava/lang/String;)V",
+ &g_java_util_HashSet_overloadWithVarargsV_LJLS);
+
+ env->CallStaticVoidMethod(clazz,
+ call_context.base.method_id, p0.obj());
+}
+
+static std::atomic<jmethodID> g_java_util_HashSet_overloadWithVarargsV_LAITDC(nullptr);
+[[maybe_unused]] static void Java_HashSet_overloadWithVarargsV_LAITDC(JNIEnv* env, const
+ base::android::JavaRef<jobjectArray>& p0);
+static void Java_HashSet_overloadWithVarargsV_LAITDC(JNIEnv* env, const
+ base::android::JavaRef<jobjectArray>& p0) {
+ jclass clazz = java_util_HashSet_clazz(env);
+ CHECK_CLAZZ(env, clazz,
+ java_util_HashSet_clazz(env));
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_STATIC>(
+ env,
+ clazz,
+ "overloadWithVarargs",
+ "([Landroid/icu/text/DisplayContext;)V",
+ &g_java_util_HashSet_overloadWithVarargsV_LAITDC);
+
+ env->CallStaticVoidMethod(clazz,
+ call_context.base.method_id, p0.obj());
+}
+
+} // namespace JNI_HashSet
+
+#endif // java_util_HashSet_JNI
diff --git a/chromium/base/android/jni_generator/golden/testGenJniFlagsDisabled.golden b/chromium/base/android/jni_generator/golden/testGenJniFlagsDisabled.golden
new file mode 100644
index 00000000000..efb1f72e07e
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/testGenJniFlagsDisabled.golden
@@ -0,0 +1,52 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.natives;
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_registration_generator.py
+// Please do not change its content.
+
+public class GEN_JNI {
+ public static final boolean TESTING_ENABLED = false;
+ public static final boolean REQUIRE_MOCK = false;
+
+
+ // Hashed name: Java_J_N_MygCV2jQ
+ public static native void org_chromium_example_jni_1generator_SampleForAnnotationProcessor_foo();
+ // Hashed name: Java_J_N_MHuqnmXT
+ public static native Object org_chromium_example_jni_1generator_SampleForAnnotationProcessor_bar(Object sample);
+ // Hashed name: Java_J_N_MM5Xkwyy
+ public static native String org_chromium_example_jni_1generator_SampleForAnnotationProcessor_revString(String stringToReverse);
+ // Hashed name: Java_J_N_MAC2QhR9
+ public static native String[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendToNative(String[] strs);
+ // Hashed name: Java_J_N_MGhRh4Nd
+ public static native Object[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendSamplesToNative(Object[] strs);
+ // Hashed name: Java_J_N_MW0aEs4h
+ public static native boolean org_chromium_example_jni_1generator_SampleForAnnotationProcessor_hasPhalange();
+ // Hashed name: Java_J_N_MlVFI4RX
+ public static native int[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testAllPrimitives(int zint, int[] ints, long zlong, long[] longs, short zshort, short[] shorts, char zchar, char[] chars, byte zbyte, byte[] bytes, double zdouble, double[] doubles, float zfloat, float[] floats, boolean zbool, boolean[] bools);
+ // Hashed name: Java_J_N_MqOnlud7
+ public static native void org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testSpecialTypes(Class clazz, Class[] classes, Throwable throwable, Throwable[] throwables, String string, String[] strings, Object tStruct, Object[] structs, Object obj, Object[] objects);
+ // Hashed name: Java_J_N_MuZc76Vt
+ public static native Throwable org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowable();
+ // Hashed name: Java_J_N_MAD53J7V
+ public static native Throwable[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowables();
+ // Hashed name: Java_J_N_M$ZgOi4g
+ public static native Class org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClass();
+ // Hashed name: Java_J_N_M$hL1577
+ public static native Class[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClasses();
+ // Hashed name: Java_J_N_M0k1OjBK
+ public static native String org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnString();
+ // Hashed name: Java_J_N_Mssfs54E
+ public static native String[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStrings();
+ // Hashed name: Java_J_N_MSzcel_H
+ public static native Object org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStruct();
+ // Hashed name: Java_J_N_MIBrQLK4
+ public static native Object[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStructs();
+ // Hashed name: Java_J_N_M$hPywjv
+ public static native Object org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObject();
+ // Hashed name: Java_J_N_MPpCU1l5
+ public static native Object[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObjects();
+}
diff --git a/chromium/base/android/jni_generator/golden/testGenJniFlagsMocksEnabled.golden b/chromium/base/android/jni_generator/golden/testGenJniFlagsMocksEnabled.golden
new file mode 100644
index 00000000000..385c302336c
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/testGenJniFlagsMocksEnabled.golden
@@ -0,0 +1,52 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.natives;
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_registration_generator.py
+// Please do not change its content.
+
+public class GEN_JNI {
+ public static final boolean TESTING_ENABLED = true;
+ public static final boolean REQUIRE_MOCK = false;
+
+
+ // Hashed name: Java_J_N_MygCV2jQ
+ public static native void org_chromium_example_jni_1generator_SampleForAnnotationProcessor_foo();
+ // Hashed name: Java_J_N_MHuqnmXT
+ public static native Object org_chromium_example_jni_1generator_SampleForAnnotationProcessor_bar(Object sample);
+ // Hashed name: Java_J_N_MM5Xkwyy
+ public static native String org_chromium_example_jni_1generator_SampleForAnnotationProcessor_revString(String stringToReverse);
+ // Hashed name: Java_J_N_MAC2QhR9
+ public static native String[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendToNative(String[] strs);
+ // Hashed name: Java_J_N_MGhRh4Nd
+ public static native Object[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendSamplesToNative(Object[] strs);
+ // Hashed name: Java_J_N_MW0aEs4h
+ public static native boolean org_chromium_example_jni_1generator_SampleForAnnotationProcessor_hasPhalange();
+ // Hashed name: Java_J_N_MlVFI4RX
+ public static native int[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testAllPrimitives(int zint, int[] ints, long zlong, long[] longs, short zshort, short[] shorts, char zchar, char[] chars, byte zbyte, byte[] bytes, double zdouble, double[] doubles, float zfloat, float[] floats, boolean zbool, boolean[] bools);
+ // Hashed name: Java_J_N_MqOnlud7
+ public static native void org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testSpecialTypes(Class clazz, Class[] classes, Throwable throwable, Throwable[] throwables, String string, String[] strings, Object tStruct, Object[] structs, Object obj, Object[] objects);
+ // Hashed name: Java_J_N_MuZc76Vt
+ public static native Throwable org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowable();
+ // Hashed name: Java_J_N_MAD53J7V
+ public static native Throwable[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowables();
+ // Hashed name: Java_J_N_M$ZgOi4g
+ public static native Class org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClass();
+ // Hashed name: Java_J_N_M$hL1577
+ public static native Class[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClasses();
+ // Hashed name: Java_J_N_M0k1OjBK
+ public static native String org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnString();
+ // Hashed name: Java_J_N_Mssfs54E
+ public static native String[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStrings();
+ // Hashed name: Java_J_N_MSzcel_H
+ public static native Object org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStruct();
+ // Hashed name: Java_J_N_MIBrQLK4
+ public static native Object[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStructs();
+ // Hashed name: Java_J_N_M$hPywjv
+ public static native Object org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObject();
+ // Hashed name: Java_J_N_MPpCU1l5
+ public static native Object[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObjects();
+}
diff --git a/chromium/base/android/jni_generator/golden/testGenJniFlagsMocksRequired.golden b/chromium/base/android/jni_generator/golden/testGenJniFlagsMocksRequired.golden
new file mode 100644
index 00000000000..468359a3fd7
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/testGenJniFlagsMocksRequired.golden
@@ -0,0 +1,52 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.natives;
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_registration_generator.py
+// Please do not change its content.
+
+public class GEN_JNI {
+ public static final boolean TESTING_ENABLED = true;
+ public static final boolean REQUIRE_MOCK = true;
+
+
+ // Hashed name: Java_J_N_MygCV2jQ
+ public static native void org_chromium_example_jni_1generator_SampleForAnnotationProcessor_foo();
+ // Hashed name: Java_J_N_MHuqnmXT
+ public static native Object org_chromium_example_jni_1generator_SampleForAnnotationProcessor_bar(Object sample);
+ // Hashed name: Java_J_N_MM5Xkwyy
+ public static native String org_chromium_example_jni_1generator_SampleForAnnotationProcessor_revString(String stringToReverse);
+ // Hashed name: Java_J_N_MAC2QhR9
+ public static native String[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendToNative(String[] strs);
+ // Hashed name: Java_J_N_MGhRh4Nd
+ public static native Object[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendSamplesToNative(Object[] strs);
+ // Hashed name: Java_J_N_MW0aEs4h
+ public static native boolean org_chromium_example_jni_1generator_SampleForAnnotationProcessor_hasPhalange();
+ // Hashed name: Java_J_N_MlVFI4RX
+ public static native int[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testAllPrimitives(int zint, int[] ints, long zlong, long[] longs, short zshort, short[] shorts, char zchar, char[] chars, byte zbyte, byte[] bytes, double zdouble, double[] doubles, float zfloat, float[] floats, boolean zbool, boolean[] bools);
+ // Hashed name: Java_J_N_MqOnlud7
+ public static native void org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testSpecialTypes(Class clazz, Class[] classes, Throwable throwable, Throwable[] throwables, String string, String[] strings, Object tStruct, Object[] structs, Object obj, Object[] objects);
+ // Hashed name: Java_J_N_MuZc76Vt
+ public static native Throwable org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowable();
+ // Hashed name: Java_J_N_MAD53J7V
+ public static native Throwable[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowables();
+ // Hashed name: Java_J_N_M$ZgOi4g
+ public static native Class org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClass();
+ // Hashed name: Java_J_N_M$hL1577
+ public static native Class[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClasses();
+ // Hashed name: Java_J_N_M0k1OjBK
+ public static native String org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnString();
+ // Hashed name: Java_J_N_Mssfs54E
+ public static native String[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStrings();
+ // Hashed name: Java_J_N_MSzcel_H
+ public static native Object org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStruct();
+ // Hashed name: Java_J_N_MIBrQLK4
+ public static native Object[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStructs();
+ // Hashed name: Java_J_N_M$hPywjv
+ public static native Object org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObject();
+ // Hashed name: Java_J_N_MPpCU1l5
+ public static native Object[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObjects();
+}
diff --git a/chromium/base/android/jni_generator/golden/testInnerClassNatives.golden b/chromium/base/android/jni_generator/golden/testInnerClassNatives.golden
new file mode 100644
index 00000000000..454f030bea1
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/testInnerClassNatives.golden
@@ -0,0 +1,60 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_generator.py
+// For
+// org/chromium/TestJni
+
+#ifndef org_chromium_TestJni_JNI
+#define org_chromium_TestJni_JNI
+
+#include <jni.h>
+
+#include "base/android/jni_generator/jni_generator_helper.h"
+
+
+// Step 1: Forward declarations.
+
+JNI_REGISTRATION_EXPORT extern const char kClassPath_org_chromium_TestJni[];
+const char kClassPath_org_chromium_TestJni[] = "org/chromium/TestJni";
+
+JNI_REGISTRATION_EXPORT extern const char kClassPath_org_chromium_TestJni_00024MyInnerClass[];
+const char kClassPath_org_chromium_TestJni_00024MyInnerClass[] =
+ "org/chromium/TestJni$MyInnerClass";
+// Leaking this jclass as we cannot use LazyInstance from some threads.
+JNI_REGISTRATION_EXPORT std::atomic<jclass> g_org_chromium_TestJni_clazz(nullptr);
+#ifndef org_chromium_TestJni_clazz_defined
+#define org_chromium_TestJni_clazz_defined
+inline jclass org_chromium_TestJni_clazz(JNIEnv* env) {
+ return base::android::LazyGetClass(env, kClassPath_org_chromium_TestJni,
+ &g_org_chromium_TestJni_clazz);
+}
+#endif
+// Leaking this jclass as we cannot use LazyInstance from some threads.
+JNI_REGISTRATION_EXPORT std::atomic<jclass> g_org_chromium_TestJni_00024MyInnerClass_clazz(nullptr);
+#ifndef org_chromium_TestJni_00024MyInnerClass_clazz_defined
+#define org_chromium_TestJni_00024MyInnerClass_clazz_defined
+inline jclass org_chromium_TestJni_00024MyInnerClass_clazz(JNIEnv* env) {
+ return base::android::LazyGetClass(env, kClassPath_org_chromium_TestJni_00024MyInnerClass,
+ &g_org_chromium_TestJni_00024MyInnerClass_clazz);
+}
+#endif
+
+
+// Step 2: Constants (optional).
+
+
+// Step 3: Method stubs.
+static jint JNI_MyInnerClass_Init(JNIEnv* env, const base::android::JavaParamRef<jobject>& jcaller);
+
+JNI_GENERATOR_EXPORT jint Java_org_chromium_TestJni_00024MyInnerClass_nativeInit(
+ JNIEnv* env,
+ jobject jcaller) {
+ return JNI_MyInnerClass_Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
+}
+
+
+#endif // org_chromium_TestJni_JNI
diff --git a/chromium/base/android/jni_generator/golden/testInnerClassNativesBothInnerAndOuter.golden b/chromium/base/android/jni_generator/golden/testInnerClassNativesBothInnerAndOuter.golden
new file mode 100644
index 00000000000..06195dac89f
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/testInnerClassNativesBothInnerAndOuter.golden
@@ -0,0 +1,70 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_generator.py
+// For
+// org/chromium/TestJni
+
+#ifndef org_chromium_TestJni_JNI
+#define org_chromium_TestJni_JNI
+
+#include <jni.h>
+
+#include "base/android/jni_generator/jni_generator_helper.h"
+
+
+// Step 1: Forward declarations.
+
+JNI_REGISTRATION_EXPORT extern const char kClassPath_org_chromium_TestJni[];
+const char kClassPath_org_chromium_TestJni[] = "org/chromium/TestJni";
+
+JNI_REGISTRATION_EXPORT extern const char kClassPath_org_chromium_TestJni_00024MyOtherInnerClass[];
+const char kClassPath_org_chromium_TestJni_00024MyOtherInnerClass[] =
+ "org/chromium/TestJni$MyOtherInnerClass";
+// Leaking this jclass as we cannot use LazyInstance from some threads.
+JNI_REGISTRATION_EXPORT std::atomic<jclass> g_org_chromium_TestJni_clazz(nullptr);
+#ifndef org_chromium_TestJni_clazz_defined
+#define org_chromium_TestJni_clazz_defined
+inline jclass org_chromium_TestJni_clazz(JNIEnv* env) {
+ return base::android::LazyGetClass(env, kClassPath_org_chromium_TestJni,
+ &g_org_chromium_TestJni_clazz);
+}
+#endif
+// Leaking this jclass as we cannot use LazyInstance from some threads.
+JNI_REGISTRATION_EXPORT std::atomic<jclass>
+ g_org_chromium_TestJni_00024MyOtherInnerClass_clazz(nullptr);
+#ifndef org_chromium_TestJni_00024MyOtherInnerClass_clazz_defined
+#define org_chromium_TestJni_00024MyOtherInnerClass_clazz_defined
+inline jclass org_chromium_TestJni_00024MyOtherInnerClass_clazz(JNIEnv* env) {
+ return base::android::LazyGetClass(env, kClassPath_org_chromium_TestJni_00024MyOtherInnerClass,
+ &g_org_chromium_TestJni_00024MyOtherInnerClass_clazz);
+}
+#endif
+
+
+// Step 2: Constants (optional).
+
+
+// Step 3: Method stubs.
+static jint JNI_TestJni_Init(JNIEnv* env, const base::android::JavaParamRef<jobject>& jcaller);
+
+JNI_GENERATOR_EXPORT jint Java_org_chromium_TestJni_nativeInit(
+ JNIEnv* env,
+ jobject jcaller) {
+ return JNI_TestJni_Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
+}
+
+static jint JNI_MyOtherInnerClass_Init(JNIEnv* env, const base::android::JavaParamRef<jobject>&
+ jcaller);
+
+JNI_GENERATOR_EXPORT jint Java_org_chromium_TestJni_00024MyOtherInnerClass_nativeInit(
+ JNIEnv* env,
+ jobject jcaller) {
+ return JNI_MyOtherInnerClass_Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
+}
+
+
+#endif // org_chromium_TestJni_JNI
diff --git a/chromium/base/android/jni_generator/golden/testInnerClassNativesBothInnerAndOuterRegistrations.golden b/chromium/base/android/jni_generator/golden/testInnerClassNativesBothInnerAndOuterRegistrations.golden
new file mode 100644
index 00000000000..547f209256a
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/testInnerClassNativesBothInnerAndOuterRegistrations.golden
@@ -0,0 +1,115 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_registration_generator.py
+// Please do not change its content.
+
+#ifndef HEADER_GUARD
+#define HEADER_GUARD
+
+#include <jni.h>
+
+#include <iterator>
+
+#include "base/android/jni_generator/jni_generator_helper.h"
+#include "base/android/jni_int_wrapper.h"
+
+
+// Step 1: Forward declarations (classes).
+
+extern const char kClassPath_org_chromium_TestJni[];
+
+extern const char kClassPath_org_chromium_TestJni_00024MyOtherInnerClass[];
+extern std::atomic<jclass> g_org_chromium_TestJni_clazz;
+#ifndef org_chromium_TestJni_clazz_defined
+#define org_chromium_TestJni_clazz_defined
+inline jclass org_chromium_TestJni_clazz(JNIEnv* env) {
+ return base::android::LazyGetClass(env, kClassPath_org_chromium_TestJni,
+ &g_org_chromium_TestJni_clazz);
+}
+#endif
+extern std::atomic<jclass> g_org_chromium_TestJni_00024MyOtherInnerClass_clazz;
+#ifndef org_chromium_TestJni_00024MyOtherInnerClass_clazz_defined
+#define org_chromium_TestJni_00024MyOtherInnerClass_clazz_defined
+inline jclass org_chromium_TestJni_00024MyOtherInnerClass_clazz(JNIEnv* env) {
+ return base::android::LazyGetClass(env, kClassPath_org_chromium_TestJni_00024MyOtherInnerClass,
+ &g_org_chromium_TestJni_00024MyOtherInnerClass_clazz);
+}
+#endif
+
+
+// Step 2: Forward declarations (methods).
+
+JNI_GENERATOR_EXPORT jint Java_org_chromium_TestJni_nativeInit(
+ JNIEnv* env,
+ jobject jcaller);
+JNI_GENERATOR_EXPORT jint Java_org_chromium_TestJni_00024MyOtherInnerClass_nativeInit(
+ JNIEnv* env,
+ jobject jcaller);
+
+
+// Step 3: Method declarations.
+
+static const JNINativeMethod kMethods_org_chromium_TestJni[] = {
+ { "nativeInit", "()I", reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeInit) },
+};
+
+
+static const JNINativeMethod kMethods_org_chromium_TestJni_00024MyOtherInnerClass[] = {
+ { "nativeInit", "()I",
+ reinterpret_cast<void*>(Java_org_chromium_TestJni_00024MyOtherInnerClass_nativeInit) },
+};
+
+
+JNI_REGISTRATION_EXPORT bool RegisterNative_org_chromium_TestJni(JNIEnv* env) {
+ const int kMethods_org_chromium_TestJniSize =
+ std::size(kMethods_org_chromium_TestJni);
+ if (env->RegisterNatives(
+ org_chromium_TestJni_clazz(env),
+ kMethods_org_chromium_TestJni,
+ kMethods_org_chromium_TestJniSize) < 0) {
+ jni_generator::HandleRegistrationError(env,
+ org_chromium_TestJni_clazz(env),
+ __FILE__);
+ return false;
+ }
+
+
+ const int kMethods_org_chromium_TestJni_00024MyOtherInnerClassSize =
+ std::size(kMethods_org_chromium_TestJni_00024MyOtherInnerClass);
+ if (env->RegisterNatives(
+ org_chromium_TestJni_00024MyOtherInnerClass_clazz(env),
+ kMethods_org_chromium_TestJni_00024MyOtherInnerClass,
+ kMethods_org_chromium_TestJni_00024MyOtherInnerClassSize) < 0) {
+ jni_generator::HandleRegistrationError(env,
+ org_chromium_TestJni_00024MyOtherInnerClass_clazz(env),
+ __FILE__);
+ return false;
+ }
+
+ return true;
+}
+
+
+// Step 4: Main dex and non-main dex registration functions.
+
+namespace test {
+
+bool RegisterMainDexNatives(JNIEnv* env) {
+ if (!RegisterNative_org_chromium_TestJni(env))
+ return false;
+
+ return true;
+}
+
+bool RegisterNonMainDexNatives(JNIEnv* env) {
+
+ return true;
+}
+
+} // namespace test
+
+#endif // HEADER_GUARD
diff --git a/chromium/base/android/jni_generator/golden/testInnerClassNativesMultiple.golden b/chromium/base/android/jni_generator/golden/testInnerClassNativesMultiple.golden
new file mode 100644
index 00000000000..de0a721783e
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/testInnerClassNativesMultiple.golden
@@ -0,0 +1,83 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_generator.py
+// For
+// org/chromium/TestJni
+
+#ifndef org_chromium_TestJni_JNI
+#define org_chromium_TestJni_JNI
+
+#include <jni.h>
+
+#include "base/android/jni_generator/jni_generator_helper.h"
+
+
+// Step 1: Forward declarations.
+
+JNI_REGISTRATION_EXPORT extern const char kClassPath_org_chromium_TestJni[];
+const char kClassPath_org_chromium_TestJni[] = "org/chromium/TestJni";
+
+JNI_REGISTRATION_EXPORT extern const char kClassPath_org_chromium_TestJni_00024MyInnerClass[];
+const char kClassPath_org_chromium_TestJni_00024MyInnerClass[] =
+ "org/chromium/TestJni$MyInnerClass";
+
+JNI_REGISTRATION_EXPORT extern const char kClassPath_org_chromium_TestJni_00024MyOtherInnerClass[];
+const char kClassPath_org_chromium_TestJni_00024MyOtherInnerClass[] =
+ "org/chromium/TestJni$MyOtherInnerClass";
+// Leaking this jclass as we cannot use LazyInstance from some threads.
+JNI_REGISTRATION_EXPORT std::atomic<jclass> g_org_chromium_TestJni_clazz(nullptr);
+#ifndef org_chromium_TestJni_clazz_defined
+#define org_chromium_TestJni_clazz_defined
+inline jclass org_chromium_TestJni_clazz(JNIEnv* env) {
+ return base::android::LazyGetClass(env, kClassPath_org_chromium_TestJni,
+ &g_org_chromium_TestJni_clazz);
+}
+#endif
+// Leaking this jclass as we cannot use LazyInstance from some threads.
+JNI_REGISTRATION_EXPORT std::atomic<jclass> g_org_chromium_TestJni_00024MyInnerClass_clazz(nullptr);
+#ifndef org_chromium_TestJni_00024MyInnerClass_clazz_defined
+#define org_chromium_TestJni_00024MyInnerClass_clazz_defined
+inline jclass org_chromium_TestJni_00024MyInnerClass_clazz(JNIEnv* env) {
+ return base::android::LazyGetClass(env, kClassPath_org_chromium_TestJni_00024MyInnerClass,
+ &g_org_chromium_TestJni_00024MyInnerClass_clazz);
+}
+#endif
+// Leaking this jclass as we cannot use LazyInstance from some threads.
+JNI_REGISTRATION_EXPORT std::atomic<jclass>
+ g_org_chromium_TestJni_00024MyOtherInnerClass_clazz(nullptr);
+#ifndef org_chromium_TestJni_00024MyOtherInnerClass_clazz_defined
+#define org_chromium_TestJni_00024MyOtherInnerClass_clazz_defined
+inline jclass org_chromium_TestJni_00024MyOtherInnerClass_clazz(JNIEnv* env) {
+ return base::android::LazyGetClass(env, kClassPath_org_chromium_TestJni_00024MyOtherInnerClass,
+ &g_org_chromium_TestJni_00024MyOtherInnerClass_clazz);
+}
+#endif
+
+
+// Step 2: Constants (optional).
+
+
+// Step 3: Method stubs.
+static jint JNI_MyInnerClass_Init(JNIEnv* env, const base::android::JavaParamRef<jobject>& jcaller);
+
+JNI_GENERATOR_EXPORT jint Java_org_chromium_TestJni_00024MyInnerClass_nativeInit(
+ JNIEnv* env,
+ jobject jcaller) {
+ return JNI_MyInnerClass_Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
+}
+
+static jint JNI_MyOtherInnerClass_Init(JNIEnv* env, const base::android::JavaParamRef<jobject>&
+ jcaller);
+
+JNI_GENERATOR_EXPORT jint Java_org_chromium_TestJni_00024MyOtherInnerClass_nativeInit(
+ JNIEnv* env,
+ jobject jcaller) {
+ return JNI_MyOtherInnerClass_Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
+}
+
+
+#endif // org_chromium_TestJni_JNI
diff --git a/chromium/base/android/jni_generator/golden/testInputStream.javap b/chromium/base/android/jni_generator/golden/testInputStream.javap
new file mode 100644
index 00000000000..50ab617a3cc
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/testInputStream.javap
@@ -0,0 +1,228 @@
+Compiled from "InputStream.java"
+public abstract class java.io.InputStream extends java.lang.Object implements java.io.Closeable
+ SourceFile: "InputStream.java"
+ minor version: 0
+ major version: 49
+ Constant pool:
+const #1 = Method #6.#39; // java/lang/Object."<init>":()V
+const #2 = class #40; // java/lang/RuntimeException
+const #3 = String #41; // Stub!
+const #4 = Method #2.#42; // java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+const #5 = class #43; // java/io/InputStream
+const #6 = class #44; // java/lang/Object
+const #7 = class #45; // java/io/Closeable
+const #8 = Asciz <init>;
+const #9 = Asciz ()V;
+const #10 = Asciz Code;
+const #11 = Asciz LineNumberTable;
+const #12 = Asciz LocalVariableTable;
+const #13 = Asciz this;
+const #14 = Asciz Ljava/io/InputStream;;
+const #15 = Asciz available;
+const #16 = Asciz ()I;
+const #17 = Asciz Exceptions;
+const #18 = class #46; // java/io/IOException
+const #19 = Asciz close;
+const #20 = Asciz mark;
+const #21 = Asciz (I)V;
+const #22 = Asciz readlimit;
+const #23 = Asciz I;
+const #24 = Asciz markSupported;
+const #25 = Asciz ()Z;
+const #26 = Asciz read;
+const #27 = Asciz ([B)I;
+const #28 = Asciz buffer;
+const #29 = Asciz [B;
+const #30 = Asciz ([BII)I;
+const #31 = Asciz byteOffset;
+const #32 = Asciz byteCount;
+const #33 = Asciz reset;
+const #34 = Asciz skip;
+const #35 = Asciz (J)J;
+const #36 = Asciz J;
+const #37 = Asciz SourceFile;
+const #38 = Asciz InputStream.java;
+const #39 = NameAndType #8:#9;// "<init>":()V
+const #40 = Asciz java/lang/RuntimeException;
+const #41 = Asciz Stub!;
+const #42 = NameAndType #8:#47;// "<init>":(Ljava/lang/String;)V
+const #43 = Asciz java/io/InputStream;
+const #44 = Asciz java/lang/Object;
+const #45 = Asciz java/io/Closeable;
+const #46 = Asciz java/io/IOException;
+const #47 = Asciz (Ljava/lang/String;)V;
+
+{
+public java.io.InputStream();
+ Signature: ()V
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: aload_0
+ 1: invokespecial #1; //Method java/lang/Object."<init>":()V
+ 4: new #2; //class java/lang/RuntimeException
+ 7: dup
+ 8: ldc #3; //String Stub!
+ 10: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 13: athrow
+ LineNumberTable:
+ line 5: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 14 0 this Ljava/io/InputStream;
+
+
+public int available() throws java.io.IOException;
+ Signature: ()I
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 6: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Ljava/io/InputStream;
+
+ Exceptions:
+ throws java.io.IOException
+public void close() throws java.io.IOException;
+ Signature: ()V
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 7: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Ljava/io/InputStream;
+
+ Exceptions:
+ throws java.io.IOException
+public void mark(int);
+ Signature: (I)V
+ Code:
+ Stack=3, Locals=2, Args_size=2
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 8: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Ljava/io/InputStream;
+ 0 10 1 readlimit I
+
+
+public boolean markSupported();
+ Signature: ()Z
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 9: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Ljava/io/InputStream;
+
+
+public abstract int read() throws java.io.IOException;
+ Signature: ()I
+ Exceptions:
+ throws java.io.IOException
+public int read(byte[]) throws java.io.IOException;
+ Signature: ([B)I
+ Code:
+ Stack=3, Locals=2, Args_size=2
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 11: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Ljava/io/InputStream;
+ 0 10 1 buffer [B
+
+ Exceptions:
+ throws java.io.IOException
+public int read(byte[], int, int) throws java.io.IOException;
+ Signature: ([BII)I
+ Code:
+ Stack=3, Locals=4, Args_size=4
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 12: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Ljava/io/InputStream;
+ 0 10 1 buffer [B
+ 0 10 2 byteOffset I
+ 0 10 3 byteCount I
+
+ Exceptions:
+ throws java.io.IOException
+public synchronized void reset() throws java.io.IOException;
+ Signature: ()V
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 13: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Ljava/io/InputStream;
+
+ Exceptions:
+ throws java.io.IOException
+public long skip(long) throws java.io.IOException;
+ Signature: (J)J
+ Code:
+ Stack=3, Locals=3, Args_size=2
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 14: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Ljava/io/InputStream;
+ 0 10 1 byteCount J
+
+ Exceptions:
+ throws java.io.IOException
+}
+
diff --git a/chromium/base/android/jni_generator/golden/testMotionEvent.javap b/chromium/base/android/jni_generator/golden/testMotionEvent.javap
new file mode 100644
index 00000000000..0746943e6ec
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/testMotionEvent.javap
@@ -0,0 +1,2295 @@
+Compiled from "MotionEvent.java"
+public final class android.view.MotionEvent extends android.view.InputEvent implements android.os.Parcelable
+ SourceFile: "MotionEvent.java"
+ InnerClass:
+ public final #10= #9 of #6; //PointerProperties=class android/view/MotionEvent$PointerProperties of class android/view/MotionEvent
+ public final #13= #12 of #6; //PointerCoords=class android/view/MotionEvent$PointerCoords of class android/view/MotionEvent
+ public abstract #150= #149 of #8; //Creator=class android/os/Parcelable$Creator of class android/os/Parcelable
+ minor version: 0
+ major version: 49
+ Constant pool:
+const #1 = Method #7.#293; // android/view/InputEvent."<init>":()V
+const #2 = class #294; // java/lang/RuntimeException
+const #3 = String #295; // Stub!
+const #4 = Method #2.#296; // java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+const #5 = Field #6.#297; // android/view/MotionEvent.CREATOR:Landroid/os/Parcelable$Creator;
+const #6 = class #298; // android/view/MotionEvent
+const #7 = class #299; // android/view/InputEvent
+const #8 = class #300; // android/os/Parcelable
+const #9 = class #301; // android/view/MotionEvent$PointerProperties
+const #10 = Asciz PointerProperties;
+const #11 = Asciz InnerClasses;
+const #12 = class #302; // android/view/MotionEvent$PointerCoords
+const #13 = Asciz PointerCoords;
+const #14 = Asciz INVALID_POINTER_ID;
+const #15 = Asciz I;
+const #16 = Asciz ConstantValue;
+const #17 = int -1;
+const #18 = Asciz ACTION_MASK;
+const #19 = int 255;
+const #20 = Asciz ACTION_DOWN;
+const #21 = int 0;
+const #22 = Asciz ACTION_UP;
+const #23 = int 1;
+const #24 = Asciz ACTION_MOVE;
+const #25 = int 2;
+const #26 = Asciz ACTION_CANCEL;
+const #27 = int 3;
+const #28 = Asciz ACTION_OUTSIDE;
+const #29 = int 4;
+const #30 = Asciz ACTION_POINTER_DOWN;
+const #31 = int 5;
+const #32 = Asciz ACTION_POINTER_UP;
+const #33 = int 6;
+const #34 = Asciz ACTION_HOVER_MOVE;
+const #35 = int 7;
+const #36 = Asciz ACTION_SCROLL;
+const #37 = int 8;
+const #38 = Asciz ACTION_HOVER_ENTER;
+const #39 = int 9;
+const #40 = Asciz ACTION_HOVER_EXIT;
+const #41 = int 10;
+const #42 = Asciz ACTION_POINTER_INDEX_MASK;
+const #43 = int 65280;
+const #44 = Asciz ACTION_POINTER_INDEX_SHIFT;
+const #45 = Asciz ACTION_POINTER_1_DOWN;
+const #46 = Asciz Deprecated;
+const #47 = Asciz RuntimeVisibleAnnotations;
+const #48 = Asciz Ljava/lang/Deprecated;;
+const #49 = Asciz ACTION_POINTER_2_DOWN;
+const #50 = int 261;
+const #51 = Asciz ACTION_POINTER_3_DOWN;
+const #52 = int 517;
+const #53 = Asciz ACTION_POINTER_1_UP;
+const #54 = Asciz ACTION_POINTER_2_UP;
+const #55 = int 262;
+const #56 = Asciz ACTION_POINTER_3_UP;
+const #57 = int 518;
+const #58 = Asciz ACTION_POINTER_ID_MASK;
+const #59 = Asciz ACTION_POINTER_ID_SHIFT;
+const #60 = Asciz FLAG_WINDOW_IS_OBSCURED;
+const #61 = Asciz EDGE_TOP;
+const #62 = Asciz EDGE_BOTTOM;
+const #63 = Asciz EDGE_LEFT;
+const #64 = Asciz EDGE_RIGHT;
+const #65 = Asciz AXIS_X;
+const #66 = Asciz AXIS_Y;
+const #67 = Asciz AXIS_PRESSURE;
+const #68 = Asciz AXIS_SIZE;
+const #69 = Asciz AXIS_TOUCH_MAJOR;
+const #70 = Asciz AXIS_TOUCH_MINOR;
+const #71 = Asciz AXIS_TOOL_MAJOR;
+const #72 = Asciz AXIS_TOOL_MINOR;
+const #73 = Asciz AXIS_ORIENTATION;
+const #74 = Asciz AXIS_VSCROLL;
+const #75 = Asciz AXIS_HSCROLL;
+const #76 = Asciz AXIS_Z;
+const #77 = int 11;
+const #78 = Asciz AXIS_RX;
+const #79 = int 12;
+const #80 = Asciz AXIS_RY;
+const #81 = int 13;
+const #82 = Asciz AXIS_RZ;
+const #83 = int 14;
+const #84 = Asciz AXIS_HAT_X;
+const #85 = int 15;
+const #86 = Asciz AXIS_HAT_Y;
+const #87 = int 16;
+const #88 = Asciz AXIS_LTRIGGER;
+const #89 = int 17;
+const #90 = Asciz AXIS_RTRIGGER;
+const #91 = int 18;
+const #92 = Asciz AXIS_THROTTLE;
+const #93 = int 19;
+const #94 = Asciz AXIS_RUDDER;
+const #95 = int 20;
+const #96 = Asciz AXIS_WHEEL;
+const #97 = int 21;
+const #98 = Asciz AXIS_GAS;
+const #99 = int 22;
+const #100 = Asciz AXIS_BRAKE;
+const #101 = int 23;
+const #102 = Asciz AXIS_DISTANCE;
+const #103 = int 24;
+const #104 = Asciz AXIS_TILT;
+const #105 = int 25;
+const #106 = Asciz AXIS_GENERIC_1;
+const #107 = int 32;
+const #108 = Asciz AXIS_GENERIC_2;
+const #109 = int 33;
+const #110 = Asciz AXIS_GENERIC_3;
+const #111 = int 34;
+const #112 = Asciz AXIS_GENERIC_4;
+const #113 = int 35;
+const #114 = Asciz AXIS_GENERIC_5;
+const #115 = int 36;
+const #116 = Asciz AXIS_GENERIC_6;
+const #117 = int 37;
+const #118 = Asciz AXIS_GENERIC_7;
+const #119 = int 38;
+const #120 = Asciz AXIS_GENERIC_8;
+const #121 = int 39;
+const #122 = Asciz AXIS_GENERIC_9;
+const #123 = int 40;
+const #124 = Asciz AXIS_GENERIC_10;
+const #125 = int 41;
+const #126 = Asciz AXIS_GENERIC_11;
+const #127 = int 42;
+const #128 = Asciz AXIS_GENERIC_12;
+const #129 = int 43;
+const #130 = Asciz AXIS_GENERIC_13;
+const #131 = int 44;
+const #132 = Asciz AXIS_GENERIC_14;
+const #133 = int 45;
+const #134 = Asciz AXIS_GENERIC_15;
+const #135 = int 46;
+const #136 = Asciz AXIS_GENERIC_16;
+const #137 = int 47;
+const #138 = Asciz BUTTON_PRIMARY;
+const #139 = Asciz BUTTON_SECONDARY;
+const #140 = Asciz BUTTON_TERTIARY;
+const #141 = Asciz BUTTON_BACK;
+const #142 = Asciz BUTTON_FORWARD;
+const #143 = Asciz TOOL_TYPE_UNKNOWN;
+const #144 = Asciz TOOL_TYPE_FINGER;
+const #145 = Asciz TOOL_TYPE_STYLUS;
+const #146 = Asciz TOOL_TYPE_MOUSE;
+const #147 = Asciz TOOL_TYPE_ERASER;
+const #148 = Asciz CREATOR;
+const #149 = class #303; // android/os/Parcelable$Creator
+const #150 = Asciz Creator;
+const #151 = Asciz Landroid/os/Parcelable$Creator;;
+const #152 = Asciz Signature;
+const #153 = Asciz Landroid/os/Parcelable$Creator<Landroid/view/MotionEvent;>;;
+const #154 = Asciz <init>;
+const #155 = Asciz ()V;
+const #156 = Asciz Code;
+const #157 = Asciz LineNumberTable;
+const #158 = Asciz LocalVariableTable;
+const #159 = Asciz this;
+const #160 = Asciz Landroid/view/MotionEvent;;
+const #161 = Asciz finalize;
+const #162 = Asciz Exceptions;
+const #163 = class #304; // java/lang/Throwable
+const #164 = Asciz obtain;
+const #165 = Asciz (JJII[Landroid/view/MotionEvent$PointerProperties;[Landroid/view/MotionEvent$PointerCoords;IIFFIIII)Landroid/view/MotionEvent;;
+const #166 = Asciz downTime;
+const #167 = Asciz J;
+const #168 = Asciz eventTime;
+const #169 = Asciz action;
+const #170 = Asciz pointerCount;
+const #171 = Asciz pointerProperties;
+const #172 = Asciz [Landroid/view/MotionEvent$PointerProperties;;
+const #173 = Asciz pointerCoords;
+const #174 = Asciz [Landroid/view/MotionEvent$PointerCoords;;
+const #175 = Asciz metaState;
+const #176 = Asciz buttonState;
+const #177 = Asciz xPrecision;
+const #178 = Asciz F;
+const #179 = Asciz yPrecision;
+const #180 = Asciz deviceId;
+const #181 = Asciz edgeFlags;
+const #182 = Asciz source;
+const #183 = Asciz flags;
+const #184 = Asciz (JJII[I[Landroid/view/MotionEvent$PointerCoords;IFFIIII)Landroid/view/MotionEvent;;
+const #185 = Asciz pointerIds;
+const #186 = Asciz [I;
+const #187 = Asciz (JJIFFFFIFFII)Landroid/view/MotionEvent;;
+const #188 = Asciz x;
+const #189 = Asciz y;
+const #190 = Asciz pressure;
+const #191 = Asciz size;
+const #192 = Asciz (JJIIFFFFIFFII)Landroid/view/MotionEvent;;
+const #193 = Asciz (JJIFFI)Landroid/view/MotionEvent;;
+const #194 = Asciz (Landroid/view/MotionEvent;)Landroid/view/MotionEvent;;
+const #195 = Asciz other;
+const #196 = Asciz obtainNoHistory;
+const #197 = Asciz recycle;
+const #198 = Asciz getDeviceId;
+const #199 = Asciz ()I;
+const #200 = Asciz getSource;
+const #201 = Asciz setSource;
+const #202 = Asciz (I)V;
+const #203 = Asciz getAction;
+const #204 = Asciz getActionMasked;
+const #205 = Asciz getActionIndex;
+const #206 = Asciz getFlags;
+const #207 = Asciz getDownTime;
+const #208 = Asciz ()J;
+const #209 = Asciz getEventTime;
+const #210 = Asciz getX;
+const #211 = Asciz ()F;
+const #212 = Asciz getY;
+const #213 = Asciz getPressure;
+const #214 = Asciz getSize;
+const #215 = Asciz getTouchMajor;
+const #216 = Asciz getTouchMinor;
+const #217 = Asciz getToolMajor;
+const #218 = Asciz getToolMinor;
+const #219 = Asciz getOrientation;
+const #220 = Asciz getAxisValue;
+const #221 = Asciz (I)F;
+const #222 = Asciz axis;
+const #223 = Asciz getPointerCount;
+const #224 = Asciz getPointerId;
+const #225 = Asciz (I)I;
+const #226 = Asciz pointerIndex;
+const #227 = Asciz getToolType;
+const #228 = Asciz findPointerIndex;
+const #229 = Asciz pointerId;
+const #230 = Asciz (II)F;
+const #231 = Asciz getPointerCoords;
+const #232 = Asciz (ILandroid/view/MotionEvent$PointerCoords;)V;
+const #233 = Asciz outPointerCoords;
+const #234 = Asciz Landroid/view/MotionEvent$PointerCoords;;
+const #235 = Asciz getPointerProperties;
+const #236 = Asciz (ILandroid/view/MotionEvent$PointerProperties;)V;
+const #237 = Asciz outPointerProperties;
+const #238 = Asciz Landroid/view/MotionEvent$PointerProperties;;
+const #239 = Asciz getMetaState;
+const #240 = Asciz getButtonState;
+const #241 = Asciz getRawX;
+const #242 = Asciz getRawY;
+const #243 = Asciz getXPrecision;
+const #244 = Asciz getYPrecision;
+const #245 = Asciz getHistorySize;
+const #246 = Asciz getHistoricalEventTime;
+const #247 = Asciz (I)J;
+const #248 = Asciz pos;
+const #249 = Asciz getHistoricalX;
+const #250 = Asciz getHistoricalY;
+const #251 = Asciz getHistoricalPressure;
+const #252 = Asciz getHistoricalSize;
+const #253 = Asciz getHistoricalTouchMajor;
+const #254 = Asciz getHistoricalTouchMinor;
+const #255 = Asciz getHistoricalToolMajor;
+const #256 = Asciz getHistoricalToolMinor;
+const #257 = Asciz getHistoricalOrientation;
+const #258 = Asciz getHistoricalAxisValue;
+const #259 = Asciz (III)F;
+const #260 = Asciz getHistoricalPointerCoords;
+const #261 = Asciz (IILandroid/view/MotionEvent$PointerCoords;)V;
+const #262 = Asciz getEdgeFlags;
+const #263 = Asciz setEdgeFlags;
+const #264 = Asciz setAction;
+const #265 = Asciz offsetLocation;
+const #266 = Asciz (FF)V;
+const #267 = Asciz deltaX;
+const #268 = Asciz deltaY;
+const #269 = Asciz setLocation;
+const #270 = Asciz transform;
+const #271 = Asciz (Landroid/graphics/Matrix;)V;
+const #272 = Asciz matrix;
+const #273 = Asciz Landroid/graphics/Matrix;;
+const #274 = Asciz addBatch;
+const #275 = Asciz (JFFFFI)V;
+const #276 = Asciz (J[Landroid/view/MotionEvent$PointerCoords;I)V;
+const #277 = Asciz toString;
+const #278 = Asciz ()Ljava/lang/String;;
+const #279 = Asciz actionToString;
+const #280 = Asciz (I)Ljava/lang/String;;
+const #281 = Asciz axisToString;
+const #282 = Asciz axisFromString;
+const #283 = Asciz (Ljava/lang/String;)I;
+const #284 = Asciz symbolicName;
+const #285 = Asciz Ljava/lang/String;;
+const #286 = Asciz writeToParcel;
+const #287 = Asciz (Landroid/os/Parcel;I)V;
+const #288 = Asciz out;
+const #289 = Asciz Landroid/os/Parcel;;
+const #290 = Asciz <clinit>;
+const #291 = Asciz SourceFile;
+const #292 = Asciz MotionEvent.java;
+const #293 = NameAndType #154:#155;// "<init>":()V
+const #294 = Asciz java/lang/RuntimeException;
+const #295 = Asciz Stub!;
+const #296 = NameAndType #154:#305;// "<init>":(Ljava/lang/String;)V
+const #297 = NameAndType #148:#151;// CREATOR:Landroid/os/Parcelable$Creator;
+const #298 = Asciz android/view/MotionEvent;
+const #299 = Asciz android/view/InputEvent;
+const #300 = Asciz android/os/Parcelable;
+const #301 = Asciz android/view/MotionEvent$PointerProperties;
+const #302 = Asciz android/view/MotionEvent$PointerCoords;
+const #303 = Asciz android/os/Parcelable$Creator;
+const #304 = Asciz java/lang/Throwable;
+const #305 = Asciz (Ljava/lang/String;)V;
+
+{
+public static final int INVALID_POINTER_ID;
+ Signature: I
+ Constant value: int -1
+
+public static final int ACTION_MASK;
+ Signature: I
+ Constant value: int 255
+
+public static final int ACTION_DOWN;
+ Signature: I
+ Constant value: int 0
+
+public static final int ACTION_UP;
+ Signature: I
+ Constant value: int 1
+
+public static final int ACTION_MOVE;
+ Signature: I
+ Constant value: int 2
+
+public static final int ACTION_CANCEL;
+ Signature: I
+ Constant value: int 3
+
+public static final int ACTION_OUTSIDE;
+ Signature: I
+ Constant value: int 4
+
+public static final int ACTION_POINTER_DOWN;
+ Signature: I
+ Constant value: int 5
+
+public static final int ACTION_POINTER_UP;
+ Signature: I
+ Constant value: int 6
+
+public static final int ACTION_HOVER_MOVE;
+ Signature: I
+ Constant value: int 7
+
+public static final int ACTION_SCROLL;
+ Signature: I
+ Constant value: int 8
+
+public static final int ACTION_HOVER_ENTER;
+ Signature: I
+ Constant value: int 9
+
+public static final int ACTION_HOVER_EXIT;
+ Signature: I
+ Constant value: int 10
+
+public static final int ACTION_POINTER_INDEX_MASK;
+ Signature: I
+ Constant value: int 65280
+
+public static final int ACTION_POINTER_INDEX_SHIFT;
+ Signature: I
+ Constant value: int 8
+
+public static final int ACTION_POINTER_1_DOWN;
+ Signature: I
+ Constant value: int 5Deprecated: true
+ RuntimeVisibleAnnotations: length = 0x6
+ 00 01 00 30 00 00
+
+
+public static final int ACTION_POINTER_2_DOWN;
+ Signature: I
+ Constant value: int 261Deprecated: true
+ RuntimeVisibleAnnotations: length = 0x6
+ 00 01 00 30 00 00
+
+
+public static final int ACTION_POINTER_3_DOWN;
+ Signature: I
+ Constant value: int 517Deprecated: true
+ RuntimeVisibleAnnotations: length = 0x6
+ 00 01 00 30 00 00
+
+
+public static final int ACTION_POINTER_1_UP;
+ Signature: I
+ Constant value: int 6Deprecated: true
+ RuntimeVisibleAnnotations: length = 0x6
+ 00 01 00 30 00 00
+
+
+public static final int ACTION_POINTER_2_UP;
+ Signature: I
+ Constant value: int 262Deprecated: true
+ RuntimeVisibleAnnotations: length = 0x6
+ 00 01 00 30 00 00
+
+
+public static final int ACTION_POINTER_3_UP;
+ Signature: I
+ Constant value: int 518Deprecated: true
+ RuntimeVisibleAnnotations: length = 0x6
+ 00 01 00 30 00 00
+
+
+public static final int ACTION_POINTER_ID_MASK;
+ Signature: I
+ Constant value: int 65280Deprecated: true
+ RuntimeVisibleAnnotations: length = 0x6
+ 00 01 00 30 00 00
+
+
+public static final int ACTION_POINTER_ID_SHIFT;
+ Signature: I
+ Constant value: int 8Deprecated: true
+ RuntimeVisibleAnnotations: length = 0x6
+ 00 01 00 30 00 00
+
+
+public static final int FLAG_WINDOW_IS_OBSCURED;
+ Signature: I
+ Constant value: int 1
+
+public static final int EDGE_TOP;
+ Signature: I
+ Constant value: int 1
+
+public static final int EDGE_BOTTOM;
+ Signature: I
+ Constant value: int 2
+
+public static final int EDGE_LEFT;
+ Signature: I
+ Constant value: int 4
+
+public static final int EDGE_RIGHT;
+ Signature: I
+ Constant value: int 8
+
+public static final int AXIS_X;
+ Signature: I
+ Constant value: int 0
+
+public static final int AXIS_Y;
+ Signature: I
+ Constant value: int 1
+
+public static final int AXIS_PRESSURE;
+ Signature: I
+ Constant value: int 2
+
+public static final int AXIS_SIZE;
+ Signature: I
+ Constant value: int 3
+
+public static final int AXIS_TOUCH_MAJOR;
+ Signature: I
+ Constant value: int 4
+
+public static final int AXIS_TOUCH_MINOR;
+ Signature: I
+ Constant value: int 5
+
+public static final int AXIS_TOOL_MAJOR;
+ Signature: I
+ Constant value: int 6
+
+public static final int AXIS_TOOL_MINOR;
+ Signature: I
+ Constant value: int 7
+
+public static final int AXIS_ORIENTATION;
+ Signature: I
+ Constant value: int 8
+
+public static final int AXIS_VSCROLL;
+ Signature: I
+ Constant value: int 9
+
+public static final int AXIS_HSCROLL;
+ Signature: I
+ Constant value: int 10
+
+public static final int AXIS_Z;
+ Signature: I
+ Constant value: int 11
+
+public static final int AXIS_RX;
+ Signature: I
+ Constant value: int 12
+
+public static final int AXIS_RY;
+ Signature: I
+ Constant value: int 13
+
+public static final int AXIS_RZ;
+ Signature: I
+ Constant value: int 14
+
+public static final int AXIS_HAT_X;
+ Signature: I
+ Constant value: int 15
+
+public static final int AXIS_HAT_Y;
+ Signature: I
+ Constant value: int 16
+
+public static final int AXIS_LTRIGGER;
+ Signature: I
+ Constant value: int 17
+
+public static final int AXIS_RTRIGGER;
+ Signature: I
+ Constant value: int 18
+
+public static final int AXIS_THROTTLE;
+ Signature: I
+ Constant value: int 19
+
+public static final int AXIS_RUDDER;
+ Signature: I
+ Constant value: int 20
+
+public static final int AXIS_WHEEL;
+ Signature: I
+ Constant value: int 21
+
+public static final int AXIS_GAS;
+ Signature: I
+ Constant value: int 22
+
+public static final int AXIS_BRAKE;
+ Signature: I
+ Constant value: int 23
+
+public static final int AXIS_DISTANCE;
+ Signature: I
+ Constant value: int 24
+
+public static final int AXIS_TILT;
+ Signature: I
+ Constant value: int 25
+
+public static final int AXIS_GENERIC_1;
+ Signature: I
+ Constant value: int 32
+
+public static final int AXIS_GENERIC_2;
+ Signature: I
+ Constant value: int 33
+
+public static final int AXIS_GENERIC_3;
+ Signature: I
+ Constant value: int 34
+
+public static final int AXIS_GENERIC_4;
+ Signature: I
+ Constant value: int 35
+
+public static final int AXIS_GENERIC_5;
+ Signature: I
+ Constant value: int 36
+
+public static final int AXIS_GENERIC_6;
+ Signature: I
+ Constant value: int 37
+
+public static final int AXIS_GENERIC_7;
+ Signature: I
+ Constant value: int 38
+
+public static final int AXIS_GENERIC_8;
+ Signature: I
+ Constant value: int 39
+
+public static final int AXIS_GENERIC_9;
+ Signature: I
+ Constant value: int 40
+
+public static final int AXIS_GENERIC_10;
+ Signature: I
+ Constant value: int 41
+
+public static final int AXIS_GENERIC_11;
+ Signature: I
+ Constant value: int 42
+
+public static final int AXIS_GENERIC_12;
+ Signature: I
+ Constant value: int 43
+
+public static final int AXIS_GENERIC_13;
+ Signature: I
+ Constant value: int 44
+
+public static final int AXIS_GENERIC_14;
+ Signature: I
+ Constant value: int 45
+
+public static final int AXIS_GENERIC_15;
+ Signature: I
+ Constant value: int 46
+
+public static final int AXIS_GENERIC_16;
+ Signature: I
+ Constant value: int 47
+
+public static final int BUTTON_PRIMARY;
+ Signature: I
+ Constant value: int 1
+
+public static final int BUTTON_SECONDARY;
+ Signature: I
+ Constant value: int 2
+
+public static final int BUTTON_TERTIARY;
+ Signature: I
+ Constant value: int 4
+
+public static final int BUTTON_BACK;
+ Signature: I
+ Constant value: int 8
+
+public static final int BUTTON_FORWARD;
+ Signature: I
+ Constant value: int 16
+
+public static final int TOOL_TYPE_UNKNOWN;
+ Signature: I
+ Constant value: int 0
+
+public static final int TOOL_TYPE_FINGER;
+ Signature: I
+ Constant value: int 1
+
+public static final int TOOL_TYPE_STYLUS;
+ Signature: I
+ Constant value: int 2
+
+public static final int TOOL_TYPE_MOUSE;
+ Signature: I
+ Constant value: int 3
+
+public static final int TOOL_TYPE_ERASER;
+ Signature: I
+ Constant value: int 4
+
+public static final android.os.Parcelable$Creator CREATOR;
+ Signature: Landroid/os/Parcelable$Creator;
+ Signature: length = 0x2
+ 00 FFFFFF99
+
+
+android.view.MotionEvent();
+ Signature: ()V
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: aload_0
+ 1: invokespecial #1; //Method android/view/InputEvent."<init>":()V
+ 4: new #2; //class java/lang/RuntimeException
+ 7: dup
+ 8: ldc #3; //String Stub!
+ 10: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 13: athrow
+ LineNumberTable:
+ line 35: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 14 0 this Landroid/view/MotionEvent;
+
+
+protected void finalize() throws java.lang.Throwable;
+ Signature: ()V
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 36: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+ Exceptions:
+ throws java.lang.Throwable
+public static android.view.MotionEvent obtain(long, long, int, int, android.view.MotionEvent$PointerProperties[], android.view.MotionEvent$PointerCoords[], int, int, float, float, int, int, int, int);
+ Signature: (JJII[Landroid/view/MotionEvent$PointerProperties;[Landroid/view/MotionEvent$PointerCoords;IIFFIIII)Landroid/view/MotionEvent;
+ Code:
+ Stack=3, Locals=16, Args_size=14
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 37: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 downTime J
+ 0 10 2 eventTime J
+ 0 10 4 action I
+ 0 10 5 pointerCount I
+ 0 10 6 pointerProperties [Landroid/view/MotionEvent$PointerProperties;
+ 0 10 7 pointerCoords [Landroid/view/MotionEvent$PointerCoords;
+ 0 10 8 metaState I
+ 0 10 9 buttonState I
+ 0 10 10 xPrecision F
+ 0 10 11 yPrecision F
+ 0 10 12 deviceId I
+ 0 10 13 edgeFlags I
+ 0 10 14 source I
+ 0 10 15 flags I
+
+
+public static android.view.MotionEvent obtain(long, long, int, int, int[], android.view.MotionEvent$PointerCoords[], int, float, float, int, int, int, int);
+ Signature: (JJII[I[Landroid/view/MotionEvent$PointerCoords;IFFIIII)Landroid/view/MotionEvent;
+ Code:
+ Stack=3, Locals=15, Args_size=13
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 39: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 downTime J
+ 0 10 2 eventTime J
+ 0 10 4 action I
+ 0 10 5 pointerCount I
+ 0 10 6 pointerIds [I
+ 0 10 7 pointerCoords [Landroid/view/MotionEvent$PointerCoords;
+ 0 10 8 metaState I
+ 0 10 9 xPrecision F
+ 0 10 10 yPrecision F
+ 0 10 11 deviceId I
+ 0 10 12 edgeFlags I
+ 0 10 13 source I
+ 0 10 14 flags I
+
+ Deprecated: true
+ RuntimeVisibleAnnotations: length = 0x6
+ 00 01 00 30 00 00
+
+public static android.view.MotionEvent obtain(long, long, int, float, float, float, float, int, float, float, int, int);
+ Signature: (JJIFFFFIFFII)Landroid/view/MotionEvent;
+ Code:
+ Stack=3, Locals=14, Args_size=12
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 40: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 downTime J
+ 0 10 2 eventTime J
+ 0 10 4 action I
+ 0 10 5 x F
+ 0 10 6 y F
+ 0 10 7 pressure F
+ 0 10 8 size F
+ 0 10 9 metaState I
+ 0 10 10 xPrecision F
+ 0 10 11 yPrecision F
+ 0 10 12 deviceId I
+ 0 10 13 edgeFlags I
+
+
+public static android.view.MotionEvent obtain(long, long, int, int, float, float, float, float, int, float, float, int, int);
+ Signature: (JJIIFFFFIFFII)Landroid/view/MotionEvent;
+ Code:
+ Stack=3, Locals=15, Args_size=13
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 42: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 downTime J
+ 0 10 2 eventTime J
+ 0 10 4 action I
+ 0 10 5 pointerCount I
+ 0 10 6 x F
+ 0 10 7 y F
+ 0 10 8 pressure F
+ 0 10 9 size F
+ 0 10 10 metaState I
+ 0 10 11 xPrecision F
+ 0 10 12 yPrecision F
+ 0 10 13 deviceId I
+ 0 10 14 edgeFlags I
+
+ Deprecated: true
+ RuntimeVisibleAnnotations: length = 0x6
+ 00 01 00 30 00 00
+
+public static android.view.MotionEvent obtain(long, long, int, float, float, int);
+ Signature: (JJIFFI)Landroid/view/MotionEvent;
+ Code:
+ Stack=3, Locals=8, Args_size=6
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 43: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 downTime J
+ 0 10 2 eventTime J
+ 0 10 4 action I
+ 0 10 5 x F
+ 0 10 6 y F
+ 0 10 7 metaState I
+
+
+public static android.view.MotionEvent obtain(android.view.MotionEvent);
+ Signature: (Landroid/view/MotionEvent;)Landroid/view/MotionEvent;
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 44: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 other Landroid/view/MotionEvent;
+
+
+public static android.view.MotionEvent obtainNoHistory(android.view.MotionEvent);
+ Signature: (Landroid/view/MotionEvent;)Landroid/view/MotionEvent;
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 45: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 other Landroid/view/MotionEvent;
+
+
+public final void recycle();
+ Signature: ()V
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 46: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+
+public final int getDeviceId();
+ Signature: ()I
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 47: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+
+public final int getSource();
+ Signature: ()I
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 48: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+
+public final void setSource(int);
+ Signature: (I)V
+ Code:
+ Stack=3, Locals=2, Args_size=2
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 49: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 source I
+
+
+public final int getAction();
+ Signature: ()I
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 50: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+
+public final int getActionMasked();
+ Signature: ()I
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 51: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+
+public final int getActionIndex();
+ Signature: ()I
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 52: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+
+public final int getFlags();
+ Signature: ()I
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 53: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+
+public final long getDownTime();
+ Signature: ()J
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 54: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+
+public final long getEventTime();
+ Signature: ()J
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 55: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+
+public final float getX();
+ Signature: ()F
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 56: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+
+public final float getY();
+ Signature: ()F
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 57: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+
+public final float getPressure();
+ Signature: ()F
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 58: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+
+public final float getSize();
+ Signature: ()F
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 59: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+
+public final float getTouchMajor();
+ Signature: ()F
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 60: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+
+public final float getTouchMinor();
+ Signature: ()F
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 61: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+
+public final float getToolMajor();
+ Signature: ()F
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 62: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+
+public final float getToolMinor();
+ Signature: ()F
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 63: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+
+public final float getOrientation();
+ Signature: ()F
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 64: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+
+public final float getAxisValue(int);
+ Signature: (I)F
+ Code:
+ Stack=3, Locals=2, Args_size=2
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 65: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 axis I
+
+
+public final int getPointerCount();
+ Signature: ()I
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 66: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+
+public final int getPointerId(int);
+ Signature: (I)I
+ Code:
+ Stack=3, Locals=2, Args_size=2
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 67: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+
+
+public final int getToolType(int);
+ Signature: (I)I
+ Code:
+ Stack=3, Locals=2, Args_size=2
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 68: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+
+
+public final int findPointerIndex(int);
+ Signature: (I)I
+ Code:
+ Stack=3, Locals=2, Args_size=2
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 69: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerId I
+
+
+public final float getX(int);
+ Signature: (I)F
+ Code:
+ Stack=3, Locals=2, Args_size=2
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 70: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+
+
+public final float getY(int);
+ Signature: (I)F
+ Code:
+ Stack=3, Locals=2, Args_size=2
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 71: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+
+
+public final float getPressure(int);
+ Signature: (I)F
+ Code:
+ Stack=3, Locals=2, Args_size=2
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 72: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+
+
+public final float getSize(int);
+ Signature: (I)F
+ Code:
+ Stack=3, Locals=2, Args_size=2
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 73: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+
+
+public final float getTouchMajor(int);
+ Signature: (I)F
+ Code:
+ Stack=3, Locals=2, Args_size=2
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 74: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+
+
+public final float getTouchMinor(int);
+ Signature: (I)F
+ Code:
+ Stack=3, Locals=2, Args_size=2
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 75: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+
+
+public final float getToolMajor(int);
+ Signature: (I)F
+ Code:
+ Stack=3, Locals=2, Args_size=2
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 76: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+
+
+public final float getToolMinor(int);
+ Signature: (I)F
+ Code:
+ Stack=3, Locals=2, Args_size=2
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 77: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+
+
+public final float getOrientation(int);
+ Signature: (I)F
+ Code:
+ Stack=3, Locals=2, Args_size=2
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 78: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+
+
+public final float getAxisValue(int, int);
+ Signature: (II)F
+ Code:
+ Stack=3, Locals=3, Args_size=3
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 79: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 axis I
+ 0 10 2 pointerIndex I
+
+
+public final void getPointerCoords(int, android.view.MotionEvent$PointerCoords);
+ Signature: (ILandroid/view/MotionEvent$PointerCoords;)V
+ Code:
+ Stack=3, Locals=3, Args_size=3
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 80: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+ 0 10 2 outPointerCoords Landroid/view/MotionEvent$PointerCoords;
+
+
+public final void getPointerProperties(int, android.view.MotionEvent$PointerProperties);
+ Signature: (ILandroid/view/MotionEvent$PointerProperties;)V
+ Code:
+ Stack=3, Locals=3, Args_size=3
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 81: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+ 0 10 2 outPointerProperties Landroid/view/MotionEvent$PointerProperties;
+
+
+public final int getMetaState();
+ Signature: ()I
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 82: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+
+public final int getButtonState();
+ Signature: ()I
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 83: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+
+public final float getRawX();
+ Signature: ()F
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 84: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+
+public final float getRawY();
+ Signature: ()F
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 85: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+
+public final float getXPrecision();
+ Signature: ()F
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 86: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+
+public final float getYPrecision();
+ Signature: ()F
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 87: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+
+public final int getHistorySize();
+ Signature: ()I
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 88: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+
+public final long getHistoricalEventTime(int);
+ Signature: (I)J
+ Code:
+ Stack=3, Locals=2, Args_size=2
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 89: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pos I
+
+
+public final float getHistoricalX(int);
+ Signature: (I)F
+ Code:
+ Stack=3, Locals=2, Args_size=2
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 90: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pos I
+
+
+public final float getHistoricalY(int);
+ Signature: (I)F
+ Code:
+ Stack=3, Locals=2, Args_size=2
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 91: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pos I
+
+
+public final float getHistoricalPressure(int);
+ Signature: (I)F
+ Code:
+ Stack=3, Locals=2, Args_size=2
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 92: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pos I
+
+
+public final float getHistoricalSize(int);
+ Signature: (I)F
+ Code:
+ Stack=3, Locals=2, Args_size=2
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 93: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pos I
+
+
+public final float getHistoricalTouchMajor(int);
+ Signature: (I)F
+ Code:
+ Stack=3, Locals=2, Args_size=2
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 94: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pos I
+
+
+public final float getHistoricalTouchMinor(int);
+ Signature: (I)F
+ Code:
+ Stack=3, Locals=2, Args_size=2
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 95: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pos I
+
+
+public final float getHistoricalToolMajor(int);
+ Signature: (I)F
+ Code:
+ Stack=3, Locals=2, Args_size=2
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 96: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pos I
+
+
+public final float getHistoricalToolMinor(int);
+ Signature: (I)F
+ Code:
+ Stack=3, Locals=2, Args_size=2
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 97: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pos I
+
+
+public final float getHistoricalOrientation(int);
+ Signature: (I)F
+ Code:
+ Stack=3, Locals=2, Args_size=2
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 98: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pos I
+
+
+public final float getHistoricalAxisValue(int, int);
+ Signature: (II)F
+ Code:
+ Stack=3, Locals=3, Args_size=3
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 99: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 axis I
+ 0 10 2 pos I
+
+
+public final float getHistoricalX(int, int);
+ Signature: (II)F
+ Code:
+ Stack=3, Locals=3, Args_size=3
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 100: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+ 0 10 2 pos I
+
+
+public final float getHistoricalY(int, int);
+ Signature: (II)F
+ Code:
+ Stack=3, Locals=3, Args_size=3
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 101: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+ 0 10 2 pos I
+
+
+public final float getHistoricalPressure(int, int);
+ Signature: (II)F
+ Code:
+ Stack=3, Locals=3, Args_size=3
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 102: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+ 0 10 2 pos I
+
+
+public final float getHistoricalSize(int, int);
+ Signature: (II)F
+ Code:
+ Stack=3, Locals=3, Args_size=3
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 103: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+ 0 10 2 pos I
+
+
+public final float getHistoricalTouchMajor(int, int);
+ Signature: (II)F
+ Code:
+ Stack=3, Locals=3, Args_size=3
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 104: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+ 0 10 2 pos I
+
+
+public final float getHistoricalTouchMinor(int, int);
+ Signature: (II)F
+ Code:
+ Stack=3, Locals=3, Args_size=3
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 105: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+ 0 10 2 pos I
+
+
+public final float getHistoricalToolMajor(int, int);
+ Signature: (II)F
+ Code:
+ Stack=3, Locals=3, Args_size=3
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 106: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+ 0 10 2 pos I
+
+
+public final float getHistoricalToolMinor(int, int);
+ Signature: (II)F
+ Code:
+ Stack=3, Locals=3, Args_size=3
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 107: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+ 0 10 2 pos I
+
+
+public final float getHistoricalOrientation(int, int);
+ Signature: (II)F
+ Code:
+ Stack=3, Locals=3, Args_size=3
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 108: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+ 0 10 2 pos I
+
+
+public final float getHistoricalAxisValue(int, int, int);
+ Signature: (III)F
+ Code:
+ Stack=3, Locals=4, Args_size=4
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 109: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 axis I
+ 0 10 2 pointerIndex I
+ 0 10 3 pos I
+
+
+public final void getHistoricalPointerCoords(int, int, android.view.MotionEvent$PointerCoords);
+ Signature: (IILandroid/view/MotionEvent$PointerCoords;)V
+ Code:
+ Stack=3, Locals=4, Args_size=4
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 110: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+ 0 10 2 pos I
+ 0 10 3 outPointerCoords Landroid/view/MotionEvent$PointerCoords;
+
+
+public final int getEdgeFlags();
+ Signature: ()I
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 111: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+
+public final void setEdgeFlags(int);
+ Signature: (I)V
+ Code:
+ Stack=3, Locals=2, Args_size=2
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 112: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 flags I
+
+
+public final void setAction(int);
+ Signature: (I)V
+ Code:
+ Stack=3, Locals=2, Args_size=2
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 113: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 action I
+
+
+public final void offsetLocation(float, float);
+ Signature: (FF)V
+ Code:
+ Stack=3, Locals=3, Args_size=3
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 114: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 deltaX F
+ 0 10 2 deltaY F
+
+
+public final void setLocation(float, float);
+ Signature: (FF)V
+ Code:
+ Stack=3, Locals=3, Args_size=3
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 115: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 x F
+ 0 10 2 y F
+
+
+public final void transform(android.graphics.Matrix);
+ Signature: (Landroid/graphics/Matrix;)V
+ Code:
+ Stack=3, Locals=2, Args_size=2
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 116: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 matrix Landroid/graphics/Matrix;
+
+
+public final void addBatch(long, float, float, float, float, int);
+ Signature: (JFFFFI)V
+ Code:
+ Stack=3, Locals=8, Args_size=7
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 117: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 eventTime J
+ 0 10 3 x F
+ 0 10 4 y F
+ 0 10 5 pressure F
+ 0 10 6 size F
+ 0 10 7 metaState I
+
+
+public final void addBatch(long, android.view.MotionEvent$PointerCoords[], int);
+ Signature: (J[Landroid/view/MotionEvent$PointerCoords;I)V
+ Code:
+ Stack=3, Locals=5, Args_size=4
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 118: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 eventTime J
+ 0 10 3 pointerCoords [Landroid/view/MotionEvent$PointerCoords;
+ 0 10 4 metaState I
+
+
+public java.lang.String toString();
+ Signature: ()Ljava/lang/String;
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 119: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+
+public static java.lang.String actionToString(int);
+ Signature: (I)Ljava/lang/String;
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 120: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 action I
+
+
+public static java.lang.String axisToString(int);
+ Signature: (I)Ljava/lang/String;
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 121: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 axis I
+
+
+public static int axisFromString(java.lang.String);
+ Signature: (Ljava/lang/String;)I
+ Code:
+ Stack=3, Locals=1, Args_size=1
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 122: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 symbolicName Ljava/lang/String;
+
+
+public void writeToParcel(android.os.Parcel, int);
+ Signature: (Landroid/os/Parcel;I)V
+ Code:
+ Stack=3, Locals=3, Args_size=3
+ 0: new #2; //class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3; //String Stub!
+ 6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 123: 0
+
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 out Landroid/os/Parcel;
+ 0 10 2 flags I
+
+
+static {};
+ Signature: ()V
+ Code:
+ Stack=1, Locals=0, Args_size=0
+ 0: aconst_null
+ 1: putstatic #5; //Field CREATOR:Landroid/os/Parcelable$Creator;
+ 4: return
+ LineNumberTable:
+ line 213: 0
+
+
+}
+
diff --git a/chromium/base/android/jni_generator/golden/testMotionEvent.javap7 b/chromium/base/android/jni_generator/golden/testMotionEvent.javap7
new file mode 100644
index 00000000000..f4f54443696
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/testMotionEvent.javap7
@@ -0,0 +1,2370 @@
+Classfile out_android/Debug/gen/content/jni/android/view/MotionEvent.class
+ Last modified Feb 27, 2014; size 13369 bytes
+ MD5 checksum 3718d77a994cb8aceb7b35c5df3c4dd1
+ Compiled from "MotionEvent.java"
+public final class android.view.MotionEvent extends android.view.InputEvent implements android.os.Parcelable
+ SourceFile: "MotionEvent.java"
+ InnerClasses:
+ public static final #10= #9 of #6; //PointerProperties=class android/view/MotionEvent$PointerProperties of class android/view/MotionEvent
+ public static final #13= #12 of #6; //PointerCoords=class android/view/MotionEvent$PointerCoords of class android/view/MotionEvent
+ public static #150= #149 of #8; //Creator=class android/os/Parcelable$Creator of class android/os/Parcelable
+ minor version: 0
+ major version: 49
+ flags: ACC_PUBLIC, ACC_FINAL, ACC_SUPER
+Constant pool:
+ #1 = Methodref #7.#293 // android/view/InputEvent."<init>":()V
+ #2 = Class #294 // java/lang/RuntimeException
+ #3 = String #295 // Stub!
+ #4 = Methodref #2.#296 // java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ #5 = Fieldref #6.#297 // android/view/MotionEvent.CREATOR:Landroid/os/Parcelable$Creator;
+ #6 = Class #298 // android/view/MotionEvent
+ #7 = Class #299 // android/view/InputEvent
+ #8 = Class #300 // android/os/Parcelable
+ #9 = Class #301 // android/view/MotionEvent$PointerProperties
+ #10 = Utf8 PointerProperties
+ #11 = Utf8 InnerClasses
+ #12 = Class #302 // android/view/MotionEvent$PointerCoords
+ #13 = Utf8 PointerCoords
+ #14 = Utf8 INVALID_POINTER_ID
+ #15 = Utf8 I
+ #16 = Utf8 ConstantValue
+ #17 = Integer -1
+ #18 = Utf8 ACTION_MASK
+ #19 = Integer 255
+ #20 = Utf8 ACTION_DOWN
+ #21 = Integer 0
+ #22 = Utf8 ACTION_UP
+ #23 = Integer 1
+ #24 = Utf8 ACTION_MOVE
+ #25 = Integer 2
+ #26 = Utf8 ACTION_CANCEL
+ #27 = Integer 3
+ #28 = Utf8 ACTION_OUTSIDE
+ #29 = Integer 4
+ #30 = Utf8 ACTION_POINTER_DOWN
+ #31 = Integer 5
+ #32 = Utf8 ACTION_POINTER_UP
+ #33 = Integer 6
+ #34 = Utf8 ACTION_HOVER_MOVE
+ #35 = Integer 7
+ #36 = Utf8 ACTION_SCROLL
+ #37 = Integer 8
+ #38 = Utf8 ACTION_HOVER_ENTER
+ #39 = Integer 9
+ #40 = Utf8 ACTION_HOVER_EXIT
+ #41 = Integer 10
+ #42 = Utf8 ACTION_POINTER_INDEX_MASK
+ #43 = Integer 65280
+ #44 = Utf8 ACTION_POINTER_INDEX_SHIFT
+ #45 = Utf8 ACTION_POINTER_1_DOWN
+ #46 = Utf8 Deprecated
+ #47 = Utf8 RuntimeVisibleAnnotations
+ #48 = Utf8 Ljava/lang/Deprecated;
+ #49 = Utf8 ACTION_POINTER_2_DOWN
+ #50 = Integer 261
+ #51 = Utf8 ACTION_POINTER_3_DOWN
+ #52 = Integer 517
+ #53 = Utf8 ACTION_POINTER_1_UP
+ #54 = Utf8 ACTION_POINTER_2_UP
+ #55 = Integer 262
+ #56 = Utf8 ACTION_POINTER_3_UP
+ #57 = Integer 518
+ #58 = Utf8 ACTION_POINTER_ID_MASK
+ #59 = Utf8 ACTION_POINTER_ID_SHIFT
+ #60 = Utf8 FLAG_WINDOW_IS_OBSCURED
+ #61 = Utf8 EDGE_TOP
+ #62 = Utf8 EDGE_BOTTOM
+ #63 = Utf8 EDGE_LEFT
+ #64 = Utf8 EDGE_RIGHT
+ #65 = Utf8 AXIS_X
+ #66 = Utf8 AXIS_Y
+ #67 = Utf8 AXIS_PRESSURE
+ #68 = Utf8 AXIS_SIZE
+ #69 = Utf8 AXIS_TOUCH_MAJOR
+ #70 = Utf8 AXIS_TOUCH_MINOR
+ #71 = Utf8 AXIS_TOOL_MAJOR
+ #72 = Utf8 AXIS_TOOL_MINOR
+ #73 = Utf8 AXIS_ORIENTATION
+ #74 = Utf8 AXIS_VSCROLL
+ #75 = Utf8 AXIS_HSCROLL
+ #76 = Utf8 AXIS_Z
+ #77 = Integer 11
+ #78 = Utf8 AXIS_RX
+ #79 = Integer 12
+ #80 = Utf8 AXIS_RY
+ #81 = Integer 13
+ #82 = Utf8 AXIS_RZ
+ #83 = Integer 14
+ #84 = Utf8 AXIS_HAT_X
+ #85 = Integer 15
+ #86 = Utf8 AXIS_HAT_Y
+ #87 = Integer 16
+ #88 = Utf8 AXIS_LTRIGGER
+ #89 = Integer 17
+ #90 = Utf8 AXIS_RTRIGGER
+ #91 = Integer 18
+ #92 = Utf8 AXIS_THROTTLE
+ #93 = Integer 19
+ #94 = Utf8 AXIS_RUDDER
+ #95 = Integer 20
+ #96 = Utf8 AXIS_WHEEL
+ #97 = Integer 21
+ #98 = Utf8 AXIS_GAS
+ #99 = Integer 22
+ #100 = Utf8 AXIS_BRAKE
+ #101 = Integer 23
+ #102 = Utf8 AXIS_DISTANCE
+ #103 = Integer 24
+ #104 = Utf8 AXIS_TILT
+ #105 = Integer 25
+ #106 = Utf8 AXIS_GENERIC_1
+ #107 = Integer 32
+ #108 = Utf8 AXIS_GENERIC_2
+ #109 = Integer 33
+ #110 = Utf8 AXIS_GENERIC_3
+ #111 = Integer 34
+ #112 = Utf8 AXIS_GENERIC_4
+ #113 = Integer 35
+ #114 = Utf8 AXIS_GENERIC_5
+ #115 = Integer 36
+ #116 = Utf8 AXIS_GENERIC_6
+ #117 = Integer 37
+ #118 = Utf8 AXIS_GENERIC_7
+ #119 = Integer 38
+ #120 = Utf8 AXIS_GENERIC_8
+ #121 = Integer 39
+ #122 = Utf8 AXIS_GENERIC_9
+ #123 = Integer 40
+ #124 = Utf8 AXIS_GENERIC_10
+ #125 = Integer 41
+ #126 = Utf8 AXIS_GENERIC_11
+ #127 = Integer 42
+ #128 = Utf8 AXIS_GENERIC_12
+ #129 = Integer 43
+ #130 = Utf8 AXIS_GENERIC_13
+ #131 = Integer 44
+ #132 = Utf8 AXIS_GENERIC_14
+ #133 = Integer 45
+ #134 = Utf8 AXIS_GENERIC_15
+ #135 = Integer 46
+ #136 = Utf8 AXIS_GENERIC_16
+ #137 = Integer 47
+ #138 = Utf8 BUTTON_PRIMARY
+ #139 = Utf8 BUTTON_SECONDARY
+ #140 = Utf8 BUTTON_TERTIARY
+ #141 = Utf8 BUTTON_BACK
+ #142 = Utf8 BUTTON_FORWARD
+ #143 = Utf8 TOOL_TYPE_UNKNOWN
+ #144 = Utf8 TOOL_TYPE_FINGER
+ #145 = Utf8 TOOL_TYPE_STYLUS
+ #146 = Utf8 TOOL_TYPE_MOUSE
+ #147 = Utf8 TOOL_TYPE_ERASER
+ #148 = Utf8 CREATOR
+ #149 = Class #303 // android/os/Parcelable$Creator
+ #150 = Utf8 Creator
+ #151 = Utf8 Landroid/os/Parcelable$Creator;
+ #152 = Utf8 Signature
+ #153 = Utf8 Landroid/os/Parcelable$Creator<Landroid/view/MotionEvent;>;
+ #154 = Utf8 <init>
+ #155 = Utf8 ()V
+ #156 = Utf8 Code
+ #157 = Utf8 LineNumberTable
+ #158 = Utf8 LocalVariableTable
+ #159 = Utf8 this
+ #160 = Utf8 Landroid/view/MotionEvent;
+ #161 = Utf8 finalize
+ #162 = Utf8 Exceptions
+ #163 = Class #304 // java/lang/Throwable
+ #164 = Utf8 obtain
+ #165 = Utf8 (JJII[Landroid/view/MotionEvent$PointerProperties;[Landroid/view/MotionEvent$PointerCoords;IIFFIIII)Landroid/view/MotionEvent;
+ #166 = Utf8 downTime
+ #167 = Utf8 J
+ #168 = Utf8 eventTime
+ #169 = Utf8 action
+ #170 = Utf8 pointerCount
+ #171 = Utf8 pointerProperties
+ #172 = Utf8 [Landroid/view/MotionEvent$PointerProperties;
+ #173 = Utf8 pointerCoords
+ #174 = Utf8 [Landroid/view/MotionEvent$PointerCoords;
+ #175 = Utf8 metaState
+ #176 = Utf8 buttonState
+ #177 = Utf8 xPrecision
+ #178 = Utf8 F
+ #179 = Utf8 yPrecision
+ #180 = Utf8 deviceId
+ #181 = Utf8 edgeFlags
+ #182 = Utf8 source
+ #183 = Utf8 flags
+ #184 = Utf8 (JJII[I[Landroid/view/MotionEvent$PointerCoords;IFFIIII)Landroid/view/MotionEvent;
+ #185 = Utf8 pointerIds
+ #186 = Utf8 [I
+ #187 = Utf8 (JJIFFFFIFFII)Landroid/view/MotionEvent;
+ #188 = Utf8 x
+ #189 = Utf8 y
+ #190 = Utf8 pressure
+ #191 = Utf8 size
+ #192 = Utf8 (JJIIFFFFIFFII)Landroid/view/MotionEvent;
+ #193 = Utf8 (JJIFFI)Landroid/view/MotionEvent;
+ #194 = Utf8 (Landroid/view/MotionEvent;)Landroid/view/MotionEvent;
+ #195 = Utf8 other
+ #196 = Utf8 obtainNoHistory
+ #197 = Utf8 recycle
+ #198 = Utf8 getDeviceId
+ #199 = Utf8 ()I
+ #200 = Utf8 getSource
+ #201 = Utf8 setSource
+ #202 = Utf8 (I)V
+ #203 = Utf8 getAction
+ #204 = Utf8 getActionMasked
+ #205 = Utf8 getActionIndex
+ #206 = Utf8 getFlags
+ #207 = Utf8 getDownTime
+ #208 = Utf8 ()J
+ #209 = Utf8 getEventTime
+ #210 = Utf8 getX
+ #211 = Utf8 ()F
+ #212 = Utf8 getY
+ #213 = Utf8 getPressure
+ #214 = Utf8 getSize
+ #215 = Utf8 getTouchMajor
+ #216 = Utf8 getTouchMinor
+ #217 = Utf8 getToolMajor
+ #218 = Utf8 getToolMinor
+ #219 = Utf8 getOrientation
+ #220 = Utf8 getAxisValue
+ #221 = Utf8 (I)F
+ #222 = Utf8 axis
+ #223 = Utf8 getPointerCount
+ #224 = Utf8 getPointerId
+ #225 = Utf8 (I)I
+ #226 = Utf8 pointerIndex
+ #227 = Utf8 getToolType
+ #228 = Utf8 findPointerIndex
+ #229 = Utf8 pointerId
+ #230 = Utf8 (II)F
+ #231 = Utf8 getPointerCoords
+ #232 = Utf8 (ILandroid/view/MotionEvent$PointerCoords;)V
+ #233 = Utf8 outPointerCoords
+ #234 = Utf8 Landroid/view/MotionEvent$PointerCoords;
+ #235 = Utf8 getPointerProperties
+ #236 = Utf8 (ILandroid/view/MotionEvent$PointerProperties;)V
+ #237 = Utf8 outPointerProperties
+ #238 = Utf8 Landroid/view/MotionEvent$PointerProperties;
+ #239 = Utf8 getMetaState
+ #240 = Utf8 getButtonState
+ #241 = Utf8 getRawX
+ #242 = Utf8 getRawY
+ #243 = Utf8 getXPrecision
+ #244 = Utf8 getYPrecision
+ #245 = Utf8 getHistorySize
+ #246 = Utf8 getHistoricalEventTime
+ #247 = Utf8 (I)J
+ #248 = Utf8 pos
+ #249 = Utf8 getHistoricalX
+ #250 = Utf8 getHistoricalY
+ #251 = Utf8 getHistoricalPressure
+ #252 = Utf8 getHistoricalSize
+ #253 = Utf8 getHistoricalTouchMajor
+ #254 = Utf8 getHistoricalTouchMinor
+ #255 = Utf8 getHistoricalToolMajor
+ #256 = Utf8 getHistoricalToolMinor
+ #257 = Utf8 getHistoricalOrientation
+ #258 = Utf8 getHistoricalAxisValue
+ #259 = Utf8 (III)F
+ #260 = Utf8 getHistoricalPointerCoords
+ #261 = Utf8 (IILandroid/view/MotionEvent$PointerCoords;)V
+ #262 = Utf8 getEdgeFlags
+ #263 = Utf8 setEdgeFlags
+ #264 = Utf8 setAction
+ #265 = Utf8 offsetLocation
+ #266 = Utf8 (FF)V
+ #267 = Utf8 deltaX
+ #268 = Utf8 deltaY
+ #269 = Utf8 setLocation
+ #270 = Utf8 transform
+ #271 = Utf8 (Landroid/graphics/Matrix;)V
+ #272 = Utf8 matrix
+ #273 = Utf8 Landroid/graphics/Matrix;
+ #274 = Utf8 addBatch
+ #275 = Utf8 (JFFFFI)V
+ #276 = Utf8 (J[Landroid/view/MotionEvent$PointerCoords;I)V
+ #277 = Utf8 toString
+ #278 = Utf8 ()Ljava/lang/String;
+ #279 = Utf8 actionToString
+ #280 = Utf8 (I)Ljava/lang/String;
+ #281 = Utf8 axisToString
+ #282 = Utf8 axisFromString
+ #283 = Utf8 (Ljava/lang/String;)I
+ #284 = Utf8 symbolicName
+ #285 = Utf8 Ljava/lang/String;
+ #286 = Utf8 writeToParcel
+ #287 = Utf8 (Landroid/os/Parcel;I)V
+ #288 = Utf8 out
+ #289 = Utf8 Landroid/os/Parcel;
+ #290 = Utf8 <clinit>
+ #291 = Utf8 SourceFile
+ #292 = Utf8 MotionEvent.java
+ #293 = NameAndType #154:#155 // "<init>":()V
+ #294 = Utf8 java/lang/RuntimeException
+ #295 = Utf8 Stub!
+ #296 = NameAndType #154:#305 // "<init>":(Ljava/lang/String;)V
+ #297 = NameAndType #148:#151 // CREATOR:Landroid/os/Parcelable$Creator;
+ #298 = Utf8 android/view/MotionEvent
+ #299 = Utf8 android/view/InputEvent
+ #300 = Utf8 android/os/Parcelable
+ #301 = Utf8 android/view/MotionEvent$PointerProperties
+ #302 = Utf8 android/view/MotionEvent$PointerCoords
+ #303 = Utf8 android/os/Parcelable$Creator
+ #304 = Utf8 java/lang/Throwable
+ #305 = Utf8 (Ljava/lang/String;)V
+{
+ public static final int INVALID_POINTER_ID;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int -1
+
+
+ public static final int ACTION_MASK;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 255
+
+
+ public static final int ACTION_DOWN;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 0
+
+
+ public static final int ACTION_UP;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 1
+
+
+ public static final int ACTION_MOVE;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 2
+
+
+ public static final int ACTION_CANCEL;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 3
+
+
+ public static final int ACTION_OUTSIDE;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 4
+
+
+ public static final int ACTION_POINTER_DOWN;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 5
+
+
+ public static final int ACTION_POINTER_UP;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 6
+
+
+ public static final int ACTION_HOVER_MOVE;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 7
+
+
+ public static final int ACTION_SCROLL;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 8
+
+
+ public static final int ACTION_HOVER_ENTER;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 9
+
+
+ public static final int ACTION_HOVER_EXIT;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 10
+
+
+ public static final int ACTION_POINTER_INDEX_MASK;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 65280
+
+
+ public static final int ACTION_POINTER_INDEX_SHIFT;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 8
+
+
+ public static final int ACTION_POINTER_1_DOWN;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 5
+ Deprecated: true
+ RuntimeVisibleAnnotations:
+ 0: #48()
+
+
+ public static final int ACTION_POINTER_2_DOWN;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 261
+ Deprecated: true
+ RuntimeVisibleAnnotations:
+ 0: #48()
+
+
+ public static final int ACTION_POINTER_3_DOWN;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 517
+ Deprecated: true
+ RuntimeVisibleAnnotations:
+ 0: #48()
+
+
+ public static final int ACTION_POINTER_1_UP;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 6
+ Deprecated: true
+ RuntimeVisibleAnnotations:
+ 0: #48()
+
+
+ public static final int ACTION_POINTER_2_UP;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 262
+ Deprecated: true
+ RuntimeVisibleAnnotations:
+ 0: #48()
+
+
+ public static final int ACTION_POINTER_3_UP;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 518
+ Deprecated: true
+ RuntimeVisibleAnnotations:
+ 0: #48()
+
+
+ public static final int ACTION_POINTER_ID_MASK;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 65280
+ Deprecated: true
+ RuntimeVisibleAnnotations:
+ 0: #48()
+
+
+ public static final int ACTION_POINTER_ID_SHIFT;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 8
+ Deprecated: true
+ RuntimeVisibleAnnotations:
+ 0: #48()
+
+
+ public static final int FLAG_WINDOW_IS_OBSCURED;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 1
+
+
+ public static final int EDGE_TOP;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 1
+
+
+ public static final int EDGE_BOTTOM;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 2
+
+
+ public static final int EDGE_LEFT;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 4
+
+
+ public static final int EDGE_RIGHT;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 8
+
+
+ public static final int AXIS_X;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 0
+
+
+ public static final int AXIS_Y;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 1
+
+
+ public static final int AXIS_PRESSURE;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 2
+
+
+ public static final int AXIS_SIZE;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 3
+
+
+ public static final int AXIS_TOUCH_MAJOR;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 4
+
+
+ public static final int AXIS_TOUCH_MINOR;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 5
+
+
+ public static final int AXIS_TOOL_MAJOR;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 6
+
+
+ public static final int AXIS_TOOL_MINOR;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 7
+
+
+ public static final int AXIS_ORIENTATION;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 8
+
+
+ public static final int AXIS_VSCROLL;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 9
+
+
+ public static final int AXIS_HSCROLL;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 10
+
+
+ public static final int AXIS_Z;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 11
+
+
+ public static final int AXIS_RX;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 12
+
+
+ public static final int AXIS_RY;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 13
+
+
+ public static final int AXIS_RZ;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 14
+
+
+ public static final int AXIS_HAT_X;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 15
+
+
+ public static final int AXIS_HAT_Y;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 16
+
+
+ public static final int AXIS_LTRIGGER;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 17
+
+
+ public static final int AXIS_RTRIGGER;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 18
+
+
+ public static final int AXIS_THROTTLE;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 19
+
+
+ public static final int AXIS_RUDDER;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 20
+
+
+ public static final int AXIS_WHEEL;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 21
+
+
+ public static final int AXIS_GAS;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 22
+
+
+ public static final int AXIS_BRAKE;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 23
+
+
+ public static final int AXIS_DISTANCE;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 24
+
+
+ public static final int AXIS_TILT;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 25
+
+
+ public static final int AXIS_GENERIC_1;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 32
+
+
+ public static final int AXIS_GENERIC_2;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 33
+
+
+ public static final int AXIS_GENERIC_3;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 34
+
+
+ public static final int AXIS_GENERIC_4;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 35
+
+
+ public static final int AXIS_GENERIC_5;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 36
+
+
+ public static final int AXIS_GENERIC_6;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 37
+
+
+ public static final int AXIS_GENERIC_7;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 38
+
+
+ public static final int AXIS_GENERIC_8;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 39
+
+
+ public static final int AXIS_GENERIC_9;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 40
+
+
+ public static final int AXIS_GENERIC_10;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 41
+
+
+ public static final int AXIS_GENERIC_11;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 42
+
+
+ public static final int AXIS_GENERIC_12;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 43
+
+
+ public static final int AXIS_GENERIC_13;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 44
+
+
+ public static final int AXIS_GENERIC_14;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 45
+
+
+ public static final int AXIS_GENERIC_15;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 46
+
+
+ public static final int AXIS_GENERIC_16;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 47
+
+
+ public static final int BUTTON_PRIMARY;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 1
+
+
+ public static final int BUTTON_SECONDARY;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 2
+
+
+ public static final int BUTTON_TERTIARY;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 4
+
+
+ public static final int BUTTON_BACK;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 8
+
+
+ public static final int BUTTON_FORWARD;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 16
+
+
+ public static final int TOOL_TYPE_UNKNOWN;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 0
+
+
+ public static final int TOOL_TYPE_FINGER;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 1
+
+
+ public static final int TOOL_TYPE_STYLUS;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 2
+
+
+ public static final int TOOL_TYPE_MOUSE;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 3
+
+
+ public static final int TOOL_TYPE_ERASER;
+ Signature: I
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ ConstantValue: int 4
+
+
+ public static final android.os.Parcelable$Creator<android.view.MotionEvent> CREATOR;
+ Signature: Landroid/os/Parcelable$Creator;
+ flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
+ Signature: #153 // Landroid/os/Parcelable$Creator<Landroid/view/MotionEvent;>;
+
+
+ android.view.MotionEvent();
+ Signature: ()V
+ flags:
+ Code:
+ stack=3, locals=1, args_size=1
+ 0: aload_0
+ 1: invokespecial #1 // Method android/view/InputEvent."<init>":()V
+ 4: new #2 // class java/lang/RuntimeException
+ 7: dup
+ 8: ldc #3 // String Stub!
+ 10: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 13: athrow
+ LineNumberTable:
+ line 35: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 14 0 this Landroid/view/MotionEvent;
+
+ protected void finalize() throws java.lang.Throwable;
+ Signature: ()V
+ flags: ACC_PROTECTED
+ Code:
+ stack=3, locals=1, args_size=1
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 36: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ Exceptions:
+ throws java.lang.Throwable
+
+ public static android.view.MotionEvent obtain(long, long, int, int, android.view.MotionEvent$PointerProperties[], android.view.MotionEvent$PointerCoords[], int, int, float, float, int, int, int, int);
+ Signature: (JJII[Landroid/view/MotionEvent$PointerProperties;[Landroid/view/MotionEvent$PointerCoords;IIFFIIII)Landroid/view/MotionEvent;
+ flags: ACC_PUBLIC, ACC_STATIC
+ Code:
+ stack=3, locals=16, args_size=14
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 37: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 downTime J
+ 0 10 2 eventTime J
+ 0 10 4 action I
+ 0 10 5 pointerCount I
+ 0 10 6 pointerProperties [Landroid/view/MotionEvent$PointerProperties;
+ 0 10 7 pointerCoords [Landroid/view/MotionEvent$PointerCoords;
+ 0 10 8 metaState I
+ 0 10 9 buttonState I
+ 0 10 10 xPrecision F
+ 0 10 11 yPrecision F
+ 0 10 12 deviceId I
+ 0 10 13 edgeFlags I
+ 0 10 14 source I
+ 0 10 15 flags I
+
+ public static android.view.MotionEvent obtain(long, long, int, int, int[], android.view.MotionEvent$PointerCoords[], int, float, float, int, int, int, int);
+ Signature: (JJII[I[Landroid/view/MotionEvent$PointerCoords;IFFIIII)Landroid/view/MotionEvent;
+ flags: ACC_PUBLIC, ACC_STATIC
+ Code:
+ stack=3, locals=15, args_size=13
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 39: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 downTime J
+ 0 10 2 eventTime J
+ 0 10 4 action I
+ 0 10 5 pointerCount I
+ 0 10 6 pointerIds [I
+ 0 10 7 pointerCoords [Landroid/view/MotionEvent$PointerCoords;
+ 0 10 8 metaState I
+ 0 10 9 xPrecision F
+ 0 10 10 yPrecision F
+ 0 10 11 deviceId I
+ 0 10 12 edgeFlags I
+ 0 10 13 source I
+ 0 10 14 flags I
+ Deprecated: true
+ RuntimeVisibleAnnotations:
+ 0: #48()
+
+ public static android.view.MotionEvent obtain(long, long, int, float, float, float, float, int, float, float, int, int);
+ Signature: (JJIFFFFIFFII)Landroid/view/MotionEvent;
+ flags: ACC_PUBLIC, ACC_STATIC
+ Code:
+ stack=3, locals=14, args_size=12
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 40: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 downTime J
+ 0 10 2 eventTime J
+ 0 10 4 action I
+ 0 10 5 x F
+ 0 10 6 y F
+ 0 10 7 pressure F
+ 0 10 8 size F
+ 0 10 9 metaState I
+ 0 10 10 xPrecision F
+ 0 10 11 yPrecision F
+ 0 10 12 deviceId I
+ 0 10 13 edgeFlags I
+
+ public static android.view.MotionEvent obtain(long, long, int, int, float, float, float, float, int, float, float, int, int);
+ Signature: (JJIIFFFFIFFII)Landroid/view/MotionEvent;
+ flags: ACC_PUBLIC, ACC_STATIC
+ Code:
+ stack=3, locals=15, args_size=13
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 42: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 downTime J
+ 0 10 2 eventTime J
+ 0 10 4 action I
+ 0 10 5 pointerCount I
+ 0 10 6 x F
+ 0 10 7 y F
+ 0 10 8 pressure F
+ 0 10 9 size F
+ 0 10 10 metaState I
+ 0 10 11 xPrecision F
+ 0 10 12 yPrecision F
+ 0 10 13 deviceId I
+ 0 10 14 edgeFlags I
+ Deprecated: true
+ RuntimeVisibleAnnotations:
+ 0: #48()
+
+ public static android.view.MotionEvent obtain(long, long, int, float, float, int);
+ Signature: (JJIFFI)Landroid/view/MotionEvent;
+ flags: ACC_PUBLIC, ACC_STATIC
+ Code:
+ stack=3, locals=8, args_size=6
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 43: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 downTime J
+ 0 10 2 eventTime J
+ 0 10 4 action I
+ 0 10 5 x F
+ 0 10 6 y F
+ 0 10 7 metaState I
+
+ public static android.view.MotionEvent obtain(android.view.MotionEvent);
+ Signature: (Landroid/view/MotionEvent;)Landroid/view/MotionEvent;
+ flags: ACC_PUBLIC, ACC_STATIC
+ Code:
+ stack=3, locals=1, args_size=1
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 44: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 other Landroid/view/MotionEvent;
+
+ public static android.view.MotionEvent obtainNoHistory(android.view.MotionEvent);
+ Signature: (Landroid/view/MotionEvent;)Landroid/view/MotionEvent;
+ flags: ACC_PUBLIC, ACC_STATIC
+ Code:
+ stack=3, locals=1, args_size=1
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 45: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 other Landroid/view/MotionEvent;
+
+ public final void recycle();
+ Signature: ()V
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=1, args_size=1
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 46: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+ public final int getDeviceId();
+ Signature: ()I
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=1, args_size=1
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 47: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+ public final int getSource();
+ Signature: ()I
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=1, args_size=1
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 48: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+ public final void setSource(int);
+ Signature: (I)V
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=2, args_size=2
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 49: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 source I
+
+ public final int getAction();
+ Signature: ()I
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=1, args_size=1
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 50: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+ public final int getActionMasked();
+ Signature: ()I
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=1, args_size=1
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 51: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+ public final int getActionIndex();
+ Signature: ()I
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=1, args_size=1
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 52: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+ public final int getFlags();
+ Signature: ()I
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=1, args_size=1
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 53: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+ public final long getDownTime();
+ Signature: ()J
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=1, args_size=1
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 54: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+ public final long getEventTime();
+ Signature: ()J
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=1, args_size=1
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 55: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+ public final float getX();
+ Signature: ()F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=1, args_size=1
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 56: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+ public final float getY();
+ Signature: ()F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=1, args_size=1
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 57: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+ public final float getPressure();
+ Signature: ()F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=1, args_size=1
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 58: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+ public final float getSize();
+ Signature: ()F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=1, args_size=1
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 59: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+ public final float getTouchMajor();
+ Signature: ()F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=1, args_size=1
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 60: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+ public final float getTouchMinor();
+ Signature: ()F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=1, args_size=1
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 61: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+ public final float getToolMajor();
+ Signature: ()F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=1, args_size=1
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 62: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+ public final float getToolMinor();
+ Signature: ()F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=1, args_size=1
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 63: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+ public final float getOrientation();
+ Signature: ()F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=1, args_size=1
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 64: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+ public final float getAxisValue(int);
+ Signature: (I)F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=2, args_size=2
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 65: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 axis I
+
+ public final int getPointerCount();
+ Signature: ()I
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=1, args_size=1
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 66: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+ public final int getPointerId(int);
+ Signature: (I)I
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=2, args_size=2
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 67: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+
+ public final int getToolType(int);
+ Signature: (I)I
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=2, args_size=2
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 68: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+
+ public final int findPointerIndex(int);
+ Signature: (I)I
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=2, args_size=2
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 69: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerId I
+
+ public final float getX(int);
+ Signature: (I)F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=2, args_size=2
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 70: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+
+ public final float getY(int);
+ Signature: (I)F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=2, args_size=2
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 71: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+
+ public final float getPressure(int);
+ Signature: (I)F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=2, args_size=2
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 72: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+
+ public final float getSize(int);
+ Signature: (I)F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=2, args_size=2
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 73: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+
+ public final float getTouchMajor(int);
+ Signature: (I)F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=2, args_size=2
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 74: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+
+ public final float getTouchMinor(int);
+ Signature: (I)F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=2, args_size=2
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 75: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+
+ public final float getToolMajor(int);
+ Signature: (I)F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=2, args_size=2
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 76: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+
+ public final float getToolMinor(int);
+ Signature: (I)F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=2, args_size=2
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 77: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+
+ public final float getOrientation(int);
+ Signature: (I)F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=2, args_size=2
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 78: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+
+ public final float getAxisValue(int, int);
+ Signature: (II)F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=3, args_size=3
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 79: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 axis I
+ 0 10 2 pointerIndex I
+
+ public final void getPointerCoords(int, android.view.MotionEvent$PointerCoords);
+ Signature: (ILandroid/view/MotionEvent$PointerCoords;)V
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=3, args_size=3
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 80: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+ 0 10 2 outPointerCoords Landroid/view/MotionEvent$PointerCoords;
+
+ public final void getPointerProperties(int, android.view.MotionEvent$PointerProperties);
+ Signature: (ILandroid/view/MotionEvent$PointerProperties;)V
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=3, args_size=3
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 81: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+ 0 10 2 outPointerProperties Landroid/view/MotionEvent$PointerProperties;
+
+ public final int getMetaState();
+ Signature: ()I
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=1, args_size=1
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 82: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+ public final int getButtonState();
+ Signature: ()I
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=1, args_size=1
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 83: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+ public final float getRawX();
+ Signature: ()F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=1, args_size=1
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 84: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+ public final float getRawY();
+ Signature: ()F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=1, args_size=1
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 85: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+ public final float getXPrecision();
+ Signature: ()F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=1, args_size=1
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 86: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+ public final float getYPrecision();
+ Signature: ()F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=1, args_size=1
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 87: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+ public final int getHistorySize();
+ Signature: ()I
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=1, args_size=1
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 88: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+ public final long getHistoricalEventTime(int);
+ Signature: (I)J
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=2, args_size=2
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 89: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pos I
+
+ public final float getHistoricalX(int);
+ Signature: (I)F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=2, args_size=2
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 90: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pos I
+
+ public final float getHistoricalY(int);
+ Signature: (I)F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=2, args_size=2
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 91: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pos I
+
+ public final float getHistoricalPressure(int);
+ Signature: (I)F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=2, args_size=2
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 92: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pos I
+
+ public final float getHistoricalSize(int);
+ Signature: (I)F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=2, args_size=2
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 93: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pos I
+
+ public final float getHistoricalTouchMajor(int);
+ Signature: (I)F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=2, args_size=2
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 94: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pos I
+
+ public final float getHistoricalTouchMinor(int);
+ Signature: (I)F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=2, args_size=2
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 95: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pos I
+
+ public final float getHistoricalToolMajor(int);
+ Signature: (I)F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=2, args_size=2
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 96: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pos I
+
+ public final float getHistoricalToolMinor(int);
+ Signature: (I)F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=2, args_size=2
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 97: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pos I
+
+ public final float getHistoricalOrientation(int);
+ Signature: (I)F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=2, args_size=2
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 98: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pos I
+
+ public final float getHistoricalAxisValue(int, int);
+ Signature: (II)F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=3, args_size=3
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 99: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 axis I
+ 0 10 2 pos I
+
+ public final float getHistoricalX(int, int);
+ Signature: (II)F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=3, args_size=3
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 100: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+ 0 10 2 pos I
+
+ public final float getHistoricalY(int, int);
+ Signature: (II)F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=3, args_size=3
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 101: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+ 0 10 2 pos I
+
+ public final float getHistoricalPressure(int, int);
+ Signature: (II)F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=3, args_size=3
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 102: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+ 0 10 2 pos I
+
+ public final float getHistoricalSize(int, int);
+ Signature: (II)F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=3, args_size=3
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 103: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+ 0 10 2 pos I
+
+ public final float getHistoricalTouchMajor(int, int);
+ Signature: (II)F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=3, args_size=3
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 104: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+ 0 10 2 pos I
+
+ public final float getHistoricalTouchMinor(int, int);
+ Signature: (II)F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=3, args_size=3
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 105: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+ 0 10 2 pos I
+
+ public final float getHistoricalToolMajor(int, int);
+ Signature: (II)F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=3, args_size=3
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 106: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+ 0 10 2 pos I
+
+ public final float getHistoricalToolMinor(int, int);
+ Signature: (II)F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=3, args_size=3
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 107: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+ 0 10 2 pos I
+
+ public final float getHistoricalOrientation(int, int);
+ Signature: (II)F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=3, args_size=3
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 108: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+ 0 10 2 pos I
+
+ public final float getHistoricalAxisValue(int, int, int);
+ Signature: (III)F
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=4, args_size=4
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 109: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 axis I
+ 0 10 2 pointerIndex I
+ 0 10 3 pos I
+
+ public final void getHistoricalPointerCoords(int, int, android.view.MotionEvent$PointerCoords);
+ Signature: (IILandroid/view/MotionEvent$PointerCoords;)V
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=4, args_size=4
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 110: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 pointerIndex I
+ 0 10 2 pos I
+ 0 10 3 outPointerCoords Landroid/view/MotionEvent$PointerCoords;
+
+ public final int getEdgeFlags();
+ Signature: ()I
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=1, args_size=1
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 111: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+ public final void setEdgeFlags(int);
+ Signature: (I)V
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=2, args_size=2
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 112: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 flags I
+
+ public final void setAction(int);
+ Signature: (I)V
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=2, args_size=2
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 113: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 action I
+
+ public final void offsetLocation(float, float);
+ Signature: (FF)V
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=3, args_size=3
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 114: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 deltaX F
+ 0 10 2 deltaY F
+
+ public final void setLocation(float, float);
+ Signature: (FF)V
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=3, args_size=3
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 115: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 x F
+ 0 10 2 y F
+
+ public final void transform(android.graphics.Matrix);
+ Signature: (Landroid/graphics/Matrix;)V
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=2, args_size=2
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 116: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 matrix Landroid/graphics/Matrix;
+
+ public final void addBatch(long, float, float, float, float, int);
+ Signature: (JFFFFI)V
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=8, args_size=7
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 117: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 eventTime J
+ 0 10 3 x F
+ 0 10 4 y F
+ 0 10 5 pressure F
+ 0 10 6 size F
+ 0 10 7 metaState I
+
+ public final void addBatch(long, android.view.MotionEvent$PointerCoords[], int);
+ Signature: (J[Landroid/view/MotionEvent$PointerCoords;I)V
+ flags: ACC_PUBLIC, ACC_FINAL
+ Code:
+ stack=3, locals=5, args_size=4
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 118: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 eventTime J
+ 0 10 3 pointerCoords [Landroid/view/MotionEvent$PointerCoords;
+ 0 10 4 metaState I
+
+ public java.lang.String toString();
+ Signature: ()Ljava/lang/String;
+ flags: ACC_PUBLIC
+ Code:
+ stack=3, locals=1, args_size=1
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 119: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+
+ public static java.lang.String actionToString(int);
+ Signature: (I)Ljava/lang/String;
+ flags: ACC_PUBLIC, ACC_STATIC
+ Code:
+ stack=3, locals=1, args_size=1
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 120: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 action I
+
+ public static java.lang.String axisToString(int);
+ Signature: (I)Ljava/lang/String;
+ flags: ACC_PUBLIC, ACC_STATIC
+ Code:
+ stack=3, locals=1, args_size=1
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 121: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 axis I
+
+ public static int axisFromString(java.lang.String);
+ Signature: (Ljava/lang/String;)I
+ flags: ACC_PUBLIC, ACC_STATIC
+ Code:
+ stack=3, locals=1, args_size=1
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 122: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 symbolicName Ljava/lang/String;
+
+ public void writeToParcel(android.os.Parcel, int);
+ Signature: (Landroid/os/Parcel;I)V
+ flags: ACC_PUBLIC
+ Code:
+ stack=3, locals=3, args_size=3
+ 0: new #2 // class java/lang/RuntimeException
+ 3: dup
+ 4: ldc #3 // String Stub!
+ 6: invokespecial #4 // Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
+ 9: athrow
+ LineNumberTable:
+ line 123: 0
+ LocalVariableTable:
+ Start Length Slot Name Signature
+ 0 10 0 this Landroid/view/MotionEvent;
+ 0 10 1 out Landroid/os/Parcel;
+ 0 10 2 flags I
+
+ static {};
+ Signature: ()V
+ flags: ACC_STATIC
+ Code:
+ stack=1, locals=0, args_size=0
+ 0: aconst_null
+ 1: putstatic #5 // Field CREATOR:Landroid/os/Parcelable$Creator;
+ 4: return
+ LineNumberTable:
+ line 213: 0
+}
diff --git a/chromium/base/android/jni_generator/golden/testMultipleJNIAdditionalImport.golden b/chromium/base/android/jni_generator/golden/testMultipleJNIAdditionalImport.golden
new file mode 100644
index 00000000000..5398b320b5a
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/testMultipleJNIAdditionalImport.golden
@@ -0,0 +1,71 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_generator.py
+// For
+// org/chromium/foo/Foo
+
+#ifndef org_chromium_foo_Foo_JNI
+#define org_chromium_foo_Foo_JNI
+
+#include <jni.h>
+
+#include "base/android/jni_generator/jni_generator_helper.h"
+
+
+// Step 1: Forward declarations.
+
+JNI_REGISTRATION_EXPORT extern const char kClassPath_org_chromium_foo_Foo[];
+const char kClassPath_org_chromium_foo_Foo[] = "org/chromium/foo/Foo";
+// Leaking this jclass as we cannot use LazyInstance from some threads.
+JNI_REGISTRATION_EXPORT std::atomic<jclass> g_org_chromium_foo_Foo_clazz(nullptr);
+#ifndef org_chromium_foo_Foo_clazz_defined
+#define org_chromium_foo_Foo_clazz_defined
+inline jclass org_chromium_foo_Foo_clazz(JNIEnv* env) {
+ return base::android::LazyGetClass(env, kClassPath_org_chromium_foo_Foo,
+ &g_org_chromium_foo_Foo_clazz);
+}
+#endif
+
+
+// Step 2: Constants (optional).
+
+
+// Step 3: Method stubs.
+static void JNI_Foo_DoSomething(JNIEnv* env, const base::android::JavaParamRef<jobject>& callback1,
+ const base::android::JavaParamRef<jobject>& callback2);
+
+JNI_GENERATOR_EXPORT void Java_org_chromium_foo_Foo_nativeDoSomething(
+ JNIEnv* env,
+ jclass jcaller,
+ jobject callback1,
+ jobject callback2) {
+ return JNI_Foo_DoSomething(env, base::android::JavaParamRef<jobject>(env, callback1),
+ base::android::JavaParamRef<jobject>(env, callback2));
+}
+
+
+static std::atomic<jmethodID> g_org_chromium_foo_Foo_calledByNative(nullptr);
+static void Java_Foo_calledByNative(JNIEnv* env, const base::android::JavaRef<jobject>& callback1,
+ const base::android::JavaRef<jobject>& callback2) {
+ jclass clazz = org_chromium_foo_Foo_clazz(env);
+ CHECK_CLAZZ(env, clazz,
+ org_chromium_foo_Foo_clazz(env));
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_STATIC>(
+ env,
+ clazz,
+ "calledByNative",
+ "(Lorg/chromium/foo/Bar1$Callback;Lorg/chromium/foo/Bar2$Callback;)V",
+ &g_org_chromium_foo_Foo_calledByNative);
+
+ env->CallStaticVoidMethod(clazz,
+ call_context.base.method_id, callback1.obj(), callback2.obj());
+}
+
+#endif // org_chromium_foo_Foo_JNI
diff --git a/chromium/base/android/jni_generator/golden/testNativeExportsOnlyOption.golden b/chromium/base/android/jni_generator/golden/testNativeExportsOnlyOption.golden
new file mode 100644
index 00000000000..08b6ec4ee22
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/testNativeExportsOnlyOption.golden
@@ -0,0 +1,229 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_generator.py
+// For
+// org/chromium/example/jni_generator/SampleForTests
+
+#ifndef org_chromium_example_jni_generator_SampleForTests_JNI
+#define org_chromium_example_jni_generator_SampleForTests_JNI
+
+#include <jni.h>
+
+#include "base/android/jni_generator/jni_generator_helper.h"
+
+
+// Step 1: Forward declarations.
+
+JNI_REGISTRATION_EXPORT extern const char
+ kClassPath_org_chromium_example_jni_1generator_SampleForTests[];
+const char kClassPath_org_chromium_example_jni_1generator_SampleForTests[] =
+ "org/chromium/example/jni_generator/SampleForTests";
+
+JNI_REGISTRATION_EXPORT extern const char
+ kClassPath_org_chromium_example_jni_1generator_SampleForTests_00024MyInnerClass[];
+const char kClassPath_org_chromium_example_jni_1generator_SampleForTests_00024MyInnerClass[] =
+ "org/chromium/example/jni_generator/SampleForTests$MyInnerClass";
+
+JNI_REGISTRATION_EXPORT extern const char
+ kClassPath_org_chromium_example_jni_1generator_SampleForTests_00024MyOtherInnerClass[];
+const char kClassPath_org_chromium_example_jni_1generator_SampleForTests_00024MyOtherInnerClass[] =
+ "org/chromium/example/jni_generator/SampleForTests$MyOtherInnerClass";
+// Leaking this jclass as we cannot use LazyInstance from some threads.
+JNI_REGISTRATION_EXPORT std::atomic<jclass>
+ g_org_chromium_example_jni_1generator_SampleForTests_clazz(nullptr);
+#ifndef org_chromium_example_jni_1generator_SampleForTests_clazz_defined
+#define org_chromium_example_jni_1generator_SampleForTests_clazz_defined
+inline jclass org_chromium_example_jni_1generator_SampleForTests_clazz(JNIEnv* env) {
+ return base::android::LazyGetClass(env,
+ kClassPath_org_chromium_example_jni_1generator_SampleForTests,
+ &g_org_chromium_example_jni_1generator_SampleForTests_clazz);
+}
+#endif
+// Leaking this jclass as we cannot use LazyInstance from some threads.
+JNI_REGISTRATION_EXPORT std::atomic<jclass>
+ g_org_chromium_example_jni_1generator_SampleForTests_00024MyInnerClass_clazz(nullptr);
+#ifndef org_chromium_example_jni_1generator_SampleForTests_00024MyInnerClass_clazz_defined
+#define org_chromium_example_jni_1generator_SampleForTests_00024MyInnerClass_clazz_defined
+inline jclass org_chromium_example_jni_1generator_SampleForTests_00024MyInnerClass_clazz(JNIEnv*
+ env) {
+ return base::android::LazyGetClass(env,
+ kClassPath_org_chromium_example_jni_1generator_SampleForTests_00024MyInnerClass,
+ &g_org_chromium_example_jni_1generator_SampleForTests_00024MyInnerClass_clazz);
+}
+#endif
+// Leaking this jclass as we cannot use LazyInstance from some threads.
+JNI_REGISTRATION_EXPORT std::atomic<jclass>
+ g_org_chromium_example_jni_1generator_SampleForTests_00024MyOtherInnerClass_clazz(nullptr);
+#ifndef org_chromium_example_jni_1generator_SampleForTests_00024MyOtherInnerClass_clazz_defined
+#define org_chromium_example_jni_1generator_SampleForTests_00024MyOtherInnerClass_clazz_defined
+inline jclass
+ org_chromium_example_jni_1generator_SampleForTests_00024MyOtherInnerClass_clazz(JNIEnv* env) {
+ return base::android::LazyGetClass(env,
+ kClassPath_org_chromium_example_jni_1generator_SampleForTests_00024MyOtherInnerClass,
+ &g_org_chromium_example_jni_1generator_SampleForTests_00024MyOtherInnerClass_clazz);
+}
+#endif
+
+
+// Step 2: Constants (optional).
+
+
+// Step 3: Method stubs.
+JNI_GENERATOR_EXPORT jint
+ Java_org_chromium_example_jni_1generator_SampleForTests_nativeStaticMethod(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong nativeTest,
+ jint arg1) {
+ Test* native = reinterpret_cast<Test*>(nativeTest);
+ CHECK_NATIVE_PTR(env, jcaller, native, "StaticMethod", 0);
+ return native->StaticMethod(env, arg1);
+}
+
+JNI_GENERATOR_EXPORT jint Java_org_chromium_example_jni_1generator_SampleForTests_nativeMethod(
+ JNIEnv* env,
+ jobject jcaller,
+ jlong nativeTest,
+ jint arg1) {
+ Test* native = reinterpret_cast<Test*>(nativeTest);
+ CHECK_NATIVE_PTR(env, jcaller, native, "Method", 0);
+ return native->Method(env, base::android::JavaParamRef<jobject>(env, jcaller), arg1);
+}
+
+static jint JNI_MyInnerClass_Init(JNIEnv* env, const base::android::JavaParamRef<jobject>& jcaller);
+
+JNI_GENERATOR_EXPORT jint
+ Java_org_chromium_example_jni_1generator_SampleForTests_00024MyInnerClass_nativeInit(
+ JNIEnv* env,
+ jobject jcaller) {
+ return JNI_MyInnerClass_Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
+}
+
+static jint JNI_MyOtherInnerClass_Init(JNIEnv* env, const base::android::JavaParamRef<jobject>&
+ jcaller);
+
+JNI_GENERATOR_EXPORT jint
+ Java_org_chromium_example_jni_1generator_SampleForTests_00024MyOtherInnerClass_nativeInit(
+ JNIEnv* env,
+ jobject jcaller) {
+ return JNI_MyOtherInnerClass_Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
+}
+
+
+static std::atomic<jmethodID>
+ g_org_chromium_example_jni_1generator_SampleForTests_testMethodWithParam(nullptr);
+static void Java_SampleForTests_testMethodWithParam(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper iParam) {
+ jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_example_jni_1generator_SampleForTests_clazz(env));
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "testMethodWithParam",
+ "(I)V",
+ &g_org_chromium_example_jni_1generator_SampleForTests_testMethodWithParam);
+
+ env->CallVoidMethod(obj.obj(),
+ call_context.base.method_id, as_jint(iParam));
+}
+
+static std::atomic<jmethodID>
+ g_org_chromium_example_jni_1generator_SampleForTests_testMethodWithParamAndReturn(nullptr);
+static base::android::ScopedJavaLocalRef<jstring>
+ Java_SampleForTests_testMethodWithParamAndReturn(JNIEnv* env, const
+ base::android::JavaRef<jobject>& obj, JniIntWrapper iParam) {
+ jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_example_jni_1generator_SampleForTests_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "testMethodWithParamAndReturn",
+ "(I)Ljava/lang/String;",
+ &g_org_chromium_example_jni_1generator_SampleForTests_testMethodWithParamAndReturn);
+
+ jstring ret =
+ static_cast<jstring>(env->CallObjectMethod(obj.obj(),
+ call_context.base.method_id, as_jint(iParam)));
+ return base::android::ScopedJavaLocalRef<jstring>(env, ret);
+}
+
+static std::atomic<jmethodID>
+ g_org_chromium_example_jni_1generator_SampleForTests_testStaticMethodWithParam(nullptr);
+static jint Java_SampleForTests_testStaticMethodWithParam(JNIEnv* env, JniIntWrapper iParam) {
+ jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
+ CHECK_CLAZZ(env, clazz,
+ org_chromium_example_jni_1generator_SampleForTests_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_STATIC>(
+ env,
+ clazz,
+ "testStaticMethodWithParam",
+ "(I)I",
+ &g_org_chromium_example_jni_1generator_SampleForTests_testStaticMethodWithParam);
+
+ jint ret =
+ env->CallStaticIntMethod(clazz,
+ call_context.base.method_id, as_jint(iParam));
+ return ret;
+}
+
+static std::atomic<jmethodID>
+ g_org_chromium_example_jni_1generator_SampleForTests_testMethodWithNoParam(nullptr);
+static jdouble Java_SampleForTests_testMethodWithNoParam(JNIEnv* env) {
+ jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
+ CHECK_CLAZZ(env, clazz,
+ org_chromium_example_jni_1generator_SampleForTests_clazz(env), 0);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_STATIC>(
+ env,
+ clazz,
+ "testMethodWithNoParam",
+ "()D",
+ &g_org_chromium_example_jni_1generator_SampleForTests_testMethodWithNoParam);
+
+ jdouble ret =
+ env->CallStaticDoubleMethod(clazz,
+ call_context.base.method_id);
+ return ret;
+}
+
+static std::atomic<jmethodID>
+ g_org_chromium_example_jni_1generator_SampleForTests_testStaticMethodWithNoParam(nullptr);
+static base::android::ScopedJavaLocalRef<jstring>
+ Java_SampleForTests_testStaticMethodWithNoParam(JNIEnv* env) {
+ jclass clazz = org_chromium_example_jni_1generator_SampleForTests_clazz(env);
+ CHECK_CLAZZ(env, clazz,
+ org_chromium_example_jni_1generator_SampleForTests_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_STATIC>(
+ env,
+ clazz,
+ "testStaticMethodWithNoParam",
+ "()Ljava/lang/String;",
+ &g_org_chromium_example_jni_1generator_SampleForTests_testStaticMethodWithNoParam);
+
+ jstring ret =
+ static_cast<jstring>(env->CallStaticObjectMethod(clazz,
+ call_context.base.method_id));
+ return base::android::ScopedJavaLocalRef<jstring>(env, ret);
+}
+
+#endif // org_chromium_example_jni_generator_SampleForTests_JNI
diff --git a/chromium/base/android/jni_generator/golden/testNatives.golden b/chromium/base/android/jni_generator/golden/testNatives.golden
new file mode 100644
index 00000000000..23629f15a5f
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/testNatives.golden
@@ -0,0 +1,216 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_generator.py
+// For
+// org/chromium/TestJni
+
+#ifndef org_chromium_TestJni_JNI
+#define org_chromium_TestJni_JNI
+
+#include <jni.h>
+
+#include "base/android/jni_generator/jni_generator_helper.h"
+
+
+// Step 1: Forward declarations.
+
+JNI_REGISTRATION_EXPORT extern const char kClassPath_org_chromium_TestJni[];
+const char kClassPath_org_chromium_TestJni[] = "org/chromium/TestJni";
+// Leaking this jclass as we cannot use LazyInstance from some threads.
+JNI_REGISTRATION_EXPORT std::atomic<jclass> g_org_chromium_TestJni_clazz(nullptr);
+#ifndef org_chromium_TestJni_clazz_defined
+#define org_chromium_TestJni_clazz_defined
+inline jclass org_chromium_TestJni_clazz(JNIEnv* env) {
+ return base::android::LazyGetClass(env, kClassPath_org_chromium_TestJni,
+ &g_org_chromium_TestJni_clazz);
+}
+#endif
+
+
+// Step 2: Constants (optional).
+
+
+// Step 3: Method stubs.
+static jint JNI_TestJni_Init(JNIEnv* env, const base::android::JavaParamRef<jobject>& jcaller);
+
+JNI_GENERATOR_EXPORT jint Java_org_chromium_TestJni_nativeInit(
+ JNIEnv* env,
+ jobject jcaller) {
+ return JNI_TestJni_Init(env, base::android::JavaParamRef<jobject>(env, jcaller));
+}
+
+JNI_GENERATOR_EXPORT void Java_org_chromium_TestJni_nativeDestroy(
+ JNIEnv* env,
+ jobject jcaller,
+ jint nativeChromeBrowserProvider) {
+ ChromeBrowserProvider* native =
+ reinterpret_cast<ChromeBrowserProvider*>(nativeChromeBrowserProvider);
+ CHECK_NATIVE_PTR(env, jcaller, native, "Destroy");
+ return native->Destroy(env, base::android::JavaParamRef<jobject>(env, jcaller));
+}
+
+JNI_GENERATOR_EXPORT jlong Java_org_chromium_TestJni_nativeAddBookmark(
+ JNIEnv* env,
+ jobject jcaller,
+ jint nativeChromeBrowserProvider,
+ jstring url,
+ jstring title,
+ jboolean isFolder,
+ jlong parentId) {
+ ChromeBrowserProvider* native =
+ reinterpret_cast<ChromeBrowserProvider*>(nativeChromeBrowserProvider);
+ CHECK_NATIVE_PTR(env, jcaller, native, "AddBookmark", 0);
+ return native->AddBookmark(env, base::android::JavaParamRef<jobject>(env, jcaller),
+ base::android::JavaParamRef<jstring>(env, url), base::android::JavaParamRef<jstring>(env,
+ title), isFolder, parentId);
+}
+
+static base::android::ScopedJavaLocalRef<jstring> JNI_TestJni_GetDomainAndRegistry(JNIEnv* env,
+ const base::android::JavaParamRef<jstring>& url);
+
+JNI_GENERATOR_EXPORT jstring Java_org_chromium_TestJni_nativeGetDomainAndRegistry(
+ JNIEnv* env,
+ jclass jcaller,
+ jstring url) {
+ return JNI_TestJni_GetDomainAndRegistry(env, base::android::JavaParamRef<jstring>(env,
+ url)).Release();
+}
+
+static void JNI_TestJni_CreateHistoricalTabFromState(JNIEnv* env, const
+ base::android::JavaParamRef<jbyteArray>& state,
+ jint tab_index);
+
+JNI_GENERATOR_EXPORT void Java_org_chromium_TestJni_nativeCreateHistoricalTabFromState(
+ JNIEnv* env,
+ jclass jcaller,
+ jbyteArray state,
+ jint tab_index) {
+ return JNI_TestJni_CreateHistoricalTabFromState(env, base::android::JavaParamRef<jbyteArray>(env,
+ state), tab_index);
+}
+
+static base::android::ScopedJavaLocalRef<jbyteArray> JNI_TestJni_GetStateAsByteArray(JNIEnv* env,
+ const base::android::JavaParamRef<jobject>& jcaller,
+ const base::android::JavaParamRef<jobject>& view);
+
+JNI_GENERATOR_EXPORT jbyteArray Java_org_chromium_TestJni_nativeGetStateAsByteArray(
+ JNIEnv* env,
+ jobject jcaller,
+ jobject view) {
+ return JNI_TestJni_GetStateAsByteArray(env, base::android::JavaParamRef<jobject>(env, jcaller),
+ base::android::JavaParamRef<jobject>(env, view)).Release();
+}
+
+static base::android::ScopedJavaLocalRef<jobjectArray> JNI_TestJni_GetAutofillProfileGUIDs(JNIEnv*
+ env);
+
+JNI_GENERATOR_EXPORT jobjectArray Java_org_chromium_TestJni_nativeGetAutofillProfileGUIDs(
+ JNIEnv* env,
+ jclass jcaller) {
+ return JNI_TestJni_GetAutofillProfileGUIDs(env).Release();
+}
+
+static void JNI_TestJni_SetRecognitionResults(JNIEnv* env, const
+ base::android::JavaParamRef<jobject>& jcaller,
+ jint sessionId,
+ const base::android::JavaParamRef<jobjectArray>& results);
+
+JNI_GENERATOR_EXPORT void Java_org_chromium_TestJni_nativeSetRecognitionResults(
+ JNIEnv* env,
+ jobject jcaller,
+ jint sessionId,
+ jobjectArray results) {
+ return JNI_TestJni_SetRecognitionResults(env, base::android::JavaParamRef<jobject>(env, jcaller),
+ sessionId, base::android::JavaParamRef<jobjectArray>(env, results));
+}
+
+JNI_GENERATOR_EXPORT jlong Java_org_chromium_TestJni_nativeAddBookmarkFromAPI(
+ JNIEnv* env,
+ jobject jcaller,
+ jint nativeChromeBrowserProvider,
+ jstring url,
+ jobject created,
+ jobject isBookmark,
+ jobject date,
+ jbyteArray favicon,
+ jstring title,
+ jobject visits) {
+ ChromeBrowserProvider* native =
+ reinterpret_cast<ChromeBrowserProvider*>(nativeChromeBrowserProvider);
+ CHECK_NATIVE_PTR(env, jcaller, native, "AddBookmarkFromAPI", 0);
+ return native->AddBookmarkFromAPI(env, base::android::JavaParamRef<jobject>(env, jcaller),
+ base::android::JavaParamRef<jstring>(env, url), base::android::JavaParamRef<jobject>(env,
+ created), base::android::JavaParamRef<jobject>(env, isBookmark),
+ base::android::JavaParamRef<jobject>(env, date), base::android::JavaParamRef<jbyteArray>(env,
+ favicon), base::android::JavaParamRef<jstring>(env, title),
+ base::android::JavaParamRef<jobject>(env, visits));
+}
+
+static jint JNI_TestJni_FindAll(JNIEnv* env, const base::android::JavaParamRef<jobject>& jcaller,
+ const base::android::JavaParamRef<jstring>& find);
+
+JNI_GENERATOR_EXPORT jint Java_org_chromium_TestJni_nativeFindAll(
+ JNIEnv* env,
+ jobject jcaller,
+ jstring find) {
+ return JNI_TestJni_FindAll(env, base::android::JavaParamRef<jobject>(env, jcaller),
+ base::android::JavaParamRef<jstring>(env, find));
+}
+
+static base::android::ScopedJavaLocalRef<jobject> JNI_TestJni_GetInnerClass(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT jobject Java_org_chromium_TestJni_nativeGetInnerClass(
+ JNIEnv* env,
+ jclass jcaller) {
+ return JNI_TestJni_GetInnerClass(env).Release();
+}
+
+JNI_GENERATOR_EXPORT jobject Java_org_chromium_TestJni_nativeQueryBitmap(
+ JNIEnv* env,
+ jobject jcaller,
+ jint nativeChromeBrowserProvider,
+ jobjectArray projection,
+ jstring selection,
+ jobjectArray selectionArgs,
+ jstring sortOrder) {
+ ChromeBrowserProvider* native =
+ reinterpret_cast<ChromeBrowserProvider*>(nativeChromeBrowserProvider);
+ CHECK_NATIVE_PTR(env, jcaller, native, "QueryBitmap", NULL);
+ return native->QueryBitmap(env, base::android::JavaParamRef<jobject>(env, jcaller),
+ base::android::JavaParamRef<jobjectArray>(env, projection),
+ base::android::JavaParamRef<jstring>(env, selection),
+ base::android::JavaParamRef<jobjectArray>(env, selectionArgs),
+ base::android::JavaParamRef<jstring>(env, sortOrder)).Release();
+}
+
+JNI_GENERATOR_EXPORT void Java_org_chromium_TestJni_nativeGotOrientation(
+ JNIEnv* env,
+ jobject jcaller,
+ jint nativeDataFetcherImplAndroid,
+ jdouble alpha,
+ jdouble beta,
+ jdouble gamma) {
+ DataFetcherImplAndroid* native =
+ reinterpret_cast<DataFetcherImplAndroid*>(nativeDataFetcherImplAndroid);
+ CHECK_NATIVE_PTR(env, jcaller, native, "GotOrientation");
+ return native->GotOrientation(env, base::android::JavaParamRef<jobject>(env, jcaller), alpha,
+ beta, gamma);
+}
+
+static base::android::ScopedJavaLocalRef<jthrowable> JNI_TestJni_MessWithJavaException(JNIEnv* env,
+ const base::android::JavaParamRef<jthrowable>& e);
+
+JNI_GENERATOR_EXPORT jthrowable Java_org_chromium_TestJni_nativeMessWithJavaException(
+ JNIEnv* env,
+ jclass jcaller,
+ jthrowable e) {
+ return JNI_TestJni_MessWithJavaException(env, base::android::JavaParamRef<jthrowable>(env,
+ e)).Release();
+}
+
+
+#endif // org_chromium_TestJni_JNI
diff --git a/chromium/base/android/jni_generator/golden/testNativesLong.golden b/chromium/base/android/jni_generator/golden/testNativesLong.golden
new file mode 100644
index 00000000000..81be022cd04
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/testNativesLong.golden
@@ -0,0 +1,49 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_generator.py
+// For
+// org/chromium/TestJni
+
+#ifndef org_chromium_TestJni_JNI
+#define org_chromium_TestJni_JNI
+
+#include <jni.h>
+
+#include "base/android/jni_generator/jni_generator_helper.h"
+
+
+// Step 1: Forward declarations.
+
+JNI_REGISTRATION_EXPORT extern const char kClassPath_org_chromium_TestJni[];
+const char kClassPath_org_chromium_TestJni[] = "org/chromium/TestJni";
+// Leaking this jclass as we cannot use LazyInstance from some threads.
+JNI_REGISTRATION_EXPORT std::atomic<jclass> g_org_chromium_TestJni_clazz(nullptr);
+#ifndef org_chromium_TestJni_clazz_defined
+#define org_chromium_TestJni_clazz_defined
+inline jclass org_chromium_TestJni_clazz(JNIEnv* env) {
+ return base::android::LazyGetClass(env, kClassPath_org_chromium_TestJni,
+ &g_org_chromium_TestJni_clazz);
+}
+#endif
+
+
+// Step 2: Constants (optional).
+
+
+// Step 3: Method stubs.
+JNI_GENERATOR_EXPORT void Java_org_chromium_TestJni_nativeDestroy(
+ JNIEnv* env,
+ jobject jcaller,
+ jlong nativeChromeBrowserProvider) {
+ ChromeBrowserProvider* native =
+ reinterpret_cast<ChromeBrowserProvider*>(nativeChromeBrowserProvider);
+ CHECK_NATIVE_PTR(env, jcaller, native, "Destroy");
+ return native->Destroy(env, base::android::JavaParamRef<jobject>(env, jcaller));
+}
+
+
+#endif // org_chromium_TestJni_JNI
diff --git a/chromium/base/android/jni_generator/golden/testNativesRegistrations.golden b/chromium/base/android/jni_generator/golden/testNativesRegistrations.golden
new file mode 100644
index 00000000000..442c47df3ea
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/testNativesRegistrations.golden
@@ -0,0 +1,181 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_registration_generator.py
+// Please do not change its content.
+
+#ifndef HEADER_GUARD
+#define HEADER_GUARD
+
+#include <jni.h>
+
+#include <iterator>
+
+#include "base/android/jni_generator/jni_generator_helper.h"
+#include "base/android/jni_int_wrapper.h"
+
+
+// Step 1: Forward declarations (classes).
+
+extern const char kClassPath_org_chromium_TestJni[];
+extern std::atomic<jclass> g_org_chromium_TestJni_clazz;
+#ifndef org_chromium_TestJni_clazz_defined
+#define org_chromium_TestJni_clazz_defined
+inline jclass org_chromium_TestJni_clazz(JNIEnv* env) {
+ return base::android::LazyGetClass(env, kClassPath_org_chromium_TestJni,
+ &g_org_chromium_TestJni_clazz);
+}
+#endif
+
+
+// Step 2: Forward declarations (methods).
+
+JNI_GENERATOR_EXPORT jint Java_org_chromium_TestJni_nativeInit(
+ JNIEnv* env,
+ jobject jcaller);
+JNI_GENERATOR_EXPORT void Java_org_chromium_TestJni_nativeDestroy(
+ JNIEnv* env,
+ jobject jcaller,
+ jint nativeChromeBrowserProvider);
+JNI_GENERATOR_EXPORT jlong Java_org_chromium_TestJni_nativeAddBookmark(
+ JNIEnv* env,
+ jobject jcaller,
+ jint nativeChromeBrowserProvider,
+ jstring url,
+ jstring title,
+ jboolean isFolder,
+ jlong parentId);
+JNI_GENERATOR_EXPORT jstring Java_org_chromium_TestJni_nativeGetDomainAndRegistry(
+ JNIEnv* env,
+ jclass jcaller,
+ jstring url);
+JNI_GENERATOR_EXPORT void Java_org_chromium_TestJni_nativeCreateHistoricalTabFromState(
+ JNIEnv* env,
+ jclass jcaller,
+ jbyteArray state,
+ jint tab_index);
+JNI_GENERATOR_EXPORT jbyteArray Java_org_chromium_TestJni_nativeGetStateAsByteArray(
+ JNIEnv* env,
+ jobject jcaller,
+ jobject view);
+JNI_GENERATOR_EXPORT jobjectArray Java_org_chromium_TestJni_nativeGetAutofillProfileGUIDs(
+ JNIEnv* env,
+ jclass jcaller);
+JNI_GENERATOR_EXPORT void Java_org_chromium_TestJni_nativeSetRecognitionResults(
+ JNIEnv* env,
+ jobject jcaller,
+ jint sessionId,
+ jobjectArray results);
+JNI_GENERATOR_EXPORT jlong Java_org_chromium_TestJni_nativeAddBookmarkFromAPI(
+ JNIEnv* env,
+ jobject jcaller,
+ jint nativeChromeBrowserProvider,
+ jstring url,
+ jobject created,
+ jobject isBookmark,
+ jobject date,
+ jbyteArray favicon,
+ jstring title,
+ jobject visits);
+JNI_GENERATOR_EXPORT jint Java_org_chromium_TestJni_nativeFindAll(
+ JNIEnv* env,
+ jobject jcaller,
+ jstring find);
+JNI_GENERATOR_EXPORT jobject Java_org_chromium_TestJni_nativeGetInnerClass(
+ JNIEnv* env,
+ jclass jcaller);
+JNI_GENERATOR_EXPORT jobject Java_org_chromium_TestJni_nativeQueryBitmap(
+ JNIEnv* env,
+ jobject jcaller,
+ jint nativeChromeBrowserProvider,
+ jobjectArray projection,
+ jstring selection,
+ jobjectArray selectionArgs,
+ jstring sortOrder);
+JNI_GENERATOR_EXPORT void Java_org_chromium_TestJni_nativeGotOrientation(
+ JNIEnv* env,
+ jobject jcaller,
+ jint nativeDataFetcherImplAndroid,
+ jdouble alpha,
+ jdouble beta,
+ jdouble gamma);
+JNI_GENERATOR_EXPORT jthrowable Java_org_chromium_TestJni_nativeMessWithJavaException(
+ JNIEnv* env,
+ jclass jcaller,
+ jthrowable e);
+
+
+// Step 3: Method declarations.
+
+static const JNINativeMethod kMethods_org_chromium_TestJni[] = {
+ { "nativeInit", "()I", reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeInit) },
+ { "nativeDestroy", "(I)V", reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeDestroy) },
+ { "nativeAddBookmark", "(ILjava/lang/String;Ljava/lang/String;ZJ)J",
+ reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeAddBookmark) },
+ { "nativeGetDomainAndRegistry", "(Ljava/lang/String;)Ljava/lang/String;",
+ reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeGetDomainAndRegistry) },
+ { "nativeCreateHistoricalTabFromState", "([BI)V",
+ reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeCreateHistoricalTabFromState) },
+ { "nativeGetStateAsByteArray", "(Landroid/view/View;)[B",
+ reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeGetStateAsByteArray) },
+ { "nativeGetAutofillProfileGUIDs", "()[Ljava/lang/String;",
+ reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeGetAutofillProfileGUIDs) },
+ { "nativeSetRecognitionResults", "(I[Ljava/lang/String;)V",
+ reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeSetRecognitionResults) },
+ { "nativeAddBookmarkFromAPI",
+ "(ILjava/lang/String;Ljava/lang/Long;Ljava/lang/Boolean;Ljava/lang/Long;[BLjava/lang/String;Ljava/lang/Integer;)J",
+ reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeAddBookmarkFromAPI) },
+ { "nativeFindAll", "(Ljava/lang/String;)I",
+ reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeFindAll) },
+ { "nativeGetInnerClass",
+ "()Lorg/chromium/example/jni_generator/SampleForTests$OnFrameAvailableListener;",
+ reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeGetInnerClass) },
+ { "nativeQueryBitmap",
+ "(I[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/graphics/Bitmap;",
+ reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeQueryBitmap) },
+ { "nativeGotOrientation", "(IDDD)V",
+ reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeGotOrientation) },
+ { "nativeMessWithJavaException", "(Ljava/lang/Throwable;)Ljava/lang/Throwable;",
+ reinterpret_cast<void*>(Java_org_chromium_TestJni_nativeMessWithJavaException) },
+};
+
+
+JNI_REGISTRATION_EXPORT bool RegisterNative_org_chromium_TestJni(JNIEnv* env) {
+ const int kMethods_org_chromium_TestJniSize =
+ std::size(kMethods_org_chromium_TestJni);
+ if (env->RegisterNatives(
+ org_chromium_TestJni_clazz(env),
+ kMethods_org_chromium_TestJni,
+ kMethods_org_chromium_TestJniSize) < 0) {
+ jni_generator::HandleRegistrationError(env,
+ org_chromium_TestJni_clazz(env),
+ __FILE__);
+ return false;
+ }
+
+ return true;
+}
+
+
+// Step 4: Main dex and non-main dex registration functions.
+
+namespace test {
+
+bool RegisterMainDexNatives(JNIEnv* env) {
+ if (!RegisterNative_org_chromium_TestJni(env))
+ return false;
+
+ return true;
+}
+
+bool RegisterNonMainDexNatives(JNIEnv* env) {
+
+ return true;
+}
+
+} // namespace test
+
+#endif // HEADER_GUARD
diff --git a/chromium/base/android/jni_generator/golden/testProxyMultiplexGenJni.2.golden b/chromium/base/android/jni_generator/golden/testProxyMultiplexGenJni.2.golden
new file mode 100644
index 00000000000..fc71e541a99
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/testProxyMultiplexGenJni.2.golden
@@ -0,0 +1,87 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.natives;
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_registration_generator.py
+// Please do not change its content.
+
+public class GEN_JNI {
+ public static final boolean TESTING_ENABLED = false;
+ public static final boolean REQUIRE_MOCK = false;
+
+
+ public static void org_chromium_example_jni_1generator_SampleForAnnotationProcessor_foo() {
+ J.N.resolve_for_void(-3890945313637314700L);
+ }
+
+ public static Object org_chromium_example_jni_1generator_SampleForAnnotationProcessor_bar(Object sample) {
+ return J.N.resolve_for_object_O(2227777243221232668L, sample);
+ }
+
+ public static String org_chromium_example_jni_1generator_SampleForAnnotationProcessor_revString(String stringToReverse) {
+ return J.N.resolve_for_string_R(3717128594383367634L, stringToReverse);
+ }
+
+ public static String[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendToNative(String[] strs) {
+ return J.N.resolve_for_string_array_RA(12825275381484104L, strs);
+ }
+
+ public static Object[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendSamplesToNative(Object[] strs) {
+ return J.N.resolve_for_object_array_OA(1879234562834588228L, strs);
+ }
+
+ public static boolean org_chromium_example_jni_1generator_SampleForAnnotationProcessor_hasPhalange() {
+ return J.N.resolve_for_boolean(6577090212445038314L);
+ }
+
+ public static int[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testAllPrimitives(int zint, int[] ints, long zlong, long[] longs, short zshort, short[] shorts, char zchar, char[] chars, byte zbyte, byte[] bytes, double zdouble, double[] doubles, float zfloat, float[] floats, boolean zbool, boolean[] bools) {
+ return J.N.resolve_for_int_array_IIAJJASSACCABBADDAFFAZZA(-7687282957371512872L, zint, ints, zlong, longs, zshort, shorts, zchar, chars, zbyte, bytes, zdouble, doubles, zfloat, floats, zbool, bools);
+ }
+
+ public static void org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testSpecialTypes(Class clazz, Class[] classes, Throwable throwable, Throwable[] throwables, String string, String[] strings, Object tStruct, Object[] structs, Object obj, Object[] objects) {
+ J.N.resolve_for_void_LLATTARRAOOAOOA(-6275232019293411879L, clazz, classes, throwable, throwables, string, strings, tStruct, structs, obj, objects);
+ }
+
+ public static Throwable org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowable() {
+ return J.N.resolve_for_throwable(-5073520581764159162L);
+ }
+
+ public static Throwable[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowables() {
+ return J.N.resolve_for_throwable_array(17582460986153510L);
+ }
+
+ public static Class org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClass() {
+ return J.N.resolve_for_class(-461602969360398827L);
+ }
+
+ public static Class[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClasses() {
+ return J.N.resolve_for_class_array(-427008638958312484L);
+ }
+
+ public static String org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnString() {
+ return J.N.resolve_for_string(-3292889389021976364L);
+ }
+
+ public static String[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStrings() {
+ return J.N.resolve_for_string_array(-5564218335546380707L);
+ }
+
+ public static Object org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStruct() {
+ return J.N.resolve_for_object(5419834314509580268L);
+ }
+
+ public static Object[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStructs() {
+ return J.N.resolve_for_object_array(2313390248928530514L);
+ }
+
+ public static Object org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObject() {
+ return J.N.resolve_for_object(-426730623629742951L);
+ }
+
+ public static Object[] org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObjects() {
+ return J.N.resolve_for_object_array(4508266875426191279L);
+ }
+}
diff --git a/chromium/base/android/jni_generator/golden/testProxyMultiplexGenJni.golden b/chromium/base/android/jni_generator/golden/testProxyMultiplexGenJni.golden
new file mode 100644
index 00000000000..9c77b3df665
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/testProxyMultiplexGenJni.golden
@@ -0,0 +1,30 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package J;
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_registration_generator.py
+// Please do not change its content.
+
+public class N {
+
+
+ public static native Class resolve_for_class(long switch_num);
+ public static native Class[] resolve_for_class_array(long switch_num);
+ public static native Object resolve_for_object(long switch_num);
+ public static native Object resolve_for_object_O(long switch_num, Object object_param1);
+ public static native Object[] resolve_for_object_array(long switch_num);
+ public static native Object[] resolve_for_object_array_OA(long switch_num, Object[] object_array_param1);
+ public static native String resolve_for_string(long switch_num);
+ public static native String resolve_for_string_R(long switch_num, String string_param1);
+ public static native String[] resolve_for_string_array(long switch_num);
+ public static native String[] resolve_for_string_array_RA(long switch_num, String[] string_array_param1);
+ public static native Throwable resolve_for_throwable(long switch_num);
+ public static native Throwable[] resolve_for_throwable_array(long switch_num);
+ public static native boolean resolve_for_boolean(long switch_num);
+ public static native int[] resolve_for_int_array_IIAJJASSACCABBADDAFFAZZA(long switch_num, int int_param1, int[] int_array_param1, long long_param1, long[] long_array_param1, short short_param1, short[] short_array_param1, char char_param1, char[] char_array_param1, byte byte_param1, byte[] byte_array_param1, double double_param1, double[] double_array_param1, float float_param1, float[] float_array_param1, boolean boolean_param1, boolean[] boolean_array_param1);
+ public static native void resolve_for_void(long switch_num);
+ public static native void resolve_for_void_LLATTARRAOOAOOA(long switch_num, Class class_param1, Class[] class_array_param1, Throwable throwable_param1, Throwable[] throwable_array_param1, String string_param1, String[] string_array_param1, Object object_param1, Object[] object_array_param1, Object object_param2, Object[] object_array_param2);
+}
diff --git a/chromium/base/android/jni_generator/golden/testProxyMultiplexNatives.golden b/chromium/base/android/jni_generator/golden/testProxyMultiplexNatives.golden
new file mode 100644
index 00000000000..a4868bbbf56
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/testProxyMultiplexNatives.golden
@@ -0,0 +1,361 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_registration_generator.py
+// Please do not change its content.
+
+#ifndef HEADER_GUARD
+#define HEADER_GUARD
+
+#include <jni.h>
+
+#include <iterator>
+
+#include "base/android/jni_generator/jni_generator_helper.h"
+#include "base/android/jni_int_wrapper.h"
+
+
+// Step 1: Forward declarations (classes).
+
+
+// Step 2: Forward declarations (methods).
+
+JNI_GENERATOR_EXPORT void
+ Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1foo(
+ JNIEnv* env,
+ jclass jcaller);
+JNI_GENERATOR_EXPORT jobject
+ Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1bar(
+ JNIEnv* env,
+ jclass jcaller,
+ jobject sample);
+JNI_GENERATOR_EXPORT jstring
+ Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1revString(
+ JNIEnv* env,
+ jclass jcaller,
+ jstring stringToReverse);
+JNI_GENERATOR_EXPORT jobjectArray
+ Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1sendToNative(
+ JNIEnv* env,
+ jclass jcaller,
+ jobjectArray strs);
+JNI_GENERATOR_EXPORT jobjectArray
+ Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1sendSamplesToNative(
+ JNIEnv* env,
+ jclass jcaller,
+ jobjectArray strs);
+JNI_GENERATOR_EXPORT jboolean
+ Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1hasPhalange(
+ JNIEnv* env,
+ jclass jcaller);
+JNI_GENERATOR_EXPORT jintArray
+ Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1testAllPrimitives(
+ JNIEnv* env,
+ jclass jcaller,
+ jint zint,
+ jintArray ints,
+ jlong zlong,
+ jlongArray longs,
+ jshort zshort,
+ jshortArray shorts,
+ jchar zchar,
+ jcharArray chars,
+ jbyte zbyte,
+ jbyteArray bytes,
+ jdouble zdouble,
+ jdoubleArray doubles,
+ jfloat zfloat,
+ jfloatArray floats,
+ jboolean zbool,
+ jbooleanArray bools);
+JNI_GENERATOR_EXPORT void
+ Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1testSpecialTypes(
+ JNIEnv* env,
+ jclass jcaller,
+ jclass clazz,
+ jobjectArray classes,
+ jthrowable throwable,
+ jobjectArray throwables,
+ jstring string,
+ jobjectArray strings,
+ jobject tStruct,
+ jobjectArray structs,
+ jobject obj,
+ jobjectArray objects);
+JNI_GENERATOR_EXPORT jthrowable
+ Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnThrowable(
+ JNIEnv* env,
+ jclass jcaller);
+JNI_GENERATOR_EXPORT jobjectArray
+ Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnThrowables(
+ JNIEnv* env,
+ jclass jcaller);
+JNI_GENERATOR_EXPORT jclass
+ Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnClass(
+ JNIEnv* env,
+ jclass jcaller);
+JNI_GENERATOR_EXPORT jobjectArray
+ Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnClasses(
+ JNIEnv* env,
+ jclass jcaller);
+JNI_GENERATOR_EXPORT jstring
+ Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnString(
+ JNIEnv* env,
+ jclass jcaller);
+JNI_GENERATOR_EXPORT jobjectArray
+ Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStrings(
+ JNIEnv* env,
+ jclass jcaller);
+JNI_GENERATOR_EXPORT jobject
+ Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStruct(
+ JNIEnv* env,
+ jclass jcaller);
+JNI_GENERATOR_EXPORT jobjectArray
+ Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStructs(
+ JNIEnv* env,
+ jclass jcaller);
+JNI_GENERATOR_EXPORT jobject
+ Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnObject(
+ JNIEnv* env,
+ jclass jcaller);
+JNI_GENERATOR_EXPORT jobjectArray
+ Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnObjects(
+ JNIEnv* env,
+ jclass jcaller);
+
+
+JNI_GENERATOR_EXPORT jclass Java_J_N_resolve_1for_1class(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong switch_num) {
+ switch (switch_num) {
+
+ case -461602969360398827:
+ return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnClass(env, jcaller);
+
+ default:
+ CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1class was called with an invalid switch number: " << switch_num;
+ return {};
+ }
+}
+JNI_GENERATOR_EXPORT jobjectArray Java_J_N_resolve_1for_1class_1array(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong switch_num) {
+ switch (switch_num) {
+
+ case -427008638958312484:
+ return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnClasses(env, jcaller);
+
+ default:
+ CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1class_1array was called with an invalid switch number: " << switch_num;
+ return {};
+ }
+}
+JNI_GENERATOR_EXPORT jobject Java_J_N_resolve_1for_1object(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong switch_num) {
+ switch (switch_num) {
+
+ case 5419834314509580268:
+ return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStruct(env, jcaller);
+
+ case -426730623629742951:
+ return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnObject(env, jcaller);
+
+ default:
+ CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1object was called with an invalid switch number: " << switch_num;
+ return {};
+ }
+}
+JNI_GENERATOR_EXPORT jobject Java_J_N_resolve_1for_1object_1O(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong switch_num, jobject object_param1) {
+ switch (switch_num) {
+
+ case 2227777243221232668:
+ return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1bar(env, jcaller, object_param1);
+
+ default:
+ CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1object_1O was called with an invalid switch number: " << switch_num;
+ return {};
+ }
+}
+JNI_GENERATOR_EXPORT jobjectArray Java_J_N_resolve_1for_1object_1array(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong switch_num) {
+ switch (switch_num) {
+
+ case 2313390248928530514:
+ return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStructs(env, jcaller);
+
+ case 4508266875426191279:
+ return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnObjects(env, jcaller);
+
+ default:
+ CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1object_1array was called with an invalid switch number: " << switch_num;
+ return {};
+ }
+}
+JNI_GENERATOR_EXPORT jobjectArray Java_J_N_resolve_1for_1object_1array_1OA(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong switch_num, jobjectArray object_array_param1) {
+ switch (switch_num) {
+
+ case 1879234562834588228:
+ return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1sendSamplesToNative(env, jcaller, object_array_param1);
+
+ default:
+ CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1object_1array_1OA was called with an invalid switch number: " << switch_num;
+ return {};
+ }
+}
+JNI_GENERATOR_EXPORT jstring Java_J_N_resolve_1for_1string(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong switch_num) {
+ switch (switch_num) {
+
+ case -3292889389021976364:
+ return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnString(env, jcaller);
+
+ default:
+ CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1string was called with an invalid switch number: " << switch_num;
+ return {};
+ }
+}
+JNI_GENERATOR_EXPORT jstring Java_J_N_resolve_1for_1string_1R(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong switch_num, jstring string_param1) {
+ switch (switch_num) {
+
+ case 3717128594383367634:
+ return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1revString(env, jcaller, string_param1);
+
+ default:
+ CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1string_1R was called with an invalid switch number: " << switch_num;
+ return {};
+ }
+}
+JNI_GENERATOR_EXPORT jobjectArray Java_J_N_resolve_1for_1string_1array(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong switch_num) {
+ switch (switch_num) {
+
+ case -5564218335546380707:
+ return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStrings(env, jcaller);
+
+ default:
+ CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1string_1array was called with an invalid switch number: " << switch_num;
+ return {};
+ }
+}
+JNI_GENERATOR_EXPORT jobjectArray Java_J_N_resolve_1for_1string_1array_1RA(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong switch_num, jobjectArray string_array_param1) {
+ switch (switch_num) {
+
+ case 12825275381484104:
+ return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1sendToNative(env, jcaller, string_array_param1);
+
+ default:
+ CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1string_1array_1RA was called with an invalid switch number: " << switch_num;
+ return {};
+ }
+}
+JNI_GENERATOR_EXPORT jthrowable Java_J_N_resolve_1for_1throwable(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong switch_num) {
+ switch (switch_num) {
+
+ case -5073520581764159162:
+ return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnThrowable(env, jcaller);
+
+ default:
+ CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1throwable was called with an invalid switch number: " << switch_num;
+ return {};
+ }
+}
+JNI_GENERATOR_EXPORT jobjectArray Java_J_N_resolve_1for_1throwable_1array(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong switch_num) {
+ switch (switch_num) {
+
+ case 17582460986153510:
+ return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnThrowables(env, jcaller);
+
+ default:
+ CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1throwable_1array was called with an invalid switch number: " << switch_num;
+ return {};
+ }
+}
+JNI_GENERATOR_EXPORT jboolean Java_J_N_resolve_1for_1boolean(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong switch_num) {
+ switch (switch_num) {
+
+ case 6577090212445038314:
+ return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1hasPhalange(env, jcaller);
+
+ default:
+ CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1boolean was called with an invalid switch number: " << switch_num;
+ return {};
+ }
+}
+JNI_GENERATOR_EXPORT jintArray Java_J_N_resolve_1for_1int_1array_1IIAJJASSACCABBADDAFFAZZA(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong switch_num, jint int_param1, jintArray int_array_param1, jlong long_param1, jlongArray long_array_param1, jshort short_param1, jshortArray short_array_param1, jchar char_param1, jcharArray char_array_param1, jbyte byte_param1, jbyteArray byte_array_param1, jdouble double_param1, jdoubleArray double_array_param1, jfloat float_param1, jfloatArray float_array_param1, jboolean boolean_param1, jbooleanArray boolean_array_param1) {
+ switch (switch_num) {
+
+ case -7687282957371512872:
+ return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1testAllPrimitives(env, jcaller, int_param1, int_array_param1, long_param1, long_array_param1, short_param1, short_array_param1, char_param1, char_array_param1, byte_param1, byte_array_param1, double_param1, double_array_param1, float_param1, float_array_param1, boolean_param1, boolean_array_param1);
+
+ default:
+ CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1int_1array_1IIAJJASSACCABBADDAFFAZZA was called with an invalid switch number: " << switch_num;
+ return {};
+ }
+}
+JNI_GENERATOR_EXPORT void Java_J_N_resolve_1for_1void(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong switch_num) {
+ switch (switch_num) {
+
+ case -3890945313637314700:
+ return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1foo(env, jcaller);
+
+ default:
+ CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1void was called with an invalid switch number: " << switch_num;
+ return;
+ }
+}
+JNI_GENERATOR_EXPORT void Java_J_N_resolve_1for_1void_1LLATTARRAOOAOOA(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong switch_num, jclass class_param1, jobjectArray class_array_param1, jthrowable throwable_param1, jobjectArray throwable_array_param1, jstring string_param1, jobjectArray string_array_param1, jobject object_param1, jobjectArray object_array_param1, jobject object_param2, jobjectArray object_array_param2) {
+ switch (switch_num) {
+
+ case -6275232019293411879:
+ return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1testSpecialTypes(env, jcaller, class_param1, class_array_param1, throwable_param1, throwable_array_param1, string_param1, string_array_param1, object_param1, object_array_param1, object_param2, object_array_param2);
+
+ default:
+ CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1void_1LLATTARRAOOAOOA was called with an invalid switch number: " << switch_num;
+ return;
+ }
+}
+
+#endif // HEADER_GUARD
diff --git a/chromium/base/android/jni_generator/golden/testProxyMultiplexNativesRegistration.golden b/chromium/base/android/jni_generator/golden/testProxyMultiplexNativesRegistration.golden
new file mode 100644
index 00000000000..473c68887e7
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/testProxyMultiplexNativesRegistration.golden
@@ -0,0 +1,440 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_registration_generator.py
+// Please do not change its content.
+
+#ifndef HEADER_GUARD
+#define HEADER_GUARD
+
+#include <jni.h>
+
+#include <iterator>
+
+#include "base/android/jni_generator/jni_generator_helper.h"
+#include "base/android/jni_int_wrapper.h"
+
+
+// Step 1: Forward declarations (classes).
+
+
+// Step 2: Forward declarations (methods).
+
+JNI_GENERATOR_EXPORT void
+ Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1foo(
+ JNIEnv* env,
+ jclass jcaller);
+JNI_GENERATOR_EXPORT jobject
+ Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1bar(
+ JNIEnv* env,
+ jclass jcaller,
+ jobject sample);
+JNI_GENERATOR_EXPORT jstring
+ Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1revString(
+ JNIEnv* env,
+ jclass jcaller,
+ jstring stringToReverse);
+JNI_GENERATOR_EXPORT jobjectArray
+ Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1sendToNative(
+ JNIEnv* env,
+ jclass jcaller,
+ jobjectArray strs);
+JNI_GENERATOR_EXPORT jobjectArray
+ Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1sendSamplesToNative(
+ JNIEnv* env,
+ jclass jcaller,
+ jobjectArray strs);
+JNI_GENERATOR_EXPORT jboolean
+ Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1hasPhalange(
+ JNIEnv* env,
+ jclass jcaller);
+JNI_GENERATOR_EXPORT jintArray
+ Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1testAllPrimitives(
+ JNIEnv* env,
+ jclass jcaller,
+ jint zint,
+ jintArray ints,
+ jlong zlong,
+ jlongArray longs,
+ jshort zshort,
+ jshortArray shorts,
+ jchar zchar,
+ jcharArray chars,
+ jbyte zbyte,
+ jbyteArray bytes,
+ jdouble zdouble,
+ jdoubleArray doubles,
+ jfloat zfloat,
+ jfloatArray floats,
+ jboolean zbool,
+ jbooleanArray bools);
+JNI_GENERATOR_EXPORT void
+ Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1testSpecialTypes(
+ JNIEnv* env,
+ jclass jcaller,
+ jclass clazz,
+ jobjectArray classes,
+ jthrowable throwable,
+ jobjectArray throwables,
+ jstring string,
+ jobjectArray strings,
+ jobject tStruct,
+ jobjectArray structs,
+ jobject obj,
+ jobjectArray objects);
+JNI_GENERATOR_EXPORT jthrowable
+ Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnThrowable(
+ JNIEnv* env,
+ jclass jcaller);
+JNI_GENERATOR_EXPORT jobjectArray
+ Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnThrowables(
+ JNIEnv* env,
+ jclass jcaller);
+JNI_GENERATOR_EXPORT jclass
+ Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnClass(
+ JNIEnv* env,
+ jclass jcaller);
+JNI_GENERATOR_EXPORT jobjectArray
+ Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnClasses(
+ JNIEnv* env,
+ jclass jcaller);
+JNI_GENERATOR_EXPORT jstring
+ Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnString(
+ JNIEnv* env,
+ jclass jcaller);
+JNI_GENERATOR_EXPORT jobjectArray
+ Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStrings(
+ JNIEnv* env,
+ jclass jcaller);
+JNI_GENERATOR_EXPORT jobject
+ Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStruct(
+ JNIEnv* env,
+ jclass jcaller);
+JNI_GENERATOR_EXPORT jobjectArray
+ Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStructs(
+ JNIEnv* env,
+ jclass jcaller);
+JNI_GENERATOR_EXPORT jobject
+ Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnObject(
+ JNIEnv* env,
+ jclass jcaller);
+JNI_GENERATOR_EXPORT jobjectArray
+ Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnObjects(
+ JNIEnv* env,
+ jclass jcaller);
+
+
+JNI_GENERATOR_EXPORT jclass Java_J_N_resolve_1for_1class(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong switch_num) {
+ switch (switch_num) {
+
+ case -461602969360398827:
+ return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnClass(env, jcaller);
+
+ default:
+ CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1class was called with an invalid switch number: " << switch_num;
+ return {};
+ }
+}
+JNI_GENERATOR_EXPORT jobjectArray Java_J_N_resolve_1for_1class_1array(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong switch_num) {
+ switch (switch_num) {
+
+ case -427008638958312484:
+ return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnClasses(env, jcaller);
+
+ default:
+ CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1class_1array was called with an invalid switch number: " << switch_num;
+ return {};
+ }
+}
+JNI_GENERATOR_EXPORT jobject Java_J_N_resolve_1for_1object(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong switch_num) {
+ switch (switch_num) {
+
+ case 5419834314509580268:
+ return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStruct(env, jcaller);
+
+ case -426730623629742951:
+ return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnObject(env, jcaller);
+
+ default:
+ CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1object was called with an invalid switch number: " << switch_num;
+ return {};
+ }
+}
+JNI_GENERATOR_EXPORT jobject Java_J_N_resolve_1for_1object_1O(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong switch_num, jobject object_param1) {
+ switch (switch_num) {
+
+ case 2227777243221232668:
+ return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1bar(env, jcaller, object_param1);
+
+ default:
+ CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1object_1O was called with an invalid switch number: " << switch_num;
+ return {};
+ }
+}
+JNI_GENERATOR_EXPORT jobjectArray Java_J_N_resolve_1for_1object_1array(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong switch_num) {
+ switch (switch_num) {
+
+ case 2313390248928530514:
+ return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStructs(env, jcaller);
+
+ case 4508266875426191279:
+ return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnObjects(env, jcaller);
+
+ default:
+ CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1object_1array was called with an invalid switch number: " << switch_num;
+ return {};
+ }
+}
+JNI_GENERATOR_EXPORT jobjectArray Java_J_N_resolve_1for_1object_1array_1OA(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong switch_num, jobjectArray object_array_param1) {
+ switch (switch_num) {
+
+ case 1879234562834588228:
+ return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1sendSamplesToNative(env, jcaller, object_array_param1);
+
+ default:
+ CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1object_1array_1OA was called with an invalid switch number: " << switch_num;
+ return {};
+ }
+}
+JNI_GENERATOR_EXPORT jstring Java_J_N_resolve_1for_1string(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong switch_num) {
+ switch (switch_num) {
+
+ case -3292889389021976364:
+ return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnString(env, jcaller);
+
+ default:
+ CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1string was called with an invalid switch number: " << switch_num;
+ return {};
+ }
+}
+JNI_GENERATOR_EXPORT jstring Java_J_N_resolve_1for_1string_1R(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong switch_num, jstring string_param1) {
+ switch (switch_num) {
+
+ case 3717128594383367634:
+ return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1revString(env, jcaller, string_param1);
+
+ default:
+ CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1string_1R was called with an invalid switch number: " << switch_num;
+ return {};
+ }
+}
+JNI_GENERATOR_EXPORT jobjectArray Java_J_N_resolve_1for_1string_1array(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong switch_num) {
+ switch (switch_num) {
+
+ case -5564218335546380707:
+ return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStrings(env, jcaller);
+
+ default:
+ CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1string_1array was called with an invalid switch number: " << switch_num;
+ return {};
+ }
+}
+JNI_GENERATOR_EXPORT jobjectArray Java_J_N_resolve_1for_1string_1array_1RA(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong switch_num, jobjectArray string_array_param1) {
+ switch (switch_num) {
+
+ case 12825275381484104:
+ return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1sendToNative(env, jcaller, string_array_param1);
+
+ default:
+ CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1string_1array_1RA was called with an invalid switch number: " << switch_num;
+ return {};
+ }
+}
+JNI_GENERATOR_EXPORT jthrowable Java_J_N_resolve_1for_1throwable(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong switch_num) {
+ switch (switch_num) {
+
+ case -5073520581764159162:
+ return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnThrowable(env, jcaller);
+
+ default:
+ CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1throwable was called with an invalid switch number: " << switch_num;
+ return {};
+ }
+}
+JNI_GENERATOR_EXPORT jobjectArray Java_J_N_resolve_1for_1throwable_1array(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong switch_num) {
+ switch (switch_num) {
+
+ case 17582460986153510:
+ return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnThrowables(env, jcaller);
+
+ default:
+ CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1throwable_1array was called with an invalid switch number: " << switch_num;
+ return {};
+ }
+}
+JNI_GENERATOR_EXPORT jboolean Java_J_N_resolve_1for_1boolean(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong switch_num) {
+ switch (switch_num) {
+
+ case 6577090212445038314:
+ return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1hasPhalange(env, jcaller);
+
+ default:
+ CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1boolean was called with an invalid switch number: " << switch_num;
+ return {};
+ }
+}
+JNI_GENERATOR_EXPORT jintArray Java_J_N_resolve_1for_1int_1array_1IIAJJASSACCABBADDAFFAZZA(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong switch_num, jint int_param1, jintArray int_array_param1, jlong long_param1, jlongArray long_array_param1, jshort short_param1, jshortArray short_array_param1, jchar char_param1, jcharArray char_array_param1, jbyte byte_param1, jbyteArray byte_array_param1, jdouble double_param1, jdoubleArray double_array_param1, jfloat float_param1, jfloatArray float_array_param1, jboolean boolean_param1, jbooleanArray boolean_array_param1) {
+ switch (switch_num) {
+
+ case -7687282957371512872:
+ return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1testAllPrimitives(env, jcaller, int_param1, int_array_param1, long_param1, long_array_param1, short_param1, short_array_param1, char_param1, char_array_param1, byte_param1, byte_array_param1, double_param1, double_array_param1, float_param1, float_array_param1, boolean_param1, boolean_array_param1);
+
+ default:
+ CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1int_1array_1IIAJJASSACCABBADDAFFAZZA was called with an invalid switch number: " << switch_num;
+ return {};
+ }
+}
+JNI_GENERATOR_EXPORT void Java_J_N_resolve_1for_1void(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong switch_num) {
+ switch (switch_num) {
+
+ case -3890945313637314700:
+ return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1foo(env, jcaller);
+
+ default:
+ CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1void was called with an invalid switch number: " << switch_num;
+ return;
+ }
+}
+JNI_GENERATOR_EXPORT void Java_J_N_resolve_1for_1void_1LLATTARRAOOAOOA(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong switch_num, jclass class_param1, jobjectArray class_array_param1, jthrowable throwable_param1, jobjectArray throwable_array_param1, jstring string_param1, jobjectArray string_array_param1, jobject object_param1, jobjectArray object_array_param1, jobject object_param2, jobjectArray object_array_param2) {
+ switch (switch_num) {
+
+ case -6275232019293411879:
+ return Java_J_N_org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1testSpecialTypes(env, jcaller, class_param1, class_array_param1, throwable_param1, throwable_array_param1, string_param1, string_array_param1, object_param1, object_array_param1, object_param2, object_array_param2);
+
+ default:
+ CHECK(false) << "JNI multiplexing function Java_J_N_resolve_1for_1void_1LLATTARRAOOAOOA was called with an invalid switch number: " << switch_num;
+ return;
+ }
+}
+// Step 3: Method declarations.
+
+
+static const JNINativeMethod kMethods_J_NMAIN_DEX[] = {
+ { "resolve_for_boolean", "(J)Z", reinterpret_cast<void*>(Java_J_N_resolve_1for_1boolean) },
+ { "resolve_for_class", "(J)Ljava/lang/Class;",
+ reinterpret_cast<void*>(Java_J_N_resolve_1for_1class) },
+ { "resolve_for_class_array", "(J)[Ljava/lang/Class;",
+ reinterpret_cast<void*>(Java_J_N_resolve_1for_1class_1array) },
+ { "resolve_for_int_array_IIAJJASSACCABBADDAFFAZZA", "(JI[IJ[JS[SC[CB[BD[DF[FZ[Z)[I",
+ reinterpret_cast<void*>(Java_J_N_resolve_1for_1int_1array_1IIAJJASSACCABBADDAFFAZZA) },
+ { "resolve_for_object", "(J)Ljava/lang/Object;",
+ reinterpret_cast<void*>(Java_J_N_resolve_1for_1object) },
+ { "resolve_for_object_O", "(JLjava/lang/Object;)Ljava/lang/Object;",
+ reinterpret_cast<void*>(Java_J_N_resolve_1for_1object_1O) },
+ { "resolve_for_object_array", "(J)[Ljava/lang/Object;",
+ reinterpret_cast<void*>(Java_J_N_resolve_1for_1object_1array) },
+ { "resolve_for_object_array_OA", "(J[Ljava/lang/Object;)[Ljava/lang/Object;",
+ reinterpret_cast<void*>(Java_J_N_resolve_1for_1object_1array_1OA) },
+ { "resolve_for_string", "(J)Ljava/lang/String;",
+ reinterpret_cast<void*>(Java_J_N_resolve_1for_1string) },
+ { "resolve_for_string_R", "(JLjava/lang/String;)Ljava/lang/String;",
+ reinterpret_cast<void*>(Java_J_N_resolve_1for_1string_1R) },
+ { "resolve_for_string_array", "(J)[Ljava/lang/String;",
+ reinterpret_cast<void*>(Java_J_N_resolve_1for_1string_1array) },
+ { "resolve_for_string_array_RA", "(J[Ljava/lang/String;)[Ljava/lang/String;",
+ reinterpret_cast<void*>(Java_J_N_resolve_1for_1string_1array_1RA) },
+ { "resolve_for_throwable", "(J)Ljava/lang/Throwable;",
+ reinterpret_cast<void*>(Java_J_N_resolve_1for_1throwable) },
+ { "resolve_for_throwable_array", "(J)[Ljava/lang/Throwable;",
+ reinterpret_cast<void*>(Java_J_N_resolve_1for_1throwable_1array) },
+ { "resolve_for_void", "(J)V", reinterpret_cast<void*>(Java_J_N_resolve_1for_1void) },
+ { "resolve_for_void_LLATTARRAOOAOOA",
+ "(JLjava/lang/Class;[Ljava/lang/Class;Ljava/lang/Throwable;[Ljava/lang/Throwable;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/Object;[Ljava/lang/Object;Ljava/lang/Object;[Ljava/lang/Object;)V",
+ reinterpret_cast<void*>(Java_J_N_resolve_1for_1void_1LLATTARRAOOAOOA) }
+};
+
+namespace {
+
+JNI_REGISTRATION_EXPORT bool RegisterNative_J_NMAIN_DEX(JNIEnv* env) {
+ const int number_of_methods = std::size(kMethods_J_NMAIN_DEX);
+
+ base::android::ScopedJavaLocalRef<jclass> native_clazz =
+ base::android::GetClass(env, "J/N");
+ if (env->RegisterNatives(
+ native_clazz.obj(),
+ kMethods_J_NMAIN_DEX,
+ number_of_methods) < 0) {
+
+ jni_generator::HandleRegistrationError(env, native_clazz.obj(), __FILE__);
+ return false;
+ }
+
+ return true;
+}
+
+} // namespace
+
+
+// Step 4: Main dex and non-main dex registration functions.
+
+namespace test {
+
+bool RegisterMainDexNatives(JNIEnv* env) {
+ // Register natives in a proxy.
+ if (!RegisterNative_J_NMAIN_DEX(env)) {
+ return false;
+ }
+
+
+ return true;
+}
+
+bool RegisterNonMainDexNatives(JNIEnv* env) {
+
+ return true;
+}
+
+} // namespace test
+
+#endif // HEADER_GUARD
diff --git a/chromium/base/android/jni_generator/golden/testProxyNatives.golden b/chromium/base/android/jni_generator/golden/testProxyNatives.golden
new file mode 100644
index 00000000000..f96750538fa
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/testProxyNatives.golden
@@ -0,0 +1,63 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_generator.py
+// For
+// org/chromium/example/SampleProxyJni
+
+#ifndef org_chromium_example_SampleProxyJni_JNI
+#define org_chromium_example_SampleProxyJni_JNI
+
+#include <jni.h>
+
+#include "base/android/jni_generator/jni_generator_helper.h"
+
+
+// Step 1: Forward declarations.
+
+
+// Step 2: Constants (optional).
+
+
+// Step 3: Method stubs.
+JNI_GENERATOR_EXPORT void
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1SampleProxyJni_1foo(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong nativePtr) {
+ FooAndroid::BarDelegate* native = reinterpret_cast<FooAndroid::BarDelegate*>(nativePtr);
+ CHECK_NATIVE_PTR(env, jcaller, native, "Foo");
+ return native->Foo(env);
+}
+
+static jint JNI_SampleProxyJni_Bar(JNIEnv* env, jint x,
+ jint y);
+
+JNI_GENERATOR_EXPORT jint
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1SampleProxyJni_1bar(
+ JNIEnv* env,
+ jclass jcaller,
+ jint x,
+ jint y) {
+ return JNI_SampleProxyJni_Bar(env, x, y);
+}
+
+static base::android::ScopedJavaLocalRef<jstring> JNI_SampleProxyJni_Foobar(JNIEnv* env, const
+ base::android::JavaParamRef<jstring>& x,
+ const base::android::JavaParamRef<jstring>& y);
+
+JNI_GENERATOR_EXPORT jstring
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1SampleProxyJni_1foobar(
+ JNIEnv* env,
+ jclass jcaller,
+ jstring x,
+ jstring y) {
+ return JNI_SampleProxyJni_Foobar(env, base::android::JavaParamRef<jstring>(env, x),
+ base::android::JavaParamRef<jstring>(env, y)).Release();
+}
+
+
+#endif // org_chromium_example_SampleProxyJni_JNI
diff --git a/chromium/base/android/jni_generator/golden/testProxyNativesJava.golden b/chromium/base/android/jni_generator/golden/testProxyNativesJava.golden
new file mode 100644
index 00000000000..a40f98591ba
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/testProxyNativesJava.golden
@@ -0,0 +1,22 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.natives;
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_registration_generator.py
+// Please do not change its content.
+
+public class GEN_JNI {
+ public static final boolean TESTING_ENABLED = false;
+ public static final boolean REQUIRE_MOCK = false;
+
+
+ // Hashed name: Java_J_N_MfuvK7$r
+ public static native void org_chromium_example_SampleProxyJni_foo(long nativePtr);
+ // Hashed name: Java_J_N_MB1mTV9a
+ public static native int org_chromium_example_SampleProxyJni_bar(int x, int y);
+ // Hashed name: Java_J_N_Me7X4JzV
+ public static native String org_chromium_example_SampleProxyJni_foobar(String x, String y);
+}
diff --git a/chromium/base/android/jni_generator/golden/testProxyNativesMainDex.golden b/chromium/base/android/jni_generator/golden/testProxyNativesMainDex.golden
new file mode 100644
index 00000000000..fefa53b5863
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/testProxyNativesMainDex.golden
@@ -0,0 +1,84 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_registration_generator.py
+// Please do not change its content.
+
+#ifndef HEADER_GUARD
+#define HEADER_GUARD
+
+#include <jni.h>
+
+#include <iterator>
+
+#include "base/android/jni_generator/jni_generator_helper.h"
+#include "base/android/jni_int_wrapper.h"
+
+
+// Step 1: Forward declarations (classes).
+
+
+// Step 2: Forward declarations (methods).
+
+JNI_GENERATOR_EXPORT void Java_org_chromium_base_natives_GEN_1JNI_test_1foo_1Foo_1thisismaindex(
+ JNIEnv* env,
+ jclass jcaller);
+
+
+// Step 3: Method declarations.
+
+
+static const JNINativeMethod kMethods_org_chromium_base_natives_GEN_1JNIMAIN_DEX[] = {
+ { "test_foo_Foo_thisismaindex", "()V",
+ reinterpret_cast<void*>(Java_org_chromium_base_natives_GEN_1JNI_test_1foo_1Foo_1thisismaindex)
+ },
+
+};
+
+namespace {
+
+JNI_REGISTRATION_EXPORT bool RegisterNative_org_chromium_base_natives_GEN_1JNIMAIN_DEX(JNIEnv* env) {
+ const int number_of_methods = std::size(kMethods_org_chromium_base_natives_GEN_1JNIMAIN_DEX);
+
+ base::android::ScopedJavaLocalRef<jclass> native_clazz =
+ base::android::GetClass(env, "org/chromium/base/natives/GEN_JNI");
+ if (env->RegisterNatives(
+ native_clazz.obj(),
+ kMethods_org_chromium_base_natives_GEN_1JNIMAIN_DEX,
+ number_of_methods) < 0) {
+
+ jni_generator::HandleRegistrationError(env, native_clazz.obj(), __FILE__);
+ return false;
+ }
+
+ return true;
+}
+
+} // namespace
+
+
+// Step 4: Main dex and non-main dex registration functions.
+
+namespace test {
+
+bool RegisterMainDexNatives(JNIEnv* env) {
+ // Register natives in a proxy.
+ if (!RegisterNative_org_chromium_base_natives_GEN_1JNIMAIN_DEX(env)) {
+ return false;
+ }
+
+
+ return true;
+}
+
+bool RegisterNonMainDexNatives(JNIEnv* env) {
+
+ return true;
+}
+
+} // namespace test
+
+#endif // HEADER_GUARD
diff --git a/chromium/base/android/jni_generator/golden/testProxyNativesMainDexAndNonMainDex.golden b/chromium/base/android/jni_generator/golden/testProxyNativesMainDexAndNonMainDex.golden
new file mode 100644
index 00000000000..e317bd07724
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/testProxyNativesMainDexAndNonMainDex.golden
@@ -0,0 +1,124 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_registration_generator.py
+// Please do not change its content.
+
+#ifndef HEADER_GUARD
+#define HEADER_GUARD
+
+#include <jni.h>
+
+#include <iterator>
+
+#include "base/android/jni_generator/jni_generator_helper.h"
+#include "base/android/jni_int_wrapper.h"
+
+
+// Step 1: Forward declarations (classes).
+
+
+// Step 2: Forward declarations (methods).
+
+JNI_GENERATOR_EXPORT void Java_org_chromium_base_natives_GEN_1JNI_test_1foo_1Bar_1foo(
+ JNIEnv* env,
+ jclass jcaller);
+JNI_GENERATOR_EXPORT void Java_org_chromium_base_natives_GEN_1JNI_test_1foo_1Bar_1bar(
+ JNIEnv* env,
+ jclass jcaller);
+JNI_GENERATOR_EXPORT void Java_org_chromium_base_natives_GEN_1JNI_test_1foo_1Foo_1thisismaindex(
+ JNIEnv* env,
+ jclass jcaller);
+
+
+// Step 3: Method declarations.
+
+
+static const JNINativeMethod kMethods_org_chromium_base_natives_GEN_1JNI[] = {
+ { "test_foo_Bar_foo", "()V",
+ reinterpret_cast<void*>(Java_org_chromium_base_natives_GEN_1JNI_test_1foo_1Bar_1foo) },
+ { "test_foo_Bar_bar", "()V",
+ reinterpret_cast<void*>(Java_org_chromium_base_natives_GEN_1JNI_test_1foo_1Bar_1bar) },
+
+};
+
+namespace {
+
+JNI_REGISTRATION_EXPORT bool RegisterNative_org_chromium_base_natives_GEN_1JNI(JNIEnv* env) {
+ const int number_of_methods = std::size(kMethods_org_chromium_base_natives_GEN_1JNI);
+
+ base::android::ScopedJavaLocalRef<jclass> native_clazz =
+ base::android::GetClass(env, "org/chromium/base/natives/GEN_JNI");
+ if (env->RegisterNatives(
+ native_clazz.obj(),
+ kMethods_org_chromium_base_natives_GEN_1JNI,
+ number_of_methods) < 0) {
+
+ jni_generator::HandleRegistrationError(env, native_clazz.obj(), __FILE__);
+ return false;
+ }
+
+ return true;
+}
+
+} // namespace
+
+static const JNINativeMethod kMethods_org_chromium_base_natives_GEN_1JNIMAIN_DEX[] = {
+ { "test_foo_Foo_thisismaindex", "()V",
+ reinterpret_cast<void*>(Java_org_chromium_base_natives_GEN_1JNI_test_1foo_1Foo_1thisismaindex)
+ },
+
+};
+
+namespace {
+
+JNI_REGISTRATION_EXPORT bool RegisterNative_org_chromium_base_natives_GEN_1JNIMAIN_DEX(JNIEnv* env) {
+ const int number_of_methods = std::size(kMethods_org_chromium_base_natives_GEN_1JNIMAIN_DEX);
+
+ base::android::ScopedJavaLocalRef<jclass> native_clazz =
+ base::android::GetClass(env, "org/chromium/base/natives/GEN_JNI");
+ if (env->RegisterNatives(
+ native_clazz.obj(),
+ kMethods_org_chromium_base_natives_GEN_1JNIMAIN_DEX,
+ number_of_methods) < 0) {
+
+ jni_generator::HandleRegistrationError(env, native_clazz.obj(), __FILE__);
+ return false;
+ }
+
+ return true;
+}
+
+} // namespace
+
+
+// Step 4: Main dex and non-main dex registration functions.
+
+namespace test {
+
+bool RegisterMainDexNatives(JNIEnv* env) {
+ // Register natives in a proxy.
+ if (!RegisterNative_org_chromium_base_natives_GEN_1JNIMAIN_DEX(env)) {
+ return false;
+ }
+
+
+ return true;
+}
+
+bool RegisterNonMainDexNatives(JNIEnv* env) {
+ // Register natives in a proxy.
+ if (!RegisterNative_org_chromium_base_natives_GEN_1JNI(env)) {
+ return false;
+ }
+
+
+ return true;
+}
+
+} // namespace test
+
+#endif // HEADER_GUARD
diff --git a/chromium/base/android/jni_generator/golden/testProxyNativesRegistrations.golden b/chromium/base/android/jni_generator/golden/testProxyNativesRegistrations.golden
new file mode 100644
index 00000000000..508d02ba8d8
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/testProxyNativesRegistrations.golden
@@ -0,0 +1,105 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_registration_generator.py
+// Please do not change its content.
+
+#ifndef HEADER_GUARD
+#define HEADER_GUARD
+
+#include <jni.h>
+
+#include <iterator>
+
+#include "base/android/jni_generator/jni_generator_helper.h"
+#include "base/android/jni_int_wrapper.h"
+
+
+// Step 1: Forward declarations (classes).
+
+
+// Step 2: Forward declarations (methods).
+
+JNI_GENERATOR_EXPORT void
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1SampleProxyJni_1foo(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong nativePtr);
+JNI_GENERATOR_EXPORT jint
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1SampleProxyJni_1bar(
+ JNIEnv* env,
+ jclass jcaller,
+ jint x,
+ jint y);
+JNI_GENERATOR_EXPORT jstring
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1SampleProxyJni_1foobar(
+ JNIEnv* env,
+ jclass jcaller,
+ jstring x,
+ jstring y);
+
+
+// Step 3: Method declarations.
+
+
+static const JNINativeMethod kMethods_org_chromium_base_natives_GEN_1JNI[] = {
+ { "org_chromium_example_SampleProxyJni_foo", "(J)V",
+ reinterpret_cast<void*>(Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1SampleProxyJni_1foo)
+ },
+ { "org_chromium_example_SampleProxyJni_bar", "(II)I",
+ reinterpret_cast<void*>(Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1SampleProxyJni_1bar)
+ },
+ { "org_chromium_example_SampleProxyJni_foobar",
+ "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;",
+ reinterpret_cast<void*>(Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1example_1SampleProxyJni_1foobar)
+ },
+
+};
+
+namespace {
+
+JNI_REGISTRATION_EXPORT bool RegisterNative_org_chromium_base_natives_GEN_1JNI(JNIEnv* env) {
+ const int number_of_methods = std::size(kMethods_org_chromium_base_natives_GEN_1JNI);
+
+ base::android::ScopedJavaLocalRef<jclass> native_clazz =
+ base::android::GetClass(env, "org/chromium/base/natives/GEN_JNI");
+ if (env->RegisterNatives(
+ native_clazz.obj(),
+ kMethods_org_chromium_base_natives_GEN_1JNI,
+ number_of_methods) < 0) {
+
+ jni_generator::HandleRegistrationError(env, native_clazz.obj(), __FILE__);
+ return false;
+ }
+
+ return true;
+}
+
+} // namespace
+
+
+// Step 4: Main dex and non-main dex registration functions.
+
+namespace test {
+
+bool RegisterMainDexNatives(JNIEnv* env) {
+
+ return true;
+}
+
+bool RegisterNonMainDexNatives(JNIEnv* env) {
+ // Register natives in a proxy.
+ if (!RegisterNative_org_chromium_base_natives_GEN_1JNI(env)) {
+ return false;
+ }
+
+
+ return true;
+}
+
+} // namespace test
+
+#endif // HEADER_GUARD
diff --git a/chromium/base/android/jni_generator/golden/testProxyNativesWithNatives.golden b/chromium/base/android/jni_generator/golden/testProxyNativesWithNatives.golden
new file mode 100644
index 00000000000..ad3ed1d45ba
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/testProxyNativesWithNatives.golden
@@ -0,0 +1,117 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_generator.py
+// For
+// org/chromium/foo/Foo
+
+#ifndef org_chromium_foo_Foo_JNI
+#define org_chromium_foo_Foo_JNI
+
+#include <jni.h>
+
+#include "base/android/jni_generator/jni_generator_helper.h"
+
+
+// Step 1: Forward declarations.
+
+JNI_REGISTRATION_EXPORT extern const char kClassPath_org_chromium_foo_Foo[];
+const char kClassPath_org_chromium_foo_Foo[] = "org/chromium/foo/Foo";
+// Leaking this jclass as we cannot use LazyInstance from some threads.
+JNI_REGISTRATION_EXPORT std::atomic<jclass> g_org_chromium_foo_Foo_clazz(nullptr);
+#ifndef org_chromium_foo_Foo_clazz_defined
+#define org_chromium_foo_Foo_clazz_defined
+inline jclass org_chromium_foo_Foo_clazz(JNIEnv* env) {
+ return base::android::LazyGetClass(env, kClassPath_org_chromium_foo_Foo,
+ &g_org_chromium_foo_Foo_clazz);
+}
+#endif
+
+
+// Step 2: Constants (optional).
+
+
+// Step 3: Method stubs.
+static void JNI_Foo_Foo(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT void Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1foo_1Foo_1foo(
+ JNIEnv* env,
+ jclass jcaller) {
+ TRACE_EVENT0("jni", "JNI_Foo_Foo");
+ return JNI_Foo_Foo(env);
+}
+
+static base::android::ScopedJavaLocalRef<jstring> JNI_Foo_Bar(JNIEnv* env, const
+ base::android::JavaParamRef<jstring>& s,
+ jint y,
+ jchar x,
+ jshort z);
+
+JNI_GENERATOR_EXPORT jstring Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1foo_1Foo_1bar(
+ JNIEnv* env,
+ jclass jcaller,
+ jstring s,
+ jint y,
+ jchar x,
+ jshort z) {
+ TRACE_EVENT0("jni", "JNI_Foo_Bar");
+ return JNI_Foo_Bar(env, base::android::JavaParamRef<jstring>(env, s), y, x, z).Release();
+}
+
+static base::android::ScopedJavaLocalRef<jobjectArray> JNI_Foo_Foobar(JNIEnv* env, const
+ base::android::JavaParamRef<jobjectArray>& a);
+
+JNI_GENERATOR_EXPORT jobjectArray
+ Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1foo_1Foo_1foobar(
+ JNIEnv* env,
+ jclass jcaller,
+ jobjectArray a) {
+ TRACE_EVENT0("jni", "JNI_Foo_Foobar");
+ return JNI_Foo_Foobar(env, base::android::JavaParamRef<jobjectArray>(env, a)).Release();
+}
+
+JNI_GENERATOR_EXPORT void Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1foo_1Foo_1baz(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong nativePtr,
+ jobject caller) {
+ TRACE_EVENT0("jni", "Ptr::Baz");
+ Ptr* native = reinterpret_cast<Ptr*>(nativePtr);
+ CHECK_NATIVE_PTR(env, jcaller, native, "Baz");
+ return native->Baz(env, base::android::JavaParamRef<jobject>(env, caller));
+}
+
+JNI_GENERATOR_EXPORT void Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1foo_1Foo_1fooBar(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong nativePtr) {
+ TRACE_EVENT0("jni", "Ptr::FooBar");
+ Ptr* native = reinterpret_cast<Ptr*>(nativePtr);
+ CHECK_NATIVE_PTR(env, jcaller, native, "FooBar");
+ return native->FooBar(env);
+}
+
+JNI_GENERATOR_EXPORT void Java_org_chromium_foo_Foo_nativeInstanceMethod(
+ JNIEnv* env,
+ jobject jcaller,
+ jlong nativeInstance) {
+ TRACE_EVENT0("jni", "Instance::InstanceMethod");
+ Instance* native = reinterpret_cast<Instance*>(nativeInstance);
+ CHECK_NATIVE_PTR(env, jcaller, native, "InstanceMethod");
+ return native->InstanceMethod(env, base::android::JavaParamRef<jobject>(env, jcaller));
+}
+
+static void JNI_Foo_StaticMethod(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT void Java_org_chromium_foo_Foo_nativeStaticMethod(
+ JNIEnv* env,
+ jclass jcaller) {
+ TRACE_EVENT0("jni", "JNI_Foo_StaticMethod");
+ return JNI_Foo_StaticMethod(env);
+}
+
+
+#endif // org_chromium_foo_Foo_JNI
diff --git a/chromium/base/android/jni_generator/golden/testREForNatives.golden b/chromium/base/android/jni_generator/golden/testREForNatives.golden
new file mode 100644
index 00000000000..b9efc5983b8
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/testREForNatives.golden
@@ -0,0 +1,49 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_generator.py
+// For
+// foo/bar
+
+#ifndef foo_bar_JNI
+#define foo_bar_JNI
+
+#include <jni.h>
+
+#include "base/android/jni_generator/jni_generator_helper.h"
+
+
+// Step 1: Forward declarations.
+
+JNI_REGISTRATION_EXPORT extern const char kClassPath_foo_bar[];
+const char kClassPath_foo_bar[] = "foo/bar";
+// Leaking this jclass as we cannot use LazyInstance from some threads.
+JNI_REGISTRATION_EXPORT std::atomic<jclass> g_foo_bar_clazz(nullptr);
+#ifndef foo_bar_clazz_defined
+#define foo_bar_clazz_defined
+inline jclass foo_bar_clazz(JNIEnv* env) {
+ return base::android::LazyGetClass(env, kClassPath_foo_bar, &g_foo_bar_clazz);
+}
+#endif
+
+
+// Step 2: Constants (optional).
+
+
+// Step 3: Method stubs.
+static void JNI_bar_SyncSetupEnded(JNIEnv* env, const base::android::JavaParamRef<jobject>& jcaller,
+ jint nativeAndroidSyncSetupFlowHandler);
+
+JNI_GENERATOR_EXPORT void Java_foo_bar_nativeSyncSetupEnded(
+ JNIEnv* env,
+ jobject jcaller,
+ jint nativeAndroidSyncSetupFlowHandler) {
+ return JNI_bar_SyncSetupEnded(env, base::android::JavaParamRef<jobject>(env, jcaller),
+ nativeAndroidSyncSetupFlowHandler);
+}
+
+
+#endif // foo_bar_JNI
diff --git a/chromium/base/android/jni_generator/golden/testSingleJNIAdditionalImport.golden b/chromium/base/android/jni_generator/golden/testSingleJNIAdditionalImport.golden
new file mode 100644
index 00000000000..bfcd98cd30b
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/testSingleJNIAdditionalImport.golden
@@ -0,0 +1,67 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_generator.py
+// For
+// org/chromium/foo/Foo
+
+#ifndef org_chromium_foo_Foo_JNI
+#define org_chromium_foo_Foo_JNI
+
+#include <jni.h>
+
+#include "base/android/jni_generator/jni_generator_helper.h"
+
+
+// Step 1: Forward declarations.
+
+JNI_REGISTRATION_EXPORT extern const char kClassPath_org_chromium_foo_Foo[];
+const char kClassPath_org_chromium_foo_Foo[] = "org/chromium/foo/Foo";
+// Leaking this jclass as we cannot use LazyInstance from some threads.
+JNI_REGISTRATION_EXPORT std::atomic<jclass> g_org_chromium_foo_Foo_clazz(nullptr);
+#ifndef org_chromium_foo_Foo_clazz_defined
+#define org_chromium_foo_Foo_clazz_defined
+inline jclass org_chromium_foo_Foo_clazz(JNIEnv* env) {
+ return base::android::LazyGetClass(env, kClassPath_org_chromium_foo_Foo,
+ &g_org_chromium_foo_Foo_clazz);
+}
+#endif
+
+
+// Step 2: Constants (optional).
+
+
+// Step 3: Method stubs.
+static void JNI_Foo_DoSomething(JNIEnv* env, const base::android::JavaParamRef<jobject>& callback);
+
+JNI_GENERATOR_EXPORT void Java_org_chromium_foo_Foo_nativeDoSomething(
+ JNIEnv* env,
+ jclass jcaller,
+ jobject callback) {
+ return JNI_Foo_DoSomething(env, base::android::JavaParamRef<jobject>(env, callback));
+}
+
+
+static std::atomic<jmethodID> g_org_chromium_foo_Foo_calledByNative(nullptr);
+static void Java_Foo_calledByNative(JNIEnv* env, const base::android::JavaRef<jobject>& callback) {
+ jclass clazz = org_chromium_foo_Foo_clazz(env);
+ CHECK_CLAZZ(env, clazz,
+ org_chromium_foo_Foo_clazz(env));
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_STATIC>(
+ env,
+ clazz,
+ "calledByNative",
+ "(Lorg/chromium/foo/Bar$Callback;)V",
+ &g_org_chromium_foo_Foo_calledByNative);
+
+ env->CallStaticVoidMethod(clazz,
+ call_context.base.method_id, callback.obj());
+}
+
+#endif // org_chromium_foo_Foo_JNI
diff --git a/chromium/base/android/jni_generator/golden/testStaticBindingCaller.golden b/chromium/base/android/jni_generator/golden/testStaticBindingCaller.golden
new file mode 100644
index 00000000000..413ee09f296
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/testStaticBindingCaller.golden
@@ -0,0 +1,100 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_generator.py
+// For
+// org/chromium/foo/Foo
+
+#ifndef org_chromium_foo_Foo_JNI
+#define org_chromium_foo_Foo_JNI
+
+#include <jni.h>
+
+#include "base/android/jni_generator/jni_generator_helper.h"
+
+
+// Step 1: Forward declarations.
+
+JNI_REGISTRATION_EXPORT extern const char kClassPath_org_chromium_foo_Foo[];
+const char kClassPath_org_chromium_foo_Foo[] = "org/chromium/foo/Foo";
+// Leaking this jclass as we cannot use LazyInstance from some threads.
+JNI_REGISTRATION_EXPORT std::atomic<jclass> g_org_chromium_foo_Foo_clazz(nullptr);
+#ifndef org_chromium_foo_Foo_clazz_defined
+#define org_chromium_foo_Foo_clazz_defined
+inline jclass org_chromium_foo_Foo_clazz(JNIEnv* env) {
+ return base::android::LazyGetClass(env, kClassPath_org_chromium_foo_Foo,
+ &g_org_chromium_foo_Foo_clazz);
+}
+#endif
+
+
+// Step 2: Constants (optional).
+
+
+// Step 3: Method stubs.
+static void JNI_Foo_ShouldBindCaller(JNIEnv* env, const base::android::JavaParamRef<jobject>&
+ caller);
+
+JNI_GENERATOR_EXPORT void Java_org_chromium_foo_Foo_nativeShouldBindCaller(
+ JNIEnv* env,
+ jclass jcaller,
+ jobject caller) {
+ return JNI_Foo_ShouldBindCaller(env, base::android::JavaParamRef<jobject>(env, caller));
+}
+
+static void JNI_Foo_ShouldBindCaller(JNIEnv* env, const base::android::JavaParamRef<jobject>&
+ caller,
+ jint a);
+
+JNI_GENERATOR_EXPORT void Java_org_chromium_foo_Foo_nativeShouldBindCaller(
+ JNIEnv* env,
+ jclass jcaller,
+ jobject caller,
+ jint a) {
+ return JNI_Foo_ShouldBindCaller(env, base::android::JavaParamRef<jobject>(env, caller), a);
+}
+
+JNI_GENERATOR_EXPORT void Java_org_chromium_foo_Foo_nativeFoo(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong nativeNativeObject,
+ jobject caller) {
+ NativeObject* native = reinterpret_cast<NativeObject*>(nativeNativeObject);
+ CHECK_NATIVE_PTR(env, jcaller, native, "Foo");
+ return native->Foo(env, base::android::JavaParamRef<jobject>(env, caller));
+}
+
+JNI_GENERATOR_EXPORT void Java_org_chromium_foo_Foo_nativeFoo(
+ JNIEnv* env,
+ jclass jcaller,
+ jlong nativeNativeObject,
+ jobject caller,
+ jint a) {
+ NativeObject* native = reinterpret_cast<NativeObject*>(nativeNativeObject);
+ CHECK_NATIVE_PTR(env, jcaller, native, "Foo");
+ return native->Foo(env, base::android::JavaParamRef<jobject>(env, caller), a);
+}
+
+JNI_GENERATOR_EXPORT void Java_org_chromium_foo_Foo_nativeCallNativeMethod(
+ JNIEnv* env,
+ jobject jcaller,
+ jlong nativePtr) {
+ Ptr* native = reinterpret_cast<Ptr*>(nativePtr);
+ CHECK_NATIVE_PTR(env, jcaller, native, "CallNativeMethod");
+ return native->CallNativeMethod(env, base::android::JavaParamRef<jobject>(env, jcaller));
+}
+
+JNI_GENERATOR_EXPORT void Java_org_chromium_foo_Foo_nativeCallWithQualifiedObject(
+ JNIEnv* env,
+ jobject jcaller,
+ jlong nativePtr) {
+ Foo::Bar* native = reinterpret_cast<Foo::Bar*>(nativePtr);
+ CHECK_NATIVE_PTR(env, jcaller, native, "CallWithQualifiedObject");
+ return native->CallWithQualifiedObject(env, base::android::JavaParamRef<jobject>(env, jcaller));
+}
+
+
+#endif // org_chromium_foo_Foo_JNI
diff --git a/chromium/base/android/jni_generator/golden/testTracing.golden b/chromium/base/android/jni_generator/golden/testTracing.golden
new file mode 100644
index 00000000000..63136a3082c
--- /dev/null
+++ b/chromium/base/android/jni_generator/golden/testTracing.golden
@@ -0,0 +1,106 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_generator.py
+// For
+// org/chromium/foo/Foo
+
+#ifndef org_chromium_foo_Foo_JNI
+#define org_chromium_foo_Foo_JNI
+
+#include <jni.h>
+
+#include "base/android/jni_generator/jni_generator_helper.h"
+
+
+// Step 1: Forward declarations.
+
+JNI_REGISTRATION_EXPORT extern const char kClassPath_org_chromium_foo_Foo[];
+const char kClassPath_org_chromium_foo_Foo[] = "org/chromium/foo/Foo";
+// Leaking this jclass as we cannot use LazyInstance from some threads.
+JNI_REGISTRATION_EXPORT std::atomic<jclass> g_org_chromium_foo_Foo_clazz(nullptr);
+#ifndef org_chromium_foo_Foo_clazz_defined
+#define org_chromium_foo_Foo_clazz_defined
+inline jclass org_chromium_foo_Foo_clazz(JNIEnv* env) {
+ return base::android::LazyGetClass(env, kClassPath_org_chromium_foo_Foo,
+ &g_org_chromium_foo_Foo_clazz);
+}
+#endif
+
+
+// Step 2: Constants (optional).
+
+
+// Step 3: Method stubs.
+namespace org {
+namespace chromium_foo {
+
+JNI_GENERATOR_EXPORT void Java_org_chromium_foo_Foo_nativeInstanceMethod(
+ JNIEnv* env,
+ jobject jcaller,
+ jlong nativeInstance) {
+ TRACE_EVENT0("jni", "org::chromium_foo::Instance::InstanceMethod");
+ Instance* native = reinterpret_cast<Instance*>(nativeInstance);
+ CHECK_NATIVE_PTR(env, jcaller, native, "InstanceMethod");
+ return native->InstanceMethod(env, base::android::JavaParamRef<jobject>(env, jcaller));
+}
+
+static void JNI_Foo_StaticMethod(JNIEnv* env);
+
+JNI_GENERATOR_EXPORT void Java_org_chromium_foo_Foo_nativeStaticMethod(
+ JNIEnv* env,
+ jclass jcaller) {
+ TRACE_EVENT0("jni", "org::chromium_foo::JNI_Foo_StaticMethod");
+ return JNI_Foo_StaticMethod(env);
+}
+
+
+static std::atomic<jmethodID> g_org_chromium_foo_Foo_Constructor(nullptr);
+static base::android::ScopedJavaLocalRef<jobject> Java_Foo_Constructor(JNIEnv* env) {
+ jclass clazz = org_chromium_foo_Foo_clazz(env);
+ CHECK_CLAZZ(env, clazz,
+ org_chromium_foo_Foo_clazz(env), NULL);
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "<init>",
+ "()V",
+ &g_org_chromium_foo_Foo_Constructor);
+
+ TRACE_EVENT0("jni", "org.chromium.foo.Foo.<init>");
+ jobject ret =
+ env->NewObject(clazz,
+ call_context.base.method_id);
+ return base::android::ScopedJavaLocalRef<jobject>(env, ret);
+}
+
+static std::atomic<jmethodID> g_org_chromium_foo_Foo_callbackFromNative(nullptr);
+static void Java_Foo_callbackFromNative(JNIEnv* env, const base::android::JavaRef<jobject>& obj) {
+ jclass clazz = org_chromium_foo_Foo_clazz(env);
+ CHECK_CLAZZ(env, obj.obj(),
+ org_chromium_foo_Foo_clazz(env));
+
+ jni_generator::JniJavaCallContextChecked call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_INSTANCE>(
+ env,
+ clazz,
+ "callbackFromNative",
+ "()V",
+ &g_org_chromium_foo_Foo_callbackFromNative);
+
+ TRACE_EVENT0("jni", "org.chromium.foo.Foo.callbackFromNative");
+ env->CallVoidMethod(obj.obj(),
+ call_context.base.method_id);
+}
+
+} // namespace chromium_foo
+} // namespace org
+
+#endif // org_chromium_foo_Foo_JNI
diff --git a/chromium/base/android/jni_generator/java/src/org/chromium/example/jni_generator/SampleForAnnotationProcessor.java b/chromium/base/android/jni_generator/java/src/org/chromium/example/jni_generator/SampleForAnnotationProcessor.java
new file mode 100644
index 00000000000..e1a2948f2cc
--- /dev/null
+++ b/chromium/base/android/jni_generator/java/src/org/chromium/example/jni_generator/SampleForAnnotationProcessor.java
@@ -0,0 +1,69 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.example.jni_generator;
+
+import org.chromium.base.annotations.NativeMethods;
+
+/**
+ * Sample class that uses the JNI annotation processor for static methods.
+ * See generated files at bottom.
+ */
+class SampleForAnnotationProcessor {
+ class TestStruct {
+ int mA;
+ int mB;
+ }
+ /**
+ * Static methods declared here, each of these refer to a native method
+ * which will have its declaration generated by our annotation processor.
+ * There will also be a class generated to wrap these native methods
+ * with the name SampleForAnnotationProcessorJni which will implement
+ * Natives.
+ */
+ @NativeMethods
+ interface Natives {
+ void foo();
+ SampleForAnnotationProcessor bar(SampleForAnnotationProcessor sample);
+ String revString(String stringToReverse);
+ String[] sendToNative(String[] strs);
+ SampleForAnnotationProcessor[] sendSamplesToNative(SampleForAnnotationProcessor[] strs);
+ boolean hasPhalange();
+
+ int[] testAllPrimitives(int zint, int[] ints, long zlong, long[] longs, short zshort,
+ short[] shorts, char zchar, char[] chars, byte zbyte, byte[] bytes, double zdouble,
+ double[] doubles, float zfloat, float[] floats, boolean zbool, boolean[] bools);
+
+ void testSpecialTypes(Class clazz, Class[] classes, Throwable throwable,
+ Throwable[] throwables, String string, String[] strings, TestStruct tStruct,
+ TestStruct[] structs, Object obj, Object[] objects);
+
+ Throwable returnThrowable();
+ Throwable[] returnThrowables();
+ Class returnClass();
+ Class[] returnClasses();
+ String returnString();
+ String[] returnStrings();
+ TestStruct returnStruct();
+ TestStruct[] returnStructs();
+ Object returnObject();
+ Object[] returnObjects();
+ }
+
+ void test() {
+ int[] x = new int[] {1, 2, 3, 4, 5};
+ String[] strs = new String[] {"the", "quick", "brown", "fox"};
+ strs = SampleForAnnotationProcessorJni.get().sendToNative(strs);
+
+ SampleForAnnotationProcessor[] samples =
+ new SampleForAnnotationProcessor[] {this, this, this};
+ samples = SampleForAnnotationProcessorJni.get().sendSamplesToNative(samples);
+
+ // Instance of Natives accessed through (classname + "Jni").get().
+ SampleForAnnotationProcessorJni.get().foo();
+ SampleForAnnotationProcessor sample = SampleForAnnotationProcessorJni.get().bar(this);
+ boolean hasPhalange = SampleForAnnotationProcessorJni.get().hasPhalange();
+ String s = SampleForAnnotationProcessorJni.get().revString("abcd");
+ }
+}
diff --git a/chromium/base/android/jni_generator/java/src/org/chromium/example/jni_generator/SampleForTests.java b/chromium/base/android/jni_generator/java/src/org/chromium/example/jni_generator/SampleForTests.java
new file mode 100644
index 00000000000..9deddf8dc30
--- /dev/null
+++ b/chromium/base/android/jni_generator/java/src/org/chromium/example/jni_generator/SampleForTests.java
@@ -0,0 +1,280 @@
+// Copyright 2012 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.example.jni_generator;
+
+import android.graphics.Rect;
+
+import org.chromium.base.annotations.AccessedByNative;
+import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.CalledByNativeUnchecked;
+import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeClassQualifiedName;
+import org.chromium.base.annotations.NativeMethods;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+// This class serves as a reference test for the bindings generator, and as example documentation
+// for how to use the jni generator.
+// The C++ counter-part is sample_for_tests.cc.
+// jni_generator/BUILD.gn has a jni_generator_tests target that will:
+// * Generate a header file for the JNI bindings based on this file.
+// * Generate a header file containing registration methods required to use C++ methods from this
+// file.
+// * Compile sample_for_tests.cc using the generated header file.
+// * link a native executable to prove the generated header + cc file are self-contained.
+// All comments are informational only, and are ignored by the jni generator.
+//
+// This JNINamespace annotation indicates that all native methods should be
+// generated inside this namespace, including the native class that this
+// object binds to.
+@JNINamespace("base::android")
+class SampleForTests {
+ // Classes can store their C++ pointer counterpart as an int that is normally initialized by
+ // calling out a SampleForTestsJni.get().init() function. Replace "CPPClass" with your
+ // particular class name!
+ long mNativeCPPObject;
+
+ // You can define methods and attributes on the java class just like any other.
+ // Methods without the @CalledByNative annotation won't be exposed to JNI.
+ public SampleForTests() {
+ }
+
+ public void startExample() {
+ // Calls C++ Init(...) method and holds a pointer to the C++ class.
+ mNativeCPPObject = SampleForTestsJni.get().init(this, "myParam");
+ }
+
+ public void doStuff() {
+ // This will call CPPClass::Method() using nativePtr as a pointer to the object. This must
+ // be done to:
+ // * avoid leaks.
+ // * using finalizers are not allowed to destroy the cpp class.
+ SampleForTestsJni.get().method(mNativeCPPObject, this);
+ }
+
+ public void finishExample() {
+ // We're done, so let's destroy nativePtr object.
+ SampleForTestsJni.get().destroy(mNativeCPPObject, this);
+ }
+
+ // ---------------------------------------------------------------------------------------------
+ // The following methods demonstrate exporting Java methods for invocation from C++ code.
+ // Java functions are mapping into C global functions by prefixing the method name with
+ // "Java_<Class>_"
+ // This is triggered by the @CalledByNative annotation; the methods may be named as you wish.
+
+ // Exported to C++ as:
+ // Java_SampleForTests_javaMethod(JNIEnv* env, jobject caller, jint foo, jint bar)
+ // Typically the C++ code would have obtained the jobject via the Init() call described above.
+ @CalledByNative
+ public int javaMethod(int foo, int bar) {
+ return 0;
+ }
+
+ // Exported to C++ as Java_SampleForTests_staticJavaMethod(JNIEnv* env)
+ // Note no jobject argument, as it is static.
+ @CalledByNative
+ public static boolean staticJavaMethod() {
+ return true;
+ }
+
+ // No prefix, so this method is package private. It will still be exported.
+ @CalledByNative
+ void packagePrivateJavaMethod() {
+ }
+
+ // Method signature with generics in params.
+ @CalledByNative
+ public void methodWithGenericParams(
+ Map<String, Map<String, String>> foo, LinkedList<Integer> bar) {}
+
+ // Constructors will be exported to C++ as:
+ // Java_SampleForTests_Constructor(JNIEnv* env, jint foo, jint bar)
+ @CalledByNative
+ public SampleForTests(int foo, int bar) {}
+
+ // Note the "Unchecked" suffix. By default, @CalledByNative will always generate bindings that
+ // call CheckException(). With "@CalledByNativeUnchecked", the client C++ code is responsible to
+ // call ClearException() and act as appropriate.
+ // See more details at the "@CalledByNativeUnchecked" annotation.
+ @CalledByNativeUnchecked
+ void methodThatThrowsException() {}
+
+ // The generator is not confused by inline comments:
+ // @CalledByNative void thisShouldNotAppearInTheOutput();
+ // @CalledByNativeUnchecked public static void neitherShouldThis(int foo);
+
+ /**
+ * The generator is not confused by block comments:
+ * @CalledByNative void thisShouldNotAppearInTheOutputEither();
+ * @CalledByNativeUnchecked public static void andDefinitelyNotThis(int foo);
+ */
+
+ // String constants that look like comments don't confuse the generator:
+ private String mArrgh = "*/*";
+
+ private @interface SomeAnnotation {}
+ private @interface AnotherAnnotation {}
+
+ // The generator is not confused by @Annotated parameters.
+ @CalledByNative
+ void javaMethodWithAnnotatedParam(@SomeAnnotation int foo, final @SomeAnnotation int bar,
+ @SomeAnnotation final int baz, @SomeAnnotation final @AnotherAnnotation int bat) {}
+
+ // ---------------------------------------------------------------------------------------------
+ // Java fields which are accessed from C++ code only must be annotated with @AccessedByNative to
+ // prevent them being eliminated when unreferenced code is stripped.
+ @AccessedByNative
+ private int mJavaField;
+
+ // This "struct" will be created by the native side using |createInnerStructA|,
+ // and used by the java-side somehow.
+ // Note that |@CalledByNative| has to contain the inner class name.
+ static class InnerStructA {
+ private final long mLong;
+ private final int mInt;
+ private final String mString;
+
+ private InnerStructA(long l, int i, String s) {
+ mLong = l;
+ mInt = i;
+ mString = s;
+ }
+
+ @CalledByNative("InnerStructA")
+ private static InnerStructA create(long l, int i, String s) {
+ return new InnerStructA(l, i, s);
+ }
+ }
+
+ private List<InnerStructA> mListInnerStructA = new ArrayList<InnerStructA>();
+
+ @CalledByNative
+ private void addStructA(InnerStructA a) {
+ // Called by the native side to append another element.
+ mListInnerStructA.add(a);
+ }
+
+ @CalledByNative
+ private void iterateAndDoSomething() {
+ Iterator<InnerStructA> it = mListInnerStructA.iterator();
+ while (it.hasNext()) {
+ InnerStructA element = it.next();
+ // Now, do something with element.
+ }
+ // Done, clear the list.
+ mListInnerStructA.clear();
+ }
+
+ // This "struct" will be created by the java side passed to native, which
+ // will use its getters.
+ // Note that |@CalledByNative| has to contain the inner class name.
+ static class InnerStructB {
+ private final long mKey;
+ private final String mValue;
+
+ private InnerStructB(long k, String v) {
+ mKey = k;
+ mValue = v;
+ }
+
+ @CalledByNative("InnerStructB")
+ private long getKey() {
+ return mKey;
+ }
+
+ @CalledByNative("InnerStructB")
+ private String getValue() {
+ return mValue;
+ }
+ }
+
+ List<InnerStructB> mListInnerStructB = new ArrayList<InnerStructB>();
+
+ void iterateAndDoSomethingWithMap() {
+ Iterator<InnerStructB> it = mListInnerStructB.iterator();
+ while (it.hasNext()) {
+ InnerStructB element = it.next();
+ // Now, do something with element.
+ SampleForTestsJni.get().addStructB(mNativeCPPObject, this, element);
+ }
+ SampleForTestsJni.get().iterateAndDoSomethingWithStructB(mNativeCPPObject, this);
+ }
+ interface InnerInterface {}
+ enum InnerEnum {}
+
+ @CalledByNative
+ static InnerInterface getInnerInterface() {
+ return null;
+ }
+
+ @CalledByNative
+ static InnerEnum getInnerEnum() {
+ return null;
+ }
+
+ // ---------------------------------------------------------------------------------------------
+ // The following methods demonstrate declaring methods to call into C++ from Java.
+ // The generator detects the type and name of the first parameter.
+ @NativeMethods
+ interface Natives {
+ // This declares a C++ function which the application code must implement:
+ // static jint Init(JNIEnv* env, jobject caller);
+ // The jobject parameter refers back to this java side object instance.
+ // The implementation must return the pointer to the C++ object cast to jint.
+ // The caller of this method should store it, and supply it as a the nativeCPPClass param to
+ // subsequent native method calls (see the methods below that take an "int native..." as
+ // first param).
+ long init(SampleForTests caller, String param);
+
+ // This defines a function binding to the associated C++ class member function. The name is
+ // derived from |nativeDestroy| and |nativeCPPClass| to arrive at CPPClass::Destroy() (i.e.
+ // native prefixes stripped).
+ //
+ // The |nativeCPPClass| is automatically cast to type CPPClass*, in order to obtain the
+ // object on which to invoke the member function. Replace "CPPClass" with your particular
+ // class name!
+ void destroy(long nativeCPPClass, SampleForTests caller);
+
+ // This declares a C++ function which the application code must implement:
+ // static jdouble GetDoubleFunction(JNIEnv* env, jobject caller);
+ // The jobject parameter refers back to this java side object instance.
+ double getDoubleFunction(SampleForTests caller);
+
+ // Similar to nativeGetDoubleFunction(), but here the C++ side will receive a jclass rather
+ // than jobject param, as the function is declared static.
+ float getFloatFunction();
+
+ // This function takes a non-POD datatype. We have a list mapping them to their full
+ // classpath in jni_generator.py JavaParamToJni. If you require a new datatype, make sure
+ // you add to that function.
+ void setNonPODDatatype(SampleForTests caller, Rect rect);
+
+ // This declares a C++ function which the application code must implement:
+ // static ScopedJavaLocalRef<jobject> GetNonPODDatatype(JNIEnv* env, jobject caller);
+ // The jobject parameter refers back to this java side object instance.
+ // Note that it returns a ScopedJavaLocalRef<jobject> so that you don' have to worry about
+ // deleting the JNI local reference. This is similar with Strings and arrays.
+ Object getNonPODDatatype(SampleForTests caller);
+
+ // Similar to nativeDestroy above, this will cast nativeCPPClass into pointer of CPPClass
+ // type and call its Method member function. Replace "CPPClass" with your particular class
+ // name!
+ int method(long nativeCPPClass, SampleForTests caller);
+
+ // Similar to nativeMethod above, but here the C++ fully qualified class name is taken from
+ // the annotation rather than parameter name, which can thus be chosen freely.
+ @NativeClassQualifiedName("CPPClass::InnerClass")
+ double methodOtherP0(long nativePtr, SampleForTests caller);
+
+ void addStructB(long nativeCPPClass, SampleForTests caller, InnerStructB b);
+ void iterateAndDoSomethingWithStructB(long nativeCPPClass, SampleForTests caller);
+ String returnAString(long nativeCPPClass, SampleForTests caller);
+ }
+}
diff --git a/chromium/base/android/jni_generator/java/src/org/chromium/example/jni_generator/SampleModule.java b/chromium/base/android/jni_generator/java/src/org/chromium/example/jni_generator/SampleModule.java
new file mode 100644
index 00000000000..f29ae123a75
--- /dev/null
+++ b/chromium/base/android/jni_generator/java/src/org/chromium/example/jni_generator/SampleModule.java
@@ -0,0 +1,21 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.example.jni_generator;
+
+import org.chromium.base.annotations.NativeMethods;
+
+class SampleModule {
+ void test() {
+ if (SampleForAnnotationProcessorJni.get().bar(1)) {
+ SampleForAnnotationProcessorJni.get().foo();
+ }
+ }
+
+ @NativeMethods("module")
+ interface Natives {
+ void foo();
+ boolean bar(int a);
+ }
+}
diff --git a/chromium/base/android/jni_generator/java/src/org/chromium/jni_generator/JniProcessor.java b/chromium/base/android/jni_generator/java/src/org/chromium/jni_generator/JniProcessor.java
new file mode 100644
index 00000000000..06af39bc018
--- /dev/null
+++ b/chromium/base/android/jni_generator/java/src/org/chromium/jni_generator/JniProcessor.java
@@ -0,0 +1,530 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.jni_generator;
+
+import com.google.auto.service.AutoService;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.squareup.javapoet.AnnotationSpec;
+import com.squareup.javapoet.ArrayTypeName;
+import com.squareup.javapoet.ClassName;
+import com.squareup.javapoet.FieldSpec;
+import com.squareup.javapoet.JavaFile;
+import com.squareup.javapoet.MethodSpec;
+import com.squareup.javapoet.ParameterSpec;
+import com.squareup.javapoet.ParameterizedTypeName;
+import com.squareup.javapoet.TypeName;
+import com.squareup.javapoet.TypeSpec;
+
+import org.chromium.base.JniStaticTestMocker;
+import org.chromium.base.NativeLibraryLoadedStatus;
+import org.chromium.base.annotations.NativeMethods;
+import org.chromium.build.annotations.CheckDiscard;
+import org.chromium.build.annotations.MainDex;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.annotation.processing.AbstractProcessor;
+import javax.annotation.processing.Processor;
+import javax.annotation.processing.RoundEnvironment;
+import javax.lang.model.SourceVersion;
+import javax.lang.model.element.Element;
+import javax.lang.model.element.ElementKind;
+import javax.lang.model.element.ExecutableElement;
+import javax.lang.model.element.Modifier;
+import javax.lang.model.element.TypeElement;
+import javax.lang.model.element.VariableElement;
+import javax.lang.model.type.ArrayType;
+import javax.lang.model.type.TypeKind;
+import javax.lang.model.type.TypeMirror;
+import javax.tools.Diagnostic;
+
+/**
+ * Annotation processor that finds inner interfaces annotated with
+ * {@link NativeMethods} and generates a class with native bindings
+ * (GEN_JNI) and a class specific wrapper class with name (classnameJni)
+ *
+ * NativeClass - refers to the class that contains all native declarations.
+ * NativeWrapperClass - refers to the class that is generated for each class
+ * containing an interface annotated with NativeMethods.
+ *
+ */
+@AutoService(Processor.class)
+public class JniProcessor extends AbstractProcessor {
+ private static final Class<NativeMethods> JNI_STATIC_NATIVES_CLASS = NativeMethods.class;
+ private static final Class<MainDex> MAIN_DEX_CLASS = MainDex.class;
+ private static final Class<CheckDiscard> CHECK_DISCARD_CLASS = CheckDiscard.class;
+
+ private static final String CHECK_DISCARD_CRBUG = "crbug.com/993421";
+ private static final String NATIVE_WRAPPER_CLASS_POSTFIX = "Jni";
+
+ private static final ClassName JNI_STATUS_CLASS_NAME =
+ ClassName.get(NativeLibraryLoadedStatus.class);
+
+ static final String NATIVE_TEST_FIELD_NAME = "TESTING_ENABLED";
+ static final String NATIVE_REQUIRE_MOCK_FIELD_NAME = "REQUIRE_MOCK";
+
+ // Builder for NativeClass which will hold all our native method declarations.
+ private TypeSpec.Builder mNativesBuilder;
+
+ private ClassName mGenJniClassName = ClassName.get("org.chromium.base.natives", "GEN_JNI");
+
+ // Types that are non-primitives and should not be
+ // casted to objects in native method declarations.
+ static final ImmutableSet JNI_OBJECT_TYPE_EXCEPTIONS =
+ ImmutableSet.of("java.lang.String", "java.lang.Throwable", "java.lang.Class", "void");
+
+ static String getNameOfWrapperClass(String containingClassName) {
+ return containingClassName + NATIVE_WRAPPER_CLASS_POSTFIX;
+ }
+
+ @Override
+ public Set<String> getSupportedAnnotationTypes() {
+ return ImmutableSet.of(JNI_STATIC_NATIVES_CLASS.getCanonicalName());
+ }
+
+ @Override
+ public SourceVersion getSupportedSourceVersion() {
+ return SourceVersion.latestSupported();
+ }
+
+ /**
+ * Processes annotations that match getSupportedAnnotationTypes()
+ * Called each 'round' of annotation processing, must fail gracefully if set is empty.
+ */
+ @Override
+ public boolean process(
+ Set<? extends TypeElement> annotations, RoundEnvironment roundEnvironment) {
+ // Do nothing on an empty round.
+ if (annotations.isEmpty()) {
+ return true;
+ }
+
+ List<JavaFile> writeQueue = Lists.newArrayList();
+ for (Element e : roundEnvironment.getElementsAnnotatedWith(JNI_STATIC_NATIVES_CLASS)) {
+ // @NativeMethods can only annotate types so this is safe.
+ TypeElement type = (TypeElement) e;
+
+ if (!e.getKind().isInterface()) {
+ printError("@NativeMethods must annotate an interface", e);
+ }
+
+ if (mNativesBuilder == null) {
+ String genJniPrefix = e.getAnnotation(JNI_STATIC_NATIVES_CLASS).value();
+ if (!genJniPrefix.isEmpty()) {
+ mGenJniClassName =
+ ClassName.get("org.chromium.base.natives", genJniPrefix + "_GEN_JNI");
+ }
+
+ FieldSpec.Builder testingFlagBuilder =
+ FieldSpec.builder(TypeName.BOOLEAN, NATIVE_TEST_FIELD_NAME)
+ .addModifiers(Modifier.STATIC, Modifier.PUBLIC);
+ FieldSpec.Builder throwFlagBuilder =
+ FieldSpec.builder(TypeName.BOOLEAN, NATIVE_REQUIRE_MOCK_FIELD_NAME)
+ .addModifiers(Modifier.STATIC, Modifier.PUBLIC);
+
+ // State of mNativesBuilder needs to be preserved between processing rounds.
+ mNativesBuilder = TypeSpec.classBuilder(mGenJniClassName)
+ .addModifiers(Modifier.PUBLIC, Modifier.FINAL)
+ .addField(testingFlagBuilder.build())
+ .addField(throwFlagBuilder.build());
+ }
+
+ // Interface must be nested within a class.
+ Element outerElement = e.getEnclosingElement();
+ if (!(outerElement instanceof TypeElement)) {
+ printError(
+ "Interface annotated with @JNIInterface must be nested within a class", e);
+ }
+
+ TypeElement outerType = (TypeElement) outerElement;
+ ClassName outerTypeName = ClassName.get(outerType);
+ String outerClassName = outerTypeName.simpleName();
+ String packageName = outerTypeName.packageName();
+
+ // Get all methods in annotated interface.
+ List<ExecutableElement> interfaceMethods = getMethodsFromType(type);
+
+ // Map from the current method names to the method spec for a static native
+ // method that will be in our big NativeClass.
+ // Collisions are not allowed - no overloading.
+ Map<String, MethodSpec> methodMap =
+ createNativeMethodSpecs(interfaceMethods, outerTypeName);
+
+ // Add these to our NativeClass.
+ for (MethodSpec method : methodMap.values()) {
+ mNativesBuilder.addMethod(method);
+ }
+
+ // Generate a NativeWrapperClass for outerType by implementing the
+ // annotated interface. Need to pass it the method map because each
+ // method overridden will be a wrapper that calls its
+ // native counterpart in NativeClass.
+ boolean isNativesInterfacePublic = type.getModifiers().contains(Modifier.PUBLIC);
+ // If the outerType needs to be in the main dex, then the generated NativeWrapperClass
+ // should also be added to the main dex.
+ boolean addMainDexAnnotation = outerElement.getAnnotation(MAIN_DEX_CLASS) != null;
+
+ TypeSpec nativeWrapperClassSpec =
+ createNativeWrapperClassSpec(getNameOfWrapperClass(outerClassName),
+ isNativesInterfacePublic, addMainDexAnnotation, type, methodMap);
+
+ // Queue this file for writing.
+ // Can't write right now because the wrapper class depends on NativeClass
+ // to be written and we can't write NativeClass until all @NativeMethods
+ // interfaces are processed because each will add new native methods.
+ JavaFile file = JavaFile.builder(packageName, nativeWrapperClassSpec)
+ .addFileComment("Generated by JniProcessor.java")
+ .build();
+ writeQueue.add(file);
+ }
+
+ // Nothing needs to be written this round.
+ if (writeQueue.size() == 0) {
+ return true;
+ }
+
+ try {
+ // Need to write NativeClass first because the wrapper classes
+ // depend on it.
+ JavaFile nativeClassFile =
+ JavaFile.builder(mGenJniClassName.packageName(), mNativesBuilder.build())
+ .addFileComment("Generated by JniProcessor.java")
+ .build();
+
+ nativeClassFile.writeTo(processingEnv.getFiler());
+
+ for (JavaFile f : writeQueue) {
+ f.writeTo(processingEnv.getFiler());
+ }
+ } catch (Exception e) {
+ processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, e.getMessage());
+ }
+ return true;
+ }
+
+ List<ExecutableElement> getMethodsFromType(TypeElement t) {
+ List<ExecutableElement> methods = Lists.newArrayList();
+ for (Element e : t.getEnclosedElements()) {
+ if (e.getKind() == ElementKind.METHOD) {
+ methods.add((ExecutableElement) e);
+ }
+ }
+ return methods;
+ }
+
+ /**
+ * Gets method name for methods inside of NativeClass
+ */
+ String getNativeMethodName(String packageName, String className, String oldMethodName) {
+ // e.g. org.chromium.base.Foo_Class.bar
+ // => org_chromium_base_Foo_1Class_bar()
+ return String.format("%s.%s.%s", packageName, className, oldMethodName)
+ .replaceAll("_", "_1")
+ .replaceAll("\\.", "_");
+ }
+
+ /**
+ * Creates method specs for the native methods of NativeClass given
+ * the method declarations from a {@link NativeMethods} annotated interface
+ * @param interfaceMethods method declarations from a {@link NativeMethods} annotated
+ * interface
+ * @param outerType ClassName of class that contains the annotated interface
+ * @return map from old method name to new native method specification
+ */
+ Map<String, MethodSpec> createNativeMethodSpecs(
+ List<ExecutableElement> interfaceMethods, ClassName outerType) {
+ Map<String, MethodSpec> methodMap = Maps.newTreeMap();
+ for (ExecutableElement m : interfaceMethods) {
+ String oldMethodName = m.getSimpleName().toString();
+ String newMethodName = getNativeMethodName(
+ outerType.packageName(), outerType.simpleName(), oldMethodName);
+ MethodSpec.Builder builder = MethodSpec.methodBuilder(newMethodName)
+ .addModifiers(Modifier.PUBLIC)
+ .addModifiers(Modifier.FINAL)
+ .addModifiers(Modifier.STATIC)
+ .addModifiers(Modifier.NATIVE);
+ builder.addJavadoc(createNativeMethodJavadocString(outerType, m));
+
+ copyMethodParamsAndReturnType(builder, m, true);
+ if (methodMap.containsKey(oldMethodName)) {
+ printError("Overloading is not currently implemented with this processor ", m);
+ }
+ methodMap.put(oldMethodName, builder.build());
+ }
+ return methodMap;
+ }
+
+ /**
+ * Creates a generated annotation that contains the name of this class.
+ */
+ static AnnotationSpec createAnnotationWithValue(Class<?> annotationClazz, String value) {
+ return AnnotationSpec.builder(annotationClazz)
+ .addMember("value", String.format("\"%s\"", value))
+ .build();
+ }
+
+ void printError(String s) {
+ processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, s);
+ }
+
+ void printError(String s, Element e) {
+ processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR,
+ String.format("Error processing @NativeMethods interface: %s", s), e);
+ }
+
+ /**
+ * Creates a class spec for an implementation of an {@link NativeMethods} annotated interface
+ * that will wrap calls to the NativesClass which contains the actual native method
+ * declarations.
+ *
+ * This class should contain:
+ * 1. Wrappers for all GEN_JNI static native methods
+ * 2. A getter that when testing is disabled, will return the native implementation and
+ * when testing is enabled, will call the mock of the native implementation.
+ * 3. A field that holds the testNatives instance for when testing is enabled
+ * 4. A TEST_HOOKS field that implements an anonymous instance of {@link JniStaticTestMocker}
+ * which will set the testNatives implementation when called in tests
+ *
+ * @param name name of the wrapper class.
+ * @param isPublic if true, a public modifier will be added to this native wrapper.
+ * @param isMainDex if true, the @MainDex annotation will be added to this native wrapper.
+ * @param nativeInterface the {@link NativeMethods} annotated type that this native wrapper
+ * will implement.
+ * @param methodMap a map from the old method name to the new method spec in NativeClass.
+ * */
+ TypeSpec createNativeWrapperClassSpec(String name, boolean isPublic, boolean isMainDex,
+ TypeElement nativeInterface, Map<String, MethodSpec> methodMap) {
+ // The wrapper class builder.
+ TypeName nativeInterfaceType = TypeName.get(nativeInterface.asType());
+ TypeSpec.Builder builder =
+ TypeSpec.classBuilder(name).addSuperinterface(nativeInterfaceType);
+ if (isPublic) {
+ builder.addModifiers(Modifier.PUBLIC);
+ }
+ if (isMainDex) {
+ builder.addAnnotation(MAIN_DEX_CLASS);
+ }
+ builder.addAnnotation(createAnnotationWithValue(CHECK_DISCARD_CLASS, CHECK_DISCARD_CRBUG));
+
+ // Start by adding all the native method wrappers.
+ for (Element enclosed : nativeInterface.getEnclosedElements()) {
+ if (enclosed.getKind() != ElementKind.METHOD) {
+ printError("Cannot have a non-method in a @NativeMethods annotated interface",
+ enclosed);
+ }
+
+ // ElementKind.Method is ExecutableElement so this cast is safe.
+ // interfaceMethod will is the method we are overloading.
+ ExecutableElement interfaceMethod = (ExecutableElement) enclosed;
+
+ // Method in NativesClass that we'll be calling.
+ MethodSpec nativesMethod = methodMap.get(interfaceMethod.getSimpleName().toString());
+
+ // Add a matching method in this class that overrides the declaration
+ // in nativeInterface. It will just call the actual natives method in
+ // NativeClass.
+ builder.addMethod(createNativeWrapperMethod(interfaceMethod, nativesMethod));
+ }
+
+ // Add the testInstance field.
+ // Holds the test natives target if it is set.
+ FieldSpec testTarget = FieldSpec.builder(nativeInterfaceType, "testInstance")
+ .addModifiers(Modifier.PRIVATE, Modifier.STATIC)
+ .build();
+ builder.addField(testTarget);
+
+ // Getter for target or testing instance if flag in GEN_JNI is set.
+ /*
+ {classname}.Natives get() {
+ if (GEN_JNI.TESTING_ENABLED) {
+ if (testInst != null) {
+ return testInst;
+ }
+ if (GEN_JNI.REQUIRE_MOCK) {
+ throw new UnsupportedOperationException($noMockExceptionString);
+ }
+ }
+ NativeLibraryLoadedStatus.checkLoaded($isMainDex)
+ return new {classname}Jni();
+ }
+ */
+ String noMockExceptionString =
+ String.format("No mock found for the native implementation for %s. "
+ + "The current configuration requires all native "
+ + "implementations to have a mock instance.",
+ nativeInterfaceType);
+
+ MethodSpec instanceGetter =
+ MethodSpec.methodBuilder("get")
+ .addModifiers(Modifier.PUBLIC, Modifier.STATIC)
+ .returns(nativeInterfaceType)
+ .beginControlFlow("if ($T.$N)", mGenJniClassName, NATIVE_TEST_FIELD_NAME)
+ .beginControlFlow("if ($N != null)", testTarget)
+ .addStatement("return $N", testTarget)
+ .endControlFlow()
+ .beginControlFlow(
+ "if ($T.$N)", mGenJniClassName, NATIVE_REQUIRE_MOCK_FIELD_NAME)
+ .addStatement("throw new UnsupportedOperationException($S)",
+ noMockExceptionString)
+ .endControlFlow()
+ .endControlFlow()
+ .addStatement("$T.$N($L)", JNI_STATUS_CLASS_NAME, "checkLoaded", isMainDex)
+ .addStatement("return new $N()", name)
+ .build();
+
+ builder.addMethod(instanceGetter);
+
+ // Next add TEST_HOOKS to set testInstance... should look like this:
+ // JniStaticTestMocker<ClassNameJni> TEST_HOOKS = new JniStaticTestMocker<>() {
+ // @Override
+ // public static setInstanceForTesting(ClassNameJni instance) {
+ // if (!GEN_JNI.TESTING_ENABLED) {
+ // throw new RuntimeException($mocksNotEnabledExceptionString);
+ // }
+ // testInstance = instance;
+ // }
+ // }
+ String mocksNotEnabledExceptionString =
+ "Tried to set a JNI mock when mocks aren't enabled!";
+ MethodSpec testHookMockerMethod =
+ MethodSpec.methodBuilder("setInstanceForTesting")
+ .addModifiers(Modifier.PUBLIC)
+ .addAnnotation(Override.class)
+ .addParameter(nativeInterfaceType, "instance")
+ .beginControlFlow("if (!$T.$N)", mGenJniClassName, NATIVE_TEST_FIELD_NAME)
+ .addStatement(
+ "throw new RuntimeException($S)", mocksNotEnabledExceptionString)
+ .endControlFlow()
+ .addStatement("$N = instance", testTarget)
+ .build();
+
+ // Make the anonymous TEST_HOOK class.
+ ParameterizedTypeName genericMockerInterface = ParameterizedTypeName.get(
+ ClassName.get(JniStaticTestMocker.class), ClassName.get(nativeInterface));
+
+ TypeSpec testHook = TypeSpec.anonymousClassBuilder("")
+ .addSuperinterface(genericMockerInterface)
+ .addMethod(testHookMockerMethod)
+ .build();
+
+ FieldSpec testHookSpec =
+ FieldSpec.builder(genericMockerInterface, "TEST_HOOKS")
+ .addModifiers(Modifier.STATIC, Modifier.PUBLIC, Modifier.FINAL)
+ .initializer("$L", testHook.toString())
+ .build();
+
+ builder.addField(testHookSpec);
+ return builder.build();
+ }
+
+ /**
+ * Creates a wrapper method that overrides interfaceMethod and calls staticNativeMethod.
+ * @param interfaceMethod method that will be overridden in a {@link NativeMethods} annotated
+ * interface.
+ * @param staticNativeMethod method that will be called in NativeClass.
+ */
+ MethodSpec createNativeWrapperMethod(
+ ExecutableElement interfaceMethod, MethodSpec staticNativeMethod) {
+ // Method will have the same name and be public.
+ MethodSpec.Builder builder =
+ MethodSpec.methodBuilder(interfaceMethod.getSimpleName().toString())
+ .addModifiers(Modifier.PUBLIC)
+ .addAnnotation(Override.class);
+
+ // Method will need the same params and return type as the one we're overriding.
+ copyMethodParamsAndReturnType(builder, interfaceMethod);
+
+ // Add return if method return type is not void.
+ if (!interfaceMethod.getReturnType().toString().equals("void")) {
+ // Also need to cast because non-primitives are Objects in NativeClass.
+ builder.addCode("return ($T)", interfaceMethod.getReturnType());
+ }
+
+ // Make call to native function.
+ builder.addCode("$T.$N(", mGenJniClassName, staticNativeMethod);
+
+ // Add params to native call.
+ ArrayList<String> paramNames = new ArrayList<>();
+ for (VariableElement param : interfaceMethod.getParameters()) {
+ paramNames.add(param.getSimpleName().toString());
+ }
+
+ builder.addCode(String.join(", ", paramNames) + ");\n");
+ return builder.build();
+ }
+
+ boolean shouldDowncastToObjectForJni(TypeName t) {
+ if (t.isPrimitive()) {
+ return false;
+ }
+ // There are some non-primitives that should not be downcasted.
+ return !JNI_OBJECT_TYPE_EXCEPTIONS.contains(t.toString());
+ }
+
+ TypeName toTypeName(TypeMirror t, boolean useJni) {
+ if (t.getKind() == TypeKind.ARRAY) {
+ return ArrayTypeName.of(toTypeName(((ArrayType) t).getComponentType(), useJni));
+ }
+ TypeName typeName = TypeName.get(t);
+ if (useJni && shouldDowncastToObjectForJni(typeName)) {
+ return TypeName.OBJECT;
+ }
+ return typeName;
+ }
+
+ /**
+ * Since some types may decay to objects in the native method
+ * this method returns a javadoc string that contains the
+ * type information from the old method.
+ **/
+ String createNativeMethodJavadocString(ClassName outerType, ExecutableElement oldMethod) {
+ ArrayList<String> docLines = new ArrayList<>();
+
+ // Class descriptor.
+ String descriptor = String.format("%s.%s.%s", outerType.packageName(),
+ outerType.simpleName(), oldMethod.getSimpleName().toString());
+ docLines.add(descriptor);
+
+ // Parameters.
+ for (VariableElement param : oldMethod.getParameters()) {
+ TypeName paramType = TypeName.get(param.asType());
+ String paramTypeName = paramType.toString();
+ String name = param.getSimpleName().toString();
+ docLines.add(String.format("@param %s (%s)", name, paramTypeName));
+ }
+
+ // Return type.
+ docLines.add(String.format("@return (%s)", oldMethod.getReturnType().toString()));
+
+ return String.join("\n", docLines) + "\n";
+ }
+
+ void copyMethodParamsAndReturnType(
+ MethodSpec.Builder builder, ExecutableElement method, boolean useJniTypes) {
+ for (VariableElement param : method.getParameters()) {
+ builder.addParameter(createParamSpec(param, useJniTypes));
+ }
+ TypeMirror givenReturnType = method.getReturnType();
+ TypeName returnType = toTypeName(givenReturnType, useJniTypes);
+
+ builder.returns(returnType);
+ }
+
+ void copyMethodParamsAndReturnType(MethodSpec.Builder builder, ExecutableElement method) {
+ copyMethodParamsAndReturnType(builder, method, false);
+ }
+
+ ParameterSpec createParamSpec(VariableElement param, boolean useJniObjects) {
+ TypeName paramType = toTypeName(param.asType(), useJniObjects);
+ return ParameterSpec.builder(paramType, param.getSimpleName().toString())
+ .addModifiers(param.getModifiers())
+ .build();
+ }
+}
diff --git a/chromium/base/android/jni_generator/jni_generator.py b/chromium/base/android/jni_generator/jni_generator.py
new file mode 100755
index 00000000000..0b2aa0bbf8a
--- /dev/null
+++ b/chromium/base/android/jni_generator/jni_generator.py
@@ -0,0 +1,1720 @@
+#!/usr/bin/env python3
+# Copyright 2012 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Extracts native methods from a Java file and generates the JNI bindings.
+If you change this, please run and update the tests."""
+import argparse
+import base64
+import collections
+import hashlib
+import os
+import re
+import shutil
+from string import Template
+import subprocess
+import sys
+import tempfile
+import textwrap
+import zipfile
+
+_FILE_DIR = os.path.dirname(__file__)
+_CHROMIUM_SRC = os.path.join(_FILE_DIR, os.pardir, os.pardir, os.pardir)
+_BUILD_ANDROID_GYP = os.path.join(_CHROMIUM_SRC, 'build', 'android', 'gyp')
+
+# Item 0 of sys.path is the directory of the main file; item 1 is PYTHONPATH
+# (if set); item 2 is system libraries.
+sys.path.insert(1, _BUILD_ANDROID_GYP)
+
+from util import build_utils
+
+# Match single line comments, multiline comments, character literals, and
+# double-quoted strings.
+_COMMENT_REMOVER_REGEX = re.compile(
+ r'//.*?$|/\*.*?\*/|\'(?:\\.|[^\\\'])*\'|"(?:\\.|[^\\"])*"',
+ re.DOTALL | re.MULTILINE)
+
+_EXTRACT_NATIVES_REGEX = re.compile(
+ r'(@NativeClassQualifiedName'
+ r'\(\"(?P<native_class_name>.*?)\"\)\s+)?'
+ r'(@NativeCall(\(\"(?P<java_class_name>.*?)\"\))\s+)?'
+ r'(?P<qualifiers>\w+\s\w+|\w+|\s+)\s*native '
+ r'(?P<return_type>\S*) '
+ r'(?P<name>native\w+)\((?P<params>.*?)\);')
+
+_MAIN_DEX_REGEX = re.compile(r'^\s*(?:@(?:\w+\.)*\w+\s+)*@MainDex\b',
+ re.MULTILINE)
+
+# Matches on method declarations unlike _EXTRACT_NATIVES_REGEX
+# doesn't require name to be prefixed with native, and does not
+# require a native qualifier.
+_EXTRACT_METHODS_REGEX = re.compile(
+ r'(@NativeClassQualifiedName'
+ r'\(\"(?P<native_class_name>.*?)\"\)\s*)?'
+ r'(?P<qualifiers>'
+ r'((public|private|static|final|abstract|protected|native)\s*)*)\s+'
+ r'(?P<return_type>\S*)\s+'
+ r'(?P<name>\w+)\((?P<params>.*?)\);',
+ flags=re.DOTALL)
+
+_NATIVE_PROXY_EXTRACTION_REGEX = re.compile(
+ r'@NativeMethods(?:\(\s*"(?P<module_name>\w+)"\s*\))?[\S\s]+?interface\s*'
+ r'(?P<interface_name>\w*)\s*(?P<interface_body>{(\s*.*)+?\s*})')
+
+# Use 100 columns rather than 80 because it makes many lines more readable.
+_WRAP_LINE_LENGTH = 100
+# WrapOutput() is fairly slow. Pre-creating TextWrappers helps a bit.
+_WRAPPERS_BY_INDENT = [
+ textwrap.TextWrapper(
+ width=_WRAP_LINE_LENGTH,
+ expand_tabs=False,
+ replace_whitespace=False,
+ subsequent_indent=' ' * (indent + 4),
+ break_long_words=False) for indent in range(50)
+] # 50 chosen experimentally.
+
+JAVA_POD_TYPE_MAP = {
+ 'int': 'jint',
+ 'byte': 'jbyte',
+ 'char': 'jchar',
+ 'short': 'jshort',
+ 'boolean': 'jboolean',
+ 'long': 'jlong',
+ 'double': 'jdouble',
+ 'float': 'jfloat',
+}
+
+JAVA_TYPE_MAP = {
+ 'void': 'void',
+ 'String': 'jstring',
+ 'Class': 'jclass',
+ 'Throwable': 'jthrowable',
+ 'java/lang/String': 'jstring',
+ 'java/lang/Class': 'jclass',
+ 'java/lang/Throwable': 'jthrowable',
+}
+
+
+class ParseError(Exception):
+ """Exception thrown when we can't parse the input file."""
+
+ def __init__(self, description, *context_lines):
+ Exception.__init__(self)
+ self.description = description
+ self.context_lines = context_lines
+
+ def __str__(self):
+ context = '\n'.join(self.context_lines)
+ return '***\nERROR: %s\n\n%s\n***' % (self.description, context)
+
+
+class Param(object):
+ """Describes a param for a method, either java or native."""
+
+ def __init__(self, **kwargs):
+ self.annotations = kwargs.get('annotations', [])
+ self.datatype = kwargs['datatype']
+ self.name = kwargs['name']
+
+
+class NativeMethod(object):
+ """Describes a C/C++ method that is called by Java code"""
+
+ def __init__(self, **kwargs):
+ self.static = kwargs['static']
+ self.java_class_name = kwargs['java_class_name']
+ self.return_type = kwargs['return_type']
+ self.params = kwargs['params']
+ self.is_proxy = kwargs.get('is_proxy', False)
+
+ self.name = kwargs['name']
+ if self.is_proxy:
+ # Proxy methods don't have a native prefix so the first letter is
+ # lowercase. But we still want the CPP declaration to use upper camel
+ # case for the method name.
+ self.name = self.name[0].upper() + self.name[1:]
+
+ self.proxy_name = kwargs.get('proxy_name', self.name)
+ self.hashed_proxy_name = kwargs.get('hashed_proxy_name', None)
+ self.switch_num = None
+
+ if self.params:
+ assert type(self.params) is list
+ assert type(self.params[0]) is Param
+
+ ptr_type = kwargs.get('ptr_type', 'int')
+ if (self.params and self.params[0].datatype == ptr_type
+ and self.params[0].name.startswith('native')):
+ self.ptr_type = ptr_type
+ self.type = 'method'
+ self.p0_type = kwargs.get('p0_type')
+ if self.p0_type is None:
+ self.p0_type = self.params[0].name[len('native'):]
+ if kwargs.get('native_class_name'):
+ self.p0_type = kwargs['native_class_name']
+ else:
+ self.type = 'function'
+ self.method_id_var_name = kwargs.get('method_id_var_name', None)
+ self.return_and_signature = (self.return_type,
+ tuple(p.datatype for p in self.params))
+
+
+class CalledByNative(object):
+ """Describes a java method exported to c/c++"""
+
+ def __init__(self, **kwargs):
+ self.system_class = kwargs['system_class']
+ self.unchecked = kwargs['unchecked']
+ self.static = kwargs['static']
+ self.java_class_name = kwargs['java_class_name']
+ self.return_type = kwargs['return_type']
+ self.name = kwargs['name']
+ self.params = kwargs['params']
+ self.method_id_var_name = kwargs.get('method_id_var_name', None)
+ self.signature = kwargs.get('signature')
+ self.is_constructor = kwargs.get('is_constructor', False)
+ self.env_call = GetEnvCall(self.is_constructor, self.static,
+ self.return_type)
+ self.static_cast = GetStaticCastForReturnType(self.return_type)
+
+
+class ConstantField(object):
+
+ def __init__(self, **kwargs):
+ self.name = kwargs['name']
+ self.value = kwargs['value']
+
+
+def JavaDataTypeToC(java_type):
+ """Returns a C datatype for the given java type."""
+ java_type = _StripGenerics(java_type)
+ if java_type in JAVA_POD_TYPE_MAP:
+ return JAVA_POD_TYPE_MAP[java_type]
+ elif java_type in JAVA_TYPE_MAP:
+ return JAVA_TYPE_MAP[java_type]
+ elif java_type.endswith('[]'):
+ if java_type[:-2] in JAVA_POD_TYPE_MAP:
+ return JAVA_POD_TYPE_MAP[java_type[:-2]] + 'Array'
+ return 'jobjectArray'
+ else:
+ return 'jobject'
+
+
+def JavaTypeToProxyCast(java_type):
+ """Maps from a java type to the type used by the native proxy GEN_JNI class"""
+ # All the types and array types of JAVA_TYPE_MAP become jobjectArray across
+ # jni but they still need to be passed as the original type on the java side.
+ raw_type = java_type.rstrip('[]')
+ if raw_type in JAVA_POD_TYPE_MAP or raw_type in JAVA_TYPE_MAP:
+ return java_type
+
+ # All other types should just be passed as Objects or Object arrays.
+ return 'Object' + java_type[len(raw_type):]
+
+
+def WrapCTypeForDeclaration(c_type):
+ """Wrap the C datatype in a JavaRef if required."""
+ if re.match(RE_SCOPED_JNI_TYPES, c_type):
+ return 'const base::android::JavaParamRef<' + c_type + '>&'
+ else:
+ return c_type
+
+
+def _JavaDataTypeToCForDeclaration(java_type):
+ """Returns a JavaRef-wrapped C datatype for the given java type."""
+ return WrapCTypeForDeclaration(JavaDataTypeToC(java_type))
+
+
+def JavaDataTypeToCForCalledByNativeParam(java_type):
+ """Returns a C datatype to be when calling from native."""
+ if java_type == 'int':
+ return 'JniIntWrapper'
+ else:
+ c_type = JavaDataTypeToC(java_type)
+ if re.match(RE_SCOPED_JNI_TYPES, c_type):
+ return 'const base::android::JavaRef<' + c_type + '>&'
+ else:
+ return c_type
+
+
+def JavaReturnValueToC(java_type):
+ """Returns a valid C return value for the given java type."""
+ java_pod_type_map = {
+ 'int': '0',
+ 'byte': '0',
+ 'char': '0',
+ 'short': '0',
+ 'boolean': 'false',
+ 'long': '0',
+ 'double': '0',
+ 'float': '0',
+ 'void': ''
+ }
+ return java_pod_type_map.get(java_type, 'NULL')
+
+
+def _GetJNIFirstParam(native, for_declaration):
+ c_type = 'jclass' if native.static else 'jobject'
+
+ if for_declaration:
+ c_type = WrapCTypeForDeclaration(c_type)
+ return [c_type + ' jcaller']
+
+
+def _GetParamsInDeclaration(native):
+ """Returns the params for the forward declaration.
+
+ Args:
+ native: the native dictionary describing the method.
+
+ Returns:
+ A string containing the params.
+ """
+ if not native.static:
+ return _GetJNIFirstParam(native, True) + [
+ _JavaDataTypeToCForDeclaration(param.datatype) + ' ' + param.name
+ for param in native.params
+ ]
+ return [
+ _JavaDataTypeToCForDeclaration(param.datatype) + ' ' + param.name
+ for param in native.params
+ ]
+
+
+def GetParamsInStub(native):
+ """Returns the params for the stub declaration.
+
+ Args:
+ native: the native dictionary describing the method.
+
+ Returns:
+ A string containing the params.
+ """
+ params = [JavaDataTypeToC(p.datatype) + ' ' + p.name for p in native.params]
+ params = _GetJNIFirstParam(native, False) + params
+ return ',\n '.join(params)
+
+
+def _StripGenerics(value):
+ """Strips Java generics from a string."""
+ nest_level = 0 # How deeply we are nested inside the generics.
+ start_index = 0 # Starting index of the last non-generic region.
+ out = []
+
+ for i, c in enumerate(value):
+ if c == '<':
+ if nest_level == 0:
+ out.append(value[start_index:i])
+ nest_level += 1
+ elif c == '>':
+ start_index = i + 1
+ nest_level -= 1
+ out.append(value[start_index:])
+
+ return ''.join(out)
+
+
+def _NameIsTestOnly(name):
+ return name.endswith('ForTest') or name.endswith('ForTesting')
+
+
+class JniParams(object):
+ """Get JNI related parameters."""
+
+ def __init__(self, fully_qualified_class):
+ self._fully_qualified_class = 'L' + fully_qualified_class
+ self._package = '/'.join(fully_qualified_class.split('/')[:-1])
+ self._imports = []
+ self._inner_classes = []
+ self._implicit_imports = []
+
+ def ExtractImportsAndInnerClasses(self, contents):
+ contents = contents.replace('\n', '')
+ re_import = re.compile(r'import.*?(?P<class>\S*?);')
+ for match in re.finditer(re_import, contents):
+ self._imports += ['L' + match.group('class').replace('.', '/')]
+
+ re_inner = re.compile(r'(class|interface|enum)\s+?(?P<name>\w+?)\W')
+ for match in re.finditer(re_inner, contents):
+ inner = match.group('name')
+ if not self._fully_qualified_class.endswith(inner):
+ self._inner_classes += [self._fully_qualified_class + '$' + inner]
+
+ re_additional_imports = re.compile(
+ r'@JNIAdditionalImport\(\s*{?(?P<class_names>.*?)}?\s*\)')
+ for match in re.finditer(re_additional_imports, contents):
+ for class_name in match.group('class_names').split(','):
+ self._AddAdditionalImport(class_name.strip())
+
+ def JavaToJni(self, param):
+ """Converts a java param into a JNI signature type."""
+ pod_param_map = {
+ 'int': 'I',
+ 'boolean': 'Z',
+ 'char': 'C',
+ 'short': 'S',
+ 'long': 'J',
+ 'double': 'D',
+ 'float': 'F',
+ 'byte': 'B',
+ 'void': 'V',
+ }
+ object_param_list = [
+ 'Ljava/lang/Boolean',
+ 'Ljava/lang/Integer',
+ 'Ljava/lang/Long',
+ 'Ljava/lang/Object',
+ 'Ljava/lang/String',
+ 'Ljava/lang/Class',
+ 'Ljava/lang/ClassLoader',
+ 'Ljava/lang/CharSequence',
+ 'Ljava/lang/Runnable',
+ 'Ljava/lang/Throwable',
+ ]
+
+ prefix = ''
+ # Array?
+ while param[-2:] == '[]':
+ prefix += '['
+ param = param[:-2]
+ # Generic?
+ if '<' in param:
+ param = param[:param.index('<')]
+ if param in pod_param_map:
+ return prefix + pod_param_map[param]
+ if '/' in param:
+ # Coming from javap, use the fully qualified param directly.
+ return prefix + 'L' + param + ';'
+
+ for qualified_name in (object_param_list + [self._fully_qualified_class] +
+ self._inner_classes):
+ if (qualified_name.endswith('/' + param)
+ or qualified_name.endswith('$' + param.replace('.', '$'))
+ or qualified_name == 'L' + param):
+ return prefix + qualified_name + ';'
+
+ # Is it from an import? (e.g. referecing Class from import pkg.Class;
+ # note that referencing an inner class Inner from import pkg.Class.Inner
+ # is not supported).
+ for qualified_name in self._imports:
+ if qualified_name.endswith('/' + param):
+ # Ensure it's not an inner class.
+ components = qualified_name.split('/')
+ if len(components) > 2 and components[-2][0].isupper():
+ raise SyntaxError(
+ 'Inner class (%s) can not be imported '
+ 'and used by JNI (%s). Please import the outer '
+ 'class and use Outer.Inner instead.' % (qualified_name, param))
+ return prefix + qualified_name + ';'
+
+ # Is it an inner class from an outer class import? (e.g. referencing
+ # Class.Inner from import pkg.Class).
+ if '.' in param:
+ components = param.split('.')
+ outer = '/'.join(components[:-1])
+ inner = components[-1]
+ for qualified_name in self._imports:
+ if qualified_name.endswith('/' + outer):
+ return (prefix + qualified_name + '$' + inner + ';')
+ raise SyntaxError('Inner class (%s) can not be '
+ 'used directly by JNI. Please import the outer '
+ 'class, probably:\n'
+ 'import %s.%s;' % (param, self._package.replace(
+ '/', '.'), outer.replace('/', '.')))
+
+ self._CheckImplicitImports(param)
+
+ # Type not found, falling back to same package as this class.
+ return (prefix + 'L' + self._package + '/' + param + ';')
+
+ def _AddAdditionalImport(self, class_name):
+ assert class_name.endswith('.class')
+ raw_class_name = class_name[:-len('.class')]
+ if '.' in raw_class_name:
+ raise SyntaxError('%s cannot be used in @JNIAdditionalImport. '
+ 'Only import unqualified outer classes.' % class_name)
+ new_import = 'L%s/%s' % (self._package, raw_class_name)
+ if new_import in self._imports:
+ raise SyntaxError('Do not use JNIAdditionalImport on an already '
+ 'imported class: %s' % (new_import.replace('/', '.')))
+ self._imports += [new_import]
+
+ def _CheckImplicitImports(self, param):
+ # Ensure implicit imports, such as java.lang.*, are not being treated
+ # as being in the same package.
+ if not self._implicit_imports:
+ # This file was generated from android.jar and lists
+ # all classes that are implicitly imported.
+ android_jar_path = os.path.join(_FILE_DIR, 'android_jar.classes')
+ with open(android_jar_path) as f:
+ self._implicit_imports = f.readlines()
+ for implicit_import in self._implicit_imports:
+ implicit_import = implicit_import.strip().replace('.class', '')
+ implicit_import = implicit_import.replace('/', '.')
+ if implicit_import.endswith('.' + param):
+ raise SyntaxError('Ambiguous class (%s) can not be used directly '
+ 'by JNI.\nPlease import it, probably:\n\n'
+ 'import %s;' % (param, implicit_import))
+
+ def Signature(self, params, returns):
+ """Returns the JNI signature for the given datatypes."""
+ items = ['(']
+ items += [self.JavaToJni(param.datatype) for param in params]
+ items += [')']
+ items += [self.JavaToJni(returns)]
+ return '"{}"'.format(''.join(items))
+
+ @staticmethod
+ def ParseJavaPSignature(signature_line):
+ prefix = 'Signature: '
+ index = signature_line.find(prefix)
+ if index == -1:
+ prefix = 'descriptor: '
+ index = signature_line.index(prefix)
+ return '"%s"' % signature_line[index + len(prefix):]
+
+ @staticmethod
+ def Parse(params, use_proxy_types=False, from_javap=False):
+ """Parses the params into a list of Param objects."""
+ if not params:
+ return []
+ ret = []
+ params = _StripGenerics(params)
+ for p in params.split(','):
+ items = p.split()
+
+ if 'final' in items:
+ items.remove('final')
+
+ # Remove @Annotations from parameters.
+ annotations = []
+ while items[0].startswith('@'):
+ annotations.append(items[0])
+ del items[0]
+
+ param = Param(
+ annotations=annotations,
+ datatype=items[0],
+ name=(items[1] if len(items) > 1 else 'p%s' % len(ret)),
+ )
+ # Handle varargs.
+ if param.datatype.endswith('...'):
+ param.datatype = param.datatype[:-3] + '[]'
+
+ if from_javap:
+ param.datatype = param.datatype.replace('.', '/')
+
+ if use_proxy_types:
+ param.datatype = JavaTypeToProxyCast(param.datatype)
+
+ ret += [param]
+ return ret
+
+
+def ExtractJNINamespace(contents):
+ re_jni_namespace = re.compile('.*?@JNINamespace\("(.*?)"\)')
+ m = re.findall(re_jni_namespace, contents)
+ if not m:
+ return ''
+ return m[0]
+
+
+def ExtractFullyQualifiedJavaClassName(file_name, contents):
+ assert not file_name.endswith('.kt'), (
+ f'Found {file_name}, but Kotlin is not supported by JNI generator.')
+ re_package = re.compile('.*?package (.*?);')
+ matches = re.findall(re_package, contents)
+ if not matches:
+ raise SyntaxError('Unable to find "package" line in %s' % file_name)
+ class_path = matches[0].replace('.', '/')
+ class_name = os.path.splitext(os.path.basename(file_name))[0]
+ return class_path + '/' + class_name
+
+
+def ExtractNatives(contents, ptr_type):
+ """Returns a list of dict containing information about a native method."""
+ contents = contents.replace('\n', '')
+ natives = []
+ for match in _EXTRACT_NATIVES_REGEX.finditer(contents):
+ native = NativeMethod(
+ static='static' in match.group('qualifiers'),
+ java_class_name=match.group('java_class_name'),
+ native_class_name=match.group('native_class_name'),
+ return_type=match.group('return_type'),
+ name=match.group('name').replace('native', ''),
+ params=JniParams.Parse(match.group('params')),
+ ptr_type=ptr_type)
+ natives += [native]
+ return natives
+
+
+def IsMainDexJavaClass(contents):
+ """Returns True if the class or any of its methods are annotated as @MainDex.
+
+ JNI registration doesn't always need to be completed for non-browser processes
+ since most Java code is only used by the browser process. Classes that are
+ needed by non-browser processes must explicitly be annotated with @MainDex
+ to force JNI registration.
+ """
+ return bool(_MAIN_DEX_REGEX.search(contents))
+
+
+def EscapeClassName(fully_qualified_class):
+ """Returns an escaped string concatenating the Java package and class."""
+ escaped = fully_qualified_class.replace('_', '_1')
+ return escaped.replace('/', '_').replace('$', '_00024')
+
+
+def GetRegistrationFunctionName(fully_qualified_class):
+ """Returns the register name with a given class."""
+ return 'RegisterNative_' + EscapeClassName(fully_qualified_class)
+
+
+def GetStaticCastForReturnType(return_type):
+ type_map = {
+ 'String': 'jstring',
+ 'java/lang/String': 'jstring',
+ 'Class': 'jclass',
+ 'java/lang/Class': 'jclass',
+ 'Throwable': 'jthrowable',
+ 'java/lang/Throwable': 'jthrowable',
+ 'boolean[]': 'jbooleanArray',
+ 'byte[]': 'jbyteArray',
+ 'char[]': 'jcharArray',
+ 'short[]': 'jshortArray',
+ 'int[]': 'jintArray',
+ 'long[]': 'jlongArray',
+ 'float[]': 'jfloatArray',
+ 'double[]': 'jdoubleArray'
+ }
+ return_type = _StripGenerics(return_type)
+ ret = type_map.get(return_type, None)
+ if ret:
+ return ret
+ if return_type.endswith('[]'):
+ return 'jobjectArray'
+ return None
+
+
+def GetEnvCall(is_constructor, is_static, return_type):
+ """Maps the types availabe via env->Call__Method."""
+ if is_constructor:
+ return 'NewObject'
+ env_call_map = {
+ 'boolean': 'Boolean',
+ 'byte': 'Byte',
+ 'char': 'Char',
+ 'short': 'Short',
+ 'int': 'Int',
+ 'long': 'Long',
+ 'float': 'Float',
+ 'void': 'Void',
+ 'double': 'Double',
+ 'Object': 'Object',
+ }
+ call = env_call_map.get(return_type, 'Object')
+ if is_static:
+ call = 'Static' + call
+ return 'Call' + call + 'Method'
+
+
+def GetMangledParam(datatype):
+ """Returns a mangled identifier for the datatype."""
+ if len(datatype) <= 2:
+ return datatype.replace('[', 'A')
+ ret = ''
+ for i in range(1, len(datatype)):
+ c = datatype[i]
+ if c == '[':
+ ret += 'A'
+ elif c.isupper() or datatype[i - 1] in ['/', 'L']:
+ ret += c.upper()
+ return ret
+
+
+def GetMangledMethodName(jni_params, name, params, return_type):
+ """Returns a mangled method name for the given signature.
+
+ The returned name can be used as a C identifier and will be unique for all
+ valid overloads of the same method.
+
+ Args:
+ jni_params: JniParams object.
+ name: string.
+ params: list of Param.
+ return_type: string.
+
+ Returns:
+ A mangled name.
+ """
+ mangled_items = []
+ for datatype in [return_type] + [x.datatype for x in params]:
+ mangled_items += [GetMangledParam(jni_params.JavaToJni(datatype))]
+ mangled_name = name + '_'.join(mangled_items)
+ assert re.match(r'[0-9a-zA-Z_]+', mangled_name)
+ return mangled_name
+
+
+def MangleCalledByNatives(jni_params, called_by_natives, always_mangle):
+ """Mangles all the overloads from the call_by_natives list or
+ mangle all methods if always_mangle is true.
+ """
+ method_counts = collections.defaultdict(
+ lambda: collections.defaultdict(lambda: 0))
+ for called_by_native in called_by_natives:
+ java_class_name = called_by_native.java_class_name
+ name = called_by_native.name
+ method_counts[java_class_name][name] += 1
+ for called_by_native in called_by_natives:
+ java_class_name = called_by_native.java_class_name
+ method_name = called_by_native.name
+ method_id_var_name = method_name
+ if always_mangle or method_counts[java_class_name][method_name] > 1:
+ method_id_var_name = GetMangledMethodName(jni_params, method_name,
+ called_by_native.params,
+ called_by_native.return_type)
+ called_by_native.method_id_var_name = method_id_var_name
+ return called_by_natives
+
+
+# Regex to match the JNI types that should be wrapped in a JavaRef.
+RE_SCOPED_JNI_TYPES = re.compile('jobject|jclass|jstring|jthrowable|.*Array')
+
+# Regex to match a string like "@CalledByNative public void foo(int bar)".
+RE_CALLED_BY_NATIVE = re.compile(
+ r'@CalledByNative((?P<Unchecked>(?:Unchecked)?|ForTesting))'
+ r'(?:\("(?P<annotation>.*)"\))?'
+ r'(?:\s+@\w+(?:\(.*\))?)*' # Ignore any other annotations.
+ r'\s+(?P<prefix>('
+ r'(private|protected|public|static|abstract|final|default|synchronized)'
+ r'\s*)*)'
+ r'(?:\s*@\w+)?' # Ignore annotations in return types.
+ r'\s*(?P<return_type>\S*?)'
+ r'\s*(?P<name>\w+)'
+ r'\s*\((?P<params>[^\)]*)\)')
+
+
+# Removes empty lines that are indented (i.e. start with 2x spaces).
+def RemoveIndentedEmptyLines(string):
+ return re.sub('^(?: {2})+$\n', '', string, flags=re.MULTILINE)
+
+
+def ExtractCalledByNatives(jni_params, contents, always_mangle):
+ """Parses all methods annotated with @CalledByNative.
+
+ Args:
+ jni_params: JniParams object.
+ contents: the contents of the java file.
+ always_mangle: See MangleCalledByNatives.
+
+ Returns:
+ A list of dict with information about the annotated methods.
+ TODO(bulach): return a CalledByNative object.
+
+ Raises:
+ ParseError: if unable to parse.
+ """
+ called_by_natives = []
+ for match in re.finditer(RE_CALLED_BY_NATIVE, contents):
+ return_type = match.group('return_type')
+ name = match.group('name')
+ if not return_type:
+ is_constructor = True
+ return_type = name
+ name = "Constructor"
+ else:
+ is_constructor = False
+
+ called_by_natives += [
+ CalledByNative(system_class=False,
+ unchecked='Unchecked' in match.group('Unchecked'),
+ static='static' in match.group('prefix'),
+ java_class_name=match.group('annotation') or '',
+ return_type=return_type,
+ name=name,
+ is_constructor=is_constructor,
+ params=JniParams.Parse(match.group('params')))
+ ]
+ # Check for any @CalledByNative occurrences that weren't matched.
+ unmatched_lines = re.sub(RE_CALLED_BY_NATIVE, '', contents).split('\n')
+ for line1, line2 in zip(unmatched_lines, unmatched_lines[1:]):
+ if '@CalledByNative' in line1:
+ raise ParseError('could not parse @CalledByNative method signature',
+ line1, line2)
+ return MangleCalledByNatives(jni_params, called_by_natives, always_mangle)
+
+
+def RemoveComments(contents):
+ # We need to support both inline and block comments, and we need to handle
+ # strings that contain '//' or '/*'.
+ # TODO(bulach): This is a bit hacky. It would be cleaner to use a real Java
+ # parser. Maybe we could ditch JNIFromJavaSource and just always use
+ # JNIFromJavaP; or maybe we could rewrite this script in Java and use APT.
+ # http://code.google.com/p/chromium/issues/detail?id=138941
+ def replacer(match):
+ # Replace matches that are comments with nothing; return literals/strings
+ # unchanged.
+ s = match.group(0)
+ if s.startswith('/'):
+ return ''
+ else:
+ return s
+
+ return _COMMENT_REMOVER_REGEX.sub(replacer, contents)
+
+
+class JNIFromJavaP(object):
+ """Uses 'javap' to parse a .class file and generate the JNI header file."""
+
+ def __init__(self, contents, options):
+ self.contents = contents
+ self.namespace = options.namespace
+ for line in contents:
+ class_name = re.match(
+ '.*?(public).*?(class|interface) (?P<class_name>\S+?)( |\Z)', line)
+ if class_name:
+ self.fully_qualified_class = class_name.group('class_name')
+ break
+ self.fully_qualified_class = self.fully_qualified_class.replace('.', '/')
+ # Java 7's javap includes type parameters in output, like HashSet<T>. Strip
+ # away the <...> and use the raw class name that Java 6 would've given us.
+ self.fully_qualified_class = self.fully_qualified_class.split('<', 1)[0]
+ self.jni_params = JniParams(self.fully_qualified_class)
+ self.java_class_name = self.fully_qualified_class.split('/')[-1]
+ if not self.namespace:
+ self.namespace = 'JNI_' + self.java_class_name
+ re_method = re.compile('(?P<prefix>.*?)(?P<return_type>\S+?) (?P<name>\w+?)'
+ '\((?P<params>.*?)\)')
+ self.called_by_natives = []
+ for lineno, content in enumerate(contents[2:], 2):
+ match = re.match(re_method, content)
+ if not match:
+ continue
+ self.called_by_natives += [
+ CalledByNative(
+ system_class=True,
+ unchecked=options.unchecked_exceptions,
+ static='static' in match.group('prefix'),
+ java_class_name='',
+ return_type=match.group('return_type').replace('.', '/'),
+ name=match.group('name'),
+ params=JniParams.Parse(match.group('params'), from_javap=True),
+ signature=JniParams.ParseJavaPSignature(contents[lineno + 1]))
+ ]
+ re_constructor = re.compile('(.*?)public ' +
+ self.fully_qualified_class.replace('/', '.') +
+ '\((?P<params>.*?)\)')
+ for lineno, content in enumerate(contents[2:], 2):
+ match = re.match(re_constructor, content)
+ if not match:
+ continue
+ self.called_by_natives += [
+ CalledByNative(system_class=True,
+ unchecked=options.unchecked_exceptions,
+ static=False,
+ java_class_name='',
+ return_type=self.fully_qualified_class,
+ name='Constructor',
+ params=JniParams.Parse(match.group('params'),
+ from_javap=True),
+ signature=JniParams.ParseJavaPSignature(
+ contents[lineno + 1]),
+ is_constructor=True)
+ ]
+ self.called_by_natives = MangleCalledByNatives(
+ self.jni_params, self.called_by_natives, options.always_mangle)
+ self.constant_fields = []
+ re_constant_field = re.compile('.*?public static final int (?P<name>.*?);')
+ re_constant_field_value = re.compile(
+ '.*?Constant(Value| value): int (?P<value>(-*[0-9]+)?)')
+ for lineno, content in enumerate(contents[2:], 2):
+ match = re.match(re_constant_field, content)
+ if not match:
+ continue
+ value = re.match(re_constant_field_value, contents[lineno + 2])
+ if not value:
+ value = re.match(re_constant_field_value, contents[lineno + 3])
+ if value:
+ self.constant_fields.append(
+ ConstantField(name=match.group('name'), value=value.group('value')))
+
+ # We pass in an empty string for the module (which will make the JNI use the
+ # base module's files) for all javap-derived JNI. There may be a way to get
+ # the module from a jar file, but it's not needed right now.
+ self.inl_header_file_generator = InlHeaderFileGenerator(
+ '', self.namespace, self.fully_qualified_class, [],
+ self.called_by_natives, self.constant_fields, self.jni_params, options)
+
+ def GetContent(self):
+ return self.inl_header_file_generator.GetContent()
+
+ @staticmethod
+ def CreateFromClass(class_file, options):
+ class_name = os.path.splitext(os.path.basename(class_file))[0]
+ javap_path = os.path.abspath(options.javap)
+ p = subprocess.Popen(
+ args=[javap_path, '-c', '-verbose', '-s', class_name],
+ cwd=os.path.dirname(class_file),
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ universal_newlines=True)
+ stdout, _ = p.communicate()
+ jni_from_javap = JNIFromJavaP(stdout.split('\n'), options)
+ return jni_from_javap
+
+
+# 'Proxy' native methods are declared in an @NativeMethods interface without
+# a native qualifier and indicate that the JNI annotation processor should
+# generate code to link between the equivalent native method as if it were
+# declared statically.
+# Under the hood the annotation processor generates the actual native method
+# declaration in another class (org.chromium.base.natives.GEN_JNI)
+# but generates wrapper code so it can be called through the declaring class.
+class ProxyHelpers(object):
+ MAX_CHARS_FOR_HASHED_NATIVE_METHODS = 8
+
+ @staticmethod
+ def GetClass(short_name, name_prefix=None):
+ if not name_prefix:
+ name_prefix = ''
+ else:
+ name_prefix += '_'
+ return name_prefix + ('N' if short_name else 'GEN_JNI')
+
+ @staticmethod
+ def GetPackage(short_name):
+ return 'J' if short_name else 'org/chromium/base/natives'
+
+ @staticmethod
+ def GetQualifiedClass(short_name, name_prefix=None):
+ return '%s/%s' % (ProxyHelpers.GetPackage(short_name),
+ ProxyHelpers.GetClass(short_name, name_prefix))
+
+ @staticmethod
+ def CreateHashedMethodName(fully_qualified_class_name, method_name):
+ descriptor = EscapeClassName(fully_qualified_class_name + '/' + method_name)
+
+ if not isinstance(descriptor, bytes):
+ descriptor = descriptor.encode()
+ hash = hashlib.md5(descriptor).digest()
+ hash_b64 = base64.b64encode(hash, altchars=b'$_')
+ if not isinstance(hash_b64, str):
+ hash_b64 = hash_b64.decode()
+
+ long_hash = ('M' + hash_b64).rstrip('=')
+ hashed_name = long_hash[:ProxyHelpers.MAX_CHARS_FOR_HASHED_NATIVE_METHODS]
+
+ # If the method is a test-only method, we don't care about saving size on
+ # the method name, since it shouldn't show up in the binary. Additionally,
+ # if we just hash the name, our checkers which enforce that we have no
+ # "ForTesting" methods by checking for the suffix "ForTesting" will miss
+ # these. We could preserve the name entirely and not hash anything, but
+ # that risks collisions. So, instead, we just append "ForTesting" to any
+ # test-only hashes, to ensure we catch any test-only methods that
+ # shouldn't be in our final binary.
+ if _NameIsTestOnly(method_name):
+ return hashed_name + '_ForTesting'
+ return hashed_name
+
+ @staticmethod
+ def CreateProxyMethodName(fully_qualified_class, old_name, use_hash=False):
+ """Returns the literal method name for the corresponding proxy method"""
+ if use_hash:
+ return ProxyHelpers.CreateHashedMethodName(fully_qualified_class,
+ old_name)
+
+ # The annotation processor currently uses a method name
+ # org_chromium_example_foo_method_1name escaping _ to _1
+ # and then using the appending the method name to the qualified
+ # class. Since we need to escape underscores for jni to work
+ # we need to double escape _1 to _11
+ # This is the literal name of the GEN_JNI it still needs to be escaped once.
+ return EscapeClassName(fully_qualified_class + '/' + old_name)
+
+ @staticmethod
+ def ExtractStaticProxyNatives(fully_qualified_class,
+ contents,
+ ptr_type,
+ include_test_only=True):
+ methods = []
+ first_match = True
+ module_name = None
+ for match in _NATIVE_PROXY_EXTRACTION_REGEX.finditer(contents):
+ interface_body = match.group('interface_body')
+ if first_match:
+ module_name = match.group('module_name')
+ first_match = False
+ else:
+ assert module_name == match.group(
+ 'module_name'
+ ), 'JNI cannot belong to two modules in one file {} and {}'.format(
+ module_name, match.group('module_name'))
+ for method in _EXTRACT_METHODS_REGEX.finditer(interface_body):
+ name = method.group('name')
+ if not include_test_only and _NameIsTestOnly(name):
+ continue
+
+ params = JniParams.Parse(method.group('params'), use_proxy_types=True)
+ return_type = JavaTypeToProxyCast(method.group('return_type'))
+ proxy_name = ProxyHelpers.CreateProxyMethodName(fully_qualified_class,
+ name,
+ use_hash=False)
+ hashed_proxy_name = ProxyHelpers.CreateProxyMethodName(
+ fully_qualified_class, name, use_hash=True)
+ native = NativeMethod(
+ static=True,
+ java_class_name=None,
+ return_type=return_type,
+ name=name,
+ native_class_name=method.group('native_class_name'),
+ params=params,
+ is_proxy=True,
+ proxy_name=proxy_name,
+ hashed_proxy_name=hashed_proxy_name,
+ ptr_type=ptr_type)
+ methods.append(native)
+
+ if not module_name:
+ module_name = ''
+ return methods, module_name
+
+
+class JNIFromJavaSource(object):
+ """Uses the given java source file to generate the JNI header file."""
+
+ def __init__(self, contents, fully_qualified_class, options):
+ contents = RemoveComments(contents)
+ self.jni_params = JniParams(fully_qualified_class)
+ self.jni_params.ExtractImportsAndInnerClasses(contents)
+ jni_namespace = ExtractJNINamespace(contents) or options.namespace
+ called_by_natives = ExtractCalledByNatives(self.jni_params, contents,
+ options.always_mangle)
+
+ natives, module_name = ProxyHelpers.ExtractStaticProxyNatives(
+ fully_qualified_class, contents, options.ptr_type)
+ natives += ExtractNatives(contents, options.ptr_type)
+
+ if len(natives) == 0 and len(called_by_natives) == 0:
+ raise SyntaxError(
+ 'Unable to find any JNI methods for %s.' % fully_qualified_class)
+ inl_header_file_generator = InlHeaderFileGenerator(
+ module_name, jni_namespace, fully_qualified_class, natives,
+ called_by_natives, [], self.jni_params, options)
+ self.content = inl_header_file_generator.GetContent()
+
+ def GetContent(self):
+ return self.content
+
+ @staticmethod
+ def CreateFromFile(java_file_name, options):
+ with open(java_file_name) as f:
+ contents = f.read()
+ fully_qualified_class = ExtractFullyQualifiedJavaClassName(
+ java_file_name, contents)
+ return JNIFromJavaSource(contents, fully_qualified_class, options)
+
+
+class HeaderFileGeneratorHelper(object):
+ """Include helper methods for header generators."""
+
+ def __init__(self,
+ class_name,
+ module_name,
+ fully_qualified_class,
+ use_proxy_hash,
+ split_name=None,
+ enable_jni_multiplexing=False):
+ self.class_name = class_name
+ self.module_name = module_name
+ self.fully_qualified_class = fully_qualified_class
+ self.use_proxy_hash = use_proxy_hash
+ self.split_name = split_name
+ self.enable_jni_multiplexing = enable_jni_multiplexing
+
+ def GetStubName(self, native):
+ """Return the name of the stub function for this native method.
+
+ Args:
+ native: the native dictionary describing the method.
+
+ Returns:
+ A string with the stub function name (used by the JVM).
+ """
+ if native.is_proxy:
+ if self.use_proxy_hash:
+ method_name = EscapeClassName(native.hashed_proxy_name)
+ else:
+ method_name = EscapeClassName(native.proxy_name)
+ return 'Java_%s_%s' % (EscapeClassName(
+ ProxyHelpers.GetQualifiedClass(
+ self.use_proxy_hash or self.enable_jni_multiplexing,
+ self.module_name)), method_name)
+
+ template = Template('Java_${JAVA_NAME}_native${NAME}')
+
+ java_name = self.fully_qualified_class
+ if native.java_class_name:
+ java_name += '$' + native.java_class_name
+
+ values = {'NAME': native.name, 'JAVA_NAME': EscapeClassName(java_name)}
+ return template.substitute(values)
+
+ def GetUniqueClasses(self, origin):
+ ret = collections.OrderedDict()
+ for entry in origin:
+ if isinstance(entry, NativeMethod) and entry.is_proxy:
+ short_name = self.use_proxy_hash or self.enable_jni_multiplexing
+ ret[ProxyHelpers.GetClass(short_name, self.module_name)] \
+ = ProxyHelpers.GetQualifiedClass(short_name, self.module_name)
+ continue
+ ret[self.class_name] = self.fully_qualified_class
+
+ class_name = self.class_name
+ jni_class_path = self.fully_qualified_class
+ if entry.java_class_name:
+ class_name = entry.java_class_name
+ jni_class_path = self.fully_qualified_class + '$' + class_name
+ ret[class_name] = jni_class_path
+ return ret
+
+ def GetClassPathLines(self, classes, declare_only=False):
+ """Returns the ClassPath constants."""
+ ret = []
+ if declare_only:
+ template = Template("""
+extern const char kClassPath_${JAVA_CLASS}[];
+""")
+ else:
+ template = Template("""
+JNI_REGISTRATION_EXPORT extern const char kClassPath_${JAVA_CLASS}[];
+const char kClassPath_${JAVA_CLASS}[] = \
+"${JNI_CLASS_PATH}";
+""")
+
+ for full_clazz in classes.values():
+ values = {
+ 'JAVA_CLASS': EscapeClassName(full_clazz),
+ 'JNI_CLASS_PATH': full_clazz,
+ }
+ # Since all proxy methods use the same class, defining this in every
+ # header file would result in duplicated extern initializations.
+ if full_clazz != ProxyHelpers.GetQualifiedClass(
+ self.use_proxy_hash or self.enable_jni_multiplexing,
+ self.module_name):
+ ret += [template.substitute(values)]
+
+ class_getter = """\
+#ifndef ${JAVA_CLASS}_clazz_defined
+#define ${JAVA_CLASS}_clazz_defined
+inline jclass ${JAVA_CLASS}_clazz(JNIEnv* env) {
+ return base::android::LazyGetClass(env, kClassPath_${JAVA_CLASS}, \
+${MAYBE_SPLIT_NAME_ARG}&g_${JAVA_CLASS}_clazz);
+}
+#endif
+"""
+ if declare_only:
+ template = Template("""\
+extern std::atomic<jclass> g_${JAVA_CLASS}_clazz;
+""" + class_getter)
+ else:
+ template = Template("""\
+// Leaking this jclass as we cannot use LazyInstance from some threads.
+JNI_REGISTRATION_EXPORT std::atomic<jclass> g_${JAVA_CLASS}_clazz(nullptr);
+""" + class_getter)
+
+ for full_clazz in classes.values():
+ values = {
+ 'JAVA_CLASS':
+ EscapeClassName(full_clazz),
+ 'MAYBE_SPLIT_NAME_ARG':
+ (('"%s", ' % self.split_name) if self.split_name else '')
+ }
+ # Since all proxy methods use the same class, defining this in every
+ # header file would result in duplicated extern initializations.
+ if full_clazz != ProxyHelpers.GetQualifiedClass(
+ self.use_proxy_hash or self.enable_jni_multiplexing,
+ self.module_name):
+ ret += [template.substitute(values)]
+
+ return ''.join(ret)
+
+
+class InlHeaderFileGenerator(object):
+ """Generates an inline header file for JNI integration."""
+
+ def __init__(self, module_name, namespace, fully_qualified_class, natives,
+ called_by_natives, constant_fields, jni_params, options):
+ self.namespace = namespace
+ self.fully_qualified_class = fully_qualified_class
+ self.class_name = self.fully_qualified_class.split('/')[-1]
+ self.natives = natives
+ self.called_by_natives = called_by_natives
+ self.header_guard = fully_qualified_class.replace('/', '_') + '_JNI'
+ self.constant_fields = constant_fields
+ self.jni_params = jni_params
+ self.options = options
+ self.helper = HeaderFileGeneratorHelper(
+ self.class_name,
+ module_name,
+ fully_qualified_class,
+ self.options.use_proxy_hash,
+ split_name=self.options.split_name,
+ enable_jni_multiplexing=self.options.enable_jni_multiplexing)
+
+ def GetContent(self):
+ """Returns the content of the JNI binding file."""
+ template = Template("""\
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+// This file is autogenerated by
+// ${SCRIPT_NAME}
+// For
+// ${FULLY_QUALIFIED_CLASS}
+
+#ifndef ${HEADER_GUARD}
+#define ${HEADER_GUARD}
+
+#include <jni.h>
+
+${INCLUDES}
+
+// Step 1: Forward declarations.
+$CLASS_PATH_DEFINITIONS
+
+// Step 2: Constants (optional).
+
+$CONSTANT_FIELDS\
+
+// Step 3: Method stubs.
+$METHOD_STUBS
+
+#endif // ${HEADER_GUARD}
+""")
+ values = {
+ 'SCRIPT_NAME': self.options.script_name,
+ 'FULLY_QUALIFIED_CLASS': self.fully_qualified_class,
+ 'CLASS_PATH_DEFINITIONS': self.GetClassPathDefinitionsString(),
+ 'CONSTANT_FIELDS': self.GetConstantFieldsString(),
+ 'METHOD_STUBS': self.GetMethodStubsString(),
+ 'HEADER_GUARD': self.header_guard,
+ 'INCLUDES': self.GetIncludesString(),
+ }
+ open_namespace = self.GetOpenNamespaceString()
+ if open_namespace:
+ close_namespace = self.GetCloseNamespaceString()
+ values['METHOD_STUBS'] = '\n'.join(
+ [open_namespace, values['METHOD_STUBS'], close_namespace])
+
+ constant_fields = values['CONSTANT_FIELDS']
+ if constant_fields:
+ values['CONSTANT_FIELDS'] = '\n'.join(
+ [open_namespace, constant_fields, close_namespace])
+
+ return WrapOutput(template.substitute(values))
+
+ def GetClassPathDefinitionsString(self):
+ classes = self.helper.GetUniqueClasses(self.called_by_natives)
+ classes.update(self.helper.GetUniqueClasses(self.natives))
+ return self.helper.GetClassPathLines(classes)
+
+ def GetConstantFieldsString(self):
+ if not self.constant_fields:
+ return ''
+ ret = ['enum Java_%s_constant_fields {' % self.class_name]
+ for c in self.constant_fields:
+ ret += [' %s = %s,' % (c.name, c.value)]
+ ret += ['};', '']
+ return '\n'.join(ret)
+
+ def GetMethodStubsString(self):
+ """Returns the code corresponding to method stubs."""
+ ret = []
+ for native in self.natives:
+ ret += [self.GetNativeStub(native)]
+ ret += self.GetLazyCalledByNativeMethodStubs()
+ return '\n'.join(ret)
+
+ def GetLazyCalledByNativeMethodStubs(self):
+ return [
+ self.GetLazyCalledByNativeMethodStub(called_by_native)
+ for called_by_native in self.called_by_natives
+ ]
+
+ def GetIncludesString(self):
+ if not self.options.includes:
+ return ''
+ includes = self.options.includes.split(',')
+ return '\n'.join('#include "%s"' % x for x in includes) + '\n'
+
+ def GetOpenNamespaceString(self):
+ if self.namespace:
+ all_namespaces = [
+ 'namespace %s {' % ns for ns in self.namespace.split('::')
+ ]
+ return '\n'.join(all_namespaces) + '\n'
+ return ''
+
+ def GetCloseNamespaceString(self):
+ if self.namespace:
+ all_namespaces = [
+ '} // namespace %s' % ns for ns in self.namespace.split('::')
+ ]
+ all_namespaces.reverse()
+ return '\n' + '\n'.join(all_namespaces)
+ return ''
+
+ def GetCalledByNativeParamsInDeclaration(self, called_by_native):
+ return ',\n '.join([
+ JavaDataTypeToCForCalledByNativeParam(param.datatype) + ' ' + param.name
+ for param in called_by_native.params
+ ])
+
+ def GetJavaParamRefForCall(self, c_type, name):
+ return Template(
+ 'base::android::JavaParamRef<${TYPE}>(env, ${NAME})').substitute({
+ 'TYPE':
+ c_type,
+ 'NAME':
+ name,
+ })
+
+ def GetImplementationMethodName(self, native):
+ class_name = self.class_name
+ if native.java_class_name is not None:
+ # Inner class
+ class_name = native.java_class_name
+
+ return 'JNI_%s_%s' % (class_name, native.name)
+
+ def GetNativeStub(self, native):
+ is_method = native.type == 'method'
+
+ if is_method:
+ params = native.params[1:]
+ else:
+ params = native.params
+
+ params_in_call = ['env']
+ if not native.static:
+ # Add jcaller param.
+ params_in_call.append(self.GetJavaParamRefForCall('jobject', 'jcaller'))
+
+ for p in params:
+ c_type = JavaDataTypeToC(p.datatype)
+ if re.match(RE_SCOPED_JNI_TYPES, c_type):
+ params_in_call.append(self.GetJavaParamRefForCall(c_type, p.name))
+ else:
+ params_in_call.append(p.name)
+
+ params_in_declaration = _GetParamsInDeclaration(native)
+ params_in_call = ', '.join(params_in_call)
+
+ return_type = return_declaration = JavaDataTypeToC(native.return_type)
+ post_call = ''
+ if re.match(RE_SCOPED_JNI_TYPES, return_type):
+ post_call = '.Release()'
+ return_declaration = (
+ 'base::android::ScopedJavaLocalRef<' + return_type + '>')
+ profiling_entered_native = ''
+ if self.options.enable_profiling:
+ profiling_entered_native = ' JNI_LINK_SAVED_FRAME_POINTER;\n'
+
+ values = {
+ 'RETURN': return_type,
+ 'RETURN_DECLARATION': return_declaration,
+ 'NAME': native.name,
+ 'IMPL_METHOD_NAME': self.GetImplementationMethodName(native),
+ 'PARAMS': ',\n '.join(params_in_declaration),
+ 'PARAMS_IN_STUB': GetParamsInStub(native),
+ 'PARAMS_IN_CALL': params_in_call,
+ 'POST_CALL': post_call,
+ 'STUB_NAME': self.helper.GetStubName(native),
+ 'PROFILING_ENTERED_NATIVE': profiling_entered_native,
+ 'TRACE_EVENT': '',
+ }
+
+ namespace_qual = self.namespace + '::' if self.namespace else ''
+ if is_method:
+ optional_error_return = JavaReturnValueToC(native.return_type)
+ if optional_error_return:
+ optional_error_return = ', ' + optional_error_return
+ values.update({
+ 'OPTIONAL_ERROR_RETURN': optional_error_return,
+ 'PARAM0_NAME': native.params[0].name,
+ 'P0_TYPE': native.p0_type,
+ })
+ if self.options.enable_tracing:
+ values['TRACE_EVENT'] = self.GetTraceEventForNameTemplate(
+ namespace_qual + '${P0_TYPE}::${NAME}', values)
+ template = Template("""\
+JNI_GENERATOR_EXPORT ${RETURN} ${STUB_NAME}(
+ JNIEnv* env,
+ ${PARAMS_IN_STUB}) {
+${PROFILING_ENTERED_NATIVE}\
+${TRACE_EVENT}\
+ ${P0_TYPE}* native = reinterpret_cast<${P0_TYPE}*>(${PARAM0_NAME});
+ CHECK_NATIVE_PTR(env, jcaller, native, "${NAME}"${OPTIONAL_ERROR_RETURN});
+ return native->${NAME}(${PARAMS_IN_CALL})${POST_CALL};
+}
+""")
+ else:
+ if values['PARAMS']:
+ values['PARAMS'] = ', ' + values['PARAMS']
+ if self.options.enable_tracing:
+ values['TRACE_EVENT'] = self.GetTraceEventForNameTemplate(
+ namespace_qual + '${IMPL_METHOD_NAME}', values)
+ template = Template("""\
+static ${RETURN_DECLARATION} ${IMPL_METHOD_NAME}(JNIEnv* env${PARAMS});
+
+JNI_GENERATOR_EXPORT ${RETURN} ${STUB_NAME}(
+ JNIEnv* env,
+ ${PARAMS_IN_STUB}) {
+${PROFILING_ENTERED_NATIVE}\
+${TRACE_EVENT}\
+ return ${IMPL_METHOD_NAME}(${PARAMS_IN_CALL})${POST_CALL};
+}
+""")
+
+ return RemoveIndentedEmptyLines(template.substitute(values))
+
+ def GetArgument(self, param):
+ if param.datatype == 'int':
+ return 'as_jint(' + param.name + ')'
+ elif re.match(RE_SCOPED_JNI_TYPES, JavaDataTypeToC(param.datatype)):
+ return param.name + '.obj()'
+ else:
+ return param.name
+
+ def GetArgumentsInCall(self, params):
+ """Return a string of arguments to call from native into Java"""
+ return [self.GetArgument(p) for p in params]
+
+ def GetCalledByNativeValues(self, called_by_native):
+ """Fills in necessary values for the CalledByNative methods."""
+ java_class_only = called_by_native.java_class_name or self.class_name
+ java_class = self.fully_qualified_class
+ if called_by_native.java_class_name:
+ java_class += '$' + called_by_native.java_class_name
+
+ if called_by_native.static or called_by_native.is_constructor:
+ first_param_in_declaration = ''
+ first_param_in_call = 'clazz'
+ else:
+ first_param_in_declaration = (
+ ', const base::android::JavaRef<jobject>& obj')
+ first_param_in_call = 'obj.obj()'
+ params_in_declaration = self.GetCalledByNativeParamsInDeclaration(
+ called_by_native)
+ if params_in_declaration:
+ params_in_declaration = ', ' + params_in_declaration
+ params_in_call = ', '.join(self.GetArgumentsInCall(called_by_native.params))
+ if params_in_call:
+ params_in_call = ', ' + params_in_call
+ pre_call = ''
+ post_call = ''
+ if called_by_native.static_cast:
+ pre_call = 'static_cast<%s>(' % called_by_native.static_cast
+ post_call = ')'
+ check_exception = 'Unchecked'
+ method_id_member_name = 'call_context.method_id'
+ if not called_by_native.unchecked:
+ check_exception = 'Checked'
+ method_id_member_name = 'call_context.base.method_id'
+ return_type = JavaDataTypeToC(called_by_native.return_type)
+ optional_error_return = JavaReturnValueToC(called_by_native.return_type)
+ if optional_error_return:
+ optional_error_return = ', ' + optional_error_return
+ return_declaration = ''
+ return_clause = ''
+ if return_type != 'void':
+ pre_call = ' ' + pre_call
+ return_declaration = return_type + ' ret ='
+ if re.match(RE_SCOPED_JNI_TYPES, return_type):
+ return_type = 'base::android::ScopedJavaLocalRef<' + return_type + '>'
+ return_clause = 'return ' + return_type + '(env, ret);'
+ else:
+ return_clause = 'return ret;'
+ profiling_leaving_native = ''
+ if self.options.enable_profiling:
+ profiling_leaving_native = ' JNI_SAVE_FRAME_POINTER;\n'
+ jni_name = called_by_native.name
+ jni_return_type = called_by_native.return_type
+ if called_by_native.is_constructor:
+ jni_name = '<init>'
+ jni_return_type = 'void'
+ if called_by_native.signature:
+ jni_signature = called_by_native.signature
+ else:
+ jni_signature = self.jni_params.Signature(called_by_native.params,
+ jni_return_type)
+ java_name_full = java_class.replace('/', '.') + '.' + jni_name
+ return {
+ 'JAVA_CLASS_ONLY': java_class_only,
+ 'JAVA_CLASS': EscapeClassName(java_class),
+ 'RETURN_TYPE': return_type,
+ 'OPTIONAL_ERROR_RETURN': optional_error_return,
+ 'RETURN_DECLARATION': return_declaration,
+ 'RETURN_CLAUSE': return_clause,
+ 'FIRST_PARAM_IN_DECLARATION': first_param_in_declaration,
+ 'PARAMS_IN_DECLARATION': params_in_declaration,
+ 'PRE_CALL': pre_call,
+ 'POST_CALL': post_call,
+ 'ENV_CALL': called_by_native.env_call,
+ 'FIRST_PARAM_IN_CALL': first_param_in_call,
+ 'PARAMS_IN_CALL': params_in_call,
+ 'CHECK_EXCEPTION': check_exception,
+ 'PROFILING_LEAVING_NATIVE': profiling_leaving_native,
+ 'JNI_NAME': jni_name,
+ 'JNI_SIGNATURE': jni_signature,
+ 'METHOD_ID_MEMBER_NAME': method_id_member_name,
+ 'METHOD_ID_VAR_NAME': called_by_native.method_id_var_name,
+ 'METHOD_ID_TYPE': 'STATIC' if called_by_native.static else 'INSTANCE',
+ 'JAVA_NAME_FULL': java_name_full,
+ }
+
+ def GetLazyCalledByNativeMethodStub(self, called_by_native):
+ """Returns a string."""
+ function_signature_template = Template("""\
+static ${RETURN_TYPE} Java_${JAVA_CLASS_ONLY}_${METHOD_ID_VAR_NAME}(\
+JNIEnv* env${FIRST_PARAM_IN_DECLARATION}${PARAMS_IN_DECLARATION})""")
+ function_header_template = Template("""\
+${FUNCTION_SIGNATURE} {""")
+ function_header_with_unused_template = Template("""\
+[[maybe_unused]] ${FUNCTION_SIGNATURE};
+${FUNCTION_SIGNATURE} {""")
+ template = Template("""
+static std::atomic<jmethodID> g_${JAVA_CLASS}_${METHOD_ID_VAR_NAME}(nullptr);
+${FUNCTION_HEADER}
+ jclass clazz = ${JAVA_CLASS}_clazz(env);
+ CHECK_CLAZZ(env, ${FIRST_PARAM_IN_CALL},
+ ${JAVA_CLASS}_clazz(env)${OPTIONAL_ERROR_RETURN});
+
+ jni_generator::JniJavaCallContext${CHECK_EXCEPTION} call_context;
+ call_context.Init<
+ base::android::MethodID::TYPE_${METHOD_ID_TYPE}>(
+ env,
+ clazz,
+ "${JNI_NAME}",
+ ${JNI_SIGNATURE},
+ &g_${JAVA_CLASS}_${METHOD_ID_VAR_NAME});
+
+${TRACE_EVENT}\
+${PROFILING_LEAVING_NATIVE}\
+ ${RETURN_DECLARATION}
+ ${PRE_CALL}env->${ENV_CALL}(${FIRST_PARAM_IN_CALL},
+ ${METHOD_ID_MEMBER_NAME}${PARAMS_IN_CALL})${POST_CALL};
+ ${RETURN_CLAUSE}
+}""")
+ values = self.GetCalledByNativeValues(called_by_native)
+ values['FUNCTION_SIGNATURE'] = (
+ function_signature_template.substitute(values))
+ if called_by_native.system_class:
+ values['FUNCTION_HEADER'] = (
+ function_header_with_unused_template.substitute(values))
+ else:
+ values['FUNCTION_HEADER'] = function_header_template.substitute(values)
+ if self.options.enable_tracing:
+ values['TRACE_EVENT'] = self.GetTraceEventForNameTemplate(
+ '${JAVA_NAME_FULL}', values)
+ else:
+ values['TRACE_EVENT'] = ''
+ return RemoveIndentedEmptyLines(template.substitute(values))
+
+ def GetTraceEventForNameTemplate(self, name_template, values):
+ name = Template(name_template).substitute(values)
+ return ' TRACE_EVENT0("jni", "%s");\n' % name
+
+
+def WrapOutput(output):
+ ret = []
+ for line in output.splitlines():
+ # Do not wrap preprocessor directives or comments.
+ if len(line) < _WRAP_LINE_LENGTH or line[0] == '#' or line.startswith('//'):
+ ret.append(line)
+ else:
+ # Assumes that the line is not already indented as a continuation line,
+ # which is not always true (oh well).
+ first_line_indent = (len(line) - len(line.lstrip()))
+ wrapper = _WRAPPERS_BY_INDENT[first_line_indent]
+ ret.extend(wrapper.wrap(line))
+ ret += ['']
+ return '\n'.join(ret)
+
+
+def GenerateJNIHeader(input_file, output_file, options):
+ try:
+ if os.path.splitext(input_file)[1] == '.class':
+ jni_from_javap = JNIFromJavaP.CreateFromClass(input_file, options)
+ content = jni_from_javap.GetContent()
+ else:
+ jni_from_java_source = JNIFromJavaSource.CreateFromFile(
+ input_file, options)
+ content = jni_from_java_source.GetContent()
+ except ParseError as e:
+ print(e)
+ sys.exit(1)
+ if output_file:
+ with build_utils.AtomicOutput(output_file, mode='w') as f:
+ f.write(content)
+ else:
+ print(content)
+
+
+def GetScriptName():
+ script_components = os.path.abspath(__file__).split(os.path.sep)
+ base_index = 0
+ for idx, value in enumerate(script_components):
+ if value == 'base' or value == 'third_party':
+ base_index = idx
+ break
+ return os.sep.join(script_components[base_index:])
+
+
+def _RemoveStaleHeaders(path, output_names):
+ if not os.path.isdir(path):
+ return
+ # Do not remove output files so that timestamps on declared outputs are not
+ # modified unless their contents are changed (avoids reverse deps needing to
+ # be rebuilt).
+ preserve = set(output_names)
+ for root, _, files in os.walk(path):
+ for f in files:
+ if f not in preserve:
+ file_path = os.path.join(root, f)
+ if os.path.isfile(file_path) and file_path.endswith('.h'):
+ os.remove(file_path)
+
+
+def main():
+ description = """
+This script will parse the given java source code extracting the native
+declarations and print the header file to stdout (or a file).
+See SampleForTests.java for more details.
+ """
+ parser = argparse.ArgumentParser(description=description)
+
+ parser.add_argument(
+ '-j',
+ '--jar_file',
+ dest='jar_file',
+ help='Extract the list of input files from'
+ ' a specified jar file.'
+ ' Uses javap to extract the methods from a'
+ ' pre-compiled class. --input should point'
+ ' to pre-compiled Java .class files.')
+ parser.add_argument(
+ '-n',
+ dest='namespace',
+ help='Uses as a namespace in the generated header '
+ 'instead of the javap class name, or when there is '
+ 'no JNINamespace annotation in the java source.')
+ parser.add_argument('--input_file',
+ action='append',
+ required=True,
+ dest='input_files',
+ help='Input filenames, or paths within a .jar if '
+ '--jar-file is used.')
+ parser.add_argument('--output_dir', required=True, help='Output directory.')
+ # TODO(agrieve): --prev_output_dir used only to make incremental builds work.
+ # Remove --prev_output_dir at some point after 2022.
+ parser.add_argument('--prev_output_dir',
+ help='Delete headers found in this directory.')
+ parser.add_argument('--output_name',
+ action='append',
+ dest='output_names',
+ help='Output filenames within output directory.')
+ parser.add_argument(
+ '--script_name',
+ default=GetScriptName(),
+ help='The name of this script in the generated '
+ 'header.')
+ parser.add_argument(
+ '--includes',
+ help='The comma-separated list of header files to '
+ 'include in the generated header.')
+ parser.add_argument(
+ '--ptr_type',
+ default='int',
+ choices=['int', 'long'],
+ help='The type used to represent native pointers in '
+ 'Java code. For 32-bit, use int; '
+ 'for 64-bit, use long.')
+ parser.add_argument('--cpp', default='cpp', help='The path to cpp command.')
+ parser.add_argument(
+ '--javap',
+ default=build_utils.JAVAP_PATH,
+ help='The path to javap command.')
+ parser.add_argument(
+ '--enable_profiling',
+ action='store_true',
+ help='Add additional profiling instrumentation.')
+ parser.add_argument(
+ '--enable_tracing',
+ action='store_true',
+ help='Add TRACE_EVENTs to generated functions.')
+ parser.add_argument(
+ '--always_mangle', action='store_true', help='Mangle all function names')
+ parser.add_argument('--unchecked_exceptions',
+ action='store_true',
+ help='Do not check that no exceptions were thrown.')
+ parser.add_argument('--include_test_only',
+ action='store_true',
+ help='Whether to maintain ForTesting JNI methods.')
+ parser.add_argument(
+ '--use_proxy_hash',
+ action='store_true',
+ help='Hashes the native declaration of methods used '
+ 'in @JniNatives interface.')
+ parser.add_argument('--enable_jni_multiplexing',
+ action='store_true',
+ help='Enables JNI multiplexing for Java native methods')
+ parser.add_argument(
+ '--split_name',
+ help='Split name that the Java classes should be loaded from.')
+ # TODO(agrieve): --stamp used only to make incremental builds work.
+ # Remove --stamp at some point after 2022.
+ parser.add_argument('--stamp',
+ help='Process --prev_output_dir and touch this file.')
+ args = parser.parse_args()
+ # Kotlin files are not supported by jni_generator.py, but they do end up in
+ # the list of source files passed to jni_generator.py.
+ input_files = [f for f in args.input_files if not f.endswith('.kt')]
+ output_names = args.output_names
+
+ if args.prev_output_dir:
+ _RemoveStaleHeaders(args.prev_output_dir, [])
+
+ if args.stamp:
+ build_utils.Touch(args.stamp)
+ sys.exit(0)
+
+ if output_names:
+ # Remove existing headers so that moving .java source files but not updating
+ # the corresponding C++ include will be a compile failure (otherwise
+ # incremental builds will usually not catch this).
+ _RemoveStaleHeaders(args.output_dir, output_names)
+ else:
+ output_names = [None] * len(input_files)
+ temp_dir = tempfile.mkdtemp()
+ try:
+ if args.jar_file:
+ with zipfile.ZipFile(args.jar_file) as z:
+ z.extractall(temp_dir, input_files)
+ input_files = [os.path.join(temp_dir, f) for f in input_files]
+
+ for java_path, header_name in zip(input_files, output_names):
+ if header_name:
+ header_path = os.path.join(args.output_dir, header_name)
+ else:
+ header_path = None
+ GenerateJNIHeader(java_path, header_path, args)
+ finally:
+ shutil.rmtree(temp_dir)
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/chromium/base/android/jni_generator/jni_generator_helper.h b/chromium/base/android/jni_generator/jni_generator_helper.h
new file mode 100644
index 00000000000..59bdabb6321
--- /dev/null
+++ b/chromium/base/android/jni_generator/jni_generator_helper.h
@@ -0,0 +1,130 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_JNI_GENERATOR_JNI_GENERATOR_HELPER_H_
+#define BASE_ANDROID_JNI_GENERATOR_JNI_GENERATOR_HELPER_H_
+
+#include <jni.h>
+
+#include "base/android/jni_android.h"
+#include "base/android/jni_int_wrapper.h"
+#include "base/android/scoped_java_ref.h"
+#include "base/base_export.h"
+#include "base/compiler_specific.h"
+#include "base/logging.h"
+#include "base/memory/raw_ptr.h"
+#include "build/build_config.h"
+
+// Project-specific macros used by the header files generated by
+// jni_generator.py. Different projects can then specify their own
+// implementation for this file.
+#define CHECK_NATIVE_PTR(env, jcaller, native_ptr, method_name, ...) \
+ DCHECK(native_ptr) << method_name;
+
+#define CHECK_CLAZZ(env, jcaller, clazz, ...) DCHECK(clazz);
+
+#if defined(ARCH_CPU_X86)
+// Dalvik JIT generated code doesn't guarantee 16-byte stack alignment on
+// x86 - use force_align_arg_pointer to realign the stack at the JNI
+// boundary. crbug.com/655248
+#define JNI_GENERATOR_EXPORT \
+ extern "C" __attribute__((visibility("default"), force_align_arg_pointer))
+#else
+#define JNI_GENERATOR_EXPORT extern "C" __attribute__((visibility("default")))
+#endif
+
+// Used to export JNI registration functions.
+#if defined(COMPONENT_BUILD)
+#define JNI_REGISTRATION_EXPORT __attribute__((visibility("default")))
+#else
+#define JNI_REGISTRATION_EXPORT
+#endif
+
+namespace jni_generator {
+
+inline void HandleRegistrationError(JNIEnv* env,
+ jclass clazz,
+ const char* filename) {
+ LOG(ERROR) << "RegisterNatives failed in " << filename;
+}
+
+inline void CheckException(JNIEnv* env) {
+ base::android::CheckException(env);
+}
+
+// A 32 bit number could be an address on stack. Random 64 bit marker on the
+// stack is much less likely to be present on stack.
+constexpr uint64_t kJniStackMarkerValue = 0xbdbdef1bebcade1b;
+
+// Context about the JNI call with exception checked to be stored in stack.
+struct BASE_EXPORT JniJavaCallContextUnchecked {
+ ALWAYS_INLINE JniJavaCallContextUnchecked() {
+// TODO(ssid): Implement for other architectures.
+#if defined(__arm__) || defined(__aarch64__)
+ // This assumes that this method does not increment the stack pointer.
+ asm volatile("mov %0, sp" : "=r"(sp));
+#else
+ sp = 0;
+#endif
+ }
+
+ // Force no inline to reduce code size.
+ template <base::android::MethodID::Type type>
+ NOINLINE void Init(JNIEnv* env,
+ jclass clazz,
+ const char* method_name,
+ const char* jni_signature,
+ std::atomic<jmethodID>* atomic_method_id) {
+ env1 = env;
+
+ // Make sure compiler doesn't optimize out the assignment.
+ memcpy(&marker, &kJniStackMarkerValue, sizeof(kJniStackMarkerValue));
+ // Gets PC of the calling function.
+ pc = reinterpret_cast<uintptr_t>(__builtin_return_address(0));
+
+ method_id = base::android::MethodID::LazyGet<type>(
+ env, clazz, method_name, jni_signature, atomic_method_id);
+ }
+
+ NOINLINE ~JniJavaCallContextUnchecked() {
+ // Reset so that spurious marker finds are avoided.
+ memset(&marker, 0, sizeof(marker));
+ }
+
+ uint64_t marker;
+ uintptr_t sp;
+ uintptr_t pc;
+
+ raw_ptr<JNIEnv> env1;
+ jmethodID method_id;
+};
+
+// Context about the JNI call with exception unchecked to be stored in stack.
+struct BASE_EXPORT JniJavaCallContextChecked {
+ // Force no inline to reduce code size.
+ template <base::android::MethodID::Type type>
+ NOINLINE void Init(JNIEnv* env,
+ jclass clazz,
+ const char* method_name,
+ const char* jni_signature,
+ std::atomic<jmethodID>* atomic_method_id) {
+ base.Init<type>(env, clazz, method_name, jni_signature, atomic_method_id);
+ // Reset |pc| to correct caller.
+ base.pc = reinterpret_cast<uintptr_t>(__builtin_return_address(0));
+ }
+
+ NOINLINE ~JniJavaCallContextChecked() {
+ jni_generator::CheckException(base.env1);
+ }
+
+ JniJavaCallContextUnchecked base;
+};
+
+static_assert(sizeof(JniJavaCallContextChecked) ==
+ sizeof(JniJavaCallContextUnchecked),
+ "Stack unwinder cannot work with structs of different sizes.");
+
+} // namespace jni_generator
+
+#endif // BASE_ANDROID_JNI_GENERATOR_JNI_GENERATOR_HELPER_H_
diff --git a/chromium/base/android/jni_generator/jni_generator_tests.py b/chromium/base/android/jni_generator/jni_generator_tests.py
new file mode 100755
index 00000000000..93240695188
--- /dev/null
+++ b/chromium/base/android/jni_generator/jni_generator_tests.py
@@ -0,0 +1,1901 @@
+#!/usr/bin/env python3
+# Copyright 2012 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Tests for jni_generator.py.
+
+This test suite contains various tests for the JNI generator.
+It exercises the low-level parser all the way up to the
+code generator and ensures the output matches a golden
+file.
+"""
+
+import collections
+import copy
+import difflib
+import inspect
+import optparse
+import os
+import sys
+import tempfile
+import unittest
+import jni_generator
+import jni_registration_generator
+import zipfile
+from jni_generator import CalledByNative
+from jni_generator import IsMainDexJavaClass
+from jni_generator import NativeMethod
+from jni_generator import Param
+from jni_generator import ProxyHelpers
+
+_SCRIPT_NAME = 'base/android/jni_generator/jni_generator.py'
+_INCLUDES = ('base/android/jni_generator/jni_generator_helper.h')
+_JAVA_SRC_DIR = os.path.join('java', 'src', 'org', 'chromium', 'example',
+ 'jni_generator')
+
+# Set this environment variable in order to regenerate the golden text
+# files.
+_REBASELINE_ENV = 'REBASELINE'
+
+
+def _RemoveHashedNames(natives):
+ ret = []
+ for n in natives:
+ ret.append(jni_generator.NativeMethod(**n.__dict__))
+ ret[-1].hashed_proxy_name = None
+ return ret
+
+
+class JniGeneratorOptions(object):
+ """The mock options object which is passed to the jni_generator.py script."""
+
+ def __init__(self):
+ self.namespace = None
+ self.script_name = _SCRIPT_NAME
+ self.includes = _INCLUDES
+ self.ptr_type = 'long'
+ self.cpp = 'cpp'
+ self.javap = 'mock-javap'
+ self.enable_profiling = False
+ self.enable_tracing = False
+ self.use_proxy_hash = False
+ self.enable_jni_multiplexing = False
+ self.always_mangle = False
+ self.unchecked_exceptions = False
+ self.split_name = None
+ self.include_test_only = True
+
+
+class JniRegistrationGeneratorOptions(object):
+ """The mock options object which is passed to the jni_generator.py script."""
+
+ def __init__(self):
+ self.sources_exclusions = []
+ self.namespace = None
+ self.enable_proxy_mocks = False
+ self.require_mocks = False
+ self.use_proxy_hash = False
+ self.enable_jni_multiplexing = False
+ self.manual_jni_registration = False
+ self.include_test_only = False
+ self.header_path = None
+
+
+class BaseTest(unittest.TestCase):
+
+ @staticmethod
+ def _MergeRegistrationForTests(results,
+ header_guard='HEADER_GUARD',
+ namespace='test',
+ enable_jni_multiplexing=False):
+
+ results.sort(key=lambda d: d['FULL_CLASS_NAME'])
+
+ combined_dict = {}
+ for key in jni_registration_generator.MERGEABLE_KEYS:
+ combined_dict[key] = ''.join(d.get(key, '') for d in results)
+
+ combined_dict['HEADER_GUARD'] = header_guard
+ combined_dict['NAMESPACE'] = namespace
+
+ if enable_jni_multiplexing:
+ proxy_signatures_list = sorted(
+ set(combined_dict['PROXY_NATIVE_SIGNATURES'].split('\n')))
+ combined_dict['PROXY_NATIVE_SIGNATURES'] = '\n'.join(
+ signature for signature in proxy_signatures_list)
+
+ proxy_native_array_list = sorted(
+ set(combined_dict['PROXY_NATIVE_METHOD_ARRAY_MAIN_DEX'].split(
+ '},\n')))
+ combined_dict['PROXY_NATIVE_METHOD_ARRAY_MAIN_DEX'] = '},\n'.join(
+ p for p in proxy_native_array_list if p != '') + '}'
+
+ signature_to_cases = collections.defaultdict(list)
+ for d in results:
+ for signature, cases in d['SIGNATURE_TO_CASES'].items():
+ signature_to_cases[signature].extend(cases)
+ combined_dict[
+ 'FORWARDING_CALLS'] = jni_registration_generator._AddForwardingCalls(
+ signature_to_cases, '')
+
+ return combined_dict
+
+ def _TestEndToEndRegistration(self,
+ input_java_src_files,
+ options,
+ name_to_goldens,
+ header_golden=None):
+ with tempfile.TemporaryDirectory() as tdir:
+ options.srcjar_path = os.path.join(tdir, 'srcjar.jar')
+ if header_golden:
+ options.header_path = os.path.join(tdir, 'header.h')
+
+ input_java_paths = [
+ self._JoinScriptDir(os.path.join(_JAVA_SRC_DIR, f))
+ for f in input_java_src_files
+ ]
+
+ jni_registration_generator._Generate(options, input_java_paths)
+ with zipfile.ZipFile(options.srcjar_path, 'r') as srcjar:
+ for name in srcjar.namelist():
+ self.assertTrue(
+ name in name_to_goldens,
+ f'Found {name} output, but not present in name_to_goldens map.')
+ contents = srcjar.read(name).decode('utf-8')
+ self.AssertGoldenTextEquals(contents,
+ golden_file=name_to_goldens[name])
+ if header_golden:
+ with open(options.header_path, 'r') as f:
+ # Temp directory will cause some diffs each time we run if we don't
+ # normalize.
+ contents = f.read().replace(
+ tdir.replace('/', '_').upper(), 'TEMP_DIR')
+ self.AssertGoldenTextEquals(contents, golden_file=header_golden)
+
+ def _JoinScriptDir(self, path):
+ script_dir = os.path.dirname(sys.argv[0])
+ return os.path.join(script_dir, path)
+
+ def _JoinGoldenPath(self, golden_file_name):
+ return self._JoinScriptDir(os.path.join('golden', golden_file_name))
+
+ def _ReadGoldenFile(self, golden_file_name):
+ golden_file_name = self._JoinGoldenPath(golden_file_name)
+ if not os.path.exists(golden_file_name):
+ return None
+ with open(golden_file_name, 'r') as f:
+ return f.read()
+
+ def _CreateJniHeaderFromFile(self, fname, qualified_clazz, options=None):
+ with open(self._JoinScriptDir(fname)) as f:
+ content = f.read()
+ opts = options
+ if opts is None:
+ opts = JniGeneratorOptions()
+
+ jni_from_java = jni_generator.JNIFromJavaSource(content, qualified_clazz,
+ opts)
+ return jni_from_java.GetContent()
+
+ def AssertObjEquals(self, first, second):
+ if isinstance(first, str):
+ return self.assertEqual(first, second)
+ dict_first = first.__dict__
+ dict_second = second.__dict__
+ self.assertEqual(dict_first.keys(), dict_second.keys())
+ for key, value in dict_first.items():
+ if (type(value) is list and len(value)
+ and isinstance(type(value[0]), object)):
+ self.AssertListEquals(value, second.__getattribute__(key))
+ else:
+ actual = second.__getattribute__(key)
+ self.assertEqual(value, actual,
+ 'Key ' + key + ': ' + str(value) + '!=' + str(actual))
+
+ def AssertListEquals(self, first, second):
+ self.assertEqual(len(first), len(second))
+ for i in range(len(first)):
+ if isinstance(first[i], object):
+ self.AssertObjEquals(first[i], second[i])
+ else:
+ self.assertEqual(first[i], second[i])
+
+ def AssertTextEquals(self, golden_text, generated_text):
+ if not self.CompareText(golden_text, generated_text):
+ self.fail('Golden text mismatch.')
+
+ def CompareText(self, golden_text, generated_text):
+
+ def FilterText(text):
+ return [
+ l.strip() for l in text.split('\n')
+ if not l.startswith('// Copyright')
+ ]
+
+ stripped_golden = FilterText(golden_text)
+ stripped_generated = FilterText(generated_text)
+ if stripped_golden == stripped_generated:
+ return True
+ print(self.id())
+ for line in difflib.context_diff(stripped_golden, stripped_generated):
+ print(line)
+ print('\n\nGenerated')
+ print('=' * 80)
+ print(generated_text)
+ print('=' * 80)
+ print('Run with:')
+ print('REBASELINE=1', sys.argv[0])
+ print('to regenerate the data files.')
+
+ def AssertGoldenTextEquals(self, generated_text, suffix='', golden_file=None):
+ """Compares generated text with the corresponding golden_file
+
+ By default compares generated_text with the file at
+ script_dir/golden/{caller_name}[suffix].golden. If the parameter
+ golden_file is provided it will instead compare the generated text with
+ script_dir/golden/golden_file."""
+ # This is the caller test method.
+ caller = inspect.stack()[1][3]
+
+ if golden_file is None:
+ self.assertTrue(
+ caller.startswith('test'),
+ 'AssertGoldenTextEquals can only be called without at golden file '
+ 'from a test* method, not %s' % caller)
+ golden_file = '%s%s.golden' % (caller, suffix)
+ golden_text = self._ReadGoldenFile(golden_file)
+ if os.environ.get(_REBASELINE_ENV):
+ if golden_text != generated_text:
+ with open(self._JoinGoldenPath(golden_file), 'w') as f:
+ f.write(generated_text)
+ return
+ # golden_text is None if no file is found. Better to fail than in
+ # AssertTextEquals so we can give a clearer message.
+ if golden_text is None:
+ self.fail(
+ 'Golden file %s does not exist.' % self._JoinGoldenPath(golden_file))
+ self.AssertTextEquals(golden_text, generated_text)
+
+
+@unittest.skipIf(os.name == 'nt', 'Not intended to work on Windows')
+class TestGenerator(BaseTest):
+
+ def testInspectCaller(self):
+
+ def willRaise():
+ # This function can only be called from a test* method.
+ self.AssertGoldenTextEquals('')
+
+ self.assertRaises(AssertionError, willRaise)
+
+ def testNatives(self):
+ test_data = """"
+ import android.graphics.Bitmap;
+ import android.view.View;
+
+ interface OnFrameAvailableListener {}
+ private native int nativeInit();
+ private native void nativeDestroy(int nativeChromeBrowserProvider);
+ private native long nativeAddBookmark(
+ int nativeChromeBrowserProvider,
+ String url, String title, boolean isFolder, long parentId);
+ private static native String nativeGetDomainAndRegistry(String url);
+ private static native void nativeCreateHistoricalTabFromState(
+ byte[] state, int tab_index);
+ private native byte[] nativeGetStateAsByteArray(View view);
+ private static native String[] nativeGetAutofillProfileGUIDs();
+ private native void nativeSetRecognitionResults(
+ int sessionId, String[] results);
+ private native long nativeAddBookmarkFromAPI(
+ int nativeChromeBrowserProvider,
+ String url, Long created, Boolean isBookmark,
+ Long date, byte[] favicon, String title, Integer visits);
+ native int nativeFindAll(String find);
+ private static native OnFrameAvailableListener nativeGetInnerClass();
+ private native Bitmap nativeQueryBitmap(
+ int nativeChromeBrowserProvider,
+ String[] projection, String selection,
+ String[] selectionArgs, String sortOrder);
+ private native void nativeGotOrientation(
+ int nativeDataFetcherImplAndroid,
+ double alpha, double beta, double gamma);
+ private static native Throwable nativeMessWithJavaException(Throwable e);
+ """
+ jni_params = jni_generator.JniParams(
+ 'org/chromium/example/jni_generator/SampleForTests')
+ jni_params.ExtractImportsAndInnerClasses(test_data)
+ natives = jni_generator.ExtractNatives(test_data, 'int')
+ golden_natives = [
+ NativeMethod(
+ return_type='int',
+ static=False,
+ name='Init',
+ params=[],
+ java_class_name=None),
+ NativeMethod(
+ return_type='void',
+ static=False,
+ name='Destroy',
+ params=[Param(datatype='int', name='nativeChromeBrowserProvider')],
+ java_class_name=None),
+ NativeMethod(
+ return_type='long',
+ static=False,
+ name='AddBookmark',
+ params=[
+ Param(datatype='int', name='nativeChromeBrowserProvider'),
+ Param(datatype='String', name='url'),
+ Param(datatype='String', name='title'),
+ Param(datatype='boolean', name='isFolder'),
+ Param(datatype='long', name='parentId')
+ ],
+ java_class_name=None),
+ NativeMethod(
+ return_type='String',
+ static=True,
+ name='GetDomainAndRegistry',
+ params=[Param(datatype='String', name='url')],
+ java_class_name=None),
+ NativeMethod(
+ return_type='void',
+ static=True,
+ name='CreateHistoricalTabFromState',
+ params=[
+ Param(datatype='byte[]', name='state'),
+ Param(datatype='int', name='tab_index')
+ ],
+ java_class_name=None),
+ NativeMethod(
+ return_type='byte[]',
+ static=False,
+ name='GetStateAsByteArray',
+ params=[Param(datatype='View', name='view')],
+ java_class_name=None),
+ NativeMethod(
+ return_type='String[]',
+ static=True,
+ name='GetAutofillProfileGUIDs',
+ params=[],
+ java_class_name=None),
+ NativeMethod(
+ return_type='void',
+ static=False,
+ name='SetRecognitionResults',
+ params=[
+ Param(datatype='int', name='sessionId'),
+ Param(datatype='String[]', name='results')
+ ],
+ java_class_name=None),
+ NativeMethod(
+ return_type='long',
+ static=False,
+ name='AddBookmarkFromAPI',
+ params=[
+ Param(datatype='int', name='nativeChromeBrowserProvider'),
+ Param(datatype='String', name='url'),
+ Param(datatype='Long', name='created'),
+ Param(datatype='Boolean', name='isBookmark'),
+ Param(datatype='Long', name='date'),
+ Param(datatype='byte[]', name='favicon'),
+ Param(datatype='String', name='title'),
+ Param(datatype='Integer', name='visits')
+ ],
+ java_class_name=None),
+ NativeMethod(
+ return_type='int',
+ static=False,
+ name='FindAll',
+ params=[Param(datatype='String', name='find')],
+ java_class_name=None),
+ NativeMethod(
+ return_type='OnFrameAvailableListener',
+ static=True,
+ name='GetInnerClass',
+ params=[],
+ java_class_name=None),
+ NativeMethod(
+ return_type='Bitmap',
+ static=False,
+ name='QueryBitmap',
+ params=[
+ Param(datatype='int', name='nativeChromeBrowserProvider'),
+ Param(datatype='String[]', name='projection'),
+ Param(datatype='String', name='selection'),
+ Param(datatype='String[]', name='selectionArgs'),
+ Param(datatype='String', name='sortOrder'),
+ ],
+ java_class_name=None),
+ NativeMethod(
+ return_type='void',
+ static=False,
+ name='GotOrientation',
+ params=[
+ Param(datatype='int', name='nativeDataFetcherImplAndroid'),
+ Param(datatype='double', name='alpha'),
+ Param(datatype='double', name='beta'),
+ Param(datatype='double', name='gamma'),
+ ],
+ java_class_name=None),
+ NativeMethod(
+ return_type='Throwable',
+ static=True,
+ name='MessWithJavaException',
+ params=[Param(datatype='Throwable', name='e')],
+ java_class_name=None)
+ ]
+ self.AssertListEquals(golden_natives, natives)
+ h1 = jni_generator.InlHeaderFileGenerator('', '', 'org/chromium/TestJni',
+ natives, [], [], jni_params,
+ JniGeneratorOptions())
+ self.AssertGoldenTextEquals(h1.GetContent())
+ h2 = jni_registration_generator.DictionaryGenerator(JniGeneratorOptions(),
+ '', '',
+ 'org/chromium/TestJni',
+ natives, jni_params,
+ True)
+ content = TestGenerator._MergeRegistrationForTests([h2.Generate()])
+
+ reg_options = JniRegistrationGeneratorOptions()
+ reg_options.manual_jni_registration = True
+ self.AssertGoldenTextEquals(jni_registration_generator.CreateFromDict(
+ reg_options, '', content),
+ suffix='Registrations')
+
+ def testInnerClassNatives(self):
+ test_data = """
+ class MyInnerClass {
+ @NativeCall("MyInnerClass")
+ private native int nativeInit();
+ }
+ """
+ natives = jni_generator.ExtractNatives(test_data, 'int')
+ golden_natives = [
+ NativeMethod(
+ return_type='int',
+ static=False,
+ name='Init',
+ params=[],
+ java_class_name='MyInnerClass')
+ ]
+ self.AssertListEquals(golden_natives, natives)
+ jni_params = jni_generator.JniParams('')
+ h = jni_generator.InlHeaderFileGenerator('', '', 'org/chromium/TestJni',
+ natives, [], [], jni_params,
+ JniGeneratorOptions())
+ self.AssertGoldenTextEquals(h.GetContent())
+
+ def testInnerClassNativesMultiple(self):
+ test_data = """
+ class MyInnerClass {
+ @NativeCall("MyInnerClass")
+ private native int nativeInit();
+ }
+ class MyOtherInnerClass {
+ @NativeCall("MyOtherInnerClass")
+ private native int nativeInit();
+ }
+ """
+ natives = jni_generator.ExtractNatives(test_data, 'int')
+ golden_natives = [
+ NativeMethod(
+ return_type='int',
+ static=False,
+ name='Init',
+ params=[],
+ java_class_name='MyInnerClass'),
+ NativeMethod(
+ return_type='int',
+ static=False,
+ name='Init',
+ params=[],
+ java_class_name='MyOtherInnerClass')
+ ]
+ self.AssertListEquals(golden_natives, natives)
+ jni_params = jni_generator.JniParams('')
+ h = jni_generator.InlHeaderFileGenerator('', '', 'org/chromium/TestJni',
+ natives, [], [], jni_params,
+ JniGeneratorOptions())
+ self.AssertGoldenTextEquals(h.GetContent())
+
+ def testInnerClassNativesBothInnerAndOuter(self):
+ test_data = """
+ class MyOuterClass {
+ private native int nativeInit();
+ class MyOtherInnerClass {
+ @NativeCall("MyOtherInnerClass")
+ private native int nativeInit();
+ }
+ }
+ """
+ natives = jni_generator.ExtractNatives(test_data, 'int')
+ golden_natives = [
+ NativeMethod(
+ return_type='int',
+ static=False,
+ name='Init',
+ params=[],
+ java_class_name=None),
+ NativeMethod(
+ return_type='int',
+ static=False,
+ name='Init',
+ params=[],
+ java_class_name='MyOtherInnerClass')
+ ]
+ self.AssertListEquals(golden_natives, natives)
+ jni_params = jni_generator.JniParams('')
+ h = jni_generator.InlHeaderFileGenerator('', '', 'org/chromium/TestJni',
+ natives, [], [], jni_params,
+ JniGeneratorOptions())
+ self.AssertGoldenTextEquals(h.GetContent())
+
+ h2 = jni_registration_generator.DictionaryGenerator(JniGeneratorOptions(),
+ '', '',
+ 'org/chromium/TestJni',
+ natives, jni_params,
+ True)
+ content = TestGenerator._MergeRegistrationForTests([h2.Generate()])
+
+ reg_options = JniRegistrationGeneratorOptions()
+ reg_options.manual_jni_registration = True
+ self.AssertGoldenTextEquals(jni_registration_generator.CreateFromDict(
+ reg_options, '', content),
+ suffix='Registrations')
+
+ def testCalledByNatives(self):
+ test_data = """"
+ import android.graphics.Bitmap;
+ import android.view.View;
+ import java.io.InputStream;
+ import java.util.List;
+
+ class InnerClass {}
+
+ @CalledByNative
+ @SomeOtherA
+ @SomeOtherB
+ public InnerClass showConfirmInfoBar(int nativeInfoBar,
+ String buttonOk, String buttonCancel, String title, Bitmap icon) {
+ InfoBar infobar = new ConfirmInfoBar(nativeInfoBar, mContext,
+ buttonOk, buttonCancel,
+ title, icon);
+ return infobar;
+ }
+ @CalledByNative
+ InnerClass showAutoLoginInfoBar(int nativeInfoBar,
+ String realm, String account, String args) {
+ AutoLoginInfoBar infobar = new AutoLoginInfoBar(nativeInfoBar, mContext,
+ realm, account, args);
+ if (infobar.displayedAccountCount() == 0)
+ infobar = null;
+ return infobar;
+ }
+ @CalledByNative("InfoBar")
+ void dismiss();
+ @SuppressWarnings("unused")
+ @CalledByNative
+ private static boolean shouldShowAutoLogin(View view,
+ String realm, String account, String args) {
+ AccountManagerContainer accountManagerContainer =
+ new AccountManagerContainer((Activity)contentView.getContext(),
+ realm, account, args);
+ String[] logins = accountManagerContainer.getAccountLogins(null);
+ return logins.length != 0;
+ }
+ @CalledByNative
+ static InputStream openUrl(String url) {
+ return null;
+ }
+ @CalledByNative
+ private void activateHardwareAcceleration(final boolean activated,
+ final int iPid, final int iType,
+ final int iPrimaryID, final int iSecondaryID) {
+ if (!activated) {
+ return
+ }
+ }
+ @CalledByNative
+ public static @Status int updateStatus(@Status int status) {
+ return getAndUpdateStatus(status);
+ }
+ @CalledByNativeUnchecked
+ private void uncheckedCall(int iParam);
+
+ @CalledByNative
+ public byte[] returnByteArray();
+
+ @CalledByNative
+ public boolean[] returnBooleanArray();
+
+ @CalledByNative
+ public char[] returnCharArray();
+
+ @CalledByNative
+ public short[] returnShortArray();
+
+ @CalledByNative
+ public int[] returnIntArray();
+
+ @CalledByNative
+ public long[] returnLongArray();
+
+ @CalledByNative
+ public double[] returnDoubleArray();
+
+ @CalledByNative
+ public Object[] returnObjectArray();
+
+ @CalledByNative
+ public byte[][] returnArrayOfByteArray();
+
+ @CalledByNative
+ public Bitmap.CompressFormat getCompressFormat();
+
+ @CalledByNative
+ public List<Bitmap.CompressFormat> getCompressFormatList();
+
+ @CalledByNativeForTesting
+ public int[] returnIntArrayForTesting();
+ """
+ jni_params = jni_generator.JniParams('org/chromium/Foo')
+ jni_params.ExtractImportsAndInnerClasses(test_data)
+ called_by_natives = jni_generator.ExtractCalledByNatives(
+ jni_params, test_data, always_mangle=False)
+ golden_called_by_natives = [
+ CalledByNative(
+ return_type='InnerClass',
+ system_class=False,
+ static=False,
+ name='showConfirmInfoBar',
+ method_id_var_name='showConfirmInfoBar',
+ java_class_name='',
+ params=[
+ Param(datatype='int', name='nativeInfoBar'),
+ Param(datatype='String', name='buttonOk'),
+ Param(datatype='String', name='buttonCancel'),
+ Param(datatype='String', name='title'),
+ Param(datatype='Bitmap', name='icon')
+ ],
+ env_call=('Object', ''),
+ unchecked=False,
+ ),
+ CalledByNative(
+ return_type='InnerClass',
+ system_class=False,
+ static=False,
+ name='showAutoLoginInfoBar',
+ method_id_var_name='showAutoLoginInfoBar',
+ java_class_name='',
+ params=[
+ Param(datatype='int', name='nativeInfoBar'),
+ Param(datatype='String', name='realm'),
+ Param(datatype='String', name='account'),
+ Param(datatype='String', name='args')
+ ],
+ env_call=('Object', ''),
+ unchecked=False,
+ ),
+ CalledByNative(
+ return_type='void',
+ system_class=False,
+ static=False,
+ name='dismiss',
+ method_id_var_name='dismiss',
+ java_class_name='InfoBar',
+ params=[],
+ env_call=('Void', ''),
+ unchecked=False,
+ ),
+ CalledByNative(
+ return_type='boolean',
+ system_class=False,
+ static=True,
+ name='shouldShowAutoLogin',
+ method_id_var_name='shouldShowAutoLogin',
+ java_class_name='',
+ params=[
+ Param(datatype='View', name='view'),
+ Param(datatype='String', name='realm'),
+ Param(datatype='String', name='account'),
+ Param(datatype='String', name='args')
+ ],
+ env_call=('Boolean', ''),
+ unchecked=False,
+ ),
+ CalledByNative(
+ return_type='InputStream',
+ system_class=False,
+ static=True,
+ name='openUrl',
+ method_id_var_name='openUrl',
+ java_class_name='',
+ params=[Param(datatype='String', name='url')],
+ env_call=('Object', ''),
+ unchecked=False,
+ ),
+ CalledByNative(
+ return_type='void',
+ system_class=False,
+ static=False,
+ name='activateHardwareAcceleration',
+ method_id_var_name='activateHardwareAcceleration',
+ java_class_name='',
+ params=[
+ Param(datatype='boolean', name='activated'),
+ Param(datatype='int', name='iPid'),
+ Param(datatype='int', name='iType'),
+ Param(datatype='int', name='iPrimaryID'),
+ Param(datatype='int', name='iSecondaryID'),
+ ],
+ env_call=('Void', ''),
+ unchecked=False,
+ ),
+ CalledByNative(
+ return_type='int',
+ system_class=False,
+ static=True,
+ name='updateStatus',
+ method_id_var_name='updateStatus',
+ java_class_name='',
+ params=[
+ Param(annotations=['@Status'], datatype='int', name='status')
+ ],
+ env_call=('Integer', ''),
+ unchecked=False,
+ ),
+ CalledByNative(
+ return_type='void',
+ system_class=False,
+ static=False,
+ name='uncheckedCall',
+ method_id_var_name='uncheckedCall',
+ java_class_name='',
+ params=[Param(datatype='int', name='iParam')],
+ env_call=('Void', ''),
+ unchecked=True,
+ ),
+ CalledByNative(
+ return_type='byte[]',
+ system_class=False,
+ static=False,
+ name='returnByteArray',
+ method_id_var_name='returnByteArray',
+ java_class_name='',
+ params=[],
+ env_call=('Void', ''),
+ unchecked=False,
+ ),
+ CalledByNative(
+ return_type='boolean[]',
+ system_class=False,
+ static=False,
+ name='returnBooleanArray',
+ method_id_var_name='returnBooleanArray',
+ java_class_name='',
+ params=[],
+ env_call=('Void', ''),
+ unchecked=False,
+ ),
+ CalledByNative(
+ return_type='char[]',
+ system_class=False,
+ static=False,
+ name='returnCharArray',
+ method_id_var_name='returnCharArray',
+ java_class_name='',
+ params=[],
+ env_call=('Void', ''),
+ unchecked=False,
+ ),
+ CalledByNative(
+ return_type='short[]',
+ system_class=False,
+ static=False,
+ name='returnShortArray',
+ method_id_var_name='returnShortArray',
+ java_class_name='',
+ params=[],
+ env_call=('Void', ''),
+ unchecked=False,
+ ),
+ CalledByNative(
+ return_type='int[]',
+ system_class=False,
+ static=False,
+ name='returnIntArray',
+ method_id_var_name='returnIntArray',
+ java_class_name='',
+ params=[],
+ env_call=('Void', ''),
+ unchecked=False,
+ ),
+ CalledByNative(
+ return_type='long[]',
+ system_class=False,
+ static=False,
+ name='returnLongArray',
+ method_id_var_name='returnLongArray',
+ java_class_name='',
+ params=[],
+ env_call=('Void', ''),
+ unchecked=False,
+ ),
+ CalledByNative(
+ return_type='double[]',
+ system_class=False,
+ static=False,
+ name='returnDoubleArray',
+ method_id_var_name='returnDoubleArray',
+ java_class_name='',
+ params=[],
+ env_call=('Void', ''),
+ unchecked=False,
+ ),
+ CalledByNative(
+ return_type='Object[]',
+ system_class=False,
+ static=False,
+ name='returnObjectArray',
+ method_id_var_name='returnObjectArray',
+ java_class_name='',
+ params=[],
+ env_call=('Void', ''),
+ unchecked=False,
+ ),
+ CalledByNative(
+ return_type='byte[][]',
+ system_class=False,
+ static=False,
+ name='returnArrayOfByteArray',
+ method_id_var_name='returnArrayOfByteArray',
+ java_class_name='',
+ params=[],
+ env_call=('Void', ''),
+ unchecked=False,
+ ),
+ CalledByNative(
+ return_type='Bitmap.CompressFormat',
+ system_class=False,
+ static=False,
+ name='getCompressFormat',
+ method_id_var_name='getCompressFormat',
+ java_class_name='',
+ params=[],
+ env_call=('Void', ''),
+ unchecked=False,
+ ),
+ CalledByNative(
+ return_type='List<Bitmap.CompressFormat>',
+ system_class=False,
+ static=False,
+ name='getCompressFormatList',
+ method_id_var_name='getCompressFormatList',
+ java_class_name='',
+ params=[],
+ env_call=('Void', ''),
+ unchecked=False,
+ ),
+ CalledByNative(
+ return_type='int[]',
+ system_class=False,
+ static=False,
+ name='returnIntArrayForTesting',
+ method_id_var_name='returnIntArrayForTesting',
+ java_class_name='',
+ params=[],
+ env_call=('Void', ''),
+ unchecked=False,
+ ),
+ ]
+ self.AssertListEquals(golden_called_by_natives, called_by_natives)
+ h = jni_generator.InlHeaderFileGenerator('', '', 'org/chromium/TestJni', [],
+ called_by_natives, [], jni_params,
+ JniGeneratorOptions())
+ self.AssertGoldenTextEquals(h.GetContent())
+
+ def testCalledByNativeParseError(self):
+ try:
+ jni_params = jni_generator.JniParams('')
+ jni_generator.ExtractCalledByNatives(
+ jni_params,
+ """
+@CalledByNative
+public static int foo(); // This one is fine
+
+@CalledByNative
+scooby doo
+""",
+ always_mangle=False)
+ self.fail('Expected a ParseError')
+ except jni_generator.ParseError as e:
+ self.assertEqual(('@CalledByNative', 'scooby doo'), e.context_lines)
+
+ def testFullyQualifiedClassName(self):
+ contents = """
+// Copyright 2010 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.content.browser;
+
+import org.chromium.base.BuildInfo;
+"""
+ self.assertEqual(
+ 'org/chromium/content/browser/Foo',
+ jni_generator.ExtractFullyQualifiedJavaClassName(
+ 'org/chromium/content/browser/Foo.java', contents))
+ self.assertEqual(
+ 'org/chromium/content/browser/Foo',
+ jni_generator.ExtractFullyQualifiedJavaClassName(
+ 'frameworks/Foo.java', contents))
+ self.assertRaises(SyntaxError,
+ jni_generator.ExtractFullyQualifiedJavaClassName,
+ 'com/foo/Bar', 'no PACKAGE line')
+ self.assertRaises(AssertionError,
+ jni_generator.ExtractFullyQualifiedJavaClassName,
+ 'com/foo/Bar.kt', 'Kotlin not supported')
+
+ def testMethodNameMangling(self):
+ jni_params = jni_generator.JniParams('')
+ self.assertEqual(
+ 'closeV',
+ jni_generator.GetMangledMethodName(jni_params, 'close', [], 'void'))
+ self.assertEqual(
+ 'readI_AB_I_I',
+ jni_generator.GetMangledMethodName(jni_params, 'read', [
+ Param(name='p1', datatype='byte[]'),
+ Param(name='p2', datatype='int'),
+ Param(name='p3', datatype='int'),
+ ], 'int'))
+ self.assertEqual(
+ 'openJIIS_JLS',
+ jni_generator.GetMangledMethodName(jni_params, 'open', [
+ Param(name='p1', datatype='java/lang/String'),
+ ], 'java/io/InputStream'))
+
+ def testMethodNameAlwaysMangle(self):
+ test_data = """
+ import f.o.o.Bar;
+ import f.o.o.Baz;
+
+ class Clazz {
+ @CalledByNative
+ public Baz methodz(Bar bar) {
+ return null;
+ }
+ }
+ """
+ jni_params = jni_generator.JniParams('org/chromium/Foo')
+ jni_params.ExtractImportsAndInnerClasses(test_data)
+ called_by_natives = jni_generator.ExtractCalledByNatives(
+ jni_params, test_data, always_mangle=True)
+ self.assertEqual(1, len(called_by_natives))
+ method = called_by_natives[0]
+ self.assertEqual('methodzFOOB_FOOB', method.method_id_var_name)
+
+ def testFromJavaPGenerics(self):
+ contents = """
+public abstract class java.util.HashSet<T> extends java.util.AbstractSet<E>
+ implements java.util.Set<E>, java.lang.Cloneable, java.io.Serializable {
+ public void dummy();
+ Signature: ()V
+ public java.lang.Class<?> getClass();
+ Signature: ()Ljava/lang/Class<*>;
+ public static void overloadWithVarargs(java.lang.String...);
+ Signature: ([Ljava/lang/String;)V
+ public static void overloadWithVarargs(android.icu.text.DisplayContext...);
+ Signature: ([Landroid/icu/text/DisplayContext;)V
+}
+"""
+ jni_from_javap = jni_generator.JNIFromJavaP(contents.split('\n'),
+ JniGeneratorOptions())
+ self.AssertGoldenTextEquals(jni_from_javap.GetContent())
+
+ def testSnippnetJavap6_7_8(self):
+ content_javap6 = """
+public class java.util.HashSet {
+public boolean add(java.lang.Object);
+ Signature: (Ljava/lang/Object;)Z
+}
+"""
+
+ content_javap7 = """
+public class java.util.HashSet {
+public boolean add(E);
+ Signature: (Ljava/lang/Object;)Z
+}
+"""
+
+ content_javap8 = """
+public class java.util.HashSet {
+ public boolean add(E);
+ descriptor: (Ljava/lang/Object;)Z
+}
+"""
+
+ jni_from_javap6 = jni_generator.JNIFromJavaP(content_javap6.split('\n'),
+ JniGeneratorOptions())
+ jni_from_javap7 = jni_generator.JNIFromJavaP(content_javap7.split('\n'),
+ JniGeneratorOptions())
+ jni_from_javap8 = jni_generator.JNIFromJavaP(content_javap8.split('\n'),
+ JniGeneratorOptions())
+ self.assertTrue(jni_from_javap6.GetContent())
+ self.assertTrue(jni_from_javap7.GetContent())
+ self.assertTrue(jni_from_javap8.GetContent())
+ # Ensure the javap7 is correctly parsed and uses the Signature field rather
+ # than the "E" parameter.
+ self.AssertTextEquals(jni_from_javap6.GetContent(),
+ jni_from_javap7.GetContent())
+ # Ensure the javap8 is correctly parsed and uses the descriptor field.
+ self.AssertTextEquals(jni_from_javap7.GetContent(),
+ jni_from_javap8.GetContent())
+
+ def testFromJavaP(self):
+ contents = self._ReadGoldenFile('testInputStream.javap')
+ jni_from_javap = jni_generator.JNIFromJavaP(contents.split('\n'),
+ JniGeneratorOptions())
+ self.assertEqual(10, len(jni_from_javap.called_by_natives))
+ self.AssertGoldenTextEquals(jni_from_javap.GetContent())
+
+ def testConstantsFromJavaP(self):
+ for f in ['testMotionEvent.javap', 'testMotionEvent.javap7']:
+ contents = self._ReadGoldenFile(f)
+ jni_from_javap = jni_generator.JNIFromJavaP(contents.split('\n'),
+ JniGeneratorOptions())
+ self.assertEqual(86, len(jni_from_javap.called_by_natives))
+ self.AssertGoldenTextEquals(jni_from_javap.GetContent())
+
+ def testREForNatives(self):
+ # We should not match "native SyncSetupFlow" inside the comment.
+ test_data = """
+ /**
+ * Invoked when the setup process is complete so we can disconnect from the
+ * private native void nativeSyncSetupFlowHandler();.
+ */
+ public void destroy() {
+ Log.v(TAG, "Destroying native SyncSetupFlow");
+ if (mNativeSyncSetupFlow != 0) {
+ nativeSyncSetupEnded(mNativeSyncSetupFlow);
+ mNativeSyncSetupFlow = 0;
+ }
+ }
+ private native void nativeSyncSetupEnded(
+ int nativeAndroidSyncSetupFlowHandler);
+ """
+ jni_from_java = jni_generator.JNIFromJavaSource(test_data, 'foo/bar',
+ JniGeneratorOptions())
+ self.AssertGoldenTextEquals(jni_from_java.GetContent())
+
+ def testRaisesOnNonJNIMethod(self):
+ test_data = """
+ class MyInnerClass {
+ private int Foo(int p0) {
+ }
+ }
+ """
+ self.assertRaises(SyntaxError, jni_generator.JNIFromJavaSource, test_data,
+ 'foo/bar', JniGeneratorOptions())
+
+ def testJniSelfDocumentingExample(self):
+ generated_text = self._CreateJniHeaderFromFile(
+ os.path.join(_JAVA_SRC_DIR, 'SampleForTests.java'),
+ 'org/chromium/example/jni_generator/SampleForTests')
+ self.AssertGoldenTextEquals(
+ generated_text, golden_file='SampleForTests_jni.golden')
+
+ def testNoWrappingPreprocessorLines(self):
+ test_data = """
+ package com.google.lookhowextremelylongiam.snarf.icankeepthisupallday;
+
+ class ReallyLongClassNamesAreAllTheRage {
+ private static native int nativeTest();
+ }
+ """
+ jni_from_java = jni_generator.JNIFromJavaSource(
+ test_data, ('com/google/lookhowextremelylongiam/snarf/'
+ 'icankeepthisupallday/ReallyLongClassNamesAreAllTheRage'),
+ JniGeneratorOptions())
+ jni_lines = jni_from_java.GetContent().split('\n')
+ line = next(
+ line for line in jni_lines if line.lstrip().startswith('#ifndef'))
+ self.assertTrue(
+ len(line) > 80, ('Expected #ifndef line to be > 80 chars: ', line))
+
+ def testImports(self):
+ import_header = """
+// Copyright 2012 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.content.app;
+
+import android.app.Service;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.SurfaceTexture;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.os.ParcelFileDescriptor;
+import android.os.Process;
+import android.os.RemoteException;
+import android.util.Log;
+import android.view.Surface;
+
+import java.util.ArrayList;
+
+import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.JNINamespace;
+import org.chromium.content.app.ContentMain;
+import org.chromium.content.browser.SandboxedProcessConnection;
+import org.chromium.content.common.ISandboxedProcessCallback;
+import org.chromium.content.common.ISandboxedProcessService;
+import org.chromium.content.common.WillNotRaise.AnException;
+import org.chromium.content.common.WillRaise.AnException;
+
+import static org.chromium.Bar.Zoo;
+
+class Foo {
+ public static class BookmarkNode implements Parcelable {
+ }
+ public interface PasswordListObserver {
+ }
+}
+ """
+ jni_params = jni_generator.JniParams('org/chromium/content/app/Foo')
+ jni_params.ExtractImportsAndInnerClasses(import_header)
+ self.assertTrue('Lorg/chromium/content/common/ISandboxedProcessService' in
+ jni_params._imports)
+ self.assertTrue('Lorg/chromium/Bar/Zoo' in jni_params._imports)
+ self.assertTrue('Lorg/chromium/content/app/Foo$BookmarkNode' in jni_params.
+ _inner_classes)
+ self.assertTrue('Lorg/chromium/content/app/Foo$PasswordListObserver' in
+ jni_params._inner_classes)
+ self.assertEqual('Lorg/chromium/content/app/ContentMain$Inner;',
+ jni_params.JavaToJni('ContentMain.Inner'))
+ self.assertRaises(SyntaxError, jni_params.JavaToJni, 'AnException')
+
+ def testJniParamsJavaToJni(self):
+ jni_params = jni_generator.JniParams('')
+ self.AssertTextEquals('I', jni_params.JavaToJni('int'))
+ self.AssertTextEquals('[B', jni_params.JavaToJni('byte[]'))
+ self.AssertTextEquals('[Ljava/nio/ByteBuffer;',
+ jni_params.JavaToJni('java/nio/ByteBuffer[]'))
+
+ def testNativesLong(self):
+ test_options = JniGeneratorOptions()
+ test_options.ptr_type = 'long'
+ test_data = """"
+ private native void nativeDestroy(long nativeChromeBrowserProvider);
+ """
+ jni_params = jni_generator.JniParams('')
+ jni_params.ExtractImportsAndInnerClasses(test_data)
+ natives = jni_generator.ExtractNatives(test_data, test_options.ptr_type)
+ golden_natives = [
+ NativeMethod(
+ return_type='void',
+ static=False,
+ name='Destroy',
+ params=[Param(datatype='long', name='nativeChromeBrowserProvider')],
+ java_class_name=None,
+ ptr_type=test_options.ptr_type),
+ ]
+ self.AssertListEquals(golden_natives, natives)
+ h = jni_generator.InlHeaderFileGenerator('', '', 'org/chromium/TestJni',
+ natives, [], [], jni_params,
+ test_options)
+ self.AssertGoldenTextEquals(h.GetContent())
+
+ def testMainDexAnnotation(self):
+ mainDexEntries = [
+ '@MainDex public class Test {',
+ '@MainDex public class Test{',
+ """@MainDex
+ public class Test {
+ """,
+ """@MainDex public class Test
+ {
+ """,
+ '@MainDex /* This class is a test */ public class Test {',
+ '@MainDex public class Test implements java.io.Serializable {',
+ '@MainDex public class Test implements java.io.Serializable, Bidule {',
+ '@MainDex public class Test extends BaseTest {',
+ """@MainDex
+ public class Test extends BaseTest implements Bidule {
+ """,
+ """@MainDex
+ public class Test extends BaseTest implements Bidule, Machin, Chose {
+ """,
+ """@MainDex
+ public class Test implements Testable<java.io.Serializable> {
+ """,
+ '@MainDex public class Test implements Testable<java.io.Serializable> '
+ ' {',
+ '@a.B @MainDex @C public class Test extends Testable<Serializable> {',
+ """public class Test extends Testable<java.io.Serializable> {
+ @MainDex void func() {}
+ """,
+ ]
+ for entry in mainDexEntries:
+ self.assertEqual(True, IsMainDexJavaClass(entry), entry)
+
+ def testNoMainDexAnnotation(self):
+ noMainDexEntries = [
+ 'public class Test {', '@NotMainDex public class Test {',
+ '// @MainDex public class Test {', '/* @MainDex */ public class Test {',
+ 'public class Test implements java.io.Serializable {',
+ '@MainDexNot public class Test {',
+ 'public class Test extends BaseTest {'
+ ]
+ for entry in noMainDexEntries:
+ self.assertEqual(False, IsMainDexJavaClass(entry))
+
+ def testNativeExportsOnlyOption(self):
+ test_data = """
+ package org.chromium.example.jni_generator;
+
+ /** The pointer to the native Test. */
+ long nativeTest;
+
+ class Test {
+ private static native int nativeStaticMethod(long nativeTest, int arg1);
+ private native int nativeMethod(long nativeTest, int arg1);
+ @CalledByNative
+ private void testMethodWithParam(int iParam);
+ @CalledByNative
+ private String testMethodWithParamAndReturn(int iParam);
+ @CalledByNative
+ private static int testStaticMethodWithParam(int iParam);
+ @CalledByNative
+ private static double testMethodWithNoParam();
+ @CalledByNative
+ private static String testStaticMethodWithNoParam();
+
+ class MyInnerClass {
+ @NativeCall("MyInnerClass")
+ private native int nativeInit();
+ }
+ class MyOtherInnerClass {
+ @NativeCall("MyOtherInnerClass")
+ private native int nativeInit();
+ }
+ }
+ """
+ options = JniGeneratorOptions()
+ jni_from_java = jni_generator.JNIFromJavaSource(
+ test_data, 'org/chromium/example/jni_generator/SampleForTests', options)
+ self.AssertGoldenTextEquals(jni_from_java.GetContent())
+
+ def testOuterInnerRaises(self):
+ test_data = """
+ package org.chromium.media;
+
+ @CalledByNative
+ static int getCaptureFormatWidth(VideoCapture.CaptureFormat format) {
+ return format.getWidth();
+ }
+ """
+
+ def willRaise():
+ jni_generator.JNIFromJavaSource(test_data,
+ 'org/chromium/media/VideoCaptureFactory',
+ JniGeneratorOptions())
+
+ self.assertRaises(SyntaxError, willRaise)
+
+ def testSingleJNIAdditionalImport(self):
+ test_data = """
+ package org.chromium.foo;
+
+ @JNIAdditionalImport(Bar.class)
+ class Foo {
+
+ @CalledByNative
+ private static void calledByNative(Bar.Callback callback) {
+ }
+
+ private static native void nativeDoSomething(Bar.Callback callback);
+ }
+ """
+ jni_from_java = jni_generator.JNIFromJavaSource(test_data,
+ 'org/chromium/foo/Foo',
+ JniGeneratorOptions())
+ self.AssertGoldenTextEquals(jni_from_java.GetContent())
+
+ def testMultipleJNIAdditionalImport(self):
+ test_data = """
+ package org.chromium.foo;
+
+ @JNIAdditionalImport({Bar1.class, Bar2.class})
+ class Foo {
+
+ @CalledByNative
+ private static void calledByNative(Bar1.Callback callback1,
+ Bar2.Callback callback2) {
+ }
+
+ private static native void nativeDoSomething(Bar1.Callback callback1,
+ Bar2.Callback callback2);
+ }
+ """
+ jni_from_java = jni_generator.JNIFromJavaSource(test_data,
+ 'org/chromium/foo/Foo',
+ JniGeneratorOptions())
+ self.AssertGoldenTextEquals(jni_from_java.GetContent())
+
+ def testTracing(self):
+ test_data = """
+ package org.chromium.foo;
+
+ @JNINamespace("org::chromium_foo")
+ class Foo {
+
+ @CalledByNative
+ Foo();
+
+ @CalledByNative
+ void callbackFromNative();
+
+ native void nativeInstanceMethod(long nativeInstance);
+
+ static native void nativeStaticMethod();
+ }
+ """
+ options_with_tracing = JniGeneratorOptions()
+ options_with_tracing.enable_tracing = True
+ jni_from_java = jni_generator.JNIFromJavaSource(
+ test_data, 'org/chromium/foo/Foo', options_with_tracing)
+ self.AssertGoldenTextEquals(jni_from_java.GetContent())
+
+ def testStaticBindingCaller(self):
+ test_data = """
+ package org.chromium.foo;
+
+ class Bar {
+ static native void nativeShouldBindCaller(Object caller);
+ static native void nativeShouldBindCaller(Object caller, int a);
+ static native void nativeFoo(long nativeNativeObject, Bar caller);
+ static native void nativeFoo(long nativeNativeObject, Bar caller, int a);
+ native void nativeCallNativeMethod(long nativePtr);
+ @NativeClassQualifiedName("Foo::Bar")
+ native void nativeCallWithQualifiedObject(long nativePtr);
+ }
+ """
+
+ jni_from_java = jni_generator.JNIFromJavaSource(test_data,
+ 'org/chromium/foo/Foo',
+ JniGeneratorOptions())
+ self.AssertGoldenTextEquals(jni_from_java.GetContent())
+
+ def testSplitNameExample(self):
+ opts = JniGeneratorOptions()
+ opts.split_name = "sample"
+ generated_text = self._CreateJniHeaderFromFile(
+ os.path.join(_JAVA_SRC_DIR, 'SampleForTests.java'),
+ 'org/chromium/example/jni_generator/SampleForTests', opts)
+ self.AssertGoldenTextEquals(
+ generated_text, golden_file='SampleForTestsWithSplit_jni.golden')
+
+
+@unittest.skipIf(os.name == 'nt', 'Not intended to work on Windows')
+class ProxyTestGenerator(BaseTest):
+
+ def _BuildRegDictFromSample(self):
+ path = self._JoinScriptDir(
+ os.path.join(_JAVA_SRC_DIR, 'SampleForAnnotationProcessor.java'))
+ reg_dict = jni_registration_generator._DictForPath(
+ JniRegistrationGeneratorOptions(), path)
+ reg_dict = self._MergeRegistrationForTests([reg_dict])
+
+ return reg_dict
+
+ def testEndToEndProxyHashed(self):
+ input_java_files = ['SampleForAnnotationProcessor.java']
+ options = JniRegistrationGeneratorOptions()
+ options.use_proxy_hash = True
+ name_to_goldens = {
+ 'org/chromium/base/natives/GEN_JNI.java':
+ 'HashedSampleForAnnotationProcessorGenJni.2.golden',
+ 'J/N.java': 'HashedSampleForAnnotationProcessorGenJni.golden'
+ }
+ self._TestEndToEndRegistration(input_java_files, options, name_to_goldens)
+
+ def testEndToEndManualRegistration(self):
+ input_java_files = ['SampleForAnnotationProcessor.java']
+ options = JniRegistrationGeneratorOptions()
+ options.manual_jni_registration = True
+ name_to_goldens = {
+ 'org/chromium/base/natives/GEN_JNI.java':
+ 'SampleForAnnotationProcessorGenJni.golden'
+ }
+ self._TestEndToEndRegistration(
+ input_java_files,
+ options,
+ name_to_goldens,
+ header_golden='SampleForAnnotationProcessorManualJni.golden')
+
+ def testEndToEndProxyJniWithModules(self):
+ input_java_files = [
+ 'SampleForAnnotationProcessor.java', 'SampleModule.java'
+ ]
+ options = JniRegistrationGeneratorOptions()
+ options.use_proxy_hash = True
+ name_to_goldens = {
+ 'org/chromium/base/natives/GEN_JNI.java':
+ 'HashedSampleForAnnotationProcessorGenJni.2.golden',
+ 'J/N.java': 'HashedSampleForAnnotationProcessorGenJni.golden',
+ 'org/chromium/base/natives/module_GEN_JNI.java': 'ModuleGenJni.golden',
+ 'J/module_N.java': 'ModuleJN.golden'
+ }
+ self._TestEndToEndRegistration(input_java_files, options, name_to_goldens)
+
+ def testProxyNativesWithNatives(self):
+ test_data = """
+ package org.chromium.foo;
+
+ class Foo {
+
+ @NativeMethods
+ interface Natives {
+ void foo();
+ String bar(String s, int y, char x, short z);
+ String[] foobar(String[] a);
+ void baz(long nativePtr, BazClass caller);
+ void fooBar(long nativePtr);
+ }
+
+ void justARegularFunction();
+
+ native void nativeInstanceMethod(long nativeInstance);
+ static native void nativeStaticMethod();
+
+ }
+ """
+ options_with_tracing = JniGeneratorOptions()
+ options_with_tracing.enable_tracing = True
+ jni_from_java = jni_generator.JNIFromJavaSource(
+ test_data, 'org/chromium/foo/Foo', options_with_tracing)
+ self.AssertGoldenTextEquals(jni_from_java.GetContent())
+
+ def testEscapingProxyNatives(self):
+ test_data = """
+ class SampleProxyJni {
+ @NativeMethods
+ interface Natives {
+ void foo_bar();
+ void foo__bar();
+ }
+ }
+ """
+ qualified_clazz = 'org/chromium/example/SampleProxyJni'
+
+ natives, _ = jni_generator.ProxyHelpers.ExtractStaticProxyNatives(
+ qualified_clazz, test_data, 'long')
+
+ golden_natives = [
+ NativeMethod(
+ return_type='void',
+ static=True,
+ name='foo_bar',
+ params=[],
+ java_class_name=None,
+ is_proxy=True,
+ proxy_name='org_chromium_example_SampleProxyJni_foo_1bar'),
+ NativeMethod(
+ return_type='void',
+ static=True,
+ name='foo__bar',
+ params=[],
+ java_class_name=None,
+ is_proxy=True,
+ proxy_name='org_chromium_example_SampleProxyJni_foo_1_1bar'),
+ ]
+
+ self.AssertListEquals(_RemoveHashedNames(natives), golden_natives)
+
+ def testForTestingKept(self):
+ test_data = """
+ class SampleProxyJni {
+ @NativeMethods
+ interface Natives {
+ void fooForTesting();
+ void fooForTest();
+ }
+ }
+ """
+ qualified_clazz = 'org/chromium/example/SampleProxyJni'
+
+ natives, _ = jni_generator.ProxyHelpers.ExtractStaticProxyNatives(
+ qualified_clazz, test_data, 'long', True)
+
+ golden_natives = [
+ NativeMethod(
+ return_type='void',
+ static=True,
+ name='fooForTesting',
+ params=[],
+ java_class_name=None,
+ is_proxy=True,
+ proxy_name='org_chromium_example_SampleProxyJni_fooForTesting'),
+ NativeMethod(
+ return_type='void',
+ static=True,
+ name='fooForTest',
+ params=[],
+ java_class_name=None,
+ is_proxy=True,
+ proxy_name='org_chromium_example_SampleProxyJni_fooForTest'),
+ ]
+
+ self.AssertListEquals(_RemoveHashedNames(natives), golden_natives)
+
+ def testForTestingRemoved(self):
+ test_data = """
+ class SampleProxyJni {
+ @NativeMethods
+ interface Natives {
+ void fooForTesting();
+ void fooForTest();
+ }
+ }
+ """
+ qualified_clazz = 'org/chromium/example/SampleProxyJni'
+
+ natives, _ = jni_generator.ProxyHelpers.ExtractStaticProxyNatives(
+ qualified_clazz, test_data, 'long', False)
+
+ self.AssertListEquals(_RemoveHashedNames(natives), [])
+
+ def testProxyNativesMainDex(self):
+ test_data = """
+ @MainDex
+ class Foo() {
+ @NativeMethods
+ interface Natives {
+ void thisismaindex();
+ }
+ void dontmatchme();
+ public static void metoo();
+ public static native void this_is_a_non_proxy_native();
+ }
+ """
+
+ non_main_dex_test_data = """
+ class Bar() {
+ @NativeMethods
+ interface Natives {
+ void foo();
+ void bar();
+ }
+ }
+ """
+ qualified_clazz = 'test/foo/Foo'
+ options = JniRegistrationGeneratorOptions()
+ options.manual_jni_registration = True
+
+ natives, _ = jni_generator.ProxyHelpers.ExtractStaticProxyNatives(
+ qualified_clazz, test_data, 'long')
+
+ golden_natives = [
+ NativeMethod(
+ return_type='void',
+ static=True,
+ name='thisismaindex',
+ params=[],
+ java_class_name=None,
+ is_proxy=True,
+ proxy_name='test_foo_Foo_thisismaindex'),
+ ]
+
+ self.AssertListEquals(_RemoveHashedNames(natives), golden_natives)
+
+ jni_params = jni_generator.JniParams(qualified_clazz)
+ main_dex_header = jni_registration_generator.DictionaryGenerator(
+ options, '', '', qualified_clazz, natives, jni_params,
+ main_dex=True).Generate()
+ content = TestGenerator._MergeRegistrationForTests([main_dex_header])
+
+ self.AssertGoldenTextEquals(
+ jni_registration_generator.CreateFromDict(options, '', content))
+
+ other_qualified_clazz = 'test/foo/Bar'
+ other_natives, _ = jni_generator.ProxyHelpers.ExtractStaticProxyNatives(
+ other_qualified_clazz, non_main_dex_test_data, 'long')
+
+ jni_params = jni_generator.JniParams(other_qualified_clazz)
+ non_main_dex_header = jni_registration_generator.DictionaryGenerator(
+ options,
+ '',
+ '',
+ other_qualified_clazz,
+ other_natives,
+ jni_params,
+ main_dex=False).Generate()
+
+ content = TestGenerator._MergeRegistrationForTests([main_dex_header] +
+ [non_main_dex_header])
+
+ self.AssertGoldenTextEquals(
+ jni_registration_generator.CreateFromDict(options, '', content),
+ 'AndNonMainDex')
+
+ def testProxyNatives(self):
+ test_data = """
+ class SampleProxyJni {
+ private void do_not_match();
+ @VisibleForTesting
+ @NativeMethods
+ @Generated("Test")
+ interface Natives {
+ @NativeClassQualifiedName("FooAndroid::BarDelegate")
+ void foo(long nativePtr);
+ int bar(int x, int y);
+ String foobar(String x, String y);
+ }
+ void dontmatchme();
+ public static void metoo();
+ public static native void this_is_a_non_proxy_native();
+ }
+ """
+
+ bad_spaced_test_data = """
+ class SampleProxyJni{
+ @NativeMethods interface
+ Natives
+
+
+ { @NativeClassQualifiedName("FooAndroid::BarDelegate") void
+ foo(long nativePtr);
+ int bar(int
+ x, int y); String
+ foobar(String x, String y);
+ }
+
+ }
+ """
+
+ qualified_clazz = 'org/chromium/example/SampleProxyJni'
+
+ natives, _ = jni_generator.ProxyHelpers.ExtractStaticProxyNatives(
+ qualified_clazz, test_data, 'long')
+ bad_spacing_natives, _ = jni_generator.ProxyHelpers \
+ .ExtractStaticProxyNatives(qualified_clazz, bad_spaced_test_data, 'long')
+ golden_natives = [
+ NativeMethod(
+ return_type='void',
+ static=True,
+ name='foo',
+ native_class_name='FooAndroid::BarDelegate',
+ params=[Param(datatype='long', name='nativePtr')],
+ java_class_name=None,
+ is_proxy=True,
+ proxy_name='org_chromium_example_SampleProxyJni_foo',
+ ptr_type='long'),
+ NativeMethod(
+ return_type='int',
+ static=True,
+ name='bar',
+ params=[
+ Param(datatype='int', name='x'),
+ Param(datatype='int', name='y')
+ ],
+ java_class_name=None,
+ is_proxy=True,
+ proxy_name='org_chromium_example_SampleProxyJni_bar'),
+ NativeMethod(
+ return_type='String',
+ static=True,
+ name='foobar',
+ params=[
+ Param(datatype='String', name='x'),
+ Param(datatype='String', name='y')
+ ],
+ java_class_name=None,
+ is_proxy=True,
+ proxy_name='org_chromium_example_SampleProxyJni_foobar'),
+ ]
+ self.AssertListEquals(golden_natives, _RemoveHashedNames(natives))
+ self.AssertListEquals(golden_natives,
+ _RemoveHashedNames(bad_spacing_natives))
+ options = JniGeneratorOptions()
+ reg_options = JniRegistrationGeneratorOptions()
+ reg_options.manual_jni_registration = True
+
+ jni_params = jni_generator.JniParams(qualified_clazz)
+ h1 = jni_generator.InlHeaderFileGenerator('', '', qualified_clazz, natives,
+ [], [], jni_params, options)
+ self.AssertGoldenTextEquals(h1.GetContent())
+ h2 = jni_registration_generator.DictionaryGenerator(reg_options, '', '',
+ qualified_clazz,
+ natives, jni_params,
+ False)
+ content = TestGenerator._MergeRegistrationForTests([h2.Generate()])
+
+
+ self.AssertGoldenTextEquals(
+ jni_registration_generator.CreateProxyJavaFromDict(
+ reg_options, '', content),
+ suffix='Java')
+
+ self.AssertGoldenTextEquals(jni_registration_generator.CreateFromDict(
+ reg_options, '', content),
+ suffix='Registrations')
+
+ def testProxyHashedExample(self):
+ opts = JniGeneratorOptions()
+ opts.use_proxy_hash = True
+ path = os.path.join(_JAVA_SRC_DIR, 'SampleForAnnotationProcessor.java')
+
+ generated_text = self._CreateJniHeaderFromFile(
+ path, 'org/chromium/example/jni_generator/SampleForAnnotationProcessor',
+ opts)
+ self.AssertGoldenTextEquals(
+ generated_text,
+ golden_file='HashedSampleForAnnotationProcessor_jni.golden')
+
+ def testProxyJniExample(self):
+ generated_text = self._CreateJniHeaderFromFile(
+ os.path.join(_JAVA_SRC_DIR, 'SampleForAnnotationProcessor.java'),
+ 'org/chromium/example/jni_generator/SampleForAnnotationProcessor')
+ self.AssertGoldenTextEquals(
+ generated_text, golden_file='SampleForAnnotationProcessor_jni.golden')
+
+ def testGenJniFlags(self):
+ options = JniRegistrationGeneratorOptions()
+ reg_dict = self._BuildRegDictFromSample()
+ content = jni_registration_generator.CreateProxyJavaFromDict(
+ options, '', reg_dict)
+ self.AssertGoldenTextEquals(content, 'Disabled')
+
+ options.enable_proxy_mocks = True
+ content = jni_registration_generator.CreateProxyJavaFromDict(
+ options, '', reg_dict)
+ self.AssertGoldenTextEquals(content, 'MocksEnabled')
+
+ options.require_mocks = True
+ content = jni_registration_generator.CreateProxyJavaFromDict(
+ options, '', reg_dict)
+ self.AssertGoldenTextEquals(content, 'MocksRequired')
+
+ def testProxyTypeInfoPreserved(self):
+ test_data = """
+ package org.chromium.foo;
+
+ class Foo {
+
+ @NativeMethods
+ interface Natives {
+ char[][] fooProxy(byte[][] b);
+ SomeJavaType[][] barProxy(String[][] s, short z);
+ String[] foobarProxy(String[] a, int[][] b);
+ byte[][] bazProxy(long nativePtr, BazClass caller,
+ SomeJavaType[][] someObjects);
+ }
+ """
+ natives, _ = ProxyHelpers.ExtractStaticProxyNatives(
+ 'org/chromium/foo/FooJni', test_data, 'long')
+ golden_natives = [
+ NativeMethod(
+ static=True,
+ java_class_name=None,
+ return_type='char[][]',
+ name='fooProxy',
+ params=[Param(datatype='byte[][]', name='b')],
+ is_proxy=True,
+ proxy_name='org_chromium_foo_FooJni_fooProxy'),
+ NativeMethod(
+ static=True,
+ java_class_name=None,
+ return_type='Object[][]',
+ name='barProxy',
+ params=[
+ Param(datatype='String[][]', name='s'),
+ Param(datatype='short', name='z')
+ ],
+ is_proxy=True,
+ proxy_name='org_chromium_foo_FooJni_barProxy'),
+ NativeMethod(
+ static=True,
+ java_class_name=None,
+ return_type='String[]',
+ name='foobarProxy',
+ params=[
+ Param(datatype='String[]', name='a'),
+ Param(datatype='int[][]', name='b')
+ ],
+ is_proxy=True,
+ proxy_name='org_chromium_foo_FooJni_foobarProxy'),
+ NativeMethod(
+ static=True,
+ java_class_name=None,
+ return_type='byte[][]',
+ name='bazProxy',
+ params=[
+ Param(datatype='long', name='nativePtr'),
+ Param(datatype='Object', name='caller'),
+ Param(datatype='Object[][]', name='someObjects')
+ ],
+ is_proxy=True,
+ proxy_name='org_chromium_foo_FooJni_bazProxy',
+ ptr_type='long')
+ ]
+ self.AssertListEquals(golden_natives, _RemoveHashedNames(natives))
+
+
+@unittest.skipIf(os.name == 'nt', 'Not intended to work on Windows')
+class MultiplexTestGenerator(BaseTest):
+ options = JniRegistrationGeneratorOptions()
+ options.enable_jni_multiplexing = True
+
+ def testProxyMultiplexGenJni(self):
+ path = os.path.join(_JAVA_SRC_DIR, 'SampleForAnnotationProcessor.java')
+ reg_dict = jni_registration_generator._DictForPath(
+ self.options, self._JoinScriptDir(path))
+ reg_dict = self._MergeRegistrationForTests([reg_dict],
+ enable_jni_multiplexing=True)
+
+ self.AssertGoldenTextEquals(
+ jni_registration_generator.CreateProxyJavaFromDict(
+ self.options, '', reg_dict),
+ golden_file='testProxyMultiplexGenJni.golden')
+
+ self.AssertGoldenTextEquals(
+ jni_registration_generator.CreateProxyJavaFromDict(self.options,
+ '',
+ reg_dict,
+ forwarding=True),
+ golden_file='testProxyMultiplexGenJni.2.golden')
+
+ def testProxyMultiplexNatives(self):
+ path = os.path.join(_JAVA_SRC_DIR, 'SampleForAnnotationProcessor.java')
+ reg_dict = jni_registration_generator._DictForPath(
+ self.options, self._JoinScriptDir(path))
+ reg_dict = self._MergeRegistrationForTests([reg_dict],
+ enable_jni_multiplexing=True)
+
+ self.AssertGoldenTextEquals(jni_registration_generator.CreateFromDict(
+ self.options, '', reg_dict),
+ golden_file='testProxyMultiplexNatives.golden')
+
+ def testProxyMultiplexNativesRegistration(self):
+ path = os.path.join(_JAVA_SRC_DIR, 'SampleForAnnotationProcessor.java')
+ reg_dict_for_registration = jni_registration_generator._DictForPath(
+ self.options, self._JoinScriptDir(path))
+ reg_dict_for_registration = self._MergeRegistrationForTests(
+ [reg_dict_for_registration], enable_jni_multiplexing=True)
+
+ new_options = copy.copy(self.options)
+ new_options.manual_jni_registration = True
+ self.AssertGoldenTextEquals(
+ jni_registration_generator.CreateFromDict(new_options, '',
+ reg_dict_for_registration),
+ golden_file='testProxyMultiplexNativesRegistration.golden')
+
+
+def TouchStamp(stamp_path):
+ dir_name = os.path.dirname(stamp_path)
+ if not os.path.isdir(dir_name):
+ os.makedirs(dir_name)
+
+ with open(stamp_path, 'a'):
+ os.utime(stamp_path, None)
+
+
+def main(argv):
+ parser = optparse.OptionParser()
+ parser.add_option('--stamp', help='Path to touch on success.')
+ parser.add_option(
+ '-v', '--verbose', action='store_true', help='Whether to output details.')
+ options, _ = parser.parse_args(argv[1:])
+
+ test_result = unittest.main(
+ argv=argv[0:1], exit=False, verbosity=(2 if options.verbose else 1))
+
+ if test_result.result.wasSuccessful() and options.stamp:
+ TouchStamp(options.stamp)
+
+ return not test_result.result.wasSuccessful()
+
+
+if __name__ == '__main__':
+ sys.exit(main(sys.argv))
diff --git a/chromium/base/android/jni_generator/jni_registration_generator.py b/chromium/base/android/jni_generator/jni_registration_generator.py
new file mode 100755
index 00000000000..f5563ed7b3b
--- /dev/null
+++ b/chromium/base/android/jni_generator/jni_registration_generator.py
@@ -0,0 +1,928 @@
+#!/usr/bin/env python3
+# Copyright 2017 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Generates GEN_JNI.java (or N.java) and helper for manual JNI registration.
+
+Creates a header file with two static functions: RegisterMainDexNatives() and
+RegisterNonMainDexNatives(). Together, these will use manual JNI registration
+to register all native methods that exist within an application."""
+
+import argparse
+import collections
+import functools
+import hashlib
+import multiprocessing
+import os
+import string
+import sys
+import zipfile
+
+import jni_generator
+from util import build_utils
+
+# All but FULL_CLASS_NAME, which is used only for sorting.
+MERGEABLE_KEYS = [
+ 'CLASS_PATH_DECLARATIONS',
+ 'FORWARD_DECLARATIONS',
+ 'JNI_NATIVE_METHOD',
+ 'JNI_NATIVE_METHOD_ARRAY',
+ 'PROXY_NATIVE_SIGNATURES',
+ 'FORWARDING_PROXY_METHODS',
+ 'PROXY_NATIVE_METHOD_ARRAY',
+ 'PROXY_NATIVE_METHOD_ARRAY_MAIN_DEX',
+ 'REGISTER_MAIN_DEX_NATIVES',
+ 'REGISTER_NON_MAIN_DEX_NATIVES',
+]
+
+
+def _Generate(options, java_file_paths):
+ """Generates files required to perform JNI registration.
+
+ Generates a srcjar containing a single class, GEN_JNI, that contains all
+ native method declarations.
+
+ Optionally generates a header file that provides functions
+ (RegisterMainDexNatives and RegisterNonMainDexNatives) to perform
+ JNI registration.
+
+ Args:
+ options: arguments from the command line
+ java_file_paths: A list of java file paths.
+ """
+ # Without multiprocessing, script takes ~13 seconds for chrome_public_apk
+ # on a z620. With multiprocessing, takes ~2 seconds.
+ results = collections.defaultdict(list)
+ with multiprocessing.Pool() as pool:
+ for d in pool.imap_unordered(functools.partial(_DictForPath, options),
+ java_file_paths):
+ if d:
+ results[d['MODULE_NAME']].append(d)
+
+ combined_dicts = collections.defaultdict(dict)
+ for module_name, module_results in results.items():
+ # Sort to make output deterministic.
+ module_results.sort(key=lambda d: d['FULL_CLASS_NAME'])
+ combined_dict = combined_dicts[module_name]
+ for key in MERGEABLE_KEYS:
+ combined_dict[key] = ''.join(d.get(key, '') for d in module_results)
+
+ # PROXY_NATIVE_SIGNATURES and PROXY_NATIVE_METHOD_ARRAY_MAIN_DEX will have
+ # duplicates for JNI multiplexing since all native methods with similar
+ # signatures map to the same proxy. Similarly, there may be multiple switch
+ # case entries for the same proxy signatures.
+ if options.enable_jni_multiplexing:
+ proxy_signatures_list = sorted(
+ set(combined_dict['PROXY_NATIVE_SIGNATURES'].split('\n')))
+ combined_dict['PROXY_NATIVE_SIGNATURES'] = '\n'.join(
+ signature for signature in proxy_signatures_list)
+
+ proxy_native_array_list = sorted(
+ set(combined_dict['PROXY_NATIVE_METHOD_ARRAY_MAIN_DEX'].split(
+ '},\n')))
+ combined_dict['PROXY_NATIVE_METHOD_ARRAY_MAIN_DEX'] = '},\n'.join(
+ p for p in proxy_native_array_list if p != '') + '}'
+
+ signature_to_cases = collections.defaultdict(list)
+ for d in module_results:
+ for signature, cases in d['SIGNATURE_TO_CASES'].items():
+ signature_to_cases[signature].extend(cases)
+ combined_dict['FORWARDING_CALLS'] = _AddForwardingCalls(
+ signature_to_cases, module_name)
+
+ if options.header_path:
+ assert len(
+ combined_dicts) == 1, 'Cannot output a header for multiple modules'
+ module_name = next(iter(combined_dicts))
+ combined_dict = combined_dicts[module_name]
+
+ combined_dict['HEADER_GUARD'] = \
+ os.path.splitext(options.header_path)[0].replace('/', '_').replace('.', '_').upper() + '_'
+ combined_dict['NAMESPACE'] = options.namespace
+ header_content = CreateFromDict(options, module_name, combined_dict)
+ with build_utils.AtomicOutput(options.header_path, mode='w') as f:
+ f.write(header_content)
+
+ with build_utils.AtomicOutput(options.srcjar_path) as f:
+ with zipfile.ZipFile(f, 'w') as srcjar:
+ for module_name, combined_dict in combined_dicts.items():
+
+ if options.use_proxy_hash or options.enable_jni_multiplexing:
+ # J/N.java
+ build_utils.AddToZipHermetic(
+ srcjar,
+ '%s.java' %
+ jni_generator.ProxyHelpers.GetQualifiedClass(True, module_name),
+ data=CreateProxyJavaFromDict(options, module_name, combined_dict))
+ # org/chromium/base/natives/GEN_JNI.java
+ build_utils.AddToZipHermetic(
+ srcjar,
+ '%s.java' %
+ jni_generator.ProxyHelpers.GetQualifiedClass(False, module_name),
+ data=CreateProxyJavaFromDict(options,
+ module_name,
+ combined_dict,
+ forwarding=True))
+ else:
+ # org/chromium/base/natives/GEN_JNI.java
+ build_utils.AddToZipHermetic(
+ srcjar,
+ '%s.java' %
+ jni_generator.ProxyHelpers.GetQualifiedClass(False, module_name),
+ data=CreateProxyJavaFromDict(options, module_name, combined_dict))
+
+
+def _DictForPath(options, path):
+ with open(path) as f:
+ contents = jni_generator.RemoveComments(f.read())
+ if '@JniIgnoreNatives' in contents:
+ return None
+
+ fully_qualified_class = jni_generator.ExtractFullyQualifiedJavaClassName(
+ path, contents)
+
+ natives, module_name = jni_generator.ProxyHelpers.ExtractStaticProxyNatives(
+ fully_qualified_class=fully_qualified_class,
+ contents=contents,
+ ptr_type='long',
+ include_test_only=options.include_test_only)
+ natives += jni_generator.ExtractNatives(contents, 'long')
+
+ if len(natives) == 0:
+ return None
+ # The namespace for the content is separate from the namespace for the
+ # generated header file.
+ content_namespace = jni_generator.ExtractJNINamespace(contents)
+ jni_params = jni_generator.JniParams(fully_qualified_class)
+ jni_params.ExtractImportsAndInnerClasses(contents)
+ is_main_dex = jni_generator.IsMainDexJavaClass(contents)
+ dict_generator = DictionaryGenerator(options, module_name, content_namespace,
+ fully_qualified_class, natives,
+ jni_params, is_main_dex)
+ return dict_generator.Generate()
+
+
+def _AddForwardingCalls(signature_to_cases, module_name):
+ template = string.Template("""
+JNI_GENERATOR_EXPORT ${RETURN} Java_${CLASS_NAME}_${PROXY_SIGNATURE}(
+ JNIEnv* env,
+ jclass jcaller,
+ ${PARAMS_IN_STUB}) {
+ switch (switch_num) {
+ ${CASES}
+ default:
+ CHECK(false) << "JNI multiplexing function Java_\
+${CLASS_NAME}_${PROXY_SIGNATURE} was called with an invalid switch number: "\
+ << switch_num;
+ return${DEFAULT_RETURN};
+ }
+}""")
+
+ switch_statements = []
+ for signature, cases in sorted(signature_to_cases.items()):
+ return_type, params_list = signature
+ params_in_stub = _GetJavaToNativeParamsList(params_list)
+ switch_statements.append(
+ template.substitute({
+ 'RETURN':
+ jni_generator.JavaDataTypeToC(return_type),
+ 'CLASS_NAME':
+ jni_generator.EscapeClassName(
+ jni_generator.ProxyHelpers.GetQualifiedClass(True,
+ module_name)),
+ 'PROXY_SIGNATURE':
+ jni_generator.EscapeClassName(
+ _GetMultiplexProxyName(return_type, params_list)),
+ 'PARAMS_IN_STUB':
+ params_in_stub,
+ 'CASES':
+ ''.join(cases),
+ 'DEFAULT_RETURN':
+ '' if return_type == 'void' else ' {}',
+ }))
+
+ return ''.join(s for s in switch_statements)
+
+
+def _SetProxyRegistrationFields(options, module_name, registration_dict):
+ registration_template = string.Template("""\
+
+static const JNINativeMethod kMethods_${ESCAPED_PROXY_CLASS}[] = {
+${KMETHODS}
+};
+
+namespace {
+
+JNI_REGISTRATION_EXPORT bool ${REGISTRATION_NAME}(JNIEnv* env) {
+ const int number_of_methods = std::size(kMethods_${ESCAPED_PROXY_CLASS});
+
+ base::android::ScopedJavaLocalRef<jclass> native_clazz =
+ base::android::GetClass(env, "${PROXY_CLASS}");
+ if (env->RegisterNatives(
+ native_clazz.obj(),
+ kMethods_${ESCAPED_PROXY_CLASS},
+ number_of_methods) < 0) {
+
+ jni_generator::HandleRegistrationError(env, native_clazz.obj(), __FILE__);
+ return false;
+ }
+
+ return true;
+}
+
+} // namespace
+""")
+
+ registration_call = string.Template("""\
+
+ // Register natives in a proxy.
+ if (!${REGISTRATION_NAME}(env)) {
+ return false;
+ }
+""")
+
+ manual_registration = string.Template("""\
+// Step 3: Method declarations.
+
+${JNI_NATIVE_METHOD_ARRAY}\
+${PROXY_NATIVE_METHOD_ARRAY}\
+
+${JNI_NATIVE_METHOD}
+// Step 4: Main dex and non-main dex registration functions.
+
+namespace ${NAMESPACE} {
+
+bool RegisterMainDexNatives(JNIEnv* env) {\
+${REGISTER_MAIN_DEX_PROXY_NATIVES}
+${REGISTER_MAIN_DEX_NATIVES}
+ return true;
+}
+
+bool RegisterNonMainDexNatives(JNIEnv* env) {\
+${REGISTER_PROXY_NATIVES}
+${REGISTER_NON_MAIN_DEX_NATIVES}
+ return true;
+}
+
+} // namespace ${NAMESPACE}
+""")
+
+ short_name = options.use_proxy_hash or options.enable_jni_multiplexing
+ sub_dict = {
+ 'ESCAPED_PROXY_CLASS':
+ jni_generator.EscapeClassName(
+ jni_generator.ProxyHelpers.GetQualifiedClass(short_name,
+ module_name)),
+ 'PROXY_CLASS':
+ jni_generator.ProxyHelpers.GetQualifiedClass(short_name, module_name),
+ 'KMETHODS':
+ registration_dict['PROXY_NATIVE_METHOD_ARRAY'],
+ 'REGISTRATION_NAME':
+ jni_generator.GetRegistrationFunctionName(
+ jni_generator.ProxyHelpers.GetQualifiedClass(short_name,
+ module_name)),
+ }
+
+ if registration_dict['PROXY_NATIVE_METHOD_ARRAY']:
+ proxy_native_array = registration_template.substitute(sub_dict)
+ proxy_natives_registration = registration_call.substitute(sub_dict)
+ else:
+ proxy_native_array = ''
+ proxy_natives_registration = ''
+
+ if registration_dict['PROXY_NATIVE_METHOD_ARRAY_MAIN_DEX']:
+ sub_dict['REGISTRATION_NAME'] += 'MAIN_DEX'
+ sub_dict['ESCAPED_PROXY_CLASS'] += 'MAIN_DEX'
+ sub_dict['KMETHODS'] = (
+ registration_dict['PROXY_NATIVE_METHOD_ARRAY_MAIN_DEX'])
+ proxy_native_array += registration_template.substitute(sub_dict)
+ main_dex_call = registration_call.substitute(sub_dict)
+ else:
+ main_dex_call = ''
+
+ registration_dict['PROXY_NATIVE_METHOD_ARRAY'] = proxy_native_array
+ registration_dict['REGISTER_PROXY_NATIVES'] = proxy_natives_registration
+ registration_dict['REGISTER_MAIN_DEX_PROXY_NATIVES'] = main_dex_call
+
+ if options.manual_jni_registration:
+ registration_dict['MANUAL_REGISTRATION'] = manual_registration.substitute(
+ registration_dict)
+ else:
+ registration_dict['MANUAL_REGISTRATION'] = ''
+
+
+def CreateProxyJavaFromDict(options,
+ module_name,
+ registration_dict,
+ forwarding=False):
+ template = string.Template("""\
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package ${PACKAGE};
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_registration_generator.py
+// Please do not change its content.
+
+public class ${CLASS_NAME} {
+${FIELDS}
+${METHODS}
+}
+""")
+
+ is_natives_class = not forwarding and (options.use_proxy_hash
+ or options.enable_jni_multiplexing)
+ class_name = jni_generator.ProxyHelpers.GetClass(is_natives_class,
+ module_name)
+ package = jni_generator.ProxyHelpers.GetPackage(is_natives_class)
+
+ if forwarding or not (options.use_proxy_hash
+ or options.enable_jni_multiplexing):
+ fields = string.Template("""\
+ public static final boolean TESTING_ENABLED = ${TESTING_ENABLED};
+ public static final boolean REQUIRE_MOCK = ${REQUIRE_MOCK};
+""").substitute({
+ 'TESTING_ENABLED': str(options.enable_proxy_mocks).lower(),
+ 'REQUIRE_MOCK': str(options.require_mocks).lower(),
+ })
+ else:
+ fields = ''
+
+ if forwarding:
+ methods = registration_dict['FORWARDING_PROXY_METHODS']
+ else:
+ methods = registration_dict['PROXY_NATIVE_SIGNATURES']
+
+ return template.substitute({
+ 'CLASS_NAME': class_name,
+ 'FIELDS': fields,
+ 'PACKAGE': package.replace('/', '.'),
+ 'METHODS': methods
+ })
+
+
+def CreateFromDict(options, module_name, registration_dict):
+ """Returns the content of the header file."""
+
+ template = string.Template("""\
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+// This file is autogenerated by
+// base/android/jni_generator/jni_registration_generator.py
+// Please do not change its content.
+
+#ifndef ${HEADER_GUARD}
+#define ${HEADER_GUARD}
+
+#include <jni.h>
+
+#include <iterator>
+
+#include "base/android/jni_generator/jni_generator_helper.h"
+#include "base/android/jni_int_wrapper.h"
+
+
+// Step 1: Forward declarations (classes).
+${CLASS_PATH_DECLARATIONS}
+
+// Step 2: Forward declarations (methods).
+
+${FORWARD_DECLARATIONS}
+${FORWARDING_CALLS}
+${MANUAL_REGISTRATION}
+#endif // ${HEADER_GUARD}
+""")
+ _SetProxyRegistrationFields(options, module_name, registration_dict)
+ if not options.enable_jni_multiplexing:
+ registration_dict['FORWARDING_CALLS'] = ''
+ if len(registration_dict['FORWARD_DECLARATIONS']) == 0:
+ return ''
+
+ return template.substitute(registration_dict)
+
+
+def _GetJavaToNativeParamsList(params_list):
+ if not params_list:
+ return 'jlong switch_num'
+
+ # Parameters are named after their type, with a unique number per parameter
+ # type to make sure the names are unique, even within the same types.
+ params_type_count = collections.defaultdict(int)
+ params_in_stub = []
+ for p in params_list:
+ params_type_count[p] += 1
+ params_in_stub.append(
+ '%s %s_param%d' %
+ (jni_generator.JavaDataTypeToC(p), p.replace(
+ '[]', '_array').lower(), params_type_count[p]))
+
+ return 'jlong switch_num, ' + ', '.join(params_in_stub)
+
+
+class DictionaryGenerator(object):
+ """Generates an inline header file for JNI registration."""
+
+ def __init__(self, options, module_name, content_namespace,
+ fully_qualified_class, natives, jni_params, main_dex):
+ self.options = options
+ self.module_name = module_name
+ self.content_namespace = content_namespace
+ self.natives = natives
+ self.proxy_natives = [n for n in natives if n.is_proxy]
+ self.non_proxy_natives = [n for n in natives if not n.is_proxy]
+ self.fully_qualified_class = fully_qualified_class
+ self.jni_params = jni_params
+ self.class_name = self.fully_qualified_class.split('/')[-1]
+ self.main_dex = main_dex
+ self.helper = jni_generator.HeaderFileGeneratorHelper(
+ self.class_name,
+ self.module_name,
+ fully_qualified_class,
+ options.use_proxy_hash,
+ enable_jni_multiplexing=options.enable_jni_multiplexing)
+ self.registration_dict = None
+
+ def Generate(self):
+ self.registration_dict = {
+ 'FULL_CLASS_NAME': self.fully_qualified_class,
+ 'MODULE_NAME': self.module_name
+ }
+ self._AddClassPathDeclarations()
+ self._AddForwardDeclaration()
+ self._AddJNINativeMethodsArrays()
+ self._AddProxyNativeMethodKStrings()
+ self._AddRegisterNativesCalls()
+ self._AddRegisterNativesFunctions()
+
+ self.registration_dict['PROXY_NATIVE_SIGNATURES'] = (''.join(
+ _MakeProxySignature(self.options, native)
+ for native in self.proxy_natives))
+
+ if self.options.enable_jni_multiplexing:
+ self._AssignSwitchNumberToNatives()
+ self._AddCases()
+
+ if self.options.use_proxy_hash or self.options.enable_jni_multiplexing:
+ self.registration_dict['FORWARDING_PROXY_METHODS'] = ('\n'.join(
+ _MakeForwardingProxy(self.options, self.module_name, native)
+ for native in self.proxy_natives))
+
+ return self.registration_dict
+
+ def _SetDictValue(self, key, value):
+ self.registration_dict[key] = jni_generator.WrapOutput(value)
+
+ def _AddClassPathDeclarations(self):
+ classes = self.helper.GetUniqueClasses(self.natives)
+ self._SetDictValue(
+ 'CLASS_PATH_DECLARATIONS',
+ self.helper.GetClassPathLines(classes, declare_only=True))
+
+ def _AddForwardDeclaration(self):
+ """Add the content of the forward declaration to the dictionary."""
+ template = string.Template("""\
+JNI_GENERATOR_EXPORT ${RETURN} ${STUB_NAME}(
+ JNIEnv* env,
+ ${PARAMS_IN_STUB});
+""")
+ forward_declaration = ''
+ for native in self.natives:
+ value = {
+ 'RETURN': jni_generator.JavaDataTypeToC(native.return_type),
+ 'STUB_NAME': self.helper.GetStubName(native),
+ 'PARAMS_IN_STUB': jni_generator.GetParamsInStub(native),
+ }
+ forward_declaration += template.substitute(value)
+ self._SetDictValue('FORWARD_DECLARATIONS', forward_declaration)
+
+ def _AddRegisterNativesCalls(self):
+ """Add the body of the RegisterNativesImpl method to the dictionary."""
+
+ # Only register if there is at least 1 non-proxy native
+ if len(self.non_proxy_natives) == 0:
+ return ''
+
+ template = string.Template("""\
+ if (!${REGISTER_NAME}(env))
+ return false;
+""")
+ value = {
+ 'REGISTER_NAME':
+ jni_generator.GetRegistrationFunctionName(self.fully_qualified_class)
+ }
+ register_body = template.substitute(value)
+ if self.main_dex:
+ self._SetDictValue('REGISTER_MAIN_DEX_NATIVES', register_body)
+ else:
+ self._SetDictValue('REGISTER_NON_MAIN_DEX_NATIVES', register_body)
+
+ def _AddJNINativeMethodsArrays(self):
+ """Returns the implementation of the array of native methods."""
+ template = string.Template("""\
+static const JNINativeMethod kMethods_${JAVA_CLASS}[] = {
+${KMETHODS}
+};
+
+""")
+ open_namespace = ''
+ close_namespace = ''
+ if self.content_namespace:
+ parts = self.content_namespace.split('::')
+ all_namespaces = ['namespace %s {' % ns for ns in parts]
+ open_namespace = '\n'.join(all_namespaces) + '\n'
+ all_namespaces = ['} // namespace %s' % ns for ns in parts]
+ all_namespaces.reverse()
+ close_namespace = '\n'.join(all_namespaces) + '\n\n'
+
+ body = self._SubstituteNativeMethods(template)
+ if body:
+ self._SetDictValue('JNI_NATIVE_METHOD_ARRAY', ''.join(
+ (open_namespace, body, close_namespace)))
+
+ def _GetKMethodsString(self, clazz):
+ ret = []
+ for native in self.non_proxy_natives:
+ if (native.java_class_name == clazz
+ or (not native.java_class_name and clazz == self.class_name)):
+ ret += [self._GetKMethodArrayEntry(native)]
+ return '\n'.join(ret)
+
+ def _GetKMethodArrayEntry(self, native):
+ template = string.Template(' { "${NAME}", ${JNI_SIGNATURE}, ' +
+ 'reinterpret_cast<void*>(${STUB_NAME}) },')
+
+ name = 'native' + native.name
+ jni_signature = self.jni_params.Signature(native.params, native.return_type)
+ stub_name = self.helper.GetStubName(native)
+
+ if native.is_proxy:
+ # Literal name of the native method in the class that contains the actual
+ # native declaration.
+ if self.options.enable_jni_multiplexing:
+ return_type, params_list = native.return_and_signature
+ class_name = jni_generator.EscapeClassName(
+ jni_generator.ProxyHelpers.GetQualifiedClass(
+ True, self.module_name))
+ proxy_signature = jni_generator.EscapeClassName(
+ _GetMultiplexProxyName(return_type, params_list))
+
+ name = _GetMultiplexProxyName(return_type, params_list)
+ jni_signature = self.jni_params.Signature(
+ [jni_generator.Param(datatype='long', name='switch_num')] +
+ native.params, native.return_type)
+ stub_name = 'Java_' + class_name + '_' + proxy_signature
+ elif self.options.use_proxy_hash:
+ name = native.hashed_proxy_name
+ else:
+ name = native.proxy_name
+ values = {
+ 'NAME': name,
+ 'JNI_SIGNATURE': jni_signature,
+ 'STUB_NAME': stub_name
+ }
+ return template.substitute(values)
+
+ def _AddProxyNativeMethodKStrings(self):
+ """Returns KMethodString for wrapped native methods in all_classes """
+
+ if self.main_dex or self.options.enable_jni_multiplexing:
+ key = 'PROXY_NATIVE_METHOD_ARRAY_MAIN_DEX'
+ else:
+ key = 'PROXY_NATIVE_METHOD_ARRAY'
+
+ proxy_k_strings = ('\n'.join(
+ self._GetKMethodArrayEntry(p) for p in self.proxy_natives))
+
+ self._SetDictValue(key, proxy_k_strings)
+
+ def _SubstituteNativeMethods(self, template):
+ """Substitutes NAMESPACE, JAVA_CLASS and KMETHODS in the provided
+ template."""
+ ret = []
+ all_classes = self.helper.GetUniqueClasses(self.natives)
+ all_classes[self.class_name] = self.fully_qualified_class
+
+ for clazz, full_clazz in all_classes.items():
+ if clazz == jni_generator.ProxyHelpers.GetClass(
+ self.options.use_proxy_hash or self.options.enable_jni_multiplexing,
+ self.module_name):
+ continue
+
+ kmethods = self._GetKMethodsString(clazz)
+ namespace_str = ''
+ if self.content_namespace:
+ namespace_str = self.content_namespace + '::'
+ if kmethods:
+ values = {
+ 'NAMESPACE': namespace_str,
+ 'JAVA_CLASS': jni_generator.EscapeClassName(full_clazz),
+ 'KMETHODS': kmethods
+ }
+ ret += [template.substitute(values)]
+ if not ret: return ''
+ return '\n'.join(ret)
+
+ def GetJNINativeMethodsString(self):
+ """Returns the implementation of the array of native methods."""
+ template = string.Template("""\
+static const JNINativeMethod kMethods_${JAVA_CLASS}[] = {
+${KMETHODS}
+
+};
+""")
+ return self._SubstituteNativeMethods(template)
+
+ def _AddRegisterNativesFunctions(self):
+ """Returns the code for RegisterNatives."""
+ natives = self._GetRegisterNativesImplString()
+ if not natives:
+ return ''
+ template = string.Template("""\
+JNI_REGISTRATION_EXPORT bool ${REGISTER_NAME}(JNIEnv* env) {
+${NATIVES}\
+ return true;
+}
+
+""")
+ values = {
+ 'REGISTER_NAME':
+ jni_generator.GetRegistrationFunctionName(self.fully_qualified_class),
+ 'NATIVES':
+ natives
+ }
+ self._SetDictValue('JNI_NATIVE_METHOD', template.substitute(values))
+
+ def _GetRegisterNativesImplString(self):
+ """Returns the shared implementation for RegisterNatives."""
+ template = string.Template("""\
+ const int kMethods_${JAVA_CLASS}Size =
+ std::size(${NAMESPACE}kMethods_${JAVA_CLASS});
+ if (env->RegisterNatives(
+ ${JAVA_CLASS}_clazz(env),
+ ${NAMESPACE}kMethods_${JAVA_CLASS},
+ kMethods_${JAVA_CLASS}Size) < 0) {
+ jni_generator::HandleRegistrationError(env,
+ ${JAVA_CLASS}_clazz(env),
+ __FILE__);
+ return false;
+ }
+
+""")
+ # Only register if there is a native method not in a proxy,
+ # since all the proxies will be registered together.
+ if len(self.non_proxy_natives) != 0:
+ return self._SubstituteNativeMethods(template)
+ return ''
+
+ def _AssignSwitchNumberToNatives(self):
+ # The switch number for a native method is a 64-bit long with the first
+ # bit being a sign digit. The signed two's complement is taken when
+ # appropriate to make use of negative numbers.
+ for native in self.proxy_natives:
+ hashed_long = hashlib.md5(
+ native.proxy_name.encode('utf-8')).hexdigest()[:16]
+ switch_num = int(hashed_long, 16)
+ if (switch_num & 1 << 63):
+ switch_num -= (1 << 64)
+
+ native.switch_num = str(switch_num)
+
+ def _AddCases(self):
+ # Switch cases are grouped together by the same proxy signatures.
+ template = string.Template("""
+ case ${SWITCH_NUM}:
+ return ${STUB_NAME}(env, jcaller${PARAMS});
+ """)
+
+ signature_to_cases = collections.defaultdict(list)
+ for native in self.proxy_natives:
+ signature = native.return_and_signature
+ params = _GetParamsListForMultiplex(signature[1], with_types=False)
+ values = {
+ 'SWITCH_NUM': native.switch_num,
+ # We are forced to call the generated stub instead of the impl because
+ # the impl is not guaranteed to have a globally unique name.
+ 'STUB_NAME': self.helper.GetStubName(native),
+ 'PARAMS': params,
+ }
+ signature_to_cases[signature].append(template.substitute(values))
+
+ self.registration_dict['SIGNATURE_TO_CASES'] = signature_to_cases
+
+
+def _GetParamsListForMultiplex(params_list, with_types):
+ if not params_list:
+ return ''
+
+ # Parameters are named after their type, with a unique number per parameter
+ # type to make sure the names are unique, even within the same types.
+ params_type_count = collections.defaultdict(int)
+ params = []
+ for p in params_list:
+ params_type_count[p] += 1
+ param_type = p + ' ' if with_types else ''
+ params.append(
+ '%s%s_param%d' %
+ (param_type, p.replace('[]', '_array').lower(), params_type_count[p]))
+
+ return ', ' + ', '.join(params)
+
+
+def _GetMultiplexProxyName(return_type, params_list):
+ # Proxy signatures for methods are named after their return type and
+ # parameters to ensure uniqueness, even for the same return types.
+ params = ''
+ if params_list:
+ type_convert_dictionary = {
+ '[]': 'A',
+ 'byte': 'B',
+ 'char': 'C',
+ 'double': 'D',
+ 'float': 'F',
+ 'int': 'I',
+ 'long': 'J',
+ 'Class': 'L',
+ 'Object': 'O',
+ 'String': 'R',
+ 'short': 'S',
+ 'Throwable': 'T',
+ 'boolean': 'Z',
+ }
+ # Parameter types could contain multi-dimensional arrays and every
+ # instance of [] has to be replaced in the proxy signature name.
+ for k, v in type_convert_dictionary.items():
+ params_list = [p.replace(k, v) for p in params_list]
+ params = '_' + ''.join(p for p in params_list)
+
+ return 'resolve_for_' + return_type.replace('[]', '_array').lower() + params
+
+
+def _MakeForwardingProxy(options, module_name, proxy_native):
+ template = string.Template("""
+ public static ${RETURN_TYPE} ${METHOD_NAME}(${PARAMS_WITH_TYPES}) {
+ ${MAYBE_RETURN}${PROXY_CLASS}.${PROXY_METHOD_NAME}(${PARAM_NAMES});
+ }""")
+
+ params_with_types = ', '.join(
+ '%s %s' % (p.datatype, p.name) for p in proxy_native.params)
+ param_names = ', '.join(p.name for p in proxy_native.params)
+ proxy_class = jni_generator.ProxyHelpers.GetQualifiedClass(True, module_name)
+
+ if options.enable_jni_multiplexing:
+ if not param_names:
+ param_names = proxy_native.switch_num + 'L'
+ else:
+ param_names = proxy_native.switch_num + 'L, ' + param_names
+ return_type, params_list = proxy_native.return_and_signature
+ proxy_method_name = _GetMultiplexProxyName(return_type, params_list)
+ else:
+ proxy_method_name = proxy_native.hashed_proxy_name
+
+ return template.substitute({
+ 'RETURN_TYPE':
+ proxy_native.return_type,
+ 'METHOD_NAME':
+ proxy_native.proxy_name,
+ 'PARAMS_WITH_TYPES':
+ params_with_types,
+ 'MAYBE_RETURN':
+ '' if proxy_native.return_type == 'void' else 'return ',
+ 'PROXY_CLASS':
+ proxy_class.replace('/', '.'),
+ 'PROXY_METHOD_NAME':
+ proxy_method_name,
+ 'PARAM_NAMES':
+ param_names,
+ })
+
+
+def _MakeProxySignature(options, proxy_native):
+ params_with_types = ', '.join('%s %s' % (p.datatype, p.name)
+ for p in proxy_native.params)
+ native_method_line = """
+ public static native ${RETURN} ${PROXY_NAME}(${PARAMS_WITH_TYPES});"""
+
+ if options.enable_jni_multiplexing:
+ # This has to be only one line and without comments because all the proxy
+ # signatures will be joined, then split on new lines with duplicates removed
+ # since multiple |proxy_native|s map to the same multiplexed signature.
+ signature_template = string.Template(native_method_line)
+
+ alt_name = None
+ return_type, params_list = proxy_native.return_and_signature
+ proxy_name = _GetMultiplexProxyName(return_type, params_list)
+ params_with_types = 'long switch_num' + _GetParamsListForMultiplex(
+ params_list, with_types=True)
+ elif options.use_proxy_hash:
+ signature_template = string.Template("""
+ // Original name: ${ALT_NAME}""" + native_method_line)
+
+ alt_name = proxy_native.proxy_name
+ proxy_name = proxy_native.hashed_proxy_name
+ else:
+ signature_template = string.Template("""
+ // Hashed name: ${ALT_NAME}""" + native_method_line)
+
+ # We add the prefix that is sometimes used so that codesearch can find it if
+ # someone searches a full method name from the stacktrace.
+ alt_name = f'Java_J_N_{proxy_native.hashed_proxy_name}'
+ proxy_name = proxy_native.proxy_name
+
+ return signature_template.substitute({
+ 'ALT_NAME': alt_name,
+ 'RETURN': proxy_native.return_type,
+ 'PROXY_NAME': proxy_name,
+ 'PARAMS_WITH_TYPES': params_with_types,
+ })
+
+
+def main(argv):
+ arg_parser = argparse.ArgumentParser()
+ build_utils.AddDepfileOption(arg_parser)
+
+ arg_parser.add_argument(
+ '--sources-files',
+ required=True,
+ action='append',
+ help='A list of .sources files which contain Java '
+ 'file paths.')
+ arg_parser.add_argument(
+ '--header-path', help='Path to output header file (optional).')
+ arg_parser.add_argument(
+ '--srcjar-path',
+ required=True,
+ help='Path to output srcjar for GEN_JNI.java (and J/N.java if proxy'
+ ' hash is enabled).')
+ arg_parser.add_argument('--file-exclusions',
+ default=[],
+ help='A list of Java files which should be ignored '
+ 'by the parser.')
+ arg_parser.add_argument(
+ '--namespace',
+ default='',
+ help='Native namespace to wrap the registration functions '
+ 'into.')
+ # TODO(crbug.com/898261) hook these flags up to the build config to enable
+ # mocking in instrumentation tests
+ arg_parser.add_argument(
+ '--enable-proxy-mocks',
+ default=False,
+ action='store_true',
+ help='Allows proxy native impls to be mocked through Java.')
+ arg_parser.add_argument(
+ '--require-mocks',
+ default=False,
+ action='store_true',
+ help='Requires all used native implementations to have a mock set when '
+ 'called. Otherwise an exception will be thrown.')
+ arg_parser.add_argument(
+ '--use-proxy-hash',
+ action='store_true',
+ help='Enables hashing of the native declaration for methods in '
+ 'an @JniNatives interface')
+ arg_parser.add_argument(
+ '--enable-jni-multiplexing',
+ action='store_true',
+ help='Enables JNI multiplexing for Java native methods')
+ arg_parser.add_argument(
+ '--manual-jni-registration',
+ action='store_true',
+ help='Manually do JNI registration - required for crazy linker')
+ arg_parser.add_argument('--include-test-only',
+ action='store_true',
+ help='Whether to maintain ForTesting JNI methods.')
+ args = arg_parser.parse_args(build_utils.ExpandFileArgs(argv[1:]))
+
+ if not args.enable_proxy_mocks and args.require_mocks:
+ arg_parser.error(
+ 'Invalid arguments: --require-mocks without --enable-proxy-mocks. '
+ 'Cannot require mocks if they are not enabled.')
+ if not args.header_path and args.manual_jni_registration:
+ arg_parser.error(
+ 'Invalid arguments: --manual-jni-registration without --header-path. '
+ 'Cannot manually register JNI if there is no output header file.')
+
+ sources_files = sorted(set(build_utils.ParseGnList(args.sources_files)))
+
+ java_file_paths = []
+ for f in sources_files:
+ # Skip generated files, since the GN targets do not declare any deps. Also
+ # skip Kotlin files as they are not supported by JNI generation.
+ java_file_paths.extend(
+ p for p in build_utils.ReadSourcesList(f) if p.startswith('..')
+ and p not in args.file_exclusions and not p.endswith('.kt'))
+ _Generate(args, java_file_paths)
+
+ if args.depfile:
+ build_utils.WriteDepfile(args.depfile, args.srcjar_path,
+ sources_files + java_file_paths)
+
+
+if __name__ == '__main__':
+ sys.exit(main(sys.argv))
diff --git a/chromium/base/android/jni_generator/sample_entry_point.cc b/chromium/base/android/jni_generator/sample_entry_point.cc
new file mode 100644
index 00000000000..5a7eb48b711
--- /dev/null
+++ b/chromium/base/android/jni_generator/sample_entry_point.cc
@@ -0,0 +1,27 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/jni_android.h"
+#include "base/android/jni_generator/jni_registration_generated.h"
+#include "base/android/jni_utils.h"
+
+// This is called by the VM when the shared library is first loaded.
+JNI_EXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) {
+ // By default, all JNI methods are registered. However, since render processes
+ // don't need very much Java code, we enable selective JNI registration on the
+ // Java side and only register a subset of JNI methods.
+ base::android::InitVM(vm);
+ JNIEnv* env = base::android::AttachCurrentThread();
+
+ if (!base::android::IsSelectiveJniRegistrationEnabled(env)) {
+ if (!RegisterNonMainDexNatives(env)) {
+ return -1;
+ }
+ }
+
+ if (!RegisterMainDexNatives(env)) {
+ return -1;
+ }
+ return JNI_VERSION_1_4;
+}
diff --git a/chromium/base/android/jni_generator/sample_for_tests.cc b/chromium/base/android/jni_generator/sample_for_tests.cc
new file mode 100644
index 00000000000..e9df0690774
--- /dev/null
+++ b/chromium/base/android/jni_generator/sample_for_tests.cc
@@ -0,0 +1,281 @@
+// Copyright 2012 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <iostream>
+
+#include "base/android/jni_generator/sample_for_tests.h"
+
+#include "base/android/jni_android.h"
+#include "base/android/jni_string.h"
+#include "base/android/scoped_java_ref.h"
+// Generated file for JNI bindings from C++ to Java @CalledByNative methods.
+// Only to be included in one .cc file.
+// Name is based on the java file name: *.java -> jni/*_jni.h
+#include "base/android/jni_generator/jni_sample_header/SampleForAnnotationProcessor_jni.h" // Generated by JNI.
+#include "base/android/jni_generator/jni_sample_header/SampleForTests_jni.h" // Generated by JNI.
+
+using base::android::AttachCurrentThread;
+using base::android::ConvertJavaStringToUTF8;
+using base::android::ConvertUTF8ToJavaString;
+using base::android::ScopedJavaLocalRef;
+
+namespace base {
+namespace android {
+
+jdouble CPPClass::InnerClass::MethodOtherP0(
+ JNIEnv* env,
+ const JavaParamRef<jobject>& caller) {
+ return 0.0;
+}
+
+CPPClass::CPPClass() {
+}
+
+CPPClass::~CPPClass() {
+}
+
+// static
+void CPPClass::Destroy(JNIEnv* env, const JavaParamRef<jobject>& caller) {
+ delete this;
+}
+
+jint CPPClass::Method(JNIEnv* env, const JavaParamRef<jobject>& caller) {
+ return 0;
+}
+
+void CPPClass::AddStructB(JNIEnv* env,
+ const JavaParamRef<jobject>& caller,
+ const JavaParamRef<jobject>& structb) {
+ long key = Java_InnerStructB_getKey(env, structb);
+ std::string value =
+ ConvertJavaStringToUTF8(env, Java_InnerStructB_getValue(env, structb));
+ map_[key] = value;
+}
+
+void CPPClass::IterateAndDoSomethingWithStructB(
+ JNIEnv* env,
+ const JavaParamRef<jobject>& caller) {
+ // Iterate over the elements and do something with them.
+ for (std::map<long, std::string>::const_iterator it = map_.begin();
+ it != map_.end(); ++it) {
+ long key = it->first;
+ std::string value = it->second;
+ std::cout << key << value;
+ }
+ map_.clear();
+}
+
+ScopedJavaLocalRef<jstring> CPPClass::ReturnAString(
+ JNIEnv* env,
+ const JavaParamRef<jobject>& caller) {
+ return ConvertUTF8ToJavaString(env, "test");
+}
+
+// Static free functions declared and called directly from java.
+static jlong JNI_SampleForTests_Init(JNIEnv* env,
+ const JavaParamRef<jobject>& caller,
+ const JavaParamRef<jstring>& param) {
+ return 0;
+}
+
+static jdouble JNI_SampleForTests_GetDoubleFunction(
+ JNIEnv*,
+ const JavaParamRef<jobject>&) {
+ return 0;
+}
+
+static jfloat JNI_SampleForTests_GetFloatFunction(JNIEnv*) {
+ return 0;
+}
+
+static void JNI_SampleForTests_SetNonPODDatatype(JNIEnv*,
+ const JavaParamRef<jobject>&,
+ const JavaParamRef<jobject>&) {
+}
+
+static ScopedJavaLocalRef<jobject> JNI_SampleForTests_GetNonPODDatatype(
+ JNIEnv*,
+ const JavaParamRef<jobject>&) {
+ return ScopedJavaLocalRef<jobject>();
+}
+
+static ScopedJavaLocalRef<jstring> JNI_SampleForTests_GetNonPODDatatype(
+ JNIEnv*,
+ const JavaParamRef<jstring>&) {
+ return ScopedJavaLocalRef<jstring>();
+}
+
+static ScopedJavaLocalRef<jobjectArray> JNI_SampleForTests_GetNonPODDatatype(
+ JNIEnv*,
+ const JavaParamRef<jobjectArray>&) {
+ return ScopedJavaLocalRef<jobjectArray>();
+}
+
+} // namespace android
+} // namespace base
+
+// Proxy natives.
+static void JNI_SampleForAnnotationProcessor_Foo(JNIEnv* env) {}
+
+static base::android::ScopedJavaLocalRef<jobject>
+JNI_SampleForAnnotationProcessor_Bar(
+ JNIEnv* env,
+ const base::android::JavaParamRef<jobject>& sample) {
+ return JNI_SampleForTests_GetNonPODDatatype(env, sample);
+}
+
+static base::android::ScopedJavaLocalRef<jstring>
+JNI_SampleForAnnotationProcessor_RevString(
+ JNIEnv* env,
+ const base::android::JavaParamRef<jstring>& stringToReverse) {
+ return JNI_SampleForTests_GetNonPODDatatype(env, stringToReverse);
+}
+
+static base::android::ScopedJavaLocalRef<jobjectArray>
+JNI_SampleForAnnotationProcessor_SendToNative(
+ JNIEnv* env,
+ const base::android::JavaParamRef<jobjectArray>& strs) {
+ return JNI_SampleForTests_GetNonPODDatatype(env, strs);
+}
+
+static base::android::ScopedJavaLocalRef<jobjectArray>
+JNI_SampleForAnnotationProcessor_SendSamplesToNative(
+ JNIEnv* env,
+ const base::android::JavaParamRef<jobjectArray>& strs) {
+ return JNI_SampleForTests_GetNonPODDatatype(env, strs);
+}
+
+static jboolean JNI_SampleForAnnotationProcessor_HasPhalange(JNIEnv* env) {
+ return jboolean(true);
+}
+
+static base::android::ScopedJavaLocalRef<jintArray>
+JNI_SampleForAnnotationProcessor_TestAllPrimitives(
+ JNIEnv* env,
+ jint zint,
+ const base::android::JavaParamRef<jintArray>& ints,
+ jlong zlong,
+ const base::android::JavaParamRef<jlongArray>& longs,
+ jshort zshort,
+ const base::android::JavaParamRef<jshortArray>& shorts,
+ jchar zchar,
+ const base::android::JavaParamRef<jcharArray>& chars,
+ jbyte zbyte,
+ const base::android::JavaParamRef<jbyteArray>& bytes,
+ jdouble zdouble,
+ const base::android::JavaParamRef<jdoubleArray>& doubles,
+ jfloat zfloat,
+ const base::android::JavaParamRef<jfloatArray>& floats,
+ jboolean zbool,
+ const base::android::JavaParamRef<jbooleanArray>& bools) {
+ return ScopedJavaLocalRef<jintArray>(ints);
+}
+
+static void JNI_SampleForAnnotationProcessor_TestSpecialTypes(
+ JNIEnv* env,
+ const base::android::JavaParamRef<jclass>& clazz,
+ const base::android::JavaParamRef<jobjectArray>& classes,
+ const base::android::JavaParamRef<jthrowable>& throwable,
+ const base::android::JavaParamRef<jobjectArray>& throwables,
+ const base::android::JavaParamRef<jstring>& string,
+ const base::android::JavaParamRef<jobjectArray>& strings,
+ const base::android::JavaParamRef<jobject>& tStruct,
+ const base::android::JavaParamRef<jobjectArray>& structs,
+ const base::android::JavaParamRef<jobject>& obj,
+ const base::android::JavaParamRef<jobjectArray>& objects) {}
+
+static base::android::ScopedJavaLocalRef<jthrowable>
+JNI_SampleForAnnotationProcessor_ReturnThrowable(JNIEnv* env) {
+ return ScopedJavaLocalRef<jthrowable>();
+}
+
+static base::android::ScopedJavaLocalRef<jobjectArray>
+JNI_SampleForAnnotationProcessor_ReturnThrowables(JNIEnv* env) {
+ return ScopedJavaLocalRef<jobjectArray>();
+}
+
+static base::android::ScopedJavaLocalRef<jclass>
+JNI_SampleForAnnotationProcessor_ReturnClass(JNIEnv* env) {
+ return ScopedJavaLocalRef<jclass>();
+}
+
+static base::android::ScopedJavaLocalRef<jobjectArray>
+JNI_SampleForAnnotationProcessor_ReturnClasses(JNIEnv* env) {
+ return ScopedJavaLocalRef<jobjectArray>();
+}
+
+static base::android::ScopedJavaLocalRef<jstring>
+JNI_SampleForAnnotationProcessor_ReturnString(JNIEnv* env) {
+ return ScopedJavaLocalRef<jstring>();
+}
+
+static base::android::ScopedJavaLocalRef<jobjectArray>
+JNI_SampleForAnnotationProcessor_ReturnStrings(JNIEnv* env) {
+ return ScopedJavaLocalRef<jobjectArray>();
+}
+
+static base::android::ScopedJavaLocalRef<jobject>
+JNI_SampleForAnnotationProcessor_ReturnStruct(JNIEnv* env) {
+ return ScopedJavaLocalRef<jobject>();
+}
+
+static base::android::ScopedJavaLocalRef<jobjectArray>
+JNI_SampleForAnnotationProcessor_ReturnStructs(JNIEnv* env) {
+ return ScopedJavaLocalRef<jobjectArray>();
+}
+
+static base::android::ScopedJavaLocalRef<jobject>
+JNI_SampleForAnnotationProcessor_ReturnObject(JNIEnv* env) {
+ return ScopedJavaLocalRef<jobject>();
+}
+
+static base::android::ScopedJavaLocalRef<jobjectArray>
+JNI_SampleForAnnotationProcessor_ReturnObjects(JNIEnv* env) {
+ return ScopedJavaLocalRef<jobjectArray>();
+}
+
+int main() {
+ // On a regular application, you'd call AttachCurrentThread(). This sample is
+ // not yet linking with all the libraries.
+ JNIEnv* env = /* AttachCurrentThread() */ NULL;
+
+ // This is how you call a java static method from C++.
+ bool foo = base::android::Java_SampleForTests_staticJavaMethod(env);
+
+ // This is how you call a java method from C++. Note that you must have
+ // obtained the jobject somehow.
+ ScopedJavaLocalRef<jobject> my_java_object;
+ int bar = base::android::Java_SampleForTests_javaMethod(
+ env, my_java_object, 1, 2);
+
+ base::android::Java_SampleForTests_methodWithGenericParams(
+ env, my_java_object, nullptr, nullptr);
+
+ // This is how you call a java constructor method from C++.
+ ScopedJavaLocalRef<jobject> my_created_object =
+ base::android::Java_SampleForTests_Constructor(env, 1, 2);
+
+ std::cout << foo << bar;
+
+ for (int i = 0; i < 10; ++i) {
+ // Creates a "struct" that will then be used by the java side.
+ ScopedJavaLocalRef<jobject> struct_a =
+ base::android::Java_InnerStructA_create(
+ env, 0, 1, ConvertUTF8ToJavaString(env, "test"));
+ base::android::Java_SampleForTests_addStructA(env, my_java_object,
+ struct_a);
+ }
+ base::android::Java_SampleForTests_iterateAndDoSomething(env, my_java_object);
+ base::android::Java_SampleForTests_packagePrivateJavaMethod(env,
+ my_java_object);
+ base::android::Java_SampleForTests_methodThatThrowsException(env,
+ my_java_object);
+ base::android::Java_SampleForTests_javaMethodWithAnnotatedParam(
+ env, my_java_object, 42, 13, -1, 99);
+
+ base::android::Java_SampleForTests_getInnerInterface(env);
+ base::android::Java_SampleForTests_getInnerEnum(env);
+
+ return 0;
+}
diff --git a/chromium/base/android/jni_generator/sample_for_tests.h b/chromium/base/android/jni_generator/sample_for_tests.h
new file mode 100644
index 00000000000..b32bd5ef30c
--- /dev/null
+++ b/chromium/base/android/jni_generator/sample_for_tests.h
@@ -0,0 +1,115 @@
+// Copyright 2013 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_JNI_GENERATOR_SAMPLE_FOR_TESTS_H_
+#define BASE_ANDROID_JNI_GENERATOR_SAMPLE_FOR_TESTS_H_
+
+#include <jni.h>
+#include <map>
+#include <string>
+
+#include "base/android/jni_android.h"
+
+namespace base {
+namespace android {
+
+// This file is used to:
+// - document the best practices and guidelines on JNI usage.
+// - ensure sample_for_tests_jni.h compiles and the functions declared in it
+// as expected.
+//
+// Methods are called directly from Java. More documentation in
+// SampleForTests.java. See BUILD.gn for the build rules necessary for JNI
+// to be used in an APK.
+//
+// For C++ to access Java methods:
+// - GN Build must be configured to generate bindings:
+// # Add import at top of file:
+// if (is_android) {
+// import("//build/config/android/rules.gni") # For generate_jni().
+// }
+// # ...
+// # An example target that will rely on JNI:
+// component("foo") {
+// # ... normal sources, defines, deps.
+// # For each jni generated .java -> .h header file in jni_headers
+// # target there will be a single .cc file here that includes it.
+// #
+// # Add a dep for JNI:
+// if (is_android) {
+// deps += [ ":foo_jni" ]
+// }
+// }
+// # ...
+// # Create target for JNI:
+// if (is_android) {
+// generate_jni("jni_headers") {
+// sources = [
+// "java/src/org/chromium/example/jni_generator/SampleForTests.java",
+// ]
+// }
+// android_library("java") {
+// sources = [
+// "java/src/org/chromium/example/jni_generator/SampleForTests.java",
+// "java/src/org/chromium/example/jni_generator/NonJniFile.java",
+// ]
+// }
+// }
+// The build rules above are generally that that's needed when adding new
+// JNI methods/files. For a full GN example, see
+// base/android/jni_generator/BUILD.gn
+//
+// For C++ methods to be exposed to Java:
+// - The Java class must be part of an android_apk target that depends on
+// a generate_jni_registration target. This generate_jni_registration target
+// automatically generates all necessary registration functions. The
+// generated header file exposes two functions that should be called when a
+// library is first loaded:
+// 1) RegisterMainDexNatives()
+// - Registers all methods that are used outside the browser process
+// 2) RegisterNonMainDexNatives()
+// - Registers all methods used in the browser process
+//
+class CPPClass {
+ public:
+ CPPClass();
+
+ CPPClass(const CPPClass&) = delete;
+ CPPClass& operator=(const CPPClass&) = delete;
+
+ ~CPPClass();
+
+ // Java @CalledByNative methods implicitly available to C++ via the _jni.h
+ // file included in the .cc file.
+
+ class InnerClass {
+ public:
+ jdouble MethodOtherP0(JNIEnv* env,
+ const base::android::JavaParamRef<jobject>& caller);
+ };
+
+ void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& caller);
+
+ jint Method(JNIEnv* env, const base::android::JavaParamRef<jobject>& caller);
+
+ void AddStructB(JNIEnv* env,
+ const base::android::JavaParamRef<jobject>& caller,
+ const base::android::JavaParamRef<jobject>& structb);
+
+ void IterateAndDoSomethingWithStructB(
+ JNIEnv* env,
+ const base::android::JavaParamRef<jobject>& caller);
+
+ base::android::ScopedJavaLocalRef<jstring> ReturnAString(
+ JNIEnv* env,
+ const base::android::JavaParamRef<jobject>& caller);
+
+ private:
+ std::map<long, std::string> map_;
+};
+
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_JNI_GENERATOR_SAMPLE_FOR_TESTS_H_
diff --git a/chromium/base/android/jni_int_wrapper.h b/chromium/base/android/jni_int_wrapper.h
new file mode 100644
index 00000000000..5c0dcf4e23a
--- /dev/null
+++ b/chromium/base/android/jni_int_wrapper.h
@@ -0,0 +1,56 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_JNI_INT_WRAPPER_H_
+#define BASE_ANDROID_JNI_INT_WRAPPER_H_
+
+// Wrapper used to receive int when calling Java from native.
+// The wrapper disallows automatic conversion of long to int.
+// This is to avoid a common anti-pattern where a Java int is used
+// to receive a native pointer. Please use a Java long to receive
+// native pointers, so that the code works on both 32-bit and 64-bit
+// platforms. Note the wrapper allows other lossy conversions into
+// jint that could be consider anti-patterns, such as from size_t.
+
+// Checking is only done in debugging builds.
+
+#ifdef NDEBUG
+
+typedef jint JniIntWrapper;
+
+// This inline is sufficiently trivial that it does not change the
+// final code generated by g++.
+inline jint as_jint(JniIntWrapper wrapper) {
+ return wrapper;
+}
+
+#else
+
+class JniIntWrapper {
+ public:
+ JniIntWrapper() : i_(0) {}
+ JniIntWrapper(int i) : i_(i) {}
+ JniIntWrapper(const JniIntWrapper& ji) : i_(ji.i_) {}
+ template <class T> JniIntWrapper(const T& t) : i_(t) {}
+ jint as_jint() const { return i_; }
+ private:
+ // If you get an "is private" error at the line below it is because you used
+ // an implicit conversion to convert a long to an int when calling Java.
+ // We disallow this, as a common anti-pattern allows converting a native
+ // pointer (intptr_t) to a Java int. Please use a Java long to represent
+ // a native pointer. If you want a lossy conversion, please use an
+ // explicit conversion in your C++ code. Note an error is only seen when
+ // compiling on a 64-bit platform, as intptr_t is indistinguishable from
+ // int on 32-bit platforms.
+ JniIntWrapper(long);
+ jint i_;
+};
+
+inline jint as_jint(const JniIntWrapper& wrapper) {
+ return wrapper.as_jint();
+}
+
+#endif // NDEBUG
+
+#endif // BASE_ANDROID_JNI_INT_WRAPPER_H_
diff --git a/chromium/base/android/jni_registrar.cc b/chromium/base/android/jni_registrar.cc
new file mode 100644
index 00000000000..3615d4a47ff
--- /dev/null
+++ b/chromium/base/android/jni_registrar.cc
@@ -0,0 +1,30 @@
+// Copyright 2012 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/jni_registrar.h"
+
+#include "base/android/jni_android.h"
+#include "base/logging.h"
+#include "base/trace_event/base_tracing.h"
+
+namespace base {
+namespace android {
+
+bool RegisterNativeMethods(JNIEnv* env,
+ const RegistrationMethod* method,
+ size_t count) {
+ TRACE_EVENT0("startup", "base_android::RegisterNativeMethods");
+ const RegistrationMethod* end = method + count;
+ while (method != end) {
+ if (!method->func(env)) {
+ DLOG(ERROR) << method->name << " failed registration!";
+ return false;
+ }
+ method++;
+ }
+ return true;
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/jni_registrar.h b/chromium/base/android/jni_registrar.h
new file mode 100644
index 00000000000..a59311f4ce6
--- /dev/null
+++ b/chromium/base/android/jni_registrar.h
@@ -0,0 +1,28 @@
+// Copyright 2012 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_JNI_REGISTRAR_H_
+#define BASE_ANDROID_JNI_REGISTRAR_H_
+
+#include <jni.h>
+#include <stddef.h>
+
+#include "base/base_export.h"
+
+namespace base {
+namespace android {
+
+struct RegistrationMethod;
+
+// Registers the JNI bindings for the specified |method| definition containing
+// |count| elements. Returns whether the registration of the given methods
+// succeeded.
+BASE_EXPORT bool RegisterNativeMethods(JNIEnv* env,
+ const RegistrationMethod* method,
+ size_t count);
+
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_JNI_REGISTRAR_H_
diff --git a/chromium/base/android/jni_string.cc b/chromium/base/android/jni_string.cc
new file mode 100644
index 00000000000..9720e2ca73c
--- /dev/null
+++ b/chromium/base/android/jni_string.cc
@@ -0,0 +1,126 @@
+// Copyright 2012 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/jni_string.h"
+
+#include "base/android/jni_android.h"
+#include "base/logging.h"
+#include "base/numerics/safe_conversions.h"
+#include "base/strings/utf_string_conversions.h"
+
+namespace {
+
+// Internal version that does not use a scoped local pointer.
+jstring ConvertUTF16ToJavaStringImpl(JNIEnv* env,
+ const base::StringPiece16& str) {
+ jstring result = env->NewString(reinterpret_cast<const jchar*>(str.data()),
+ base::checked_cast<jsize>(str.length()));
+ base::android::CheckException(env);
+ return result;
+}
+
+} // namespace
+
+namespace base {
+namespace android {
+
+void ConvertJavaStringToUTF8(JNIEnv* env, jstring str, std::string* result) {
+ DCHECK(str);
+ if (!str) {
+ LOG(WARNING) << "ConvertJavaStringToUTF8 called with null string.";
+ result->clear();
+ return;
+ }
+ const jsize length = env->GetStringLength(str);
+ if (length <= 0) {
+ result->clear();
+ CheckException(env);
+ return;
+ }
+ // JNI's GetStringUTFChars() returns strings in Java "modified" UTF8, so
+ // instead get the String in UTF16 and convert using chromium's conversion
+ // function that yields plain (non Java-modified) UTF8.
+ const jchar* chars = env->GetStringChars(str, NULL);
+ DCHECK(chars);
+ UTF16ToUTF8(reinterpret_cast<const char16_t*>(chars),
+ static_cast<size_t>(length), result);
+ env->ReleaseStringChars(str, chars);
+ CheckException(env);
+}
+
+std::string ConvertJavaStringToUTF8(JNIEnv* env, jstring str) {
+ std::string result;
+ ConvertJavaStringToUTF8(env, str, &result);
+ return result;
+}
+
+std::string ConvertJavaStringToUTF8(const JavaRef<jstring>& str) {
+ return ConvertJavaStringToUTF8(AttachCurrentThread(), str.obj());
+}
+
+std::string ConvertJavaStringToUTF8(JNIEnv* env, const JavaRef<jstring>& str) {
+ return ConvertJavaStringToUTF8(env, str.obj());
+}
+
+ScopedJavaLocalRef<jstring> ConvertUTF8ToJavaString(JNIEnv* env,
+ const StringPiece& str) {
+ // JNI's NewStringUTF expects "modified" UTF8 so instead create the string
+ // via our own UTF16 conversion utility.
+ // Further, Dalvik requires the string passed into NewStringUTF() to come from
+ // a trusted source. We can't guarantee that all UTF8 will be sanitized before
+ // it gets here, so constructing via UTF16 side-steps this issue.
+ // (Dalvik stores strings internally as UTF16 anyway, so there shouldn't be
+ // a significant performance hit by doing it this way).
+ return ScopedJavaLocalRef<jstring>(env, ConvertUTF16ToJavaStringImpl(
+ env, UTF8ToUTF16(str)));
+}
+
+void ConvertJavaStringToUTF16(JNIEnv* env,
+ jstring str,
+ std::u16string* result) {
+ DCHECK(str);
+ if (!str) {
+ LOG(WARNING) << "ConvertJavaStringToUTF16 called with null string.";
+ result->clear();
+ return;
+ }
+ const jsize length = env->GetStringLength(str);
+ if (length <= 0) {
+ result->clear();
+ CheckException(env);
+ return;
+ }
+ const jchar* chars = env->GetStringChars(str, NULL);
+ DCHECK(chars);
+ // GetStringChars isn't required to NULL-terminate the strings
+ // it returns, so the length must be explicitly checked.
+ result->assign(reinterpret_cast<const char16_t*>(chars),
+ static_cast<size_t>(length));
+ env->ReleaseStringChars(str, chars);
+ CheckException(env);
+}
+
+std::u16string ConvertJavaStringToUTF16(JNIEnv* env, jstring str) {
+ std::u16string result;
+ ConvertJavaStringToUTF16(env, str, &result);
+ return result;
+}
+
+std::u16string ConvertJavaStringToUTF16(const JavaRef<jstring>& str) {
+ return ConvertJavaStringToUTF16(AttachCurrentThread(), str.obj());
+}
+
+std::u16string ConvertJavaStringToUTF16(JNIEnv* env,
+ const JavaRef<jstring>& str) {
+ return ConvertJavaStringToUTF16(env, str.obj());
+}
+
+ScopedJavaLocalRef<jstring> ConvertUTF16ToJavaString(JNIEnv* env,
+ const StringPiece16& str) {
+ return ScopedJavaLocalRef<jstring>(env,
+ ConvertUTF16ToJavaStringImpl(env, str));
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/jni_string.h b/chromium/base/android/jni_string.h
new file mode 100644
index 00000000000..e4b900e072a
--- /dev/null
+++ b/chromium/base/android/jni_string.h
@@ -0,0 +1,51 @@
+// Copyright 2012 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_JNI_STRING_H_
+#define BASE_ANDROID_JNI_STRING_H_
+
+#include <jni.h>
+#include <string>
+
+#include "base/android/scoped_java_ref.h"
+#include "base/base_export.h"
+#include "base/strings/string_piece.h"
+
+namespace base {
+namespace android {
+
+// Convert a Java string to UTF8. Returns a std string.
+BASE_EXPORT void ConvertJavaStringToUTF8(JNIEnv* env,
+ jstring str,
+ std::string* result);
+BASE_EXPORT std::string ConvertJavaStringToUTF8(JNIEnv* env, jstring str);
+BASE_EXPORT std::string ConvertJavaStringToUTF8(const JavaRef<jstring>& str);
+BASE_EXPORT std::string ConvertJavaStringToUTF8(JNIEnv* env,
+ const JavaRef<jstring>& str);
+
+// Convert a std string to Java string.
+BASE_EXPORT ScopedJavaLocalRef<jstring> ConvertUTF8ToJavaString(
+ JNIEnv* env,
+ const base::StringPiece& str);
+
+// Convert a Java string to UTF16. Returns a std::u16string.
+BASE_EXPORT void ConvertJavaStringToUTF16(JNIEnv* env,
+ jstring str,
+ std::u16string* result);
+BASE_EXPORT std::u16string ConvertJavaStringToUTF16(JNIEnv* env, jstring str);
+BASE_EXPORT std::u16string ConvertJavaStringToUTF16(
+ const JavaRef<jstring>& str);
+BASE_EXPORT std::u16string ConvertJavaStringToUTF16(
+ JNIEnv* env,
+ const JavaRef<jstring>& str);
+
+// Convert a std::u16string to a Java string.
+BASE_EXPORT ScopedJavaLocalRef<jstring> ConvertUTF16ToJavaString(
+ JNIEnv* env,
+ const base::StringPiece16& str);
+
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_JNI_STRING_H_
diff --git a/chromium/base/android/jni_string_unittest.cc b/chromium/base/android/jni_string_unittest.cc
new file mode 100644
index 00000000000..e81a0557f6f
--- /dev/null
+++ b/chromium/base/android/jni_string_unittest.cc
@@ -0,0 +1,48 @@
+// Copyright 2012 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/jni_string.h"
+
+#include "base/android/jni_android.h"
+#include "base/android/scoped_java_ref.h"
+#include "base/strings/utf_string_conversions.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace base {
+namespace android {
+
+TEST(JniString, BasicConversionsUTF8) {
+ const std::string kSimpleString = "SimpleTest8";
+ JNIEnv* env = AttachCurrentThread();
+ std::string result =
+ ConvertJavaStringToUTF8(ConvertUTF8ToJavaString(env, kSimpleString));
+ EXPECT_EQ(kSimpleString, result);
+}
+
+TEST(JniString, BasicConversionsUTF16) {
+ const std::u16string kSimpleString = u"SimpleTest16";
+ JNIEnv* env = AttachCurrentThread();
+ std::u16string result =
+ ConvertJavaStringToUTF16(ConvertUTF16ToJavaString(env, kSimpleString));
+ EXPECT_EQ(kSimpleString, result);
+}
+
+TEST(JniString, EmptyConversionUTF8) {
+ const std::string kEmptyString;
+ JNIEnv* env = AttachCurrentThread();
+ std::string result =
+ ConvertJavaStringToUTF8(ConvertUTF8ToJavaString(env, kEmptyString));
+ EXPECT_EQ(kEmptyString, result);
+}
+
+TEST(JniString, EmptyConversionUTF16) {
+ const std::u16string kEmptyString;
+ JNIEnv* env = AttachCurrentThread();
+ std::u16string result =
+ ConvertJavaStringToUTF16(ConvertUTF16ToJavaString(env, kEmptyString));
+ EXPECT_EQ(kEmptyString, result);
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/jni_utils.cc b/chromium/base/android/jni_utils.cc
new file mode 100644
index 00000000000..69849618189
--- /dev/null
+++ b/chromium/base/android/jni_utils.cc
@@ -0,0 +1,44 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/jni_utils.h"
+
+#include "base/android/jni_string.h"
+#include "base/android/scoped_java_ref.h"
+#include "base/containers/flat_map.h"
+#include "base/no_destructor.h"
+#include "base/synchronization/lock.h"
+
+#include "base/base_jni_headers/JNIUtils_jni.h"
+
+namespace base {
+namespace android {
+
+jobject GetSplitClassLoader(JNIEnv* env, const char* split_name) {
+ struct LockAndMap {
+ base::Lock lock;
+ base::flat_map<const char*, ScopedJavaGlobalRef<jobject>> map;
+ };
+ static base::NoDestructor<LockAndMap> lock_and_map;
+
+ base::AutoLock guard(lock_and_map->lock);
+ auto it = lock_and_map->map.find(split_name);
+ if (it != lock_and_map->map.end()) {
+ return it->second.obj();
+ }
+
+ ScopedJavaGlobalRef<jobject> class_loader(Java_JNIUtils_getSplitClassLoader(
+ env, ConvertUTF8ToJavaString(env, split_name)));
+ jobject class_loader_obj = class_loader.obj();
+ lock_and_map->map.insert({split_name, std::move(class_loader)});
+ return class_loader_obj;
+}
+
+bool IsSelectiveJniRegistrationEnabled(JNIEnv* env) {
+ return Java_JNIUtils_isSelectiveJniRegistrationEnabled(env);
+}
+
+} // namespace android
+} // namespace base
+
diff --git a/chromium/base/android/jni_utils.h b/chromium/base/android/jni_utils.h
new file mode 100644
index 00000000000..db25837032b
--- /dev/null
+++ b/chromium/base/android/jni_utils.h
@@ -0,0 +1,34 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_JNI_UTILS_H_
+#define BASE_ANDROID_JNI_UTILS_H_
+
+#include <jni.h>
+
+#include "base/android/scoped_java_ref.h"
+
+namespace base {
+
+namespace android {
+
+// Gets a ClassLoader instance which can load Java classes from the specified
+// split.
+jobject GetSplitClassLoader(JNIEnv* env, const char* split_name);
+
+// Gets a ClassLoader instance capable of loading Chromium java classes.
+// This should be called either from JNI_OnLoad or from within a method called
+// via JNI from Java.
+inline jobject GetClassLoader(JNIEnv* env) {
+ return GetSplitClassLoader(env, "");
+}
+
+// Returns true if the current process permits selective JNI registration.
+BASE_EXPORT bool IsSelectiveJniRegistrationEnabled(JNIEnv* env);
+
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_JNI_UTILS_H_
+
diff --git a/chromium/base/android/jni_weak_ref.cc b/chromium/base/android/jni_weak_ref.cc
new file mode 100644
index 00000000000..4244fcfcbac
--- /dev/null
+++ b/chromium/base/android/jni_weak_ref.cc
@@ -0,0 +1,78 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/jni_weak_ref.h"
+
+#include <utility>
+
+#include "base/android/jni_android.h"
+
+using base::android::AttachCurrentThread;
+
+JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef() : obj_(nullptr) {}
+
+JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef(
+ const JavaObjectWeakGlobalRef& orig)
+ : obj_(nullptr) {
+ Assign(orig);
+}
+
+JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef(
+ JavaObjectWeakGlobalRef&& orig) noexcept
+ : obj_(orig.obj_) {
+ orig.obj_ = nullptr;
+}
+
+JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef(JNIEnv* env, jobject obj)
+ : obj_(env->NewWeakGlobalRef(obj)) {
+}
+
+JavaObjectWeakGlobalRef::JavaObjectWeakGlobalRef(
+ JNIEnv* env,
+ const base::android::JavaRef<jobject>& obj)
+ : obj_(env->NewWeakGlobalRef(obj.obj())) {
+}
+
+JavaObjectWeakGlobalRef::~JavaObjectWeakGlobalRef() {
+ reset();
+}
+
+void JavaObjectWeakGlobalRef::operator=(const JavaObjectWeakGlobalRef& rhs) {
+ Assign(rhs);
+}
+
+void JavaObjectWeakGlobalRef::operator=(JavaObjectWeakGlobalRef&& rhs) {
+ std::swap(obj_, rhs.obj_);
+}
+
+void JavaObjectWeakGlobalRef::reset() {
+ if (obj_) {
+ AttachCurrentThread()->DeleteWeakGlobalRef(obj_);
+ obj_ = nullptr;
+ }
+}
+
+base::android::ScopedJavaLocalRef<jobject>
+ JavaObjectWeakGlobalRef::get(JNIEnv* env) const {
+ return GetRealObject(env, obj_);
+}
+
+base::android::ScopedJavaLocalRef<jobject> GetRealObject(
+ JNIEnv* env, jweak obj) {
+ jobject real = nullptr;
+ if (obj)
+ real = env->NewLocalRef(obj);
+ return base::android::ScopedJavaLocalRef<jobject>(env, real);
+}
+
+void JavaObjectWeakGlobalRef::Assign(const JavaObjectWeakGlobalRef& other) {
+ if (&other == this)
+ return;
+
+ JNIEnv* env = AttachCurrentThread();
+ if (obj_)
+ env->DeleteWeakGlobalRef(obj_);
+
+ obj_ = other.obj_ ? env->NewWeakGlobalRef(other.obj_) : nullptr;
+}
diff --git a/chromium/base/android/jni_weak_ref.h b/chromium/base/android/jni_weak_ref.h
new file mode 100644
index 00000000000..d97952929df
--- /dev/null
+++ b/chromium/base/android/jni_weak_ref.h
@@ -0,0 +1,51 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_JNI_WEAK_REF_H_
+#define BASE_ANDROID_JNI_WEAK_REF_H_
+
+#include <jni.h>
+
+#include "base/android/scoped_java_ref.h"
+#include "base/base_export.h"
+
+// Manages WeakGlobalRef lifecycle.
+// This class is not thread-safe w.r.t. get() and reset(). Multiple threads may
+// safely use get() concurrently, but if the user calls reset() (or of course,
+// calls the destructor) they'll need to provide their own synchronization.
+class BASE_EXPORT JavaObjectWeakGlobalRef {
+ public:
+ JavaObjectWeakGlobalRef();
+ JavaObjectWeakGlobalRef(const JavaObjectWeakGlobalRef& orig);
+ JavaObjectWeakGlobalRef(JavaObjectWeakGlobalRef&& orig) noexcept;
+ JavaObjectWeakGlobalRef(JNIEnv* env, jobject obj);
+ JavaObjectWeakGlobalRef(JNIEnv* env,
+ const base::android::JavaRef<jobject>& obj);
+ virtual ~JavaObjectWeakGlobalRef();
+
+ void operator=(const JavaObjectWeakGlobalRef& rhs);
+ void operator=(JavaObjectWeakGlobalRef&& rhs);
+
+ base::android::ScopedJavaLocalRef<jobject> get(JNIEnv* env) const;
+
+ // Returns true if the weak reference has not been initialized to point at
+ // an object (or ḣas had reset() called).
+ // Do not call this to test if the object referred to still exists! The weak
+ // reference remains initialized even if the target object has been collected.
+ bool is_uninitialized() const { return obj_ == nullptr; }
+
+ void reset();
+
+ private:
+ void Assign(const JavaObjectWeakGlobalRef& rhs);
+
+ jweak obj_;
+};
+
+// Get the real object stored in the weak reference returned as a
+// ScopedJavaLocalRef.
+BASE_EXPORT base::android::ScopedJavaLocalRef<jobject> GetRealObject(
+ JNIEnv* env, jweak obj);
+
+#endif // BASE_ANDROID_JNI_WEAK_REF_H_
diff --git a/chromium/base/android/junit/src/org/chromium/base/ApplicationStatusTest.java b/chromium/base/android/junit/src/org/chromium/base/ApplicationStatusTest.java
new file mode 100644
index 00000000000..71d1cbbaaf5
--- /dev/null
+++ b/chromium/base/android/junit/src/org/chromium/base/ApplicationStatusTest.java
@@ -0,0 +1,309 @@
+// Copyright 2015 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+import android.app.Activity;
+import android.view.ActionMode;
+import android.view.KeyEvent;
+import android.view.KeyboardShortcutGroup;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.MotionEvent;
+import android.view.SearchEvent;
+import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
+import android.view.accessibility.AccessibilityEvent;
+
+import androidx.annotation.RequiresApi;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.Robolectric;
+import org.robolectric.Shadows;
+import org.robolectric.android.controller.ActivityController;
+import org.robolectric.annotation.Config;
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.shadows.ShadowActivity;
+
+import org.chromium.base.test.BaseRobolectricTestRunner;
+
+import java.util.List;
+
+/** Unit tests for {@link ApplicationStatus}. */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(manifest = Config.NONE, shadows = {ApplicationStatusTest.TrackingShadowActivity.class})
+public class ApplicationStatusTest {
+ private static class WindowCallbackWrapper implements Window.Callback {
+ final Window.Callback mWrapped;
+
+ public WindowCallbackWrapper(Window.Callback wrapped) {
+ mWrapped = wrapped;
+ }
+
+ @Override
+ public boolean dispatchKeyEvent(KeyEvent event) {
+ return mWrapped.dispatchKeyEvent(event);
+ }
+
+ @Override
+ public boolean dispatchKeyShortcutEvent(KeyEvent event) {
+ return mWrapped.dispatchKeyShortcutEvent(event);
+ }
+
+ @Override
+ public boolean dispatchTouchEvent(MotionEvent event) {
+ return mWrapped.dispatchTouchEvent(event);
+ }
+
+ @Override
+ public boolean dispatchTrackballEvent(MotionEvent event) {
+ return mWrapped.dispatchTrackballEvent(event);
+ }
+
+ @Override
+ public boolean dispatchGenericMotionEvent(MotionEvent event) {
+ return mWrapped.dispatchGenericMotionEvent(event);
+ }
+
+ @Override
+ public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+ return mWrapped.dispatchPopulateAccessibilityEvent(event);
+ }
+
+ @Override
+ public View onCreatePanelView(int featureId) {
+ return mWrapped.onCreatePanelView(featureId);
+ }
+
+ @Override
+ public boolean onCreatePanelMenu(int featureId, Menu menu) {
+ return mWrapped.onCreatePanelMenu(featureId, menu);
+ }
+
+ @Override
+ public boolean onPreparePanel(int featureId, View view, Menu menu) {
+ return mWrapped.onPreparePanel(featureId, view, menu);
+ }
+
+ @Override
+ public boolean onMenuOpened(int featureId, Menu menu) {
+ return mWrapped.onMenuOpened(featureId, menu);
+ }
+
+ @Override
+ public boolean onMenuItemSelected(int featureId, MenuItem item) {
+ return mWrapped.onMenuItemSelected(featureId, item);
+ }
+
+ @Override
+ public void onWindowAttributesChanged(WindowManager.LayoutParams attrs) {
+ mWrapped.onWindowAttributesChanged(attrs);
+ }
+
+ @Override
+ public void onContentChanged() {
+ mWrapped.onContentChanged();
+ }
+
+ @Override
+ public void onWindowFocusChanged(boolean hasFocus) {
+ mWrapped.onWindowFocusChanged(hasFocus);
+ }
+
+ @Override
+ public void onAttachedToWindow() {
+ mWrapped.onAttachedToWindow();
+ }
+
+ @Override
+ public void onDetachedFromWindow() {
+ mWrapped.onDetachedFromWindow();
+ }
+
+ @Override
+ public void onPanelClosed(int featureId, Menu menu) {
+ mWrapped.onPanelClosed(featureId, menu);
+ }
+
+ @RequiresApi(23)
+ @Override
+ public boolean onSearchRequested(SearchEvent searchEvent) {
+ return mWrapped.onSearchRequested(searchEvent);
+ }
+
+ @Override
+ public boolean onSearchRequested() {
+ return mWrapped.onSearchRequested();
+ }
+
+ @Override
+ public ActionMode onWindowStartingActionMode(ActionMode.Callback callback) {
+ return mWrapped.onWindowStartingActionMode(callback);
+ }
+
+ @RequiresApi(23)
+ @Override
+ public ActionMode onWindowStartingActionMode(ActionMode.Callback callback, int type) {
+ return mWrapped.onWindowStartingActionMode(callback, type);
+ }
+
+ @Override
+ public void onActionModeStarted(ActionMode mode) {
+ mWrapped.onActionModeStarted(mode);
+ }
+
+ @Override
+ public void onActionModeFinished(ActionMode mode) {
+ mWrapped.onActionModeFinished(mode);
+ }
+
+ @RequiresApi(24)
+ @Override
+ public void onProvideKeyboardShortcuts(
+ List<KeyboardShortcutGroup> data, Menu menu, int deviceId) {
+ mWrapped.onProvideKeyboardShortcuts(data, menu, deviceId);
+ }
+
+ @RequiresApi(26)
+ @Override
+ public void onPointerCaptureChanged(boolean hasCapture) {
+ mWrapped.onPointerCaptureChanged(hasCapture);
+ }
+ }
+
+ private static class SubclassedCallbackWrapper extends WindowCallbackWrapper {
+ public SubclassedCallbackWrapper(Window.Callback callback) {
+ super(callback);
+ }
+ }
+
+ /** Shadow that tracks calls to onWindowFocusChanged and dispatchKeyEvent. */
+ @Implements(Activity.class)
+ public static class TrackingShadowActivity extends ShadowActivity {
+ private int mWindowFocusCalls;
+ private int mDispatchKeyEventCalls;
+ private boolean mReturnValueForKeyDispatch;
+
+ @Implementation
+ public void onWindowFocusChanged(@SuppressWarnings("unused") boolean hasFocus) {
+ mWindowFocusCalls++;
+ }
+
+ @Implementation
+ public boolean dispatchKeyEvent(@SuppressWarnings("unused") KeyEvent event) {
+ mDispatchKeyEventCalls++;
+ return mReturnValueForKeyDispatch;
+ }
+ }
+
+ @Test
+ public void testWindowsFocusChanged() {
+ ApplicationStatus.WindowFocusChangedListener mock =
+ mock(ApplicationStatus.WindowFocusChangedListener.class);
+ ApplicationStatus.registerWindowFocusChangedListener(mock);
+
+ ActivityController<Activity> controller =
+ Robolectric.buildActivity(Activity.class).create().start().visible();
+ TrackingShadowActivity shadow = (TrackingShadowActivity) Shadows.shadowOf(controller.get());
+
+ controller.get().getWindow().getCallback().onWindowFocusChanged(true);
+ // Assert that listeners were notified.
+ verify(mock).onWindowFocusChanged(controller.get(), true);
+ // Also ensure that the original activity is forwarded the notification.
+ Assert.assertEquals(1, shadow.mWindowFocusCalls);
+ }
+
+ @Test
+ public void testNullCallback() {
+ Assert.assertFalse(ApplicationStatus.reachesWindowCallback(null));
+ }
+
+ @Test
+ public void testOtherCallback() {
+ Assert.assertFalse(ApplicationStatus.reachesWindowCallback(mock(Window.Callback.class)));
+ }
+
+ private Window.Callback createWindowCallbackProxy() {
+ return ApplicationStatus.createWindowCallbackProxy(
+ mock(Activity.class), mock(Window.Callback.class));
+ }
+
+ @Test
+ public void testNotWrappedCallback() {
+ Assert.assertTrue(ApplicationStatus.reachesWindowCallback(createWindowCallbackProxy()));
+ }
+
+ @Test
+ public void testSingleWrappedCallback() {
+ Assert.assertTrue(ApplicationStatus.reachesWindowCallback(
+ new WindowCallbackWrapper(createWindowCallbackProxy())));
+ }
+
+ @Test
+ public void testDoubleWrappedCallback() {
+ Assert.assertTrue(ApplicationStatus.reachesWindowCallback(
+ new WindowCallbackWrapper(new WindowCallbackWrapper(createWindowCallbackProxy()))));
+ }
+
+ @Test
+ public void testSubclassWrappedCallback() {
+ Assert.assertTrue(ApplicationStatus.reachesWindowCallback(
+ new SubclassedCallbackWrapper(createWindowCallbackProxy())));
+ }
+
+ @Test
+ public void testTaskVisibilityForCreatedActivity() {
+ ActivityController<Activity> controller = Robolectric.buildActivity(Activity.class);
+
+ controller.create();
+ Assert.assertFalse(ApplicationStatus.isTaskVisible(controller.get().getTaskId()));
+ }
+
+ @Test
+ public void testTaskVisibilityForStartedActivity() {
+ ActivityController<Activity> controller = Robolectric.buildActivity(Activity.class);
+
+ controller.create().start();
+ Assert.assertFalse(ApplicationStatus.isTaskVisible(controller.get().getTaskId()));
+ }
+
+ @Test
+ public void testTaskVisibilityForResumedActivity() {
+ ActivityController<Activity> controller = Robolectric.buildActivity(Activity.class);
+
+ controller.create().resume();
+ Assert.assertTrue(ApplicationStatus.isTaskVisible(controller.get().getTaskId()));
+ }
+
+ @Test
+ public void testTaskVisibilityForPausedActivity() {
+ ActivityController<Activity> controller = Robolectric.buildActivity(Activity.class);
+
+ controller.create().pause();
+ Assert.assertTrue(ApplicationStatus.isTaskVisible(controller.get().getTaskId()));
+ }
+
+ @Test
+ public void testTaskVisibilityForStoppedActivity() {
+ ActivityController<Activity> controller = Robolectric.buildActivity(Activity.class);
+
+ controller.create().stop();
+ Assert.assertFalse(ApplicationStatus.isTaskVisible(controller.get().getTaskId()));
+ }
+
+ @Test
+ public void testTaskVisibilityForDestroyedActivity() {
+ ActivityController<Activity> controller = Robolectric.buildActivity(Activity.class);
+
+ controller.create().destroy();
+ Assert.assertFalse(ApplicationStatus.isTaskVisible(controller.get().getTaskId()));
+ }
+}
diff --git a/chromium/base/android/junit/src/org/chromium/base/BuildInfoTest.java b/chromium/base/android/junit/src/org/chromium/base/BuildInfoTest.java
new file mode 100644
index 00000000000..a62f4c0eae5
--- /dev/null
+++ b/chromium/base/android/junit/src/org/chromium/base/BuildInfoTest.java
@@ -0,0 +1,82 @@
+// 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.
+
+package org.chromium.base;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowPackageManager;
+
+import org.chromium.base.test.BaseRobolectricTestRunner;
+
+/** Unit tests for {@link BuildInfo}. */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+public class BuildInfoTest {
+ private ShadowPackageManager mShadowPackageManager;
+
+ @Before
+ public void setUp() {
+ Context context = ContextUtils.getApplicationContext();
+ mShadowPackageManager = Shadows.shadowOf(context.getPackageManager());
+ }
+
+ @Test
+ public void testIsAutomotive_trueIfFeatureAutomotiveTrue() {
+ mShadowPackageManager.setSystemFeature(
+ PackageManager.FEATURE_AUTOMOTIVE, /* supported= */ true);
+
+ BuildInfo buildInfo = new BuildInfo();
+
+ assertTrue(buildInfo.isAutomotive);
+ }
+
+ @Test
+ public void testIsAutomotive_falseIfFeatureAutomotiveFalse() {
+ mShadowPackageManager.setSystemFeature(
+ PackageManager.FEATURE_AUTOMOTIVE, /* supported= */ false);
+
+ BuildInfo buildInfo = new BuildInfo();
+
+ assertFalse(buildInfo.isAutomotive);
+ }
+
+ @Test
+ public void testIsAutomotive_isTrue_setsGetAllPropertesTo1() {
+ mShadowPackageManager.setSystemFeature(
+ PackageManager.FEATURE_AUTOMOTIVE, /* supported= */ true);
+
+ BuildInfo buildInfo = new BuildInfo();
+ String[] properties = buildInfo.getAllProperties();
+
+ // This index matches the value in the constructor of base/android/build_info.cc.
+ int isAutomotiveIndex = 27;
+
+ assertEquals("1", properties[isAutomotiveIndex]);
+ }
+
+ @Test
+ public void testIsAutomotive_isFalse_setsGetAllPropertesTo0() {
+ mShadowPackageManager.setSystemFeature(
+ PackageManager.FEATURE_AUTOMOTIVE, /* supported= */ false);
+
+ BuildInfo buildInfo = new BuildInfo();
+ String[] properties = buildInfo.getAllProperties();
+
+ // This index matches the value in the constructor of base/android/build_info.cc.
+ int isAutomotiveIndex = 27;
+
+ assertEquals("0", properties[isAutomotiveIndex]);
+ }
+}
diff --git a/chromium/base/android/junit/src/org/chromium/base/CallbackControllerTest.java b/chromium/base/android/junit/src/org/chromium/base/CallbackControllerTest.java
new file mode 100644
index 00000000000..b7dea52ca66
--- /dev/null
+++ b/chromium/base/android/junit/src/org/chromium/base/CallbackControllerTest.java
@@ -0,0 +1,139 @@
+// Copyright 2020 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base;
+
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+import org.robolectric.annotation.Config;
+
+import org.chromium.base.test.BaseRobolectricTestRunner;
+
+/**
+ * Test class for {@link CallbackController}, which also describes typical usage.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+public class CallbackControllerTest {
+ /**
+ * Callbacks in this test act on {@code CallbackTarget}.
+ */
+ private static class CallbackTarget {
+ public void runnableTarget() {}
+ public void callbackTarget(boolean arg) {}
+ }
+
+ @Test
+ public void testInstanceCallback() {
+ CallbackController callbackController = new CallbackController();
+ CallbackTarget target = Mockito.mock(CallbackTarget.class);
+ Callback<Boolean> wrapped = callbackController.makeCancelable(target::callbackTarget);
+
+ wrapped.onResult(true);
+ verify(target).callbackTarget(true);
+
+ // Execution possible multiple times.
+ wrapped.onResult(true);
+ verify(target, times(2)).callbackTarget(true);
+
+ // Won't trigger after CallbackController is destroyed.
+ callbackController.destroy();
+ wrapped.onResult(true);
+ verifyNoMoreInteractions(target);
+ }
+
+ @Test
+ public void testInstanceRunnable() {
+ CallbackController callbackController = new CallbackController();
+ CallbackTarget target = Mockito.mock(CallbackTarget.class);
+ Runnable wrapped = callbackController.makeCancelable(target::runnableTarget);
+
+ wrapped.run();
+ verify(target).runnableTarget();
+
+ // Execution possible multiple times.
+ wrapped.run();
+ verify(target, times(2)).runnableTarget();
+
+ // Won't trigger after CallbackController is destroyed.
+ callbackController.destroy();
+ wrapped.run();
+ verifyNoMoreInteractions(target);
+ }
+
+ @Test
+ public void testLambdaCallback() {
+ CallbackController callbackController = new CallbackController();
+ CallbackTarget target = Mockito.mock(CallbackTarget.class);
+ Callback<Boolean> wrapped =
+ callbackController.makeCancelable(value -> target.callbackTarget(value));
+
+ wrapped.onResult(true);
+ verify(target).callbackTarget(true);
+
+ // Execution possible multiple times.
+ wrapped.onResult(true);
+ verify(target, times(2)).callbackTarget(true);
+
+ // Won't trigger after CallbackController is destroyed.
+ callbackController.destroy();
+ wrapped.onResult(true);
+ verifyNoMoreInteractions(target);
+ }
+
+ @Test
+ public void testLambdaRunnable() {
+ CallbackController callbackController = new CallbackController();
+ CallbackTarget target = Mockito.mock(CallbackTarget.class);
+ Runnable wrapped = callbackController.makeCancelable(() -> target.runnableTarget());
+
+ wrapped.run();
+ verify(target).runnableTarget();
+
+ // Execution possible multiple times.
+ wrapped.run();
+ verify(target, times(2)).runnableTarget();
+
+ // Won't trigger after CallbackController is destroyed.
+ callbackController.destroy();
+ wrapped.run();
+ verifyNoMoreInteractions(target);
+ }
+
+ @Test
+ public void testNestedRunnable() {
+ CallbackController callbackController = new CallbackController();
+ CallbackTarget target = Mockito.mock(CallbackTarget.class);
+ Runnable makeCancelableAndRun =
+ () -> callbackController.makeCancelable(target::runnableTarget).run();
+ Runnable wrapped = callbackController.makeCancelable(makeCancelableAndRun);
+
+ // Inside of the wrapping CancelableRunnable#run(), the inner make/run is performed. This
+ // verifies the lock is reentrant.
+ wrapped.run();
+ verify(target).runnableTarget();
+
+ wrapped.run();
+ verify(target, times(2)).runnableTarget();
+
+ callbackController.destroy();
+ wrapped.run();
+ verifyNoMoreInteractions(target);
+ }
+
+ @Test(expected = AssertionError.class)
+ public void testNestedDestroy() {
+ CallbackController callbackController = new CallbackController();
+ CallbackTarget target = Mockito.mock(CallbackTarget.class);
+ Runnable wrapped = callbackController.makeCancelable(callbackController::destroy);
+
+ // This should throw an AssertionError.
+ wrapped.run();
+ }
+}
diff --git a/chromium/base/android/junit/src/org/chromium/base/CollectionUtilTest.java b/chromium/base/android/junit/src/org/chromium/base/CollectionUtilTest.java
new file mode 100644
index 00000000000..6d49615d1b1
--- /dev/null
+++ b/chromium/base/android/junit/src/org/chromium/base/CollectionUtilTest.java
@@ -0,0 +1,37 @@
+// Copyright 2020 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.annotation.Config;
+
+import org.chromium.base.test.BaseRobolectricTestRunner;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+/** Unit tests for {@link Log}. */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+public class CollectionUtilTest {
+ /** Tests that the computed call origin is the correct one. */
+ @Test
+ public void testStrengthen() {
+ // Java never GC's small constants, so there's no risk of the weak refs becoming null.
+ ArrayList<WeakReference<Integer>> weakList = new ArrayList<>();
+ weakList.add(new WeakReference<>(0));
+ weakList.add(new WeakReference<>(1));
+ weakList.add(new WeakReference<>(2));
+
+ assertEquals(Arrays.asList(0, 1, 2), CollectionUtil.strengthen(weakList));
+
+ weakList.set(1, new WeakReference<>(null));
+ assertEquals(Arrays.asList(0, 2), CollectionUtil.strengthen(weakList));
+ }
+}
diff --git a/chromium/base/android/junit/src/org/chromium/base/DiscardableReferencePoolTest.java b/chromium/base/android/junit/src/org/chromium/base/DiscardableReferencePoolTest.java
new file mode 100644
index 00000000000..540ced20d72
--- /dev/null
+++ b/chromium/base/android/junit/src/org/chromium/base/DiscardableReferencePoolTest.java
@@ -0,0 +1,128 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.annotation.Config;
+
+import org.chromium.base.DiscardableReferencePool.DiscardableReference;
+import org.chromium.base.test.BaseRobolectricTestRunner;
+
+import java.lang.ref.WeakReference;
+
+/**
+ * Tests for {@link DiscardableReferencePool}.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+public class DiscardableReferencePoolTest {
+ /**
+ * Tests that draining the pool clears references and allows objects to be garbage collected.
+ */
+ @Test
+ public void testDrain() {
+ DiscardableReferencePool pool = new DiscardableReferencePool();
+
+ Object object = new Object();
+ WeakReference<Object> weakReference = new WeakReference<>(object);
+
+ DiscardableReference<Object> discardableReference = pool.put(object);
+ Assert.assertEquals(object, discardableReference.get());
+
+ // Drop reference to the object itself, to allow it to be garbage-collected.
+ object = null;
+
+ pool.drain();
+
+ // The discardable reference should be null now.
+ Assert.assertNull(discardableReference.get());
+
+ // The object is not (strongly) reachable anymore, so the weak reference may or may not be
+ // null (it could be if a GC has happened since the pool was drained). It should be
+ // eligible for garbage collection.
+ Assert.assertTrue(GarbageCollectionTestUtils.canBeGarbageCollected(weakReference));
+ }
+
+ @Test
+ public void testRemoveAfterDrainDoesNotThrow() {
+ DiscardableReferencePool pool = new DiscardableReferencePool();
+
+ Object object = new Object();
+ WeakReference<Object> weakReference = new WeakReference<>(object);
+
+ DiscardableReference<Object> discardableReference = pool.put(object);
+ Assert.assertEquals(object, discardableReference.get());
+
+ // Release the strong reference.
+ object = null;
+
+ pool.drain();
+
+ // Shouldn't throw any exception.
+ pool.remove(discardableReference);
+
+ // The discardable reference should be null now.
+ Assert.assertNull(discardableReference.get());
+
+ // The object is not (strongly) reachable anymore, so the weak reference may or may not be
+ // null (it could be if a GC has happened since the pool was drained). It should be
+ // eligible for garbage collection.
+ Assert.assertTrue(GarbageCollectionTestUtils.canBeGarbageCollected(weakReference));
+ }
+
+ @Test
+ public void testDrainAfterRemoveDoesNotThrow() {
+ DiscardableReferencePool pool = new DiscardableReferencePool();
+
+ Object object = new Object();
+ WeakReference<Object> weakReference = new WeakReference<>(object);
+
+ DiscardableReference<Object> discardableReference = pool.put(object);
+ Assert.assertEquals(object, discardableReference.get());
+
+ // Release the strong reference.
+ object = null;
+
+ pool.remove(discardableReference);
+
+ // Shouldn't throw any exception.
+ pool.drain();
+
+ // The discardable reference should be null now.
+ Assert.assertNull(discardableReference.get());
+
+ // The object is not (strongly) reachable anymore, so the weak reference may or may not be
+ // null (it could be if a GC has happened since the pool was drained). It should be
+ // eligible for garbage collection.
+ Assert.assertTrue(GarbageCollectionTestUtils.canBeGarbageCollected(weakReference));
+ }
+
+ /**
+ * Tests that dropping the (last) discardable reference to an object allows it to be regularly
+ * garbage collected.
+ */
+ @Test
+ public void testReferenceGCd() {
+ DiscardableReferencePool pool = new DiscardableReferencePool();
+
+ Object object = new Object();
+ WeakReference<Object> weakReference = new WeakReference<>(object);
+
+ DiscardableReference<Object> discardableReference = pool.put(object);
+ Assert.assertEquals(object, discardableReference.get());
+
+ // Drop reference to the object itself and to the discardable reference, allowing the object
+ // to be garbage-collected.
+ object = null;
+ discardableReference = null;
+
+ // The object is not (strongly) reachable anymore, so the weak reference may or may not be
+ // null (it could be if a GC has happened since the pool was drained). It should be
+ // eligible for garbage collection.
+ Assert.assertTrue(GarbageCollectionTestUtils.canBeGarbageCollected(weakReference));
+ }
+}
diff --git a/chromium/base/android/junit/src/org/chromium/base/FileUtilsTest.java b/chromium/base/android/junit/src/org/chromium/base/FileUtilsTest.java
new file mode 100644
index 00000000000..7609e1126b5
--- /dev/null
+++ b/chromium/base/android/junit/src/org/chromium/base/FileUtilsTest.java
@@ -0,0 +1,552 @@
+// Copyright 2020 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import android.content.ContentProvider;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.pm.ProviderInfo;
+import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.net.Uri;
+import android.os.ParcelFileDescriptor;
+
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import org.junit.runner.RunWith;
+import org.robolectric.Robolectric;
+import org.robolectric.annotation.Config;
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+
+import org.chromium.base.test.BaseRobolectricTestRunner;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileDescriptor;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.function.Function;
+
+/** Unit tests for {@link Log}. */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(manifest = Config.NONE, shadows = {FileUtilsTest.FakeShadowBitmapFactory.class})
+public class FileUtilsTest {
+ @Rule
+ public final TemporaryFolder temporaryFolder = new TemporaryFolder();
+
+ private Context mContext;
+
+ @Before
+ public void setUp() {
+ mContext = ContextUtils.getApplicationContext();
+ }
+
+ /**
+ * Recursively lists all paths under a directory as relative paths, rendered as a string.
+ *
+ * @param rootDir The directory {@link Path}.
+ * @return A "; "-deliminated string of relative paths of all files stirctly under |rootDir|,
+ * lexicographically by path segments. Directories have "/" as suffix.
+ */
+ private String listAllPaths(Path rootDir) {
+ ArrayList<String> pathList = new ArrayList<String>();
+ try {
+ Files.walkFileTree(rootDir, new SimpleFileVisitor<Path>() {
+ @Override
+ public FileVisitResult preVisitDirectory(Path path, BasicFileAttributes attrs)
+ throws IOException {
+ String relPathString = rootDir.relativize(path).toString();
+ if (!relPathString.isEmpty()) { // Exclude |rootDir|.
+ pathList.add(relPathString + "/");
+ }
+ return FileVisitResult.CONTINUE;
+ }
+ @Override
+ public FileVisitResult visitFile(Path path, BasicFileAttributes attrs)
+ throws IOException {
+ pathList.add(rootDir.relativize(path).toString());
+ return FileVisitResult.CONTINUE;
+ }
+ });
+ } catch (IOException e) {
+ }
+
+ // Sort paths lexicographically by path segments. For example, "foo.bar/file" and "foo/sub"
+ // are treated as ["foo.bar", "file"] and ["foo", "sub"], then compared lexicographically
+ // element-by-element. Since "foo.bar" < "foo" (String comparison), so the order is
+ // "foo/sub" < "foo.bar/file". Instead of actually splitting the strings into lists, we
+ // simply replace '/' with |kSep| as ASCII character 1 for sorting...
+ final char kSep = (char) 1;
+ for (int i = 0; i < pathList.size(); ++i) {
+ pathList.set(i, pathList.get(i).replace('/', kSep));
+ }
+ Collections.sort(pathList);
+ // Then restore '/'.
+ for (int i = 0; i < pathList.size(); ++i) {
+ pathList.set(i, pathList.get(i).replace(kSep, '/'));
+ }
+ return String.join("; ", pathList);
+ }
+
+ /**
+ * Helper to check the current list of temp files and directories matches expectation.
+ *
+ * @param expectedFileList A string representation of the expected list of temp files and
+ * directories. See listAllPaths() for format.
+ */
+ private void assertFileList(String expectedFileList) {
+ Path rootDir = temporaryFolder.getRoot().toPath();
+ assertEquals(expectedFileList, listAllPaths(rootDir));
+ }
+
+ /**
+ * Helper to get the absolute path strings of multiple temp paths created for testing.
+ *
+ * @param relPathnames Relative names of temp files or directories (does not need to exist).
+ */
+ private ArrayList<String> getPathNames(String... relPathNames) {
+ Path rootDir = temporaryFolder.getRoot().toPath();
+ ArrayList<String> ret = new ArrayList<String>();
+ for (String relPathName : relPathNames) {
+ ret.add(rootDir.resolve(relPathName).toString());
+ }
+ return ret;
+ }
+
+ /**
+ * Helper to get the {@link File} object of a temp paths created for testing.
+ *
+ * @param relPathname The relative name of a temp file or directory (does not need to exist).
+ */
+ private File getFile(String relPathName) {
+ Path rootDir = temporaryFolder.getRoot().toPath();
+ return rootDir.resolve(relPathName).toFile();
+ }
+
+ /**
+ * Helper to create a mix of test files and directories. Can be called multiple times per test,
+ * but requires the temp file to be empty.
+ */
+ private void prepareMixedFilesTestCase() throws IOException {
+ assertFileList("");
+ temporaryFolder.newFolder("a1");
+ temporaryFolder.newFolder("a1", "b1");
+ temporaryFolder.newFile("a1/b1/c");
+ temporaryFolder.newFile("a1/b1/c2");
+ temporaryFolder.newFolder("a1", "b2");
+ temporaryFolder.newFolder("a1", "b2", "c");
+ temporaryFolder.newFile("a1/b3");
+ temporaryFolder.newFolder("a2");
+ temporaryFolder.newFile("c");
+ }
+
+ @Test
+ public void testRecursivelyDeleteFileBasic() throws IOException {
+ // Test file deletion.
+ temporaryFolder.newFile("some_File");
+ temporaryFolder.newFile("some");
+ temporaryFolder.newFile(".dot-config1");
+ temporaryFolder.newFile("some_File.txt");
+ assertFileList(".dot-config1; some; some_File; some_File.txt");
+ assertTrue(FileUtils.recursivelyDeleteFile(getFile("some_File"), null));
+ assertFileList(".dot-config1; some; some_File.txt");
+ assertTrue(FileUtils.recursivelyDeleteFile(getFile("some"), null));
+ assertFileList(".dot-config1; some_File.txt");
+ assertTrue(FileUtils.recursivelyDeleteFile(getFile("ok_to_delete_nonexistent"), null));
+ assertFileList(".dot-config1; some_File.txt");
+ assertTrue(FileUtils.recursivelyDeleteFile(getFile(".dot-config1"), null));
+ assertFileList("some_File.txt");
+ assertTrue(FileUtils.recursivelyDeleteFile(getFile("some_File.txt"), null));
+ assertFileList("");
+
+ // Test directory deletion.
+ temporaryFolder.newFolder("some_Dir");
+ temporaryFolder.newFolder("some");
+ temporaryFolder.newFolder(".dot-dir2");
+ temporaryFolder.newFolder("some_Dir.ext");
+ assertFileList(".dot-dir2/; some/; some_Dir/; some_Dir.ext/");
+ assertTrue(FileUtils.recursivelyDeleteFile(getFile("some_Dir"), null));
+ assertFileList(".dot-dir2/; some/; some_Dir.ext/");
+ assertTrue(FileUtils.recursivelyDeleteFile(getFile("some"), null));
+ assertFileList(".dot-dir2/; some_Dir.ext/");
+ assertTrue(FileUtils.recursivelyDeleteFile(getFile("ok/to/delete/nonexistent"), null));
+ assertFileList(".dot-dir2/; some_Dir.ext/");
+ assertTrue(FileUtils.recursivelyDeleteFile(getFile(".dot-dir2"), null));
+ assertFileList("some_Dir.ext/");
+ assertTrue(FileUtils.recursivelyDeleteFile(getFile("some_Dir.ext"), null));
+ assertFileList("");
+
+ // Test recursive deletion of mixed files and directories.
+ for (int i = 0; i < 2; ++i) {
+ Function<String, Boolean> canDelete = (i == 0) ? null : FileUtils.DELETE_ALL;
+ prepareMixedFilesTestCase();
+ assertFileList("a1/; a1/b1/; a1/b1/c; a1/b1/c2; a1/b2/; a1/b2/c/; a1/b3; a2/; c");
+ assertTrue(FileUtils.recursivelyDeleteFile(getFile("c"), canDelete));
+ assertFileList("a1/; a1/b1/; a1/b1/c; a1/b1/c2; a1/b2/; a1/b2/c/; a1/b3; a2/");
+ assertTrue(FileUtils.recursivelyDeleteFile(getFile("a1/b1"), canDelete));
+ assertFileList("a1/; a1/b2/; a1/b2/c/; a1/b3; a2/");
+ assertTrue(FileUtils.recursivelyDeleteFile(getFile("a1"), canDelete));
+ assertFileList("a2/");
+ assertTrue(FileUtils.recursivelyDeleteFile(getFile("a2"), canDelete));
+ assertFileList("");
+ }
+ }
+
+ // Enable or delete once https://crbug.com/1066733 is fixed.
+ @Ignore
+ @Test
+ public void testRecursivelyDeleteFileWithCanDelete() throws IOException {
+ Function<String, Boolean> canDeleteIfEndsWith1 = (String filepath) -> {
+ return filepath.endsWith("1");
+ };
+ Function<String, Boolean> canDeleteIfEndsWith2 = (String filepath) -> {
+ return filepath.endsWith("2");
+ };
+
+ prepareMixedFilesTestCase();
+ assertFileList("a1/; a1/b1/; a1/b1/c; a1/b1/c2; a1/b2/; a1/b2/c/; a1/b3; a2/; c");
+ assertTrue(FileUtils.recursivelyDeleteFile(getFile("a1"), canDeleteIfEndsWith1));
+ assertFileList("a2/; c");
+ assertTrue(FileUtils.recursivelyDeleteFile(getFile("a2"), canDeleteIfEndsWith1));
+ assertFileList("a2/; c");
+ assertTrue(FileUtils.recursivelyDeleteFile(getFile("a2"), canDeleteIfEndsWith2));
+ assertFileList("c");
+ assertTrue(FileUtils.recursivelyDeleteFile(getFile("a1"), null));
+ assertFileList("");
+
+ prepareMixedFilesTestCase();
+ assertFileList("a1/; a1/b1/; a1/b1/c; a1/b1/c2; a1/b2/; a1/b2/c/; a1/b3; a2/; c");
+ assertTrue(FileUtils.recursivelyDeleteFile(getFile("a1"), canDeleteIfEndsWith2));
+ assertFileList("a1/; a1/b1/; a1/b1/c; a1/b1/c2; a1/b3; a2/; c");
+ assertTrue(FileUtils.recursivelyDeleteFile(getFile("c"), canDeleteIfEndsWith2));
+ assertFileList("a1/; a1/b1/; a1/b1/c; a1/b1/c2; a1/b3; a2/; c");
+ assertTrue(FileUtils.recursivelyDeleteFile(getFile("c"), null));
+ assertFileList("a1/; a1/b1/; a1/b1/c; a1/b1/c2; a1/b3; a2/");
+ assertTrue(FileUtils.recursivelyDeleteFile(getFile("a2"), canDeleteIfEndsWith2));
+ assertFileList("a1/; a1/b1/; a1/b1/c; a1/b1/c2; a1/b3");
+ assertTrue(FileUtils.recursivelyDeleteFile(getFile("a1"), null));
+ assertFileList("");
+ }
+
+ @Test
+ public void testBatchDeleteFiles() throws IOException {
+ // Batch delete files specified as path names.
+ prepareMixedFilesTestCase();
+ assertFileList("a1/; a1/b1/; a1/b1/c; a1/b1/c2; a1/b2/; a1/b2/c/; a1/b3; a2/; c");
+ FileUtils.batchDeleteFiles(getPathNames("a1/b1", "c", "nonexistent"), null);
+ assertFileList("a1/; a1/b2/; a1/b2/c/; a1/b3; a2/");
+ // Note that "b2" is not "a1/b2".
+ FileUtils.batchDeleteFiles(getPathNames("b2", "a1/b2/c"), null);
+ assertFileList("a1/; a1/b2/; a1/b3; a2/");
+ FileUtils.batchDeleteFiles(getPathNames("a1/b3", "a1", "a2", "a2", "a1", "a1/b2"), null);
+ assertFileList("");
+
+ // Omit testing content URL deletion.
+ }
+
+ @Test
+ public void testGetFileSize() throws IOException {
+ Function<byte[], Boolean> runCase = (byte[] inputBytes) -> {
+ ByteArrayInputStream inputStream = new ByteArrayInputStream(inputBytes);
+ byte[] fileBytes;
+ long size;
+ try {
+ File tempFile = temporaryFolder.newFile();
+ FileUtils.copyStreamToFile(inputStream, tempFile);
+ size = FileUtils.getFileSizeBytes(tempFile);
+ } catch (IOException e) {
+ return false;
+ }
+ return inputBytes.length == size;
+ };
+
+ assertTrue(runCase.apply(new byte[] {}));
+ assertTrue(runCase.apply(new byte[] {3, 1, 4, 1, 5, 9, 2, 6, 5}));
+ assertTrue(runCase.apply("To be or not to be".getBytes()));
+ assertTrue(runCase.apply(createBigByteArray(131072))); // 1 << 17.
+ assertTrue(runCase.apply(createBigByteArray(119993))); // Prime.
+ }
+
+ /**
+ * Helper to create a byte array filled with arbitrary, non-repeating data.
+ *
+ * @param size Size of returned array.
+ */
+ private byte[] createBigByteArray(int size) {
+ byte[] ret = new byte[size];
+ for (int i = 0; i < size; ++i) {
+ int t = i ^ (i >> 8) ^ (i >> 16) ^ (i >> 24); // Prevents repeats.
+ ret[i] = (byte) (t & 0xFF);
+ }
+ return ret;
+ }
+
+ @Test
+ public void testCopyStream() {
+ Function<byte[], Boolean> runCase = (byte[] inputBytes) -> {
+ ByteArrayInputStream inputStream = new ByteArrayInputStream(inputBytes);
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ try {
+ FileUtils.copyStream(inputStream, outputStream);
+ } catch (IOException e) {
+ return false;
+ }
+ byte[] outputBytes = outputStream.toByteArray();
+ return Arrays.equals(inputBytes, outputBytes);
+ };
+
+ assertTrue(runCase.apply(new byte[] {}));
+ assertTrue(runCase.apply(new byte[] {3, 1, 4, 1, 5, 9, 2, 6, 5}));
+ assertTrue(runCase.apply("To be or not to be".getBytes()));
+ assertTrue(runCase.apply(createBigByteArray(131072))); // 1 << 17.
+ assertTrue(runCase.apply(createBigByteArray(119993))); // Prime.
+ }
+
+ @Test
+ public void testCopyStreamToFile() {
+ Function<byte[], Boolean> runCase = (byte[] inputBytes) -> {
+ ByteArrayInputStream inputStream = new ByteArrayInputStream(inputBytes);
+ ByteArrayOutputStream verifyStream = new ByteArrayOutputStream();
+ byte[] fileBytes;
+ try {
+ File tempFile = temporaryFolder.newFile();
+ FileUtils.copyStreamToFile(inputStream, tempFile);
+ byte[] buffer = new byte[6543]; // Use weird size.
+ try (InputStream is = new FileInputStream(tempFile)) {
+ int amountRead;
+ while ((amountRead = is.read(buffer)) != -1) {
+ verifyStream.write(buffer, 0, amountRead);
+ }
+ }
+ } catch (IOException e) {
+ return false;
+ }
+ byte[] outputBytes = verifyStream.toByteArray();
+ return Arrays.equals(inputBytes, outputBytes);
+ };
+
+ assertTrue(runCase.apply(new byte[] {}));
+ assertTrue(runCase.apply(new byte[] {3, 1, 4, 1, 5, 9, 2, 6, 5}));
+ assertTrue(runCase.apply("To be or not to be".getBytes()));
+ assertTrue(runCase.apply(createBigByteArray(131072))); // 1 << 17.
+ assertTrue(runCase.apply(createBigByteArray(119993))); // Prime.
+ }
+
+ @Test
+ public void testReadStream() {
+ Function<byte[], Boolean> runCase = (byte[] inputBytes) -> {
+ ByteArrayInputStream inputStream = new ByteArrayInputStream(inputBytes);
+ byte[] verifyBytes;
+ try {
+ verifyBytes = FileUtils.readStream(inputStream);
+ } catch (IOException e) {
+ return false;
+ }
+ return Arrays.equals(inputBytes, verifyBytes);
+ };
+
+ assertTrue(runCase.apply(new byte[] {}));
+ assertTrue(runCase.apply(new byte[] {3, 1, 4, 1, 5, 9, 2, 6, 5}));
+ assertTrue(runCase.apply("To be or not to be".getBytes()));
+ assertTrue(runCase.apply(createBigByteArray(131072))); // 1 << 17.
+ assertTrue(runCase.apply(createBigByteArray(119993))); // Prime.
+ }
+
+ @Test
+ public void testGetUriForFileWithContentUri() {
+ // ContentUriUtils needs to be initialized for "content://" URL to work. Use a fake
+ // version to avoid dealing with Android innards, and to provide consistent results.
+ ContentUriUtils.setFileProviderUtil(new ContentUriUtils.FileProviderUtil() {
+ @Override
+ public Uri getContentUriFromFile(File file) {
+ Uri.Builder builder = new Uri.Builder();
+ String fileString = file.toString();
+ if (fileString.startsWith("/")) {
+ fileString = fileString.substring(1);
+ }
+ builder.scheme("content").authority("org.chromium.test");
+ for (String path : fileString.split("/")) {
+ builder.appendPath(path);
+ }
+ return builder.build();
+ }
+ });
+
+ assertEquals(
+ "content://org.chromium.test/", FileUtils.getUriForFile(new File("/")).toString());
+ assertEquals("content://org.chromium.test/foo.bar",
+ FileUtils.getUriForFile(new File("/foo.bar")).toString());
+ assertEquals("content://org.chromium.test/path1/path2/filename.ext",
+ FileUtils.getUriForFile(new File("/path1/path2/filename.ext")).toString());
+ assertEquals("content://org.chromium.test/../../..",
+ FileUtils.getUriForFile(new File("/../../..")).toString());
+ }
+
+ @Test
+ public void testGetUriForFileWithoutContentUri() {
+ // Assumes contentUriUtils.setFileProviderUtil() is not called yet.
+ // Only test using absolute path. Otherwise cwd would be included into results.
+ assertEquals("file:///", FileUtils.getUriForFile(new File("/")).toString());
+ assertEquals("file:///foo.bar", FileUtils.getUriForFile(new File("/foo.bar")).toString());
+ assertEquals("file:///path1/path2/filename.ext",
+ FileUtils.getUriForFile(new File("/path1/path2/filename.ext")).toString());
+ assertEquals("file:///../../..", FileUtils.getUriForFile(new File("/../../..")).toString());
+ }
+
+ @Test
+ public void testGetExtension() {
+ assertEquals("txt", FileUtils.getExtension("foo.txt"));
+ assertEquals("txt", FileUtils.getExtension("fOo.TxT"));
+ assertEquals("", FileUtils.getExtension(""));
+ assertEquals("", FileUtils.getExtension("No_extension"));
+ assertEquals("foo_config", FileUtils.getExtension(".foo_conFIG"));
+ assertEquals("6", FileUtils.getExtension("a.1.2.3.4.5.6"));
+ assertEquals("a1z2_a8z9", FileUtils.getExtension("a....a1z2_A8Z9"));
+ assertEquals("", FileUtils.getExtension("dotAtEnd."));
+ assertEquals("ext", FileUtils.getExtension("/Full/PATH/To/File.Ext"));
+ assertEquals("", FileUtils.getExtension("/Full.PATH/To.File/Extra"));
+ assertEquals("", FileUtils.getExtension("../../file"));
+ assertEquals("", FileUtils.getExtension("./etc/passwd"));
+ assertEquals("", FileUtils.getExtension("////////"));
+ assertEquals("", FileUtils.getExtension("........"));
+ assertEquals("", FileUtils.getExtension("././././"));
+ assertEquals("", FileUtils.getExtension("/./././."));
+ }
+
+ /**
+ * This class replaces {@link ShadowBitmapFactory} so that decodeFileDescriptor() won't always
+ * return a valid {@link Image}. This enables testing error handing for attempting to load
+ * non-image files. A file is deemed valid if and only if it's non-empty.
+ */
+ @Implements(BitmapFactory.class)
+ public static class FakeShadowBitmapFactory {
+ @Implementation
+ public static Bitmap decodeFileDescriptor(FileDescriptor fd) throws IOException {
+ FileInputStream inStream = new FileInputStream(fd);
+ if (inStream.read() == -1) {
+ return null;
+ }
+ return Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
+ }
+ }
+
+ private static class TestContentProvider extends ContentProvider {
+ private HashMap<String, String> mUriToFilename;
+
+ public TestContentProvider() {
+ mUriToFilename = new HashMap<String, String>();
+ }
+
+ public void insertForTest(String uriString, String filename) {
+ mUriToFilename.put(uriString, filename);
+ }
+
+ @Override
+ public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
+ String uriString = uri.toString();
+ if (mUriToFilename.containsKey(uriString)) {
+ String filename = mUriToFilename.get(uriString);
+ // Throws FileNotFoundException if |filename| is bogus.
+ return ParcelFileDescriptor.open(
+ new File(filename), ParcelFileDescriptor.MODE_READ_ONLY);
+ }
+ return null;
+ }
+
+ @Override
+ public boolean onCreate() {
+ return false;
+ }
+
+ @Override
+ public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
+ String sortOrder) {
+ return null;
+ }
+
+ @Override
+ public String getType(Uri uri) {
+ return null;
+ }
+
+ @Override
+ public Uri insert(Uri uri, ContentValues values) {
+ return null;
+ }
+
+ @Override
+ public int delete(Uri uri, String selection, String[] selectionArgs) {
+ return 0;
+ }
+
+ @Override
+ public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+ return 0;
+ }
+ }
+
+ public void markFileAsValidImage(File outFile) throws IOException {
+ FileOutputStream outStream = new FileOutputStream(outFile);
+ outStream.write("Non-empty file is assumed to be valid image.".getBytes());
+ outStream.close();
+ }
+
+ @Test
+ public void testQueryBitmapFromContentProvider() throws IOException {
+ // Set up "org.chromium.test" provider.
+ ProviderInfo info = new ProviderInfo();
+ info.authority = "org.chromium.test";
+ TestContentProvider contentProvider =
+ Robolectric.buildContentProvider(TestContentProvider.class).create(info).get();
+
+ // Fake valid image. Expect success.
+ File tempFile1 = temporaryFolder.newFile("temp1.png");
+ markFileAsValidImage(tempFile1);
+ Uri validImageUri = Uri.parse("content://org.chromium.test/valid.png");
+ contentProvider.insertForTest(validImageUri.toString(), tempFile1.toString());
+
+ // File exists, but not a valid image (empty). Expect failure.
+ File tempFile2 = temporaryFolder.newFile("temp2.txt");
+ Uri invalidImageUri = Uri.parse("content://org.chromium.test/invalid.txt");
+ contentProvider.insertForTest(invalidImageUri.toString(), tempFile2.toString());
+
+ // Uri exists, but file does not exist. Expect failure.
+ Uri bogusFileUri = Uri.parse("content://org.chromium.test/bogus-file.txt");
+ contentProvider.insertForTest(bogusFileUri.toString(), "bogus-to-trigger-file-not-found");
+
+ // Uri does not exist. Expect failure.
+ Uri nonExistentUri = Uri.parse("content://org.chromium.test/non-existent.txt");
+
+ for (int i = 0; i < 2; ++i) {
+ assertNotNull(FileUtils.queryBitmapFromContentProvider(mContext, validImageUri));
+ assertNull(FileUtils.queryBitmapFromContentProvider(mContext, invalidImageUri));
+ assertNull(FileUtils.queryBitmapFromContentProvider(mContext, bogusFileUri));
+ assertNull(FileUtils.queryBitmapFromContentProvider(mContext, nonExistentUri));
+ }
+ }
+}
diff --git a/chromium/base/android/junit/src/org/chromium/base/LifetimeAssertTest.java b/chromium/base/android/junit/src/org/chromium/base/LifetimeAssertTest.java
new file mode 100644
index 00000000000..e3d95790687
--- /dev/null
+++ b/chromium/base/android/junit/src/org/chromium/base/LifetimeAssertTest.java
@@ -0,0 +1,147 @@
+// Copyright 2019 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.annotation.Config;
+
+import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.build.BuildConfig;
+
+/**
+ * junit tests for {@link LifetimeAssert}.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+public class LifetimeAssertTest {
+ private static class TestClass {
+ // Put assert inside of a test class to mirror typical api usage.
+ final LifetimeAssert mLifetimeAssert = LifetimeAssert.create(this);
+ }
+
+ private final Object mLock = new Object();
+ private TestClass mTestClass;
+ private LifetimeAssert.WrappedReference mTargetRef;
+ private boolean mFound;
+ private String mHookMessage;
+
+ @Before
+ public void setUp() {
+ if (!BuildConfig.ENABLE_ASSERTS) {
+ return;
+ }
+ mTestClass = new TestClass();
+ mTargetRef = mTestClass.mLifetimeAssert.mWrapper;
+ mFound = false;
+ mHookMessage = null;
+ LifetimeAssert.sTestHook = (ref, msg) -> {
+ if (ref == mTargetRef) {
+ synchronized (mLock) {
+ mFound = true;
+ mHookMessage = msg;
+ mLock.notify();
+ }
+ }
+ };
+ }
+
+ @After
+ public void tearDown() {
+ if (!BuildConfig.ENABLE_ASSERTS) {
+ return;
+ }
+ LifetimeAssert.sTestHook = null;
+ }
+
+ private void runTest(boolean setSafe) {
+ if (!BuildConfig.ENABLE_ASSERTS) {
+ return;
+ }
+
+ synchronized (mLock) {
+ if (setSafe) {
+ LifetimeAssert.setSafeToGc(mTestClass.mLifetimeAssert, true);
+ }
+ // Null out field to make reference GC'able.
+ mTestClass = null;
+ // Call System.gc() until the background thread notices the reference.
+ for (int i = 0; i < 10 && !mFound; ++i) {
+ System.gc();
+ try {
+ mLock.wait(200);
+ } catch (InterruptedException e) {
+ }
+ }
+ Assert.assertTrue(mFound);
+ if (setSafe) {
+ Assert.assertNull(mHookMessage);
+ } else {
+ Assert.assertNotNull(mHookMessage);
+ }
+ }
+ }
+
+ @Test
+ public void testSafeGc() {
+ runTest(true);
+ }
+
+ @Test
+ public void testUnsafeGc() {
+ runTest(false);
+ }
+
+ @Test
+ public void testAssertAllInstancesDestroyedForTesting_notSafeToGc() {
+ if (!BuildConfig.ENABLE_ASSERTS) {
+ return;
+ }
+ try {
+ LifetimeAssert.assertAllInstancesDestroyedForTesting();
+ Assert.fail();
+ } catch (LifetimeAssert.LifetimeAssertException e) {
+ // Expected.
+ }
+ }
+
+ @Test
+ public void testAssertAllInstancesDestroyedForTesting_safeToGc() {
+ if (!BuildConfig.ENABLE_ASSERTS) {
+ return;
+ }
+ LifetimeAssert.setSafeToGc(mTestClass.mLifetimeAssert, true);
+ // Should not throw.
+ LifetimeAssert.assertAllInstancesDestroyedForTesting();
+ }
+
+ @Test
+ public void testAssertAllInstancesDestroyedForTesting_resetAfterAssert() {
+ if (!BuildConfig.ENABLE_ASSERTS) {
+ return;
+ }
+ try {
+ LifetimeAssert.assertAllInstancesDestroyedForTesting();
+ Assert.fail();
+ } catch (LifetimeAssert.LifetimeAssertException e) {
+ // Expected.
+ }
+ // Should no longer throw.
+ LifetimeAssert.assertAllInstancesDestroyedForTesting();
+ }
+
+ @Test
+ public void testResetForTesting() {
+ if (!BuildConfig.ENABLE_ASSERTS) {
+ return;
+ }
+ LifetimeAssert.resetForTesting();
+ // Should not throw.
+ LifetimeAssert.assertAllInstancesDestroyedForTesting();
+ }
+}
diff --git a/chromium/base/android/junit/src/org/chromium/base/LogTest.java b/chromium/base/android/junit/src/org/chromium/base/LogTest.java
new file mode 100644
index 00000000000..ee686635fe4
--- /dev/null
+++ b/chromium/base/android/junit/src/org/chromium/base/LogTest.java
@@ -0,0 +1,84 @@
+// Copyright 2015 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowLog;
+
+import org.chromium.base.test.BaseRobolectricTestRunner;
+
+import java.util.List;
+
+/** Unit tests for {@link Log}. */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+public class LogTest {
+ /** Tests that the computed call origin is the correct one. */
+ @Test
+ public void callOriginTest() {
+ Log.d("Foo", "Bar");
+
+ List<ShadowLog.LogItem> logs = ShadowLog.getLogs();
+
+ assertTrue("The origin of the log message (" + logs.get(logs.size() - 1).msg
+ + ") looks wrong.",
+ logs.get(logs.size() - 1).msg.matches("\\[LogTest.java:\\d+\\].*"));
+ }
+
+ @Test
+ public void normalizeTagTest() {
+ assertEquals("cr_foo", Log.normalizeTag("foo"));
+ }
+
+ /** Tests that exceptions provided to the log functions are properly recognized and printed. */
+ @Test
+ public void exceptionLoggingTest() {
+ Throwable t = new Throwable() {
+ @Override
+ public String toString() {
+ return "MyThrowable";
+ }
+ };
+
+ Throwable t2 = new Throwable() {
+ @Override
+ public String toString() {
+ return "MyOtherThrowable";
+ }
+ };
+
+ List<ShadowLog.LogItem> logs;
+
+ // The throwable gets printed out
+ Log.i("Foo", "Bar", t);
+ logs = ShadowLog.getLogs();
+ assertEquals(t, logs.get(logs.size() - 1).throwable);
+ assertEquals("Bar", logs.get(logs.size() - 1).msg);
+
+ // messageTemplate include %xx, print out normally.
+ Log.i("Foo", "search?q=%E6%B5%8B%E8%AF%95", t);
+ logs = ShadowLog.getLogs();
+ assertEquals(t, logs.get(logs.size() - 1).throwable);
+ assertEquals("search?q=%E6%B5%8B%E8%AF%95", logs.get(logs.size() - 1).msg);
+
+ // Non throwable are properly identified
+ Log.i("Foo", "Bar %s", t, "Baz");
+ logs = ShadowLog.getLogs();
+ assertNull(logs.get(logs.size() - 1).throwable);
+ assertEquals("Bar MyThrowable", logs.get(logs.size() - 1).msg);
+
+ // The last throwable is the one used that is going to be printed out
+ Log.i("Foo", "Bar %s", t, t2);
+ logs = ShadowLog.getLogs();
+ assertEquals(t2, logs.get(logs.size() - 1).throwable);
+ assertEquals("Bar MyThrowable", logs.get(logs.size() - 1).msg);
+ }
+}
diff --git a/chromium/base/android/junit/src/org/chromium/base/MathUtilsTest.java b/chromium/base/android/junit/src/org/chromium/base/MathUtilsTest.java
new file mode 100644
index 00000000000..fda0361b876
--- /dev/null
+++ b/chromium/base/android/junit/src/org/chromium/base/MathUtilsTest.java
@@ -0,0 +1,88 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base;
+
+import static org.chromium.base.MathUtils.EPSILON;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.test.BaseRobolectricTestRunner;
+
+/** Unit tests for {@link org.chromium.base.MathUtils}. */
+@RunWith(BaseRobolectricTestRunner.class)
+public class MathUtilsTest {
+ private static final String ROUND_FAILURE =
+ "Failure to correctly round value to two decimal places.";
+ private static final String CLAMP_FAILURE = "Failure to correctly clamp value to range.";
+ private static final String MODULO_FAILURE =
+ "Failure to correctly return a positive modulo value.";
+ private static final String SMOOTH_STEP_FAILURE = "Failure to smooth step between 0 and 1.";
+
+ @Test
+ public void testRoundTwoDecimalPlaces() {
+ Assert.assertEquals(ROUND_FAILURE, 2.12, MathUtils.roundTwoDecimalPlaces(2.123), EPSILON);
+ Assert.assertEquals(ROUND_FAILURE, 2.13, MathUtils.roundTwoDecimalPlaces(2.127), EPSILON);
+ Assert.assertEquals(ROUND_FAILURE, -2.12, MathUtils.roundTwoDecimalPlaces(-2.123), EPSILON);
+ Assert.assertEquals(ROUND_FAILURE, -2.13, MathUtils.roundTwoDecimalPlaces(-2.127), EPSILON);
+ }
+
+ @Test
+ public void testClampInt() {
+ int min = 1;
+ int max = 9;
+ Assert.assertEquals(CLAMP_FAILURE, 4, MathUtils.clamp(4, min, max));
+ Assert.assertEquals(CLAMP_FAILURE, 4, MathUtils.clamp(4, max, min));
+
+ Assert.assertEquals(CLAMP_FAILURE, 1, MathUtils.clamp(-1, min, max));
+ Assert.assertEquals(CLAMP_FAILURE, 1, MathUtils.clamp(0, max, min));
+
+ Assert.assertEquals(CLAMP_FAILURE, 9, MathUtils.clamp(10, min, max));
+ Assert.assertEquals(CLAMP_FAILURE, 9, MathUtils.clamp(30, max, min));
+ }
+
+ @Test
+ public void testClampLong() {
+ long min = 1L;
+ long max = 9L;
+ Assert.assertEquals(CLAMP_FAILURE, 4, MathUtils.clamp(4, min, max), EPSILON);
+ Assert.assertEquals(CLAMP_FAILURE, 4, MathUtils.clamp(4, max, min), EPSILON);
+
+ Assert.assertEquals(CLAMP_FAILURE, 1, MathUtils.clamp(-1, min, max), EPSILON);
+ Assert.assertEquals(CLAMP_FAILURE, 1, MathUtils.clamp(0, max, min), EPSILON);
+
+ Assert.assertEquals(CLAMP_FAILURE, 9, MathUtils.clamp(10, min, max), EPSILON);
+ Assert.assertEquals(CLAMP_FAILURE, 9, MathUtils.clamp(30, max, min), EPSILON);
+ }
+
+ @Test
+ public void testClampFloat() {
+ float min = 1.0f;
+ float max = 9.0f;
+ Assert.assertEquals(CLAMP_FAILURE, 4.8f, MathUtils.clamp(4.8f, min, max), EPSILON);
+ Assert.assertEquals(CLAMP_FAILURE, 4.8f, MathUtils.clamp(4.8f, max, min), EPSILON);
+
+ Assert.assertEquals(CLAMP_FAILURE, 1f, MathUtils.clamp(-1.7f, min, max), EPSILON);
+ Assert.assertEquals(CLAMP_FAILURE, 1f, MathUtils.clamp(0.003f, max, min), EPSILON);
+
+ Assert.assertEquals(CLAMP_FAILURE, 9f, MathUtils.clamp(10.9f, min, max), EPSILON);
+ Assert.assertEquals(CLAMP_FAILURE, 9f, MathUtils.clamp(30.1f, max, min), EPSILON);
+ }
+ @Test
+ public void testPositiveModulo() {
+ Assert.assertEquals(MODULO_FAILURE, 1, MathUtils.positiveModulo(3, 2));
+ Assert.assertEquals(MODULO_FAILURE, 1, MathUtils.positiveModulo(3, -2));
+ Assert.assertEquals(MODULO_FAILURE, 1, MathUtils.positiveModulo(-3, 2));
+ }
+
+ @Test
+ public void testSmoothStep() {
+ Assert.assertEquals(SMOOTH_STEP_FAILURE, 0f, MathUtils.smoothstep(0f), EPSILON);
+ Assert.assertEquals(SMOOTH_STEP_FAILURE, 1f, MathUtils.smoothstep(1f), EPSILON);
+ Assert.assertEquals(SMOOTH_STEP_FAILURE, 0.648f, MathUtils.smoothstep(0.6f), EPSILON);
+ Assert.assertEquals(SMOOTH_STEP_FAILURE, 0.216f, MathUtils.smoothstep(0.3f), EPSILON);
+ }
+} \ No newline at end of file
diff --git a/chromium/base/android/junit/src/org/chromium/base/PathUtilsTest.java b/chromium/base/android/junit/src/org/chromium/base/PathUtilsTest.java
new file mode 100644
index 00000000000..ebe2ba8290b
--- /dev/null
+++ b/chromium/base/android/junit/src/org/chromium/base/PathUtilsTest.java
@@ -0,0 +1,86 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base;
+
+import static org.junit.Assert.assertEquals;
+
+import android.content.Context;
+
+import androidx.test.core.app.ApplicationProvider;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.test.BaseRobolectricTestRunner;
+
+import java.io.File;
+
+/**
+ * junit tests for {@link PathUtils}.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+public class PathUtilsTest {
+ static final String THUMBNAIL_DIRECTORY_NAME = "textures";
+
+ @Test
+ public void testSetPrivateDataDirectorySuffix() {
+ Context context = ApplicationProvider.getApplicationContext();
+ String dataSuffix = "data_suffix";
+ String cacheSubDir = "cache_subdir";
+ String expectedDataDir = context.getDir(dataSuffix, Context.MODE_PRIVATE).getPath();
+ String expectedThumbnailDir =
+ context.getDir(THUMBNAIL_DIRECTORY_NAME, Context.MODE_PRIVATE).getPath();
+ String expectedCacheDir = new File(context.getCacheDir(), cacheSubDir).getPath();
+
+ PathUtils.setPrivateDataDirectorySuffix(dataSuffix, cacheSubDir);
+ String dataDir = PathUtils.getDataDirectory();
+ String cacheDir = PathUtils.getCacheDirectory();
+ String thumbnailDir = PathUtils.getThumbnailCacheDirectory();
+
+ assertEquals(dataDir, expectedDataDir);
+ assertEquals(cacheDir, expectedCacheDir);
+ assertEquals(thumbnailDir, expectedThumbnailDir);
+ }
+
+ @Test
+ public void testSetPrivateDirectoryPath() {
+ String dataPath = "/data_path/a/b/c";
+ String cachePath = "/cache_path/a/b/c";
+ String dataSuffix = "data_suffix";
+ String cacheSubDir = "cache_subdir";
+ String expectedDataDir = dataPath + "/" + dataSuffix;
+ String expectedCacheDir = cachePath + "/" + cacheSubDir;
+ String expectedThumbnailDir = dataPath + "/" + THUMBNAIL_DIRECTORY_NAME;
+
+ PathUtils.setPrivateDirectoryPath(dataPath, cachePath, dataSuffix, cacheSubDir);
+ String dataDir = PathUtils.getDataDirectory();
+ String cacheDir = PathUtils.getCacheDirectory();
+ String thumbnailDir = PathUtils.getThumbnailCacheDirectory();
+
+ assertEquals(dataDir, expectedDataDir);
+ assertEquals(cacheDir, expectedCacheDir);
+ assertEquals(thumbnailDir, expectedThumbnailDir);
+ }
+
+ @Test
+ public void testSetPrivateDirectoryPathWithoutBasePaths() {
+ Context context = ApplicationProvider.getApplicationContext();
+ String dataSuffix = "data_suffix";
+ String cacheSubDir = "cache_subdir";
+ String expectedDataDir = context.getDir(dataSuffix, Context.MODE_PRIVATE).getPath();
+ String expectedThumbnailDir =
+ context.getDir(THUMBNAIL_DIRECTORY_NAME, Context.MODE_PRIVATE).getPath();
+ String expectedCacheDir = new File(context.getCacheDir(), cacheSubDir).getPath();
+
+ PathUtils.setPrivateDirectoryPath(null, null, dataSuffix, cacheSubDir);
+ String dataDir = PathUtils.getDataDirectory();
+ String cacheDir = PathUtils.getCacheDirectory();
+ String thumbnailDir = PathUtils.getThumbnailCacheDirectory();
+
+ assertEquals(dataDir, expectedDataDir);
+ assertEquals(cacheDir, expectedCacheDir);
+ assertEquals(thumbnailDir, expectedThumbnailDir);
+ }
+}
diff --git a/chromium/base/android/junit/src/org/chromium/base/PiiEliderTest.java b/chromium/base/android/junit/src/org/chromium/base/PiiEliderTest.java
new file mode 100644
index 00000000000..585ca3bbb8d
--- /dev/null
+++ b/chromium/base/android/junit/src/org/chromium/base/PiiEliderTest.java
@@ -0,0 +1,181 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.annotation.Config;
+
+import org.chromium.base.test.BaseRobolectricTestRunner;
+
+/**
+ * junit tests for {@link PiiElider}.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+public class PiiEliderTest {
+ private static final int MAX_LINES = 5;
+
+ @Test
+ public void testElideEmail() {
+ String original = "email me at someguy@mailservice.com";
+ String expected = "email me at XXX@EMAIL.ELIDED";
+ assertEquals(expected, PiiElider.elideEmail(original));
+ }
+
+ @Test
+ public void testElideUrl() {
+ String original = "file bugs at crbug.com";
+ String expected = "file bugs at HTTP://WEBADDRESS.ELIDED";
+ assertEquals(expected, PiiElider.elideUrl(original));
+ }
+
+ @Test
+ public void testElideUrl2() {
+ String original = "exception at org.chromium.base.PiiEliderTest";
+ assertEquals(original, PiiElider.elideUrl(original));
+ }
+
+ @Test
+ public void testElideUrl3() {
+ String original = "file bugs at crbug.com or code.google.com";
+ String expected = "file bugs at HTTP://WEBADDRESS.ELIDED or HTTP://WEBADDRESS.ELIDED";
+ assertEquals(expected, PiiElider.elideUrl(original));
+ }
+
+ @Test
+ public void testElideUrl4() {
+ String original = "test shorturl.com !!!";
+ String expected = "test HTTP://WEBADDRESS.ELIDED !!!";
+ assertEquals(expected, PiiElider.elideUrl(original));
+ }
+
+ @Test
+ public void testElideUrl5() {
+ String original = "test just.the.perfect.len.url !!!";
+ String expected = "test HTTP://WEBADDRESS.ELIDED !!!";
+ assertEquals(expected, PiiElider.elideUrl(original));
+ }
+
+ @Test
+ public void testElideUrl6() {
+ String original = "test a.very.very.very.very.very.long.url !!!";
+ String expected = "test HTTP://WEBADDRESS.ELIDED !!!";
+ assertEquals(expected, PiiElider.elideUrl(original));
+ }
+
+ @Test
+ public void testElideUrl7() {
+ String original = " at android.content.Intent \n at java.util.ArrayList";
+ assertEquals(original, PiiElider.elideUrl(original));
+ }
+
+ @Test
+ public void testElideUrl8() {
+ String original = "exception at org.chromium.chrome.browser.compositor.scene_layer."
+ + "TabListSceneLayer.nativeUpdateLayer(Native Method)";
+ assertEquals(original, PiiElider.elideUrl(original));
+ }
+
+ @Test
+ public void testElideUrl9() {
+ String original = "I/dalvikvm( 5083): at org.chromium.chrome.browser.compositor."
+ + "scene_layer.TabListSceneLayer.nativeUpdateLayer(Native Method)";
+ assertEquals(original, PiiElider.elideUrl(original));
+ }
+
+ @Test
+ public void testElideUrl10() {
+ String original = "Caused by: java.lang.ClassNotFoundException: Didn't find class "
+ + "\"org.chromium.components.browser_ui.widget.SurfaceColorOvalView\"";
+ assertEquals(original, PiiElider.elideUrl(original));
+ }
+
+ @Test
+ public void testElideUrl11() {
+ String original = "java.lang.RuntimeException: Unable to start activity "
+ + "ComponentInfo{com.chrome.dev/org.chromium.chrome.browser.ChromeTabbedActivity}: "
+ + "android.view.InflateException: Binary XML file line #20 in "
+ + "com.chrome.dev:layout/0_resource_name_obfuscated:";
+ assertEquals(original, PiiElider.elideUrl(original));
+ }
+
+ @Test
+ public void testElideUrl12() {
+ String original = "System.err: at kH.onAnimationEnd"
+ + "(chromium-TrichromeChromeGoogle6432.aab-canary-530200034:42)";
+ assertEquals(original, PiiElider.elideUrl(original));
+ }
+
+ @Test
+ public void testElideNonHttpUrl() {
+ String original = "test some-other-scheme://address/01010?param=33&other_param=AAA !!!";
+ String expected = "test HTTP://WEBADDRESS.ELIDED !!!";
+ assertEquals(expected, PiiElider.elideUrl(original));
+ }
+
+ @Test
+ public void testDontElideFileSuffixes() {
+ String original = "chromium_android_linker.so";
+ assertEquals(original, PiiElider.elideUrl(original));
+ }
+
+ @Test
+ public void testDontElideAndroidPermission() {
+ String original = "java.lang.SecurityException: get package info: "
+ + "Neither user 1210041 nor current process has android.permission.READ_LOGS";
+ assertEquals(original, PiiElider.elideUrl(original));
+ }
+
+ @Test
+ public void testElideIp() {
+ String original = "traceroute 127.0.0.1";
+ String expected = "traceroute 1.2.3.4";
+ assertEquals(expected, PiiElider.elideIp(original));
+ }
+
+ @Test
+ public void testElideMac1() {
+ String original = "MAC: AB-AB-AB-AB-AB-AB";
+ String expected = "MAC: 01:23:45:67:89:AB";
+ assertEquals(expected, PiiElider.elideMac(original));
+ }
+
+ @Test
+ public void testElideMac2() {
+ String original = "MAC: AB:AB:AB:AB:AB:AB";
+ String expected = "MAC: 01:23:45:67:89:AB";
+ assertEquals(expected, PiiElider.elideMac(original));
+ }
+
+ @Test
+ public void testElideConsole() {
+ String original = "I/chromium(123): [INFO:CONSOLE(2)] hello!";
+ String expected = "I/chromium(123): [ELIDED:CONSOLE(0)] ELIDED CONSOLE MESSAGE";
+ assertEquals(expected, PiiElider.elideConsole(original));
+ }
+
+ @Test
+ public void testElideUrlInStacktrace() {
+ String original = "java.lang.RuntimeException: Outer Exception crbug.com/12345\n"
+ + " at org.chromium.base.PiiElider.sanitizeStacktrace (PiiElider.java:120)\n"
+ + "Caused by: java.lang.NullPointerException: Inner Exception shorturl.com/bxyj5";
+ String expected = "java.lang.RuntimeException: Outer Exception HTTP://WEBADDRESS.ELIDED\n"
+ + " at org.chromium.base.PiiElider.sanitizeStacktrace (PiiElider.java:120)\n"
+ + "Caused by: java.lang.NullPointerException: Inner Exception "
+ + "HTTP://WEBADDRESS.ELIDED";
+ assertEquals(expected, PiiElider.sanitizeStacktrace(original));
+ }
+
+ @Test
+ public void testDoesNotElideMethodNameInStacktrace() {
+ String original = "java.lang.NullPointerException: Attempt to invoke virtual method 'int "
+ + "org.robolectric.internal.AndroidSandbox.getBackStackEntryCount()' on a null "
+ + "object reference";
+ assertEquals(original, PiiElider.sanitizeStacktrace(original));
+ }
+}
diff --git a/chromium/base/android/junit/src/org/chromium/base/PromiseTest.java b/chromium/base/android/junit/src/org/chromium/base/PromiseTest.java
new file mode 100644
index 00000000000..4d480cde906
--- /dev/null
+++ b/chromium/base/android/junit/src/org/chromium/base/PromiseTest.java
@@ -0,0 +1,270 @@
+// Copyright 2016 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
+import org.robolectric.shadows.ShadowLooper;
+
+import org.chromium.base.Promise.UnhandledRejectionException;
+import org.chromium.base.test.BaseRobolectricTestRunner;
+
+import java.util.function.Function;
+
+/** Unit tests for {@link Promise}. */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+@LooperMode(LooperMode.Mode.LEGACY)
+public class PromiseTest {
+ // We need a simple mutable reference type for testing.
+ private static class Value {
+ private int mValue;
+
+ public int get() {
+ return mValue;
+ }
+
+ public void set(int value) {
+ mValue = value;
+ }
+ }
+
+ /** Tests that the callback is called on fulfillment. */
+ @Test
+ public void callback() {
+ final Value value = new Value();
+
+ Promise<Integer> promise = new Promise<>();
+ promise.then(PromiseTest.setValue(value, 1));
+
+ assertEquals(value.get(), 0);
+
+ promise.fulfill(1);
+ assertEquals(value.get(), 1);
+ }
+
+ /** Tests that multiple callbacks are called. */
+ @Test
+ public void multipleCallbacks() {
+ final Value value = new Value();
+
+ Promise<Integer> promise = new Promise<>();
+ Callback<Integer> callback = unusedArg -> {
+ value.set(value.get() + 1);
+ };
+ promise.then(callback);
+ promise.then(callback);
+
+ assertEquals(value.get(), 0);
+
+ promise.fulfill(0);
+ assertEquals(value.get(), 2);
+ }
+
+ /** Tests that a callback is called immediately when given to a fulfilled Promise. */
+ @Test
+ public void callbackOnFulfilled() {
+ final Value value = new Value();
+
+ Promise<Integer> promise = Promise.fulfilled(0);
+ assertEquals(value.get(), 0);
+
+ promise.then(PromiseTest.setValue(value, 1));
+
+ assertEquals(value.get(), 1);
+ }
+
+ /** Tests that promises can chain synchronous functions correctly. */
+ @Test
+ public void promiseChaining() {
+ Promise<Integer> promise = new Promise<>();
+ final Value value = new Value();
+
+ promise.then((Integer arg) -> arg.toString())
+ .then((String arg) -> arg + arg)
+ .then(result -> { value.set(result.length()); });
+
+ promise.fulfill(123);
+ ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
+ assertEquals(6, value.get());
+ }
+
+ /** Tests that promises can chain asynchronous functions correctly. */
+ @Test
+ public void promiseChainingAsyncFunctions() {
+ Promise<Integer> promise = new Promise<>();
+ final Value value = new Value();
+
+ final Promise<String> innerPromise = new Promise<>();
+
+ promise.then(arg -> innerPromise).then(result -> { value.set(result.length()); });
+
+ assertEquals(0, value.get());
+
+ promise.fulfill(5);
+ ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
+ assertEquals(0, value.get());
+
+ innerPromise.fulfill("abc");
+ ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
+ assertEquals(3, value.get());
+ }
+
+ /** Tests that a Promise that does not use its result does not throw on rejection. */
+ @Test
+ public void rejectPromiseNoCallbacks() {
+ Promise<Integer> promise = new Promise<>();
+
+ boolean caught = false;
+ try {
+ promise.reject();
+ ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
+ } catch (UnhandledRejectionException e) {
+ caught = true;
+ }
+ assertFalse(caught);
+ }
+
+ /** Tests that a Promise that uses its result throws on rejection if it has no handler. */
+ @Test
+ public void rejectPromiseNoHandler() {
+ Promise<Integer> promise = new Promise<>();
+ promise.then(PromiseTest.identity()).then(PromiseTest.pass());
+
+ boolean caught = false;
+ try {
+ promise.reject();
+ ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
+ } catch (UnhandledRejectionException e) {
+ caught = true;
+ }
+ assertTrue(caught);
+ }
+
+ /** Tests that a Promise that handles rejection does not throw on rejection. */
+ @Test
+ public void rejectPromiseHandled() {
+ Promise<Integer> promise = new Promise<>();
+ promise.then(PromiseTest.identity()).then(PromiseTest.pass(), PromiseTest.pass());
+
+ boolean caught = false;
+ try {
+ promise.reject();
+ ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
+ } catch (UnhandledRejectionException e) {
+ caught = true;
+ }
+ assertFalse(caught);
+ }
+
+ /** Tests that rejections carry the exception information. */
+ @Test
+ public void rejectionInformation() {
+ Promise<Integer> promise = new Promise<>();
+ promise.then(PromiseTest.pass());
+
+ String message = "Promise Test";
+ try {
+ promise.reject(new NegativeArraySizeException(message));
+ ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
+ fail();
+ } catch (UnhandledRejectionException e) {
+ assertTrue(e.getCause() instanceof NegativeArraySizeException);
+ assertEquals(e.getCause().getMessage(), message);
+ }
+ }
+
+ /** Tests that rejections propagate. */
+ @Test
+ public void rejectionChaining() {
+ final Value value = new Value();
+ Promise<Integer> promise = new Promise<>();
+
+ Promise<Integer> result = promise.then(PromiseTest.identity()).then(PromiseTest.identity());
+
+ result.then(PromiseTest.pass(), PromiseTest.setValue(value, 5));
+
+ promise.reject(new Exception());
+ ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
+
+ assertEquals(value.get(), 5);
+ assertTrue(result.isRejected());
+ }
+
+ /** Tests that Promises get rejected if a Function throws. */
+ @Test
+ public void rejectOnThrow() {
+ Value value = new Value();
+ Promise<Integer> promise = new Promise<>();
+ promise.then((Function) (unusedArg -> { throw new IllegalArgumentException(); }))
+ .then(PromiseTest.pass(), PromiseTest.setValue(value, 5));
+
+ promise.fulfill(0);
+
+ ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
+ assertEquals(value.get(), 5);
+ }
+
+ /** Tests that Promises get rejected if an AsyncFunction throws. */
+ @Test
+ public void rejectOnAsyncThrow() {
+ Value value = new Value();
+ Promise<Integer> promise = new Promise<>();
+
+ promise.then((Promise.AsyncFunction) (unusedArg -> {
+ throw new IllegalArgumentException();
+ }))
+ .then(PromiseTest.pass(), PromiseTest.setValue(value, 5));
+
+ promise.fulfill(0);
+
+ ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
+ assertEquals(value.get(), 5);
+ }
+
+ /** Tests that Promises get rejected if an AsyncFunction rejects. */
+ @Test
+ public void rejectOnAsyncReject() {
+ Value value = new Value();
+ Promise<Integer> promise = new Promise<>();
+ final Promise<Integer> inner = new Promise<>();
+
+ promise.then(unusedArg -> inner).then(PromiseTest.pass(), PromiseTest.setValue(value, 5));
+
+ promise.fulfill(0);
+
+ ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
+ assertEquals(value.get(), 0);
+
+ inner.reject();
+
+ ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
+ assertEquals(value.get(), 5);
+ }
+
+ /** Convenience method that returns a Callback that does nothing with its result. */
+ private static <T> Callback<T> pass() {
+ return unusedArg -> {};
+ }
+
+ /** Convenience method that returns a Function that just passes through its argument. */
+ private static <T> Function<T, T> identity() {
+ return argument -> argument;
+ }
+
+ /** Convenience method that returns a Callback that sets the given Value on execution. */
+ private static <T> Callback<T> setValue(final Value toSet, final int value) {
+ return unusedArg -> {
+ toSet.set(value);
+ };
+ }
+}
diff --git a/chromium/base/android/junit/src/org/chromium/base/TimeUtilsTest.java b/chromium/base/android/junit/src/org/chromium/base/TimeUtilsTest.java
new file mode 100644
index 00000000000..8ce45f2b6c0
--- /dev/null
+++ b/chromium/base/android/junit/src/org/chromium/base/TimeUtilsTest.java
@@ -0,0 +1,57 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base;
+
+import static junit.framework.Assert.assertEquals;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.annotation.Config;
+
+import org.chromium.base.TimeUtils.CurrentThreadTimeMillisTimer;
+import org.chromium.base.TimeUtils.ElapsedRealtimeMillisTimer;
+import org.chromium.base.TimeUtils.ElapsedRealtimeNanosTimer;
+import org.chromium.base.TimeUtils.UptimeMillisTimer;
+import org.chromium.base.test.BaseRobolectricTestRunner;
+
+/**
+ * Unit tests for {@link TimeUtils}.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+public class TimeUtilsTest {
+ @Rule
+ public FakeTimeTestRule mFakeTime = new FakeTimeTestRule();
+
+ @Test
+ @SmallTest
+ public void testTimers() {
+ UptimeMillisTimer uptimeTimer = new UptimeMillisTimer();
+ ElapsedRealtimeMillisTimer realtimeTimer = new ElapsedRealtimeMillisTimer();
+ ElapsedRealtimeNanosTimer realtimeTimerNanos = new ElapsedRealtimeNanosTimer();
+ CurrentThreadTimeMillisTimer threadTimeTimer = new CurrentThreadTimeMillisTimer();
+ mFakeTime.advanceMillis(1000);
+ assertEquals(1000, uptimeTimer.getElapsedMillis());
+ assertEquals(1000, realtimeTimer.getElapsedMillis());
+ assertEquals(
+ 1000 * TimeUtils.NANOSECONDS_PER_MILLISECOND, realtimeTimerNanos.getElapsedNanos());
+ assertEquals(1000, threadTimeTimer.getElapsedMillis());
+ mFakeTime.deepSleepMillis(1000);
+ assertEquals(1000, uptimeTimer.getElapsedMillis());
+ assertEquals(2000, realtimeTimer.getElapsedMillis());
+ assertEquals(
+ 2000 * TimeUtils.NANOSECONDS_PER_MILLISECOND, realtimeTimerNanos.getElapsedNanos());
+ assertEquals(1000, threadTimeTimer.getElapsedMillis());
+ mFakeTime.sleepMillis(1000);
+ assertEquals(2000, uptimeTimer.getElapsedMillis());
+ assertEquals(3000, realtimeTimer.getElapsedMillis());
+ assertEquals(
+ 3000 * TimeUtils.NANOSECONDS_PER_MILLISECOND, realtimeTimerNanos.getElapsedNanos());
+ assertEquals(1000, threadTimeTimer.getElapsedMillis());
+ }
+}
diff --git a/chromium/base/android/junit/src/org/chromium/base/TraceEventTest.java b/chromium/base/android/junit/src/org/chromium/base/TraceEventTest.java
new file mode 100644
index 00000000000..c62858402bd
--- /dev/null
+++ b/chromium/base/android/junit/src/org/chromium/base/TraceEventTest.java
@@ -0,0 +1,69 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.base.test.util.Feature;
+
+/**
+ * Tests for {@link TraceEvent}.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+public class TraceEventTest {
+ @Test
+ @SmallTest
+ @Feature({"Android-AppBase"})
+ public void testDisableEventNameFiltering() {
+ TraceEvent.setEventNameFilteringEnabled(false);
+ Assert.assertFalse(TraceEvent.eventNameFilteringEnabled());
+ }
+
+ @Test
+ @SmallTest
+ @Feature({"Android-AppBase"})
+ public void testEnableEventNameFiltering() {
+ TraceEvent.setEventNameFilteringEnabled(true);
+ Assert.assertTrue(TraceEvent.eventNameFilteringEnabled());
+ }
+
+ @Test
+ @SmallTest
+ @Feature({"Android-AppBase"})
+ public void testEventNameUnfiltered() {
+ TraceEvent.setEventNameFilteringEnabled(false);
+ Assert.assertFalse(TraceEvent.eventNameFilteringEnabled());
+
+ // Input string format:
+ // ">>>>> Finished to (TARGET) {HASH_CODE} TARGET_NAME: WHAT"
+ String realEventName = ">>>>> Finished to (org.chromium.myClass.myMethod) "
+ + "{HASH_CODE} org.chromium.myOtherClass.instance: message";
+
+ // Output string format:
+ // "{TraceEvent.BasicLooperMonitor.LOOPER_TASK_PREFIX} TARGET(TARGET_NAME)"
+ String realEventNameExpected = TraceEvent.BasicLooperMonitor.LOOPER_TASK_PREFIX
+ + "org.chromium.myClass.myMethod(org.chromium.myOtherClass.instance)";
+ Assert.assertEquals(TraceEvent.BasicLooperMonitor.getTraceEventName(realEventName),
+ realEventNameExpected);
+ }
+
+ @Test
+ @SmallTest
+ @Feature({"Android-AppBase"})
+ public void testEventNameFiltered() {
+ TraceEvent.setEventNameFilteringEnabled(true);
+ Assert.assertTrue(TraceEvent.eventNameFilteringEnabled());
+
+ String realEventName = TraceEvent.BasicLooperMonitor.LOOPER_TASK_PREFIX
+ + "org.chromium.myClass.myMethod(org.chromium.myOtherClass.instance)";
+ Assert.assertEquals(TraceEvent.BasicLooperMonitor.getTraceEventName(realEventName),
+ TraceEvent.BasicLooperMonitor.FILTERED_EVENT_NAME);
+ }
+} \ No newline at end of file
diff --git a/chromium/base/android/junit/src/org/chromium/base/UnownedUserDataHostTest.java b/chromium/base/android/junit/src/org/chromium/base/UnownedUserDataHostTest.java
new file mode 100644
index 00000000000..434cf655c9a
--- /dev/null
+++ b/chromium/base/android/junit/src/org/chromium/base/UnownedUserDataHostTest.java
@@ -0,0 +1,52 @@
+// Copyright 2020 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.annotation.Config;
+
+import org.chromium.base.test.BaseRobolectricTestRunner;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/**
+ * Test class for {@link UnownedUserDataHost}, which also describes typical usage.
+ *
+ * Most tests for this class is in {@link UnownedUserDataKeyTest}, since the public API is mostly
+ * available from {@link UnownedUserDataKey}.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+public class UnownedUserDataHostTest {
+ @Test
+ public void testDestruction() {
+ UnownedUserDataHost host = new UnownedUserDataHost();
+ host.destroy();
+ assertTrue(host.isDestroyed());
+ }
+
+ @Test
+ public void testUnpreparedLooper() throws InterruptedException {
+ AtomicBoolean illegalStateExceptionThrown = new AtomicBoolean();
+ Thread t = new Thread() {
+ @Override
+ public void run() {
+ try {
+ // The Looper on this thread is still unprepared, so this should fail.
+ new UnownedUserDataHost();
+ } catch (IllegalStateException e) {
+ illegalStateExceptionThrown.set(true);
+ }
+ }
+ };
+ t.start();
+ t.join();
+
+ assertTrue(illegalStateExceptionThrown.get());
+ }
+}
diff --git a/chromium/base/android/junit/src/org/chromium/base/UnownedUserDataKeyTest.java b/chromium/base/android/junit/src/org/chromium/base/UnownedUserDataKeyTest.java
new file mode 100644
index 00000000000..1dd1a6aefe6
--- /dev/null
+++ b/chromium/base/android/junit/src/org/chromium/base/UnownedUserDataKeyTest.java
@@ -0,0 +1,934 @@
+// Copyright 2020 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import android.os.Handler;
+import android.os.Looper;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.Shadows;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowLooper;
+
+import org.chromium.base.task.PostTask;
+import org.chromium.base.task.TaskTraits;
+import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.build.BuildConfig;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.FutureTask;
+
+/**
+ * Test class for {@link UnownedUserDataKey}, which also describes typical usage.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+public class UnownedUserDataKeyTest {
+ private static void forceGC() {
+ try {
+ // Run GC and finalizers a few times.
+ for (int i = 0; i < 10; ++i) {
+ System.gc();
+ System.runFinalization();
+ }
+ } catch (Exception e) {
+ // Do nothing.
+ }
+ }
+
+ private static class TestUnownedUserData implements UnownedUserData {
+ private List<UnownedUserDataHost> mDetachedHosts = new ArrayList<>();
+
+ public boolean informOnDetachment = true;
+
+ @Override
+ public void onDetachedFromHost(UnownedUserDataHost host) {
+ assertTrue("Should not detach when informOnDetachmentFromHost() return false.",
+ informOnDetachment);
+ mDetachedHosts.add(host);
+ }
+
+ @Override
+ public boolean informOnDetachmentFromHost() {
+ return informOnDetachment;
+ }
+
+ public void assertDetachedHostsMatch(UnownedUserDataHost... hosts) {
+ assertEquals(mDetachedHosts.size(), hosts.length);
+ assertArrayEquals(mDetachedHosts.toArray(), hosts);
+ }
+
+ /**
+ * Use this helper assert only when order of detachments can not be known, such as on
+ * invocations of {@link UnownedUserDataKey#detachFromAllHosts(UnownedUserData)}.
+ *
+ * @param hosts Which hosts it is required that the UnownedUserData has been detached from.
+ */
+ public void assertDetachedHostsMatchAnyOrder(UnownedUserDataHost... hosts) {
+ assertEquals(mDetachedHosts.size(), hosts.length);
+ for (UnownedUserDataHost host : hosts) {
+ assertTrue("Should have been detached from host", mDetachedHosts.contains(host));
+ }
+ }
+
+ public void assertNoDetachedHosts() {
+ assertDetachedHostsMatch();
+ }
+ }
+
+ private static class Foo extends TestUnownedUserData {
+ public static final UnownedUserDataKey<Foo> KEY = new UnownedUserDataKey<>(Foo.class);
+ }
+ private static class Bar extends TestUnownedUserData {
+ public static final UnownedUserDataKey<Bar> KEY = new UnownedUserDataKey<>(Bar.class);
+ }
+
+ private final Foo mFoo = new Foo();
+ private final Bar mBar = new Bar();
+
+ private UnownedUserDataHost mHost1;
+ private UnownedUserDataHost mHost2;
+
+ @Before
+ public void setUp() {
+ ShadowLooper.pauseMainLooper();
+ mHost1 = new UnownedUserDataHost(new Handler(Looper.getMainLooper()));
+ mHost2 = new UnownedUserDataHost(new Handler(Looper.getMainLooper()));
+ }
+
+ @After
+ public void tearDown() {
+ if (!mHost1.isDestroyed()) {
+ assertEquals(0, mHost1.getMapSize());
+ mHost1.destroy();
+ }
+ mHost1 = null;
+ if (!mHost2.isDestroyed()) {
+ assertEquals(0, mHost2.getMapSize());
+ mHost2.destroy();
+ }
+ mHost2 = null;
+ }
+
+ @Test
+ public void testKeyEquality() {
+ assertEquals(Foo.KEY, Foo.KEY);
+ assertNotEquals(Foo.KEY, new UnownedUserDataKey<>(Foo.class));
+ assertNotEquals(Foo.KEY, Bar.KEY);
+ assertNotEquals(Foo.KEY, null);
+ assertNotEquals(Foo.KEY, new Object());
+ assertNotEquals(Bar.KEY, new UnownedUserDataKey<>(Bar.class));
+ }
+
+ @Test
+ public void testSingleItemSingleHost_retrievalReturnsNullBeforeAttachment() {
+ assertFalse(Foo.KEY.isAttachedToHost(mHost1));
+ assertFalse(Foo.KEY.isAttachedToAnyHost(mFoo));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost1));
+ }
+
+ @Test
+ public void testSingleItemSingleHost_attachAndDetach() {
+ Foo.KEY.attachToHost(mHost1, mFoo);
+
+ assertTrue(Foo.KEY.isAttachedToHost(mHost1));
+ assertTrue(Foo.KEY.isAttachedToAnyHost(mFoo));
+ assertEquals(mFoo, Foo.KEY.retrieveDataFromHost(mHost1));
+
+ Foo.KEY.detachFromHost(mHost1);
+ runUntilIdle();
+
+ mFoo.assertDetachedHostsMatch(mHost1);
+ assertFalse(Foo.KEY.isAttachedToHost(mHost1));
+ assertFalse(Foo.KEY.isAttachedToAnyHost(mFoo));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost1));
+ }
+
+ @Test
+ public void testSingleItemSingleHost_attachAndGarbageCollectionReturnsNull() {
+ Foo foo = new Foo();
+ Foo.KEY.attachToHost(mHost1, foo);
+
+ // Intentionally null out `foo` to make it eligible for garbage collection.
+ foo = null;
+ forceGC();
+ runUntilIdle();
+
+ assertFalse(Foo.KEY.isAttachedToHost(mHost1));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost1));
+
+ // NOTE: We can not verify anything using the `foo` variable here, since it has been
+ // garbage collected.
+ }
+
+ @Test
+ public void testSingleItemSingleHost_attachAndDetachFromAllHosts() {
+ Foo.KEY.attachToHost(mHost1, mFoo);
+ Foo.KEY.detachFromAllHosts(mFoo);
+ runUntilIdle();
+
+ mFoo.assertDetachedHostsMatch(mHost1);
+ assertFalse(Foo.KEY.isAttachedToHost(mHost1));
+ assertFalse(Foo.KEY.isAttachedToAnyHost(mFoo));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost1));
+ }
+
+ @Test
+ public void testSingleItemSingleHost_attachAndDetachDetachmentCallbackIsPosted() {
+ Foo.KEY.attachToHost(mHost1, mFoo);
+ Foo.KEY.detachFromHost(mHost1);
+ mFoo.assertNoDetachedHosts();
+
+ runUntilIdle();
+
+ mFoo.assertDetachedHostsMatch(mHost1);
+ }
+
+ @Test
+ public void testSingleItemSingleHost_attachAndDetachNoDetachmentCallback() {
+ mFoo.informOnDetachment = false;
+ Foo.KEY.attachToHost(mHost1, mFoo);
+ Foo.KEY.detachFromHost(mHost1);
+ runUntilIdle();
+
+ assertFalse(Foo.KEY.isAttachedToHost(mHost1));
+ assertFalse(Foo.KEY.isAttachedToAnyHost(mFoo));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost1));
+ }
+
+ @Test
+ public void testSingleItemSingleHost_attachAndDetachFromAllHostsNoDetachmentCallback() {
+ mFoo.informOnDetachment = false;
+ Foo.KEY.attachToHost(mHost1, mFoo);
+ Foo.KEY.detachFromAllHosts(mFoo);
+ runUntilIdle();
+
+ assertFalse(Foo.KEY.isAttachedToHost(mHost1));
+ assertFalse(Foo.KEY.isAttachedToAnyHost(mFoo));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost1));
+ }
+
+ @Test
+ public void testSingleItemSingleHost_differentKeys() {
+ UnownedUserDataKey<Foo> extraKey = new UnownedUserDataKey<>(Foo.class);
+ UnownedUserDataKey<Foo> anotherExtraKey = new UnownedUserDataKey<>(Foo.class);
+
+ Foo.KEY.attachToHost(mHost1, mFoo);
+ extraKey.attachToHost(mHost1, mFoo);
+ anotherExtraKey.attachToHost(mHost1, mFoo);
+ runUntilIdle();
+
+ mFoo.assertNoDetachedHosts();
+ assertTrue(Foo.KEY.isAttachedToHost(mHost1));
+ assertTrue(Foo.KEY.isAttachedToAnyHost(mFoo));
+ assertEquals(mFoo, Foo.KEY.retrieveDataFromHost(mHost1));
+ assertTrue(extraKey.isAttachedToHost(mHost1));
+ assertTrue(extraKey.isAttachedToAnyHost(mFoo));
+ assertEquals(mFoo, extraKey.retrieveDataFromHost(mHost1));
+ assertTrue(anotherExtraKey.isAttachedToHost(mHost1));
+ assertTrue(anotherExtraKey.isAttachedToAnyHost(mFoo));
+ assertEquals(mFoo, anotherExtraKey.retrieveDataFromHost(mHost1));
+
+ Foo.KEY.detachFromHost(mHost1);
+ runUntilIdle();
+
+ mFoo.assertDetachedHostsMatch(mHost1);
+ assertFalse(Foo.KEY.isAttachedToHost(mHost1));
+ assertFalse(Foo.KEY.isAttachedToAnyHost(mFoo));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost1));
+ assertTrue(extraKey.isAttachedToHost(mHost1));
+ assertTrue(extraKey.isAttachedToAnyHost(mFoo));
+ assertEquals(mFoo, extraKey.retrieveDataFromHost(mHost1));
+ assertTrue(anotherExtraKey.isAttachedToHost(mHost1));
+ assertTrue(anotherExtraKey.isAttachedToAnyHost(mFoo));
+ assertEquals(mFoo, anotherExtraKey.retrieveDataFromHost(mHost1));
+
+ extraKey.detachFromAllHosts(mFoo);
+ runUntilIdle();
+
+ mFoo.assertDetachedHostsMatch(mHost1, mHost1);
+ assertFalse(Foo.KEY.isAttachedToHost(mHost1));
+ assertFalse(Foo.KEY.isAttachedToAnyHost(mFoo));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost1));
+ assertFalse(extraKey.isAttachedToHost(mHost1));
+ assertFalse(extraKey.isAttachedToAnyHost(mFoo));
+ assertNull(extraKey.retrieveDataFromHost(mHost1));
+ assertTrue(anotherExtraKey.isAttachedToHost(mHost1));
+ assertTrue(anotherExtraKey.isAttachedToAnyHost(mFoo));
+ assertEquals(mFoo, anotherExtraKey.retrieveDataFromHost(mHost1));
+
+ anotherExtraKey.detachFromHost(mHost1);
+ runUntilIdle();
+
+ mFoo.assertDetachedHostsMatch(mHost1, mHost1, mHost1);
+ assertFalse(Foo.KEY.isAttachedToHost(mHost1));
+ assertFalse(Foo.KEY.isAttachedToAnyHost(mFoo));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost1));
+ assertFalse(extraKey.isAttachedToHost(mHost1));
+ assertFalse(extraKey.isAttachedToAnyHost(mFoo));
+ assertNull(extraKey.retrieveDataFromHost(mHost1));
+ assertFalse(anotherExtraKey.isAttachedToHost(mHost1));
+ assertFalse(anotherExtraKey.isAttachedToAnyHost(mFoo));
+ assertNull(anotherExtraKey.retrieveDataFromHost(mHost1));
+ }
+
+ @Test
+ public void testSingleItemSingleHost_doubleAttachSingleDetach() {
+ Foo.KEY.attachToHost(mHost1, mFoo);
+ Foo.KEY.attachToHost(mHost1, mFoo);
+ runUntilIdle();
+
+ // Attaching using the same key and object, so no detachment should have happened.
+ mFoo.assertNoDetachedHosts();
+ assertTrue(Foo.KEY.isAttachedToHost(mHost1));
+ assertTrue(Foo.KEY.isAttachedToAnyHost(mFoo));
+ assertEquals(mFoo, Foo.KEY.retrieveDataFromHost(mHost1));
+
+ Foo.KEY.detachFromHost(mHost1);
+ runUntilIdle();
+
+ mFoo.assertDetachedHostsMatch(mHost1);
+ assertFalse(Foo.KEY.isAttachedToHost(mHost1));
+ assertFalse(Foo.KEY.isAttachedToAnyHost(mFoo));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost1));
+ }
+
+ @Test
+ public void testSingleItemSingleHost_doubleAttachDetachFromAllHosts() {
+ Foo.KEY.attachToHost(mHost1, mFoo);
+ Foo.KEY.attachToHost(mHost1, mFoo);
+ runUntilIdle();
+
+ // Attaching using the same key and object, so no detachment should have happened.
+ mFoo.assertNoDetachedHosts();
+ assertTrue(Foo.KEY.isAttachedToHost(mHost1));
+ assertTrue(Foo.KEY.isAttachedToAnyHost(mFoo));
+ assertEquals(mFoo, Foo.KEY.retrieveDataFromHost(mHost1));
+
+ Foo.KEY.detachFromAllHosts(mFoo);
+ runUntilIdle();
+
+ mFoo.assertDetachedHostsMatch(mHost1);
+ assertFalse(Foo.KEY.isAttachedToHost(mHost1));
+ assertFalse(Foo.KEY.isAttachedToAnyHost(mFoo));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost1));
+ }
+
+ @Test
+ public void testSingleItemSingleHost_doubleDetachIsIgnored() {
+ Foo.KEY.attachToHost(mHost1, mFoo);
+ Foo.KEY.detachFromHost(mHost1);
+ runUntilIdle();
+
+ mFoo.assertDetachedHostsMatch(mHost1);
+ assertFalse(Foo.KEY.isAttachedToHost(mHost1));
+ assertFalse(Foo.KEY.isAttachedToAnyHost(mFoo));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost1));
+
+ Foo.KEY.detachFromHost(mHost1);
+ runUntilIdle();
+
+ mFoo.assertDetachedHostsMatch(mHost1);
+ assertFalse(Foo.KEY.isAttachedToHost(mHost1));
+ assertFalse(Foo.KEY.isAttachedToAnyHost(mFoo));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost1));
+ }
+
+ @Test
+ public void testSingleItemSingleHost_doubleDetachFromAllHostsIsIgnored() {
+ Foo.KEY.attachToHost(mHost1, mFoo);
+ Foo.KEY.detachFromAllHosts(mFoo);
+ runUntilIdle();
+
+ mFoo.assertDetachedHostsMatch(mHost1);
+ assertFalse(Foo.KEY.isAttachedToHost(mHost1));
+ assertFalse(Foo.KEY.isAttachedToAnyHost(mFoo));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost1));
+
+ Foo.KEY.detachFromAllHosts(mFoo);
+ runUntilIdle();
+
+ mFoo.assertDetachedHostsMatch(mHost1);
+ assertFalse(Foo.KEY.isAttachedToHost(mHost1));
+ assertFalse(Foo.KEY.isAttachedToAnyHost(mFoo));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost1));
+ }
+
+ @Test
+ public void testSingleItemMulitpleHosts_attachAndDetach() {
+ Foo.KEY.attachToHost(mHost1, mFoo);
+ Foo.KEY.attachToHost(mHost2, mFoo);
+ runUntilIdle();
+
+ mFoo.assertNoDetachedHosts();
+ assertTrue(Foo.KEY.isAttachedToHost(mHost1));
+ assertTrue(Foo.KEY.isAttachedToHost(mHost2));
+ assertTrue(Foo.KEY.isAttachedToAnyHost(mFoo));
+ assertEquals(mFoo, Foo.KEY.retrieveDataFromHost(mHost1));
+ assertEquals(mFoo, Foo.KEY.retrieveDataFromHost(mHost2));
+
+ Foo.KEY.detachFromHost(mHost1);
+ runUntilIdle();
+
+ mFoo.assertDetachedHostsMatch(mHost1);
+ assertFalse(Foo.KEY.isAttachedToHost(mHost1));
+ assertTrue(Foo.KEY.isAttachedToHost(mHost2));
+ assertTrue(Foo.KEY.isAttachedToAnyHost(mFoo));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost1));
+ assertEquals(mFoo, Foo.KEY.retrieveDataFromHost(mHost2));
+
+ Foo.KEY.detachFromHost(mHost2);
+ runUntilIdle();
+
+ mFoo.assertDetachedHostsMatch(mHost1, mHost2);
+ assertFalse(Foo.KEY.isAttachedToHost(mHost1));
+ assertFalse(Foo.KEY.isAttachedToHost(mHost2));
+ assertFalse(Foo.KEY.isAttachedToAnyHost(mFoo));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost1));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost2));
+ }
+
+ @Test
+ public void testSingleItemMultipleHosts_attachAndMultipleDetachesAreIgnored() {
+ Foo.KEY.attachToHost(mHost1, mFoo);
+ Foo.KEY.attachToHost(mHost2, mFoo);
+ Foo.KEY.detachFromHost(mHost1);
+ Foo.KEY.detachFromHost(mHost1);
+ runUntilIdle();
+
+ mFoo.assertDetachedHostsMatch(mHost1);
+ assertFalse(Foo.KEY.isAttachedToHost(mHost1));
+ assertTrue(Foo.KEY.isAttachedToHost(mHost2));
+ assertTrue(Foo.KEY.isAttachedToAnyHost(mFoo));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost1));
+ assertEquals(mFoo, Foo.KEY.retrieveDataFromHost(mHost2));
+
+ Foo.KEY.detachFromHost(mHost2);
+ runUntilIdle();
+
+ mFoo.assertDetachedHostsMatch(mHost1, mHost2);
+ assertFalse(Foo.KEY.isAttachedToHost(mHost1));
+ assertFalse(Foo.KEY.isAttachedToHost(mHost2));
+ assertFalse(Foo.KEY.isAttachedToAnyHost(mFoo));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost1));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost2));
+
+ Foo.KEY.detachFromHost(mHost2);
+ runUntilIdle();
+
+ mFoo.assertDetachedHostsMatch(mHost1, mHost2);
+ assertFalse(Foo.KEY.isAttachedToHost(mHost1));
+ assertFalse(Foo.KEY.isAttachedToHost(mHost2));
+ assertFalse(Foo.KEY.isAttachedToAnyHost(mFoo));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost1));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost2));
+ }
+
+ @Test
+ public void testSingleItemMultipleHosts_attachAndDetachFromAllHosts() {
+ Foo.KEY.attachToHost(mHost1, mFoo);
+ Foo.KEY.attachToHost(mHost2, mFoo);
+ Foo.KEY.detachFromAllHosts(mFoo);
+ runUntilIdle();
+
+ mFoo.assertDetachedHostsMatchAnyOrder(mHost1, mHost2);
+ assertFalse(Foo.KEY.isAttachedToHost(mHost1));
+ assertFalse(Foo.KEY.isAttachedToHost(mHost2));
+ assertFalse(Foo.KEY.isAttachedToAnyHost(mFoo));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost1));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost2));
+ }
+
+ @Test
+ public void testSingleItemMultipleHosts_attachAndDoubleDetachFromAllHostsIsIgnored() {
+ Foo.KEY.attachToHost(mHost1, mFoo);
+ Foo.KEY.attachToHost(mHost2, mFoo);
+ Foo.KEY.detachFromAllHosts(mFoo);
+ Foo.KEY.detachFromAllHosts(mFoo);
+ runUntilIdle();
+
+ mFoo.assertDetachedHostsMatchAnyOrder(mHost1, mHost2);
+ assertFalse(Foo.KEY.isAttachedToHost(mHost1));
+ assertFalse(Foo.KEY.isAttachedToHost(mHost2));
+ assertFalse(Foo.KEY.isAttachedToAnyHost(mFoo));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost1));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost2));
+ }
+
+ @Test
+ public void testSingleItemMultipleHosts_attachAndDetachInSequence() {
+ Foo.KEY.attachToHost(mHost1, mFoo);
+ Foo.KEY.detachFromHost(mHost1);
+ Foo.KEY.attachToHost(mHost2, mFoo);
+ runUntilIdle();
+
+ mFoo.assertDetachedHostsMatch(mHost1);
+ assertFalse(Foo.KEY.isAttachedToHost(mHost1));
+ assertTrue(Foo.KEY.isAttachedToHost(mHost2));
+ assertTrue(Foo.KEY.isAttachedToAnyHost(mFoo));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost1));
+ assertEquals(mFoo, Foo.KEY.retrieveDataFromHost(mHost2));
+
+ Foo.KEY.detachFromHost(mHost2);
+ runUntilIdle();
+
+ mFoo.assertDetachedHostsMatch(mHost1, mHost2);
+ assertFalse(Foo.KEY.isAttachedToHost(mHost1));
+ assertFalse(Foo.KEY.isAttachedToHost(mHost2));
+ assertFalse(Foo.KEY.isAttachedToAnyHost(mFoo));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost1));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost2));
+ }
+
+ @Test
+ public void testSingleItemMultipleHosts_attachAndDetachFromAllHostsInSequence() {
+ Foo.KEY.attachToHost(mHost1, mFoo);
+ Foo.KEY.detachFromAllHosts(mFoo);
+ Foo.KEY.attachToHost(mHost2, mFoo);
+ runUntilIdle();
+
+ mFoo.assertDetachedHostsMatch(mHost1);
+ assertFalse(Foo.KEY.isAttachedToHost(mHost1));
+ assertTrue(Foo.KEY.isAttachedToHost(mHost2));
+ assertTrue(Foo.KEY.isAttachedToAnyHost(mFoo));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost1));
+ assertEquals(mFoo, Foo.KEY.retrieveDataFromHost(mHost2));
+
+ Foo.KEY.detachFromAllHosts(mFoo);
+ runUntilIdle();
+
+ mFoo.assertDetachedHostsMatch(mHost1, mHost2);
+ assertFalse(Foo.KEY.isAttachedToHost(mHost1));
+ assertFalse(Foo.KEY.isAttachedToHost(mHost2));
+ assertFalse(Foo.KEY.isAttachedToAnyHost(mFoo));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost1));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost2));
+ }
+
+ @Test
+ public void testTwoSimilarItemsSingleHost_attachAndDetach() {
+ Foo foo1 = new Foo();
+ Foo foo2 = new Foo();
+
+ Foo.KEY.attachToHost(mHost1, foo1);
+ runUntilIdle();
+
+ foo1.assertNoDetachedHosts();
+ foo2.assertNoDetachedHosts();
+ assertTrue(Foo.KEY.isAttachedToHost(mHost1));
+ assertTrue(Foo.KEY.isAttachedToAnyHost(foo1));
+ assertFalse(Foo.KEY.isAttachedToAnyHost(foo2));
+ assertEquals(foo1, Foo.KEY.retrieveDataFromHost(mHost1));
+
+ Foo.KEY.attachToHost(mHost1, foo2);
+ runUntilIdle();
+
+ foo1.assertDetachedHostsMatch(mHost1);
+ foo2.assertNoDetachedHosts();
+ assertTrue(Foo.KEY.isAttachedToHost(mHost1));
+ assertFalse(Foo.KEY.isAttachedToAnyHost(foo1));
+ assertTrue(Foo.KEY.isAttachedToAnyHost(foo2));
+ assertEquals(foo2, Foo.KEY.retrieveDataFromHost(mHost1));
+
+ Foo.KEY.detachFromHost(mHost1);
+ runUntilIdle();
+
+ foo1.assertDetachedHostsMatch(mHost1);
+ foo2.assertDetachedHostsMatch(mHost1);
+ assertFalse(Foo.KEY.isAttachedToHost(mHost1));
+ assertFalse(Foo.KEY.isAttachedToAnyHost(foo1));
+ assertFalse(Foo.KEY.isAttachedToAnyHost(foo2));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost1));
+ }
+
+ @Test
+ public void testTwoSimilarItemsSingleHost_attachAndDetachInSequence() {
+ Foo foo1 = new Foo();
+ Foo foo2 = new Foo();
+
+ Foo.KEY.attachToHost(mHost1, foo1);
+ runUntilIdle();
+
+ foo1.assertNoDetachedHosts();
+ foo2.assertNoDetachedHosts();
+ assertTrue(Foo.KEY.isAttachedToHost(mHost1));
+ assertTrue(Foo.KEY.isAttachedToAnyHost(foo1));
+ assertFalse(Foo.KEY.isAttachedToAnyHost(foo2));
+ assertEquals(foo1, Foo.KEY.retrieveDataFromHost(mHost1));
+
+ Foo.KEY.detachFromHost(mHost1);
+ runUntilIdle();
+
+ foo1.assertDetachedHostsMatch(mHost1);
+ foo2.assertNoDetachedHosts();
+ assertFalse(Foo.KEY.isAttachedToHost(mHost1));
+ assertFalse(Foo.KEY.isAttachedToAnyHost(foo1));
+ assertFalse(Foo.KEY.isAttachedToAnyHost(foo2));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost1));
+
+ Foo.KEY.attachToHost(mHost1, foo2);
+ runUntilIdle();
+
+ foo1.assertDetachedHostsMatch(mHost1);
+ foo2.assertNoDetachedHosts();
+ assertTrue(Foo.KEY.isAttachedToHost(mHost1));
+ assertFalse(Foo.KEY.isAttachedToAnyHost(foo1));
+ assertTrue(Foo.KEY.isAttachedToAnyHost(foo2));
+ assertEquals(foo2, Foo.KEY.retrieveDataFromHost(mHost1));
+
+ Foo.KEY.detachFromHost(mHost1);
+ runUntilIdle();
+
+ foo1.assertDetachedHostsMatch(mHost1);
+ foo2.assertDetachedHostsMatch(mHost1);
+ assertFalse(Foo.KEY.isAttachedToHost(mHost1));
+ assertFalse(Foo.KEY.isAttachedToAnyHost(foo1));
+ assertFalse(Foo.KEY.isAttachedToAnyHost(foo2));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost1));
+ }
+
+ @Test
+ public void testTwoSimilarItemsSingleHost_attachAndGarbageColletionReturnsNull() {
+ Foo foo1 = new Foo();
+ Foo foo2 = new Foo();
+
+ Foo.KEY.attachToHost(mHost1, foo1);
+ Foo.KEY.attachToHost(mHost1, foo2);
+
+ // Intentionally null out `foo1` to make it eligible for garbage collection.
+ foo1 = null;
+ forceGC();
+ runUntilIdle();
+
+ assertTrue(Foo.KEY.isAttachedToHost(mHost1));
+ assertTrue(Foo.KEY.isAttachedToAnyHost(foo2));
+ assertEquals(foo2, Foo.KEY.retrieveDataFromHost(mHost1));
+
+ // NOTE: We can not verify anything using the `foo1` variable here, since it has been
+ // garbage collected.
+
+ // Intentionally null out `foo2` to make it eligible for garbage collection.
+ foo2 = null;
+ forceGC();
+ runUntilIdle();
+
+ assertFalse(Foo.KEY.isAttachedToHost(mHost1));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost1));
+
+ // NOTE: We can not verify anything using the `foo2` variable here, since it has been
+ // garbage collected.
+ }
+
+ @Test
+ public void testTwoSimilarItemsMultipleHosts_destroyOnlyDetachesFromOneHost() {
+ Foo foo1 = new Foo();
+ Foo foo2 = new Foo();
+
+ Foo.KEY.attachToHost(mHost1, foo1);
+ Foo.KEY.attachToHost(mHost1, foo2);
+ Foo.KEY.attachToHost(mHost2, foo2);
+ Foo.KEY.attachToHost(mHost2, foo1);
+ runUntilIdle();
+
+ foo1.assertDetachedHostsMatch(mHost1);
+ foo2.assertDetachedHostsMatch(mHost2);
+ assertEquals(foo2, Foo.KEY.retrieveDataFromHost(mHost1));
+ assertEquals(foo1, Foo.KEY.retrieveDataFromHost(mHost2));
+
+ mHost1.destroy();
+ runUntilIdle();
+
+ foo1.assertDetachedHostsMatch(mHost1);
+ foo2.assertDetachedHostsMatch(mHost2, mHost1);
+ assertTrue(mHost1.isDestroyed());
+ assertFalse(Foo.KEY.isAttachedToHost(mHost1));
+ assertTrue(Foo.KEY.isAttachedToHost(mHost2));
+ assertEquals(foo1, Foo.KEY.retrieveDataFromHost(mHost2));
+
+ mHost2.destroy();
+ runUntilIdle();
+
+ foo1.assertDetachedHostsMatch(mHost1, mHost2);
+ foo2.assertDetachedHostsMatch(mHost2, mHost1);
+ assertTrue(mHost2.isDestroyed());
+ assertFalse(Foo.KEY.isAttachedToHost(mHost1));
+ assertFalse(Foo.KEY.isAttachedToHost(mHost2));
+ }
+
+ @Test
+ public void
+ testTwoSimilarItemsMultipleHosts_destroyShouldOnlyRemoveFromCurrentHostWithMultipleKeys() {
+ Foo foo1 = new Foo();
+ Foo foo2 = new Foo();
+
+ UnownedUserDataKey<Foo> foo1key = new UnownedUserDataKey<>(Foo.class);
+ UnownedUserDataKey<Foo> foo2key = new UnownedUserDataKey<>(Foo.class);
+
+ foo1key.attachToHost(mHost1, foo1);
+ foo2key.attachToHost(mHost1, foo2);
+ runUntilIdle();
+
+ foo1.assertNoDetachedHosts();
+ foo2.assertNoDetachedHosts();
+ assertTrue(foo1key.isAttachedToHost(mHost1));
+ assertTrue(foo2key.isAttachedToHost(mHost1));
+ assertTrue(foo1key.isAttachedToAnyHost(foo1));
+ assertTrue(foo2key.isAttachedToAnyHost(foo2));
+ assertEquals(foo1, foo1key.retrieveDataFromHost(mHost1));
+ assertEquals(foo2, foo2key.retrieveDataFromHost(mHost1));
+
+ // Since `foo1` is attached through `foo1key` and `foo2` is attached through `foo2key`, it
+ // should not be possible to look up whether an object not attached through is own key is
+ // attached to any host.
+ assertFalse(foo1key.isAttachedToAnyHost(foo2));
+ assertFalse(foo2key.isAttachedToAnyHost(foo1));
+
+ foo1key.attachToHost(mHost2, foo1);
+ foo2key.attachToHost(mHost2, foo2);
+ runUntilIdle();
+
+ foo1.assertNoDetachedHosts();
+ foo2.assertNoDetachedHosts();
+ assertEquals(foo1, foo1key.retrieveDataFromHost(mHost2));
+ assertEquals(foo2, foo2key.retrieveDataFromHost(mHost2));
+
+ mHost1.destroy();
+ runUntilIdle();
+
+ foo1.assertDetachedHostsMatch(mHost1);
+ foo2.assertDetachedHostsMatch(mHost1);
+ assertTrue(mHost1.isDestroyed());
+ assertFalse(foo1key.isAttachedToHost(mHost1));
+ assertFalse(foo2key.isAttachedToHost(mHost1));
+ assertTrue(foo1key.isAttachedToHost(mHost2));
+ assertTrue(foo2key.isAttachedToHost(mHost2));
+
+ mHost2.destroy();
+ runUntilIdle();
+
+ foo1.assertDetachedHostsMatch(mHost1, mHost2);
+ foo2.assertDetachedHostsMatch(mHost1, mHost2);
+ assertTrue(mHost2.isDestroyed());
+ assertFalse(foo1key.isAttachedToHost(mHost1));
+ assertFalse(foo2key.isAttachedToHost(mHost1));
+ assertFalse(foo1key.isAttachedToHost(mHost2));
+ assertFalse(foo2key.isAttachedToHost(mHost2));
+ }
+
+ @Test
+ public void testTwoDifferentItemsSingleHost_attachAndDetach() {
+ Foo.KEY.attachToHost(mHost1, mFoo);
+ Bar.KEY.attachToHost(mHost1, mBar);
+ runUntilIdle();
+
+ mFoo.assertNoDetachedHosts();
+ mBar.assertNoDetachedHosts();
+ assertTrue(Bar.KEY.isAttachedToHost(mHost1));
+ assertTrue(Bar.KEY.isAttachedToAnyHost(mBar));
+ assertEquals(mBar, Bar.KEY.retrieveDataFromHost(mHost1));
+
+ Foo.KEY.detachFromHost(mHost1);
+ runUntilIdle();
+
+ mFoo.assertDetachedHostsMatch(mHost1);
+ mBar.assertNoDetachedHosts();
+ assertFalse(Foo.KEY.isAttachedToHost(mHost1));
+ assertFalse(Foo.KEY.isAttachedToAnyHost(mFoo));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost1));
+
+ Bar.KEY.detachFromHost(mHost1);
+ runUntilIdle();
+
+ mFoo.assertDetachedHostsMatch(mHost1);
+ mBar.assertDetachedHostsMatch(mHost1);
+ assertFalse(Bar.KEY.isAttachedToHost(mHost1));
+ assertFalse(Bar.KEY.isAttachedToAnyHost(mBar));
+ assertNull(Bar.KEY.retrieveDataFromHost(mHost1));
+ }
+
+ @Test
+ public void testTwoDifferentItemsSingleHost_attachAndGarbageCollectionReturnsNull() {
+ Foo foo = new Foo();
+ Bar bar = new Bar();
+
+ Foo.KEY.attachToHost(mHost1, foo);
+ Bar.KEY.attachToHost(mHost1, bar);
+ runUntilIdle();
+
+ foo.assertNoDetachedHosts();
+ bar.assertNoDetachedHosts();
+ assertTrue(Foo.KEY.isAttachedToHost(mHost1));
+ assertTrue(Foo.KEY.isAttachedToAnyHost(foo));
+ assertEquals(foo, Foo.KEY.retrieveDataFromHost(mHost1));
+ assertTrue(Bar.KEY.isAttachedToHost(mHost1));
+ assertTrue(Bar.KEY.isAttachedToAnyHost(bar));
+ assertEquals(bar, Bar.KEY.retrieveDataFromHost(mHost1));
+
+ // Intentionally null out `foo` to make it eligible for garbage collection.
+ foo = null;
+ forceGC();
+ runUntilIdle();
+
+ bar.assertNoDetachedHosts();
+ assertFalse(Foo.KEY.isAttachedToHost(mHost1));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost1));
+ assertTrue(Bar.KEY.isAttachedToHost(mHost1));
+ assertTrue(Bar.KEY.isAttachedToAnyHost(bar));
+ assertEquals(bar, Bar.KEY.retrieveDataFromHost(mHost1));
+
+ // NOTE: We can not verify anything using the `foo` variable here, since it has been
+ // garbage collected.
+
+ // Intentionally null out `bar` to make it eligible for garbage collection.
+ bar = null;
+ forceGC();
+ runUntilIdle();
+
+ assertFalse(Foo.KEY.isAttachedToHost(mHost1));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost1));
+ assertFalse(Bar.KEY.isAttachedToHost(mHost1));
+ assertNull(Bar.KEY.retrieveDataFromHost(mHost1));
+
+ // NOTE: We can not verify anything using the `bar` variable here, since it has been
+ // garbage collected.
+ }
+
+ @Test
+ public void testTwoDifferentItemsSingleHost_destroyWithMultipleEntriesLeft() {
+ Foo.KEY.attachToHost(mHost1, mFoo);
+ Bar.KEY.attachToHost(mHost1, mBar);
+
+ // Since destruction happens by iterating over all entries and letting themselves detach
+ // which results in removing themselves from the map, ensure that there are no issues with
+ // concurrent modifications during the iteration over the map.
+ mHost1.destroy();
+ runUntilIdle();
+
+ mFoo.assertDetachedHostsMatch(mHost1);
+ mBar.assertDetachedHostsMatch(mHost1);
+ assertTrue(mHost1.isDestroyed());
+ assertFalse(Foo.KEY.isAttachedToHost(mHost1));
+ assertFalse(Foo.KEY.isAttachedToAnyHost(mFoo));
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost1));
+ assertFalse(Bar.KEY.isAttachedToHost(mHost1));
+ assertFalse(Bar.KEY.isAttachedToAnyHost(mBar));
+ assertNull(Bar.KEY.retrieveDataFromHost(mHost1));
+ }
+
+ @Test
+ public void testSingleThreadPolicy() throws Exception {
+ Foo.KEY.attachToHost(mHost1, mFoo);
+
+ FutureTask<Void> getTask = new FutureTask<>(
+ () -> assertAsserts(() -> Foo.KEY.retrieveDataFromHost(mHost1)), null);
+ PostTask.postTask(TaskTraits.USER_VISIBLE, getTask);
+ getTask.get();
+
+ // Manual cleanup to ensure we can verify host map size during tear down.
+ Foo.KEY.detachFromAllHosts(mFoo);
+ }
+
+ @Test
+ public void testNullKeyOrDataShouldBeDisallowed() {
+ assertThrows(NullPointerException.class, () -> Foo.KEY.attachToHost(null, null));
+ assertThrows(NullPointerException.class, () -> Foo.KEY.attachToHost(mHost1, null));
+ assertThrows(NullPointerException.class, () -> Foo.KEY.attachToHost(null, mFoo));
+
+ // Need a non-empty registry to avoid no-op.
+ Foo.KEY.attachToHost(mHost1, mFoo);
+ assertThrows(NullPointerException.class, () -> Foo.KEY.retrieveDataFromHost(null));
+
+ assertThrows(NullPointerException.class, () -> Foo.KEY.detachFromHost(null));
+ assertThrows(NullPointerException.class, () -> Foo.KEY.detachFromAllHosts(null));
+ Foo.KEY.detachFromAllHosts(mFoo);
+ }
+
+ @Test
+ public void testHost_operationsDisallowedAfterDestroy() {
+ Foo.KEY.attachToHost(mHost1, mFoo);
+
+ mHost1.destroy();
+ runUntilIdle();
+
+ mFoo.assertDetachedHostsMatch(mHost1);
+ assertTrue(mHost1.isDestroyed());
+
+ assertThrows(AssertionError.class, () -> Foo.KEY.attachToHost(mHost1, mFoo));
+
+ // The following operation gracefully returns null.
+ assertNull(Foo.KEY.retrieveDataFromHost(mHost1));
+
+ // The following operations gracefully ignores the invocation.
+ Foo.KEY.detachFromHost(mHost1);
+ Foo.KEY.detachFromAllHosts(mFoo);
+ runUntilIdle();
+
+ mFoo.assertDetachedHostsMatch(mHost1);
+ }
+
+ @Test
+ public void testHost_garbageCollection() {
+ UnownedUserDataHost extraHost =
+ new UnownedUserDataHost(new Handler(Looper.getMainLooper()));
+
+ Foo.KEY.attachToHost(mHost1, mFoo);
+ Foo.KEY.attachToHost(extraHost, mFoo);
+
+ // Intentionally null out `host` to make it eligible for garbage collection.
+ extraHost = null;
+ forceGC();
+
+ // Should not fail to retrieve the object.
+ assertTrue(Foo.KEY.isAttachedToHost(mHost1));
+ assertEquals(mFoo, Foo.KEY.retrieveDataFromHost(mHost1));
+ // There should now only be 1 host attachment left after the retrieval.
+ assertEquals(1, Foo.KEY.getHostAttachmentCount(mFoo));
+
+ // NOTE: We can not verify anything using the `extraHost` variable here, since it has been
+ // garbage collected.
+
+ // Manual cleanup to ensure we can verify host map size during tear down.
+ Foo.KEY.detachFromAllHosts(mFoo);
+ }
+
+ private <E extends Throwable> void assertThrows(Class<E> exceptionType, Runnable runnable) {
+ Throwable actualException = null;
+ try {
+ runnable.run();
+ } catch (Throwable e) {
+ actualException = e;
+ }
+ assertNotNull("Exception not thrown", actualException);
+ assertEquals(exceptionType, actualException.getClass());
+ }
+
+ private void assertAsserts(Runnable runnable) {
+ // When DCHECK is off, asserts are stripped.
+ if (!BuildConfig.ENABLE_ASSERTS) return;
+
+ try {
+ runnable.run();
+ throw new RuntimeException("Assertion should fail.");
+ } catch (AssertionError e) {
+ // Ignore. We expect this to happen.
+ }
+ }
+
+ private static void runUntilIdle() {
+ Shadows.shadowOf(Looper.getMainLooper()).idle();
+ }
+}
diff --git a/chromium/base/android/junit/src/org/chromium/base/jank_tracker/FrameMetricsListenerTest.java b/chromium/base/android/junit/src/org/chromium/base/jank_tracker/FrameMetricsListenerTest.java
new file mode 100644
index 00000000000..c8c27d44e8c
--- /dev/null
+++ b/chromium/base/android/junit/src/org/chromium/base/jank_tracker/FrameMetricsListenerTest.java
@@ -0,0 +1,59 @@
+// Copyright 2021 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.jank_tracker;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
+
+import android.view.FrameMetrics;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.annotation.Config;
+
+import org.chromium.base.test.BaseRobolectricTestRunner;
+
+/**
+ * Tests for FrameMetricsListener.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+public class FrameMetricsListenerTest {
+ @Test
+ public void testMetricRecording_OffByDefault() {
+ FrameMetricsStore store = new FrameMetricsStore();
+ FrameMetricsListener metricsListener = new FrameMetricsListener(store);
+ FrameMetrics frameMetrics = mock(FrameMetrics.class);
+
+ store.startTrackingScenario(JankScenario.PERIODIC_REPORTING);
+ when(frameMetrics.getMetric(FrameMetrics.TOTAL_DURATION)).thenReturn(10_000_000L);
+
+ metricsListener.onFrameMetricsAvailable(null, frameMetrics, 0);
+
+ // By default metrics shouldn't be logged.
+ Assert.assertEquals(
+ 0, store.stopTrackingScenario(JankScenario.PERIODIC_REPORTING).durationsNs.length);
+ verifyNoMoreInteractions(frameMetrics);
+ }
+
+ @Test
+ public void testMetricRecording_EnableRecording() {
+ FrameMetricsStore store = new FrameMetricsStore();
+
+ FrameMetricsListener metricsListener = new FrameMetricsListener(store);
+ FrameMetrics frameMetrics = mock(FrameMetrics.class);
+
+ store.startTrackingScenario(JankScenario.PERIODIC_REPORTING);
+ when(frameMetrics.getMetric(FrameMetrics.TOTAL_DURATION)).thenReturn(10_000_000L);
+
+ metricsListener.setIsListenerRecording(true);
+ metricsListener.onFrameMetricsAvailable(null, frameMetrics, 0);
+
+ Assert.assertArrayEquals(new Long[] {10_000_000L},
+ store.stopTrackingScenario(JankScenario.PERIODIC_REPORTING).durationsNs);
+ }
+}
diff --git a/chromium/base/android/junit/src/org/chromium/base/jank_tracker/FrameMetricsStoreTest.java b/chromium/base/android/junit/src/org/chromium/base/jank_tracker/FrameMetricsStoreTest.java
new file mode 100644
index 00000000000..456745f5fd6
--- /dev/null
+++ b/chromium/base/android/junit/src/org/chromium/base/jank_tracker/FrameMetricsStoreTest.java
@@ -0,0 +1,217 @@
+// Copyright 2021 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.jank_tracker;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.annotation.Config;
+
+import org.chromium.base.test.BaseRobolectricTestRunner;
+
+/**
+ * Tests for FrameMetricsStore.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+public class FrameMetricsStoreTest {
+ @Test
+ public void addFrameMeasurementTest() {
+ FrameMetricsStore store = new FrameMetricsStore();
+
+ store.startTrackingScenario(JankScenario.PERIODIC_REPORTING);
+
+ store.addFrameMeasurement(1_000_000_000L, 10_000_000L, 0);
+ store.addFrameMeasurement(1_020_000_000L, 12_000_000L, 1);
+ store.addFrameMeasurement(1_040_000_000L, 20_000_000L, 2);
+ store.addFrameMeasurement(1_060_000_000L, 8_000_000L, 0);
+
+ FrameMetrics scenarioMetrics = store.stopTrackingScenario(JankScenario.PERIODIC_REPORTING);
+
+ assertArrayEquals(
+ new Long[] {1_000_000_000L, 1_020_000_000L, 1_040_000_000L, 1_060_000_000L},
+ scenarioMetrics.timestampsNs);
+ assertArrayEquals(new Long[] {10_000_000L, 12_000_000L, 20_000_000L, 8_000_000L},
+ scenarioMetrics.durationsNs);
+ assertArrayEquals(new Integer[] {0, 1, 2, 0}, scenarioMetrics.skippedFrames);
+ }
+
+ @Test
+ public void addFrameMeasurementTest_MultipleScenarios() {
+ JankMetricCalculator measurement = new JankMetricCalculator();
+
+ FrameMetricsStore store = new FrameMetricsStore();
+
+ store.startTrackingScenario(JankScenario.PERIODIC_REPORTING);
+
+ store.addFrameMeasurement(1_000_000_000L, 10_000_000L, 0);
+ store.addFrameMeasurement(1_020_000_000L, 12_000_000L, 0);
+
+ FrameMetrics periodicReportingMetrics =
+ store.stopTrackingScenario(JankScenario.PERIODIC_REPORTING);
+ store.startTrackingScenario(JankScenario.OMNIBOX_FOCUS);
+
+ store.addFrameMeasurement(1_040_000_000L, 20_000_000L, 0);
+ store.addFrameMeasurement(1_060_000_000L, 8_000_000L, 0);
+
+ FrameMetrics omniboxMetrics = store.stopTrackingScenario(JankScenario.OMNIBOX_FOCUS);
+
+ assertArrayEquals(
+ new Long[] {10_000_000L, 12_000_000L}, periodicReportingMetrics.durationsNs);
+ assertArrayEquals(new Long[] {20_000_000L, 8_000_000L}, omniboxMetrics.durationsNs);
+ }
+
+ @Test
+ public void addFrameMeasurement_MultipleOverlappingScenarios() {
+ JankMetricCalculator measurement = new JankMetricCalculator();
+
+ FrameMetricsStore store = new FrameMetricsStore();
+
+ store.addFrameMeasurement(1_000_000_000L, 15_000_000L, 0);
+
+ store.startTrackingScenario(JankScenario.PERIODIC_REPORTING);
+
+ store.addFrameMeasurement(1_020_000_000L, 15_000_000L, 0);
+ store.addFrameMeasurement(1_040_000_000L, 50_000_000L, 0);
+ store.addFrameMeasurement(1_060_000_000L, 30_000_000L, 0);
+
+ store.startTrackingScenario(JankScenario.OMNIBOX_FOCUS);
+
+ store.addFrameMeasurement(1_080_000_000L, 10_000_000L, 0);
+ store.addFrameMeasurement(1_100_000_000L, 30_000_000L, 0);
+
+ FrameMetrics periodicReportingMetrics =
+ store.stopTrackingScenario(JankScenario.PERIODIC_REPORTING);
+
+ store.addFrameMeasurement(1_120_000_000L, 10_000_000L, 0);
+
+ FrameMetrics omniboxMetrics = store.stopTrackingScenario(JankScenario.OMNIBOX_FOCUS);
+
+ assertArrayEquals(
+ new Long[] {15_000_000L, 50_000_000L, 30_000_000L, 10_000_000L, 30_000_000L},
+ periodicReportingMetrics.durationsNs);
+ assertArrayEquals(
+ new Long[] {10_000_000L, 30_000_000L, 10_000_000L}, omniboxMetrics.durationsNs);
+ }
+
+ @Test
+ public void addFrameMeasurementTest_MultipleStartCallsAreIgnored() {
+ JankMetricCalculator measurement = new JankMetricCalculator();
+
+ FrameMetricsStore store = new FrameMetricsStore();
+
+ store.startTrackingScenario(JankScenario.PERIODIC_REPORTING);
+
+ store.addFrameMeasurement(1_000_000_000L, 10_000_000L, 0);
+ store.addFrameMeasurement(1_020_000_000L, 12_000_000L, 0);
+
+ // Any duplicate calls to startTracking should be ignored.
+ store.startTrackingScenario(JankScenario.PERIODIC_REPORTING);
+
+ store.addFrameMeasurement(1_040_000_000L, 20_000_000L, 0);
+
+ store.startTrackingScenario(JankScenario.PERIODIC_REPORTING);
+
+ store.addFrameMeasurement(1_060_000_000L, 8_000_000L, 0);
+
+ FrameMetrics periodicReportingMetrics =
+ store.stopTrackingScenario(JankScenario.PERIODIC_REPORTING);
+
+ // The returned metrics should begin at the first call to startTrackingScenario.
+ assertArrayEquals(new Long[] {10_000_000L, 12_000_000L, 20_000_000L, 8_000_000L},
+ periodicReportingMetrics.durationsNs);
+ }
+
+ @Test
+ public void stopTrackingScenario_StopWithoutAnyFrames() {
+ JankMetricCalculator measurement = new JankMetricCalculator();
+
+ FrameMetricsStore store = new FrameMetricsStore();
+
+ store.startTrackingScenario(JankScenario.PERIODIC_REPORTING);
+ FrameMetrics periodicReportingMetrics =
+ store.stopTrackingScenario(JankScenario.PERIODIC_REPORTING);
+
+ store.startTrackingScenario(JankScenario.OMNIBOX_FOCUS);
+ FrameMetrics omniboxMetrics = store.stopTrackingScenario(JankScenario.OMNIBOX_FOCUS);
+
+ assertEquals(0, periodicReportingMetrics.durationsNs.length);
+ assertEquals(0, omniboxMetrics.durationsNs.length);
+ }
+
+ @Test
+ public void stopTrackingScenario_EmptyScenarioAfterOneFrame() {
+ JankMetricCalculator measurement = new JankMetricCalculator();
+
+ FrameMetricsStore store = new FrameMetricsStore();
+
+ // Start a scenario just to start recording.
+ store.startTrackingScenario(JankScenario.OMNIBOX_FOCUS);
+
+ // Add a frame measurement.
+ store.addFrameMeasurement(1_060_000_000L, 8_000_000L, 0);
+
+ // Start and stop tracking scenario.
+ store.startTrackingScenario(JankScenario.PERIODIC_REPORTING);
+ FrameMetrics periodicReportingMetrics =
+ store.stopTrackingScenario(JankScenario.PERIODIC_REPORTING);
+
+ // The resulting metrics should be empty.
+ assertEquals(0, periodicReportingMetrics.durationsNs.length);
+ }
+
+ @Test
+ public void stopTrackingScenario_StopWithoutStartingReturnsEmptyMetrics() {
+ JankMetricCalculator measurement = new JankMetricCalculator();
+
+ FrameMetricsStore store = new FrameMetricsStore();
+
+ FrameMetrics periodicReportingMetrics =
+ store.stopTrackingScenario(JankScenario.PERIODIC_REPORTING);
+
+ FrameMetrics omniboxMetrics = store.stopTrackingScenario(JankScenario.OMNIBOX_FOCUS);
+
+ assertEquals(0, periodicReportingMetrics.durationsNs.length);
+ assertEquals(0, omniboxMetrics.durationsNs.length);
+ }
+
+ @Test
+ public void stopTrackingScenario_ClearsUnneededFrames() {
+ FrameMetricsStore store = new FrameMetricsStore();
+
+ store.addFrameMeasurement(1_000_000_000L, 15_000_000L, 0);
+
+ store.startTrackingScenario(JankScenario.PERIODIC_REPORTING);
+
+ store.addFrameMeasurement(1_020_000_000L, 15_000_000L, 0);
+ store.addFrameMeasurement(1_040_000_000L, 50_000_000L, 0);
+ // This frame should be kept after PERIODIC_REPORTING ends because OMNIBOX_FOCUS uses its
+ // timestamp to track the scenario's start.
+ store.addFrameMeasurement(1_060_000_000L, 33_333_333L, 0);
+
+ store.startTrackingScenario(JankScenario.OMNIBOX_FOCUS);
+
+ store.addFrameMeasurement(1_080_000_000L, 10_000_000L, 0);
+ store.addFrameMeasurement(1_100_000_000L, 30_000_000L, 0);
+
+ store.stopTrackingScenario(JankScenario.PERIODIC_REPORTING);
+ FrameMetrics storedMetricsAfterPeriodic = store.getAllStoredMetricsForTesting();
+
+ store.addFrameMeasurement(1_120_000_000L, 10_000_000L, 0);
+
+ store.stopTrackingScenario(JankScenario.OMNIBOX_FOCUS);
+ FrameMetrics storedMetricsAfterOmnibox = store.getAllStoredMetricsForTesting();
+
+ // When we stop tracking periodic reporting we should remove all frames that aren't used by
+ // any other scenarios.
+ assertArrayEquals(new Long[] {33_333_333L, 10_000_000L, 30_000_000L},
+ storedMetricsAfterPeriodic.durationsNs);
+ // When we stop tracking omnibox there are no other scenarios being tracked, so we clear all
+ // frame data.
+ assertEquals(0, storedMetricsAfterOmnibox.durationsNs.length);
+ }
+}
diff --git a/chromium/base/android/junit/src/org/chromium/base/jank_tracker/JankActivityTrackerTest.java b/chromium/base/android/junit/src/org/chromium/base/jank_tracker/JankActivityTrackerTest.java
new file mode 100644
index 00000000000..a4e05b435bb
--- /dev/null
+++ b/chromium/base/android/junit/src/org/chromium/base/jank_tracker/JankActivityTrackerTest.java
@@ -0,0 +1,157 @@
+// Copyright 2021 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.jank_tracker;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.atLeastOnce;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.app.Activity;
+import android.view.Window;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InOrder;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+import org.chromium.base.ActivityState;
+import org.chromium.base.ApplicationStatus;
+import org.chromium.base.test.BaseRobolectricTestRunner;
+
+/**
+ * Tests for JankActivityTracker.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+public class JankActivityTrackerTest {
+
+ @Mock
+ private Activity mActivity;
+
+ @Mock
+ private Window mWindow;
+
+ @Mock
+ private FrameMetricsListener mFrameMetricsListener;
+
+ @Mock
+ private JankReportingScheduler mJankReportingScheduler;
+
+ JankActivityTracker createJankActivityTracker(Activity activity) {
+ JankActivityTracker tracker =
+ new JankActivityTracker(activity, mFrameMetricsListener, mJankReportingScheduler);
+
+ return tracker;
+ }
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ when(mActivity.getWindow()).thenReturn(mWindow);
+
+ ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.CREATED);
+ }
+
+ @Test
+ public void jankTrackerTest_TestInitialize() {
+ JankActivityTracker jankActivityTracker = createJankActivityTracker(mActivity);
+ jankActivityTracker.initialize();
+
+ // Verify that we are listening to frame metrics.
+ // Initialize also starts listening to activity lifecycle events, but that's harder to
+ // verify.
+ verify(mWindow).addOnFrameMetricsAvailableListener(any(), any());
+ }
+
+ @Test
+ public void jankTrackerTest_TestActivityResume() {
+ JankActivityTracker jankActivityTracker = createJankActivityTracker(mActivity);
+ jankActivityTracker.initialize();
+
+ ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.STARTED);
+ ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.RESUMED);
+
+ // When an activity resumes we start reporting periodic metrics.
+ verify(mJankReportingScheduler, atLeastOnce()).startReportingPeriodicMetrics();
+ verify(mJankReportingScheduler, never()).stopReportingPeriodicMetrics();
+
+ // When an activity resumes we start recording metrics.
+ verify(mFrameMetricsListener, atLeastOnce()).setIsListenerRecording(true);
+ }
+
+ @Test
+ public void jankTrackerTest_TestActivityPause() {
+ JankActivityTracker jankActivityTracker = createJankActivityTracker(mActivity);
+ jankActivityTracker.initialize();
+
+ ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.STARTED);
+ ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.RESUMED);
+ ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.PAUSED);
+
+ // When an activity pauses the reporting task should still be looping.
+ verify(mJankReportingScheduler, atLeastOnce()).startReportingPeriodicMetrics();
+ verify(mJankReportingScheduler, never()).stopReportingPeriodicMetrics();
+
+ InOrder orderVerifier = Mockito.inOrder(mFrameMetricsListener);
+
+ orderVerifier.verify(mFrameMetricsListener, atLeastOnce()).setIsListenerRecording(true);
+ // When an activity pauses we stop recording metrics.
+ orderVerifier.verify(mFrameMetricsListener).setIsListenerRecording(false);
+ }
+
+ @Test
+ public void jankTrackerTest_TestActivityStop() {
+ JankActivityTracker jankActivityTracker = createJankActivityTracker(mActivity);
+ jankActivityTracker.initialize();
+
+ ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.STARTED);
+ ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.RESUMED);
+ ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.PAUSED);
+ ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.STOPPED);
+
+ // When an activity stops we stop reporting periodic metrics.
+ InOrder schedulerOrderVerifier = Mockito.inOrder(mJankReportingScheduler);
+ schedulerOrderVerifier.verify(mJankReportingScheduler, atLeastOnce())
+ .startReportingPeriodicMetrics();
+ schedulerOrderVerifier.verify(mJankReportingScheduler).stopReportingPeriodicMetrics();
+ }
+
+ @Test
+ public void jankTrackerTest_TestAttachTrackerOnResumedActivity() {
+ // Modify the activity's state before attaching JankActivityTracker.
+ ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.STARTED);
+ ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.RESUMED);
+
+ JankActivityTracker jankActivityTracker = createJankActivityTracker(mActivity);
+ jankActivityTracker.initialize();
+
+ // Verify that JankActivityTracker is running as expected for the Resumed state.
+ // Periodic metric reporting should be enabled.
+ verify(mJankReportingScheduler).startReportingPeriodicMetrics();
+ // Metric recording should be enabled.
+ verify(mFrameMetricsListener).setIsListenerRecording(true);
+ }
+
+ @Test
+ public void jankTrackerTest_TestOutOfOrderStateChange() {
+ JankActivityTracker jankActivityTracker = createJankActivityTracker(mActivity);
+ jankActivityTracker.initialize();
+
+ // Move the activity from STOPPED to RESUMED without calling STARTED.
+ ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.STOPPED);
+ ApplicationStatus.onStateChangeForTesting(mActivity, ActivityState.RESUMED);
+
+ // Verify that JankActivityTracker is running as expected for the Resumed state.
+ // Reporting task should be running and looping.
+ verify(mJankReportingScheduler).startReportingPeriodicMetrics();
+ // Metric recording should be enabled.
+ verify(mFrameMetricsListener).setIsListenerRecording(true);
+ }
+}
diff --git a/chromium/base/android/junit/src/org/chromium/base/jank_tracker/JankMetricCalculatorTest.java b/chromium/base/android/junit/src/org/chromium/base/jank_tracker/JankMetricCalculatorTest.java
new file mode 100644
index 00000000000..f7a0ec40b58
--- /dev/null
+++ b/chromium/base/android/junit/src/org/chromium/base/jank_tracker/JankMetricCalculatorTest.java
@@ -0,0 +1,107 @@
+// Copyright 2021 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.jank_tracker;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.annotation.Config;
+
+import org.chromium.base.test.BaseRobolectricTestRunner;
+
+/**
+ * Tests for JankMetricCalculator.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+public class JankMetricCalculatorTest {
+ @Test
+ public void getJankBurstDurationsTest() {
+ FrameMetricsStore store = new FrameMetricsStore();
+ store.startTrackingScenario(JankScenario.PERIODIC_REPORTING);
+
+ store.addFrameMeasurement(1_000_000_000L, 15_000_000L, 1);
+ store.addFrameMeasurement(1_020_000_000L, 15_000_000L, 0);
+ store.addFrameMeasurement(1_040_000_000L, 50_000_000L, 1); // Burst starts here.
+ store.addFrameMeasurement(1_060_000_000L, 30_000_000L, 1);
+ store.addFrameMeasurement(1_080_000_000L, 10_000_000L, 2);
+ store.addFrameMeasurement(1_120_000_000L, 30_000_000L, 0); // Burst ends here.
+ store.addFrameMeasurement(1_100_000_000L, 10_000_000L, 0);
+
+ FrameMetrics frameMetrics = store.stopTrackingScenario(JankScenario.PERIODIC_REPORTING);
+ JankMetrics jankMetrics = JankMetricCalculator.calculateJankMetrics(frameMetrics);
+
+ assertArrayEquals(new long[] {120_000_000L}, jankMetrics.jankBurstsNs);
+ assertEquals(5, jankMetrics.skippedFrames);
+ }
+
+ @Test
+ public void getJankBurstDurationsTest_TwoBursts() {
+ FrameMetricsStore store = new FrameMetricsStore();
+ store.startTrackingScenario(JankScenario.PERIODIC_REPORTING);
+
+ store.addFrameMeasurement(1_000_000_000L, 50_000_000L, 0); // Burst starts here.
+ store.addFrameMeasurement(1_020_000_000L, 50_000_000L, 0);
+ store.addFrameMeasurement(1_040_000_000L, 10_000_000L, 0);
+ store.addFrameMeasurement(1_060_000_000L, 50_000_000L, 0); // Burst ends here.
+ store.addFrameMeasurement(1_080_000_000L, 10_000_000L, 0);
+ store.addFrameMeasurement(1_100_000_000L, 10_000_000L, 0);
+ store.addFrameMeasurement(1_120_000_000L, 50_000_000L, 0); // Burst starts here.
+ store.addFrameMeasurement(1_140_000_000L, 50_000_000L, 0);
+ store.addFrameMeasurement(1_160_000_000L, 50_000_000L, 0); // Burst ends here.
+
+ FrameMetrics frameMetrics = store.stopTrackingScenario(JankScenario.PERIODIC_REPORTING);
+ JankMetrics jankMetrics = JankMetricCalculator.calculateJankMetrics(frameMetrics);
+
+ assertArrayEquals(new long[] {160_000_000L, 150_000_000L}, jankMetrics.jankBurstsNs);
+ }
+
+ @Test
+ public void getJankBurstDurationsTest_OneLongBurst() {
+ FrameMetricsStore store = new FrameMetricsStore();
+ store.startTrackingScenario(JankScenario.PERIODIC_REPORTING);
+
+ store.addFrameMeasurement(1_000_000_000L, 50_000_000L, 0); // Burst starts here.
+ store.addFrameMeasurement(1_020_000_000L, 10_000_000L, 0);
+ store.addFrameMeasurement(1_040_000_000L, 50_000_000L, 0);
+ store.addFrameMeasurement(1_060_000_000L, 10_000_000L, 0);
+ store.addFrameMeasurement(1_080_000_000L, 50_000_000L, 0);
+ store.addFrameMeasurement(1_100_000_000L, 10_000_000L, 0);
+ store.addFrameMeasurement(1_120_000_000L, 50_000_000L, 0);
+ store.addFrameMeasurement(1_140_000_000L, 10_000_000L, 0);
+ store.addFrameMeasurement(1_160_000_000L, 50_000_000L, 0); // Burst ends here.
+
+ FrameMetrics frameMetrics = store.stopTrackingScenario(JankScenario.PERIODIC_REPORTING);
+ JankMetrics jankMetrics = JankMetricCalculator.calculateJankMetrics(frameMetrics);
+
+ assertArrayEquals(new long[] {290_000_000L}, jankMetrics.jankBurstsNs);
+ }
+
+ @Test
+ public void getJankBurstDurationsTest_ThreeBursts_WithNonConsecutiveFrames() {
+ FrameMetricsStore store = new FrameMetricsStore();
+ store.startTrackingScenario(JankScenario.PERIODIC_REPORTING);
+
+ store.addFrameMeasurement(1_000_000_000L, 50_000_000L, 0); // Burst starts here.
+ store.addFrameMeasurement(1_020_000_000L, 50_000_000L, 0);
+ store.addFrameMeasurement(1_040_000_000L, 50_000_000L, 0); // Burst ends here.
+ store.addFrameMeasurement(
+ 2_000_000_000L, 50_000_000L, 0); // Burst starts here (~1000ms passed).
+ store.addFrameMeasurement(2_020_000_000L, 50_000_000L, 0);
+ store.addFrameMeasurement(2_040_000_000L, 10_000_000L, 0);
+ store.addFrameMeasurement(2_060_000_000L, 50_000_000L, 0); // Burst ends here.
+ store.addFrameMeasurement(3_000_000_000L, 10_000_000L, 0);
+ store.addFrameMeasurement(3_020_000_000L, 50_000_000L, 0); // Burst starts and ends here.
+ store.addFrameMeasurement(3_040_000_000L, 10_000_000L, 0);
+
+ FrameMetrics frameMetrics = store.stopTrackingScenario(JankScenario.PERIODIC_REPORTING);
+ JankMetrics jankMetrics = JankMetricCalculator.calculateJankMetrics(frameMetrics);
+
+ assertArrayEquals(
+ new long[] {150_000_000L, 160_000_000L, 50_000_000L}, jankMetrics.jankBurstsNs);
+ }
+}
diff --git a/chromium/base/android/junit/src/org/chromium/base/jank_tracker/JankMetricUMARecorderTest.java b/chromium/base/android/junit/src/org/chromium/base/jank_tracker/JankMetricUMARecorderTest.java
new file mode 100644
index 00000000000..c3167888ac3
--- /dev/null
+++ b/chromium/base/android/junit/src/org/chromium/base/jank_tracker/JankMetricUMARecorderTest.java
@@ -0,0 +1,54 @@
+// Copyright 2021 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.jank_tracker;
+
+import static org.mockito.Mockito.verify;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
+
+import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.base.test.util.JniMocker;
+
+/**
+ * Tests for JankMetricUMARecorder.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+public class JankMetricUMARecorderTest {
+ @Rule
+ public JniMocker mocker = new JniMocker();
+
+ @Mock
+ JankMetricUMARecorder.Natives mNativeMock;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mocker.mock(JankMetricUMARecorderJni.TEST_HOOKS, mNativeMock);
+ }
+
+ @Test
+ public void testRecordMetricsToNative() {
+ long[] timestampsNs = new long[] {1_000_000_000L, 2_000_000_000L, 3_000_000_000L};
+ long[] durationsNs = new long[] {5_000_000L, 8_000_000L, 30_000_000L};
+ long[] jankBurstsNs = new long[] {30_000L};
+ int missedFrames = 3;
+
+ JankMetrics metric = new JankMetrics(timestampsNs, durationsNs, jankBurstsNs, missedFrames);
+
+ JankMetricUMARecorder.recordJankMetricsToUMA(metric, JankScenario.OMNIBOX_FOCUS);
+
+ // Ensure that the relevant fields are sent down to native.
+ verify(mNativeMock)
+ .recordJankMetrics(
+ "OmniboxFocus", timestampsNs, durationsNs, jankBurstsNs, missedFrames);
+ }
+}
diff --git a/chromium/base/android/junit/src/org/chromium/base/jank_tracker/JankReportingRunnableTest.java b/chromium/base/android/junit/src/org/chromium/base/jank_tracker/JankReportingRunnableTest.java
new file mode 100644
index 00000000000..5925b6ecd36
--- /dev/null
+++ b/chromium/base/android/junit/src/org/chromium/base/jank_tracker/JankReportingRunnableTest.java
@@ -0,0 +1,91 @@
+// Copyright 2021 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.jank_tracker;
+
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.base.test.util.JniMocker;
+
+/**
+ * Tests for JankReportingRunnable.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+public class JankReportingRunnableTest {
+ @Rule
+ public JniMocker mocker = new JniMocker();
+
+ @Mock
+ JankMetricUMARecorder.Natives mNativeMock;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mocker.mock(JankMetricUMARecorderJni.TEST_HOOKS, mNativeMock);
+ }
+
+ @Test
+ public void testStartTracking() {
+ FrameMetricsStore metricsStore = Mockito.spy(new FrameMetricsStore());
+
+ JankReportingRunnable reportingRunnable = new JankReportingRunnable(
+ metricsStore, JankScenario.TAB_SWITCHER, /* isStartingTracking= */ true);
+ reportingRunnable.run();
+
+ verify(metricsStore).startTrackingScenario(JankScenario.TAB_SWITCHER);
+ verifyNoMoreInteractions(metricsStore);
+ }
+
+ @Test
+ public void testStopTracking() {
+ FrameMetricsStore metricsStore = Mockito.spy(new FrameMetricsStore());
+
+ JankReportingRunnable startReportingRunnable = new JankReportingRunnable(
+ metricsStore, JankScenario.TAB_SWITCHER, /* isStartingTracking= */ true);
+ startReportingRunnable.run();
+
+ metricsStore.addFrameMeasurement(1_000_000L, 1_000L, 1);
+
+ JankReportingRunnable stopReportingRunnable = new JankReportingRunnable(
+ metricsStore, JankScenario.TAB_SWITCHER, /* isStartingTracking= */ false);
+ stopReportingRunnable.run();
+
+ verify(metricsStore).startTrackingScenario(JankScenario.TAB_SWITCHER);
+ verify(metricsStore).stopTrackingScenario(JankScenario.TAB_SWITCHER);
+
+ verify(mNativeMock)
+ .recordJankMetrics("TabSwitcher", new long[] {1_000_000L}, new long[] {1_000L},
+ new long[0], 1);
+ }
+
+ @Test
+ public void testStopTracking_emptyStoreShouldntRecordAnything() {
+ // Create a store but don't add any measurements.
+ FrameMetricsStore metricsStore = Mockito.spy(new FrameMetricsStore());
+
+ JankReportingRunnable startReportingRunnable = new JankReportingRunnable(
+ metricsStore, JankScenario.TAB_SWITCHER, /* isStartingTracking= */ true);
+ startReportingRunnable.run();
+
+ JankReportingRunnable stopReportingRunnable = new JankReportingRunnable(
+ metricsStore, JankScenario.TAB_SWITCHER, /* isStartingTracking= */ false);
+ stopReportingRunnable.run();
+
+ verify(metricsStore).startTrackingScenario(JankScenario.TAB_SWITCHER);
+ verify(metricsStore).stopTrackingScenario(JankScenario.TAB_SWITCHER);
+
+ // Native shouldn't be called when there are no measurements.
+ verifyNoMoreInteractions(mNativeMock);
+ }
+}
diff --git a/chromium/base/android/junit/src/org/chromium/base/jank_tracker/JankReportingSchedulerTest.java b/chromium/base/android/junit/src/org/chromium/base/jank_tracker/JankReportingSchedulerTest.java
new file mode 100644
index 00000000000..b4dc16b02d1
--- /dev/null
+++ b/chromium/base/android/junit/src/org/chromium/base/jank_tracker/JankReportingSchedulerTest.java
@@ -0,0 +1,146 @@
+// Copyright 2021 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.jank_tracker;
+
+import static org.mockito.Mockito.verify;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InOrder;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.LooperMode;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowLooper;
+
+import org.chromium.base.test.BaseRobolectricTestRunner;
+
+/**
+ * Tests for JankReportingScheduler.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+@LooperMode(LooperMode.Mode.LEGACY)
+public class JankReportingSchedulerTest {
+ ShadowLooper mShadowLooper;
+
+ @Mock
+ private FrameMetricsStore mFrameMetricsStore;
+
+ JankReportingScheduler createJankReportingScheduler() {
+ JankReportingScheduler scheduler = new JankReportingScheduler(mFrameMetricsStore);
+ mShadowLooper = Shadow.extract(scheduler.getOrCreateHandler().getLooper());
+
+ return scheduler;
+ }
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ }
+
+ @Test
+ public void jankScenarioTracking_startTracking() {
+ JankReportingScheduler jankReportingScheduler = createJankReportingScheduler();
+
+ jankReportingScheduler.startTrackingScenario(JankScenario.NEW_TAB_PAGE);
+
+ // Starting tracking posts a task to begin recording metrics in FrameMetricsStore.
+ mShadowLooper.runOneTask();
+
+ verify(mFrameMetricsStore).startTrackingScenario(JankScenario.NEW_TAB_PAGE);
+ }
+
+ @Test
+ public void jankScenarioTracking_startAndStopTracking() {
+ JankReportingScheduler jankReportingScheduler = createJankReportingScheduler();
+
+ jankReportingScheduler.startTrackingScenario(JankScenario.NEW_TAB_PAGE);
+ jankReportingScheduler.finishTrackingScenario(JankScenario.NEW_TAB_PAGE);
+
+ // Starting tracking posts a task to begin recording metrics in FrameMetricsStore.
+ mShadowLooper.runOneTask();
+ // Stopping tracking posts a task to finish tracking and upload the calculated metrics.
+ mShadowLooper.runOneTask();
+
+ InOrder orderVerifier = Mockito.inOrder(mFrameMetricsStore);
+
+ // After both tasks we should have started and stopped tracking the periodic reporting
+ // scenario.
+ orderVerifier.verify(mFrameMetricsStore).startTrackingScenario(JankScenario.NEW_TAB_PAGE);
+ orderVerifier.verify(mFrameMetricsStore).stopTrackingScenario(JankScenario.NEW_TAB_PAGE);
+
+ Assert.assertFalse(mShadowLooper.getScheduler().areAnyRunnable());
+ }
+
+ @Test
+ public void jankReportingSchedulerTest_StartPeriodicReporting() {
+ JankReportingScheduler jankReportingScheduler = createJankReportingScheduler();
+
+ jankReportingScheduler.startReportingPeriodicMetrics();
+
+ // When periodic reporting is enabled a task is immediately posted to begin tracking.
+ mShadowLooper.runOneTask();
+ // Then a delayed task is posted for the reporting loop.
+ mShadowLooper.runOneTask();
+ // The reporting loop task posts an immediate task to stop tracking and record the data.
+ mShadowLooper.runOneTask();
+
+ InOrder orderVerifier = Mockito.inOrder(mFrameMetricsStore);
+
+ // After both tasks we should have started and stopped tracking the periodic reporting
+ // scenario.
+ orderVerifier.verify(mFrameMetricsStore)
+ .startTrackingScenario(JankScenario.PERIODIC_REPORTING);
+ orderVerifier.verify(mFrameMetricsStore)
+ .stopTrackingScenario(JankScenario.PERIODIC_REPORTING);
+
+ // There should be another task posted to continue the loop.
+ Assert.assertTrue(mShadowLooper.getScheduler().areAnyRunnable());
+ }
+
+ @Test
+ public void jankReportingSchedulerTest_StopPeriodicReporting() {
+ JankReportingScheduler jankReportingScheduler = createJankReportingScheduler();
+
+ jankReportingScheduler.startReportingPeriodicMetrics();
+
+ // Run tracking initialization task.
+ mShadowLooper.runOneTask();
+ // Run the first reporting loop (delayed 30s).
+ mShadowLooper.runOneTask();
+ // Run task to stop tracking 1st loop and record data.
+ mShadowLooper.runOneTask();
+ // Run task to start tracking the 2nd reporting loop.
+ mShadowLooper.runOneTask();
+
+ jankReportingScheduler.stopReportingPeriodicMetrics();
+
+ // Stopping periodic metric recording posts a reporting loop task immediately to stop
+ // tracking and record results.
+ mShadowLooper.runOneTask();
+ // The reporting loop task posts another immediate task to stop tracking and report data.
+ mShadowLooper.runOneTask();
+
+ InOrder orderVerifier = Mockito.inOrder(mFrameMetricsStore);
+
+ // This start/stop pair corresponds to the first reporting period.
+ orderVerifier.verify(mFrameMetricsStore)
+ .startTrackingScenario(JankScenario.PERIODIC_REPORTING);
+ orderVerifier.verify(mFrameMetricsStore)
+ .stopTrackingScenario(JankScenario.PERIODIC_REPORTING);
+
+ // Stopping reporting forces an immediate report of recorded frames, if any.
+ orderVerifier.verify(mFrameMetricsStore)
+ .startTrackingScenario(JankScenario.PERIODIC_REPORTING);
+ orderVerifier.verify(mFrameMetricsStore)
+ .stopTrackingScenario(JankScenario.PERIODIC_REPORTING);
+
+ // There should not be another task posted to continue the loop.
+ Assert.assertFalse(mShadowLooper.getScheduler().areAnyRunnable());
+ }
+}
diff --git a/chromium/base/android/junit/src/org/chromium/base/library_loader/LinkerTest.java b/chromium/base/android/junit/src/org/chromium/base/library_loader/LinkerTest.java
new file mode 100644
index 00000000000..c2e5ecd956a
--- /dev/null
+++ b/chromium/base/android/junit/src/org/chromium/base/library_loader/LinkerTest.java
@@ -0,0 +1,271 @@
+// Copyright 2021 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.library_loader;
+
+import android.os.Bundle;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentMatchers;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.mockito.quality.Strictness;
+import org.robolectric.annotation.Config;
+
+import org.chromium.base.library_loader.Linker.PreferAddress;
+import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.base.metrics.UmaRecorderHolder;
+import org.chromium.base.test.BaseRobolectricTestRunner;
+
+/**
+ * Tests for {@link Linker}.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+@SuppressWarnings("GuardedBy") // doNothing().when(...).methodLocked() cannot resolve |mLock|.
+public class LinkerTest {
+ @Mock
+ Linker.Natives mNativeMock;
+
+ @Rule
+ public MockitoRule mMockitoRule = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS);
+
+ @Before
+ public void setUp() {
+ UmaRecorderHolder.resetForTesting();
+ Linker.setLinkerNativesForTesting(mNativeMock);
+ }
+
+ @After
+ public void tearDown() {
+ Linker.setLinkerNativesForTesting(null);
+ }
+
+ static Linker.LibInfo anyLibInfo() {
+ return ArgumentMatchers.any(Linker.LibInfo.class);
+ }
+
+ @Test
+ @SmallTest
+ public void testConsumer() {
+ // Set up.
+ Linker linker = Mockito.spy(new Linker());
+ Mockito.doNothing().when(linker).loadLinkerJniLibraryLocked();
+
+ // Exercise.
+ long someAddress = 1 << 12;
+ linker.ensureInitialized(
+ /* asRelroProducer= */ false, PreferAddress.RESERVE_HINT, someAddress);
+
+ // Verify.
+ Assert.assertFalse(linker.mRelroProducer);
+ Mockito.verify(mNativeMock).reserveMemoryForLibrary(anyLibInfo());
+ Assert.assertNotEquals(null, linker.mLocalLibInfo);
+ Assert.assertEquals(someAddress, linker.mLocalLibInfo.mLoadAddress);
+ }
+
+ @Test
+ @SmallTest
+ public void testProducer() {
+ // Set up.
+ Linker linker = Mockito.spy(new Linker());
+ Mockito.doNothing().when(linker).loadLinkerJniLibraryLocked();
+
+ // Exercise.
+ linker.ensureInitialized(/* asRelroProducer= */ true, PreferAddress.RESERVE_RANDOM, 0);
+
+ // Verify.
+ Assert.assertTrue(linker.mRelroProducer);
+ Mockito.verify(mNativeMock).findMemoryRegionAtRandomAddress(anyLibInfo());
+ Assert.assertNotEquals(null, linker.mLocalLibInfo);
+ }
+
+ @Test
+ @SmallTest
+ public void testConsumerReserveRandom() {
+ // Set up.
+ Linker linker = Mockito.spy(new Linker());
+ Mockito.doNothing().when(linker).loadLinkerJniLibraryLocked();
+
+ // Exercise.
+ linker.ensureInitialized(/* asRelroProducer= */ false, PreferAddress.RESERVE_RANDOM, 0);
+
+ // Verify.
+ Mockito.verify(mNativeMock).findMemoryRegionAtRandomAddress(anyLibInfo());
+ }
+
+ @Test
+ @SmallTest
+ public void testReservingZeroFallsBackToRandom() {
+ // Set up.
+ Linker linker = Mockito.spy(new Linker());
+ Mockito.doNothing().when(linker).loadLinkerJniLibraryLocked();
+
+ // Exercise.
+ linker.ensureInitialized(/* asRelroProducer= */ false, PreferAddress.RESERVE_HINT, 0);
+
+ // Verify.
+ Mockito.verify(mNativeMock).findMemoryRegionAtRandomAddress(anyLibInfo());
+ }
+
+ @Test
+ @SmallTest
+ public void testAppZygoteProducingRelro() {
+ // Set up.
+ Linker linker = Mockito.spy(new Linker());
+ Mockito.doNothing().when(linker).loadLinkerJniLibraryLocked();
+ // The lookup of the region succeeds.
+ Mockito.when(mNativeMock.findRegionReservedByWebViewZygote(anyLibInfo())).thenReturn(true);
+ Mockito.when(linker.isNonZeroLoadAddress(anyLibInfo())).thenReturn(true);
+
+ // Exercise.
+ linker.ensureInitialized(/* asRelroProducer= */ true, PreferAddress.FIND_RESERVED, 0);
+
+ // Verify.
+ Mockito.verify(mNativeMock).findRegionReservedByWebViewZygote(anyLibInfo());
+ Mockito.verify(mNativeMock, Mockito.never()).findMemoryRegionAtRandomAddress(anyLibInfo());
+ Mockito.verify(mNativeMock, Mockito.never()).reserveMemoryForLibrary(anyLibInfo());
+ }
+
+ @Test
+ @SmallTest
+ public void testAppZygoteFailsToFindReservedAddressRange() {
+ // Set up.
+ Linker linker = Mockito.spy(new Linker());
+ Mockito.doNothing().when(linker).loadLinkerJniLibraryLocked();
+ // The lookup of the region fails.
+ Mockito.when(mNativeMock.findRegionReservedByWebViewZygote(anyLibInfo())).thenReturn(false);
+
+ // Exercise.
+ linker.ensureInitialized(/* asRelroProducer= */ true, PreferAddress.FIND_RESERVED, 0);
+
+ // Verify.
+ Mockito.verify(mNativeMock).findRegionReservedByWebViewZygote(anyLibInfo());
+ Mockito.verify(mNativeMock).findMemoryRegionAtRandomAddress(anyLibInfo());
+ }
+
+ @Test
+ @SmallTest
+ public void testRelroSharingStatusHistogram() {
+ // Set up.
+ Linker linker = Mockito.spy(new Linker());
+ Mockito.doNothing().when(linker).loadLinkerJniLibraryLocked();
+ Mockito.when(mNativeMock.getRelroSharingResult()).thenReturn(1);
+ Linker.LibInfo libInfo = Mockito.spy(new Linker.LibInfo());
+ long someAddress = 1 << 12;
+ libInfo.mLoadAddress = someAddress;
+ // Set a fake RELRO FD so that it is not silently ignored when taking the LibInfo from the
+ // (simulated) outside.
+ libInfo.mRelroFd = 1023;
+ // Create the bundle following the _internal_ format of the Linker. Not great, but shorter
+ // than factoring out this logic from the Linker only for testing.
+ Bundle relros = libInfo.toBundle();
+ Bundle b = new Bundle();
+ b.putBundle(Linker.SHARED_RELROS, relros);
+
+ // Exercise.
+ linker.ensureInitialized(
+ /* asRelroProducer= */ false, PreferAddress.RESERVE_HINT, someAddress);
+ linker.pretendLibraryIsLoadedForTesting();
+ linker.takeSharedRelrosFromBundle(b);
+
+ // Verify.
+ Assert.assertEquals(1,
+ RecordHistogram.getHistogramTotalCountForTesting(
+ "ChromiumAndroidLinker.RelroSharingStatus2"));
+ }
+
+ @Test
+ @SmallTest
+ public void testBrowserExpectingRelroFromZygote() {
+ // Set up.
+ Linker linker = Mockito.spy(new Linker());
+ Mockito.doNothing().when(linker).loadLinkerJniLibraryLocked();
+ // The lookup of the region succeeds.
+ Mockito.when(mNativeMock.findRegionReservedByWebViewZygote(anyLibInfo())).thenReturn(true);
+ Mockito.when(linker.isNonZeroLoadAddress(anyLibInfo())).thenReturn(true);
+
+ // Exercise.
+ linker.ensureInitialized(/* asRelroProducer= */ false, PreferAddress.FIND_RESERVED, 0);
+
+ // Verify.
+ Mockito.verify(mNativeMock).findRegionReservedByWebViewZygote(anyLibInfo());
+ Mockito.verify(mNativeMock, Mockito.never()).findMemoryRegionAtRandomAddress(anyLibInfo());
+ Mockito.verify(mNativeMock, Mockito.never()).reserveMemoryForLibrary(anyLibInfo());
+ }
+
+ @Test
+ @SmallTest
+ public void testPrivilegedProcessWithHint() {
+ // Set up.
+ Linker linker = Mockito.spy(new Linker());
+ Mockito.doNothing().when(linker).loadLinkerJniLibraryLocked();
+ // The lookup of the region succeeds.
+ Mockito.when(mNativeMock.findRegionReservedByWebViewZygote(anyLibInfo())).thenReturn(true);
+ Mockito.when(linker.isNonZeroLoadAddress(anyLibInfo())).thenReturn(true);
+
+ // Exercise.
+ long someAddress = 1 << 12;
+ linker.ensureInitialized(
+ /* asRelroProducer= */ false, PreferAddress.FIND_RESERVED, someAddress);
+
+ // Verify.
+ Mockito.verify(mNativeMock).findRegionReservedByWebViewZygote(anyLibInfo());
+ // Unfortunately there does not seem to be an elegant way to set |mLoadAddress| without
+ // extracting creation of mLocalLibInfo from ensureInitialized(). Hence no checks are
+ // present here involving the exact value of |mLoadAddress|.
+ }
+
+ @Test
+ @SmallTest
+ public void testWebviewRegionSearchHistograms() {
+ // Set up.
+ Linker linker = Mockito.spy(new Linker());
+ Mockito.doNothing().when(linker).loadLinkerJniLibraryLocked();
+ // The lookup of the region succeeds.
+ Mockito.when(mNativeMock.findRegionReservedByWebViewZygote(anyLibInfo())).thenReturn(true);
+ Mockito.when(linker.isNonZeroLoadAddress(anyLibInfo())).thenReturn(true);
+
+ // Exercise.
+ linker.ensureInitialized(
+ /* asRelroProducer= */ false, PreferAddress.FIND_RESERVED, 0);
+ linker.recordHistograms("Zygote");
+
+ // Verify.
+ Assert.assertNotNull(linker.mWebviewReservationSearchResult);
+ Assert.assertEquals(1,
+ RecordHistogram.getHistogramTotalCountForTesting(
+ "ChromiumAndroidLinker.TimeToFindWebViewReservation.Found.Zygote"));
+ }
+
+ @Test
+ @SmallTest
+ public void testWebviewRegionSearchFailedHistograms() {
+ // Set up.
+ Linker linker = Mockito.spy(new Linker());
+ Mockito.doNothing().when(linker).loadLinkerJniLibraryLocked();
+ // The lookup of the region fails.
+ Mockito.when(mNativeMock.findRegionReservedByWebViewZygote(anyLibInfo())).thenReturn(false);
+
+ // Exercise.
+ linker.ensureInitialized(
+ /* asRelroProducer= */ false, PreferAddress.FIND_RESERVED, 0);
+ linker.recordHistograms("Child");
+
+ // Verify.
+ Assert.assertNotNull(linker.mWebviewReservationSearchResult);
+ Assert.assertEquals(1,
+ RecordHistogram.getHistogramTotalCountForTesting(
+ "ChromiumAndroidLinker.TimeToFindWebViewReservation.NotFound.Child"));
+ }
+}
diff --git a/chromium/base/android/junit/src/org/chromium/base/memory/MemoryPressureMonitorTest.java b/chromium/base/android/junit/src/org/chromium/base/memory/MemoryPressureMonitorTest.java
new file mode 100644
index 00000000000..ce9d0956cff
--- /dev/null
+++ b/chromium/base/android/junit/src/org/chromium/base/memory/MemoryPressureMonitorTest.java
@@ -0,0 +1,357 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.memory;
+
+import android.content.ComponentCallbacks2;
+import android.os.Looper;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowLooper;
+
+import org.chromium.base.MemoryPressureLevel;
+import org.chromium.base.ThreadUtils;
+import org.chromium.base.supplier.Supplier;
+import org.chromium.base.test.BaseRobolectricTestRunner;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Test for MemoryPressureMonitor.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+public class MemoryPressureMonitorTest {
+ private MemoryPressureMonitor mMonitor;
+
+ private static class TestPressureCallback implements MemoryPressureCallback {
+ private Integer mReportedPressure;
+
+ public void assertCalledWith(@MemoryPressureLevel int expectedPressure) {
+ Assert.assertNotNull("Callback was not called", mReportedPressure);
+ Assert.assertEquals(expectedPressure, (int) mReportedPressure);
+ }
+
+ public void assertNotCalled() {
+ Assert.assertNull(mReportedPressure);
+ }
+
+ public void reset() {
+ mReportedPressure = null;
+ }
+
+ @Override
+ public void onPressure(@MemoryPressureLevel int pressure) {
+ assertNotCalled();
+ mReportedPressure = pressure;
+ }
+ }
+
+ private static class TestPressureSupplier implements Supplier<Integer> {
+ private @MemoryPressureLevel Integer mPressure;
+ private boolean mIsCalled;
+
+ public TestPressureSupplier(@MemoryPressureLevel Integer pressure) {
+ mPressure = pressure;
+ }
+
+ @Override
+ public @MemoryPressureLevel Integer get() {
+ assertNotCalled();
+ mIsCalled = true;
+ return mPressure;
+ }
+
+ public void assertCalled() {
+ Assert.assertTrue(mIsCalled);
+ }
+
+ public void assertNotCalled() {
+ Assert.assertFalse(mIsCalled);
+ }
+ }
+
+ private static final int THROTTLING_INTERVAL_MS = 1000;
+
+ @Before
+ public void setUp() {
+ // Explicitly set main thread as UiThread. Other places rely on that.
+ ThreadUtils.setUiThread(Looper.getMainLooper());
+
+ // Pause main thread to get control over when tasks are run (see runUiThreadFor()).
+ ShadowLooper.pauseMainLooper();
+
+ mMonitor = new MemoryPressureMonitor(THROTTLING_INTERVAL_MS);
+ mMonitor.setCurrentPressureSupplierForTesting(null);
+ }
+
+ /**
+ * Runs all UiThread tasks posted |delayMs| in the future.
+ * @param delayMs
+ */
+ private void runUiThreadFor(long delayMs) {
+ ShadowLooper.idleMainLooper(delayMs, TimeUnit.MILLISECONDS);
+ }
+
+ @Test
+ @SmallTest
+ public void testTrimLevelTranslation() {
+ Integer[][] trimLevelToPressureMap = {//
+ // Levels >= TRIM_MEMORY_COMPLETE map to CRITICAL.
+ {ComponentCallbacks2.TRIM_MEMORY_COMPLETE + 1, MemoryPressureLevel.CRITICAL},
+ {ComponentCallbacks2.TRIM_MEMORY_COMPLETE, MemoryPressureLevel.CRITICAL},
+
+ // TRIM_MEMORY_RUNNING_CRITICAL maps to CRITICAL.
+ {ComponentCallbacks2.TRIM_MEMORY_RUNNING_CRITICAL, MemoryPressureLevel.CRITICAL},
+
+ // Levels < TRIM_MEMORY_COMPLETE && >= TRIM_MEMORY_BACKGROUND map to MODERATE.
+ {ComponentCallbacks2.TRIM_MEMORY_COMPLETE - 1, MemoryPressureLevel.MODERATE},
+ {ComponentCallbacks2.TRIM_MEMORY_BACKGROUND + 1, MemoryPressureLevel.MODERATE},
+ {ComponentCallbacks2.TRIM_MEMORY_BACKGROUND, MemoryPressureLevel.MODERATE},
+
+ // Other levels are not mapped.
+ {ComponentCallbacks2.TRIM_MEMORY_BACKGROUND - 1, null},
+ {ComponentCallbacks2.TRIM_MEMORY_RUNNING_LOW, null},
+ {ComponentCallbacks2.TRIM_MEMORY_RUNNING_MODERATE, null},
+ {ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN, null}};
+ for (Integer[] trimLevelAndPressure : trimLevelToPressureMap) {
+ int trimLevel = trimLevelAndPressure[0];
+ Integer expectedPressure = trimLevelAndPressure[1];
+ Integer actualPressure = MemoryPressureMonitor.memoryPressureFromTrimLevel(trimLevel);
+ Assert.assertEquals(expectedPressure, actualPressure);
+ }
+ }
+
+ @Test
+ @SmallTest
+ public void testThrottleInterval() {
+ TestPressureCallback callback = new TestPressureCallback();
+ mMonitor.setReportingCallbackForTesting(callback);
+
+ // First notification should go through.
+ mMonitor.notifyPressure(MemoryPressureLevel.NONE);
+ callback.assertCalledWith(MemoryPressureLevel.NONE);
+
+ callback.reset();
+
+ // This one should be throttled.
+ mMonitor.notifyPressure(MemoryPressureLevel.NONE);
+ callback.assertNotCalled();
+
+ runUiThreadFor(THROTTLING_INTERVAL_MS - 1);
+
+ // We're still within the throttling interval, so this notification should
+ // still be throttled.
+ mMonitor.notifyPressure(MemoryPressureLevel.NONE);
+ callback.assertNotCalled();
+
+ runUiThreadFor(1);
+
+ // We're past the throttling interval at this point, so this notification
+ // should go through.
+ mMonitor.notifyPressure(MemoryPressureLevel.NONE);
+ callback.assertCalledWith(MemoryPressureLevel.NONE);
+ }
+
+ @Test
+ @SmallTest
+ public void testChangeNotIgnored() {
+ TestPressureCallback callback = new TestPressureCallback();
+ mMonitor.setReportingCallbackForTesting(callback);
+
+ mMonitor.notifyPressure(MemoryPressureLevel.NONE);
+ callback.assertCalledWith(MemoryPressureLevel.NONE);
+
+ callback.reset();
+
+ // Second notification is throttled, but should be reported after the
+ // throttling interval ends.
+ mMonitor.notifyPressure(MemoryPressureLevel.MODERATE);
+ callback.assertNotCalled();
+
+ runUiThreadFor(THROTTLING_INTERVAL_MS - 1);
+
+ // Shouldn't be reported at this point.
+ callback.assertNotCalled();
+
+ runUiThreadFor(1);
+
+ callback.assertCalledWith(MemoryPressureLevel.MODERATE);
+ }
+
+ @Test
+ @SmallTest
+ public void testNoopChangeIgnored() {
+ TestPressureCallback callback = new TestPressureCallback();
+ mMonitor.setReportingCallbackForTesting(callback);
+
+ mMonitor.notifyPressure(MemoryPressureLevel.NONE);
+ callback.assertCalledWith(MemoryPressureLevel.NONE);
+
+ callback.reset();
+
+ // Report MODERATE and then NONE, so that the throttling interval finishes with the
+ // same pressure that started it (i.e. NONE). In this case MODERATE should be ignored.
+ mMonitor.notifyPressure(MemoryPressureLevel.MODERATE);
+ mMonitor.notifyPressure(MemoryPressureLevel.NONE);
+
+ runUiThreadFor(THROTTLING_INTERVAL_MS);
+
+ callback.assertNotCalled();
+ }
+
+ @Test
+ @SmallTest
+ public void testPollingInitiallyDisabled() {
+ TestPressureSupplier pressureSupplier =
+ new TestPressureSupplier(MemoryPressureLevel.MODERATE);
+ mMonitor.setCurrentPressureSupplierForTesting(pressureSupplier);
+
+ mMonitor.notifyPressure(MemoryPressureLevel.CRITICAL);
+ runUiThreadFor(THROTTLING_INTERVAL_MS);
+
+ // We finished the interval with CRITICAL, but since polling is disabled, we shouldn't
+ // poll the current pressure.
+ pressureSupplier.assertNotCalled();
+ }
+
+ @Test
+ @SmallTest
+ public void testEnablePollingPolls() {
+ TestPressureCallback callback = new TestPressureCallback();
+ mMonitor.setReportingCallbackForTesting(callback);
+
+ TestPressureSupplier pressureSupplier =
+ new TestPressureSupplier(MemoryPressureLevel.MODERATE);
+ mMonitor.setCurrentPressureSupplierForTesting(pressureSupplier);
+
+ mMonitor.enablePolling();
+
+ // When polling is enabled, current pressure should be retrieved and reported.
+ pressureSupplier.assertCalled();
+ callback.assertCalledWith(MemoryPressureLevel.MODERATE);
+ }
+
+ @Test
+ @SmallTest
+ public void testNullSupplierResultIgnored() {
+ TestPressureCallback callback = new TestPressureCallback();
+ mMonitor.setReportingCallbackForTesting(callback);
+
+ TestPressureSupplier pressureSupplier = new TestPressureSupplier(null);
+ mMonitor.setCurrentPressureSupplierForTesting(pressureSupplier);
+
+ mMonitor.enablePolling();
+
+ // The pressure supplier should be called, but its null result should be ignored.
+ pressureSupplier.assertCalled();
+ callback.assertNotCalled();
+ }
+
+ @Test
+ @SmallTest
+ public void testEnablePollingRespectsThrottling() {
+ TestPressureSupplier pressureSupplier =
+ new TestPressureSupplier(MemoryPressureLevel.MODERATE);
+ mMonitor.setCurrentPressureSupplierForTesting(pressureSupplier);
+
+ mMonitor.notifyPressure(MemoryPressureLevel.NONE);
+
+ // The notification above started a throttling interval, so we shouldn't ask for the
+ // current pressure when polling is enabled.
+ mMonitor.enablePolling();
+
+ pressureSupplier.assertNotCalled();
+ }
+
+ @Test
+ @SmallTest
+ public void testPollingIfCRITICAL() {
+ TestPressureCallback callback = new TestPressureCallback();
+ mMonitor.setReportingCallbackForTesting(callback);
+
+ TestPressureSupplier pressureSupplier =
+ new TestPressureSupplier(MemoryPressureLevel.MODERATE);
+ mMonitor.setCurrentPressureSupplierForTesting(pressureSupplier);
+
+ mMonitor.notifyPressure(MemoryPressureLevel.CRITICAL);
+ callback.reset();
+
+ mMonitor.enablePolling();
+
+ runUiThreadFor(THROTTLING_INTERVAL_MS - 1);
+
+ // Pressure should be polled after the interval ends, not before.
+ pressureSupplier.assertNotCalled();
+
+ runUiThreadFor(1);
+
+ // We started and finished the throttling interval with CRITICAL pressure, so
+ // we should poll the current pressure at the end of the interval.
+ pressureSupplier.assertCalled();
+ callback.assertCalledWith(MemoryPressureLevel.MODERATE);
+ }
+
+ @Test
+ @SmallTest
+ public void testNoPollingIfNotCRITICAL() {
+ TestPressureSupplier pressureSupplier = new TestPressureSupplier(MemoryPressureLevel.NONE);
+ mMonitor.setCurrentPressureSupplierForTesting(pressureSupplier);
+
+ mMonitor.notifyPressure(MemoryPressureLevel.MODERATE);
+
+ mMonitor.enablePolling();
+
+ runUiThreadFor(THROTTLING_INTERVAL_MS);
+
+ // We started and finished the throttling interval with non-CRITICAL pressure,
+ // so no polling should take place.
+ pressureSupplier.assertNotCalled();
+ }
+
+ @Test
+ @SmallTest
+ public void testNoPollingIfChangedToCRITICAL() {
+ TestPressureSupplier pressureSupplier = new TestPressureSupplier(MemoryPressureLevel.NONE);
+ mMonitor.setCurrentPressureSupplierForTesting(pressureSupplier);
+
+ mMonitor.notifyPressure(MemoryPressureLevel.MODERATE);
+ mMonitor.notifyPressure(MemoryPressureLevel.CRITICAL);
+
+ mMonitor.enablePolling();
+
+ runUiThreadFor(THROTTLING_INTERVAL_MS);
+
+ // We finished the throttling interval with CRITITCAL, but started with MODERATE,
+ // so no polling should take place.
+ pressureSupplier.assertNotCalled();
+ }
+
+ @Test
+ @SmallTest
+ public void testDisablePolling() {
+ TestPressureSupplier pressureSupplier = new TestPressureSupplier(MemoryPressureLevel.NONE);
+ mMonitor.setCurrentPressureSupplierForTesting(pressureSupplier);
+
+ mMonitor.notifyPressure(MemoryPressureLevel.CRITICAL);
+
+ mMonitor.enablePolling();
+
+ runUiThreadFor(THROTTLING_INTERVAL_MS - 1);
+
+ // Whether polling is enabled or not should be taken into account only after the interval
+ // finishes, so disabling it here should have the same affect as if it was never enabled.
+ mMonitor.disablePolling();
+
+ runUiThreadFor(1);
+
+ pressureSupplier.assertNotCalled();
+ }
+}
diff --git a/chromium/base/android/junit/src/org/chromium/base/memory/MemoryPurgeManagerTest.java b/chromium/base/android/junit/src/org/chromium/base/memory/MemoryPurgeManagerTest.java
new file mode 100644
index 00000000000..0b2b517587b
--- /dev/null
+++ b/chromium/base/android/junit/src/org/chromium/base/memory/MemoryPurgeManagerTest.java
@@ -0,0 +1,216 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.memory;
+
+import android.os.Looper;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowLooper;
+
+import org.chromium.base.ApplicationState;
+import org.chromium.base.BaseFeatures;
+import org.chromium.base.FakeTimeTestRule;
+import org.chromium.base.FeatureList;
+import org.chromium.base.ThreadUtils;
+import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.base.test.BaseRobolectricTestRunner;
+
+import java.util.Map;
+import java.util.concurrent.Callable;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Tests for MemoryPurgeManager.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+public class MemoryPurgeManagerTest {
+ @Rule
+ public FakeTimeTestRule mFakeTimeTestRule = new FakeTimeTestRule();
+ private Callable<Integer> mGetCount = () -> {
+ return RecordHistogram.getHistogramTotalCountForTesting(
+ MemoryPurgeManager.BACKGROUND_DURATION_HISTOGRAM_NAME);
+ };
+
+ private class MemoryPurgeManagerForTest extends MemoryPurgeManager {
+ public MemoryPurgeManagerForTest(int initialState) {
+ super();
+ mApplicationState = initialState;
+ }
+
+ @Override
+ public void onApplicationStateChange(int state) {
+ mApplicationState = state;
+ super.onApplicationStateChange(state);
+ }
+
+ @Override
+ protected void notifyMemoryPressure() {
+ mMemoryPressureNotifiedCount += 1;
+ }
+
+ @Override
+ protected int getApplicationState() {
+ return mApplicationState;
+ }
+
+ public int mMemoryPressureNotifiedCount;
+ public int mApplicationState = ApplicationState.UNKNOWN;
+ }
+
+ @Before
+ public void setUp() {
+ // Explicitly set main thread as UiThread. Other places rely on that.
+ ThreadUtils.setUiThread(Looper.getMainLooper());
+
+ // Pause main thread to get control over when tasks are run (see runUiThreadFor()).
+ ShadowLooper.pauseMainLooper();
+ }
+
+ @Test
+ @SmallTest
+ public void testSimple() throws Exception {
+ FeatureList.setTestFeatures(Map.of(BaseFeatures.BROWSER_PROCESS_MEMORY_PURGE, true));
+
+ int count = mGetCount.call();
+ var manager = new MemoryPurgeManagerForTest(ApplicationState.HAS_RUNNING_ACTIVITIES);
+ manager.start();
+
+ // No notification when initial state has activities.
+ Assert.assertEquals(0, manager.mMemoryPressureNotifiedCount);
+ runUiThreadFor(MemoryPurgeManager.PURGE_DELAY_MS);
+ Assert.assertEquals(0, manager.mMemoryPressureNotifiedCount);
+ Assert.assertEquals(count, (int) mGetCount.call());
+
+ // Notify after a delay.
+ manager.onApplicationStateChange(ApplicationState.HAS_STOPPED_ACTIVITIES);
+ Assert.assertEquals(0, manager.mMemoryPressureNotifiedCount); // Should be delayed.
+ runUiThreadFor(MemoryPurgeManager.PURGE_DELAY_MS);
+ Assert.assertEquals(1, manager.mMemoryPressureNotifiedCount);
+
+ // Only one notification.
+ manager.onApplicationStateChange(ApplicationState.HAS_DESTROYED_ACTIVITIES);
+ runUiThreadFor(MemoryPurgeManager.PURGE_DELAY_MS);
+ Assert.assertEquals(1, manager.mMemoryPressureNotifiedCount);
+
+ // Started in foreground, went to background once, and came back.
+ manager.onApplicationStateChange(ApplicationState.HAS_RUNNING_ACTIVITIES);
+ Assert.assertEquals(count + 1, (int) mGetCount.call());
+ }
+
+ @Test
+ @SmallTest
+ public void testInitializedOnceInBackground() throws Exception {
+ FeatureList.setTestFeatures(Map.of(BaseFeatures.BROWSER_PROCESS_MEMORY_PURGE, true));
+
+ int count = mGetCount.call();
+ var manager = new MemoryPurgeManagerForTest(ApplicationState.HAS_STOPPED_ACTIVITIES);
+ manager.start();
+ Assert.assertEquals(0, manager.mMemoryPressureNotifiedCount);
+ runUiThreadFor(MemoryPurgeManager.PURGE_DELAY_MS);
+ Assert.assertEquals(1, manager.mMemoryPressureNotifiedCount);
+
+ // Started in background, no histogram recording when coming to foreground.
+ manager.onApplicationStateChange(ApplicationState.HAS_RUNNING_ACTIVITIES);
+ Assert.assertEquals(count, (int) mGetCount.call());
+ }
+
+ @Test
+ @SmallTest
+ public void testDontTriggerForProcessesWithNoActivities() {
+ FeatureList.setTestFeatures(Map.of(BaseFeatures.BROWSER_PROCESS_MEMORY_PURGE, true));
+
+ var manager = new MemoryPurgeManagerForTest(ApplicationState.HAS_DESTROYED_ACTIVITIES);
+ manager.start();
+
+ // Don't purge if the process never hosted any activity.
+ Assert.assertEquals(0, manager.mMemoryPressureNotifiedCount);
+ runUiThreadFor(MemoryPurgeManager.PURGE_DELAY_MS);
+ Assert.assertEquals(0, manager.mMemoryPressureNotifiedCount);
+
+ // Starts when we cycle through foreground and background.
+ manager.onApplicationStateChange(ApplicationState.HAS_RUNNING_ACTIVITIES);
+ manager.onApplicationStateChange(ApplicationState.HAS_STOPPED_ACTIVITIES);
+ runUiThreadFor(MemoryPurgeManager.PURGE_DELAY_MS);
+ Assert.assertEquals(1, manager.mMemoryPressureNotifiedCount);
+ }
+
+ @Test
+ @SmallTest
+ public void testMultiple() throws Exception {
+ FeatureList.setTestFeatures(Map.of(BaseFeatures.BROWSER_PROCESS_MEMORY_PURGE, true));
+
+ int count = mGetCount.call();
+ var manager = new MemoryPurgeManagerForTest(ApplicationState.HAS_RUNNING_ACTIVITIES);
+ manager.start();
+
+ // Notify after a delay.
+ manager.onApplicationStateChange(ApplicationState.HAS_STOPPED_ACTIVITIES);
+ runUiThreadFor(MemoryPurgeManager.PURGE_DELAY_MS);
+ Assert.assertEquals(1, manager.mMemoryPressureNotifiedCount);
+
+ // Back to foreground, no notification.
+ manager.onApplicationStateChange(ApplicationState.HAS_RUNNING_ACTIVITIES);
+ runUiThreadFor(MemoryPurgeManager.PURGE_DELAY_MS);
+ Assert.assertEquals(1, manager.mMemoryPressureNotifiedCount);
+ Assert.assertEquals(count + 1, (int) mGetCount.call());
+
+ // Background again, notify
+ manager.onApplicationStateChange(ApplicationState.HAS_STOPPED_ACTIVITIES);
+ runUiThreadFor(MemoryPurgeManager.PURGE_DELAY_MS);
+ Assert.assertEquals(2, manager.mMemoryPressureNotifiedCount);
+ Assert.assertEquals(count + 1, (int) mGetCount.call());
+
+ // Foreground again, record the histogram.
+ manager.onApplicationStateChange(ApplicationState.HAS_RUNNING_ACTIVITIES);
+ Assert.assertEquals(count + 2, (int) mGetCount.call());
+ }
+
+ @Test
+ @SmallTest
+ public void testNoEnoughTimeInBackground() {
+ FeatureList.setTestFeatures(Map.of(BaseFeatures.BROWSER_PROCESS_MEMORY_PURGE, true));
+
+ var manager = new MemoryPurgeManagerForTest(ApplicationState.HAS_RUNNING_ACTIVITIES);
+ manager.start();
+
+ // Background, then foregound inside the delay period.
+ manager.onApplicationStateChange(ApplicationState.HAS_STOPPED_ACTIVITIES);
+ runUiThreadFor(MemoryPurgeManager.PURGE_DELAY_MS / 2);
+ manager.onApplicationStateChange(ApplicationState.HAS_RUNNING_ACTIVITIES);
+ runUiThreadFor(MemoryPurgeManager.PURGE_DELAY_MS);
+ // Went back to foreground, do nothing.
+ Assert.assertEquals(0, manager.mMemoryPressureNotifiedCount);
+
+ // Starts the new task
+ manager.onApplicationStateChange(ApplicationState.HAS_STOPPED_ACTIVITIES);
+ // After some time, foregroung/background cycle.
+ runUiThreadFor(MemoryPurgeManager.PURGE_DELAY_MS / 2);
+ manager.onApplicationStateChange(ApplicationState.HAS_RUNNING_ACTIVITIES);
+ manager.onApplicationStateChange(ApplicationState.HAS_STOPPED_ACTIVITIES);
+ runUiThreadFor(MemoryPurgeManager.PURGE_DELAY_MS / 2);
+ // Not enough time in background.
+ Assert.assertEquals(0, manager.mMemoryPressureNotifiedCount);
+ // But the task got rescheduled.
+ runUiThreadFor(MemoryPurgeManager.PURGE_DELAY_MS / 2);
+ Assert.assertEquals(1, manager.mMemoryPressureNotifiedCount);
+
+ // No new notification.
+ runUiThreadFor(MemoryPurgeManager.PURGE_DELAY_MS * 2);
+ Assert.assertEquals(1, manager.mMemoryPressureNotifiedCount);
+ }
+
+ private void runUiThreadFor(long delayMs) {
+ mFakeTimeTestRule.advanceMillis(delayMs);
+ ShadowLooper.idleMainLooper(delayMs, TimeUnit.MILLISECONDS);
+ }
+}
diff --git a/chromium/base/android/junit/src/org/chromium/base/metrics/CachingUmaRecorderTest.java b/chromium/base/android/junit/src/org/chromium/base/metrics/CachingUmaRecorderTest.java
new file mode 100644
index 00000000000..c149fb933d1
--- /dev/null
+++ b/chromium/base/android/junit/src/org/chromium/base/metrics/CachingUmaRecorderTest.java
@@ -0,0 +1,602 @@
+// Copyright 2020 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.metrics;
+
+import static org.hamcrest.Matchers.greaterThan;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.fail;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+
+import androidx.test.filters.MediumTest;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+import org.chromium.base.Callback;
+import org.chromium.base.test.BaseRobolectricTestRunner;
+
+import java.time.Duration;
+import java.time.Instant;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicIntegerArray;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+/** Unit tests for {@link CachingUmaRecorderTest}. */
+@RunWith(BaseRobolectricTestRunner.class)
+public final class CachingUmaRecorderTest {
+ @Mock
+ UmaRecorder mUmaRecorder;
+
+ @Before
+ public void initMocks() {
+ MockitoAnnotations.initMocks(this);
+ }
+
+ @Test
+ public void testSetDelegateWithEmptyCache() {
+ CachingUmaRecorder cachingUmaRecorder = new CachingUmaRecorder();
+
+ cachingUmaRecorder.setDelegate(mUmaRecorder);
+
+ verifyNoMoreInteractions(mUmaRecorder);
+ }
+
+ @Test
+ public void testRecordBooleanHistogramGetsFlushed() {
+ CachingUmaRecorder cachingUmaRecorder = new CachingUmaRecorder();
+
+ cachingUmaRecorder.recordBooleanHistogram(
+ "cachingUmaRecorderTest.recordBooleanHistogram", true);
+ cachingUmaRecorder.recordBooleanHistogram(
+ "cachingUmaRecorderTest.recordBooleanHistogram", true);
+ cachingUmaRecorder.recordBooleanHistogram(
+ "cachingUmaRecorderTest.recordBooleanHistogram", false);
+
+ assertEquals(3,
+ cachingUmaRecorder.getHistogramTotalCountForTesting(
+ "cachingUmaRecorderTest.recordBooleanHistogram"));
+ assertEquals(2,
+ cachingUmaRecorder.getHistogramValueCountForTesting(
+ "cachingUmaRecorderTest.recordBooleanHistogram", 1));
+ assertEquals(1,
+ cachingUmaRecorder.getHistogramValueCountForTesting(
+ "cachingUmaRecorderTest.recordBooleanHistogram", 0));
+
+ cachingUmaRecorder.setDelegate(mUmaRecorder);
+
+ verify(mUmaRecorder, times(2))
+ .recordBooleanHistogram("cachingUmaRecorderTest.recordBooleanHistogram", true);
+ verify(mUmaRecorder)
+ .recordBooleanHistogram("cachingUmaRecorderTest.recordBooleanHistogram", false);
+ }
+
+ @Test
+ public void testRecordExponentialHistogramGetsFlushed() {
+ CachingUmaRecorder cachingUmaRecorder = new CachingUmaRecorder();
+
+ cachingUmaRecorder.recordExponentialHistogram(
+ "cachingUmaRecorderTest.recordExponentialHistogram", 72, 1, 1000, 50);
+ assertEquals(1,
+ cachingUmaRecorder.getHistogramTotalCountForTesting(
+ "cachingUmaRecorderTest.recordExponentialHistogram"));
+ assertEquals(1,
+ cachingUmaRecorder.getHistogramValueCountForTesting(
+ "cachingUmaRecorderTest.recordExponentialHistogram", 72));
+ cachingUmaRecorder.setDelegate(mUmaRecorder);
+
+ verify(mUmaRecorder)
+ .recordExponentialHistogram(
+ "cachingUmaRecorderTest.recordExponentialHistogram", 72, 1, 1000, 50);
+ }
+
+ @Test
+ public void testRecordLinearHistogramGetsFlushed() {
+ CachingUmaRecorder cachingUmaRecorder = new CachingUmaRecorder();
+
+ cachingUmaRecorder.recordLinearHistogram(
+ "cachingUmaRecorderTest.recordLinearHistogram", 72, 1, 1000, 50);
+ assertEquals(1,
+ cachingUmaRecorder.getHistogramTotalCountForTesting(
+ "cachingUmaRecorderTest.recordLinearHistogram"));
+ assertEquals(1,
+ cachingUmaRecorder.getHistogramValueCountForTesting(
+ "cachingUmaRecorderTest.recordLinearHistogram", 72));
+
+ cachingUmaRecorder.setDelegate(mUmaRecorder);
+
+ verify(mUmaRecorder)
+ .recordLinearHistogram(
+ "cachingUmaRecorderTest.recordLinearHistogram", 72, 1, 1000, 50);
+ }
+
+ @Test
+ public void testRecordSparseHistogramGetsFlushed() {
+ CachingUmaRecorder cachingUmaRecorder = new CachingUmaRecorder();
+
+ cachingUmaRecorder.recordSparseHistogram(
+ "cachingUmaRecorderTest.recordSparseHistogram", 72);
+ assertEquals(1,
+ cachingUmaRecorder.getHistogramTotalCountForTesting(
+ "cachingUmaRecorderTest.recordSparseHistogram"));
+ assertEquals(1,
+ cachingUmaRecorder.getHistogramValueCountForTesting(
+ "cachingUmaRecorderTest.recordSparseHistogram", 72));
+ cachingUmaRecorder.setDelegate(mUmaRecorder);
+
+ verify(mUmaRecorder)
+ .recordSparseHistogram("cachingUmaRecorderTest.recordSparseHistogram", 72);
+ }
+
+ @Test
+ public void testRecordUserActionGetsFlushed() {
+ CachingUmaRecorder cachingUmaRecorder = new CachingUmaRecorder();
+
+ cachingUmaRecorder.recordUserAction("FlushedActionTested", 72);
+ cachingUmaRecorder.setDelegate(mUmaRecorder);
+
+ verify(mUmaRecorder).recordUserAction("FlushedActionTested", 72);
+ }
+
+ @Test
+ public void testRecordUserActionGetsMultipleFlushed() {
+ CachingUmaRecorder cachingUmaRecorder = new CachingUmaRecorder();
+
+ cachingUmaRecorder.recordUserAction("FlushedActionTested.A", 111);
+ cachingUmaRecorder.recordUserAction("FlushedActionTested.B", 222);
+ cachingUmaRecorder.recordUserAction("FlushedActionTested.B", 333);
+ cachingUmaRecorder.setDelegate(mUmaRecorder);
+
+ verify(mUmaRecorder).recordUserAction("FlushedActionTested.A", 111);
+ verify(mUmaRecorder).recordUserAction("FlushedActionTested.B", 222);
+ verify(mUmaRecorder).recordUserAction("FlushedActionTested.B", 333);
+ }
+
+ @Test
+ public void testRecordBooleanHistogramDelegated() {
+ CachingUmaRecorder cachingUmaRecorder = new CachingUmaRecorder();
+ cachingUmaRecorder.setDelegate(mUmaRecorder);
+
+ cachingUmaRecorder.recordBooleanHistogram(
+ "CachingUmaRecorderTest.recordBooleanHistogram", true);
+
+ verify(mUmaRecorder)
+ .recordBooleanHistogram("CachingUmaRecorderTest.recordBooleanHistogram", true);
+ verifyNoMoreInteractions(mUmaRecorder);
+ }
+
+ @Test
+ public void testRecordExponentialHistogramDelegated() {
+ CachingUmaRecorder cachingUmaRecorder = new CachingUmaRecorder();
+ cachingUmaRecorder.setDelegate(mUmaRecorder);
+
+ cachingUmaRecorder.recordExponentialHistogram(
+ "CachingUmaRecorderTest.recordExponentialHistogram", 1, 2, 10, 5);
+
+ verify(mUmaRecorder)
+ .recordExponentialHistogram(
+ "CachingUmaRecorderTest.recordExponentialHistogram", 1, 2, 10, 5);
+ verifyNoMoreInteractions(mUmaRecorder);
+ }
+
+ @Test
+ public void testRecordLinearHistogramDelegated() {
+ CachingUmaRecorder cachingUmaRecorder = new CachingUmaRecorder();
+ cachingUmaRecorder.setDelegate(mUmaRecorder);
+
+ cachingUmaRecorder.recordLinearHistogram(
+ "CachingUmaRecorderTest.recordLinearHistogram", 1, 2, 10, 5);
+
+ verify(mUmaRecorder)
+ .recordLinearHistogram("CachingUmaRecorderTest.recordLinearHistogram", 1, 2, 10, 5);
+ verifyNoMoreInteractions(mUmaRecorder);
+ }
+
+ @Test
+ public void testRecordSparseHistogramDelegated() {
+ CachingUmaRecorder cachingUmaRecorder = new CachingUmaRecorder();
+ cachingUmaRecorder.setDelegate(mUmaRecorder);
+
+ cachingUmaRecorder.recordSparseHistogram(
+ "CachingUmaRecorderTest.recordSparseHistogram", 72);
+
+ verify(mUmaRecorder)
+ .recordSparseHistogram("CachingUmaRecorderTest.recordSparseHistogram", 72);
+ verifyNoMoreInteractions(mUmaRecorder);
+ }
+
+ @Test
+ public void testRecordUserActionDelegated() {
+ CachingUmaRecorder cachingUmaRecorder = new CachingUmaRecorder();
+ cachingUmaRecorder.setDelegate(mUmaRecorder);
+
+ cachingUmaRecorder.recordUserAction("ActionTested", 72);
+
+ verify(mUmaRecorder).recordUserAction("ActionTested", 72);
+ verifyNoMoreInteractions(mUmaRecorder);
+ }
+
+ @Test
+ public void testSetDelegateStopsOldDelegation() {
+ CachingUmaRecorder cachingUmaRecorder = new CachingUmaRecorder();
+ cachingUmaRecorder.setDelegate(mUmaRecorder);
+
+ cachingUmaRecorder.setDelegate(new NoopUmaRecorder());
+ cachingUmaRecorder.recordSparseHistogram("CachingUmaRecorderTest.stopOldDelegation", 72);
+
+ verifyNoMoreInteractions(mUmaRecorder);
+ }
+
+ @Test
+ public void testSetDelegateStartsNewDelegation() {
+ CachingUmaRecorder cachingUmaRecorder = new CachingUmaRecorder();
+ cachingUmaRecorder.setDelegate(new NoopUmaRecorder());
+
+ cachingUmaRecorder.setDelegate(mUmaRecorder);
+ cachingUmaRecorder.recordSparseHistogram("CachingUmaRecorderTest.startNewDelegation", 72);
+
+ verify(mUmaRecorder).recordSparseHistogram("CachingUmaRecorderTest.startNewDelegation", 72);
+ verifyNoMoreInteractions(mUmaRecorder);
+ }
+
+ /**
+ * {@link UmaRecorder} that has a public lock which can be used to block {@link
+ * #recordSparseHistogram(String, int)} }.
+ */
+ private static class BlockingUmaRecorder extends NoopUmaRecorder {
+ public Lock lock = new ReentrantLock();
+
+ @SuppressWarnings("LockNotBeforeTry")
+ @Override
+ public void recordSparseHistogram(String name, int sample) {
+ lock.lock();
+ lock.unlock();
+ }
+ }
+
+ @Test
+ public void testSetDelegateBlocksUntilRecordingDone() throws Exception {
+ CachingUmaRecorder cachingUmaRecorder = new CachingUmaRecorder();
+ BlockingUmaRecorder blockingUmaRecorder = new BlockingUmaRecorder();
+ cachingUmaRecorder.setDelegate(blockingUmaRecorder);
+
+ Thread swappingThread;
+ Thread recordingThread;
+
+ blockingUmaRecorder.lock.lock();
+ try {
+ recordingThread = new Thread(() -> {
+ cachingUmaRecorder.recordSparseHistogram(
+ "CachingUmaRecorderTest.blockUntilRecordingDone", 16);
+ });
+ recordingThread.start();
+ awaitThreadBlocked(recordingThread, Duration.ofSeconds(1));
+
+ swappingThread = new Thread(() -> { cachingUmaRecorder.setDelegate(mUmaRecorder); });
+ swappingThread.start();
+ awaitThreadBlocked(swappingThread, Duration.ofSeconds(1));
+ } finally {
+ blockingUmaRecorder.lock.unlock();
+ }
+
+ recordingThread.join();
+ swappingThread.join();
+ verifyNoMoreInteractions(mUmaRecorder);
+ }
+
+ @SuppressWarnings("ThreadPriorityCheck")
+ private static void awaitThreadBlocked(Thread thread, Duration timeLimit) {
+ final Instant start = Instant.now();
+
+ while (true) {
+ assertThat(timeLimit, greaterThan(Duration.between(start, Instant.now())));
+ switch (thread.getState()) {
+ case BLOCKED:
+ case WAITING:
+ case TIMED_WAITING:
+ return;
+ case NEW:
+ case RUNNABLE: {
+ Thread.yield();
+ continue;
+ }
+ case TERMINATED:
+ fail("Thread unexpectedly terminated.");
+ }
+ }
+ }
+
+ private static class HistogramTestingUmaRecorder implements UmaRecorder {
+ public final AtomicIntegerArray recordedSamples;
+
+ HistogramTestingUmaRecorder(int sampleRange) {
+ recordedSamples = new AtomicIntegerArray(sampleRange);
+ }
+
+ @Override
+ public void recordBooleanHistogram(String name, boolean sample) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void recordExponentialHistogram(
+ String name, int sample, int min, int max, int numBuckets) {
+ // Ignore internal cache metrics.
+ if (name.startsWith("UMA.JavaCachingRecorder")) return;
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void recordLinearHistogram(
+ String name, int sample, int min, int max, int numBuckets) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void recordSparseHistogram(String name, int sample) {
+ recordedSamples.addAndGet(sample, 1);
+ }
+
+ @Override
+ public void recordUserAction(String name, long elapsedRealtimeMillis) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public int getHistogramValueCountForTesting(String name, int sample) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public int getHistogramTotalCountForTesting(String name) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public List<HistogramBucket> getHistogramSamplesForTesting(String name) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void addUserActionCallbackForTesting(Callback<String> callback) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void removeUserActionCallbackForTesting(Callback<String> callback) {
+ throw new UnsupportedOperationException();
+ }
+ }
+
+ @Test
+ @MediumTest
+ @SuppressWarnings("ThreadPriorityCheck")
+ public void testStressParallelHistograms() throws Exception {
+ final int numThreads = 16;
+ final int numRecorders = 16;
+ final int numSamples = CachingUmaRecorder.Histogram.MAX_SAMPLE_COUNT / numThreads;
+ CachingUmaRecorder cachingRecorder = new CachingUmaRecorder();
+
+ HistogramTestingUmaRecorder[] testingRecorders =
+ new HistogramTestingUmaRecorder[numRecorders];
+ for (int i = 0; i < numRecorders; i++) {
+ testingRecorders[i] = new HistogramTestingUmaRecorder(numThreads);
+ }
+ Thread[] threads = new Thread[numThreads];
+ // Each thread records a different sample value.
+ for (int i = 0; i < numThreads; i++) {
+ threads[i] = startHistogramRecordingThread(i, numSamples, cachingRecorder);
+ }
+ // Change recorders while threads are recording metrics.
+ for (HistogramTestingUmaRecorder recorder : testingRecorders) {
+ cachingRecorder.setDelegate(recorder);
+ Thread.yield();
+ }
+ for (Thread thread : threads) {
+ thread.join();
+ }
+ cachingRecorder.setDelegate(mUmaRecorder);
+ verifyNoMoreInteractions(mUmaRecorder);
+ for (int i = 0; i < numThreads; i++) {
+ int actualSamples = 0;
+ for (HistogramTestingUmaRecorder recorder : testingRecorders) {
+ actualSamples += recorder.recordedSamples.get(i);
+ }
+ assertThat(String.format("thread[%d] total samples", i), actualSamples, is(numSamples));
+ }
+ }
+
+ @SuppressWarnings("ThreadPriorityCheck")
+ private static Thread startHistogramRecordingThread(
+ int sample, int count, UmaRecorder recorder) {
+ Thread thread = new Thread(() -> {
+ for (int i = 0; i < count; i++) {
+ recorder.recordSparseHistogram("StressTest", sample);
+ // Make it more likely this thread will be preempted.
+ Thread.yield();
+ }
+ });
+ thread.start();
+ return thread;
+ }
+
+ private static class UserActionTestingUmaRecorder implements UmaRecorder {
+ public final AtomicIntegerArray recordedSamples;
+
+ UserActionTestingUmaRecorder(int sampleRange) {
+ recordedSamples = new AtomicIntegerArray(sampleRange);
+ }
+
+ @Override
+ public void recordBooleanHistogram(String name, boolean sample) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void recordExponentialHistogram(
+ String name, int sample, int min, int max, int numBuckets) {
+ // Ignore internal cache metrics.
+ if (name.startsWith("UMA.JavaCachingRecorder")) return;
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void recordLinearHistogram(
+ String name, int sample, int min, int max, int numBuckets) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void recordSparseHistogram(String name, int sample) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void recordUserAction(String name, long elapsedRealtimeMillis) {
+ recordedSamples.addAndGet((int) elapsedRealtimeMillis, 1);
+ }
+
+ @Override
+ public int getHistogramValueCountForTesting(String name, int sample) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public int getHistogramTotalCountForTesting(String name) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public List<HistogramBucket> getHistogramSamplesForTesting(String name) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void addUserActionCallbackForTesting(Callback<String> callback) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void removeUserActionCallbackForTesting(Callback<String> callback) {
+ throw new UnsupportedOperationException();
+ }
+ }
+
+ @Test
+ @MediumTest
+ @SuppressWarnings("ThreadPriorityCheck")
+ public void testStressParallelUserActions() throws Exception {
+ final int numThreads = 16;
+ final int numRecorders = 16;
+ final int numSamples = CachingUmaRecorder.MAX_USER_ACTION_COUNT / numThreads;
+ CachingUmaRecorder cachingRecorder = new CachingUmaRecorder();
+
+ UserActionTestingUmaRecorder[] testingRecorders =
+ new UserActionTestingUmaRecorder[numRecorders];
+ for (int i = 0; i < numRecorders; i++) {
+ testingRecorders[i] = new UserActionTestingUmaRecorder(numThreads);
+ }
+ Thread[] threads = new Thread[numThreads];
+ // Each thread records a different timestamp value.
+ for (int i = 0; i < numThreads; i++) {
+ threads[i] = startUserActionRecordingThread(i, numSamples, cachingRecorder);
+ }
+ // Change recorders while threads are recording metrics.
+ for (UserActionTestingUmaRecorder recorder : testingRecorders) {
+ cachingRecorder.setDelegate(recorder);
+ Thread.yield();
+ }
+ for (Thread thread : threads) {
+ thread.join();
+ }
+ cachingRecorder.setDelegate(mUmaRecorder);
+ verifyNoMoreInteractions(mUmaRecorder);
+ for (int i = 0; i < numThreads; i++) {
+ int actualSamples = 0;
+ for (UserActionTestingUmaRecorder recorder : testingRecorders) {
+ actualSamples += recorder.recordedSamples.get(i);
+ }
+ assertThat(String.format("thread[%d] total samples", i), actualSamples, is(numSamples));
+ }
+ }
+
+ @SuppressWarnings("ThreadPriorityCheck")
+ private static Thread startUserActionRecordingThread(
+ int sample, int count, UmaRecorder recorder) {
+ Thread thread = new Thread(() -> {
+ for (int i = 0; i < count; i++) {
+ recorder.recordUserAction("StressTestUserAction." + i, sample);
+ // Make it more likely this thread will be preempted.
+ Thread.yield();
+ }
+ });
+ thread.start();
+ return thread;
+ }
+
+ @Test
+ public void testUserActionCallbacksTriggeredWithoutDelegate() {
+ CachingUmaRecorder cachingRecorder = new CachingUmaRecorder();
+
+ AtomicInteger callbackCount = new AtomicInteger();
+ Callback<String> testCallback1 = (result) -> callbackCount.incrementAndGet();
+ cachingRecorder.addUserActionCallbackForTesting(testCallback1);
+
+ // Ensure that the callback is notified if attached to the caching recorder (will not
+ // be notified once a delegate is responsible).
+ Assert.assertEquals(0, callbackCount.get());
+ cachingRecorder.recordUserAction("TEST", 0);
+ Assert.assertEquals(1, callbackCount.get());
+ cachingRecorder.recordUserAction("TEST", 0);
+ Assert.assertEquals(2, callbackCount.get());
+
+ // Remove the callback and ensure it is no longer called.
+ cachingRecorder.removeUserActionCallbackForTesting(testCallback1);
+ Assert.assertEquals(2, callbackCount.get());
+ cachingRecorder.recordUserAction("TEST", 0);
+ Assert.assertEquals(2, callbackCount.get());
+ }
+
+ @Test
+ public void testUserActionCallbacksSwappedBetweenDelegates() {
+ CachingUmaRecorder cachingRecorder = new CachingUmaRecorder();
+
+ Callback<String> testCallback1 = (result) -> {};
+ Callback<String> testCallback2 = (result) -> {};
+ cachingRecorder.addUserActionCallbackForTesting(testCallback1);
+ cachingRecorder.addUserActionCallbackForTesting(testCallback2);
+
+ // Validate that previously added callbacks are passed to the new delegate.
+ UmaRecorder delegate1 = Mockito.mock(UmaRecorder.class);
+ cachingRecorder.setDelegate(delegate1);
+ verify(delegate1).addUserActionCallbackForTesting(testCallback1);
+ verify(delegate1).addUserActionCallbackForTesting(testCallback2);
+
+ // Validate that previously added callbacks are removed from the previous delegate, and
+ // passed to the new delegate.
+ UmaRecorder delegate2 = Mockito.mock(UmaRecorder.class);
+ cachingRecorder.setDelegate(delegate2);
+ verify(delegate1).removeUserActionCallbackForTesting(testCallback1);
+ verify(delegate1).removeUserActionCallbackForTesting(testCallback2);
+ verify(delegate2).addUserActionCallbackForTesting(testCallback1);
+ verify(delegate2).addUserActionCallbackForTesting(testCallback2);
+
+ // Ensure a callback added later is also added correctly.
+ Callback<String> testCallback3 = (result) -> {};
+ cachingRecorder.addUserActionCallbackForTesting(testCallback3);
+ verifyNoMoreInteractions(delegate1);
+ verify(delegate2).addUserActionCallbackForTesting(testCallback3);
+ }
+}
diff --git a/chromium/base/android/junit/src/org/chromium/base/process_launcher/ChildConnectionAllocatorTest.java b/chromium/base/android/junit/src/org/chromium/base/process_launcher/ChildConnectionAllocatorTest.java
new file mode 100644
index 00000000000..ce7e2dc6d20
--- /dev/null
+++ b/chromium/base/android/junit/src/org/chromium/base/process_launcher/ChildConnectionAllocatorTest.java
@@ -0,0 +1,455 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.process_launcher;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.os.Bundle;
+import android.os.Handler;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
+import org.robolectric.shadows.ShadowLooper;
+
+import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.base.test.util.Feature;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/** Unit tests for the ChildConnectionAllocator class. */
+@Config(manifest = Config.NONE)
+@RunWith(BaseRobolectricTestRunner.class)
+@LooperMode(LooperMode.Mode.LEGACY)
+public class ChildConnectionAllocatorTest {
+ private static final String TEST_PACKAGE_NAME = "org.chromium.allocator_test";
+
+ private static final int MAX_CONNECTION_NUMBER = 2;
+
+ private static final int FREE_CONNECTION_TEST_CALLBACK_START_FAILED = 1;
+ private static final int FREE_CONNECTION_TEST_CALLBACK_PROCESS_DIED = 2;
+
+ @Mock
+ private ChildProcessConnection.ServiceCallback mServiceCallback;
+
+ static class TestConnectionFactory implements ChildConnectionAllocator.ConnectionFactory {
+ private ComponentName mLastServiceName;
+ private String mLastInstanceName;
+
+ private ChildProcessConnection mConnection;
+
+ private ChildProcessConnection.ServiceCallback mConnectionServiceCallback;
+
+ @Override
+ public ChildProcessConnection createConnection(Context context, ComponentName serviceName,
+ ComponentName fallbackServiceName, boolean bindToCaller,
+ boolean bindAsExternalService, Bundle serviceBundle, String instanceName) {
+ mLastServiceName = serviceName;
+ mLastInstanceName = instanceName;
+ if (mConnection == null) {
+ mConnection = mock(ChildProcessConnection.class);
+ // Retrieve the ServiceCallback so we can simulate the service process dying.
+ doAnswer(new Answer() {
+ @Override
+ public Object answer(InvocationOnMock invocation) {
+ mConnectionServiceCallback =
+ (ChildProcessConnection.ServiceCallback) invocation.getArgument(1);
+ return null;
+ }
+ })
+ .when(mConnection)
+ .start(anyBoolean(), any(ChildProcessConnection.ServiceCallback.class));
+ }
+ return mConnection;
+ }
+
+ public ComponentName getAndResetLastServiceName() {
+ ComponentName serviceName = mLastServiceName;
+ mLastServiceName = null;
+ return serviceName;
+ }
+
+ public String getAndResetLastInstanceName() {
+ String instanceName = mLastInstanceName;
+ mLastInstanceName = null;
+ return instanceName;
+ }
+
+ // Use this method to have a callback invoked when the connection is started on the next
+ // created connection.
+ public void invokeCallbackOnConnectionStart(final boolean onChildStarted,
+ final boolean onStartFailed, final boolean onChildProcessDied) {
+ final ChildProcessConnection connection = mock(ChildProcessConnection.class);
+ mConnection = connection;
+ doAnswer(new Answer() {
+ @Override
+ public Object answer(InvocationOnMock invocation) {
+ ChildProcessConnection.ServiceCallback serviceCallback =
+ (ChildProcessConnection.ServiceCallback) invocation.getArgument(1);
+ if (onChildStarted) {
+ serviceCallback.onChildStarted();
+ }
+ if (onStartFailed) {
+ serviceCallback.onChildStartFailed(connection);
+ }
+ if (onChildProcessDied) {
+ serviceCallback.onChildProcessDied(connection);
+ }
+ return null;
+ }
+ })
+ .when(mConnection)
+ .start(anyBoolean(), any(ChildProcessConnection.ServiceCallback.class));
+ }
+
+ public void simulateServiceStartFailed() {
+ mConnectionServiceCallback.onChildStartFailed(mConnection);
+ }
+
+ public void simulateServiceProcessDying() {
+ mConnectionServiceCallback.onChildProcessDied(mConnection);
+ }
+ }
+
+ private final TestConnectionFactory mTestConnectionFactory = new TestConnectionFactory();
+
+ private ChildConnectionAllocator.FixedSizeAllocatorImpl mAllocator;
+ private ChildConnectionAllocator mVariableSizeAllocator;
+ private ChildConnectionAllocator mWorkaroundAllocator;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ mAllocator = ChildConnectionAllocator.createFixedForTesting(null, TEST_PACKAGE_NAME,
+ "AllocatorTest", MAX_CONNECTION_NUMBER, true /* bindToCaller */,
+ false /* bindAsExternalService */, false /* useStrongBinding */);
+ mAllocator.setConnectionFactoryForTesting(mTestConnectionFactory);
+
+ mVariableSizeAllocator = ChildConnectionAllocator.createVariableSizeForTesting(
+ new Handler(), TEST_PACKAGE_NAME, null /* freeSlotCallback */, "AllocatorTest",
+ true /* bindTocall */, false /* bindAsExternalService */,
+ false /* useStrongBinding */, 10);
+ mVariableSizeAllocator.setConnectionFactoryForTesting(mTestConnectionFactory);
+
+ mWorkaroundAllocator = ChildConnectionAllocator.createWorkaroundForTesting(new Handler(),
+ TEST_PACKAGE_NAME, null /* freeSlotCallback */, "AllocatorTest",
+ true /* bindTocall */, false /* bindAsExternalService */,
+ false /* useStrongBinding */, 10);
+ mWorkaroundAllocator.setConnectionFactoryForTesting(mTestConnectionFactory);
+ }
+
+ @Test
+ @Feature({"ProcessManagement"})
+ public void testPlainAllocate() {
+ assertFalse(mAllocator.anyConnectionAllocated());
+ assertEquals(MAX_CONNECTION_NUMBER, mAllocator.getNumberOfServices());
+
+ ChildProcessConnection connection =
+ mAllocator.allocate(null /* context */, null /* serviceBundle */, mServiceCallback);
+ assertNotNull(connection);
+
+ verify(connection, times(1))
+ .start(eq(false) /* useStrongBinding */,
+ any(ChildProcessConnection.ServiceCallback.class));
+ assertTrue(mAllocator.anyConnectionAllocated());
+ }
+
+ /** Tests that different services are created until we reach the max number specified. */
+ @Test
+ @Feature({"ProcessManagement"})
+ public void testAllocateMaxNumber() {
+ assertTrue(mAllocator.isFreeConnectionAvailable());
+ Set<ComponentName> serviceNames = new HashSet<>();
+ for (int i = 0; i < MAX_CONNECTION_NUMBER; i++) {
+ ChildProcessConnection connection = mAllocator.allocate(
+ null /* context */, null /* serviceBundle */, mServiceCallback);
+ assertNotNull(connection);
+ ComponentName serviceName = mTestConnectionFactory.getAndResetLastServiceName();
+ assertFalse(serviceNames.contains(serviceName));
+ serviceNames.add(serviceName);
+ }
+ assertFalse(mAllocator.isFreeConnectionAvailable());
+ assertNull(mAllocator.allocate(
+ null /* context */, null /* serviceBundle */, mServiceCallback));
+ }
+
+ @Test
+ @Feature({"ProcessManagement"})
+ public void testQueueAllocation() {
+ Runnable freeConnectionCallback = mock(Runnable.class);
+ mAllocator = ChildConnectionAllocator.createFixedForTesting(freeConnectionCallback,
+ TEST_PACKAGE_NAME, "AllocatorTest", 1, true /* bindToCaller */,
+ false /* bindAsExternalService */, false /* useStrongBinding */);
+ doTestQueueAllocation(mAllocator, freeConnectionCallback);
+ }
+
+ @Test
+ @Feature({"ProcessManagement"})
+ public void testQueueAllocationVariableSize() {
+ Runnable freeConnectionCallback = mock(Runnable.class);
+ mVariableSizeAllocator = ChildConnectionAllocator.createVariableSizeForTesting(
+ new Handler(), TEST_PACKAGE_NAME, freeConnectionCallback, "AllocatorTest",
+ true /* bindToCaller */, false /* bindAsExternalService */,
+ false /* useStrongBinding */, 1);
+ doTestQueueAllocation(mVariableSizeAllocator, freeConnectionCallback);
+ }
+
+ @Test
+ @Feature({"ProcessManagement"})
+ public void testQueueAllocationWorkaround() {
+ Runnable freeConnectionCallback = mock(Runnable.class);
+ mWorkaroundAllocator = ChildConnectionAllocator.createWorkaroundForTesting(new Handler(),
+ TEST_PACKAGE_NAME, freeConnectionCallback, "AllocatorTest", true /* bindToCaller */,
+ false /* bindAsExternalService */, false /* useStrongBinding */, 1);
+ doTestQueueAllocation(mWorkaroundAllocator, freeConnectionCallback);
+ }
+
+ private void doTestQueueAllocation(
+ ChildConnectionAllocator allocator, Runnable freeConnectionCallback) {
+ allocator.setConnectionFactoryForTesting(mTestConnectionFactory);
+ // Occupy all slots.
+ ChildProcessConnection connection =
+ allocator.allocate(null /* context */, null /* serviceBundle */, mServiceCallback);
+ assertNotNull(connection);
+ assertEquals(1, allocator.allocatedConnectionsCountForTesting());
+
+ final ChildProcessConnection newConnection[] = new ChildProcessConnection[2];
+ Runnable allocate1 = () -> {
+ newConnection[0] = allocator.allocate(
+ null /* context */, null /* serviceBundle */, mServiceCallback);
+ };
+ Runnable allocate2 = () -> {
+ newConnection[1] = allocator.allocate(
+ null /* context */, null /* serviceBundle */, mServiceCallback);
+ };
+ allocator.queueAllocation(allocate1);
+ allocator.queueAllocation(allocate2);
+ verify(freeConnectionCallback, times(1)).run();
+ assertNull(newConnection[0]);
+
+ mTestConnectionFactory.simulateServiceProcessDying();
+ ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
+ assertNotNull(newConnection[0]);
+ assertNull(newConnection[1]);
+
+ mTestConnectionFactory.simulateServiceProcessDying();
+ ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
+ assertNotNull(newConnection[1]);
+ }
+
+ /**
+ * Tests that the connection is created with the useStrongBinding parameter specified in the
+ * allocator.
+ */
+ @Test
+ @Feature({"ProcessManagement"})
+ public void testStrongBindingParam() {
+ for (boolean useStrongBinding : new boolean[] {true, false}) {
+ ChildConnectionAllocator allocator = ChildConnectionAllocator.createFixedForTesting(
+ null, TEST_PACKAGE_NAME, "AllocatorTest", MAX_CONNECTION_NUMBER,
+ true /* bindToCaller */, false /* bindAsExternalService */, useStrongBinding);
+ allocator.setConnectionFactoryForTesting(mTestConnectionFactory);
+ ChildProcessConnection connection = allocator.allocate(
+ null /* context */, null /* serviceBundle */, mServiceCallback);
+ verify(connection, times(0)).start(useStrongBinding, mServiceCallback);
+ }
+ }
+
+ /**
+ * Tests that the various ServiceCallbacks are propagated and posted, so they happen after the
+ * ChildProcessAllocator,allocate() method has returned.
+ */
+ public void runTestWithConnectionCallbacks(ChildConnectionAllocator allocator,
+ boolean onChildStarted, boolean onChildStartFailed, boolean onChildProcessDied) {
+ // We have to pause the Roboletric looper or it'll execute the posted tasks synchronoulsy.
+ ShadowLooper.pauseMainLooper();
+ mTestConnectionFactory.invokeCallbackOnConnectionStart(
+ onChildStarted, onChildStartFailed, onChildProcessDied);
+ ChildProcessConnection connection =
+ allocator.allocate(null /* context */, null /* serviceBundle */, mServiceCallback);
+ assertNotNull(connection);
+
+ // Callbacks are posted.
+ verify(mServiceCallback, never()).onChildStarted();
+ verify(mServiceCallback, never()).onChildStartFailed(any());
+ verify(mServiceCallback, never()).onChildProcessDied(any());
+ ShadowLooper.unPauseMainLooper();
+ ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
+ verify(mServiceCallback, times(onChildStarted ? 1 : 0)).onChildStarted();
+ verify(mServiceCallback, times(onChildStartFailed ? 1 : 0)).onChildStartFailed(any());
+ verify(mServiceCallback, times(onChildProcessDied ? 1 : 0)).onChildProcessDied(any());
+ }
+
+ @Test
+ @Feature({"ProcessManagement"})
+ public void testOnChildStartedCallback() {
+ runTestWithConnectionCallbacks(mAllocator, true /* onChildStarted */,
+ false /* onChildStartFailed */, false /* onChildProcessDied */);
+ }
+
+ @Test
+ @Feature({"ProcessManagement"})
+ public void testOnChildStartedCallbackVariableSize() {
+ runTestWithConnectionCallbacks(mVariableSizeAllocator, true /* onChildStarted */,
+ false /* onChildStartFailed */, false /* onChildProcessDied */);
+ }
+
+ @Test
+ @Feature({"ProcessManagement"})
+ public void testOnChildStartedCallbackWorkaround() {
+ runTestWithConnectionCallbacks(mWorkaroundAllocator, true /* onChildStarted */,
+ false /* onChildStartFailed */, false /* onChildProcessDied */);
+ }
+
+ @Test
+ @Feature({"ProcessManagement"})
+ public void testOnChildStartFailedCallback() {
+ runTestWithConnectionCallbacks(mAllocator, false /* onChildStarted */,
+ true /* onChildStartFailed */, false /* onChildProcessDied */);
+ }
+
+ @Test
+ @Feature({"ProcessManagement"})
+ public void testOnChildStartFailedCallbackVariableSize() {
+ runTestWithConnectionCallbacks(mVariableSizeAllocator, false /* onChildStarted */,
+ true /* onChildStartFailed */, false /* onChildProcessDied */);
+ }
+
+ @Test
+ @Feature({"ProcessManagement"})
+ public void testOnChildStartFailedCallbackWorkaround() {
+ runTestWithConnectionCallbacks(mWorkaroundAllocator, false /* onChildStarted */,
+ true /* onChildStartFailed */, false /* onChildProcessDied */);
+ }
+
+ @Test
+ @Feature({"ProcessManagement"})
+ public void testOnChildProcessDiedCallback() {
+ runTestWithConnectionCallbacks(mAllocator, false /* onChildStarted */,
+ false /* onChildStartFailed */, true /* onChildProcessDied */);
+ }
+
+ @Test
+ @Feature({"ProcessManagement"})
+ public void testOnChildProcessDiedCallbackWithVariableSize() {
+ runTestWithConnectionCallbacks(mVariableSizeAllocator, false /* onChildStarted */,
+ false /* onChildStartFailed */, true /* onChildProcessDied */);
+ }
+
+ @Test
+ @Feature({"ProcessManagement"})
+ public void testOnChildProcessDiedCallbackWorkaround() {
+ runTestWithConnectionCallbacks(mWorkaroundAllocator, false /* onChildStarted */,
+ false /* onChildStartFailed */, true /* onChildProcessDied */);
+ }
+
+ /**
+ * Tests that the allocator clears the connection when it fails to bind/process dies.
+ */
+ private void testFreeConnection(ChildConnectionAllocator allocator, int callbackType) {
+ ChildProcessConnection connection =
+ allocator.allocate(null /* context */, null /* serviceBundle */, mServiceCallback);
+
+ assertNotNull(connection);
+ ComponentName serviceName = mTestConnectionFactory.getAndResetLastServiceName();
+ String instanceName = mTestConnectionFactory.getAndResetLastInstanceName();
+ verify(connection, times(1))
+ .start(eq(false) /* useStrongBinding */,
+ any(ChildProcessConnection.ServiceCallback.class));
+ assertTrue(allocator.anyConnectionAllocated());
+ int onChildStartFailedExpectedCount = 0;
+ int onChildProcessDiedExpectedCount = 0;
+ switch (callbackType) {
+ case FREE_CONNECTION_TEST_CALLBACK_START_FAILED:
+ mTestConnectionFactory.simulateServiceStartFailed();
+ onChildStartFailedExpectedCount = 1;
+ break;
+ case FREE_CONNECTION_TEST_CALLBACK_PROCESS_DIED:
+ mTestConnectionFactory.simulateServiceProcessDying();
+ onChildProcessDiedExpectedCount = 1;
+ break;
+ default:
+ fail();
+ break;
+ }
+ ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
+ assertFalse(allocator.anyConnectionAllocated());
+ verify(mServiceCallback, never()).onChildStarted();
+ verify(mServiceCallback, times(onChildStartFailedExpectedCount))
+ .onChildStartFailed(connection);
+ verify(mServiceCallback, times(onChildProcessDiedExpectedCount))
+ .onChildProcessDied(connection);
+
+ // Allocate a new connection to make sure we are not getting the same connection.
+ connection =
+ allocator.allocate(null /* context */, null /* serviceBundle */, mServiceCallback);
+ assertNotNull(connection);
+ if (instanceName == null) {
+ assertNotEquals(mTestConnectionFactory.getAndResetLastServiceName(), serviceName);
+ } else {
+ assertNotEquals(mTestConnectionFactory.getAndResetLastInstanceName(), instanceName);
+ }
+ }
+
+ @Test
+ @Feature({"ProcessManagement"})
+ public void testFreeConnectionOnChildStartFailed() {
+ testFreeConnection(mAllocator, FREE_CONNECTION_TEST_CALLBACK_START_FAILED);
+ }
+
+ @Test
+ @Feature({"ProcessManagement"})
+ public void testFreeConnectionOnChildStartFailedVariableSize() {
+ testFreeConnection(mVariableSizeAllocator, FREE_CONNECTION_TEST_CALLBACK_START_FAILED);
+ }
+
+ @Test
+ @Feature({"ProcessManagement"})
+ public void testFreeConnectionOnChildStartFailedWorkaround() {
+ testFreeConnection(mWorkaroundAllocator, FREE_CONNECTION_TEST_CALLBACK_START_FAILED);
+ }
+
+ @Test
+ @Feature({"ProcessManagement"})
+ public void testFreeConnectionOnChildProcessDied() {
+ testFreeConnection(mAllocator, FREE_CONNECTION_TEST_CALLBACK_PROCESS_DIED);
+ }
+
+ @Test
+ @Feature({"ProcessManagement"})
+ public void testFreeConnectionOnChildProcessDiedVariableSize() {
+ testFreeConnection(mVariableSizeAllocator, FREE_CONNECTION_TEST_CALLBACK_PROCESS_DIED);
+ }
+
+ @Test
+ @Feature({"ProcessManagement"})
+ public void testFreeConnectionOnChildProcessDiedWorkaround() {
+ testFreeConnection(mWorkaroundAllocator, FREE_CONNECTION_TEST_CALLBACK_PROCESS_DIED);
+ }
+}
diff --git a/chromium/base/android/junit/src/org/chromium/base/process_launcher/ChildProcessConnectionTest.java b/chromium/base/android/junit/src/org/chromium/base/process_launcher/ChildProcessConnectionTest.java
new file mode 100644
index 00000000000..1a2ad5d94de
--- /dev/null
+++ b/chromium/base/android/junit/src/org/chromium/base/process_launcher/ChildProcessConnectionTest.java
@@ -0,0 +1,665 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.process_launcher;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.AdditionalMatchers.or;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.isNull;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.ComponentName;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.os.Binder;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.os.RemoteException;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
+import org.robolectric.shadows.ShadowLooper;
+
+import org.chromium.base.BuildInfo;
+import org.chromium.base.ChildBindingState;
+import org.chromium.base.test.BaseRobolectricTestRunner;
+
+import java.util.ArrayList;
+
+/** Unit tests for ChildProcessConnection. */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+@LooperMode(LooperMode.Mode.LEGACY)
+public class ChildProcessConnectionTest {
+ private static class ChildServiceConnectionMock implements ChildServiceConnection {
+ private final Intent mBindIntent;
+ private final ChildServiceConnectionDelegate mDelegate;
+ private boolean mBound;
+ private int mGroup;
+ private int mImportanceInGroup;
+ private boolean mBindResult = true;
+
+ public ChildServiceConnectionMock(
+ Intent bindIntent, ChildServiceConnectionDelegate delegate) {
+ mBindIntent = bindIntent;
+ mDelegate = delegate;
+ }
+
+ @Override
+ public boolean bindServiceConnection() {
+ mBound = true;
+ return mBindResult;
+ }
+
+ @Override
+ public void unbindServiceConnection() {
+ mBound = false;
+ }
+
+ @Override
+ public boolean isBound() {
+ return mBound;
+ }
+
+ @Override
+ public void updateGroupImportance(int group, int importanceInGroup) {
+ mGroup = group;
+ mImportanceInGroup = importanceInGroup;
+ }
+
+ @Override
+ public void retire() {
+ mBound = false;
+ }
+
+ public void setBindResult(boolean result) {
+ mBindResult = result;
+ }
+
+ public void notifyServiceConnected(IBinder service) {
+ mDelegate.onServiceConnected(service);
+ }
+
+ public void notifyServiceDisconnected() {
+ mDelegate.onServiceDisconnected();
+ }
+
+ public Intent getBindIntent() {
+ return mBindIntent;
+ }
+
+ public int getGroup() {
+ return mGroup;
+ }
+
+ public int getImportanceInGroup() {
+ return mImportanceInGroup;
+ }
+ };
+
+ private final ChildServiceConnectionFactory mServiceConnectionFactory =
+ new ChildServiceConnectionFactory() {
+ @Override
+ public ChildServiceConnection createConnection(Intent bindIntent, int bindFlags,
+ ChildServiceConnectionDelegate delegate, String instanceName) {
+ ChildServiceConnectionMock connection =
+ spy(new ChildServiceConnectionMock(bindIntent, delegate));
+ if (mFirstServiceConnection == null) {
+ mFirstServiceConnection = connection;
+ }
+ mMockConnections.add(connection);
+ return connection;
+ }
+ };
+
+ @Mock
+ private ChildProcessConnection.ServiceCallback mServiceCallback;
+
+ @Mock
+ private ChildProcessConnection.ConnectionCallback mConnectionCallback;
+
+ @Mock
+ private ChildProcessConnection.ZygoteInfoCallback mZygoteInfoCallback;
+
+ private IChildProcessService mIChildProcessService;
+
+ private Binder mChildProcessServiceBinder;
+
+ private ChildServiceConnectionMock mFirstServiceConnection;
+ private final ArrayList<ChildServiceConnectionMock> mMockConnections = new ArrayList<>();
+
+ // Parameters captured from the IChildProcessService.setupConnection() call
+ private Bundle mConnectionBundle;
+ private IParentProcess mConnectionParentProcess;
+
+ @Before
+ public void setUp() throws RemoteException {
+ MockitoAnnotations.initMocks(this);
+
+ mIChildProcessService = mock(IChildProcessService.class);
+ ApplicationInfo appInfo = BuildInfo.getInstance().getBrowserApplicationInfo();
+ when(mIChildProcessService.getAppInfo()).thenReturn(appInfo);
+ // Capture the parameters passed to the IChildProcessService.setupConnection() call.
+ doAnswer(new Answer<Void>() {
+ @Override
+ public Void answer(InvocationOnMock invocation) {
+ mConnectionBundle = (Bundle) invocation.getArgument(0);
+ mConnectionParentProcess = (IParentProcess) invocation.getArgument(1);
+ return null;
+ }
+ })
+ .when(mIChildProcessService)
+ .setupConnection(
+ or(isNull(), any(Bundle.class)), or(isNull(), any()), or(isNull(), any()));
+
+ mChildProcessServiceBinder = new Binder();
+ mChildProcessServiceBinder.attachInterface(
+ mIChildProcessService, IChildProcessService.class.getName());
+ }
+
+ private ChildProcessConnection createDefaultTestConnection() {
+ return createTestConnection(false /* bindToCaller */, false /* bindAsExternalService */,
+ null /* serviceBundle */, false /* useFallback */);
+ }
+
+ private ChildProcessConnection createTestConnection(boolean bindToCaller,
+ boolean bindAsExternalService, Bundle serviceBundle, boolean useFallback) {
+ String packageName = "org.chromium.test";
+ String serviceName = "TestService";
+ String fallbackServiceName = "TestFallbackService";
+ return new ChildProcessConnection(null /* context */,
+ new ComponentName(packageName, serviceName),
+ useFallback ? new ComponentName(packageName, fallbackServiceName) : null,
+ bindToCaller, bindAsExternalService, serviceBundle, mServiceConnectionFactory,
+ null /* instanceName */);
+ }
+
+ private void sendPid(int pid) throws RemoteException {
+ mConnectionParentProcess.finishSetupConnection(
+ pid, 0 /* zygotePid */, -1 /* zygoteStartupTimeMillis */, null /* relroBundle */);
+ }
+
+ @Test
+ public void testStrongBinding() {
+ ChildProcessConnection connection = createDefaultTestConnection();
+ connection.start(true /* useStrongBinding */, null /* serviceCallback */);
+ assertTrue(connection.isStrongBindingBound());
+
+ connection = createDefaultTestConnection();
+ connection.start(false /* useStrongBinding */, null /* serviceCallback */);
+ assertFalse(connection.isStrongBindingBound());
+ }
+
+ @Test
+ public void testServiceBundle() {
+ Bundle serviceBundle = new Bundle();
+ final String intKey = "org.chromium.myInt";
+ final int intValue = 34;
+ final int defaultValue = -1;
+ serviceBundle.putInt(intKey, intValue);
+ String stringKey = "org.chromium.myString";
+ String stringValue = "thirty four";
+ serviceBundle.putString(stringKey, stringValue);
+
+ ChildProcessConnection connection = createTestConnection(false /* bindToCaller */,
+ false /* bindAsExternalService */, serviceBundle, false /* useFallback */);
+ // Start the connection without the ChildServiceConnection connecting.
+ connection.start(false /* useStrongBinding */, null /* serviceCallback */);
+ assertNotNull(mFirstServiceConnection);
+ Intent bindIntent = mFirstServiceConnection.getBindIntent();
+ assertNotNull(bindIntent);
+ assertEquals(intValue, bindIntent.getIntExtra(intKey, defaultValue));
+ assertEquals(stringValue, bindIntent.getStringExtra(stringKey));
+ }
+
+ @Test
+ public void testServiceStartsSuccessfully() {
+ ChildProcessConnection connection = createDefaultTestConnection();
+ assertNotNull(mFirstServiceConnection);
+ connection.start(false /* useStrongBinding */, mServiceCallback);
+ Assert.assertTrue(connection.isVisibleBindingBound());
+ Assert.assertFalse(connection.didOnServiceConnectedForTesting());
+ verify(mServiceCallback, never()).onChildStarted();
+ verify(mServiceCallback, never()).onChildStartFailed(any());
+ verify(mServiceCallback, never()).onChildProcessDied(any());
+
+ // The service connects.
+ mFirstServiceConnection.notifyServiceConnected(mChildProcessServiceBinder);
+ Assert.assertTrue(connection.didOnServiceConnectedForTesting());
+ verify(mServiceCallback, times(1)).onChildStarted();
+ verify(mServiceCallback, never()).onChildStartFailed(any());
+ verify(mServiceCallback, never()).onChildProcessDied(any());
+ }
+
+ @Test
+ public void testServiceStartsAndFailsToBind() {
+ ChildProcessConnection connection = createDefaultTestConnection();
+ assertNotNull(mFirstServiceConnection);
+ // Note we use doReturn so the actual bindServiceConnection() method is not called (it would
+ // with when(mFirstServiceConnection.bindServiceConnection()).thenReturn(false).
+ doReturn(false).when(mFirstServiceConnection).bindServiceConnection();
+ connection.start(false /* useStrongBinding */, mServiceCallback);
+
+ Assert.assertFalse(connection.isVisibleBindingBound());
+ Assert.assertFalse(connection.didOnServiceConnectedForTesting());
+ verify(mServiceCallback, never()).onChildStarted();
+ verify(mServiceCallback, never()).onChildStartFailed(any());
+ verify(mServiceCallback, times(1)).onChildProcessDied(connection);
+ }
+
+ @Test
+ public void testServiceStops() {
+ ChildProcessConnection connection = createDefaultTestConnection();
+ assertNotNull(mFirstServiceConnection);
+ connection.start(false /* useStrongBinding */, mServiceCallback);
+ mFirstServiceConnection.notifyServiceConnected(mChildProcessServiceBinder);
+ connection.stop();
+ verify(mServiceCallback, times(1)).onChildStarted();
+ verify(mServiceCallback, never()).onChildStartFailed(any());
+ verify(mServiceCallback, times(1)).onChildProcessDied(connection);
+ }
+
+ @Test
+ public void testServiceDisconnects() {
+ ChildProcessConnection connection = createDefaultTestConnection();
+ assertNotNull(mFirstServiceConnection);
+ connection.start(false /* useStrongBinding */, mServiceCallback);
+ mFirstServiceConnection.notifyServiceConnected(mChildProcessServiceBinder);
+ mFirstServiceConnection.notifyServiceDisconnected();
+ verify(mServiceCallback, times(1)).onChildStarted();
+ verify(mServiceCallback, never()).onChildStartFailed(any());
+ verify(mServiceCallback, times(1)).onChildProcessDied(connection);
+ }
+
+ @Test
+ public void testNotBoundToCaller() throws RemoteException {
+ ChildProcessConnection connection =
+ createTestConnection(false /* bindToCaller */, false /* bindAsExternalService */,
+ null /* serviceBundle */, false /* useFallback */);
+ assertNotNull(mFirstServiceConnection);
+ connection.start(false /* useStrongBinding */, mServiceCallback);
+ mFirstServiceConnection.notifyServiceConnected(mChildProcessServiceBinder);
+ // Service is started and bindToCallback is not called.
+ verify(mServiceCallback, times(1)).onChildStarted();
+ verify(mServiceCallback, never()).onChildStartFailed(any());
+ verify(mServiceCallback, never()).onChildProcessDied(connection);
+ verify(mIChildProcessService, never()).bindToCaller(any());
+ }
+
+ @Test
+ public void testBoundToCallerSuccess() throws RemoteException {
+ ChildProcessConnection connection =
+ createTestConnection(true /* bindToCaller */, false /* bindAsExternalService */,
+ null /* serviceBundle */, false /* useFallback */);
+ assertNotNull(mFirstServiceConnection);
+ connection.start(false /* useStrongBinding */, mServiceCallback);
+ when(mIChildProcessService.bindToCaller(any())).thenReturn(true);
+ mFirstServiceConnection.notifyServiceConnected(mChildProcessServiceBinder);
+ // Service is started and bindToCallback is called.
+ verify(mServiceCallback, times(1)).onChildStarted();
+ verify(mServiceCallback, never()).onChildStartFailed(any());
+ verify(mServiceCallback, never()).onChildProcessDied(connection);
+ verify(mIChildProcessService, times(1)).bindToCaller(any());
+ }
+
+ @Test
+ public void testBoundToCallerFailure() throws RemoteException {
+ ChildProcessConnection connection =
+ createTestConnection(true /* bindToCaller */, false /* bindAsExternalService */,
+ null /* serviceBundle */, false /* useFallback */);
+ assertNotNull(mFirstServiceConnection);
+ connection.start(false /* useStrongBinding */, mServiceCallback);
+ // Pretend bindToCaller returns false, i.e. the service is already bound to a different
+ // service.
+ when(mIChildProcessService.bindToCaller(any())).thenReturn(false);
+ mFirstServiceConnection.notifyServiceConnected(mChildProcessServiceBinder);
+ // Service fails to start.
+ verify(mServiceCallback, never()).onChildStarted();
+ verify(mServiceCallback, times(1)).onChildStartFailed(any());
+ verify(mServiceCallback, never()).onChildProcessDied(connection);
+ verify(mIChildProcessService, times(1)).bindToCaller(any());
+ }
+
+ @Test
+ public void testSetupConnectionBeforeServiceConnected() throws RemoteException {
+ ChildProcessConnection connection = createDefaultTestConnection();
+ assertNotNull(mFirstServiceConnection);
+ connection.start(false /* useStrongBinding */, null /* serviceCallback */);
+ connection.setupConnection(null /* connectionBundle */, null /* callback */,
+ mConnectionCallback, null /* zygoteInfoCallback */);
+ verify(mConnectionCallback, never()).onConnected(any());
+ mFirstServiceConnection.notifyServiceConnected(mChildProcessServiceBinder);
+ ShadowLooper.runUiThreadTasks();
+ assertNotNull(mConnectionParentProcess);
+ sendPid(34);
+ verify(mConnectionCallback, times(1)).onConnected(connection);
+ }
+
+ @Test
+ public void testSendPidOnlyWorksOnce() throws RemoteException {
+ ChildProcessConnection connection = createDefaultTestConnection();
+ assertNotNull(mFirstServiceConnection);
+ connection.start(false /* useStrongBinding */, null /* serviceCallback */);
+ connection.setupConnection(null /* connectionBundle */, null /* callback */,
+ mConnectionCallback, null /* zygoteInfoCallback */);
+ verify(mConnectionCallback, never()).onConnected(any());
+ mFirstServiceConnection.notifyServiceConnected(mChildProcessServiceBinder);
+ ShadowLooper.runUiThreadTasks();
+ assertNotNull(mConnectionParentProcess);
+
+ sendPid(34);
+ assertEquals(34, connection.getPid());
+ sendPid(543);
+ assertEquals(34, connection.getPid());
+ }
+
+ @Test
+ public void testZygotePidSaved() throws RemoteException {
+ ChildProcessConnection connection = createDefaultTestConnection();
+ assertNotNull(mFirstServiceConnection);
+ connection.start(false /* useStrongBinding */, null /* serviceCallback */);
+ connection.setupConnection(null /* connectionBundle */, null /* callback */,
+ mConnectionCallback, null /* zygoteInfoCallback */);
+ verify(mConnectionCallback, never()).onConnected(any());
+ mFirstServiceConnection.notifyServiceConnected(mChildProcessServiceBinder);
+ ShadowLooper.runUiThreadTasks();
+ assertNotNull(mConnectionParentProcess);
+
+ mConnectionParentProcess.finishSetupConnection(123 /* pid */, 456 /* zygotePid = */,
+ 789 /* zygoteStartupTimeMillis */, null /* relroBundle */);
+ assertTrue(connection.hasUsableZygoteInfo());
+ assertEquals(456, connection.getZygotePid());
+ }
+
+ @Test
+ public void testTwoZygoteInfosOnlyOneValid() throws RemoteException {
+ // Set up |connection1|.
+ ChildProcessConnection connection1 = createDefaultTestConnection();
+ assertNotNull(mFirstServiceConnection);
+ connection1.start(true /* useStrongBinding */, null /* serviceCallback */);
+ connection1.setupConnection(null /* connectionBundle */, null /* callback */,
+ mConnectionCallback, null /* zygoteInfoCallback */);
+ mFirstServiceConnection.notifyServiceConnected(mChildProcessServiceBinder);
+ ShadowLooper.runUiThreadTasks();
+ assertNotNull(mConnectionParentProcess);
+ assertNotNull(mFirstServiceConnection);
+ mConnectionParentProcess.finishSetupConnection(125 /* pid */, 0 /* zygotePid */,
+ -1 /* zygoteStartupTimeMillis */, null /* relroBundle */);
+
+ // Allow the following setupConnection() to create a new service connection for
+ // |connection2|.
+ mFirstServiceConnection = null;
+
+ // Set up |connection2|.
+ ChildProcessConnection connection2 = createDefaultTestConnection();
+ assertNotNull(mFirstServiceConnection);
+ connection2.start(false /* useStrongBinding */, null /* serviceCallback */);
+ connection2.setupConnection(null /* connectionBundle */, null /* callback */,
+ mConnectionCallback, null /* zygoteInfoCallback */);
+ mFirstServiceConnection.notifyServiceConnected(mChildProcessServiceBinder);
+ ShadowLooper.runUiThreadTasks();
+ assertNotNull(mConnectionParentProcess);
+ assertNotNull(mFirstServiceConnection);
+
+ mConnectionParentProcess.finishSetupConnection(126, /* zygotePid = */ 300,
+ /* zygoteStartupTimeMillis = */ -1, /* relroBundle = */ null);
+ assertTrue(connection2.hasUsableZygoteInfo());
+ assertEquals(300, connection2.getZygotePid());
+ assertFalse(connection1.hasUsableZygoteInfo());
+ }
+
+ @Test
+ public void testInvokesZygoteCallback() throws RemoteException {
+ ChildProcessConnection connection = createDefaultTestConnection();
+ assertNotNull(mFirstServiceConnection);
+ connection.start(false /* useStrongBinding */, null /* serviceCallback */);
+ connection.setupConnection(null /* connectionBundle */, null /* callback */,
+ mConnectionCallback, mZygoteInfoCallback);
+ verify(mConnectionCallback, never()).onConnected(any());
+ mFirstServiceConnection.notifyServiceConnected(mChildProcessServiceBinder);
+ ShadowLooper.runUiThreadTasks();
+ assertNotNull(mConnectionParentProcess);
+
+ Bundle relroBundle = new Bundle();
+ mConnectionParentProcess.finishSetupConnection(123 /* pid */, 456 /* zygotePid = */,
+ 789 /* zygoteStartupTimeMillis */, relroBundle);
+ assertTrue(connection.hasUsableZygoteInfo());
+ assertEquals(456, connection.getZygotePid());
+ verify(mZygoteInfoCallback, times(1)).onReceivedZygoteInfo(connection, relroBundle);
+
+ connection.consumeZygoteBundle(relroBundle);
+ verify(mIChildProcessService, times(1)).consumeRelroBundle(relroBundle);
+ }
+
+ @Test
+ public void testConsumeZygoteBundle() throws RemoteException {
+ ChildProcessConnection connection = createDefaultTestConnection();
+ assertNotNull(mFirstServiceConnection);
+ connection.start(false /* useStrongBinding */, null /* serviceCallback */);
+ connection.setupConnection(null /* connectionBundle */, null /* callback */,
+ mConnectionCallback, mZygoteInfoCallback);
+ verify(mConnectionCallback, never()).onConnected(any());
+ mFirstServiceConnection.notifyServiceConnected(mChildProcessServiceBinder);
+ ShadowLooper.runUiThreadTasks();
+ assertNotNull(mConnectionParentProcess);
+ Bundle relroBundle = new Bundle();
+ mConnectionParentProcess.finishSetupConnection(123 /* pid */, 456 /* zygotePid = */,
+ 789 /* zygoteStartupTimeMillis */, relroBundle);
+
+ verify(mIChildProcessService, never()).consumeRelroBundle(any());
+ connection.consumeZygoteBundle(relroBundle);
+ verify(mIChildProcessService, times(1)).consumeRelroBundle(relroBundle);
+ }
+
+ @Test
+ public void testSetupConnectionAfterServiceConnected() throws RemoteException {
+ ChildProcessConnection connection = createDefaultTestConnection();
+ assertNotNull(mFirstServiceConnection);
+ connection.start(false /* useStrongBinding */, null /* serviceCallback */);
+ mFirstServiceConnection.notifyServiceConnected(mChildProcessServiceBinder);
+ connection.setupConnection(null /* connectionBundle */, null /* callback */,
+ mConnectionCallback, null /* zygoteInfoCallback */);
+ verify(mConnectionCallback, never()).onConnected(any());
+ ShadowLooper.runUiThreadTasks();
+ assertNotNull(mConnectionParentProcess);
+ sendPid(34);
+ verify(mConnectionCallback, times(1)).onConnected(connection);
+ }
+
+ @Test
+ public void testKill() throws RemoteException {
+ ChildProcessConnection connection = createDefaultTestConnection();
+ assertNotNull(mFirstServiceConnection);
+ connection.start(false /* useStrongBinding */, null /* serviceCallback */);
+ mFirstServiceConnection.notifyServiceConnected(mChildProcessServiceBinder);
+ connection.setupConnection(null /* connectionBundle */, null /* callback */,
+ mConnectionCallback, null /* zygoteInfoCallback */);
+ verify(mConnectionCallback, never()).onConnected(any());
+ ShadowLooper.runUiThreadTasks();
+ assertNotNull(mConnectionParentProcess);
+ sendPid(34);
+ verify(mConnectionCallback, times(1)).onConnected(connection);
+
+ // Add strong binding so that connection is oom protected.
+ connection.removeVisibleBinding();
+ assertEquals(ChildBindingState.WAIVED, connection.bindingStateCurrentOrWhenDied());
+ if (ChildProcessConnection.supportNotPerceptibleBinding()) {
+ connection.addNotPerceptibleBinding();
+ assertEquals(
+ ChildBindingState.NOT_PERCEPTIBLE, connection.bindingStateCurrentOrWhenDied());
+ }
+ connection.addVisibleBinding();
+ assertEquals(ChildBindingState.VISIBLE, connection.bindingStateCurrentOrWhenDied());
+ connection.addStrongBinding();
+ assertEquals(ChildBindingState.STRONG, connection.bindingStateCurrentOrWhenDied());
+
+ // Kill and verify state.
+ connection.kill();
+ verify(mIChildProcessService).forceKill();
+ assertEquals(ChildBindingState.STRONG, connection.bindingStateCurrentOrWhenDied());
+ Assert.assertTrue(connection.isKilledByUs());
+ }
+
+ @Test
+ public void testUpdateGroupImportanceSmoke() throws RemoteException {
+ ChildProcessConnection connection = createDefaultTestConnection();
+ connection.start(false /* useStrongBinding */, null /* serviceCallback */);
+ when(mIChildProcessService.bindToCaller(any())).thenReturn(true);
+ mFirstServiceConnection.notifyServiceConnected(mChildProcessServiceBinder);
+ connection.updateGroupImportance(1, 2);
+ assertEquals(1, connection.getGroup());
+ assertEquals(2, connection.getImportanceInGroup());
+ assertEquals(3, mMockConnections.size());
+ // Group should be set on the wavied (last) binding.
+ ChildServiceConnectionMock mock = mMockConnections.get(mMockConnections.size() - 1);
+ assertEquals(1, mock.getGroup());
+ assertEquals(2, mock.getImportanceInGroup());
+ }
+
+ @Test
+ public void testExceptionDuringInit() throws RemoteException {
+ ChildProcessConnection connection = createDefaultTestConnection();
+ assertNotNull(mFirstServiceConnection);
+ connection.start(false /* useStrongBinding */, null /* serviceCallback */);
+ mFirstServiceConnection.notifyServiceConnected(mChildProcessServiceBinder);
+ connection.setupConnection(null /* connectionBundle */, null /* callback */,
+ mConnectionCallback, null /* zygoteInfoCallback */);
+ verify(mConnectionCallback, never()).onConnected(any());
+ ShadowLooper.runUiThreadTasks();
+ assertNotNull(mConnectionParentProcess);
+ sendPid(34);
+ verify(mConnectionCallback, times(1)).onConnected(connection);
+
+ String exceptionString = "test exception string";
+ mConnectionParentProcess.reportExceptionInInit(exceptionString);
+ ShadowLooper.runUiThreadTasks();
+ Assert.assertEquals(exceptionString, connection.getExceptionDuringInit());
+ Assert.assertFalse(mFirstServiceConnection.isBound());
+ }
+
+ @Test
+ public void testFallback() throws RemoteException {
+ Bundle serviceBundle = new Bundle();
+ final String intKey = "org.chromium.myInt";
+ final int intValue = 34;
+ serviceBundle.putInt(intKey, intValue);
+
+ ChildProcessConnection connection = createTestConnection(false /* bindToCaller */,
+ false /* bindAsExternalService */, serviceBundle, true /* useFallback */);
+ assertNotNull(mFirstServiceConnection);
+ connection.start(false /* useStrongBinding */, mServiceCallback);
+
+ Assert.assertEquals(3, mMockConnections.size());
+ boolean anyServiceConnectionBound = false;
+ for (ChildServiceConnectionMock serviceConnection : mMockConnections) {
+ anyServiceConnectionBound = anyServiceConnectionBound || serviceConnection.isBound();
+ }
+ Assert.assertTrue(anyServiceConnectionBound);
+ verify(mServiceCallback, never()).onChildStarted();
+ verify(mServiceCallback, never()).onChildStartFailed(any());
+ verify(mServiceCallback, never()).onChildProcessDied(any());
+ {
+ Intent bindIntent = mFirstServiceConnection.getBindIntent();
+ assertNotNull(bindIntent);
+ assertEquals(intValue, bindIntent.getIntExtra(intKey, -1));
+ Assert.assertEquals("TestService", bindIntent.getComponent().getClassName());
+ }
+
+ connection.setupConnection(null /* connectionBundle */, null /* callback */,
+ mConnectionCallback, null /* zygoteInfoCallback */);
+
+ // Do not call onServiceConnected. Simulate timeout with ShadowLooper.
+ ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
+ verify(mServiceCallback, never()).onChildStarted();
+ verify(mServiceCallback, never()).onChildStartFailed(any());
+ verify(mServiceCallback, never()).onChildProcessDied(any());
+
+ Assert.assertEquals(6, mMockConnections.size());
+ // First 4 should be unbound now.
+ for (int i = 0; i < 3; ++i) {
+ verify(mMockConnections.get(i), times(1)).retire();
+ Assert.assertFalse(mMockConnections.get(i).isBound());
+ }
+ // New connection for fallback service should be bound.
+ ChildServiceConnectionMock boundServiceConnection = null;
+ for (int i = 3; i < 6; ++i) {
+ if (mMockConnections.get(i).isBound()) {
+ boundServiceConnection = mMockConnections.get(i);
+ }
+ Intent bindIntent = mMockConnections.get(i).getBindIntent();
+ assertNotNull(bindIntent);
+ assertEquals(intValue, bindIntent.getIntExtra(intKey, -1));
+ Assert.assertEquals("TestFallbackService", bindIntent.getComponent().getClassName());
+ }
+ Assert.assertNotNull(boundServiceConnection);
+
+ // Complete connection.
+ boundServiceConnection.notifyServiceConnected(mChildProcessServiceBinder);
+ verify(mServiceCallback, times(1)).onChildStarted();
+ verify(mServiceCallback, never()).onChildStartFailed(any());
+ verify(mServiceCallback, never()).onChildProcessDied(any());
+ }
+
+ @Test
+ public void testFallbackOnBindServiceFailure() throws RemoteException {
+ Bundle serviceBundle = new Bundle();
+ final String intKey = "org.chromium.myInt";
+ final int intValue = 34;
+ serviceBundle.putInt(intKey, intValue);
+
+ ChildProcessConnection connection = createTestConnection(false /* bindToCaller */,
+ false /* bindAsExternalService */, serviceBundle, true /* useFallback */);
+ assertNotNull(mFirstServiceConnection);
+ mFirstServiceConnection.setBindResult(false);
+
+ connection.start(false /* useStrongBinding */, mServiceCallback);
+
+ verify(mServiceCallback, never()).onChildStarted();
+ verify(mServiceCallback, never()).onChildStartFailed(any());
+ verify(mServiceCallback, never()).onChildProcessDied(any());
+
+ Assert.assertEquals(6, mMockConnections.size());
+ // First 4 should be unbound now.
+ for (int i = 0; i < 3; ++i) {
+ verify(mMockConnections.get(i), times(1)).retire();
+ Assert.assertFalse(mMockConnections.get(i).isBound());
+ }
+ // New connection for fallback service should be bound.
+ ChildServiceConnectionMock boundServiceConnection = null;
+ for (int i = 3; i < 6; ++i) {
+ if (mMockConnections.get(i).isBound()) {
+ boundServiceConnection = mMockConnections.get(i);
+ }
+ Intent bindIntent = mMockConnections.get(i).getBindIntent();
+ assertNotNull(bindIntent);
+ assertEquals(intValue, bindIntent.getIntExtra(intKey, -1));
+ Assert.assertEquals("TestFallbackService", bindIntent.getComponent().getClassName());
+ }
+
+ // Complete connection.
+ boundServiceConnection.notifyServiceConnected(mChildProcessServiceBinder);
+ verify(mServiceCallback, times(1)).onChildStarted();
+ verify(mServiceCallback, never()).onChildStartFailed(any());
+ verify(mServiceCallback, never()).onChildProcessDied(any());
+ }
+}
diff --git a/chromium/base/android/junit/src/org/chromium/base/supplier/ObservableSupplierImplTest.java b/chromium/base/android/junit/src/org/chromium/base/supplier/ObservableSupplierImplTest.java
new file mode 100644
index 00000000000..7b19a1aabb8
--- /dev/null
+++ b/chromium/base/android/junit/src/org/chromium/base/supplier/ObservableSupplierImplTest.java
@@ -0,0 +1,190 @@
+// Copyright 2019 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.supplier;
+
+import android.os.Handler;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.annotation.Config;
+
+import org.chromium.base.Callback;
+import org.chromium.base.test.BaseRobolectricTestRunner;
+
+/**
+ * Unit tests for {@link ObservableSupplierImpl}.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+public class ObservableSupplierImplTest {
+ private static final String TEST_STRING_1 = "Test";
+ private static final String TEST_STRING_2 = "Test2";
+
+ private int mCallCount;
+ private String mLastSuppliedString;
+ private ObservableSupplierImpl<String> mSupplier = new ObservableSupplierImpl<>();
+
+ @Test
+ public void testObserverNotification_SetMultiple() {
+ Callback<String> supplierObserver = result -> {
+ mCallCount++;
+ mLastSuppliedString = result;
+ };
+
+ mSupplier.addObserver(supplierObserver);
+ checkState(0, null, null, "before setting first string.");
+
+ mSupplier.set(TEST_STRING_1);
+ checkState(1, TEST_STRING_1, TEST_STRING_1, "after setting first string.");
+
+ mSupplier.set(TEST_STRING_2);
+ checkState(2, TEST_STRING_2, TEST_STRING_2, "after setting second string.");
+
+ mSupplier.set(null);
+ checkState(3, null, null, "after setting third string.");
+ }
+
+ @Test
+ public void testObserverNotification_SetSame() {
+ Callback<String> supplierObserver = result -> {
+ mCallCount++;
+ mLastSuppliedString = result;
+ };
+
+ mSupplier.addObserver(supplierObserver);
+ checkState(0, null, null, "before setting first string.");
+
+ mSupplier.set(TEST_STRING_1);
+ checkState(1, TEST_STRING_1, TEST_STRING_1, "after setting first string.");
+
+ mSupplier.set(TEST_STRING_1);
+ checkState(1, TEST_STRING_1, TEST_STRING_1, "after resetting first string.");
+ }
+
+ @Test
+ public void testObserverNotification_RemoveObserver() {
+ Callback<String> supplierObserver = result -> {
+ mCallCount++;
+ mLastSuppliedString = result;
+ };
+
+ mSupplier.addObserver(supplierObserver);
+ checkState(0, null, null, "before setting first string.");
+
+ mSupplier.set(TEST_STRING_1);
+ checkState(1, TEST_STRING_1, TEST_STRING_1, "after setting first string.");
+
+ mSupplier.removeObserver(supplierObserver);
+
+ mSupplier.set(TEST_STRING_2);
+ checkState(1, TEST_STRING_1, TEST_STRING_2, "after setting second string.");
+ }
+
+ @Test
+ public void testObserverNotification_RegisterObserverAfterSet() {
+ Handler handler = new Handler();
+ handler.post(() -> {
+ mSupplier.set(TEST_STRING_1);
+ checkState(0, null, TEST_STRING_1, "after setting first string.");
+
+ Callback<String> supplierObserver = new Callback<String>() {
+ @Override
+ public void onResult(String result) {
+ mCallCount++;
+ mLastSuppliedString = result;
+ }
+ };
+
+ mSupplier.addObserver(supplierObserver);
+
+ checkState(0, null, TEST_STRING_1, "after setting observer.");
+ });
+
+ handler.post(() -> checkState(1, TEST_STRING_1, TEST_STRING_1, "in second message loop."));
+ }
+
+ @Test
+ public void testObserverNotification_RegisterObserverAfterSetThenSetAgain() {
+ Handler handler = new Handler();
+ handler.post(() -> {
+ mSupplier.set(TEST_STRING_1);
+ checkState(0, null, TEST_STRING_1, "after setting first string.");
+
+ Callback<String> supplierObserver = new Callback<String>() {
+ @Override
+ public void onResult(String result) {
+ mCallCount++;
+ mLastSuppliedString = result;
+ }
+ };
+
+ mSupplier.addObserver(supplierObserver);
+
+ checkState(0, null, TEST_STRING_1, "after setting observer.");
+
+ mSupplier.set(TEST_STRING_2);
+ checkState(1, TEST_STRING_2, TEST_STRING_2, "after setting second string.");
+ });
+
+ handler.post(() -> checkState(1, TEST_STRING_2, TEST_STRING_2, "in second message loop."));
+ }
+
+ @Test
+ public void testObserverNotification_RegisterObserverAfterSetThenRemove() {
+ Handler handler = new Handler();
+ handler.post(() -> {
+ mSupplier.set(TEST_STRING_1);
+ checkState(0, null, TEST_STRING_1, "after setting first string.");
+
+ Callback<String> supplierObserver = new Callback<String>() {
+ @Override
+ public void onResult(String result) {
+ mCallCount++;
+ mLastSuppliedString = result;
+ }
+ };
+
+ mSupplier.addObserver(supplierObserver);
+
+ checkState(0, null, TEST_STRING_1, "after setting observer.");
+
+ mSupplier.removeObserver(supplierObserver);
+ });
+
+ handler.post(() -> checkState(0, null, TEST_STRING_1, "in second message loop."));
+ }
+
+ @Test
+ public void testObserverNotification_RemoveObserverInsideCallback() {
+ Callback<String> supplierObserver = new Callback<String>() {
+ @Override
+ public void onResult(String result) {
+ mCallCount++;
+ mLastSuppliedString = result;
+ mSupplier.removeObserver(this);
+ }
+ };
+
+ mSupplier.addObserver(supplierObserver);
+ checkState(0, null, null, "before setting first string.");
+
+ mSupplier.set(TEST_STRING_1);
+ checkState(1, TEST_STRING_1, TEST_STRING_1, "after setting first string.");
+
+ mSupplier.set(TEST_STRING_2);
+ checkState(1, TEST_STRING_1, TEST_STRING_2, "after setting second string.");
+ }
+
+ private void checkState(int expectedCallCount, String expectedLastSuppliedString,
+ String expectedStringFromGet, String assertDescription) {
+ Assert.assertEquals(
+ "Incorrect call count " + assertDescription, expectedCallCount, mCallCount);
+ Assert.assertEquals("Incorrect last supplied string " + assertDescription,
+ expectedLastSuppliedString, mLastSuppliedString);
+ Assert.assertEquals(
+ "Incorrect #get() " + assertDescription, expectedStringFromGet, mSupplier.get());
+ }
+}
diff --git a/chromium/base/android/junit/src/org/chromium/base/supplier/OneShotCallbackTest.java b/chromium/base/android/junit/src/org/chromium/base/supplier/OneShotCallbackTest.java
new file mode 100644
index 00000000000..d6554f68069
--- /dev/null
+++ b/chromium/base/android/junit/src/org/chromium/base/supplier/OneShotCallbackTest.java
@@ -0,0 +1,95 @@
+// Copyright 2020 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.supplier;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+
+import android.os.Handler;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.robolectric.annotation.Config;
+
+import org.chromium.base.Callback;
+import org.chromium.base.test.BaseRobolectricTestRunner;
+
+/** Unit tests for {@link OneShotCallback}. */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+public class OneShotCallbackTest {
+ @Rule
+ public MockitoRule mMockitoRule = MockitoJUnit.rule();
+
+ @Mock
+ Callback<Integer> mCallbackMock;
+
+ @Test
+ public void testNotCalledWithNoValue() {
+ Handler handler = new Handler();
+ ObservableSupplierImpl<Integer> supplier = new ObservableSupplierImpl<>();
+
+ handler.post(() -> new OneShotCallback<>(supplier, mCallbackMock));
+
+ handler.post(() -> { verify(mCallbackMock, never()).onResult(any()); });
+ }
+
+ @Test
+ public void testCalledWithPresetValue() {
+ Handler handler = new Handler();
+ ObservableSupplierImpl<Integer> supplier = new ObservableSupplierImpl<>();
+ supplier.set(5);
+
+ handler.post(() -> { new OneShotCallback<>(supplier, mCallbackMock); });
+
+ handler.post(() -> { verify(mCallbackMock, times(1)).onResult(5); });
+ }
+
+ @Test
+ public void testCalledWithSet() {
+ Handler handler = new Handler();
+ ObservableSupplierImpl<Integer> supplier = new ObservableSupplierImpl<>();
+
+ handler.post(() -> new OneShotCallback<>(supplier, mCallbackMock));
+ handler.post(() -> { verify(mCallbackMock, never()).onResult(any()); });
+
+ supplier.set(5);
+ handler.post(() -> { verify(mCallbackMock, times(1)).onResult(5); });
+ }
+
+ @Test
+ public void testNotCalledWithPresetValueOnlyOnce() {
+ Handler handler = new Handler();
+ ObservableSupplierImpl<Integer> supplier = new ObservableSupplierImpl<>();
+ supplier.set(5);
+ supplier.set(10);
+
+ handler.post(() -> { new OneShotCallback<>(supplier, mCallbackMock); });
+
+ handler.post(() -> { verify(mCallbackMock, times(1)).onResult(10); });
+ }
+
+ @Test
+ public void testCalledWithSetOnlyOnce() {
+ Handler handler = new Handler();
+ ObservableSupplierImpl<Integer> supplier = new ObservableSupplierImpl<>();
+
+ handler.post(() -> new OneShotCallback<>(supplier, mCallbackMock));
+ handler.post(() -> { verify(mCallbackMock, never()).onResult(any()); });
+
+ supplier.set(5);
+ handler.post(() -> { verify(mCallbackMock, times(1)).onResult(5); });
+
+ supplier.set(10);
+ verifyNoMoreInteractions(mCallbackMock);
+ }
+} \ No newline at end of file
diff --git a/chromium/base/android/junit/src/org/chromium/base/supplier/OneshotSupplierImplTest.java b/chromium/base/android/junit/src/org/chromium/base/supplier/OneshotSupplierImplTest.java
new file mode 100644
index 00000000000..b00cb18fe87
--- /dev/null
+++ b/chromium/base/android/junit/src/org/chromium/base/supplier/OneshotSupplierImplTest.java
@@ -0,0 +1,79 @@
+// Copyright 2020 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.supplier;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.mockito.Mockito.verify;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+import org.mockito.Spy;
+import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
+import org.robolectric.shadows.ShadowProcess;
+
+import org.chromium.base.Callback;
+import org.chromium.base.test.BaseRobolectricTestRunner;
+
+/**
+ * Unit tests for {@link OneshotSupplierImpl}.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(shadows = {ShadowProcess.class})
+@LooperMode(LooperMode.Mode.LEGACY)
+public class OneshotSupplierImplTest {
+ private OneshotSupplierImpl<String> mSupplier = new OneshotSupplierImpl<>();
+
+ @Spy
+ private Callback<String> mCallback1;
+ @Spy
+ private Callback<String> mCallback2;
+
+ @Before
+ public void setup() {
+ MockitoAnnotations.initMocks(this);
+ }
+
+ @Test
+ public void testSet() {
+ assertNull(mSupplier.onAvailable(mCallback1));
+ assertNull(mSupplier.onAvailable(mCallback2));
+ mSupplier.set("answer");
+
+ verify(mCallback1).onResult("answer");
+ verify(mCallback2).onResult("answer");
+ }
+
+ @Test
+ public void testSetBeforeAddObserver() {
+ mSupplier.set("answer");
+
+ assertEquals("answer", mSupplier.onAvailable(mCallback1));
+ assertEquals("answer", mSupplier.onAvailable(mCallback2));
+
+ verify(mCallback1).onResult("answer");
+ verify(mCallback2).onResult("answer");
+ }
+
+ @Test
+ public void testInterleaved() {
+ assertNull(mSupplier.onAvailable(mCallback1));
+ mSupplier.set("answer");
+ assertEquals("answer", mSupplier.onAvailable(mCallback2));
+
+ verify(mCallback1).onResult("answer");
+ verify(mCallback2).onResult("answer");
+ }
+
+ @Test
+ public void testGet() {
+ assertNull(mSupplier.get());
+ mSupplier.set("answer");
+ assertEquals("answer", mSupplier.get());
+ }
+}
diff --git a/chromium/base/android/junit/src/org/chromium/base/supplier/UnownedUserDataSupplierTest.java b/chromium/base/android/junit/src/org/chromium/base/supplier/UnownedUserDataSupplierTest.java
new file mode 100644
index 00000000000..1d7912cc3f2
--- /dev/null
+++ b/chromium/base/android/junit/src/org/chromium/base/supplier/UnownedUserDataSupplierTest.java
@@ -0,0 +1,168 @@
+// Copyright 2020 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.supplier;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+import org.robolectric.annotation.Config;
+
+import org.chromium.base.Callback;
+import org.chromium.base.UnownedUserDataHost;
+import org.chromium.base.UnownedUserDataKey;
+import org.chromium.base.test.BaseRobolectricTestRunner;
+
+/**
+ * Unit tests for {@link ObservableSupplierImpl}.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+public class UnownedUserDataSupplierTest {
+ /** Serves as an example concrete class for {@link UnownedUserDataSupplier}. */
+ static class TestUnownedUserDataSupplier extends UnownedUserDataSupplier<String> {
+ private static final UnownedUserDataKey<TestUnownedUserDataSupplier> KEY =
+ new UnownedUserDataKey<TestUnownedUserDataSupplier>(
+ TestUnownedUserDataSupplier.class);
+
+ /** Use this pattern to mock the {@link UnownedUserDataSupplier} for testing. */
+ private static TestUnownedUserDataSupplier sInstanceForTesting;
+
+ /**
+ * Retrieves an {@link ObservableSupplier} from the given host. Real implementations should
+ * use {@link WindowAndroid}.
+ */
+ public static ObservableSupplier<String> from(UnownedUserDataHost host) {
+ if (sInstanceForTesting != null) return sInstanceForTesting;
+ return KEY.retrieveDataFromHost(host);
+ }
+
+ /**
+ * Constructs a {@link TestUnownedUserDataSupplier} with the given host. Real
+ * implementations should use {@link WindowAndroid} instead.
+ */
+ public TestUnownedUserDataSupplier() {
+ super(KEY);
+ }
+
+ static UnownedUserDataKey<TestUnownedUserDataSupplier> getUnownedUserDataKeyForTesting() {
+ return KEY;
+ }
+
+ static void setInstanceForTesting(TestUnownedUserDataSupplier testUnownedUserDataSupplier) {
+ sInstanceForTesting = testUnownedUserDataSupplier;
+ }
+ }
+
+ static final String TEST_STRING_1 = "testString1";
+ static final String TEST_STRING_2 = "testString2";
+
+ private final UnownedUserDataHost mHost = new UnownedUserDataHost();
+ private final TestUnownedUserDataSupplier mSupplier = new TestUnownedUserDataSupplier();
+
+ private boolean mIsDestroyed;
+
+ @Before
+ public void setUp() {
+ mIsDestroyed = false;
+ mSupplier.attach(mHost);
+ }
+
+ @After
+ public void tearDown() {
+ if (!mIsDestroyed) {
+ mSupplier.destroy();
+ mIsDestroyed = true;
+ }
+
+ Assert.assertNull(TestUnownedUserDataSupplier.from(mHost));
+ }
+
+ @Test
+ public void testSet() {
+ mSupplier.set(TEST_STRING_1);
+
+ // Simulate client
+ ObservableSupplierImpl<String> supplier =
+ (ObservableSupplierImpl) TestUnownedUserDataSupplier.from(mHost);
+ Assert.assertEquals(TEST_STRING_1, supplier.get());
+
+ Callback<String> callback = Mockito.mock(Callback.class);
+ supplier.addObserver(callback);
+ supplier.set(TEST_STRING_2);
+ Mockito.verify(callback).onResult(TEST_STRING_2);
+ }
+
+ @Test
+ public void testAttachMultipleSuppliersToSameHost() {
+ TestUnownedUserDataSupplier secondarySupplier = new TestUnownedUserDataSupplier();
+ secondarySupplier.attach(mHost);
+ Assert.assertFalse(
+ TestUnownedUserDataSupplier.getUnownedUserDataKeyForTesting().isAttachedToAnyHost(
+ mSupplier));
+ Assert.assertTrue(
+ TestUnownedUserDataSupplier.getUnownedUserDataKeyForTesting().isAttachedToAnyHost(
+ secondarySupplier));
+ secondarySupplier.destroy();
+ }
+
+ @Test
+ public void testAttachSupplierToMultipleHosts() {
+ UnownedUserDataHost secondaryHost = new UnownedUserDataHost();
+ mSupplier.attach(secondaryHost);
+ Assert.assertTrue(
+ TestUnownedUserDataSupplier.getUnownedUserDataKeyForTesting().isAttachedToAnyHost(
+ mSupplier));
+ mSupplier.destroy();
+ mIsDestroyed = true;
+ Assert.assertFalse(
+ TestUnownedUserDataSupplier.getUnownedUserDataKeyForTesting().isAttachedToAnyHost(
+ mSupplier));
+ }
+
+ @Test
+ public void testDestroy() {
+ Assert.assertTrue(
+ TestUnownedUserDataSupplier.getUnownedUserDataKeyForTesting().isAttachedToAnyHost(
+ mSupplier));
+
+ mSupplier.destroy();
+ Assert.assertNull(TestUnownedUserDataSupplier.from(mHost));
+ Assert.assertFalse(
+ TestUnownedUserDataSupplier.getUnownedUserDataKeyForTesting().isAttachedToAnyHost(
+ mSupplier));
+ mIsDestroyed = true;
+ }
+
+ @Test
+ public void testDestroy_unattached() {
+ // Destroy the primary supplier that's attached automatically.
+ mSupplier.destroy();
+
+ TestUnownedUserDataSupplier secondarySupplier = new TestUnownedUserDataSupplier();
+ Assert.assertFalse(
+ TestUnownedUserDataSupplier.getUnownedUserDataKeyForTesting().isAttachedToHost(
+ mHost));
+
+ secondarySupplier.destroy();
+ Assert.assertFalse(
+ TestUnownedUserDataSupplier.getUnownedUserDataKeyForTesting().isAttachedToHost(
+ mHost));
+ mIsDestroyed = true;
+ }
+
+ @Test
+ public void testDestroy_DoubleDestroy() {
+ mSupplier.destroy();
+ try {
+ mSupplier.destroy();
+ throw new Error("Expected an assert to be triggered.");
+ } catch (AssertionError e) {
+ }
+ mIsDestroyed = true;
+ }
+} \ No newline at end of file
diff --git a/chromium/base/android/junit/src/org/chromium/base/task/AsyncTaskThreadTest.java b/chromium/base/android/junit/src/org/chromium/base/task/AsyncTaskThreadTest.java
new file mode 100644
index 00000000000..2cbdf744968
--- /dev/null
+++ b/chromium/base/android/junit/src/org/chromium/base/task/AsyncTaskThreadTest.java
@@ -0,0 +1,264 @@
+// Copyright 2019 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.task;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
+import org.robolectric.Robolectric;
+import org.robolectric.android.util.concurrent.RoboExecutorService;
+import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
+import org.robolectric.shadows.ShadowLog;
+import org.robolectric.util.Scheduler;
+
+import org.chromium.base.Log;
+import org.chromium.base.task.AsyncTask.Status;
+import org.chromium.base.test.BaseRobolectricTestRunner;
+
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Tests for {@link AsyncTask}.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+@LooperMode(LooperMode.Mode.LEGACY)
+public class AsyncTaskThreadTest {
+ private static final String TAG = "AsyncTaskThreadTest";
+ private static final boolean DEBUG = false;
+
+ private static class BlockAndGetFeedDataTask extends AsyncTask<Boolean> {
+ private final LinkedBlockingQueue<Boolean> mIncomingQueue =
+ new LinkedBlockingQueue<Boolean>();
+ private final LinkedBlockingQueue<Boolean> mOutgoingQueue =
+ new LinkedBlockingQueue<Boolean>();
+ private final LinkedBlockingQueue<Boolean> mInterruptedExceptionQueue =
+ new LinkedBlockingQueue<Boolean>();
+ private Boolean mPostExecuteResult;
+
+ @Override
+ protected Boolean doInBackground() {
+ if (DEBUG) Log.i(TAG, "doInBackground");
+ mOutgoingQueue.add(true);
+ return blockAndGetFeedData();
+ }
+
+ @Override
+ protected void onPostExecute(Boolean result) {
+ if (DEBUG) Log.i(TAG, "onPostExecute: " + result);
+ mPostExecuteResult = result;
+ }
+
+ public void feedData(Boolean data) {
+ mIncomingQueue.add(data);
+ }
+
+ private Boolean blockAndGetFeedData() {
+ try {
+ return mIncomingQueue.poll(3, TimeUnit.SECONDS);
+ } catch (InterruptedException e) {
+ if (DEBUG) Log.i(TAG, "InterruptedException");
+ mInterruptedExceptionQueue.add(true);
+ return false;
+ }
+ }
+
+ public void blockUntilDoInBackgroundStarts() throws Exception {
+ mOutgoingQueue.poll(3, TimeUnit.SECONDS);
+ }
+
+ public Boolean getPostExecuteResult() {
+ return mPostExecuteResult;
+ }
+
+ public LinkedBlockingQueue<Boolean> getInterruptedExceptionQueue() {
+ return mInterruptedExceptionQueue;
+ }
+ }
+
+ private final BlockAndGetFeedDataTask mTask = new BlockAndGetFeedDataTask();
+ private final RoboExecutorService mRoboExecutorService = new RoboExecutorService();
+ private final Scheduler mBackgroundScheduler = Robolectric.getBackgroundThreadScheduler();
+
+ @Rule
+ public ExpectedException thrown = ExpectedException.none();
+
+ public AsyncTaskThreadTest() {
+ if (DEBUG) ShadowLog.stream = System.out;
+ }
+
+ @Before
+ public void setUp() {
+ mBackgroundScheduler.pause();
+ assertEquals(Status.PENDING, mTask.getStatus());
+ }
+
+ @After
+ public void tearDown() {
+ // No unexpected interrupted exception.
+ assertNull(mTask.getInterruptedExceptionQueue().poll());
+ Assert.assertTrue(mRoboExecutorService.shutdownNow().isEmpty());
+ }
+
+ @Test
+ @SmallTest
+ public void testCancel_ReturnsFalseOnceTaskFinishes() throws Exception {
+ // This test requires robo executor service such that we can run
+ // one background task.
+ mTask.executeOnExecutor(mRoboExecutorService);
+
+ // Ensure that the background thread is not blocked.
+ mTask.feedData(true);
+
+ mBackgroundScheduler.runOneTask();
+
+ // Cannot cancel. The task is already run.
+ assertFalse(mTask.cancel(false /* mayInterruptIfRunning */));
+ assertTrue(mTask.get());
+ assertEquals(Boolean.TRUE, mTask.getPostExecuteResult());
+
+ // Note: This is somewhat counter-intuitive since cancel() failed.
+ assertTrue(mTask.isCancelled());
+ assertEquals(Status.FINISHED, mTask.getStatus());
+ }
+
+ @Test
+ @SmallTest
+ public void testCancel_InPreExecute() throws Exception {
+ // Note that background loop is paused.
+ mTask.executeOnExecutor(mRoboExecutorService);
+
+ // Ensure that the background thread is not blocked.
+ mTask.feedData(true);
+
+ // cancel() can still return true
+ assertTrue(mTask.cancel(false));
+
+ mBackgroundScheduler.runOneTask();
+
+ try {
+ assertTrue(mTask.get());
+ Assert.fail();
+ } catch (CancellationException e) {
+ // expected
+ }
+
+ assertTrue(mTask.isCancelled());
+ assertEquals(Status.FINISHED, mTask.getStatus());
+ }
+
+ @Test
+ @SmallTest
+ public void testCancel_CanReturnTrueEvenAfterTaskStarts() throws Exception {
+ mTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+
+ // Wait until the task is started. Note that data is not yet fed.
+ mTask.blockUntilDoInBackgroundStarts();
+ assertEquals(Status.RUNNING, mTask.getStatus());
+
+ // This reflects FutureTask#cancel() behavior. Note that the task is
+ // started but cancel can still return true.
+ assertTrue(mTask.cancel(false /* mayInterruptIfRunning */));
+
+ // Continue the task.
+ mTask.feedData(true);
+
+ // get() will raise an exception although the task is started.
+ try {
+ mTask.get();
+ Assert.fail();
+ } catch (CancellationException e) {
+ // expected
+ }
+ assertNull(mTask.getPostExecuteResult()); // onPostExecute did not run.
+
+ assertTrue(mTask.isCancelled());
+ assertEquals(Status.RUNNING, mTask.getStatus());
+ }
+
+ @Test
+ @SmallTest
+ public void testCancel_MayInterrupt_ReturnsFalseOnceTaskFinishes() throws Exception {
+ // This test requires robo executor service such that we can run
+ // one background task.
+ mTask.executeOnExecutor(mRoboExecutorService);
+
+ // Ensure that the background thread is not blocked.
+ mTask.feedData(true);
+
+ mBackgroundScheduler.runOneTask();
+
+ // Cannot cancel. The task is already run.
+ assertFalse(mTask.cancel(true /* mayInterruptIfRunning */));
+ assertTrue(mTask.get());
+ assertEquals(Boolean.TRUE, mTask.getPostExecuteResult());
+
+ // Note: This is somewhat counter-intuitive since cancel() failed.
+ assertTrue(mTask.isCancelled());
+
+ assertEquals(Status.FINISHED, mTask.getStatus());
+ }
+
+ @Test
+ @SmallTest
+ public void testCancel_MayInterrupt_TaskIsInterrupted() throws Exception {
+ mTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+
+ // Wait until the task is started. Note that data is not yet fed.
+ mTask.blockUntilDoInBackgroundStarts();
+
+ assertEquals(Status.RUNNING, mTask.getStatus());
+
+ // Cancel and interrupt the current task.
+ assertTrue(mTask.cancel(true /* mayInterruptIfRunning */));
+
+ // Do not feed data here because task may finish before it gets interrupted.
+
+ // get() will raise an exception although the task is started.
+ try {
+ mTask.get();
+ Assert.fail();
+ } catch (CancellationException e) {
+ // expected
+ }
+ assertNull(mTask.getPostExecuteResult()); // onPostExecute did not run.
+ // Task was interrupted.
+ // Note: interruption is raised and handled in the background thread, so we need to
+ // wait here.
+ assertEquals(Boolean.TRUE, mTask.getInterruptedExceptionQueue().poll(3, TimeUnit.SECONDS));
+
+ assertTrue(mTask.isCancelled());
+ assertEquals(Status.RUNNING, mTask.getStatus());
+ }
+
+ @Test
+ @SmallTest
+ public void testExecuteTwiceRaisesException() throws Exception {
+ mTask.executeOnExecutor(mRoboExecutorService);
+ // Note that background loop is paused.
+ try {
+ // A second run should cause an exception.
+ mTask.executeOnExecutor(mRoboExecutorService);
+ Assert.fail();
+ } catch (IllegalStateException e) {
+ // expected
+ }
+ mBackgroundScheduler.runOneTask(); // ensure to pass tearDown check
+ }
+}
diff --git a/chromium/base/android/junit/src/org/chromium/base/task/SequencedTaskRunnerTaskMigrationTest.java b/chromium/base/android/junit/src/org/chromium/base/task/SequencedTaskRunnerTaskMigrationTest.java
new file mode 100644
index 00000000000..af4e0d776dc
--- /dev/null
+++ b/chromium/base/android/junit/src/org/chromium/base/task/SequencedTaskRunnerTaskMigrationTest.java
@@ -0,0 +1,201 @@
+// Copyright 2020 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.task;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.annotation.Config;
+
+import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.base.test.util.JniMocker;
+
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executor;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * Unit tests for {@link SequencedTaskRunnerImpl} that focuses on the transition/migration that
+ * happens as native initializes.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+public class SequencedTaskRunnerTaskMigrationTest {
+ @Rule
+ public JniMocker mMocker = new JniMocker();
+
+ // It might be tempting to use fake executor similar to Robolectric's scheduler that is driven
+ // from the test's main thread. Unfortunately this approach means that only two states of the
+ // TaskRunner are observable: the posted task resides in the internal queue or the task is
+ // removed from the queue and has its execution completed. The tricky case is the another state:
+ // the task is already removed but is not yet completed. This can only be modelled with real
+ // concurrency.
+ private final ExecutorService mConcurrentExecutor = Executors.newCachedThreadPool();
+
+ @Before
+ public void setUp() throws Exception {
+ PostTask.setPrenativeThreadPoolExecutorForTesting(mConcurrentExecutor);
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ PostTask.resetPrenativeThreadPoolExecutorForTesting();
+ // Ensure that no stuck threads left behind.
+ List<Runnable> queuedRunnables = mConcurrentExecutor.shutdownNow();
+ Assert.assertTrue("Some task is stuck in thread pool queue", queuedRunnables.isEmpty());
+ // Termination will be immediate if tests aren't broken. Generous timeout prevents test
+ // from being stuck forever.
+ Assert.assertTrue("Some task is stuck in thread pool",
+ mConcurrentExecutor.awaitTermination(10, TimeUnit.SECONDS));
+ }
+
+ @Test
+ public void nativeRunnerShouldNotExecuteTasksIfJavaThreadIsWorking() {
+ Executor noopExecutor = runnable -> {};
+ FakeTaskRunnerImplNatives fakeTaskRunnerNatives =
+ new FakeTaskRunnerImplNatives(noopExecutor);
+ mMocker.mock(TaskRunnerImplJni.TEST_HOOKS, fakeTaskRunnerNatives);
+ BlockingTask preNativeTask = new BlockingTask();
+ SequencedTaskRunnerImpl taskRunner = new SequencedTaskRunnerImpl(TaskTraits.USER_VISIBLE);
+
+ taskRunner.postTask(preNativeTask);
+ // Dummy task that is planned to be executed on native pool.
+ taskRunner.postTask(() -> {});
+
+ // Ensure that first task is running on pre-native thread pool: avoid race between
+ // starting the task and requesting native task runner's init.
+ preNativeTask.awaitTaskStarted();
+ taskRunner.initNativeTaskRunner();
+
+ Assert.assertFalse("Native task should not start before java task completion",
+ fakeTaskRunnerNatives.hasReceivedTasks());
+ }
+
+ @Test
+ public void pendingTasksShouldBeExecutedOnNativeRunnerAfterInit() {
+ FakeTaskRunnerImplNatives fakeTaskRunnerNatives =
+ new FakeTaskRunnerImplNatives(mConcurrentExecutor);
+ mMocker.mock(TaskRunnerImplJni.TEST_HOOKS, fakeTaskRunnerNatives);
+ BlockingTask preNativeTask = new BlockingTask();
+ AwaitableTask nativeTask = new AwaitableTask();
+ SequencedTaskRunnerImpl taskRunner = new SequencedTaskRunnerImpl(TaskTraits.USER_VISIBLE);
+
+ taskRunner.postTask(preNativeTask);
+ taskRunner.postTask(nativeTask);
+
+ // Ensure that first task is running on pre-native thread pool: avoid race between
+ // starting the task and requesting native task runner's init.
+ preNativeTask.awaitTaskStarted();
+ taskRunner.initNativeTaskRunner();
+ // Allow pre-native task to complete. Second task is going to be run on native pool because
+ // native task runner is available.
+ preNativeTask.allowComplete();
+
+ // Wait for second task to be started: avoid race between submitting task to the native task
+ // runner and checking the state of the latter in assertion below.
+ nativeTask.awaitTaskStarted();
+
+ Assert.assertTrue("Second task should run on the native pool",
+ fakeTaskRunnerNatives.hasReceivedTasks());
+ }
+
+ @Test
+ public void taskPostedAfterNativeInitShouldRunInNativePool() {
+ FakeTaskRunnerImplNatives fakeTaskRunnerNatives =
+ new FakeTaskRunnerImplNatives(mConcurrentExecutor);
+ mMocker.mock(TaskRunnerImplJni.TEST_HOOKS, fakeTaskRunnerNatives);
+
+ SequencedTaskRunnerImpl taskRunner = new SequencedTaskRunnerImpl(TaskTraits.USER_VISIBLE);
+ taskRunner.initNativeTaskRunner();
+
+ AwaitableTask nativeTask = new AwaitableTask();
+ taskRunner.postTask(nativeTask);
+
+ // Wait for the task to be started: avoid race between submitting task to the native task
+ // runner and checking the state of the latter in assertion below.
+ nativeTask.awaitTaskStarted();
+ Assert.assertTrue(
+ "Task should run on the native pool", fakeTaskRunnerNatives.hasReceivedTasks());
+ }
+
+ private static void awaitNoInterruptedException(CountDownLatch taskLatch) {
+ try {
+ // Generous timeout prevents test from being stuck forever. Actual delay is going to
+ // be a few milliseconds.
+ Assert.assertTrue("Timed out waiting for latch to count down",
+ taskLatch.await(10, TimeUnit.SECONDS));
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ }
+ }
+
+ private static class AwaitableTask implements Runnable {
+ private final CountDownLatch mTaskStartedLatch = new CountDownLatch(1);
+
+ @Override
+ public void run() {
+ mTaskStartedLatch.countDown();
+ }
+
+ public void awaitTaskStarted() {
+ awaitNoInterruptedException(mTaskStartedLatch);
+ }
+ }
+
+ private static class BlockingTask extends AwaitableTask {
+ private final CountDownLatch mTaskAllowedToComplete = new CountDownLatch(1);
+
+ @Override
+ public void run() {
+ super.run();
+ awaitNoInterruptedException(mTaskAllowedToComplete);
+ }
+
+ public void allowComplete() {
+ mTaskAllowedToComplete.countDown();
+ }
+ }
+
+ private static class FakeTaskRunnerImplNatives implements TaskRunnerImpl.Natives {
+ private final AtomicInteger mReceivedTasksCount = new AtomicInteger();
+ private final Executor mExecutor;
+
+ public FakeTaskRunnerImplNatives(Executor executor) {
+ mExecutor = executor;
+ }
+
+ @Override
+ public long init(int taskRunnerType, int priority, boolean mayBlock, boolean useThreadPool,
+ byte extensionId, byte[] extensionData) {
+ return 1;
+ }
+
+ @Override
+ public void destroy(long nativeTaskRunnerAndroid) {}
+
+ @Override
+ public void postDelayedTask(
+ long nativeTaskRunnerAndroid, Runnable task, long delay, String runnableClassName) {
+ mReceivedTasksCount.incrementAndGet();
+ mExecutor.execute(task);
+ }
+
+ @Override
+ public boolean belongsToCurrentThread(long nativeTaskRunnerAndroid) {
+ return false;
+ }
+
+ public boolean hasReceivedTasks() {
+ return mReceivedTasksCount.get() > 0;
+ }
+ }
+}
diff --git a/chromium/base/android/junit/src/org/chromium/base/task/TaskTraitsTest.java b/chromium/base/android/junit/src/org/chromium/base/task/TaskTraitsTest.java
new file mode 100644
index 00000000000..fdf721eae24
--- /dev/null
+++ b/chromium/base/android/junit/src/org/chromium/base/task/TaskTraitsTest.java
@@ -0,0 +1,77 @@
+// Copyright 2019 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.task;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.annotation.Config;
+
+import org.chromium.base.test.BaseRobolectricTestRunner;
+
+/**
+ * Tests for {@link TaskTraits}
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+public class TaskTraitsTest {
+ private static class FakeTaskTraitsExtensionDescriptor
+ implements TaskTraitsExtensionDescriptor<String> {
+ public static final byte ID = 1;
+
+ @Override
+ public int getId() {
+ return ID;
+ }
+
+ @Override
+ public String fromSerializedData(byte[] data) {
+ return new String(data);
+ }
+
+ @Override
+ public byte[] toSerializedData(String extension) {
+ return extension.getBytes();
+ }
+ }
+
+ private static final FakeTaskTraitsExtensionDescriptor DESC =
+ new FakeTaskTraitsExtensionDescriptor();
+
+ @Test
+ @SmallTest
+ public void testExtensionPresent() {
+ String input = "Blub";
+ TaskTraits traits = TaskTraits.USER_VISIBLE.mayBlock();
+ traits.mExtensionId = FakeTaskTraitsExtensionDescriptor.ID;
+ traits.mExtensionData = input.getBytes();
+ String extension = traits.getExtension(DESC);
+ assertEquals(input, extension);
+ }
+
+ @Test
+ @SmallTest
+ public void testExtensionNotPresent() {
+ String input = "Blub";
+ TaskTraits traits = TaskTraits.USER_VISIBLE.mayBlock();
+ traits.mExtensionId = 3;
+ traits.mExtensionData = input.getBytes();
+ String extension = traits.getExtension(DESC);
+ assertNull(extension);
+ }
+
+ @Test
+ @SmallTest
+ public void testSerializeDeserialize() {
+ String input = "Blub";
+ TaskTraits traits = TaskTraits.USER_VISIBLE;
+ String extension = traits.withExtension(DESC, input).getExtension(DESC);
+ assertEquals(input, extension);
+ }
+}
diff --git a/chromium/base/android/junit/src/org/chromium/base/util/GarbageCollectionTestUtilsUnitTest.java b/chromium/base/android/junit/src/org/chromium/base/util/GarbageCollectionTestUtilsUnitTest.java
new file mode 100644
index 00000000000..29e1f831bfc
--- /dev/null
+++ b/chromium/base/android/junit/src/org/chromium/base/util/GarbageCollectionTestUtilsUnitTest.java
@@ -0,0 +1,40 @@
+// Copyright 2019 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.base.util;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import static org.chromium.base.GarbageCollectionTestUtils.canBeGarbageCollected;
+
+import android.graphics.Bitmap;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.annotation.Config;
+
+import org.chromium.base.GarbageCollectionTestUtils;
+import org.chromium.base.test.BaseRobolectricTestRunner;
+
+import java.lang.ref.WeakReference;
+
+/**
+ * Tests for {@link GarbageCollectionTestUtils}.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+public class GarbageCollectionTestUtilsUnitTest {
+ @Test
+ public void testCanBeGarbageCollected() {
+ Bitmap bitmap = Bitmap.createBitmap(1, 2, Bitmap.Config.ARGB_8888);
+ WeakReference<Bitmap> bitmapWeakReference = new WeakReference<>(bitmap);
+ assertNotNull(bitmapWeakReference.get());
+ assertFalse(canBeGarbageCollected(bitmapWeakReference));
+
+ bitmap = null;
+ assertTrue(canBeGarbageCollected(bitmapWeakReference));
+ }
+}
diff --git a/chromium/base/android/library_loader/README.md b/chromium/base/android/library_loader/README.md
new file mode 100644
index 00000000000..46c42c2f964
--- /dev/null
+++ b/chromium/base/android/library_loader/README.md
@@ -0,0 +1,7 @@
+# //base/android/library_loader
+
+Java code lives at:
+ * [//base/android/java/src/org/chromium/base/library_loader/](../java/src/org/chromium/base/library_loader/)
+
+A high-level guide to native code on Android exists at:
+ * [//docs/android_native_libraries.md](../../../docs/android_native_libraries.md)
diff --git a/chromium/base/android/library_loader/anchor_functions.cc b/chromium/base/android/library_loader/anchor_functions.cc
new file mode 100644
index 00000000000..4997c1b5790
--- /dev/null
+++ b/chromium/base/android/library_loader/anchor_functions.cc
@@ -0,0 +1,99 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/library_loader/anchor_functions.h"
+
+#include "build/build_config.h"
+
+#if BUILDFLAG(SUPPORTS_CODE_ORDERING)
+
+// These functions are here to delimit the start and end of the ordered part of
+// .text. They require a suitably constructed orderfile, with these functions at
+// the beginning and end.
+//
+// These functions are weird: this is due to ICF (Identical Code Folding).
+// The linker merges functions that have the same code, which would be the case
+// if these functions were empty, or simple.
+// Gold's flag --icf=safe will *not* alias functions when their address is used
+// in code, but as of November 2017, we use the default setting that
+// deduplicates function in this case as well.
+//
+// Thus these functions are made to be unique, using inline .word in assembly,
+// or the equivalent directive depending on the architecture.
+//
+// Note that code |CheckOrderingSanity()| below will make sure that these
+// functions are not aliased, in case the toolchain becomes really clever.
+extern "C" {
+
+// The assembler has a different syntax depending on the architecture.
+#if defined(ARCH_CPU_ARMEL) || defined(ARCH_CPU_ARM64)
+
+// These functions have a well-defined ordering in this file, see the comment
+// in |IsOrderingSane()|.
+void dummy_function_end_of_ordered_text() {
+ asm(".word 0x21bad44d");
+ asm(".word 0xb815c5b0");
+}
+
+void dummy_function_start_of_ordered_text() {
+ asm(".word 0xe4a07375");
+ asm(".word 0x66dda6dc");
+}
+
+#elif defined(ARCH_CPU_X86_FAMILY)
+
+void dummy_function_end_of_ordered_text() {
+ asm(".4byte 0x21bad44d");
+ asm(".4byte 0xb815c5b0");
+}
+
+void dummy_function_start_of_ordered_text() {
+ asm(".4byte 0xe4a07375");
+ asm(".4byte 0x66dda6dc");
+}
+
+#endif
+
+// These two symbols are defined by anchor_functions.lds and delimit the start
+// and end of .text.
+void linker_script_start_of_text();
+void linker_script_end_of_text();
+
+} // extern "C"
+
+namespace base {
+namespace android {
+
+const size_t kStartOfText =
+ reinterpret_cast<size_t>(linker_script_start_of_text);
+const size_t kEndOfText = reinterpret_cast<size_t>(linker_script_end_of_text);
+const size_t kStartOfOrderedText =
+ reinterpret_cast<size_t>(dummy_function_start_of_ordered_text);
+const size_t kEndOfOrderedText =
+ reinterpret_cast<size_t>(dummy_function_end_of_ordered_text);
+
+bool AreAnchorsSane() {
+ size_t here = reinterpret_cast<size_t>(&IsOrderingSane);
+ return kStartOfText < here && here < kEndOfText;
+}
+
+bool IsOrderingSane() {
+ // The symbols linker_script_start_of_text and linker_script_end_of_text
+ // should cover all of .text, and dummy_function_start_of_ordered_text and
+ // dummy_function_end_of_ordered_text should cover the ordered part of it.
+ // This check is intended to catch the lack of ordering.
+ //
+ // Ordered text can start at the start of text, but should not cover the
+ // entire range. Most addresses are distinct nonetheless as the symbols are
+ // different, but linker-defined symbols have zero size and therefore the
+ // start address could be the same as the address of
+ // dummy_function_start_of_ordered_text.
+ return AreAnchorsSane() && kStartOfOrderedText < kEndOfOrderedText &&
+ kStartOfText <= kStartOfOrderedText && kEndOfOrderedText < kEndOfText;
+}
+
+} // namespace android
+} // namespace base
+
+#endif // BUILDFLAG(SUPPORTS_CODE_ORDERING)
diff --git a/chromium/base/android/library_loader/anchor_functions.h b/chromium/base/android/library_loader/anchor_functions.h
new file mode 100644
index 00000000000..05841e1a93f
--- /dev/null
+++ b/chromium/base/android/library_loader/anchor_functions.h
@@ -0,0 +1,35 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_LIBRARY_LOADER_ANCHOR_FUNCTIONS_H_
+#define BASE_ANDROID_LIBRARY_LOADER_ANCHOR_FUNCTIONS_H_
+
+#include <cstdint>
+#include "base/android/library_loader/anchor_functions_buildflags.h"
+
+#include "base/base_export.h"
+
+#if BUILDFLAG(SUPPORTS_CODE_ORDERING)
+
+namespace base {
+namespace android {
+
+// Start and end of .text, respectively.
+BASE_EXPORT extern const size_t kStartOfText;
+BASE_EXPORT extern const size_t kEndOfText;
+// Start and end of the ordered part of .text, respectively.
+BASE_EXPORT extern const size_t kStartOfOrderedText;
+BASE_EXPORT extern const size_t kEndOfOrderedText;
+
+// Returns true if anchors are sane.
+BASE_EXPORT bool AreAnchorsSane();
+
+// Returns true if the ordering looks sane.
+BASE_EXPORT bool IsOrderingSane();
+
+} // namespace android
+} // namespace base
+#endif // BUILDFLAG(SUPPORTS_CODE_ORDERING)
+
+#endif // BASE_ANDROID_LIBRARY_LOADER_ANCHOR_FUNCTIONS_H_
diff --git a/chromium/base/android/library_loader/anchor_functions.lds b/chromium/base/android/library_loader/anchor_functions.lds
new file mode 100644
index 00000000000..8bd7876b291
--- /dev/null
+++ b/chromium/base/android/library_loader/anchor_functions.lds
@@ -0,0 +1,7 @@
+# Copyright 2018 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# Define symbols that point to the start and end of the .text section.
+PROVIDE_HIDDEN(linker_script_start_of_text = ADDR(.text));
+PROVIDE_HIDDEN(linker_script_end_of_text = ADDR(.text) + SIZEOF(.text));
diff --git a/chromium/base/android/library_loader/library_loader_hooks.cc b/chromium/base/android/library_loader/library_loader_hooks.cc
new file mode 100644
index 00000000000..2a978136dbf
--- /dev/null
+++ b/chromium/base/android/library_loader/library_loader_hooks.cc
@@ -0,0 +1,116 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/library_loader/library_loader_hooks.h"
+
+#include <string>
+
+#include "base/android/jni_string.h"
+#include "base/android/library_loader/anchor_functions_buildflags.h"
+#include "base/android/library_loader/library_prefetcher.h"
+#include "base/android/orderfile/orderfile_buildflags.h"
+#include "base/android/sys_utils.h"
+#include "base/at_exit.h"
+#include "base/base_jni_headers/LibraryLoader_jni.h"
+#include "base/base_switches.h"
+#include "base/metrics/histogram.h"
+#include "base/metrics/histogram_functions.h"
+#include "base/metrics/histogram_macros.h"
+
+#if BUILDFLAG(ORDERFILE_INSTRUMENTATION)
+#include "base/android/orderfile/orderfile_instrumentation.h"
+#endif
+
+namespace base {
+namespace android {
+
+namespace {
+
+base::AtExitManager* g_at_exit_manager = nullptr;
+LibraryLoadedHook* g_registration_callback = nullptr;
+NativeInitializationHook* g_native_initialization_hook = nullptr;
+NonMainDexJniRegistrationHook* g_jni_registration_hook = nullptr;
+LibraryProcessType g_library_process_type = PROCESS_UNINITIALIZED;
+
+} // namespace
+
+LibraryProcessType GetLibraryProcessType() {
+ return g_library_process_type;
+}
+
+bool IsUsingOrderfileOptimization() {
+#if BUILDFLAG(SUPPORTS_CODE_ORDERING)
+ return SysUtils::IsLowEndDeviceFromJni();
+#else // !SUPPORTS_CODE_ORDERING
+ return false;
+#endif
+}
+
+void SetNativeInitializationHook(
+ NativeInitializationHook native_initialization_hook) {
+ g_native_initialization_hook = native_initialization_hook;
+}
+
+void SetNonMainDexJniRegistrationHook(
+ NonMainDexJniRegistrationHook jni_registration_hook) {
+ DCHECK(!g_jni_registration_hook);
+ g_jni_registration_hook = jni_registration_hook;
+}
+
+void SetLibraryLoadedHook(LibraryLoadedHook* func) {
+ g_registration_callback = func;
+}
+
+static jboolean JNI_LibraryLoader_LibraryLoaded(
+ JNIEnv* env,
+ jint library_process_type) {
+ DCHECK_EQ(g_library_process_type, PROCESS_UNINITIALIZED);
+ g_library_process_type =
+ static_cast<LibraryProcessType>(library_process_type);
+
+#if BUILDFLAG(ORDERFILE_INSTRUMENTATION)
+ orderfile::StartDelayedDump();
+#endif
+
+#if BUILDFLAG(SUPPORTS_CODE_ORDERING)
+ if (CommandLine::ForCurrentProcess()->HasSwitch(
+ "log-native-library-residency")) {
+ NativeLibraryPrefetcher::MadviseForResidencyCollection();
+ } else if (IsUsingOrderfileOptimization()) {
+ NativeLibraryPrefetcher::MadviseForOrderfile();
+ }
+#endif
+
+ if (g_native_initialization_hook &&
+ !g_native_initialization_hook(
+ static_cast<LibraryProcessType>(library_process_type)))
+ return false;
+ if (g_registration_callback &&
+ !g_registration_callback(
+ env, nullptr,
+ static_cast<LibraryProcessType>(library_process_type))) {
+ return false;
+ }
+ return true;
+}
+
+static void JNI_LibraryLoader_RegisterNonMainDexJni(JNIEnv* env) {
+ if (g_jni_registration_hook) {
+ g_jni_registration_hook();
+ }
+}
+
+void LibraryLoaderExitHook() {
+ if (g_at_exit_manager) {
+ delete g_at_exit_manager;
+ g_at_exit_manager = nullptr;
+ }
+}
+
+void InitAtExitManager() {
+ g_at_exit_manager = new base::AtExitManager();
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/library_loader/library_loader_hooks.h b/chromium/base/android/library_loader/library_loader_hooks.h
new file mode 100644
index 00000000000..52734aec581
--- /dev/null
+++ b/chromium/base/android/library_loader/library_loader_hooks.h
@@ -0,0 +1,92 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_LIBRARY_LOADER_LIBRARY_LOADER_HOOKS_H_
+#define BASE_ANDROID_LIBRARY_LOADER_LIBRARY_LOADER_HOOKS_H_
+
+#include <jni.h>
+
+#include "base/base_export.h"
+#include "base/command_line.h"
+#include "base/functional/callback.h"
+#include "base/metrics/field_trial.h"
+
+namespace base {
+
+namespace android {
+
+// The process the shared library is loaded in.
+// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.base.library_loader
+enum LibraryProcessType {
+ // The LibraryLoad has not been initialized.
+ PROCESS_UNINITIALIZED = 0,
+ // Shared library is running in browser process.
+ PROCESS_BROWSER = 1,
+ // Shared library is running in child process.
+ PROCESS_CHILD = 2,
+ // Shared library is running in the app that uses webview.
+ PROCESS_WEBVIEW = 3,
+ // Shared library is running in child process as part of webview.
+ PROCESS_WEBVIEW_CHILD = 4,
+ // Shared library is running in the app that uses weblayer.
+ PROCESS_WEBLAYER = 5,
+ // Shared library is running in child process as part of weblayer.
+ PROCESS_WEBLAYER_CHILD = 6,
+ // Shared library is running in a non-embedded WebView process.
+ PROCESS_WEBVIEW_NONEMBEDDED = 7,
+};
+
+// Returns the library process type this library was loaded for.
+BASE_EXPORT LibraryProcessType GetLibraryProcessType();
+
+// Whether fewer code should be prefetched, and no-readahead should be set.
+// Returns true on low-end devices, where this speeds up startup, and false
+// elsewhere, where it slows it down. See
+// https://bugs.chromium.org/p/chromium/issues/detail?id=758566#c71 for details.
+BASE_EXPORT bool IsUsingOrderfileOptimization();
+
+typedef bool NativeInitializationHook(LibraryProcessType library_process_type);
+
+BASE_EXPORT void SetNativeInitializationHook(
+ NativeInitializationHook native_initialization_hook);
+
+typedef void NonMainDexJniRegistrationHook();
+
+BASE_EXPORT void SetNonMainDexJniRegistrationHook(
+ NonMainDexJniRegistrationHook jni_registration_hook);
+
+// Record any pending renderer histogram value as histograms. Pending values
+// are set by
+// JNI_LibraryLoader_RegisterChromiumAndroidLinkerRendererHistogram().
+BASE_EXPORT void RecordLibraryLoaderRendererHistograms();
+
+// Typedef for hook function to be called (indirectly from Java) once the
+// libraries are loaded. The hook function should register the JNI bindings
+// required to start the application. It should return true for success and
+// false for failure.
+// Note: this can't use base::{Once, Repeating}Callback because there is no
+// way of initializing the default callback without using static objects, which
+// we forbid.
+typedef bool LibraryLoadedHook(JNIEnv* env,
+ jclass clazz,
+ LibraryProcessType library_process_type);
+
+// Set the hook function to be called (from Java) once the libraries are loaded.
+// SetLibraryLoadedHook may only be called from JNI_OnLoad. The hook function
+// should register the JNI bindings required to start the application.
+
+BASE_EXPORT void SetLibraryLoadedHook(LibraryLoadedHook* func);
+
+// Call on exit to delete the AtExitManager which OnLibraryLoadedOnUIThread
+// created.
+BASE_EXPORT void LibraryLoaderExitHook();
+
+// Initialize AtExitManager, this must be done at the begining of loading
+// shared library.
+void InitAtExitManager();
+
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_LIBRARY_LOADER_LIBRARY_LOADER_HOOKS_H_
diff --git a/chromium/base/android/library_loader/library_prefetcher.cc b/chromium/base/android/library_loader/library_prefetcher.cc
new file mode 100644
index 00000000000..c720333ab56
--- /dev/null
+++ b/chromium/base/android/library_loader/library_prefetcher.cc
@@ -0,0 +1,345 @@
+// Copyright 2015 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/library_loader/library_prefetcher.h"
+
+#include <stddef.h>
+#include <sys/mman.h>
+#include <sys/resource.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+#include <atomic>
+#include <cstdlib>
+#include <memory>
+#include <utility>
+#include <vector>
+
+#include "base/android/library_loader/anchor_functions.h"
+#include "base/android/orderfile/orderfile_buildflags.h"
+#include "base/bits.h"
+#include "base/files/file.h"
+#include "base/format_macros.h"
+#include "base/logging.h"
+#include "base/posix/eintr_wrapper.h"
+#include "base/process/process_metrics.h"
+#include "base/ranges/algorithm.h"
+#include "base/strings/string_util.h"
+#include "base/strings/stringprintf.h"
+#include "build/build_config.h"
+
+#if BUILDFLAG(ORDERFILE_INSTRUMENTATION)
+#include "base/android/orderfile/orderfile_instrumentation.h"
+#endif
+
+#if BUILDFLAG(SUPPORTS_CODE_ORDERING)
+
+namespace base {
+namespace android {
+
+namespace {
+
+// Valid for all Android architectures.
+constexpr size_t kPageSize = 4096;
+
+// Populates the per-page residency between |start| and |end| in |residency|. If
+// successful, |residency| has the size of |end| - |start| in pages.
+// Returns true for success.
+bool Mincore(size_t start, size_t end, std::vector<unsigned char>* residency) {
+ if (start % kPageSize || end % kPageSize)
+ return false;
+ size_t size = end - start;
+ size_t size_in_pages = size / kPageSize;
+ if (residency->size() != size_in_pages)
+ residency->resize(size_in_pages);
+ int err = HANDLE_EINTR(
+ mincore(reinterpret_cast<void*>(start), size, &(*residency)[0]));
+ PLOG_IF(ERROR, err) << "mincore() failed";
+ return !err;
+}
+
+// Returns the start and end of .text, aligned to the lower and upper page
+// boundaries, respectively.
+std::pair<size_t, size_t> GetTextRange() {
+ // |kStartOfText| may not be at the beginning of a page, since .plt can be
+ // before it, yet in the same mapping for instance.
+ size_t start_page = kStartOfText - kStartOfText % kPageSize;
+ // Set the end to the page on which the beginning of the last symbol is. The
+ // actual symbol may spill into the next page by a few bytes, but this is
+ // outside of the executable code range anyway.
+ size_t end_page = bits::AlignUp(kEndOfText, kPageSize);
+ return {start_page, end_page};
+}
+
+// Returns the start and end pages of the unordered section of .text, aligned to
+// lower and upper page boundaries, respectively.
+std::pair<size_t, size_t> GetOrderedTextRange() {
+ size_t start_page = kStartOfOrderedText - kStartOfOrderedText % kPageSize;
+ // kEndOfUnorderedText is not considered ordered, but the byte immediately
+ // before is considered ordered and so can not be contained in the start page.
+ size_t end_page = bits::AlignUp(kEndOfOrderedText, kPageSize);
+ return {start_page, end_page};
+}
+
+// Calls madvise(advice) on the specified range. Does nothing if the range is
+// empty.
+void MadviseOnRange(const std::pair<size_t, size_t>& range, int advice) {
+ if (range.first >= range.second) {
+ return;
+ }
+ size_t size = range.second - range.first;
+ int err = madvise(reinterpret_cast<void*>(range.first), size, advice);
+ if (err) {
+ PLOG(ERROR) << "madvise() failed";
+ }
+}
+
+// Timestamp in ns since Unix Epoch, and residency, as returned by mincore().
+struct TimestampAndResidency {
+ uint64_t timestamp_nanos;
+ std::vector<unsigned char> residency;
+
+ TimestampAndResidency(uint64_t timestamp_nanos,
+ std::vector<unsigned char>&& residency)
+ : timestamp_nanos(timestamp_nanos), residency(residency) {}
+};
+
+// Returns true for success.
+bool CollectResidency(size_t start,
+ size_t end,
+ std::vector<TimestampAndResidency>* data) {
+ // Not using TimeTicks() to not call too many base:: symbol that would pollute
+ // the reached symbols dumps.
+ struct timespec ts;
+ if (HANDLE_EINTR(clock_gettime(CLOCK_MONOTONIC, &ts))) {
+ PLOG(ERROR) << "Cannot get the time.";
+ return false;
+ }
+ uint64_t now = static_cast<uint64_t>(ts.tv_sec) * 1000 * 1000 * 1000 +
+ static_cast<uint64_t>(ts.tv_nsec);
+ std::vector<unsigned char> residency;
+ if (!Mincore(start, end, &residency))
+ return false;
+
+ data->emplace_back(now, std::move(residency));
+ return true;
+}
+
+void DumpResidency(size_t start,
+ size_t end,
+ std::unique_ptr<std::vector<TimestampAndResidency>> data) {
+ LOG(WARNING) << "Dumping native library residency";
+ auto path = FilePath(
+ StringPrintf("/data/local/tmp/chrome/residency-%d.txt", getpid()));
+ auto file = File(path, File::FLAG_CREATE_ALWAYS | File::FLAG_WRITE);
+ if (!file.IsValid()) {
+ PLOG(ERROR) << "Cannot open file to dump the residency data "
+ << path.value();
+ return;
+ }
+
+ // First line: start-end of text range.
+ CHECK(AreAnchorsSane());
+ CHECK_LE(start, kStartOfText);
+ CHECK_LE(kEndOfText, end);
+ auto start_end = StringPrintf("%" PRIuS " %" PRIuS "\n", kStartOfText - start,
+ kEndOfText - start);
+ file.WriteAtCurrentPos(start_end.c_str(), static_cast<int>(start_end.size()));
+
+ for (const auto& data_point : *data) {
+ auto timestamp = StringPrintf("%" PRIu64 " ", data_point.timestamp_nanos);
+ file.WriteAtCurrentPos(timestamp.c_str(),
+ static_cast<int>(timestamp.size()));
+
+ std::vector<char> dump;
+ dump.reserve(data_point.residency.size() + 1);
+ for (auto c : data_point.residency)
+ dump.push_back(c ? '1' : '0');
+ dump[dump.size() - 1] = '\n';
+ file.WriteAtCurrentPos(&dump[0], checked_cast<int>(dump.size()));
+ }
+}
+
+#if !BUILDFLAG(ORDERFILE_INSTRUMENTATION)
+// Reads a byte per page between |start| and |end| to force it into the page
+// cache.
+// Heap allocations, syscalls and library functions are not allowed in this
+// function.
+// Returns true for success.
+#if defined(ADDRESS_SANITIZER)
+// Disable AddressSanitizer instrumentation for this function. It is touching
+// memory that hasn't been allocated by the app, though the addresses are
+// valid. Furthermore, this takes place in a child process. See crbug.com/653372
+// for the context.
+__attribute__((no_sanitize_address))
+#endif
+void Prefetch(size_t start, size_t end) {
+ unsigned char* start_ptr = reinterpret_cast<unsigned char*>(start);
+ unsigned char* end_ptr = reinterpret_cast<unsigned char*>(end);
+ [[maybe_unused]] unsigned char dummy = 0;
+ for (unsigned char* ptr = start_ptr; ptr < end_ptr; ptr += kPageSize) {
+ // Volatile is required to prevent the compiler from eliminating this
+ // loop.
+ dummy ^= *static_cast<volatile unsigned char*>(ptr);
+ }
+}
+
+// These values were used in the past for recording
+// "LibraryLoader.PrefetchDetailedStatus".
+enum class PrefetchStatus {
+ kSuccess = 0,
+ kWrongOrdering = 1,
+ kForkFailed = 2,
+ kChildProcessCrashed = 3,
+ kChildProcessKilled = 4,
+ kMaxValue = kChildProcessKilled
+};
+
+PrefetchStatus ForkAndPrefetch(bool ordered_only) {
+ if (!IsOrderingSane()) {
+ LOG(WARNING) << "Incorrect code ordering";
+ return PrefetchStatus::kWrongOrdering;
+ }
+
+ // Looking for ranges is done before the fork, to avoid syscalls and/or memory
+ // allocations in the forked process. The child process inherits the lock
+ // state of its parent thread. It cannot rely on being able to acquire any
+ // lock (unless special care is taken in a pre-fork handler), including being
+ // able to call malloc().
+ //
+ // Always prefetch the ordered section first, as it's reached early during
+ // startup, and not necessarily located at the beginning of .text.
+ std::vector<std::pair<size_t, size_t>> ranges = {GetOrderedTextRange()};
+ if (!ordered_only)
+ ranges.push_back(GetTextRange());
+
+ pid_t pid = fork();
+ if (pid == 0) {
+ // Android defines the background priority to this value since at least 2009
+ // (see Process.java).
+ constexpr int kBackgroundPriority = 10;
+ setpriority(PRIO_PROCESS, 0, kBackgroundPriority);
+ // _exit() doesn't call the atexit() handlers.
+ for (const auto& range : ranges) {
+ Prefetch(range.first, range.second);
+ }
+ _exit(EXIT_SUCCESS);
+ } else {
+ if (pid < 0) {
+ return PrefetchStatus::kForkFailed;
+ }
+ int status;
+ const pid_t result = HANDLE_EINTR(waitpid(pid, &status, 0));
+ if (result == pid) {
+ if (WIFEXITED(status))
+ return PrefetchStatus::kSuccess;
+ if (WIFSIGNALED(status)) {
+ int signal = WTERMSIG(status);
+ switch (signal) {
+ case SIGSEGV:
+ case SIGBUS:
+ return PrefetchStatus::kChildProcessCrashed;
+ case SIGKILL:
+ case SIGTERM:
+ default:
+ return PrefetchStatus::kChildProcessKilled;
+ }
+ }
+ }
+ // Should not happen. Per man waitpid(2), errors are:
+ // - EINTR: handled.
+ // - ECHILD if the process doesn't have an unwaited-for child with this PID.
+ // - EINVAL.
+ return PrefetchStatus::kChildProcessKilled;
+ }
+}
+#endif // !BUILDFLAG(ORDERFILE_INSTRUMENTATION)
+
+} // namespace
+
+// static
+void NativeLibraryPrefetcher::ForkAndPrefetchNativeLibrary(bool ordered_only) {
+#if BUILDFLAG(ORDERFILE_INSTRUMENTATION)
+ // Avoid forking with orderfile instrumentation because the child process
+ // would create a dump as well.
+ return;
+#else
+ PrefetchStatus status = ForkAndPrefetch(ordered_only);
+ if (status != PrefetchStatus::kSuccess) {
+ LOG(WARNING) << "Cannot prefetch the library. status = "
+ << static_cast<int>(status);
+ }
+#endif // BUILDFLAG(ORDERFILE_INSTRUMENTATION)
+}
+
+// static
+int NativeLibraryPrefetcher::PercentageOfResidentCode(size_t start,
+ size_t end) {
+ size_t total_pages = 0;
+ size_t resident_pages = 0;
+
+ std::vector<unsigned char> residency;
+ bool ok = Mincore(start, end, &residency);
+ if (!ok)
+ return -1;
+ total_pages += residency.size();
+ resident_pages += static_cast<size_t>(
+ ranges::count_if(residency, [](unsigned char x) { return x & 1; }));
+ if (total_pages == 0)
+ return -1;
+ return static_cast<int>((100 * resident_pages) / total_pages);
+}
+
+// static
+int NativeLibraryPrefetcher::PercentageOfResidentNativeLibraryCode() {
+ if (!AreAnchorsSane()) {
+ LOG(WARNING) << "Incorrect code ordering";
+ return -1;
+ }
+ const auto& range = GetTextRange();
+ return PercentageOfResidentCode(range.first, range.second);
+}
+
+// static
+void NativeLibraryPrefetcher::PeriodicallyCollectResidency() {
+ CHECK_EQ(static_cast<long>(kPageSize), sysconf(_SC_PAGESIZE));
+
+ LOG(WARNING) << "Spawning thread to periodically collect residency";
+ const auto& range = GetTextRange();
+ auto data = std::make_unique<std::vector<TimestampAndResidency>>();
+ // Collect residency for about minute (the actual time spent collecting
+ // residency can vary, so this is only approximate).
+ for (int i = 0; i < 120; ++i) {
+ if (!CollectResidency(range.first, range.second, data.get()))
+ return;
+ usleep(5e5);
+ }
+ DumpResidency(range.first, range.second, std::move(data));
+}
+
+// static
+void NativeLibraryPrefetcher::MadviseForOrderfile() {
+ if (!IsOrderingSane()) {
+ LOG(WARNING) << "Code not ordered, madvise optimization skipped";
+ return;
+ }
+ // First MADV_RANDOM on all of text, then turn the ordered text range back to
+ // normal. The ordered range may be placed anywhere within .text.
+ MadviseOnRange(GetTextRange(), MADV_RANDOM);
+ MadviseOnRange(GetOrderedTextRange(), MADV_NORMAL);
+}
+
+// static
+void NativeLibraryPrefetcher::MadviseForResidencyCollection() {
+ if (!AreAnchorsSane()) {
+ LOG(WARNING) << "Code not ordered, cannot madvise";
+ return;
+ }
+ LOG(WARNING) << "Performing madvise for residency collection";
+ MadviseOnRange(GetTextRange(), MADV_RANDOM);
+}
+
+} // namespace android
+} // namespace base
+#endif // BUILDFLAG(SUPPORTS_CODE_ORDERING)
diff --git a/chromium/base/android/library_loader/library_prefetcher.h b/chromium/base/android/library_loader/library_prefetcher.h
new file mode 100644
index 00000000000..d1e344e8a03
--- /dev/null
+++ b/chromium/base/android/library_loader/library_prefetcher.h
@@ -0,0 +1,71 @@
+// Copyright 2015 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_LIBRARY_LOADER_LIBRARY_PREFETCHER_H_
+#define BASE_ANDROID_LIBRARY_LOADER_LIBRARY_PREFETCHER_H_
+
+#include <jni.h>
+
+#include <stdint.h>
+
+#include "base/android/library_loader/anchor_functions_buildflags.h"
+#include "base/base_export.h"
+#include "base/gtest_prod_util.h"
+
+#if BUILDFLAG(SUPPORTS_CODE_ORDERING)
+
+namespace base {
+namespace android {
+
+// Forks and waits for a process prefetching the native library. This is done in
+// a forked process for the following reasons:
+// - Isolating the main process from mistakes in getting the address range, only
+// crashing the forked process in case of mistake.
+// - Not inflating the memory used by the main process uselessly, which could
+// increase its likelihood to be killed.
+// The forked process has background priority and, since it is not declared to
+// the Android runtime, can be killed at any time, which is not an issue here.
+class BASE_EXPORT NativeLibraryPrefetcher {
+ public:
+ NativeLibraryPrefetcher() = delete;
+ NativeLibraryPrefetcher(const NativeLibraryPrefetcher&) = delete;
+ NativeLibraryPrefetcher& operator=(const NativeLibraryPrefetcher&) = delete;
+
+ // Finds the executable code range, forks a low priority process pre-fetching
+ // it wait()s for the process to exit or die. If ordered_only is true, only
+ // the ordered section is prefetched. See GetOrdrderedTextRange() in
+ // library_prefetcher.cc.
+ static void ForkAndPrefetchNativeLibrary(bool ordered_only);
+
+ // Returns the percentage of the native library code currently resident in
+ // memory, or -1 in case of error.
+ static int PercentageOfResidentNativeLibraryCode();
+
+ // Collects residency for the native library executable multiple times, then
+ // dumps it to disk.
+ static void PeriodicallyCollectResidency();
+
+ // Calls madvise() on the native library executable, using orderfile
+ // information to decide how to advise each part of the library.
+ static void MadviseForOrderfile();
+
+ // Calls madvise() on the native library executable so that residency
+ // collection is accurate.
+ static void MadviseForResidencyCollection();
+
+ private:
+ // Returns the percentage of [start, end] currently resident in
+ // memory, or -1 in case of error.
+ static int PercentageOfResidentCode(size_t start, size_t end);
+
+ FRIEND_TEST_ALL_PREFIXES(NativeLibraryPrefetcherTest,
+ TestPercentageOfResidentCode);
+};
+
+} // namespace android
+} // namespace base
+
+#endif // BUILDFLAG(SUPPORTS_CODE_ORDERING)
+
+#endif // BASE_ANDROID_LIBRARY_LOADER_LIBRARY_PREFETCHER_H_
diff --git a/chromium/base/android/library_loader/library_prefetcher_hooks.cc b/chromium/base/android/library_loader/library_prefetcher_hooks.cc
new file mode 100644
index 00000000000..50968432198
--- /dev/null
+++ b/chromium/base/android/library_loader/library_prefetcher_hooks.cc
@@ -0,0 +1,44 @@
+// Copyright 2019 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <string>
+
+#include "base/android/jni_android.h"
+#include "base/android/jni_string.h"
+#include "base/android/library_loader/anchor_functions_buildflags.h"
+#include "base/android/library_loader/library_loader_hooks.h"
+#include "base/android/library_loader/library_prefetcher.h"
+#include "base/android/scoped_java_ref.h"
+#include "base/base_jni_headers/LibraryPrefetcher_jni.h"
+#include "base/logging.h"
+
+namespace base {
+namespace android {
+
+static void JNI_LibraryPrefetcher_ForkAndPrefetchNativeLibrary(JNIEnv* env) {
+#if BUILDFLAG(SUPPORTS_CODE_ORDERING)
+ return NativeLibraryPrefetcher::ForkAndPrefetchNativeLibrary(
+ IsUsingOrderfileOptimization());
+#endif
+}
+
+static jint JNI_LibraryPrefetcher_PercentageOfResidentNativeLibraryCode(
+ JNIEnv* env) {
+#if BUILDFLAG(SUPPORTS_CODE_ORDERING)
+ return NativeLibraryPrefetcher::PercentageOfResidentNativeLibraryCode();
+#else
+ return -1;
+#endif
+}
+
+static void JNI_LibraryPrefetcher_PeriodicallyCollectResidency(JNIEnv* env) {
+#if BUILDFLAG(SUPPORTS_CODE_ORDERING)
+ NativeLibraryPrefetcher::PeriodicallyCollectResidency();
+#else
+ LOG(WARNING) << "Collecting residency is not supported.";
+#endif
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/library_loader/library_prefetcher_unittest.cc b/chromium/base/android/library_loader/library_prefetcher_unittest.cc
new file mode 100644
index 00000000000..d5a5a036b32
--- /dev/null
+++ b/chromium/base/android/library_loader/library_prefetcher_unittest.cc
@@ -0,0 +1,49 @@
+// Copyright 2015 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/library_loader/library_prefetcher.h"
+
+#include <stddef.h>
+#include <stdint.h>
+#include <sys/mman.h>
+#include "base/android/library_loader/anchor_functions_buildflags.h"
+#include "base/memory/writable_shared_memory_region.h"
+#include "build/build_config.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+#if BUILDFLAG(SUPPORTS_CODE_ORDERING)
+namespace base {
+namespace android {
+
+// Fails with ASAN, crbug.com/570423.
+#if !defined(ADDRESS_SANITIZER)
+namespace {
+const size_t kPageSize = 4096;
+} // namespace
+
+// https://crbug.com/1056021 - flaky on Nexus 5.
+TEST(NativeLibraryPrefetcherTest, DISABLED_TestPercentageOfResidentCode) {
+ size_t length = 4 * kPageSize;
+ auto shared_region = base::WritableSharedMemoryRegion::Create(length);
+ ASSERT_TRUE(shared_region.IsValid());
+ auto mapping = shared_region.Map();
+ ASSERT_TRUE(mapping.IsValid());
+ void* address = mapping.memory();
+ size_t start = reinterpret_cast<size_t>(address);
+ size_t end = start + length;
+
+ // Remove everything.
+ ASSERT_EQ(0, madvise(address, length, MADV_DONTNEED));
+ EXPECT_EQ(0, NativeLibraryPrefetcher::PercentageOfResidentCode(start, end));
+
+ // Get everything back.
+ ASSERT_EQ(0, mlock(address, length));
+ EXPECT_EQ(100, NativeLibraryPrefetcher::PercentageOfResidentCode(start, end));
+ munlock(address, length);
+}
+#endif // !defined(ADDRESS_SANITIZER)
+
+} // namespace android
+} // namespace base
+#endif // BUILDFLAG(SUPPORTS_CODE_ORDERING)
diff --git a/chromium/base/android/linker/DEPS b/chromium/base/android/linker/DEPS
new file mode 100644
index 00000000000..7cefa77d58a
--- /dev/null
+++ b/chromium/base/android/linker/DEPS
@@ -0,0 +1,14 @@
+include_rules = [
+ # This code cannot depend on anything from //base, except for the current
+ # directory.
+ "-base",
+ "+base/android/linker",
+]
+
+# Allow using //base in unittests. These unittests are included in targets that
+# already depend on //base.
+specific_include_rules = {
+ ".*_unittest\.cc": [
+ "+base",
+ ],
+}
diff --git a/chromium/base/android/linker/linker_jni.cc b/chromium/base/android/linker/linker_jni.cc
new file mode 100644
index 00000000000..99df078bac1
--- /dev/null
+++ b/chromium/base/android/linker/linker_jni.cc
@@ -0,0 +1,865 @@
+// Copyright 2015 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/linker/linker_jni.h"
+
+#include <android/dlext.h>
+#include <dlfcn.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <inttypes.h>
+#include <jni.h>
+#include <link.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <time.h>
+#include <unistd.h>
+
+#include <memory>
+
+namespace chromium_android_linker {
+
+namespace {
+
+// Variable containing LibInfo for the loaded library.
+LibInfo_class s_lib_info_fields;
+
+// Guarded by |mLock| in Linker.java.
+RelroSharingStatus s_relro_sharing_status = RelroSharingStatus::NOT_ATTEMPTED;
+
+// Saved JavaVM passed to JNI_OnLoad().
+JavaVM* s_java_vm = nullptr;
+
+// With mmap(2) reserves a range of virtual addresses.
+//
+// The range must start with |hint| and be of size |size|. The |hint==0|
+// indicates that the address of the mapping should be chosen at random,
+// utilizing ASLR built into mmap(2).
+//
+// The start of the resulting region is returned in |address|.
+//
+// The value 0 returned iff the attempt failed (a part of the address range is
+// already reserved by some other subsystem).
+void ReserveAddressWithHint(uintptr_t hint, uintptr_t* address, size_t* size) {
+ void* ptr = reinterpret_cast<void*>(hint);
+ void* new_ptr = mmap(ptr, kAddressSpaceReservationSize, PROT_NONE,
+ MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+ if (new_ptr == MAP_FAILED) {
+ PLOG_ERROR("mmap");
+ *address = 0;
+ } else if ((hint != 0) && (new_ptr != ptr)) {
+ // Something grabbed the address range before the early phase of the
+ // linker had a chance, this should be uncommon.
+ LOG_ERROR("Address range starting at 0x%" PRIxPTR " was not free to use",
+ hint);
+ munmap(new_ptr, kAddressSpaceReservationSize);
+ *address = 0;
+ } else {
+ *address = reinterpret_cast<uintptr_t>(new_ptr);
+ *size = kAddressSpaceReservationSize;
+ LOG_INFO("Reserved region at address: 0x%" PRIxPTR ", size: 0x%zu",
+ *address, *size);
+ }
+}
+
+bool ScanRegionInBuffer(const char* buf,
+ size_t length,
+ uintptr_t* out_address,
+ size_t* out_size) {
+ const char* position = strstr(buf, "[anon:libwebview reservation]");
+ if (!position)
+ return false;
+
+ const char* line_start = position;
+ while (line_start > buf) {
+ line_start--;
+ if (*line_start == '\n') {
+ line_start++;
+ break;
+ }
+ }
+
+ // Extract the region start and end. The failures below should not happen as
+ // long as the reservation is made the same way in
+ // frameworks/base/native/webview/loader/loader.cpp.
+ uintptr_t vma_start, vma_end;
+ char permissions[5] = {'\0'}; // Ensure a null-terminated string.
+ // Example line from proc(5):
+ // address perms offset dev inode pathname
+ // 00400000-00452000 r-xp 00000000 08:02 173521 /usr/bin/dbus-daemon
+ if (sscanf(line_start, "%" SCNxPTR "-%" SCNxPTR " %4c", &vma_start, &vma_end,
+ permissions) < 3) {
+ return false;
+ }
+
+ if (strcmp(permissions, "---p"))
+ return false;
+
+ if (vma_start % PAGE_SIZE || vma_end % PAGE_SIZE)
+ return false;
+
+ *out_address = static_cast<uintptr_t>(vma_start);
+ *out_size = vma_end - vma_start;
+
+ return true;
+}
+
+bool FindRegionInOpenFile(int fd, uintptr_t* out_address, size_t* out_size) {
+ constexpr size_t kMaxLineLength = 256;
+ constexpr size_t kReadSize = PAGE_SIZE;
+
+ // Loop until no bytes left to scan. On every iteration except the last, fill
+ // the buffer till the end. On every iteration except the first, the buffer
+ // begins with kMaxLineLength bytes from the end of the previous fill.
+ char buf[kReadSize + kMaxLineLength + 1];
+ buf[kReadSize + kMaxLineLength] = '\0'; // Stop strstr().
+ size_t pos = 0;
+ size_t bytes_requested = kReadSize + kMaxLineLength;
+ bool reached_end = false;
+ while (true) {
+ // Fill the |buf| to the maximum and determine whether reading reached the
+ // end.
+ size_t bytes_read = 0;
+ do {
+ ssize_t rv = HANDLE_EINTR(
+ read(fd, buf + pos + bytes_read, bytes_requested - bytes_read));
+ if (rv == 0) {
+ reached_end = true;
+ } else if (rv < 0) {
+ PLOG_ERROR("read to find webview reservation");
+ return false;
+ }
+ bytes_read += rv;
+ } while (!reached_end && (bytes_read < bytes_requested));
+
+ // Return results if the buffer contains the pattern.
+ if (ScanRegionInBuffer(buf, pos + bytes_read, out_address, out_size))
+ return true;
+
+ // Did not find the pattern.
+ if (reached_end)
+ return false;
+
+ // The buffer is filled to the end. Copy the end bytes to the beginning,
+ // allowing to scan these bytes on the next iteration.
+ memcpy(buf, buf + kReadSize, kMaxLineLength);
+ pos = kMaxLineLength;
+ bytes_requested = kReadSize;
+ }
+}
+
+// Calls the Linker Java methods to record the time intervals in UMA. The calls
+// are made only once pre process, hence there is no need to cache the values
+// obtained from JNIEnv. The class must *not* be reused across different
+// Java->native calls because the |jclass| reference may become invalid in this
+// case.
+class LoadTimeReporterJni : public LoadTimeReporter {
+ public:
+ LoadTimeReporterJni(JNIEnv* env, jclass linker_jni_class)
+ : env_(env), class_(linker_jni_class) {}
+
+ void reportDlopenExtTime(int64_t millis) const override {
+ env_->CallStaticVoidMethod(
+ class_, env_->GetStaticMethodID(class_, "reportDlopenExtTime", "(J)V"),
+ millis);
+ }
+
+ void reportIteratePhdrTime(int64_t millis) const override {
+ env_->CallStaticVoidMethod(
+ class_,
+ env_->GetStaticMethodID(class_, "reportIteratePhdrTime", "(J)V"),
+ millis);
+ }
+
+ private:
+ // Not copyable or movable.
+ LoadTimeReporterJni(const LoadTimeReporterJni&) = delete;
+ LoadTimeReporterJni& operator=(const LoadTimeReporterJni&) = delete;
+
+ JNIEnv* env_;
+ jclass class_;
+};
+
+constexpr int64_t kMillisecondsPerSecond = 1'000;
+constexpr int64_t kNanosecondsPerMillisecond = 1'000'000;
+
+int64_t GetMillisNow() {
+ struct timespec ts;
+ if (clock_gettime(CLOCK_MONOTONIC, &ts) != 0) {
+ PLOG_ERROR("clock_gettime");
+ return 0;
+ }
+
+ int64_t result = ts.tv_sec;
+ result *= kMillisecondsPerSecond;
+ result += (ts.tv_nsec / kNanosecondsPerMillisecond);
+ return result;
+}
+
+// Invokes android_dlopen_ext() to load the library into a given address range.
+// Assumes that the address range is already reserved with mmap(2). On success,
+// the |handle| of the loaded library is returned.
+//
+// Returns true iff this operation succeeds.
+bool AndroidDlopenExt(void* mapping_start,
+ size_t mapping_size,
+ const char* filename,
+ void** handle) {
+ android_dlextinfo dlextinfo{};
+ dlextinfo.flags = ANDROID_DLEXT_RESERVED_ADDRESS;
+ dlextinfo.reserved_addr = mapping_start;
+ dlextinfo.reserved_size = mapping_size;
+
+ LOG_INFO(
+ "android_dlopen_ext:"
+ " flags=0x%" PRIx64 ", reserved_addr=%p, reserved_size=%zu",
+ dlextinfo.flags, dlextinfo.reserved_addr, dlextinfo.reserved_size);
+
+ void* rv = android_dlopen_ext(filename, RTLD_NOW, &dlextinfo);
+ if (rv == nullptr) {
+ LOG_ERROR("android_dlopen_ext: %s", dlerror());
+ return false;
+ }
+
+ *handle = rv;
+ return true;
+}
+
+// With munmap(2) unmaps the tail of the given contiguous range of virtual
+// memory. Ignores errors.
+void TrimMapping(uintptr_t address, size_t old_size, size_t new_size) {
+ if (old_size <= new_size) {
+ LOG_ERROR("WARNING: library reservation was too small");
+ } else {
+ // Unmap the part of the reserved address space that is beyond the end of
+ // the loaded library data.
+ const uintptr_t unmap = address + new_size;
+ const size_t length = old_size - new_size;
+ munmap(reinterpret_cast<void*>(unmap), length);
+ }
+}
+
+// Calls JNI_OnLoad() in the library referenced by |handle|.
+// Returns true for success.
+bool CallJniOnLoad(void* handle) {
+ LOG_INFO("Entering");
+ // Locate and if found then call the loaded library's JNI_OnLoad() function.
+ using JNI_OnLoadFunctionPtr = int (*)(void* vm, void* reserved);
+ auto jni_onload =
+ reinterpret_cast<JNI_OnLoadFunctionPtr>(dlsym(handle, "JNI_OnLoad"));
+ if (jni_onload != nullptr) {
+ // Check that JNI_OnLoad returns a usable JNI version.
+ int jni_version = (*jni_onload)(s_java_vm, nullptr);
+ if (jni_version < JNI_VERSION_1_4) {
+ LOG_ERROR("JNI version is invalid: %d", jni_version);
+ return false;
+ }
+ }
+
+ LOG_INFO("Done");
+ return true;
+}
+
+} // namespace
+
+String::String(JNIEnv* env, jstring str) {
+ size_ = env->GetStringUTFLength(str);
+ ptr_ = static_cast<char*>(::malloc(size_ + 1));
+
+ // Note: This runs before browser native code is loaded, and so cannot
+ // rely on anything from base/. This means that we must use
+ // GetStringUTFChars() and not base::android::ConvertJavaStringToUTF8().
+ //
+ // GetStringUTFChars() suffices because the only strings used here are
+ // paths to APK files or names of shared libraries, all of which are
+ // plain ASCII, defined and hard-coded by the Chromium Android build.
+ //
+ // For more: see
+ // https://crbug.com/508876
+ //
+ // Note: GetStringUTFChars() returns Java UTF-8 bytes. This is good
+ // enough for the linker though.
+ const char* bytes = env->GetStringUTFChars(str, nullptr);
+ ::memcpy(ptr_, bytes, size_);
+ ptr_[size_] = '\0';
+
+ env->ReleaseStringUTFChars(str, bytes);
+}
+
+bool IsValidAddress(jlong address) {
+ bool result = static_cast<jlong>(static_cast<uintptr_t>(address)) == address;
+ if (!result) {
+ LOG_ERROR("Invalid address 0x%" PRIx64, static_cast<uint64_t>(address));
+ }
+ return result;
+}
+
+// Finds the jclass JNI reference corresponding to a given |class_name|.
+// |env| is the current JNI environment handle.
+// On success, return true and set |*clazz|.
+bool InitClassReference(JNIEnv* env, const char* class_name, jclass* clazz) {
+ *clazz = env->FindClass(class_name);
+ if (!*clazz) {
+ LOG_ERROR("Could not find class for %s", class_name);
+ return false;
+ }
+ return true;
+}
+
+// Initializes a jfieldID corresponding to the field of a given |clazz|,
+// with name |field_name| and signature |field_sig|.
+// |env| is the current JNI environment handle.
+// On success, return true and set |*field_id|.
+bool InitFieldId(JNIEnv* env,
+ jclass clazz,
+ const char* field_name,
+ const char* field_sig,
+ jfieldID* field_id) {
+ *field_id = env->GetFieldID(clazz, field_name, field_sig);
+ if (!*field_id) {
+ LOG_ERROR("Could not find ID for field '%s'", field_name);
+ return false;
+ }
+ LOG_INFO("Found ID %p for field '%s'", *field_id, field_name);
+ return true;
+}
+
+bool FindWebViewReservation(uintptr_t* out_address, size_t* out_size) {
+ // Note: reading /proc/PID/maps or /proc/PID/smaps is inherently racy. Among
+ // other things, the kernel provides these guarantees:
+ // * Each region record (line) is well formed
+ // * If there is something at a given vaddr during the entirety of the life of
+ // the smaps/maps walk, there will be some output for it.
+ //
+ // In order for the address/size extraction to be safe, these precausions are
+ // made in base/android/linker:
+ // * Modification of the range is done only after this function exits
+ // * The use of the range is avoided if it is not sufficient in size, which
+ // might happen if it gets split
+ const char kFileName[] = "/proc/self/maps";
+ int fd = HANDLE_EINTR(open(kFileName, O_RDONLY));
+ if (fd == -1) {
+ PLOG_ERROR("open %s", kFileName);
+ return false;
+ }
+
+ bool result = FindRegionInOpenFile(fd, out_address, out_size);
+ close(fd);
+ return result;
+}
+
+// Starting with API level 26 (Android O) the following functions from
+// libandroid.so should be used to create shared memory regions to ensure
+// compatibility with the future versions:
+// * ASharedMemory_create()
+// * ASharedMemory_setProt()
+//
+// This is inspired by //third_party/ashmem/ashmem-dev.c, which cannot be
+// referenced from the linker library to avoid increasing binary size.
+//
+// *Not* threadsafe.
+struct SharedMemoryFunctions {
+ SharedMemoryFunctions() {
+ library_handle = dlopen("libandroid.so", RTLD_NOW);
+ create = reinterpret_cast<CreateFunction>(
+ dlsym(library_handle, "ASharedMemory_create"));
+ set_protection = reinterpret_cast<SetProtectionFunction>(
+ dlsym(library_handle, "ASharedMemory_setProt"));
+ }
+
+ bool IsWorking() const {
+ if (!create || !set_protection) {
+ LOG_ERROR("Cannot get the shared memory functions from libandroid");
+ return false;
+ }
+ return true;
+ }
+
+ ~SharedMemoryFunctions() {
+ if (library_handle)
+ dlclose(library_handle);
+ }
+
+ typedef int (*CreateFunction)(const char*, size_t);
+ typedef int (*SetProtectionFunction)(int fd, int prot);
+
+ CreateFunction create;
+ SetProtectionFunction set_protection;
+
+ void* library_handle = nullptr;
+};
+
+void NativeLibInfo::ExportLoadInfoToJava() const {
+ if (!env_)
+ return;
+ s_lib_info_fields.SetLoadInfo(env_, java_object_, load_address_, load_size_);
+}
+
+void NativeLibInfo::ExportRelroInfoToJava() const {
+ if (!env_)
+ return;
+ s_lib_info_fields.SetRelroInfo(env_, java_object_, relro_start_, relro_size_,
+ relro_fd_);
+}
+
+void NativeLibInfo::CloseRelroFd() {
+ if (relro_fd_ == kInvalidFd)
+ return;
+ close(relro_fd_);
+ relro_fd_ = kInvalidFd;
+}
+
+bool NativeLibInfo::FindRelroAndLibraryRangesInElf() {
+ LOG_INFO("Called for 0x%" PRIxPTR, load_address_);
+
+ // Check that an ELF library starts at the |load_address_|.
+ if (memcmp(reinterpret_cast<void*>(load_address_), ELFMAG, SELFMAG) != 0) {
+ LOG_ERROR("Wrong magic number");
+ return false;
+ }
+ auto class_type = *reinterpret_cast<uint8_t*>(load_address_ + EI_CLASS);
+ if (class_type == ELFCLASS32) {
+ LOG_INFO("ELFCLASS32");
+ } else if (class_type == ELFCLASS64) {
+ LOG_INFO("ELFCLASS64");
+ } else {
+ LOG_ERROR("Could not determine ELF class");
+ return false;
+ }
+
+ // Sanitycheck PAGE_SIZE before use.
+ int page_size = sysconf(_SC_PAGESIZE);
+ if (page_size != PAGE_SIZE)
+ abort();
+
+ // Compute the ranges of PT_LOAD segments and the PT_GNU_RELRO. It is possible
+ // to reach for the same information by iterating over all loaded libraries
+ // and their program headers using dl_iterate_phdr(3). Instead here the
+ // iteration goes through the array |e_phoff[e_phnum]| to avoid acquisition of
+ // the global lock in Bionic (dlfcn.cpp).
+ //
+ // The code relies on (1) having RELRO in the PT_GNU_RELRO segment, and (2)
+ // the fact that the address *range* occupied by the library is the minimal
+ // address range containing all of the PT_LOAD and PT_GNU_RELRO segments.
+ // This is a contract between the static linker and the dynamic linker which
+ // seems unlikely to get broken. It might break though as a result of
+ // post-processing the DSO, which has historically happened for a few
+ // occasions (eliminating the unwind tables and splitting the library into
+ // DFMs).
+ auto min_vaddr = std::numeric_limits<ElfW(Addr)>::max();
+ auto min_relro_vaddr = min_vaddr;
+ ElfW(Addr) max_vaddr = 0;
+ ElfW(Addr) max_relro_vaddr = 0;
+ const auto* ehdr = reinterpret_cast<const ElfW(Ehdr)*>(load_address_);
+ const auto* phdrs =
+ reinterpret_cast<const ElfW(Phdr)*>(load_address_ + ehdr->e_phoff);
+ for (int i = 0; i < ehdr->e_phnum; i++) {
+ const ElfW(Phdr)* phdr = &phdrs[i];
+ switch (phdr->p_type) {
+ case PT_LOAD:
+ if (phdr->p_vaddr < min_vaddr)
+ min_vaddr = phdr->p_vaddr;
+ if (phdr->p_vaddr + phdr->p_memsz > max_vaddr)
+ max_vaddr = phdr->p_vaddr + phdr->p_memsz;
+ break;
+ case PT_GNU_RELRO:
+ min_relro_vaddr = PAGE_START(phdr->p_vaddr);
+ max_relro_vaddr = phdr->p_vaddr + phdr->p_memsz;
+
+ // As of 2020-11 in libmonochrome.so RELRO is covered by a LOAD segment.
+ // It is not clear whether this property is going to be guaranteed in
+ // the future. Include the RELRO segment as part of the 'load size'.
+ // This way a potential future change in layout of LOAD segments would
+ // not open address space for racy mmap(MAP_FIXED).
+ if (min_relro_vaddr < min_vaddr)
+ min_vaddr = min_relro_vaddr;
+ if (max_vaddr < max_relro_vaddr)
+ max_vaddr = max_relro_vaddr;
+ break;
+ default:
+ break;
+ }
+ }
+
+ // Fill out size and RELRO information.
+ load_size_ = PAGE_END(max_vaddr) - PAGE_START(min_vaddr);
+ relro_size_ = PAGE_END(max_relro_vaddr) - PAGE_START(min_relro_vaddr);
+ relro_start_ = load_address_ + PAGE_START(min_relro_vaddr);
+ return true;
+}
+
+bool NativeLibInfo::LoadWithDlopenExt(const String& path,
+ const LoadTimeReporter& reporter,
+ void** handle) {
+ LOG_INFO("Entering");
+
+ // The address range must be reserved during initialization in Linker.java.
+ if (!load_address_) {
+ // TODO(pasko): measure how often this happens.
+ return false;
+ }
+
+ // Remember the memory reservation size. Starting from this point load_size_
+ // changes the meaning to reflect the size of the loaded library.
+ size_t reservation_size = load_size_;
+ auto* address = reinterpret_cast<void*>(load_address_);
+
+ // Invoke android_dlopen_ext.
+ int64_t ticks_initial = GetMillisNow();
+ void* local_handle = nullptr;
+ if (!AndroidDlopenExt(address, reservation_size, path.c_str(),
+ &local_handle)) {
+ LOG_ERROR("android_dlopen_ext() error");
+ munmap(address, load_size_);
+ return false;
+ }
+ int64_t ticks_after_dlopen_ext = GetMillisNow();
+ reporter.reportDlopenExtTime(ticks_after_dlopen_ext - ticks_initial);
+
+ // Determine the library address ranges and the RELRO region.
+ if (!FindRelroAndLibraryRangesInElf()) {
+ // Fail early if PT_GNU_RELRO is not found. It likely indicates a
+ // build misconfiguration.
+ LOG_ERROR("Could not find RELRO in the loaded library: %s", path.c_str());
+ abort();
+ }
+ reporter.reportIteratePhdrTime(GetMillisNow() - ticks_after_dlopen_ext);
+
+ // Release the unused parts of the memory reservation.
+ TrimMapping(load_address_, reservation_size, load_size_);
+
+ *handle = local_handle;
+ return true;
+}
+
+bool NativeLibInfo::CreateSharedRelroFd(
+ const SharedMemoryFunctions& functions) {
+ LOG_INFO("Entering");
+ if (!relro_start_ || !relro_size_) {
+ LOG_ERROR("RELRO region is not populated");
+ return false;
+ }
+
+ // Create a writable shared memory region.
+ int shared_mem_fd = functions.create("cr_relro", relro_size_);
+ if (shared_mem_fd == -1) {
+ LOG_ERROR("Cannot create the shared memory file");
+ return false;
+ }
+ int rw_flags = PROT_READ | PROT_WRITE;
+ functions.set_protection(shared_mem_fd, rw_flags);
+
+ // Map the region as writable.
+ void* relro_copy_addr =
+ mmap(nullptr, relro_size_, rw_flags, MAP_SHARED, shared_mem_fd, 0);
+ if (relro_copy_addr == MAP_FAILED) {
+ PLOG_ERROR("failed to allocate space for copying RELRO");
+ close(shared_mem_fd);
+ return false;
+ }
+
+ // Populate the shared memory region with the contents of RELRO.
+ void* relro_addr = reinterpret_cast<void*>(relro_start_);
+ memcpy(relro_copy_addr, relro_addr, relro_size_);
+
+ // Protect the underlying physical pages from further modifications from all
+ // processes including the forked ones.
+ //
+ // Setting protection flags on the region to read-only guarantees that the
+ // memory can no longer get mapped as writable, for any FD pointing to the
+ // region, for any process. It is necessary to also munmap(2) the existing
+ // writable memory mappings, since they are not directly affected by the
+ // change of region's protection flags.
+ munmap(relro_copy_addr, relro_size_);
+ if (functions.set_protection(shared_mem_fd, PROT_READ) == -1) {
+ LOG_ERROR("Failed to set the RELRO FD as read-only.");
+ close(shared_mem_fd);
+ return false;
+ }
+
+ relro_fd_ = shared_mem_fd;
+ return true;
+}
+
+bool NativeLibInfo::ReplaceRelroWithSharedOne(
+ const SharedMemoryFunctions& functions) const {
+ LOG_INFO("Entering");
+ if (relro_fd_ == -1 || !relro_start_ || !relro_size_) {
+ LOG_ERROR("Replacement RELRO not ready");
+ return false;
+ }
+
+ // Map as read-only to *atomically* replace the RELRO region provided by the
+ // dynamic linker. To avoid memory corruption it is important that the
+ // contents of both memory regions is identical.
+ void* new_addr = mmap(reinterpret_cast<void*>(relro_start_), relro_size_,
+ PROT_READ, MAP_FIXED | MAP_SHARED, relro_fd_, 0);
+ if (new_addr == MAP_FAILED) {
+ PLOG_ERROR("mmap: replace RELRO");
+ return false;
+ }
+
+ LOG_INFO("Replaced RELRO at 0x%" PRIxPTR, relro_start_);
+ return true;
+}
+
+NativeLibInfo::NativeLibInfo(JNIEnv* env, jobject java_object)
+ : env_(env), java_object_(java_object) {}
+
+bool NativeLibInfo::CopyFromJavaObject() {
+ if (!env_)
+ return false;
+
+ if (!s_lib_info_fields.GetLoadInfo(env_, java_object_, &load_address_,
+ &load_size_)) {
+ return false;
+ }
+ s_lib_info_fields.GetRelroInfo(env_, java_object_, &relro_start_,
+ &relro_size_, &relro_fd_);
+ return true;
+}
+
+bool NativeLibInfo::LoadLibrary(const String& library_path,
+ bool spawn_relro_region,
+ const LoadTimeReporter& reporter) {
+ // Load the library.
+ void* handle = nullptr;
+ if (!LoadWithDlopenExt(library_path, reporter, &handle)) {
+ LOG_ERROR("Failed to load native library: %s", library_path.c_str());
+ return false;
+ }
+ if (!CallJniOnLoad(handle))
+ return false;
+
+ // Publish the library size and load address back to LibInfo in Java.
+ ExportLoadInfoToJava();
+
+ if (!spawn_relro_region)
+ return true;
+
+ // Spawn RELRO to a shared memory region by copying and remapping on top of
+ // itself.
+ SharedMemoryFunctions functions;
+ if (!functions.IsWorking())
+ return false;
+ if (!CreateSharedRelroFd(functions)) {
+ LOG_ERROR("Failed to create shared RELRO");
+ return false;
+ }
+ if (!ReplaceRelroWithSharedOne(functions)) {
+ LOG_ERROR("Failed to convert RELRO to shared memory");
+ CloseRelroFd();
+ return false;
+ }
+
+ LOG_INFO(
+ "Created and converted RELRO to shared memory: relro_fd=%d, "
+ "relro_start=0x%" PRIxPTR,
+ relro_fd_, relro_start_);
+ ExportRelroInfoToJava();
+ return true;
+}
+
+bool NativeLibInfo::RelroIsIdentical(
+ const NativeLibInfo& other_lib_info,
+ const SharedMemoryFunctions& functions) const {
+ // Abandon sharing if contents of the incoming RELRO region does not match the
+ // current one. This can be useful for debugging, but should never happen in
+ // the field.
+ if (other_lib_info.relro_start_ != relro_start_ ||
+ other_lib_info.relro_size_ != relro_size_ ||
+ other_lib_info.load_size_ != load_size_) {
+ LOG_ERROR("Incoming RELRO size does not match RELRO of the loaded library");
+ return false;
+ }
+ void* shared_relro_address =
+ mmap(nullptr, other_lib_info.relro_size_, PROT_READ, MAP_SHARED,
+ other_lib_info.relro_fd_, 0);
+ if (shared_relro_address == MAP_FAILED) {
+ PLOG_ERROR("mmap: check RELRO is identical");
+ return false;
+ }
+ void* current_relro_address = reinterpret_cast<void*>(relro_start_);
+ int not_equal =
+ memcmp(shared_relro_address, current_relro_address, relro_size_);
+ munmap(shared_relro_address, relro_size_);
+ if (not_equal) {
+ LOG_ERROR("Relocations are not identical, giving up.");
+ return false;
+ }
+ return true;
+}
+
+bool NativeLibInfo::CompareRelroAndReplaceItBy(
+ const NativeLibInfo& other_lib_info) {
+ if (other_lib_info.relro_fd_ == -1) {
+ LOG_ERROR("No shared region to use");
+ s_relro_sharing_status = RelroSharingStatus::EXTERNAL_RELRO_FD_NOT_PROVIDED;
+ return false;
+ }
+
+ if (load_address_ == 0) {
+ LOG_ERROR("Load address reset. Second attempt to load the library?");
+ s_relro_sharing_status = RelroSharingStatus::EXTERNAL_LOAD_ADDRESS_RESET;
+ return false;
+ }
+
+ if (!FindRelroAndLibraryRangesInElf()) {
+ LOG_ERROR("Could not find RELRO from externally provided address: 0x%p",
+ reinterpret_cast<void*>(other_lib_info.load_address_));
+ s_relro_sharing_status = RelroSharingStatus::EXTERNAL_RELRO_NOT_FOUND;
+ return false;
+ }
+
+ SharedMemoryFunctions functions;
+ if (!functions.IsWorking()) {
+ s_relro_sharing_status = RelroSharingStatus::NO_SHMEM_FUNCTIONS;
+ return false;
+ }
+ if (!RelroIsIdentical(other_lib_info, functions)) {
+ LOG_ERROR("RELRO is not identical");
+ s_relro_sharing_status = RelroSharingStatus::NOT_IDENTICAL;
+ return false;
+ }
+
+ // Make it shared.
+ //
+ // The alternative approach to invoke mprotect+mremap is probably faster than
+ // munmap+mmap here. The advantage of the latter is that it removes all
+ // formerly writable mappings, so:
+ // * It does not rely on disallowing mprotect(PROT_WRITE)
+ // * This way |ReplaceRelroWithSharedOne()| is reused across spawning RELRO
+ // and receiving it
+ if (!other_lib_info.ReplaceRelroWithSharedOne(functions)) {
+ LOG_ERROR("Failed to use relro_fd");
+ s_relro_sharing_status = RelroSharingStatus::REMAP_FAILED;
+ return false;
+ }
+
+ s_relro_sharing_status = RelroSharingStatus::SHARED;
+ return true;
+}
+
+bool NativeLibInfo::CreateSharedRelroFdForTesting() {
+ // The library providing these functions will be dlclose()-ed after returning
+ // from this context. The extra overhead of dlopen() is OK for testing.
+ SharedMemoryFunctions functions;
+ if (!functions.IsWorking())
+ abort();
+ return CreateSharedRelroFd(functions);
+}
+
+// static
+bool NativeLibInfo::SharedMemoryFunctionsSupportedForTesting() {
+ SharedMemoryFunctions functions;
+ return functions.IsWorking();
+}
+
+JNI_GENERATOR_EXPORT void
+Java_org_chromium_base_library_1loader_LinkerJni_nativeFindMemoryRegionAtRandomAddress(
+ JNIEnv* env,
+ jclass clazz,
+ jobject lib_info_obj) {
+ LOG_INFO("Entering");
+ uintptr_t address;
+ size_t size;
+ ReserveAddressWithHint(0, &address, &size);
+ s_lib_info_fields.SetLoadInfo(env, lib_info_obj, address, size);
+}
+
+JNI_GENERATOR_EXPORT void
+Java_org_chromium_base_library_1loader_LinkerJni_nativeReserveMemoryForLibrary(
+ JNIEnv* env,
+ jclass clazz,
+ jobject lib_info_obj) {
+ LOG_INFO("Entering");
+ uintptr_t address;
+ size_t size;
+ s_lib_info_fields.GetLoadInfo(env, lib_info_obj, &address, &size);
+ ReserveAddressWithHint(address, &address, &size);
+ s_lib_info_fields.SetLoadInfo(env, lib_info_obj, address, size);
+}
+
+JNI_GENERATOR_EXPORT jboolean
+Java_org_chromium_base_library_1loader_LinkerJni_nativeFindRegionReservedByWebViewZygote(
+ JNIEnv* env,
+ jclass clazz,
+ jobject lib_info_obj) {
+ LOG_INFO("Entering");
+ uintptr_t address;
+ size_t size;
+ if (!FindWebViewReservation(&address, &size))
+ return false;
+ s_lib_info_fields.SetLoadInfo(env, lib_info_obj, address, size);
+ return true;
+}
+
+JNI_GENERATOR_EXPORT jboolean
+Java_org_chromium_base_library_1loader_LinkerJni_nativeLoadLibrary(
+ JNIEnv* env,
+ jclass clazz,
+ jstring jdlopen_ext_path,
+ jobject lib_info_obj,
+ jboolean spawn_relro_region) {
+ LOG_INFO("Entering");
+
+ // Copy the contents from the Java-side LibInfo object.
+ NativeLibInfo lib_info = {env, lib_info_obj};
+ if (!lib_info.CopyFromJavaObject())
+ return false;
+
+ String library_path(env, jdlopen_ext_path);
+ LoadTimeReporterJni reporter = {env, clazz};
+ if (!lib_info.LoadLibrary(library_path, spawn_relro_region, reporter)) {
+ return false;
+ }
+ return true;
+}
+
+JNI_GENERATOR_EXPORT jboolean
+Java_org_chromium_base_library_1loader_LinkerJni_nativeUseRelros(
+ JNIEnv* env,
+ jclass clazz,
+ jlong local_load_address,
+ jobject remote_lib_info_obj) {
+ LOG_INFO("Entering");
+ // Copy the contents from the Java-side LibInfo object.
+ NativeLibInfo incoming_lib_info = {env, remote_lib_info_obj};
+ if (!incoming_lib_info.CopyFromJavaObject()) {
+ s_relro_sharing_status = RelroSharingStatus::CORRUPTED_IN_JAVA;
+ return false;
+ }
+
+ // Create an empty NativeLibInfo to extract the current information about the
+ // loaded library and later compare with the contents of the
+ // |incoming_lib_info|.
+ NativeLibInfo lib_info = {nullptr, nullptr};
+ lib_info.set_load_address(static_cast<uintptr_t>(local_load_address));
+
+ if (!lib_info.CompareRelroAndReplaceItBy(incoming_lib_info)) {
+ return false;
+ }
+ return true;
+}
+
+JNI_GENERATOR_EXPORT jint
+Java_org_chromium_base_library_1loader_LinkerJni_nativeGetRelroSharingResult(
+ JNIEnv* env,
+ jclass clazz) {
+ return static_cast<jint>(s_relro_sharing_status);
+}
+
+bool LinkerJNIInit(JavaVM* vm, JNIEnv* env) {
+ // Find LibInfo field ids.
+ if (!s_lib_info_fields.Init(env)) {
+ return false;
+ }
+
+ s_java_vm = vm;
+ return true;
+}
+
+} // namespace chromium_android_linker
diff --git a/chromium/base/android/linker/linker_jni.h b/chromium/base/android/linker/linker_jni.h
new file mode 100644
index 00000000000..c324883ddb0
--- /dev/null
+++ b/chromium/base/android/linker/linker_jni.h
@@ -0,0 +1,405 @@
+// Copyright 2015 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This is the Android-specific Chromium dynamic linker (loader of dynamic
+// libraries), a tiny shared library implementing a custom dynamic linker that
+// can be used to load the real Chromium libraries.
+//
+// The purpose of this custom linker is to be able to share the RELRO section of
+// libcontentshell.so (or equivalent) between the browser process and all other
+// processes it asks to create.
+//
+// This source code *cannot* depend on anything from //base or the C++ standard
+// library to keep this DSO small and avoid dependency issues. An exception is
+// made for std::unique_ptr as a risky header-only definition.
+
+#ifndef BASE_ANDROID_LINKER_LINKER_JNI_H_
+#define BASE_ANDROID_LINKER_LINKER_JNI_H_
+
+#include <android/log.h>
+#include <jni.h>
+#include <stdlib.h>
+
+#include "build/build_config.h"
+
+// Set this to 1 to enable debug traces to the Android log.
+// Note that LOG() from "base/logging.h" cannot be used, since it is
+// in base/ which hasn't been loaded yet.
+#define DEBUG 0
+
+#define TAG "cr_ChromiumAndroidLinker"
+
+#if DEBUG
+#define LOG_INFO(FORMAT, ...) \
+ __android_log_print(ANDROID_LOG_INFO, TAG, "%s: " FORMAT, __FUNCTION__, \
+ ##__VA_ARGS__)
+#else
+#define LOG_INFO(FORMAT, ...) ((void)0)
+#endif
+#define LOG_ERROR(FORMAT, ...) \
+ __android_log_print(ANDROID_LOG_ERROR, TAG, "%s: " FORMAT, __FUNCTION__, \
+ ##__VA_ARGS__)
+#define PLOG_ERROR(FORMAT, ...) \
+ LOG_ERROR(FORMAT ": %s", ##__VA_ARGS__, strerror(errno))
+
+#if defined(ARCH_CPU_X86)
+// Dalvik JIT generated code doesn't guarantee 16-byte stack alignment on
+// x86 - use force_align_arg_pointer to realign the stack at the JNI
+// boundary. https://crbug.com/655248
+#define JNI_GENERATOR_EXPORT \
+ extern "C" __attribute__((visibility("default"), force_align_arg_pointer))
+#else
+#define JNI_GENERATOR_EXPORT extern "C" __attribute__((visibility("default")))
+#endif
+
+#if defined(__arm__) && defined(__ARM_ARCH_7A__)
+#define CURRENT_ABI "armeabi-v7a"
+#elif defined(__arm__)
+#define CURRENT_ABI "armeabi"
+#elif defined(__i386__)
+#define CURRENT_ABI "x86"
+#elif defined(__mips__)
+#define CURRENT_ABI "mips"
+#elif defined(__x86_64__)
+#define CURRENT_ABI "x86_64"
+#elif defined(__aarch64__)
+#define CURRENT_ABI "arm64-v8a"
+#else
+#error "Unsupported target abi"
+#endif
+
+#if !defined(PAGE_SIZE)
+#define PAGE_SIZE (1 << 12)
+#define PAGE_MASK (~(PAGE_SIZE - 1))
+#endif
+
+#define PAGE_START(x) ((x)&PAGE_MASK)
+#define PAGE_END(x) PAGE_START((x) + (PAGE_SIZE - 1))
+
+// Copied from //base/posix/eintr_wrapper.h to avoid depending on //base.
+#define HANDLE_EINTR(x) \
+ ({ \
+ decltype(x) eintr_wrapper_result; \
+ do { \
+ eintr_wrapper_result = (x); \
+ } while (eintr_wrapper_result == -1 && errno == EINTR); \
+ eintr_wrapper_result; \
+ })
+
+namespace chromium_android_linker {
+
+// Larger than the largest library we might attempt to load.
+static const size_t kAddressSpaceReservationSize = 192 * 1024 * 1024;
+
+// A simple scoped UTF String class that can be initialized from
+// a Java jstring handle. Modeled like std::string, which cannot
+// be used here.
+class String {
+ public:
+ String(JNIEnv* env, jstring str);
+
+ inline ~String() { ::free(ptr_); }
+
+ inline const char* c_str() const { return ptr_ ? ptr_ : ""; }
+ inline size_t size() const { return size_; }
+
+ private:
+ char* ptr_;
+ size_t size_;
+};
+
+// Returns true iff casting a java-side |address| to uintptr_t does not lose
+// bits.
+bool IsValidAddress(jlong address);
+
+// Find the jclass JNI reference corresponding to a given |class_name|.
+// |env| is the current JNI environment handle.
+// On success, return true and set |*clazz|.
+bool InitClassReference(JNIEnv* env, const char* class_name, jclass* clazz);
+
+// Finds the region reserved by the WebView zygote if the current process is
+// inherited from the modern enough zygote that has this reservation. If the
+// lookup is successful, returns true and sets |address| and |size|. Otherwise
+// returns false.
+bool FindWebViewReservation(uintptr_t* address, size_t* size);
+
+// Initialize a jfieldID corresponding to the field of a given |clazz|,
+// with name |field_name| and signature |field_sig|.
+// |env| is the current JNI environment handle.
+// On success, return true and set |*field_id|.
+bool InitFieldId(JNIEnv* env,
+ jclass clazz,
+ const char* field_name,
+ const char* field_sig,
+ jfieldID* field_id);
+
+// Initialize a jfieldID corresponding to the static field of a given |clazz|,
+// with name |field_name| and signature |field_sig|.
+// |env| is the current JNI environment handle.
+// On success, return true and set |*field_id|.
+bool InitStaticFieldId(JNIEnv* env,
+ jclass clazz,
+ const char* field_name,
+ const char* field_sig,
+ jfieldID* field_id);
+
+// A class used to model the field IDs of the org.chromium.base.Linker
+// LibInfo inner class, used to communicate data with the Java side
+// of the linker.
+struct LibInfo_class {
+ jfieldID load_address_id;
+ jfieldID load_size_id;
+ jfieldID relro_start_id;
+ jfieldID relro_size_id;
+ jfieldID relro_fd_id;
+
+ // Initialize an instance.
+ bool Init(JNIEnv* env) {
+ jclass clazz;
+ if (!InitClassReference(
+ env, "org/chromium/base/library_loader/Linker$LibInfo", &clazz)) {
+ return false;
+ }
+
+ return InitFieldId(env, clazz, "mLoadAddress", "J", &load_address_id) &&
+ InitFieldId(env, clazz, "mLoadSize", "J", &load_size_id) &&
+ InitFieldId(env, clazz, "mRelroStart", "J", &relro_start_id) &&
+ InitFieldId(env, clazz, "mRelroSize", "J", &relro_size_id) &&
+ InitFieldId(env, clazz, "mRelroFd", "I", &relro_fd_id);
+ }
+
+ void SetLoadInfo(JNIEnv* env,
+ jobject library_info_obj,
+ uintptr_t load_address,
+ size_t load_size) {
+ env->SetLongField(library_info_obj, load_address_id, load_address);
+ env->SetLongField(library_info_obj, load_size_id, load_size);
+ }
+
+ void SetRelroInfo(JNIEnv* env,
+ jobject library_info_obj,
+ uintptr_t relro_start,
+ size_t relro_size,
+ int relro_fd) {
+ env->SetLongField(library_info_obj, relro_start_id, relro_start);
+ env->SetLongField(library_info_obj, relro_size_id, relro_size);
+ env->SetIntField(library_info_obj, relro_fd_id, relro_fd);
+ }
+
+ bool GetLoadInfo(JNIEnv* env,
+ jobject library_info_obj,
+ uintptr_t* load_address,
+ size_t* load_size) {
+ if (load_address) {
+ jlong java_address = env->GetLongField(library_info_obj, load_address_id);
+ if (!IsValidAddress(java_address))
+ return false;
+ *load_address = static_cast<uintptr_t>(java_address);
+ }
+ if (load_size) {
+ *load_size = static_cast<uintptr_t>(
+ env->GetLongField(library_info_obj, load_size_id));
+ }
+ return true;
+ }
+
+ void GetRelroInfo(JNIEnv* env,
+ jobject library_info_obj,
+ uintptr_t* relro_start,
+ size_t* relro_size,
+ int* relro_fd) {
+ if (relro_start) {
+ *relro_start = static_cast<uintptr_t>(
+ env->GetLongField(library_info_obj, relro_start_id));
+ }
+
+ if (relro_size) {
+ *relro_size = static_cast<size_t>(
+ env->GetLongField(library_info_obj, relro_size_id));
+ }
+
+ if (relro_fd) {
+ *relro_fd = env->GetIntField(library_info_obj, relro_fd_id);
+ }
+ }
+};
+
+// Used to find out whether RELRO sharing is often rejected due to mismatch of
+// the contents.
+//
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused. Must be kept in sync with the enum
+// in enums.xml. A java @IntDef is generated from this.
+// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.base.library_loader
+enum class RelroSharingStatus {
+ NOT_ATTEMPTED = 0,
+ SHARED = 1,
+ NOT_IDENTICAL = 2,
+ EXTERNAL_RELRO_FD_NOT_PROVIDED = 3,
+ EXTERNAL_RELRO_NOT_FOUND = 4,
+ NO_SHMEM_FUNCTIONS = 5,
+ REMAP_FAILED = 6,
+ CORRUPTED_IN_JAVA = 7,
+ EXTERNAL_LOAD_ADDRESS_RESET = 8,
+ COUNT = 9,
+};
+
+struct SharedMemoryFunctions;
+
+// Abstract class for NativeLibInfo to use for miscellaneous time measurements.
+// Best to be provided with values from the same clock as
+// SystemClock.uptimeMillis().
+//
+// *Not* threadsafe.
+class LoadTimeReporter {
+ public:
+ virtual ~LoadTimeReporter() = default;
+
+ // Report the time it took to run android_dlopen_ext().
+ virtual void reportDlopenExtTime(int64_t milliseconds_since_boot) const = 0;
+
+ // Report the time it took to find the RELRO region using dl_iterate_phdr().
+ virtual void reportIteratePhdrTime(int64_t milliseconds_since_boot) const = 0;
+};
+
+// Holds address ranges of the loaded native library, its RELRO region, along
+// with the RELRO FD identifying the shared memory region. Carries the same
+// members as the Java-side LibInfo (without mLibFilePath), allowing to
+// internally import/export the member values from/to the Java-side counterpart.
+//
+// Does *not* own the RELRO FD as soon as the latter gets exported to Java
+// (as a result of 'spawning' the RELRO region as shared memory.
+//
+// *Not* threadsafe.
+class NativeLibInfo {
+ public:
+ // Constructs an empty instance. The |java_object| indicates the handle to
+ // import and export member fields.
+ //
+ // Having |env| as |nullptr| disables export to java for the lifetime of the
+ // instance. This is useful as a scratch info that is gradually populated for
+ // comparison with another NativeLibInfo, and then discarded.
+ NativeLibInfo(JNIEnv* env, jobject java_object);
+
+ // Copies the java-side object state to this native instance. Returns false
+ // iff an imported value is invalid.
+ bool CopyFromJavaObject();
+
+ void set_load_address(uintptr_t a) { load_address_ = a; }
+
+ uintptr_t load_address() const { return load_address_; }
+
+ // Loads the native library using android_dlopen_ext and invokes JNI_OnLoad().
+ //
+ // On a successful load exports the address range of the library to the
+ // Java-side LibInfo.
+ //
+ // Iff |spawn_relro_region| is true, also finds the RELRO region in the
+ // library (PT_GNU_RELRO), converts it to be backed by a shared memory region
+ // (here referred as "RELRO FD") and exports the RELRO information to Java
+ // (the address range and the RELRO FD).
+ //
+ // When spawned, the shared memory region is exported only after sealing as
+ // read-only and without writable memory mappings. This allows any process to
+ // provide RELRO FD before it starts processing arbitrary input. For example,
+ // an App Zygote can create a RELRO FD in a sufficiently trustworthy way to
+ // make the Browser/Privileged processes share the region with it.
+ bool LoadLibrary(const String& library_path,
+ bool spawn_relro_region,
+ const LoadTimeReporter& reporter);
+
+ // Finds the RELRO region in the native library identified by
+ // |this->load_address()| and replaces it with the shared memory region
+ // identified by |other_lib_info|.
+ //
+ // The external NativeLibInfo can arrive from a different process.
+ //
+ // Note on security: The RELRO region is treated as *trusted*, no untrusted
+ // user/website/network input can be processed in an isolated process before
+ // it sends the RELRO FD. This is because there is no way to check whether the
+ // process has a writable mapping of the region remaining.
+ bool CompareRelroAndReplaceItBy(const NativeLibInfo& other_lib_info);
+
+ void set_relro_info_for_testing(uintptr_t start, size_t size) {
+ relro_start_ = start;
+ relro_size_ = size;
+ }
+
+ // Creates a shared RELRO region as it normally would during LoadLibrary()
+ // with |spawn_relro_region=true|. Exposed here because it is difficult to
+ // unittest LoadLibrary() directly.
+ bool CreateSharedRelroFdForTesting();
+
+ void set_relro_fd_for_testing(int fd) { relro_fd_ = fd; }
+ int get_relro_fd_for_testing() const { return relro_fd_; }
+ size_t get_relro_start_for_testing() const { return relro_start_; }
+ size_t get_load_size_for_testing() const { return load_size_; }
+
+ static bool SharedMemoryFunctionsSupportedForTesting();
+
+ bool FindRelroAndLibraryRangesInElfForTesting() {
+ return FindRelroAndLibraryRangesInElf();
+ }
+
+ private:
+ NativeLibInfo() = delete;
+
+ // Not copyable or movable.
+ NativeLibInfo(const NativeLibInfo&) = delete;
+ NativeLibInfo& operator=(const NativeLibInfo&) = delete;
+
+ // Exports the address range of the library described by |this| to the
+ // Java-side LibInfo.
+ void ExportLoadInfoToJava() const;
+
+ // Exports the address range of the RELRO region and RELRO FD described by
+ // |this| to the Java-side LibInfo.
+ void ExportRelroInfoToJava() const;
+
+ void CloseRelroFd();
+
+ // Determines the minimal address ranges for the union of all the loadable
+ // (and RELRO) segments by parsing ELF starting at |load_address()|. May fail
+ // or return incorrect results for some creative ELF libraries.
+ bool FindRelroAndLibraryRangesInElf();
+
+ // Loads and initializes the load address ranges: |load_address_|,
+ // |load_size_|. Assumes that the memory range is reserved (in Linker.java).
+ bool LoadWithDlopenExt(const String& path,
+ const LoadTimeReporter& reporter,
+ void** handle);
+
+ // Initializes |relro_fd_| with a newly created read-only shared memory region
+ // sized as the library's RELRO and with identical data.
+ bool CreateSharedRelroFd(const SharedMemoryFunctions& functions);
+
+ // Assuming that RELRO-related information is populated, memory-maps the RELRO
+ // FD on top of the library's RELRO.
+ bool ReplaceRelroWithSharedOne(const SharedMemoryFunctions& functions) const;
+
+ // Returns true iff the RELRO address and size, along with the contents are
+ // equal among the two.
+ bool RelroIsIdentical(const NativeLibInfo& external_lib_info,
+ const SharedMemoryFunctions& functions) const;
+
+ static constexpr int kInvalidFd = -1;
+ uintptr_t load_address_ = 0;
+ size_t load_size_ = 0;
+ uintptr_t relro_start_ = 0;
+ size_t relro_size_ = 0;
+ int relro_fd_ = kInvalidFd;
+ JNIEnv* const env_;
+ const jobject java_object_;
+};
+
+// JNI_OnLoad() initialization hook for the linker.
+// Sets up JNI and other initializations for native linker code.
+// |vm| is the Java VM handle passed to JNI_OnLoad().
+// |env| is the current JNI environment handle.
+// On success, returns true.
+bool LinkerJNIInit(JavaVM* vm, JNIEnv* env);
+
+} // namespace chromium_android_linker
+
+#endif // BASE_ANDROID_LINKER_LINKER_JNI_H_
diff --git a/chromium/base/android/linker/linker_jni_onload.cc b/chromium/base/android/linker/linker_jni_onload.cc
new file mode 100644
index 00000000000..c4eecbb9776
--- /dev/null
+++ b/chromium/base/android/linker/linker_jni_onload.cc
@@ -0,0 +1,36 @@
+// Copyright 2020 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// The JNI_OnLoad() definition for the linker library is moved here to avoid a
+// conflict with JNI_Onload() defined by the test library. The linker tests
+// together with the linker internals are smashed into (=linked with) the test
+// library.
+
+#include <jni.h>
+
+#include "base/android/linker/linker_jni.h"
+
+namespace chromium_android_linker {
+
+// JNI_OnLoad() is called when the linker library is loaded through the regular
+// System.LoadLibrary) API. This shall save the Java VM handle and initialize
+// LibInfo field accessors.
+jint JNI_OnLoad(JavaVM* vm, void* reserved) {
+ LOG_INFO("Entering");
+ JNIEnv* env;
+ if (JNI_OK != vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_4)) {
+ LOG_ERROR("Could not create JNIEnv");
+ return -1;
+ }
+ if (!LinkerJNIInit(vm, env))
+ return -1;
+ LOG_INFO("Done");
+ return JNI_VERSION_1_4;
+}
+
+} // namespace chromium_android_linker
+
+jint JNI_OnLoad(JavaVM* vm, void* reserved) {
+ return chromium_android_linker::JNI_OnLoad(vm, reserved);
+}
diff --git a/chromium/base/android/linker/linker_minimal_libcxx.cc b/chromium/base/android/linker/linker_minimal_libcxx.cc
new file mode 100644
index 00000000000..69690055581
--- /dev/null
+++ b/chromium/base/android/linker/linker_minimal_libcxx.cc
@@ -0,0 +1,79 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <android/log.h>
+#include <unistd.h>
+#include <cstddef>
+#include <cstdlib>
+
+// Custom implementation of new and delete, this prevents dragging
+// the libc++ implementation, which drags exception-related machine
+// code that is not needed here. This helps reduce the size of the
+// final binary considerably.
+
+// These symbols are not exported, thus this does not affect the libraries that
+// it will load, only the linker binary itself.
+void* operator new(size_t size) {
+ void* ptr = ::malloc(size);
+ if (ptr != nullptr)
+ return ptr;
+
+ // Don't assume it is possible to call any C library function like
+ // snprintf() here, since it might allocate heap memory and crash at
+ // runtime. Hence our fatal message does not contain the number of
+ // bytes requested by the allocation.
+ static const char kFatalMessage[] = "Out of memory!";
+#ifdef __ANDROID__
+ __android_log_write(ANDROID_LOG_FATAL, "linker", kFatalMessage);
+#else
+ ::write(STDERR_FILENO, kFatalMessage, sizeof(kFatalMessage) - 1);
+#endif
+ _exit(1);
+#if defined(__GNUC__)
+ __builtin_unreachable();
+#endif
+
+ // Adding a 'return nullptr' here will make the compiler error with a message
+ // stating that 'operator new(size_t)' is not allowed to return nullptr.
+ //
+ // Indeed, an new expression like 'new T' shall never return nullptr,
+ // according to the C++ specification, and an optimizing compiler will gladly
+ // remove any null-checks after them (something the Fuschsia team had to
+ // learn the hard way when writing their kernel in C++). What is meant here
+ // is something like:
+ //
+ // Foo* foo = new Foo(10);
+ // if (!foo) { <-- entire check and branch
+ // ... Handle out-of-memory condition. <-- removed by an optimizing
+ // } <-- compiler.
+ //
+ // Note that some C++ library implementations (e.g. recent libc++) recognize
+ // when they are compiled with -fno-exceptions and provide a simpler version
+ // of operator new that can return nullptr. However, it is very hard to
+ // guarantee at build time that this code is linked against such a version
+ // of the runtime. Moreoever, technically disabling exceptions is completely
+ // out-of-spec regarding the C++ language, and what the compiler is allowed
+ // to do in this case is mostly implementation-defined, so better be safe
+ // than sorry here.
+ //
+ // C++ provides a non-throwing new expression that can return a nullptr
+ // value, but it must be written as 'new (std::nothrow) T' instead of
+ // 'new T', and thus nobody uses this. This ends up calling
+ // 'operator new(size_t, const std::nothrow_t&)' which is not implemented
+ // here.
+}
+
+void* operator new[](size_t size) {
+ return operator new(size);
+}
+
+void operator delete(void* ptr) {
+ // The compiler-generated code already checked that |ptr != nullptr|
+ // so don't to it a second time.
+ ::free(ptr);
+}
+
+void operator delete[](void* ptr) {
+ ::free(ptr);
+}
diff --git a/chromium/base/android/linker/linker_unittest.cc b/chromium/base/android/linker/linker_unittest.cc
new file mode 100644
index 00000000000..f6b1abea658
--- /dev/null
+++ b/chromium/base/android/linker/linker_unittest.cc
@@ -0,0 +1,275 @@
+// Copyright 2020 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <link.h>
+#include <sys/mman.h>
+#include <sys/prctl.h>
+#include <sys/utsname.h>
+
+#include "base/android/linker/linker_jni.h"
+#include "base/files/scoped_file.h"
+#include "base/logging.h"
+#include "base/system/sys_info.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+extern char __executable_start;
+
+extern "C" {
+
+// This function is exported by the dynamic linker but never declared in any
+// official header for some architecture/version combinations.
+int dl_iterate_phdr(int (*cb)(dl_phdr_info* info, size_t size, void* data),
+ void* data) __attribute__((weak_import));
+
+} // extern "C"
+
+namespace chromium_android_linker {
+
+namespace {
+
+// Implements the old method of finding library and RELRO ranges by providing a
+// callback for use with dl_iterate_phdr(3). Data from the field has shown that
+// this method makes library loading significantly slower than
+// android_dlopen_ext(), it was replaced by the exuivalent one:
+// NativeLibInfo::FindRelroAndLibraryRangesInElf().
+class LibraryRangeFinder {
+ public:
+ explicit LibraryRangeFinder(uintptr_t address) : load_address_(address) {}
+
+ uintptr_t load_address() const { return load_address_; }
+ size_t load_size() const { return load_size_; }
+ uintptr_t relro_start() const { return relro_start_; }
+ size_t relro_size() const { return relro_size_; }
+
+ static int VisitLibraryPhdrs(dl_phdr_info* info,
+ [[maybe_unused]] size_t size,
+ void* data);
+
+ private:
+ uintptr_t load_address_;
+ size_t load_size_ = 0;
+ uintptr_t relro_start_ = 0;
+ size_t relro_size_ = 0;
+};
+
+// Callback for dl_iterate_phdr(). From program headers (phdr(s)) of a loaded
+// library determines its load address, and in case it is equal to
+// |load_address()|, extracts the RELRO and size information from
+// corresponding phdr(s).
+// static
+int LibraryRangeFinder::VisitLibraryPhdrs(dl_phdr_info* info,
+ [[maybe_unused]] size_t size,
+ void* data) {
+ auto* finder = reinterpret_cast<LibraryRangeFinder*>(data);
+ ElfW(Addr) lookup_address = static_cast<ElfW(Addr)>(finder->load_address());
+
+ // Use max and min vaddr to compute the library's load size.
+ auto min_vaddr = std::numeric_limits<ElfW(Addr)>::max();
+ ElfW(Addr) max_vaddr = 0;
+ ElfW(Addr) min_relro_vaddr = ~0;
+ ElfW(Addr) max_relro_vaddr = 0;
+
+ bool is_matching = false;
+ for (int i = 0; i < info->dlpi_phnum; ++i) {
+ const ElfW(Phdr)* phdr = &info->dlpi_phdr[i];
+ switch (phdr->p_type) {
+ case PT_LOAD:
+ // See if this segment's load address matches the value passed to
+ // android_dlopen_ext as |extinfo.reserved_addr|.
+ //
+ // Here and below, the virtual address in memory is computed by
+ // address == info->dlpi_addr + program_header->p_vaddr
+ // that is, the p_vaddr fields is relative to the object base address.
+ // See dl_iterate_phdr(3) for details.
+ if (lookup_address == info->dlpi_addr + phdr->p_vaddr)
+ is_matching = true;
+
+ if (phdr->p_vaddr < min_vaddr)
+ min_vaddr = phdr->p_vaddr;
+ if (phdr->p_vaddr + phdr->p_memsz > max_vaddr)
+ max_vaddr = phdr->p_vaddr + phdr->p_memsz;
+ break;
+ case PT_GNU_RELRO:
+ min_relro_vaddr = PAGE_START(phdr->p_vaddr);
+ max_relro_vaddr = phdr->p_vaddr + phdr->p_memsz;
+
+ // As of 2020-11 in libmonochrome.so RELRO is covered by a LOAD segment.
+ // It is not clear whether this property is going to be guaranteed in
+ // the future. Include the RELRO segment as part of the 'load size'.
+ // This way a potential future change in layout of LOAD segments would
+ // not open address space for racy mmap(MAP_FIXED).
+ if (min_relro_vaddr < min_vaddr)
+ min_vaddr = min_relro_vaddr;
+ if (max_vaddr < max_relro_vaddr)
+ max_vaddr = max_relro_vaddr;
+ break;
+ default:
+ break;
+ }
+ }
+
+ // Fill out size and relro information if there was a match.
+ if (is_matching) {
+ int page_size = sysconf(_SC_PAGESIZE);
+ if (page_size != PAGE_SIZE)
+ abort();
+
+ finder->load_size_ = PAGE_END(max_vaddr) - PAGE_START(min_vaddr);
+ finder->relro_size_ =
+ PAGE_END(max_relro_vaddr) - PAGE_START(min_relro_vaddr);
+ finder->relro_start_ = info->dlpi_addr + PAGE_START(min_relro_vaddr);
+
+ return 1;
+ }
+
+ return 0;
+}
+
+} // namespace
+
+// These tests get linked with base_unittests and leave JNI uninitialized. The
+// tests must not execute any parts relying on initialization with JNI_Onload().
+
+class LinkerTest : public testing::Test {
+ public:
+ LinkerTest() = default;
+ ~LinkerTest() override = default;
+};
+
+// Checks that NativeLibInfo::CreateSharedRelroFd() creates a shared memory
+// region that is 'sealed' as read-only.
+TEST_F(LinkerTest, CreatedRegionIsSealed) {
+ if (!NativeLibInfo::SharedMemoryFunctionsSupportedForTesting()) {
+ // The Linker uses functions from libandroid.so that are not available
+ // on Android releases before O. Disable unittests for old releases.
+ return;
+ }
+
+ // Fill a synthetic RELRO region with 0xEE in private anonynous memory.
+ constexpr size_t kRelroSize = 1 << 21; // 2 MiB.
+ void* relro_address = mmap(nullptr, kRelroSize, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+ ASSERT_NE(MAP_FAILED, relro_address);
+ NativeLibInfo lib_info = {0, 0};
+ lib_info.set_relro_info_for_testing(
+ reinterpret_cast<uintptr_t>(relro_address), kRelroSize);
+ memset(relro_address, 0xEE, kRelroSize);
+
+ // Create shared RELRO.
+ ASSERT_EQ(true, lib_info.CreateSharedRelroFdForTesting());
+ int relro_fd = lib_info.get_relro_fd_for_testing();
+ ASSERT_NE(-1, relro_fd);
+ base::ScopedFD scoped_fd(relro_fd);
+
+ // Check that a read-only mapping contains the data originally filled in.
+ void* ro_address =
+ mmap(nullptr, kRelroSize, PROT_READ, MAP_SHARED, relro_fd, 0);
+ ASSERT_NE(MAP_FAILED, ro_address);
+ EXPECT_EQ(0xEEEEEEEEU, *reinterpret_cast<uint32_t*>(ro_address));
+ int not_equal = memcmp(relro_address, ro_address, kRelroSize);
+ EXPECT_EQ(0, not_equal);
+ munmap(ro_address, kRelroSize);
+
+ // Check that attempts to mmap with PROT_WRITE fail.
+ EXPECT_EQ(MAP_FAILED, mmap(nullptr, kRelroSize, PROT_READ | PROT_WRITE,
+ MAP_SHARED, relro_fd, 0));
+ EXPECT_EQ(MAP_FAILED, mmap(nullptr, kRelroSize, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE, relro_fd, 0));
+ EXPECT_EQ(MAP_FAILED,
+ mmap(nullptr, kRelroSize, PROT_WRITE, MAP_SHARED, relro_fd, 0));
+ EXPECT_EQ(MAP_FAILED,
+ mmap(nullptr, kRelroSize, PROT_WRITE, MAP_PRIVATE, relro_fd, 0));
+}
+
+TEST_F(LinkerTest, FindReservedMemoryRegion) {
+ size_t address, size;
+
+ // Find the existing reservation in the current process. The unittest runner
+ // is forked from the system zygote. The reservation should be found when
+ // running on recent Android releases, where it is made by the
+ // reserveAddressSpaceInZygote().
+ bool found_reservation = FindWebViewReservation(&address, &size);
+
+ if (found_reservation) {
+ // Check that the size is at least the minimum reserved by Android, as of
+ // 2021-04.
+ EXPECT_LE(130U * 1024 * 1024, size);
+ return;
+ }
+
+ // TODO(crbug.com/1223747): Check that only non-low-end Android Q+ devices
+ // reach this point.
+
+ // Create a properly named synthetic region with a size smaller than a real
+ // library would need, but still aligned well.
+ static const size_t kSize = 19U * 1024 * 1024;
+ void* synthetic_region_start =
+ mmap(nullptr, kSize, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+ ASSERT_NE(MAP_FAILED, synthetic_region_start);
+ prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, synthetic_region_start, kSize,
+ "[anon:libwebview reservation]");
+
+ // Now the region must be found.
+ EXPECT_TRUE(FindWebViewReservation(&address, &size));
+ EXPECT_EQ(kSize, size);
+ EXPECT_EQ(reinterpret_cast<void*>(address), synthetic_region_start);
+ munmap(synthetic_region_start, kSize);
+}
+
+TEST_F(LinkerTest, FindLibraryRanges) {
+ static int var_inside = 3;
+
+ NativeLibInfo lib_info = {0, 0};
+ uintptr_t executable_start = reinterpret_cast<uintptr_t>(&__executable_start);
+ lib_info.set_load_address(executable_start);
+
+ EXPECT_TRUE(lib_info.FindRelroAndLibraryRangesInElfForTesting());
+ EXPECT_EQ(executable_start, lib_info.load_address());
+
+ uintptr_t inside_library = reinterpret_cast<uintptr_t>(&var_inside);
+ EXPECT_LE(executable_start, inside_library);
+ EXPECT_LE(inside_library,
+ lib_info.load_address() + lib_info.get_load_size_for_testing());
+
+ EXPECT_LE(lib_info.load_address(), lib_info.get_relro_start_for_testing());
+ EXPECT_LE(lib_info.get_relro_start_for_testing(),
+ lib_info.load_address() + lib_info.get_load_size_for_testing());
+}
+
+TEST_F(LinkerTest, FindLibraryRangesWhenLoadAddressWasReset) {
+ NativeLibInfo other_lib_info = {0, 0};
+ uintptr_t executable_start = reinterpret_cast<uintptr_t>(&__executable_start);
+ other_lib_info.set_load_address(executable_start);
+ other_lib_info.set_relro_fd_for_testing(123);
+ NativeLibInfo lib_info = {0, 0};
+ EXPECT_FALSE(lib_info.CompareRelroAndReplaceItBy(other_lib_info));
+}
+
+// Check that discovering RELRO segment address ranges and the DSO ranges agrees
+// with the method based on dl_iterate_phdr(3). The check is performed on the
+// test library, not on libmonochrome.
+TEST_F(LinkerTest, LibraryRangesViaIteratePhdr) {
+ // Find the ranges using dl_iterate_phdr().
+ if (!dl_iterate_phdr) {
+ ASSERT_TRUE(false) << "dl_iterate_phdr() not found";
+ }
+ uintptr_t executable_start = reinterpret_cast<uintptr_t>(&__executable_start);
+ LibraryRangeFinder finder(executable_start);
+ ASSERT_EQ(1, dl_iterate_phdr(&LibraryRangeFinder::VisitLibraryPhdrs,
+ reinterpret_cast<void*>(&finder)));
+ ASSERT_LE(finder.relro_start() + finder.relro_size(),
+ finder.load_address() + finder.load_size());
+
+ // Find the ranges by parsing ELF.
+ NativeLibInfo lib_info2 = {0, 0};
+ lib_info2.set_load_address(executable_start);
+ EXPECT_TRUE(lib_info2.FindRelroAndLibraryRangesInElfForTesting());
+
+ // Compare results.
+ EXPECT_EQ(finder.load_address(), lib_info2.load_address());
+ EXPECT_EQ(finder.load_size(), lib_info2.get_load_size_for_testing());
+ EXPECT_EQ(finder.relro_start(), lib_info2.get_relro_start_for_testing());
+}
+
+} // namespace chromium_android_linker
diff --git a/chromium/base/android/locale_utils.cc b/chromium/base/android/locale_utils.cc
new file mode 100644
index 00000000000..9cc22bfe386
--- /dev/null
+++ b/chromium/base/android/locale_utils.cc
@@ -0,0 +1,34 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/locale_utils.h"
+
+#include "base/android/jni_android.h"
+#include "base/android/jni_string.h"
+#include "base/base_jni_headers/LocaleUtils_jni.h"
+
+namespace base {
+namespace android {
+
+std::string GetDefaultCountryCode() {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ return ConvertJavaStringToUTF8(Java_LocaleUtils_getDefaultCountryCode(env));
+}
+
+std::string GetDefaultLocaleString() {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ ScopedJavaLocalRef<jstring> locale =
+ Java_LocaleUtils_getDefaultLocaleString(env);
+ return ConvertJavaStringToUTF8(locale);
+}
+
+std::string GetDefaultLocaleListString() {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ ScopedJavaLocalRef<jstring> locales =
+ Java_LocaleUtils_getDefaultLocaleListString(env);
+ return ConvertJavaStringToUTF8(locales);
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/locale_utils.h b/chromium/base/android/locale_utils.h
new file mode 100644
index 00000000000..95fb32ab7cb
--- /dev/null
+++ b/chromium/base/android/locale_utils.h
@@ -0,0 +1,29 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_LOCALE_UTILS_H_
+#define BASE_ANDROID_LOCALE_UTILS_H_
+
+#include <jni.h>
+
+#include <string>
+
+#include "base/base_export.h"
+
+namespace base {
+namespace android {
+
+BASE_EXPORT std::string GetDefaultCountryCode();
+
+// Return the current default locale of the device as string.
+BASE_EXPORT std::string GetDefaultLocaleString();
+
+// Returns a list of user-selected locales as a comma separated string, ordered
+// by decreasing preference.
+BASE_EXPORT std::string GetDefaultLocaleListString();
+
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_LOCALE_UTILS_H_
diff --git a/chromium/base/android/meminfo_dump_provider.cc b/chromium/base/android/meminfo_dump_provider.cc
new file mode 100644
index 00000000000..387a4d72ebe
--- /dev/null
+++ b/chromium/base/android/meminfo_dump_provider.cc
@@ -0,0 +1,105 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/meminfo_dump_provider.h"
+#include <jni.h>
+#include "base/android/jni_android.h"
+#include "base/logging.h"
+#include "base/time/time.h"
+#include "base/trace_event/base_tracing.h"
+
+#if BUILDFLAG(ENABLE_BASE_TRACING)
+#include "base/base_jni_headers/MemoryInfoBridge_jni.h"
+#endif // BUILDFLAG(ENABLE_BASE_TRACING)
+
+namespace base::android {
+
+MeminfoDumpProvider::MeminfoDumpProvider() {
+#if BUILDFLAG(ENABLE_BASE_TRACING)
+ base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider(
+ this, kDumpProviderName, nullptr);
+#endif // BUILDFLAG(ENABLE_BASE_TRACING)
+}
+
+// static
+MeminfoDumpProvider& MeminfoDumpProvider::Initialize() {
+ static base::NoDestructor<MeminfoDumpProvider> instance;
+ return *instance.get();
+}
+
+bool MeminfoDumpProvider::OnMemoryDump(
+ const base::trace_event::MemoryDumpArgs& args,
+ base::trace_event::ProcessMemoryDump* pmd) {
+#if BUILDFLAG(ENABLE_BASE_TRACING)
+ // This is best-effort, and will be wrong if there are other callers of
+ // ActivityManager#getProcessMemoryInfo(), either in this process or from
+ // another process which is allowed to do so (typically, adb).
+ //
+ // However, since the framework doesn't document throttling in any non-vague
+ // terms and the results are not timestamped, this is the best we can do. The
+ // delay and the rest of the assumptions here come from
+ // https://android.googlesource.com/platform/frameworks/base/+/refs/heads/android13-dev/services/core/java/com/android/server/am/ActivityManagerService.java#4093.
+ //
+ // We could always report the value on pre-Q devices, but that would skew
+ // reported data. Also, some OEMs may have cherry-picked the Q change, meaning
+ // that it's safer and more accurate to not report likely-stale data on all
+ // Android releases.
+ base::TimeTicks now = base::TimeTicks::Now();
+ bool stale_data = (now - last_collection_time_) < base::Minutes(5);
+
+ // Background data dumps (as in the BACKGROUND level of detail, not the
+ // application being in background) should not include stale data, since it
+ // would confuse data in UMA. In particular, the background/foreground session
+ // filter would no longer be accurate.
+ if (stale_data && args.level_of_detail !=
+ base::trace_event::MemoryDumpLevelOfDetail::DETAILED) {
+ return true;
+ }
+
+ base::trace_event::MemoryAllocatorDump* dump =
+ pmd->CreateAllocatorDump(kDumpName);
+ // Data is either expected to be fresh, or this is a manually requested dump,
+ // and we should still report data, but note that it is stale.
+ dump->AddScalar(kIsStaleName, "bool", stale_data);
+
+ last_collection_time_ = now;
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jobject> memory_info =
+ Java_MemoryInfoBridge_getActivityManagerMemoryInfoForSelf(env);
+ // Tell the manager that collection failed. Since this is likely not a
+ // transient failure, don't return an empty dump, and let the manager exclude
+ // this provider from the next dump.
+ if (memory_info.is_null()) {
+ LOG(WARNING) << "Got a null value";
+ return false;
+ }
+
+ ScopedJavaLocalRef<jclass> clazz{env, env->GetObjectClass(memory_info.obj())};
+
+ jfieldID other_private_dirty_id =
+ env->GetFieldID(clazz.obj(), "otherPrivateDirty", "I");
+ jfieldID other_pss_id = env->GetFieldID(clazz.obj(), "otherPss", "I");
+
+ int other_private_dirty_kb =
+ env->GetIntField(memory_info.obj(), other_private_dirty_id);
+ int other_pss_kb = env->GetIntField(memory_info.obj(), other_pss_id);
+
+ // What "other" covers is not documented in Debug#MemoryInfo, nor in
+ // ActivityManager#getProcessMemoryInfo. However, it calls
+ // Debug#getMemoryInfo(), which ends up summing all the heaps in the range
+ // [HEAP_DALVIK_OTHER, HEAP_OTHER_MEMTRACK]. See the definitions in
+ // https://android.googlesource.com/platform/frameworks/base/+/0b7c1774ba42daef7c80bf2f00fe1c0327e756ae/core/jni/android_os_Debug.cpp#60,
+ // and the code in android_os_Debug_getDirtyPagesPid() in the same file.
+ dump->AddScalar(kPrivateDirtyMetricName, "bytes",
+ static_cast<uint64_t>(other_private_dirty_kb) * 1024);
+ dump->AddScalar(kPssMetricName, "bytes",
+ static_cast<uint64_t>(other_pss_kb) * 1024);
+
+ return true;
+#else // BUILDFLAG(ENABLE_BASE_TRACING)
+ return false;
+#endif // BUILDFLAG(ENABLE_BASE_TRACING)
+}
+
+} // namespace base::android
diff --git a/chromium/base/android/meminfo_dump_provider.h b/chromium/base/android/meminfo_dump_provider.h
new file mode 100644
index 00000000000..582ac376708
--- /dev/null
+++ b/chromium/base/android/meminfo_dump_provider.h
@@ -0,0 +1,38 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_MEMINFO_DUMP_PROVIDER_H_
+#define BASE_ANDROID_MEMINFO_DUMP_PROVIDER_H_
+
+#include "base/base_export.h"
+#include "base/no_destructor.h"
+#include "base/time/time.h"
+#include "base/trace_event/base_tracing.h"
+
+namespace base::android {
+
+class BASE_EXPORT MeminfoDumpProvider
+ : public base::trace_event::MemoryDumpProvider {
+ public:
+ // Returns the instance for testing.
+ static MeminfoDumpProvider& Initialize();
+ bool OnMemoryDump(const base::trace_event::MemoryDumpArgs& args,
+ base::trace_event::ProcessMemoryDump* pmd) override;
+
+ static constexpr char kDumpProviderName[] = "android_meminfo";
+ static constexpr char kDumpName[] = "meminfo";
+ static constexpr char kIsStaleName[] = "is_stale";
+ static constexpr char kPssMetricName[] = "other_pss";
+ static constexpr char kPrivateDirtyMetricName[] = "other_private_dirty";
+
+ private:
+ friend class base::NoDestructor<MeminfoDumpProvider>;
+ MeminfoDumpProvider();
+
+ base::TimeTicks last_collection_time_;
+};
+
+} // namespace base::android
+
+#endif // BASE_ANDROID_MEMINFO_DUMP_PROVIDER_H_
diff --git a/chromium/base/android/meminfo_dump_provider_unittest.cc b/chromium/base/android/meminfo_dump_provider_unittest.cc
new file mode 100644
index 00000000000..99b8266716b
--- /dev/null
+++ b/chromium/base/android/meminfo_dump_provider_unittest.cc
@@ -0,0 +1,101 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/meminfo_dump_provider.h"
+#include "base/android/build_info.h"
+#include "base/trace_event/base_tracing.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+#include <cstdint>
+#include <map>
+#include <string>
+
+namespace base::android {
+
+namespace {
+std::map<std::string, uint64_t> GetEntries(
+ base::trace_event::MemoryAllocatorDump* dump) {
+ std::map<std::string, uint64_t> entries;
+ for (const auto& entry : dump->entries()) {
+ EXPECT_EQ(entry.entry_type,
+ base::trace_event::MemoryAllocatorDump::Entry::kUint64);
+ entries.insert({entry.name, entry.value_uint64});
+ }
+ return entries;
+}
+} // namespace
+
+TEST(MeminfoDumpProviderTest, Simple) {
+ auto& instance = MeminfoDumpProvider::Initialize();
+
+ base::trace_event::MemoryDumpArgs args{};
+ args.level_of_detail = base::trace_event::MemoryDumpLevelOfDetail::DETAILED;
+ base::trace_event::ProcessMemoryDump first_pmd{args};
+
+ bool success = instance.OnMemoryDump(args, &first_pmd);
+ ASSERT_TRUE(success);
+ base::trace_event::MemoryAllocatorDump* first_dump =
+ first_pmd.GetAllocatorDump(MeminfoDumpProvider::kDumpName);
+ ASSERT_TRUE(first_dump);
+
+ std::map<std::string, uint64_t> first_entries = GetEntries(first_dump);
+
+ EXPECT_TRUE(first_entries.contains(
+ MeminfoDumpProvider::kIsStaleName)); // Cannot assert on the value.
+ // Expect the values to not be 0, that would indicate that the values are not
+ // reported.
+ ASSERT_TRUE(
+ first_entries.contains(MeminfoDumpProvider::kPrivateDirtyMetricName));
+ ASSERT_TRUE(first_entries.contains(MeminfoDumpProvider::kPssMetricName));
+ EXPECT_GT(first_entries[MeminfoDumpProvider::kPrivateDirtyMetricName], 0u);
+ EXPECT_GT(first_entries[MeminfoDumpProvider::kPssMetricName], 0u);
+
+ base::trace_event::ProcessMemoryDump second_pmd{args};
+ ASSERT_TRUE(instance.OnMemoryDump(args, &second_pmd));
+ base::trace_event::MemoryAllocatorDump* second_dump =
+ second_pmd.GetAllocatorDump(MeminfoDumpProvider::kDumpName);
+ ASSERT_TRUE(second_dump);
+ std::map<std::string, uint64_t> second_entries = GetEntries(second_dump);
+
+ EXPECT_TRUE(second_entries.contains(MeminfoDumpProvider::kIsStaleName));
+ EXPECT_TRUE(
+ second_entries[MeminfoDumpProvider::kIsStaleName]); // Entries are stale
+ // this time.
+ ASSERT_TRUE(
+ second_entries.contains(MeminfoDumpProvider::kPrivateDirtyMetricName));
+ ASSERT_TRUE(second_entries.contains(MeminfoDumpProvider::kPssMetricName));
+ if (BuildInfo::GetInstance()->sdk_int() >= SdkVersion::SDK_VERSION_Q) {
+ // Stale values are reported.
+ EXPECT_EQ(first_entries[MeminfoDumpProvider::kPrivateDirtyMetricName],
+ second_entries[MeminfoDumpProvider::kPrivateDirtyMetricName]);
+ EXPECT_EQ(first_entries[MeminfoDumpProvider::kPssMetricName],
+ second_entries[MeminfoDumpProvider::kPssMetricName]);
+ }
+}
+
+TEST(MeminfoDumpProviderTest, NoStaleReportsInBackgroundDumps) {
+ auto& instance = MeminfoDumpProvider::Initialize();
+
+ // First dump, data may or may not be stale.
+ {
+ base::trace_event::MemoryDumpArgs args{};
+ args.level_of_detail = base::trace_event::MemoryDumpLevelOfDetail::DETAILED;
+ base::trace_event::ProcessMemoryDump pmd{args};
+ ASSERT_TRUE(instance.OnMemoryDump(args, &pmd));
+ }
+
+ // Second one, stale data, should not report.
+ {
+ base::trace_event::MemoryDumpArgs args{};
+ args.level_of_detail =
+ base::trace_event::MemoryDumpLevelOfDetail::BACKGROUND;
+ base::trace_event::ProcessMemoryDump pmd{args};
+ ASSERT_TRUE(instance.OnMemoryDump(args, &pmd));
+ base::trace_event::MemoryAllocatorDump* dump =
+ pmd.GetAllocatorDump(MeminfoDumpProvider::kDumpName);
+ EXPECT_FALSE(dump);
+ }
+}
+
+} // namespace base::android
diff --git a/chromium/base/android/memory_pressure_listener_android.cc b/chromium/base/android/memory_pressure_listener_android.cc
new file mode 100644
index 00000000000..248777fd491
--- /dev/null
+++ b/chromium/base/android/memory_pressure_listener_android.cc
@@ -0,0 +1,29 @@
+// Copyright 2013 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/memory_pressure_listener_android.h"
+
+#include "base/base_jni_headers/MemoryPressureListener_jni.h"
+#include "base/memory/memory_pressure_listener.h"
+
+using base::android::JavaParamRef;
+
+// Defined and called by JNI.
+static void JNI_MemoryPressureListener_OnMemoryPressure(
+ JNIEnv* env,
+ jint memory_pressure_level) {
+ base::MemoryPressureListener::NotifyMemoryPressure(
+ static_cast<base::MemoryPressureListener::MemoryPressureLevel>(
+ memory_pressure_level));
+}
+
+namespace base {
+namespace android {
+
+void MemoryPressureListenerAndroid::Initialize(JNIEnv* env) {
+ Java_MemoryPressureListener_addNativeCallback(env);
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/memory_pressure_listener_android.h b/chromium/base/android/memory_pressure_listener_android.h
new file mode 100644
index 00000000000..75544a0d4c7
--- /dev/null
+++ b/chromium/base/android/memory_pressure_listener_android.h
@@ -0,0 +1,29 @@
+// Copyright 2013 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_MEMORY_PRESSURE_LISTENER_ANDROID_H_
+#define BASE_ANDROID_MEMORY_PRESSURE_LISTENER_ANDROID_H_
+
+#include "base/android/jni_android.h"
+
+namespace base {
+namespace android {
+
+// Implements the C++ counter part of MemoryPressureListener.java
+class BASE_EXPORT MemoryPressureListenerAndroid {
+ public:
+ static void Initialize(JNIEnv* env);
+
+ MemoryPressureListenerAndroid(const MemoryPressureListenerAndroid&) = delete;
+ MemoryPressureListenerAndroid& operator=(
+ const MemoryPressureListenerAndroid&) = delete;
+
+ // Called by JNI.
+ static void OnMemoryPressure(int memory_pressure_type);
+};
+
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_MEMORY_PRESSURE_LISTENER_ANDROID_H_
diff --git a/chromium/base/android/native_uma_recorder.cc b/chromium/base/android/native_uma_recorder.cc
new file mode 100644
index 00000000000..4714fd94c5c
--- /dev/null
+++ b/chromium/base/android/native_uma_recorder.cc
@@ -0,0 +1,333 @@
+// Copyright 2019 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/callback_android.h"
+#include "base/android/jni_android.h"
+#include "base/android/jni_array.h"
+#include "base/android/jni_string.h"
+#include "base/base_jni_headers/NativeUmaRecorder_jni.h"
+#include "base/format_macros.h"
+#include "base/metrics/histogram.h"
+#include "base/metrics/histogram_base.h"
+#include "base/metrics/sparse_histogram.h"
+#include "base/metrics/statistics_recorder.h"
+#include "base/metrics/user_metrics.h"
+#include "base/strings/stringprintf.h"
+#include "base/time/time.h"
+
+namespace base {
+namespace android {
+
+namespace {
+
+using HistogramsSnapshot =
+ std::map<std::string, std::unique_ptr<HistogramSamples>>;
+
+std::string HistogramConstructionParamsToString(HistogramBase* histogram) {
+ std::string params_str = histogram->histogram_name();
+ switch (histogram->GetHistogramType()) {
+ case HISTOGRAM:
+ case LINEAR_HISTOGRAM:
+ case BOOLEAN_HISTOGRAM:
+ case CUSTOM_HISTOGRAM: {
+ Histogram* hist = static_cast<Histogram*>(histogram);
+ params_str += StringPrintf("/%d/%d/%" PRIuS, hist->declared_min(),
+ hist->declared_max(), hist->bucket_count());
+ break;
+ }
+ case SPARSE_HISTOGRAM:
+ case DUMMY_HISTOGRAM:
+ break;
+ }
+ return params_str;
+}
+
+// Convert a jlong |histogram_hint| from Java to a HistogramBase* via a cast.
+// The Java side caches these in a map (see NativeUmaRecorder.java), which is
+// safe to do since C++ Histogram objects are never freed.
+static HistogramBase* HistogramFromHint(jlong j_histogram_hint) {
+ return reinterpret_cast<HistogramBase*>(j_histogram_hint);
+}
+
+void CheckHistogramArgs(JNIEnv* env,
+ jstring j_histogram_name,
+ int32_t expected_min,
+ int32_t expected_max,
+ size_t expected_bucket_count,
+ HistogramBase* histogram) {
+ std::string histogram_name = ConvertJavaStringToUTF8(env, j_histogram_name);
+ bool valid_arguments = Histogram::InspectConstructionArguments(
+ histogram_name, &expected_min, &expected_max, &expected_bucket_count);
+ DCHECK(valid_arguments);
+ DCHECK(histogram->HasConstructionArguments(expected_min, expected_max,
+ expected_bucket_count))
+ << histogram_name << "/" << expected_min << "/" << expected_max << "/"
+ << expected_bucket_count << " vs. "
+ << HistogramConstructionParamsToString(histogram);
+}
+
+HistogramBase* BooleanHistogram(JNIEnv* env,
+ jstring j_histogram_name,
+ jlong j_histogram_hint) {
+ DCHECK(j_histogram_name);
+ HistogramBase* histogram = HistogramFromHint(j_histogram_hint);
+ if (histogram)
+ return histogram;
+
+ std::string histogram_name = ConvertJavaStringToUTF8(env, j_histogram_name);
+ histogram = BooleanHistogram::FactoryGet(
+ histogram_name, HistogramBase::kUmaTargetedHistogramFlag);
+ return histogram;
+}
+
+HistogramBase* ExponentialHistogram(JNIEnv* env,
+ jstring j_histogram_name,
+ jlong j_histogram_hint,
+ jint j_min,
+ jint j_max,
+ jint j_num_buckets) {
+ DCHECK(j_histogram_name);
+ int32_t min = static_cast<int32_t>(j_min);
+ int32_t max = static_cast<int32_t>(j_max);
+ size_t num_buckets = static_cast<size_t>(j_num_buckets);
+ HistogramBase* histogram = HistogramFromHint(j_histogram_hint);
+ if (histogram) {
+ CheckHistogramArgs(env, j_histogram_name, min, max, num_buckets, histogram);
+ return histogram;
+ }
+
+ DCHECK_GE(min, 1) << "The min expected sample must be >= 1";
+
+ std::string histogram_name = ConvertJavaStringToUTF8(env, j_histogram_name);
+ histogram = Histogram::FactoryGet(histogram_name, min, max, num_buckets,
+ HistogramBase::kUmaTargetedHistogramFlag);
+ return histogram;
+}
+
+HistogramBase* LinearHistogram(JNIEnv* env,
+ jstring j_histogram_name,
+ jlong j_histogram_hint,
+ jint j_min,
+ jint j_max,
+ jint j_num_buckets) {
+ DCHECK(j_histogram_name);
+ int32_t min = static_cast<int32_t>(j_min);
+ int32_t max = static_cast<int32_t>(j_max);
+ size_t num_buckets = static_cast<size_t>(j_num_buckets);
+ HistogramBase* histogram = HistogramFromHint(j_histogram_hint);
+ if (histogram) {
+ CheckHistogramArgs(env, j_histogram_name, min, max, num_buckets, histogram);
+ return histogram;
+ }
+
+ std::string histogram_name = ConvertJavaStringToUTF8(env, j_histogram_name);
+ histogram =
+ LinearHistogram::FactoryGet(histogram_name, min, max, num_buckets,
+ HistogramBase::kUmaTargetedHistogramFlag);
+ return histogram;
+}
+
+HistogramBase* SparseHistogram(JNIEnv* env,
+ jstring j_histogram_name,
+ jlong j_histogram_hint) {
+ DCHECK(j_histogram_name);
+ HistogramBase* histogram = HistogramFromHint(j_histogram_hint);
+ if (histogram)
+ return histogram;
+
+ std::string histogram_name = ConvertJavaStringToUTF8(env, j_histogram_name);
+ histogram = SparseHistogram::FactoryGet(
+ histogram_name, HistogramBase::kUmaTargetedHistogramFlag);
+ return histogram;
+}
+
+struct ActionCallbackWrapper {
+ base::ActionCallback action_callback;
+};
+
+static void OnActionRecorded(const JavaRef<jobject>& callback,
+ const std::string& action,
+ TimeTicks action_time) {
+ RunStringCallbackAndroid(callback, action);
+}
+
+} // namespace
+
+jlong JNI_NativeUmaRecorder_RecordBooleanHistogram(
+ JNIEnv* env,
+ const JavaParamRef<jstring>& j_histogram_name,
+ jlong j_histogram_hint,
+ jboolean j_sample) {
+ bool sample = static_cast<bool>(j_sample);
+ HistogramBase* histogram =
+ BooleanHistogram(env, j_histogram_name, j_histogram_hint);
+ histogram->AddBoolean(sample);
+ return reinterpret_cast<jlong>(histogram);
+}
+
+jlong JNI_NativeUmaRecorder_RecordExponentialHistogram(
+ JNIEnv* env,
+ const JavaParamRef<jstring>& j_histogram_name,
+ jlong j_histogram_hint,
+ jint j_sample,
+ jint j_min,
+ jint j_max,
+ jint j_num_buckets) {
+ int sample = static_cast<int>(j_sample);
+ HistogramBase* histogram = ExponentialHistogram(
+ env, j_histogram_name, j_histogram_hint, j_min, j_max, j_num_buckets);
+ histogram->Add(sample);
+ return reinterpret_cast<jlong>(histogram);
+}
+
+jlong JNI_NativeUmaRecorder_RecordLinearHistogram(
+ JNIEnv* env,
+ const JavaParamRef<jstring>& j_histogram_name,
+ jlong j_histogram_hint,
+ jint j_sample,
+ jint j_min,
+ jint j_max,
+ jint j_num_buckets) {
+ int sample = static_cast<int>(j_sample);
+ HistogramBase* histogram = LinearHistogram(
+ env, j_histogram_name, j_histogram_hint, j_min, j_max, j_num_buckets);
+ histogram->Add(sample);
+ return reinterpret_cast<jlong>(histogram);
+}
+
+jlong JNI_NativeUmaRecorder_RecordSparseHistogram(
+ JNIEnv* env,
+ const JavaParamRef<jstring>& j_histogram_name,
+ jlong j_histogram_hint,
+ jint j_sample) {
+ int sample = static_cast<int>(j_sample);
+ HistogramBase* histogram =
+ SparseHistogram(env, j_histogram_name, j_histogram_hint);
+ histogram->Add(sample);
+ return reinterpret_cast<jlong>(histogram);
+}
+
+void JNI_NativeUmaRecorder_RecordUserAction(
+ JNIEnv* env,
+ const JavaParamRef<jstring>& j_user_action_name,
+ jlong j_millis_since_event) {
+ // Time values coming from Java need to be synchronized with TimeTick clock.
+ RecordComputedActionSince(ConvertJavaStringToUTF8(env, j_user_action_name),
+ Milliseconds(j_millis_since_event));
+}
+
+// This backs a Java test util for testing histograms -
+// MetricsUtils.HistogramDelta. It should live in a test-specific file, but we
+// currently can't have test-specific native code packaged in test-specific Java
+// targets - see http://crbug.com/415945.
+jint JNI_NativeUmaRecorder_GetHistogramValueCountForTesting(
+ JNIEnv* env,
+ const JavaParamRef<jstring>& histogram_name,
+ jint sample,
+ jlong snapshot_ptr) {
+ std::string name = android::ConvertJavaStringToUTF8(env, histogram_name);
+ HistogramBase* histogram = StatisticsRecorder::FindHistogram(name);
+ if (histogram == nullptr) {
+ // No samples have been recorded for this histogram (yet?).
+ return 0;
+ }
+
+ int actual_count = histogram->SnapshotSamples()->GetCount(sample);
+ if (snapshot_ptr) {
+ auto* snapshot = reinterpret_cast<HistogramsSnapshot*>(snapshot_ptr);
+ auto snapshot_data = snapshot->find(name);
+ if (snapshot_data != snapshot->end())
+ actual_count -= snapshot_data->second->GetCount(sample);
+ }
+
+ return actual_count;
+}
+
+jint JNI_NativeUmaRecorder_GetHistogramTotalCountForTesting(
+ JNIEnv* env,
+ const JavaParamRef<jstring>& histogram_name,
+ jlong snapshot_ptr) {
+ std::string name = android::ConvertJavaStringToUTF8(env, histogram_name);
+ HistogramBase* histogram = StatisticsRecorder::FindHistogram(name);
+ if (histogram == nullptr) {
+ // No samples have been recorded for this histogram.
+ return 0;
+ }
+
+ int actual_count = histogram->SnapshotSamples()->TotalCount();
+ if (snapshot_ptr) {
+ auto* snapshot = reinterpret_cast<HistogramsSnapshot*>(snapshot_ptr);
+ auto snapshot_data = snapshot->find(name);
+ if (snapshot_data != snapshot->end())
+ actual_count -= snapshot_data->second->TotalCount();
+ }
+ return actual_count;
+}
+
+// Returns an array with 3 entries for each bucket, representing (min, max,
+// count).
+ScopedJavaLocalRef<jlongArray>
+JNI_NativeUmaRecorder_GetHistogramSamplesForTesting(
+ JNIEnv* env,
+ const JavaParamRef<jstring>& histogram_name) {
+ std::string name = android::ConvertJavaStringToUTF8(env, histogram_name);
+ HistogramBase* histogram = StatisticsRecorder::FindHistogram(name);
+ std::vector<int64_t> buckets;
+
+ if (histogram == nullptr) {
+ // No samples have been recorded for this histogram.
+ return base::android::ToJavaLongArray(env, buckets);
+ }
+
+ std::unique_ptr<HistogramSamples> samples = histogram->SnapshotSamples();
+ for (auto sampleCountIterator = samples->Iterator();
+ !sampleCountIterator->Done(); sampleCountIterator->Next()) {
+ HistogramBase::Sample min;
+ int64_t max;
+ HistogramBase::Count count;
+ sampleCountIterator->Get(&min, &max, &count);
+ buckets.push_back(min);
+ buckets.push_back(max);
+ buckets.push_back(count);
+ }
+
+ return base::android::ToJavaLongArray(env, buckets);
+}
+
+jlong JNI_NativeUmaRecorder_CreateHistogramSnapshotForTesting(JNIEnv* env) {
+ HistogramsSnapshot* snapshot = new HistogramsSnapshot();
+ for (const auto* const histogram : StatisticsRecorder::GetHistograms()) {
+ (*snapshot)[histogram->histogram_name()] = histogram->SnapshotSamples();
+ }
+ return reinterpret_cast<intptr_t>(snapshot);
+}
+
+void JNI_NativeUmaRecorder_DestroyHistogramSnapshotForTesting(
+ JNIEnv* env,
+ jlong snapshot_ptr) {
+ delete reinterpret_cast<HistogramsSnapshot*>(snapshot_ptr);
+}
+
+static jlong JNI_NativeUmaRecorder_AddActionCallbackForTesting(
+ JNIEnv* env,
+ const JavaParamRef<jobject>& callback) {
+ // Create a wrapper for the ActionCallback, so it can life on the heap until
+ // RemoveActionCallbackForTesting() is called.
+ auto* wrapper = new ActionCallbackWrapper{base::BindRepeating(
+ &OnActionRecorded, ScopedJavaGlobalRef<jobject>(env, callback))};
+ base::AddActionCallback(wrapper->action_callback);
+ return reinterpret_cast<intptr_t>(wrapper);
+}
+
+static void JNI_NativeUmaRecorder_RemoveActionCallbackForTesting(
+ JNIEnv* env,
+ jlong callback_id) {
+ DCHECK(callback_id);
+ auto* wrapper = reinterpret_cast<ActionCallbackWrapper*>(callback_id);
+ base::RemoveActionCallback(wrapper->action_callback);
+ delete wrapper;
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/orderfile/OWNERS b/chromium/base/android/orderfile/OWNERS
new file mode 100644
index 00000000000..3301555a7b8
--- /dev/null
+++ b/chromium/base/android/orderfile/OWNERS
@@ -0,0 +1,2 @@
+lizeb@chromium.org
+pasko@chromium.org
diff --git a/chromium/base/android/orderfile/orderfile_call_graph_instrumentation.cc b/chromium/base/android/orderfile/orderfile_call_graph_instrumentation.cc
new file mode 100644
index 00000000000..ea27f15b3b6
--- /dev/null
+++ b/chromium/base/android/orderfile/orderfile_call_graph_instrumentation.cc
@@ -0,0 +1,418 @@
+// Copyright 2019 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/orderfile/orderfile_instrumentation.h"
+
+#include <time.h>
+#include <unistd.h>
+
+#include <atomic>
+#include <cstdio>
+#include <cstring>
+#include <string>
+#include <thread>
+#include <vector>
+
+#include "base/android/library_loader/anchor_functions.h"
+#include "base/android/orderfile/orderfile_buildflags.h"
+#include "base/files/file.h"
+#include "base/format_macros.h"
+#include "base/json/json_writer.h"
+#include "base/logging.h"
+#include "base/strings/stringprintf.h"
+#include "base/values.h"
+#include "build/build_config.h"
+
+#if BUILDFLAG(DEVTOOLS_INSTRUMENTATION_DUMPING)
+#include <sstream>
+
+#include "base/command_line.h"
+#include "base/time/time.h"
+#include "base/trace_event/memory_dump_manager.h" // no-presubmit-check
+#include "base/trace_event/memory_dump_provider.h" // no-presubmit-check
+#endif // BUILDFLAG(DEVTOOLS_INSTRUMENTATION_DUMPING)
+
+#if !BUILDFLAG(SUPPORTS_CODE_ORDERING)
+#error Only supported on architectures supporting code ordering (arm/arm64).
+#endif // !BUILDFLAG(SUPPORTS_CODE_ORDERING)
+
+// Must be applied to all functions within this file.
+#define NO_INSTRUMENT_FUNCTION __attribute__((no_instrument_function))
+#define INLINE_AND_NO_INSTRUMENT_FUNCTION \
+ __attribute__((always_inline, no_instrument_function))
+
+namespace base {
+namespace android {
+namespace orderfile {
+
+namespace {
+
+#if BUILDFLAG(DEVTOOLS_INSTRUMENTATION_DUMPING)
+// This is defined in content/public/common/content_switches.h, which is not
+// accessible in ::base.
+constexpr const char kProcessTypeSwitch[] = "type";
+#else
+// Constant used for StartDelayedDump().
+constexpr int kDelayInSeconds = 30;
+#endif // BUILDFLAG(DEVTOOLS_INSTRUMENTATION_DUMPING)
+
+constexpr size_t kMaxTextSizeInBytes = 1 << 27;
+constexpr size_t kMaxElements = kMaxTextSizeInBytes / 4;
+// Native code currently have ~850k symbols, hence recording up to 1M symbols
+// can cover all possible callee symbols.
+constexpr size_t kMaxReachedSymbols = 1 << 20;
+// 3 callers are recorded per callee.
+constexpr size_t kCallerBuckets = 3;
+// The last bucket is to count for misses and callers from outside the
+// native code bounds.
+constexpr size_t kMissesBucketIndex = 3;
+constexpr size_t kTotalBuckets = 4;
+
+std::atomic<uint32_t> callee_map[kMaxElements];
+static_assert(sizeof(callee_map) == 128 * (1 << 20), "");
+// Contain caller offsets. 4 buckets of callers per callee where the
+// last bucket is for misses.
+std::atomic<uint32_t> g_caller_offset[kMaxReachedSymbols * kTotalBuckets];
+static_assert(sizeof(g_caller_offset) == 16 * (1 << 20), "");
+// Corresponding count of |g_caller_offset|.
+std::atomic<uint32_t> g_caller_count[kMaxReachedSymbols * kTotalBuckets];
+static_assert(sizeof(g_caller_count) == 16 * (1 << 20), "");
+// Index for |g_caller_offset| and |g_caller_count|.
+std::atomic<uint32_t> g_callers_index;
+std::atomic<uint32_t> g_calls_count;
+std::atomic<bool> g_disabled;
+
+#if BUILDFLAG(DEVTOOLS_INSTRUMENTATION_DUMPING)
+// Dump offsets when a memory dump is requested. Used only if
+// switches::kDevtoolsInstrumentationDumping is set.
+class OrderfileMemoryDumpHook : public base::trace_event::MemoryDumpProvider {
+ NO_INSTRUMENT_FUNCTION bool OnMemoryDump(
+ const base::trace_event::MemoryDumpArgs& args,
+ base::trace_event::ProcessMemoryDump* pmd) override {
+ if (!Disable())
+ return true; // A dump has already been started.
+
+ std::string process_type =
+ base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
+ kProcessTypeSwitch);
+ if (process_type.empty())
+ process_type = "browser";
+
+ Dump(process_type);
+ return true; // If something goes awry, a fatal error will be created
+ // internally.
+ }
+};
+#endif // BUILDFLAG(DEVTOOLS_INSTRUMENTATION_DUMPING)
+
+// This is not racy. It is guaranteed that any number of threads concurrently
+// calling this function in any order, will always end up with the same count
+// at the end. It returns |element|'s value before the increment.
+INLINE_AND_NO_INSTRUMENT_FUNCTION uint32_t
+AtomicIncrement(std::atomic<uint32_t>* element) {
+ return element->fetch_add(1, std::memory_order_relaxed);
+}
+
+// Increment the miss bucket for a callee. |index| is the first bucket of
+// callers for this callee.
+INLINE_AND_NO_INSTRUMENT_FUNCTION void RecordMiss(size_t index) {
+ AtomicIncrement(g_caller_count + index + kMissesBucketIndex);
+}
+
+// Increment the caller count if it has previously been registered.
+// If it hasn't, search for an empty bucket and register the caller.
+// Otherwise, return false.
+// |index| is the first bucket to register callers for a certain callee.
+INLINE_AND_NO_INSTRUMENT_FUNCTION bool RecordCaller(size_t index,
+ size_t caller_offset) {
+ for (size_t i = index; i < index + kCallerBuckets; i++) {
+ auto offset = g_caller_offset[i].load(std::memory_order_relaxed);
+ // This check is racy, a write could have happened between the load and the
+ // check.
+ if (offset == caller_offset) {
+ // Caller already recorded, increment the count.
+ AtomicIncrement(g_caller_count + i);
+ return true;
+ }
+ }
+
+ for (size_t i = index; i < index + kCallerBuckets; i++) {
+ auto offset = g_caller_offset[i].load(std::memory_order_relaxed);
+ size_t expected = 0;
+ if (!offset) {
+ // This is not racy as the compare and exchange is done atomically.
+ // It is impossible to reset a bucket if it has already been set. It
+ // exchanges the value in |g_caller_offset[i]| with |caller_offset| if
+ // the value in |g_caller_offset[i] == expected|.
+ // Otherwise, returns false and set |expected = g_caller_offset[i]|.
+ if (g_caller_offset[i].compare_exchange_strong(
+ expected, caller_offset, std::memory_order_relaxed,
+ std::memory_order_relaxed)) {
+ AtomicIncrement(g_caller_count + i);
+ return true;
+ }
+ }
+ // This will decrease the chances that we miss something due to unseen
+ // changes made by another thread.
+ if (offset == caller_offset || expected == caller_offset) {
+ AtomicIncrement(g_caller_count + i);
+ return true;
+ }
+ }
+ return false;
+}
+
+template <bool for_testing>
+__attribute__((always_inline, no_instrument_function)) void RecordAddress(
+ size_t callee_address,
+ size_t caller_address) {
+ bool disabled = g_disabled.load(std::memory_order_relaxed);
+ if (disabled)
+ return;
+
+ const size_t start =
+ for_testing ? kStartOfTextForTesting : base::android::kStartOfText;
+ const size_t end =
+ for_testing ? kEndOfTextForTesting : base::android::kEndOfText;
+
+ if (UNLIKELY(callee_address < start || callee_address > end)) {
+ // Only the code in the native library is instrumented. Callees are expected
+ // to be within the native library bounds.
+ Disable();
+ ImmediateCrash();
+ }
+
+ size_t offset = callee_address - start;
+ static_assert(sizeof(int) == 4,
+ "Collection and processing code assumes that sizeof(int) == 4");
+
+ size_t offset_index = offset / 4;
+
+ if (UNLIKELY(offset_index >= kMaxElements))
+ return;
+
+ std::atomic<uint32_t>* element = callee_map + offset_index;
+ uint32_t callers_index = element->load(std::memory_order_relaxed);
+
+ // Racy check.
+ if (callers_index == 0) {
+ // Fragmentation is possible as we increment the |insertion_index| based on
+ // a racy check.
+ uint32_t insertion_index = AtomicIncrement(&g_callers_index) + 1;
+ if (UNLIKELY(insertion_index >= kMaxReachedSymbols))
+ return;
+
+ uint32_t expected = 0;
+ // Exchanges the value in |element| with |insertion_index| if the value in
+ // |element == expected|. Otherwise, set |expected = element|.
+ element->compare_exchange_strong(expected, insertion_index,
+ std::memory_order_relaxed,
+ std::memory_order_relaxed);
+ // If expected is set, then this callee has previously been seen and already
+ // has a corresponding index in the callers array.
+ callers_index = expected == 0 ? insertion_index : expected;
+ }
+
+ AtomicIncrement(&g_calls_count);
+ callers_index *= kTotalBuckets;
+ if (caller_address <= start || caller_address > end ||
+ !RecordCaller(callers_index, caller_address - start)) {
+ // Record as a Miss, if the caller is not within the bounds of the native
+ // code or there are no empty buckets to record one more caller for this
+ // callee.
+ RecordMiss(callers_index);
+ }
+}
+
+NO_INSTRUMENT_FUNCTION bool DumpToFile(const base::FilePath& path) {
+ auto file =
+ base::File(path, base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE);
+ if (!file.IsValid()) {
+ PLOG(ERROR) << "Could not open " << path;
+ return false;
+ }
+
+ if (g_callers_index == 0) {
+ LOG(ERROR) << "No entries to dump";
+ return false;
+ }
+
+ // This can get very large as it constructs the whole data structure in
+ // memory before dumping it to the file.
+ Value root(Value::Type::DICT);
+ uint32_t total_calls_count = g_calls_count.load(std::memory_order_relaxed);
+ root.SetStringKey("total_calls_count",
+ base::StringPrintf("%" PRIu32, total_calls_count));
+ Value call_graph(Value::Type::LIST);
+ for (size_t i = 0; i < kMaxElements; i++) {
+ auto caller_index =
+ callee_map[i].load(std::memory_order_relaxed) * kTotalBuckets;
+ if (!caller_index)
+ // This callee was never called.
+ continue;
+
+ Value callee_element(Value::Type::DICT);
+ uint32_t callee_offset = i * 4;
+ callee_element.SetStringKey("index",
+ base::StringPrintf("%" PRIuS, caller_index));
+ callee_element.SetStringKey("callee_offset",
+ base::StringPrintf("%" PRIu32, callee_offset));
+ std::string offset_str;
+ Value callers_list(Value::Type::LIST);
+ for (size_t j = 0; j < kTotalBuckets; j++) {
+ uint32_t caller_offset =
+ g_caller_offset[caller_index + j].load(std::memory_order_relaxed);
+
+ // The last bucket is for misses or callers outside the native library,
+ // the caller_offset for this bucket is 0.
+ if (j != kMissesBucketIndex && !caller_offset)
+ continue;
+
+ uint32_t count =
+ g_caller_count[caller_index + j].load(std::memory_order_relaxed);
+ // The count can only be 0 for the misses bucket. Otherwise,
+ // if |caller_offset| is set then the count must be >= 1.
+ CHECK_EQ(count || j == kMissesBucketIndex, true);
+ if (!count)
+ // No misses.
+ continue;
+
+ Value caller_count(Value::Type::DICT);
+ caller_count.SetStringKey("caller_offset",
+ base::StringPrintf("%" PRIu32, caller_offset));
+ caller_count.SetStringKey("count", base::StringPrintf("%" PRIu32, count));
+ callers_list.Append(std::move(caller_count));
+ }
+ callee_element.SetKey("caller_and_count", std::move(callers_list));
+ call_graph.Append(std::move(callee_element));
+ }
+
+ root.SetKey("call_graph", std::move(call_graph));
+ std::string output_js;
+ if (!JSONWriter::Write(root, &output_js)) {
+ LOG(FATAL) << "Error getting JSON string";
+ }
+ if (file.WriteAtCurrentPos(output_js.c_str(),
+ static_cast<int>(output_js.size())) < 0) {
+ // If the file could be opened, but writing has failed, it's likely that
+ // data was partially written. Producing incomplete profiling data would
+ // lead to a poorly performing orderfile, but might not be otherwised
+ // noticed. So we crash instead.
+ LOG(FATAL) << "Error writing profile data";
+ }
+ return true;
+}
+
+// Stops recording, and outputs the data to |path|.
+NO_INSTRUMENT_FUNCTION void StopAndDumpToFile(int pid,
+ uint64_t start_ns_since_epoch,
+ const std::string& tag) {
+ std::string tag_str;
+ if (!tag.empty())
+ tag_str = base::StringPrintf("%s-", tag.c_str());
+ auto path = base::StringPrintf(
+ "/data/local/tmp/chrome/orderfile/profile-hitmap-%s%d-%" PRIu64 ".txt",
+ tag_str.c_str(), pid, start_ns_since_epoch);
+
+ if (!DumpToFile(base::FilePath(path))) {
+ LOG(ERROR) << "Problem with dump (" << tag << ")";
+ }
+}
+
+} // namespace
+
+// It is safe to call any function after |Disable()| has been called. No risk of
+// infinite recursion.
+NO_INSTRUMENT_FUNCTION bool Disable() {
+ bool disabled = g_disabled.exchange(true, std::memory_order_relaxed);
+ std::atomic_thread_fence(std::memory_order_seq_cst);
+ return !disabled;
+}
+
+NO_INSTRUMENT_FUNCTION void StartDelayedDump() {
+#if BUILDFLAG(DEVTOOLS_INSTRUMENTATION_DUMPING)
+ static auto* g_orderfile_memory_dump_hook = new OrderfileMemoryDumpHook();
+ base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider(
+ g_orderfile_memory_dump_hook, "Orderfile", nullptr);
+// Return, letting devtools tracing handle any dumping.
+#else
+ // Using std::thread and not using base::TimeTicks() in order to to not call
+ // too many base:: symbols that would pollute the reached symbol dumps.
+ struct timespec ts;
+ if (clock_gettime(CLOCK_MONOTONIC, &ts))
+ PLOG(FATAL) << "clock_gettime.";
+ uint64_t start_ns_since_epoch =
+ static_cast<uint64_t>(ts.tv_sec) * 1000 * 1000 * 1000 + ts.tv_nsec;
+ int pid = getpid();
+ std::thread([pid, start_ns_since_epoch]() {
+ sleep(kDelayInSeconds);
+ if (Disable())
+ StopAndDumpToFile(pid, start_ns_since_epoch, "");
+ }).detach();
+#endif // BUILDFLAG(DEVTOOLS_INSTRUMENTATION_DUMPING)
+}
+
+NO_INSTRUMENT_FUNCTION void Dump(const std::string& tag) {
+ // As profiling has been disabled, none of the uses of ::base symbols below
+ // will enter the symbol dump.
+ StopAndDumpToFile(
+ getpid(), (base::Time::Now() - base::Time::UnixEpoch()).InNanoseconds(),
+ tag);
+}
+
+NO_INSTRUMENT_FUNCTION void ResetForTesting() {
+ Disable();
+ memset(reinterpret_cast<uint32_t*>(callee_map), 0,
+ sizeof(uint32_t) * kMaxElements);
+ memset(reinterpret_cast<uint32_t*>(g_caller_offset), 0,
+ sizeof(uint32_t) * kMaxReachedSymbols * kTotalBuckets);
+ memset(reinterpret_cast<uint32_t*>(g_caller_count), 0,
+ sizeof(uint32_t) * kMaxReachedSymbols * kTotalBuckets);
+ g_callers_index = 0;
+ g_disabled = false;
+}
+
+NO_INSTRUMENT_FUNCTION void RecordAddressForTesting(size_t callee_address,
+ size_t caller_address) {
+ return RecordAddress<true>(callee_address, caller_address);
+}
+
+// Returns a flattened vector where each callee is allocated 9 buckets.
+// First bucket -> callee offset
+// 8 buckets -> [caller offset, count, ...]
+NO_INSTRUMENT_FUNCTION std::vector<size_t> GetOrderedOffsetsForTesting() {
+ std::vector<size_t> result;
+ for (size_t i = 0; i < kMaxElements; i++) {
+ auto caller_index =
+ callee_map[i].load(std::memory_order_relaxed) * kTotalBuckets;
+ if (!caller_index)
+ continue;
+
+ result.push_back(i * 4);
+ for (size_t j = 0; j < kTotalBuckets; j++) {
+ uint32_t count =
+ g_caller_count[caller_index + j].load(std::memory_order_relaxed);
+
+ uint32_t caller_offset =
+ g_caller_offset[caller_index + j].load(std::memory_order_relaxed);
+ result.push_back(caller_offset);
+ result.push_back(count);
+ }
+ }
+ return result;
+}
+
+} // namespace orderfile
+} // namespace android
+} // namespace base
+
+extern "C" {
+
+NO_INSTRUMENT_FUNCTION void __cyg_profile_func_enter_bare() {
+ base::android::orderfile::RecordAddress<false>(
+ reinterpret_cast<size_t>(__builtin_return_address(0)),
+ reinterpret_cast<size_t>(__builtin_return_address(1)));
+}
+
+} // extern "C"
diff --git a/chromium/base/android/orderfile/orderfile_call_graph_instrumentation_perftest.cc b/chromium/base/android/orderfile/orderfile_call_graph_instrumentation_perftest.cc
new file mode 100644
index 00000000000..28f7a2268bc
--- /dev/null
+++ b/chromium/base/android/orderfile/orderfile_call_graph_instrumentation_perftest.cc
@@ -0,0 +1,155 @@
+// Copyright 2019 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/orderfile/orderfile_instrumentation.h"
+
+#include <thread>
+
+#include "base/android/library_loader/anchor_functions.h"
+#include "base/strings/stringprintf.h"
+#include "base/time/time.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "testing/perf/perf_test.h"
+
+namespace base {
+namespace android {
+namespace orderfile {
+
+namespace {
+const size_t kStep = sizeof(int);
+
+void CallRecordAddress(int iterations, size_t addr_count) {
+ for (int i = 0; i < iterations; i++) {
+ for (size_t caller_addr = kStartOfTextForTesting + kStep;
+ caller_addr < addr_count; caller_addr += kStep) {
+ for (size_t callee_addr = caller_addr + kStep; callee_addr < addr_count;
+ callee_addr += kStep) {
+ RecordAddressForTesting(callee_addr, caller_addr);
+ }
+ }
+ }
+}
+
+void RunBenchmark(size_t iterations, size_t addresses_count, int threads) {
+ ResetForTesting();
+ auto iterate = [iterations, addresses_count]() {
+ CallRecordAddress(iterations, addresses_count);
+ };
+ if (threads != 1) {
+ for (int i = 0; i < threads - 1; ++i)
+ std::thread(iterate).detach();
+ }
+ auto tick = base::TimeTicks::Now();
+ iterate();
+ auto tock = base::TimeTicks::Now();
+ double nanos = static_cast<double>((tock - tick).InNanoseconds());
+ size_t addresses = (addresses_count - kStartOfTextForTesting - 1) / kStep;
+ double calls_count = (addresses * (addresses - 1)) / 2;
+ auto ns_per_call = nanos / (iterations * calls_count);
+ auto modifier =
+ base::StringPrintf("_%zu_%zu_%d", iterations, addresses_count, threads);
+ perf_test::PrintResult("RecordAddressCostPerCall", modifier, "", ns_per_call,
+ "ns", true);
+}
+
+void CheckValid(size_t iterations, size_t addr_count) {
+ // |reached| is expected to be ordered by callee offset
+ auto reached = GetOrderedOffsetsForTesting();
+ size_t buckets_per_callee = 9; // kTotalBuckets * 2 + 1.
+ size_t callers_per_callee = 3;
+ size_t addresses = (addr_count - kStartOfTextForTesting - 1) / kStep;
+ EXPECT_EQ((addresses - 1) * buckets_per_callee, reached.size());
+ size_t expected_callee = kStartOfTextForTesting + 2 * kStep;
+
+ for (size_t i = 0; i < reached.size(); i += buckets_per_callee) {
+ EXPECT_EQ(reached[i] / 4, (expected_callee - kStartOfTextForTesting) / 4);
+ size_t callee_index = i / buckets_per_callee;
+ for (size_t j = 0; j < callers_per_callee; j++) {
+ EXPECT_EQ(reached[i + j * 2 + 1],
+ j > callee_index ? 0UL : (j + 1) * kStep);
+ EXPECT_EQ(reached[i + j * 2 + 2], j > callee_index ? 0UL : iterations);
+ }
+ size_t misses = callee_index > 2 ? (callee_index - 2) * iterations : 0UL;
+ EXPECT_EQ(reached[i + 7], 0UL);
+ EXPECT_EQ(reached[i + 8], misses);
+ expected_callee += kStep;
+ }
+}
+
+} // namespace
+
+class OrderfileInstrumentationTest : public ::testing::Test {
+ // Any tests need to run ResetForTesting() when they start. Because this
+ // perftest is built with instrumentation enabled, all code including
+ // ::testing::Test is instrumented. If ResetForTesting() is called earlier,
+ // for example in setUp(), any test harness code between setUp() and the
+ // actual test will change the instrumentation offset record in unpredictable
+ // ways and make these tests unreliable.
+};
+
+TEST_F(OrderfileInstrumentationTest, SequentialTest_10_5000) {
+ size_t iterations = 10;
+ size_t addr_count = 5000;
+ ResetForTesting();
+ CallRecordAddress(iterations, addr_count);
+ Disable();
+ CheckValid(iterations, addr_count);
+}
+
+TEST_F(OrderfileInstrumentationTest, SequentialTest_10_10000) {
+ size_t iterations = 10;
+ size_t addr_count = 10000;
+ ResetForTesting();
+ CallRecordAddress(iterations, addr_count);
+ Disable();
+ CheckValid(iterations, addr_count);
+}
+
+TEST_F(OrderfileInstrumentationTest, OutOfBoundsCaller) {
+ ResetForTesting();
+ RecordAddressForTesting(1234, kStartOfTextForTesting);
+ RecordAddressForTesting(1234, kEndOfTextForTesting + 1);
+ Disable();
+ auto reached = GetOrderedOffsetsForTesting();
+ EXPECT_EQ(reached.size(), 9UL);
+ EXPECT_EQ(reached[0] / 4, (1234 - kStartOfTextForTesting) / 4);
+ for (size_t i = 1; i < 8; i++) {
+ EXPECT_EQ(reached[i], 0UL);
+ }
+ EXPECT_EQ(reached[8], 2UL);
+}
+
+TEST(OrderfileInstrumentationPerfTest, RecordAddress_10_2000) {
+ RunBenchmark(10, 2000, 1);
+}
+
+TEST(OrderfileInstrumentationPerfTest, RecordAddress_100_2000) {
+ RunBenchmark(100, 2000, 1);
+}
+
+TEST(OrderfileInstrumentationPerfTest, RecordAddress_1000_2000_2) {
+ RunBenchmark(100, 2000, 2);
+}
+
+TEST(OrderfileInstrumentationPerfTest, RecordAddress_1000_2000_3) {
+ RunBenchmark(100, 2000, 3);
+}
+
+TEST(OrderfileInstrumentationPerfTest, RecordAddress_1000_2000_4) {
+ RunBenchmark(100, 2000, 4);
+}
+
+TEST(OrderfileInstrumentationPerfTest, RecordAddress_1000_2000_6) {
+ RunBenchmark(100, 2000, 6);
+}
+
+} // namespace orderfile
+} // namespace android
+} // namespace base
+
+// Custom runner implementation since base's one requires JNI on Android.
+int main(int argc, char** argv) {
+ testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+}
diff --git a/chromium/base/android/orderfile/orderfile_instrumentation.cc b/chromium/base/android/orderfile/orderfile_instrumentation.cc
new file mode 100644
index 00000000000..2b0983ff62b
--- /dev/null
+++ b/chromium/base/android/orderfile/orderfile_instrumentation.cc
@@ -0,0 +1,361 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/orderfile/orderfile_instrumentation.h"
+
+#include <time.h>
+#include <unistd.h>
+
+#include <atomic>
+#include <cstdio>
+#include <cstring>
+#include <sstream>
+#include <string>
+#include <thread>
+#include <vector>
+
+#include "base/android/library_loader/anchor_functions.h"
+#include "base/android/orderfile/orderfile_buildflags.h"
+#include "base/files/file.h"
+#include "base/format_macros.h"
+#include "base/logging.h"
+#include "base/strings/stringprintf.h"
+#include "build/build_config.h"
+
+#if BUILDFLAG(DEVTOOLS_INSTRUMENTATION_DUMPING)
+#include <sstream>
+
+#include "base/command_line.h"
+#include "base/time/time.h"
+#include "base/trace_event/memory_dump_manager.h" // no-presubmit-check
+#include "base/trace_event/memory_dump_provider.h" // no-presubmit-check
+#endif // BUILDFLAG(DEVTOOLS_INSTRUMENTATION_DUMPING)
+
+#if !BUILDFLAG(SUPPORTS_CODE_ORDERING)
+#error Requires code ordering support (arm/arm64/x86/x86_64).
+#endif // !BUILDFLAG(SUPPORTS_CODE_ORDERING)
+
+// Must be applied to all functions within this file.
+#define NO_INSTRUMENT_FUNCTION __attribute__((no_instrument_function))
+
+namespace base {
+namespace android {
+namespace orderfile {
+
+namespace {
+// Constants used for StartDelayedDump().
+constexpr int kDelayInSeconds = 30;
+constexpr int kInitialDelayInSeconds = kPhases == 1 ? kDelayInSeconds : 5;
+
+#if BUILDFLAG(DEVTOOLS_INSTRUMENTATION_DUMPING)
+// This is defined in content/public/common/content_switches.h, which is not
+// accessible in ::base.
+constexpr const char kProcessTypeSwitch[] = "type";
+#endif // BUILDFLAG(DEVTOOLS_INSTRUMENTATION_DUMPING)
+
+// These are large overestimates, which is not an issue, as the data is
+// allocated in .bss, and on linux doesn't take any actual memory when it's not
+// touched.
+constexpr size_t kBitfieldSize = 1 << 22;
+constexpr size_t kMaxTextSizeInBytes = kBitfieldSize * (4 * 32);
+constexpr size_t kMaxElements = 1 << 20;
+
+// Data required to log reached offsets.
+struct LogData {
+ std::atomic<uint32_t> offsets[kBitfieldSize];
+ std::atomic<size_t> ordered_offsets[kMaxElements];
+ std::atomic<size_t> index;
+};
+
+LogData g_data[kPhases];
+std::atomic<int> g_data_index;
+
+// Number of unexpected addresses, that is addresses that are not within [start,
+// end) bounds for the executable code.
+//
+// This should be exactly 0, since the start and end of .text should be known
+// perfectly by the linker, but it does happen. See crbug.com/1186598.
+std::atomic<int> g_unexpected_addresses;
+
+#if BUILDFLAG(DEVTOOLS_INSTRUMENTATION_DUMPING)
+// Dump offsets when a memory dump is requested. Used only if
+// switches::kDevtoolsInstrumentationDumping is set.
+class OrderfileMemoryDumpHook : public base::trace_event::MemoryDumpProvider {
+ NO_INSTRUMENT_FUNCTION bool OnMemoryDump(
+ const base::trace_event::MemoryDumpArgs& args,
+ base::trace_event::ProcessMemoryDump* pmd) override {
+ // Disable instrumentation now to cut down on orderfile pollution.
+ if (!Disable()) {
+ return true; // A dump has already been started.
+ }
+ std::stringstream process_type_str;
+ Dump(base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
+ kProcessTypeSwitch));
+ return true; // If something goes awry, a fatal error will be created
+ // internally.
+ }
+};
+#endif // BUILDFLAG(DEVTOOLS_INSTRUMENTATION_DUMPING)
+
+// |RecordAddress()| adds an element to a concurrent bitset and to a concurrent
+// append-only list of offsets.
+//
+// Ordering:
+// Two consecutive calls to |RecordAddress()| from the same thread will be
+// ordered in the same way in the result, as written by
+// |StopAndDumpToFile()|. The result will contain exactly one instance of each
+// unique offset relative to |kStartOfText| passed to |RecordAddress()|.
+//
+// Implementation:
+// The "set" part is implemented with a bitfield, |g_offset|. The insertion
+// order is recorded in |g_ordered_offsets|.
+// This is not a class to make sure there isn't a static constructor, as it
+// would cause issue with an instrumented static constructor calling this code.
+//
+// Limitations:
+// - Only records offsets to addresses between |kStartOfText| and |kEndOfText|.
+// - Capacity of the set is limited by |kMaxElements|.
+// - Some insertions at the end of collection may be lost.
+
+// Records that |address| has been reached, if recording is enabled.
+// To avoid infinite recursion, this *must* *never* call any instrumented
+// function, unless |Disable()| is called first.
+template <bool for_testing>
+__attribute__((always_inline, no_instrument_function)) void RecordAddress(
+ size_t address) {
+ int index = g_data_index.load(std::memory_order_relaxed);
+ if (index >= kPhases)
+ return;
+
+ const size_t start =
+ for_testing ? kStartOfTextForTesting : base::android::kStartOfText;
+ const size_t end =
+ for_testing ? kEndOfTextForTesting : base::android::kEndOfText;
+ if (UNLIKELY(address < start || address > end)) {
+ if (!AreAnchorsSane()) {
+ // Something is really wrong with the anchors, and this is likely to be
+ // triggered from within a static constructor, where logging is likely to
+ // deadlock. By crashing immediately we at least have a chance to get a
+ // stack trace from the system to give some clue about the nature of the
+ // problem.
+ ImmediateCrash();
+ }
+
+ // We should really crash at the first instance, but it does happen on bots,
+ // for a mysterious reason. Give it some leeway. Note that since we don't
+ // remember the caller address, if a single function is misplaced but we get
+ // many calls to it, then we still crash. If this is the case, add
+ // deduplication.
+ //
+ // Bumped to 100 temporarily as part of crbug.com/1265928 investigation.
+ if (g_unexpected_addresses.fetch_add(1, std::memory_order_relaxed) < 100) {
+ return;
+ }
+
+ Disable();
+ LOG(FATAL) << "Too many unexpected addresses! start = " << std::hex << start
+ << " end = " << end << " address = " << address;
+ }
+
+ size_t offset = address - start;
+ static_assert(sizeof(int) == 4,
+ "Collection and processing code assumes that sizeof(int) == 4");
+ size_t offset_index = offset / 4;
+
+ auto* offsets = g_data[index].offsets;
+ // Atomically set the corresponding bit in the array.
+ std::atomic<uint32_t>* element = offsets + (offset_index / 32);
+ // First, a racy check. This saves a CAS if the bit is already set, and
+ // allows the cache line to remain shared acoss CPUs in this case.
+ uint32_t value = element->load(std::memory_order_relaxed);
+ uint32_t mask = 1 << (offset_index % 32);
+ if (value & mask)
+ return;
+
+ auto before = element->fetch_or(mask, std::memory_order_relaxed);
+ if (before & mask)
+ return;
+
+ // We were the first one to set the element, record it in the ordered
+ // elements list.
+ // Use relaxed ordering, as the value is not published, or used for
+ // synchronization.
+ auto* ordered_offsets = g_data[index].ordered_offsets;
+ auto& ordered_offsets_index = g_data[index].index;
+ size_t insertion_index =
+ ordered_offsets_index.fetch_add(1, std::memory_order_relaxed);
+ if (UNLIKELY(insertion_index >= kMaxElements)) {
+ Disable();
+ LOG(FATAL) << "Too many reached offsets";
+ }
+ ordered_offsets[insertion_index].store(offset, std::memory_order_relaxed);
+}
+
+NO_INSTRUMENT_FUNCTION bool DumpToFile(const base::FilePath& path,
+ const LogData& data) {
+ auto file =
+ base::File(path, base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE);
+ if (!file.IsValid()) {
+ PLOG(ERROR) << "Could not open " << path;
+ return false;
+ }
+
+ if (data.index == 0) {
+ LOG(ERROR) << "No entries to dump";
+ return false;
+ }
+
+ size_t count = data.index - 1;
+ for (size_t i = 0; i < count; i++) {
+ // |g_ordered_offsets| is initialized to 0, so a 0 in the middle of it
+ // indicates a case where the index was incremented, but the write is not
+ // visible in this thread yet. Safe to skip, also because the function at
+ // the start of text is never called.
+ auto offset = data.ordered_offsets[i].load(std::memory_order_relaxed);
+ if (!offset)
+ continue;
+ auto offset_str = base::StringPrintf("%" PRIuS "\n", offset);
+ if (file.WriteAtCurrentPos(offset_str.c_str(),
+ static_cast<int>(offset_str.size())) < 0) {
+ // If the file could be opened, but writing has failed, it's likely that
+ // data was partially written. Producing incomplete profiling data would
+ // lead to a poorly performing orderfile, but might not be otherwised
+ // noticed. So we crash instead.
+ LOG(FATAL) << "Error writing profile data";
+ }
+ }
+ return true;
+}
+
+// Stops recording, and outputs the data to |path|.
+NO_INSTRUMENT_FUNCTION void StopAndDumpToFile(int pid,
+ uint64_t start_ns_since_epoch,
+ const std::string& tag) {
+ Disable();
+
+ for (int phase = 0; phase < kPhases; phase++) {
+ std::string tag_str;
+ if (!tag.empty())
+ tag_str = base::StringPrintf("%s-", tag.c_str());
+ auto path = base::StringPrintf(
+ "/data/local/tmp/chrome/orderfile/profile-hitmap-%s%d-%" PRIu64
+ ".txt_%d",
+ tag_str.c_str(), pid, start_ns_since_epoch, phase);
+ if (!DumpToFile(base::FilePath(path), g_data[phase])) {
+ LOG(ERROR) << "Problem with dump " << phase << " (" << tag << ")";
+ }
+ }
+
+ int unexpected_addresses =
+ g_unexpected_addresses.load(std::memory_order_relaxed);
+ if (unexpected_addresses != 0) {
+ LOG(WARNING) << "Got " << unexpected_addresses << " unexpected addresses!";
+ }
+}
+
+} // namespace
+
+// After a call to Disable(), any function can be called, as reentrancy into the
+// instrumentation function will be mitigated.
+NO_INSTRUMENT_FUNCTION bool Disable() {
+ auto old_phase = g_data_index.exchange(kPhases, std::memory_order_relaxed);
+ std::atomic_thread_fence(std::memory_order_seq_cst);
+ return old_phase != kPhases;
+}
+
+NO_INSTRUMENT_FUNCTION void SanityChecks() {
+ CHECK_LT(base::android::kEndOfText - base::android::kStartOfText,
+ kMaxTextSizeInBytes);
+ CHECK(base::android::IsOrderingSane());
+}
+
+NO_INSTRUMENT_FUNCTION bool SwitchToNextPhaseOrDump(
+ int pid,
+ uint64_t start_ns_since_epoch) {
+ int before = g_data_index.fetch_add(1, std::memory_order_relaxed);
+ if (before + 1 == kPhases) {
+ StopAndDumpToFile(pid, start_ns_since_epoch, "");
+ return true;
+ }
+ return false;
+}
+
+NO_INSTRUMENT_FUNCTION void StartDelayedDump() {
+ // Using std::thread and not using base::TimeTicks() in order to to not call
+ // too many base:: symbols that would pollute the reached symbol dumps.
+ struct timespec ts;
+ if (clock_gettime(CLOCK_MONOTONIC, &ts))
+ PLOG(FATAL) << "clock_gettime.";
+ uint64_t start_ns_since_epoch =
+ static_cast<uint64_t>(ts.tv_sec) * 1000 * 1000 * 1000 + ts.tv_nsec;
+ int pid = getpid();
+
+#if BUILDFLAG(DEVTOOLS_INSTRUMENTATION_DUMPING)
+ static auto* g_orderfile_memory_dump_hook = new OrderfileMemoryDumpHook();
+ base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider(
+ g_orderfile_memory_dump_hook, "Orderfile", nullptr);
+#endif // BUILDFLAG(DEVTOOLS_INSTRUMENTATION_DUMPING)
+
+ std::thread([pid, start_ns_since_epoch]() {
+ sleep(kInitialDelayInSeconds);
+#if BUILDFLAG(DEVTOOLS_INSTRUMENTATION_DUMPING)
+ SwitchToNextPhaseOrDump(pid, start_ns_since_epoch);
+// Return, letting devtools tracing handle any post-startup phases.
+#else
+ while (!SwitchToNextPhaseOrDump(pid, start_ns_since_epoch))
+ sleep(kDelayInSeconds);
+#endif // BUILDFLAG(DEVTOOLS_INSTRUMENTATION_DUMPING)
+ })
+ .detach();
+}
+
+NO_INSTRUMENT_FUNCTION void Dump(const std::string& tag) {
+ // As profiling has been disabled, none of the uses of ::base symbols below
+ // will enter the symbol dump.
+ StopAndDumpToFile(
+ getpid(), (base::Time::Now() - base::Time::UnixEpoch()).InNanoseconds(),
+ tag);
+}
+
+NO_INSTRUMENT_FUNCTION void ResetForTesting() {
+ Disable();
+ g_data_index = 0;
+ for (int i = 0; i < kPhases; i++) {
+ memset(reinterpret_cast<uint32_t*>(g_data[i].offsets), 0,
+ sizeof(uint32_t) * kBitfieldSize);
+ memset(reinterpret_cast<uint32_t*>(g_data[i].ordered_offsets), 0,
+ sizeof(uint32_t) * kMaxElements);
+ g_data[i].index.store(0);
+ }
+
+ g_unexpected_addresses.store(0, std::memory_order_relaxed);
+}
+
+NO_INSTRUMENT_FUNCTION void RecordAddressForTesting(size_t address) {
+ return RecordAddress<true>(address);
+}
+
+NO_INSTRUMENT_FUNCTION std::vector<size_t> GetOrderedOffsetsForTesting() {
+ std::vector<size_t> result;
+ size_t max_index = g_data[0].index.load(std::memory_order_relaxed);
+ for (size_t i = 0; i < max_index; ++i) {
+ auto value = g_data[0].ordered_offsets[i].load(std::memory_order_relaxed);
+ if (value)
+ result.push_back(value);
+ }
+ return result;
+}
+
+} // namespace orderfile
+} // namespace android
+} // namespace base
+
+extern "C" {
+
+NO_INSTRUMENT_FUNCTION void __cyg_profile_func_enter_bare() {
+ base::android::orderfile::RecordAddress<false>(
+ reinterpret_cast<size_t>(__builtin_return_address(0)));
+}
+
+} // extern "C"
diff --git a/chromium/base/android/orderfile/orderfile_instrumentation.h b/chromium/base/android/orderfile/orderfile_instrumentation.h
new file mode 100644
index 00000000000..be3cbb5f278
--- /dev/null
+++ b/chromium/base/android/orderfile/orderfile_instrumentation.h
@@ -0,0 +1,58 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_ORDERFILE_ORDERFILE_INSTRUMENTATION_H_
+#define BASE_ANDROID_ORDERFILE_ORDERFILE_INSTRUMENTATION_H_
+
+#include <cstdint>
+#include <string>
+#include <vector>
+
+#include "base/android/orderfile/orderfile_buildflags.h"
+
+namespace base {
+namespace android {
+namespace orderfile {
+#if BUILDFLAG(DEVTOOLS_INSTRUMENTATION_DUMPING)
+constexpr int kPhases = 2;
+#else
+constexpr int kPhases = 1;
+#endif // BUILDFLAG(DEVTOOLS_INSTRUMENTATION_DUMPING)
+
+constexpr size_t kStartOfTextForTesting = 1000;
+constexpr size_t kEndOfTextForTesting = kStartOfTextForTesting + 1000 * 1000;
+
+// Stop recording. Returns false if recording was already disabled.
+bool Disable();
+
+// Switches to the next recording phase. If called from the last phase, dumps
+// the data to disk, and returns |true|. |pid| is the current process pid, and
+// |start_ns_since_epoch| the process start timestamp.
+bool SwitchToNextPhaseOrDump(int pid, uint64_t start_ns_since_epoch);
+
+// Starts a thread to dump instrumentation after a delay.
+void StartDelayedDump();
+
+// Dumps all information for the current process, annotating the dump file name
+// with the given tag. Will disable instrumentation. Instrumentation must be
+// disabled before this is called.
+void Dump(const std::string& tag);
+
+// Record an |address|, if recording is enabled. Only for testing.
+void RecordAddressForTesting(size_t address);
+
+// Record |callee_address, caller_address|, if recording is enabled.
+// Only for testing.
+void RecordAddressForTesting(size_t callee_address, size_t caller_address);
+
+// Resets the state. Only for testing.
+void ResetForTesting();
+
+// Returns an ordered list of reached offsets. Only for testing.
+std::vector<size_t> GetOrderedOffsetsForTesting();
+} // namespace orderfile
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_ORDERFILE_ORDERFILE_INSTRUMENTATION_H_
diff --git a/chromium/base/android/orderfile/orderfile_instrumentation_perftest.cc b/chromium/base/android/orderfile/orderfile_instrumentation_perftest.cc
new file mode 100644
index 00000000000..551fcf06a92
--- /dev/null
+++ b/chromium/base/android/orderfile/orderfile_instrumentation_perftest.cc
@@ -0,0 +1,135 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/orderfile/orderfile_instrumentation.h"
+
+#include <thread>
+
+#include "base/android/library_loader/anchor_functions.h"
+#include "base/strings/stringprintf.h"
+#include "base/time/time.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "testing/perf/perf_test.h"
+
+namespace base {
+namespace android {
+namespace orderfile {
+
+namespace {
+
+// Records |addresses_count| distinct addresses |iterations| times, in
+// |threads|.
+void RunBenchmark(int iterations, int addresses_count, int threads) {
+ ResetForTesting();
+ auto iterate = [iterations, addresses_count]() {
+ for (int i = 0; i < iterations; i++) {
+ for (size_t addr = kStartOfTextForTesting;
+ addr < static_cast<size_t>(addresses_count); addr += sizeof(int)) {
+ RecordAddressForTesting(addr);
+ }
+ }
+ };
+ if (threads != 1) {
+ for (int i = 0; i < threads - 1; ++i)
+ std::thread(iterate).detach();
+ }
+ auto tick = base::TimeTicks::Now();
+ iterate();
+ auto tock = base::TimeTicks::Now();
+ double nanos = static_cast<double>((tock - tick).InNanoseconds());
+ auto ns_per_call =
+ nanos / (iterations * static_cast<double>(addresses_count));
+ auto modifier =
+ base::StringPrintf("_%d_%d_%d", iterations, addresses_count, threads);
+ perf_test::PrintResult("RecordAddressCostPerCall", modifier, "", ns_per_call,
+ "ns", true);
+}
+
+} // namespace
+
+class OrderfileInstrumentationTest : public ::testing::Test {
+ // Any tests need to run ResetForTesting() when they start. Because this
+ // perftest is built with instrumentation enabled, all code including
+ // ::testing::Test is instrumented. If ResetForTesting() is called earlier,
+ // for example in setUp(), any test harness code between setUp() and the
+ // actual test will change the instrumentation offset record in unpredictable
+ // ways and make these tests unreliable.
+};
+
+TEST_F(OrderfileInstrumentationTest, RecordOffset) {
+ ResetForTesting();
+ size_t first = 1234, second = 1456;
+ RecordAddressForTesting(first);
+ RecordAddressForTesting(second);
+ RecordAddressForTesting(first); // No duplicates.
+ RecordAddressForTesting(first + 1); // 4 bytes granularity.
+ Disable();
+
+ auto reached = GetOrderedOffsetsForTesting();
+ EXPECT_EQ(2UL, reached.size());
+ EXPECT_EQ(first - kStartOfTextForTesting, reached[0]);
+ EXPECT_EQ(second - kStartOfTextForTesting, reached[1]);
+}
+
+TEST_F(OrderfileInstrumentationTest, RecordingStops) {
+ ResetForTesting();
+ size_t first = 1234, second = 1456, third = 1789;
+ RecordAddressForTesting(first);
+ RecordAddressForTesting(second);
+ Disable();
+ RecordAddressForTesting(third);
+
+ auto reached = GetOrderedOffsetsForTesting();
+ ASSERT_EQ(2UL, reached.size());
+ ASSERT_EQ(first - kStartOfTextForTesting, reached[0]);
+ ASSERT_EQ(second - kStartOfTextForTesting, reached[1]);
+}
+
+TEST_F(OrderfileInstrumentationTest, OutOfBounds) {
+ ResetForTesting();
+ EXPECT_DEATH(RecordAddressForTesting(kEndOfTextForTesting + 100), "");
+ EXPECT_DEATH(RecordAddressForTesting(kStartOfTextForTesting - 100), "");
+}
+
+TEST(OrderfileInstrumentationPerfTest, RecordAddress_10_10000) {
+ RunBenchmark(10, 10000, 1);
+}
+
+TEST(OrderfileInstrumentationPerfTest, RecordAddress_100_10000) {
+ RunBenchmark(100, 10000, 1);
+}
+
+TEST(OrderfileInstrumentationPerfTest, RecordAddress_10_100000) {
+ RunBenchmark(10, 100000, 1);
+}
+
+TEST(OrderfileInstrumentationPerfTest, RecordAddress_100_100000) {
+ RunBenchmark(100, 100000, 1);
+}
+
+TEST(OrderfileInstrumentationPerfTest, RecordAddress_1000_100000_2) {
+ RunBenchmark(1000, 100000, 2);
+}
+
+TEST(OrderfileInstrumentationPerfTest, RecordAddress_1000_100000_3) {
+ RunBenchmark(1000, 100000, 3);
+}
+
+TEST(OrderfileInstrumentationPerfTest, RecordAddress_1000_100000_4) {
+ RunBenchmark(1000, 100000, 4);
+}
+
+TEST(OrderfileInstrumentationPerfTest, RecordAddress_1000_100000_6) {
+ RunBenchmark(1000, 100000, 6);
+}
+
+} // namespace orderfile
+} // namespace android
+} // namespace base
+
+// Custom runner implementation since base's one requires JNI on Android.
+int main(int argc, char** argv) {
+ testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+}
diff --git a/chromium/base/android/path_service_android.cc b/chromium/base/android/path_service_android.cc
new file mode 100644
index 00000000000..cefa43d61f3
--- /dev/null
+++ b/chromium/base/android/path_service_android.cc
@@ -0,0 +1,22 @@
+// Copyright 2012 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/jni_android.h"
+#include "base/android/jni_string.h"
+#include "base/base_jni_headers/PathService_jni.h"
+#include "base/files/file_path.h"
+#include "base/path_service.h"
+
+namespace base {
+namespace android {
+
+void JNI_PathService_Override(JNIEnv* env,
+ jint what,
+ const JavaParamRef<jstring>& path) {
+ FilePath file_path(ConvertJavaStringToUTF8(env, path));
+ PathService::Override(what, file_path);
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/path_utils.cc b/chromium/base/android/path_utils.cc
new file mode 100644
index 00000000000..048d2b87cd6
--- /dev/null
+++ b/chromium/base/android/path_utils.cc
@@ -0,0 +1,94 @@
+// Copyright 2012 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/path_utils.h"
+
+#include "base/android/jni_android.h"
+#include "base/android/jni_array.h"
+#include "base/android/jni_string.h"
+#include "base/android/scoped_java_ref.h"
+#include "base/files/file_path.h"
+
+#include "base/base_jni_headers/PathUtils_jni.h"
+
+namespace base {
+namespace android {
+
+bool GetDataDirectory(FilePath* result) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jstring> path = Java_PathUtils_getDataDirectory(env);
+ FilePath data_path(ConvertJavaStringToUTF8(path));
+ *result = data_path;
+ return true;
+}
+
+bool GetCacheDirectory(FilePath* result) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jstring> path = Java_PathUtils_getCacheDirectory(env);
+ FilePath cache_path(ConvertJavaStringToUTF8(path));
+ *result = cache_path;
+ return true;
+}
+
+bool GetThumbnailCacheDirectory(FilePath* result) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jstring> path =
+ Java_PathUtils_getThumbnailCacheDirectory(env);
+ FilePath thumbnail_cache_path(ConvertJavaStringToUTF8(path));
+ *result = thumbnail_cache_path;
+ return true;
+}
+
+bool GetDownloadsDirectory(FilePath* result) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jstring> path = Java_PathUtils_getDownloadsDirectory(env);
+ FilePath downloads_path(ConvertJavaStringToUTF8(path));
+ *result = downloads_path;
+ return true;
+}
+
+std::vector<FilePath> GetAllPrivateDownloadsDirectories() {
+ std::vector<std::string> dirs;
+ JNIEnv* env = AttachCurrentThread();
+ auto jarray = Java_PathUtils_getAllPrivateDownloadsDirectories(env);
+ base::android::AppendJavaStringArrayToStringVector(env, jarray, &dirs);
+
+ std::vector<base::FilePath> file_paths;
+ for (const auto& dir : dirs)
+ file_paths.emplace_back(dir);
+ return file_paths;
+}
+
+std::vector<FilePath> GetSecondaryStorageDownloadDirectories() {
+ std::vector<std::string> dirs;
+ JNIEnv* env = AttachCurrentThread();
+ auto jarray = Java_PathUtils_getExternalDownloadVolumesNames(env);
+ base::android::AppendJavaStringArrayToStringVector(env, jarray, &dirs);
+
+ std::vector<base::FilePath> file_paths;
+ for (const auto& dir : dirs)
+ file_paths.emplace_back(dir);
+ return file_paths;
+}
+
+bool GetNativeLibraryDirectory(FilePath* result) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jstring> path =
+ Java_PathUtils_getNativeLibraryDirectory(env);
+ FilePath library_path(ConvertJavaStringToUTF8(path));
+ *result = library_path;
+ return true;
+}
+
+bool GetExternalStorageDirectory(FilePath* result) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jstring> path =
+ Java_PathUtils_getExternalStorageDirectory(env);
+ FilePath storage_path(ConvertJavaStringToUTF8(path));
+ *result = storage_path;
+ return true;
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/path_utils.h b/chromium/base/android/path_utils.h
new file mode 100644
index 00000000000..216bb73d826
--- /dev/null
+++ b/chromium/base/android/path_utils.h
@@ -0,0 +1,59 @@
+// Copyright 2012 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_PATH_UTILS_H_
+#define BASE_ANDROID_PATH_UTILS_H_
+
+#include <jni.h>
+#include <vector>
+
+#include "base/base_export.h"
+
+namespace base {
+
+class FilePath;
+
+namespace android {
+
+// Retrieves the absolute path to the data directory of the current
+// application. The result is placed in the FilePath pointed to by 'result'.
+// This method is dedicated for base_paths_android.c, Using
+// PathService::Get(base::DIR_ANDROID_APP_DATA, ...) gets the data dir.
+BASE_EXPORT bool GetDataDirectory(FilePath* result);
+
+// Retrieves the absolute path to the cache directory. The result is placed in
+// the FilePath pointed to by 'result'. This method is dedicated for
+// base_paths_android.c, Using PathService::Get(base::DIR_CACHE, ...) gets the
+// cache dir.
+BASE_EXPORT bool GetCacheDirectory(FilePath* result);
+
+// Retrieves the path to the thumbnail cache directory. The result is placed
+// in the FilePath pointed to by 'result'.
+BASE_EXPORT bool GetThumbnailCacheDirectory(FilePath* result);
+
+// Retrieves the path to the public downloads directory. The result is placed
+// in the FilePath pointed to by 'result'.
+BASE_EXPORT bool GetDownloadsDirectory(FilePath* result);
+
+// Retrieves the paths to all download directories, including default storage
+// directory, and a private directory on external SD card.
+BASE_EXPORT std::vector<FilePath> GetAllPrivateDownloadsDirectories();
+
+// Retrieves the paths to all secondary storage download directories. e.g.
+// /storage/1AEF-1A1E/Download/.
+BASE_EXPORT std::vector<FilePath> GetSecondaryStorageDownloadDirectories();
+
+// Retrieves the path to the native JNI libraries via
+// ApplicationInfo.nativeLibraryDir on the Java side. The result is placed in
+// the FilePath pointed to by 'result'.
+BASE_EXPORT bool GetNativeLibraryDirectory(FilePath* result);
+
+// Retrieves the absolute path to the external storage directory. The result
+// is placed in the FilePath pointed to by 'result'.
+BASE_EXPORT bool GetExternalStorageDirectory(FilePath* result);
+
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_PATH_UTILS_H_
diff --git a/chromium/base/android/path_utils_unittest.cc b/chromium/base/android/path_utils_unittest.cc
new file mode 100644
index 00000000000..1f5b0d1dd78
--- /dev/null
+++ b/chromium/base/android/path_utils_unittest.cc
@@ -0,0 +1,65 @@
+// Copyright 2012 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/path_utils.h"
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
+#include "base/strings/string_util.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace base {
+namespace android {
+
+typedef testing::Test PathUtilsTest;
+
+namespace {
+void ExpectEither(const std::string& expected1,
+ const std::string& expected2,
+ const std::string& actual) {
+ EXPECT_TRUE(expected1 == actual || expected2 == actual)
+ << "Value of: " << actual << std::endl
+ << "Expected either: " << expected1 << std::endl
+ << "or: " << expected2;
+}
+} // namespace
+
+TEST_F(PathUtilsTest, TestGetDataDirectory) {
+ // The string comes from the Java side and depends on the APK
+ // we are running in. Assumes that we are packaged in
+ // org.chromium.native_test
+ FilePath path;
+ GetDataDirectory(&path);
+
+ ExpectEither("/data/data/org.chromium.native_test/app_chrome",
+ "/data/user/0/org.chromium.native_test/app_chrome",
+ path.value());
+}
+
+TEST_F(PathUtilsTest, TestGetCacheDirectory) {
+ // The string comes from the Java side and depends on the APK
+ // we are running in. Assumes that we are packaged in
+ // org.chromium.native_test
+ FilePath path;
+ GetCacheDirectory(&path);
+ ExpectEither("/data/data/org.chromium.native_test/cache",
+ "/data/user/0/org.chromium.native_test/cache",
+ path.value());
+}
+
+TEST_F(PathUtilsTest, TestGetNativeLibraryDirectory) {
+ // The string comes from the Java side and depends on the APK
+ // we are running in. Assumes that the directory contains
+ // the base tests shared object.
+ FilePath path;
+ GetNativeLibraryDirectory(&path);
+ EXPECT_TRUE(
+ base::PathExists(path.Append("libbase_unittests.so")) ||
+ base::PathExists(path.Append("libbase_unittests.cr.so")) ||
+ base::PathExists(path.Append("libbase_unittests__library.so")) ||
+ base::PathExists(path.Append("libbase_unittests__library.cr.so")));
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/proguard/OWNERS b/chromium/base/android/proguard/OWNERS
new file mode 100644
index 00000000000..48c6ddc78da
--- /dev/null
+++ b/chromium/base/android/proguard/OWNERS
@@ -0,0 +1 @@
+smaier@chromium.org
diff --git a/chromium/base/android/proguard/chromium_apk.flags b/chromium/base/android/proguard/chromium_apk.flags
new file mode 100644
index 00000000000..f920dff382d
--- /dev/null
+++ b/chromium/base/android/proguard/chromium_apk.flags
@@ -0,0 +1,86 @@
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# Contains flags that we'd like all Chromium .apks to use.
+
+# Keep line number information, useful for stack traces.
+-keepattributes SourceFile,LineNumberTable
+
+# Enable protobuf-related optimizations.
+-shrinkunusedprotofields
+
+# Allowing Proguard to change modifiers.
+-allowaccessmodification
+
+# Keep all CREATOR fields within Parcelable that are kept.
+-keepclassmembers class * implements android.os.Parcelable {
+ public static *** CREATOR;
+}
+
+# Keep all default constructors for used Fragments. Required since they are
+# called reflectively when fragments are reinflated after the app is killed.
+-keepclassmembers class * extends android.app.Fragment {
+ public <init>();
+}
+-keepclassmembers class * extends androidx.fragment.app.Fragment {
+ public <init>();
+}
+
+# AndroidX classes that are inflated via reflection.
+-keep public class androidx.preference.Preference {
+ public <init>(android.content.Context, android.util.AttributeSet);
+}
+-keep public class androidx.preference.PreferenceScreen {
+ public <init>(android.content.Context, android.util.AttributeSet);
+}
+-keep public class androidx.preference.PreferenceCategory {
+ public <init>(android.content.Context, android.util.AttributeSet);
+}
+-keep public class androidx.preference.ListPreference {
+ public <init>(android.content.Context, android.util.AttributeSet);
+}
+
+# SearchView is used in website_preferences_menu.xml and is constructed by
+# Android using reflection.
+-keep class androidx.appcompat.widget.SearchView {
+ public <init>(...);
+}
+
+# Referenced by androidx.preference.PreferenceInflater.
+-keep public class androidx.preference.SwitchPreference {}
+
+# Don't obfuscate Parcelables as they might be marshalled outside Chrome.
+# If we annotated all Parcelables that get put into Bundles other than
+# for saveInstanceState (e.g. PendingIntents), then we could actually keep the
+# names of just those ones. For now, we'll just keep them all.
+-keepnames class * implements android.os.Parcelable {}
+
+# Keep all enum values and valueOf methods. See
+# http://proguard.sourceforge.net/index.html#manual/examples.html
+# for the reason for this. Also, see http://crbug.com/248037.
+-keepclassmembers enum * {
+ public static **[] values();
+}
+
+# This is to workaround crbug.com/1204690 - an old GMS app version crashes when
+# ObjectWrapper contains > 1 fields, and this prevents R8 from inserting a
+# synthetic field.
+-keep,allowaccessmodification class com.google.android.gms.dynamic.ObjectWrapper {
+ <fields>;
+}
+
+# Remove calls to String.format() where the result goes unused. This can mask
+# exceptions if the parameters to String.format() are invalid, but such cases
+# are generally programming bugs anyways.
+# Not using the return value generally occurs due to logging being stripped.
+-assumenosideeffects class java.lang.String {
+ static java.lang.String format(...);
+}
+
+# Allows R8 to remove static field accesses to library APIs when the results
+# are unused (E.g. tell it that it's okay to not trigger <clinit>).
+# Not using the return value generally occurs due to logging being stripped.
+-assumenosideeffects class android.**, java.** {
+ static <fields>;
+}
diff --git a/chromium/base/android/proguard/chromium_code.flags b/chromium/base/android/proguard/chromium_code.flags
new file mode 100644
index 00000000000..98755f9f17b
--- /dev/null
+++ b/chromium/base/android/proguard/chromium_code.flags
@@ -0,0 +1,56 @@
+# Copyright 2016 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# Contains flags that can be safely shared with Cronet, and thus would be
+# appropriate for third-party apps to include.
+
+-keep @androidx.annotation.Keep class *
+-keepclasseswithmembers,allowaccessmodification class * {
+ @androidx.annotation.Keep <fields>;
+}
+-keepclasseswithmembers,allowaccessmodification class * {
+ @androidx.annotation.Keep <methods>;
+}
+
+# Even unused methods kept due to explicit jni registration:
+# https://crbug.com/688465.
+-keepclasseswithmembers,includedescriptorclasses,allowaccessmodification class !org.chromium.base.library_loader.**,** {
+ native <methods>;
+}
+-keepclasseswithmembernames,includedescriptorclasses,allowaccessmodification class org.chromium.base.library_loader.** {
+ native <methods>;
+}
+
+# Use assumevalues block instead of assumenosideeffects block because Google3 proguard cannot parse
+# assumenosideeffects blocks which overwrite return value.
+# chromium_code.flags rather than remove_logging.flags so that it's included
+# in cronet.
+-assumevalues class org.chromium.base.Log {
+ static boolean isDebug() return false;
+}
+
+# Keep all CREATOR fields within Parcelable that are kept.
+-keepclassmembers class org.chromium.** implements android.os.Parcelable {
+ public static *** CREATOR;
+}
+
+# Don't obfuscate Parcelables as they might be marshalled outside Chrome.
+# If we annotated all Parcelables that get put into Bundles other than
+# for saveInstanceState (e.g. PendingIntents), then we could actually keep the
+# names of just those ones. For now, we'll just keep them all.
+-keepnames,allowaccessmodification class org.chromium.** implements android.os.Parcelable {}
+
+# Keep all enum values and valueOf methods. See
+# http://proguard.sourceforge.net/index.html#manual/examples.html
+# for the reason for this. Also, see http://crbug.com/248037.
+-keepclassmembers enum org.chromium.** {
+ public static **[] values();
+}
+
+# -identifiernamestring doesn't keep the module impl around, we have to
+# explicitly keep it.
+-if @org.chromium.components.module_installer.builder.ModuleInterface interface *
+-keep,allowobfuscation,allowaccessmodification class * extends <1> {
+ <init>();
+}
diff --git a/chromium/base/android/proguard/remove_logging.flags b/chromium/base/android/proguard/remove_logging.flags
new file mode 100644
index 00000000000..2e01eea2ea1
--- /dev/null
+++ b/chromium/base/android/proguard/remove_logging.flags
@@ -0,0 +1,48 @@
+# Copyright 2022 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+
+# Remove Log.d(), Log.v(), and all isLoggable() where the return value is
+# unused (e.g. if it was guarding a call to Log.d()).
+-assumenosideeffects class android.util.Log {
+ static int d(...);
+ static int v(...);
+ # Don't use "return false" here because some code guards info logs behind
+ # isLoggable(DEBUG) as a way to enable logs via adb.
+ # https://crbug.com/1366880
+ static boolean isLoggable(...);
+}
+
+# Makes try-with-resources less inefficient. Saved 3.8kb when added.
+-assumenosideeffects class java.lang.Throwable {
+ void addSuppressed(...);
+}
+
+# Remove all logging calls via JDK Loggers. They are generally from
+# unused parts of third-party libraries.
+-assumenosideeffects class java.util.logging.Logger {
+ void finest(...);
+ void finer(...);
+ void fine(...);
+ void info(...);
+ void warning(...);
+ void severe(...);
+ void throwing(...);
+ void log(...);
+ void logp(...);
+ static java.util.logging.Logger getLogger(...) return _NONNULL_;
+ boolean isLoggable(...) return false;
+}
+
+# Remove accesses to Level.<thing> that go unused.
+-assumenosideeffects class java.util.logging.Level {
+ <fields>;
+ # Flogger uses Level objects, so do not set a return value for intValue().
+ int intValue();
+}
+
+# Remove fields of type Logger.
+-assumenosideeffects class * {
+ java.util.logging.Logger * return _NONNULL_;
+}
diff --git a/chromium/base/android/radio_utils.cc b/chromium/base/android/radio_utils.cc
new file mode 100644
index 00000000000..0e082eae4ef
--- /dev/null
+++ b/chromium/base/android/radio_utils.cc
@@ -0,0 +1,77 @@
+// Copyright 2020 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/radio_utils.h"
+
+#include "base/base_jni_headers/RadioUtils_jni.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+
+namespace base {
+namespace android {
+
+namespace {
+
+RadioUtils::OverrideForTesting* g_overrider_for_tests = nullptr;
+
+bool InitializeIsSupported() {
+ JNIEnv* env = AttachCurrentThread();
+ return Java_RadioUtils_isSupported(env);
+}
+} // namespace
+
+RadioUtils::OverrideForTesting::OverrideForTesting() {
+ DCHECK(!g_overrider_for_tests);
+ g_overrider_for_tests = this;
+}
+
+RadioUtils::OverrideForTesting::~OverrideForTesting() {
+ DCHECK(g_overrider_for_tests);
+ g_overrider_for_tests = nullptr;
+}
+
+bool RadioUtils::IsSupported() {
+ static const bool kIsSupported = InitializeIsSupported();
+ return kIsSupported;
+}
+
+RadioConnectionType RadioUtils::GetConnectionType() {
+ if (g_overrider_for_tests) {
+ // If GetConnectionType is being used in tests
+ return g_overrider_for_tests->GetConnectionType();
+ }
+ if (!IsSupported())
+ return RadioConnectionType::kUnknown;
+
+ JNIEnv* env = AttachCurrentThread();
+ if (Java_RadioUtils_isWifiConnected(env)) {
+ return RadioConnectionType::kWifi;
+ } else {
+ return RadioConnectionType::kCell;
+ }
+}
+
+absl::optional<RadioSignalLevel> RadioUtils::GetCellSignalLevel() {
+ if (!IsSupported())
+ return absl::nullopt;
+
+ JNIEnv* env = AttachCurrentThread();
+ int signal_level = Java_RadioUtils_getCellSignalLevel(env);
+ if (signal_level < 0) {
+ return absl::nullopt;
+ } else {
+ return static_cast<RadioSignalLevel>(signal_level);
+ }
+}
+
+absl::optional<RadioDataActivity> RadioUtils::GetCellDataActivity() {
+ if (!IsSupported())
+ return absl::nullopt;
+
+ JNIEnv* env = AttachCurrentThread();
+ return static_cast<RadioDataActivity>(
+ Java_RadioUtils_getCellDataActivity(env));
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/radio_utils.h b/chromium/base/android/radio_utils.h
new file mode 100644
index 00000000000..959647c60d7
--- /dev/null
+++ b/chromium/base/android/radio_utils.h
@@ -0,0 +1,65 @@
+// Copyright 2020 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_RADIO_UTILS_H_
+#define BASE_ANDROID_RADIO_UTILS_H_
+
+#include "base/android/jni_android.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+
+namespace base {
+namespace android {
+
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused. Keep in sync with RadioSignalLevel
+// in //tools/metrics/histograms/enums.xml.
+enum class RadioSignalLevel {
+ kNoneOrUnknown = 0,
+ kPoor = 1,
+ kModerate = 2,
+ kGood = 3,
+ kGreat = 4,
+ kMaxValue = kGreat,
+};
+
+enum class RadioDataActivity {
+ kNone = 0,
+ kIn = 1,
+ kOut = 2,
+ kInOut = 3,
+ kDormant = 4,
+};
+
+enum class RadioConnectionType {
+ kUnknown = 0,
+ kWifi = 1,
+ kCell = 2,
+};
+
+class BASE_EXPORT RadioUtils {
+ public:
+ class OverrideForTesting {
+ public:
+ OverrideForTesting();
+ ~OverrideForTesting();
+
+ void SetConnectionTypeForTesting(RadioConnectionType connection_type) {
+ connection_type_ = connection_type;
+ }
+
+ RadioConnectionType GetConnectionType() { return connection_type_; }
+
+ private:
+ RadioConnectionType connection_type_;
+ };
+ static bool IsSupported();
+ static RadioConnectionType GetConnectionType();
+ static absl::optional<RadioSignalLevel> GetCellSignalLevel();
+ static absl::optional<RadioDataActivity> GetCellDataActivity();
+};
+
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_RADIO_UTILS_H_
diff --git a/chromium/base/android/radio_utils_unittest.cc b/chromium/base/android/radio_utils_unittest.cc
new file mode 100644
index 00000000000..e5dc3df0ca6
--- /dev/null
+++ b/chromium/base/android/radio_utils_unittest.cc
@@ -0,0 +1,26 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/radio_utils.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace base {
+
+namespace android {
+
+TEST(RadioUtilsTest, ConnectionType) {
+ RadioUtils::OverrideForTesting radio_utils_test;
+
+ radio_utils_test.SetConnectionTypeForTesting(RadioConnectionType::kUnknown);
+ EXPECT_EQ(RadioConnectionType::kUnknown, RadioUtils::GetConnectionType());
+
+ radio_utils_test.SetConnectionTypeForTesting(RadioConnectionType::kCell);
+ EXPECT_EQ(RadioConnectionType::kCell, RadioUtils::GetConnectionType());
+
+ radio_utils_test.SetConnectionTypeForTesting(RadioConnectionType::kWifi);
+ EXPECT_EQ(RadioConnectionType::kWifi, RadioUtils::GetConnectionType());
+}
+
+} // namespace android
+} // namespace base \ No newline at end of file
diff --git a/chromium/base/android/reached_addresses_bitset.cc b/chromium/base/android/reached_addresses_bitset.cc
new file mode 100644
index 00000000000..3254de6e0bf
--- /dev/null
+++ b/chromium/base/android/reached_addresses_bitset.cc
@@ -0,0 +1,118 @@
+// Copyright 2019 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/reached_addresses_bitset.h"
+
+#include "base/android/library_loader/anchor_functions.h"
+#include "base/android/library_loader/anchor_functions_buildflags.h"
+#include "base/check_op.h"
+#include "base/numerics/safe_conversions.h"
+
+namespace base {
+namespace android {
+
+namespace {
+constexpr size_t kBitsPerElement = sizeof(uint32_t) * 8;
+
+// Below an array of uint32_t in BSS is introduced and then casted to an array
+// of std::atomic<uint32_t>. In C++20 constructing an std::atomic is not
+// 'trivial'. See https://github.com/microsoft/STL/issues/661 for reasons of
+// this change in the standard.
+//
+// Assert that both types have the same size. The sizes do not have to match
+// according to a note in [atomics.types.generic] in C++17. With this assertion
+// in place it is unlikely that the constructor produces the value other than
+// (uint32_t)0.
+static_assert(sizeof(uint32_t) == sizeof(std::atomic<uint32_t>), "");
+
+// Keep the array in BSS only for non-official builds to avoid potential harm to
+// data locality and unspecified behavior from the reinterpret_cast below.
+// In order to start new experiments with base::Feature(ReachedCodeProfiler) on
+// Canary/Dev this array will need to be reintroduced to official builds. When
+// doing so, don't forget to update `kConfigurationSupported` in
+// `reached_code_profiler.cc`
+#if BUILDFLAG(SUPPORTS_CODE_ORDERING) && !defined(OFFICIAL_BUILD)
+// Enough for 1 << 29 bytes of code, 512MB.
+constexpr size_t kTextBitfieldSize = 1 << 20;
+uint32_t g_text_bitfield[kTextBitfieldSize];
+#endif
+} // namespace
+
+// static
+ReachedAddressesBitset* ReachedAddressesBitset::GetTextBitset() {
+#if BUILDFLAG(SUPPORTS_CODE_ORDERING) && !defined(OFFICIAL_BUILD)
+ static ReachedAddressesBitset text_bitset(
+ kStartOfText, kEndOfText,
+ reinterpret_cast<std::atomic<uint32_t>*>(g_text_bitfield),
+ kTextBitfieldSize);
+ return &text_bitset;
+#else
+ return nullptr;
+#endif
+}
+
+void ReachedAddressesBitset::RecordAddress(uintptr_t address) {
+ // |address| is outside of the range.
+ if (address < start_address_ || address >= end_address_)
+ return;
+
+ size_t offset = static_cast<size_t>(address - start_address_);
+ uint32_t offset_index = checked_cast<uint32_t>(offset / kBytesGranularity);
+
+ // Atomically set the corresponding bit in the array.
+ std::atomic<uint32_t>* element = reached_ + (offset_index / kBitsPerElement);
+
+ // First, a racy check. This saves a CAS if the bit is already set, and
+ // allows the cache line to remain shared across CPUs in this case.
+ uint32_t value = element->load(std::memory_order_relaxed);
+ uint32_t mask = 1 << (offset_index % kBitsPerElement);
+ if (value & mask)
+ return;
+ element->fetch_or(mask, std::memory_order_relaxed);
+}
+
+std::vector<uint32_t> ReachedAddressesBitset::GetReachedOffsets() const {
+ std::vector<uint32_t> offsets;
+ const size_t elements = NumberOfReachableElements();
+
+ for (size_t i = 0; i < elements; ++i) {
+ uint32_t element = reached_[i].load(std::memory_order_relaxed);
+ // No reached addresses at this element.
+ if (element == 0)
+ continue;
+
+ for (size_t j = 0; j < 32; ++j) {
+ if (!((element >> j) & 1))
+ continue;
+
+ size_t offset_index = i * 32 + j;
+ size_t offset = offset_index * kBytesGranularity;
+ offsets.push_back(checked_cast<uint32_t>(offset));
+ }
+ }
+
+ return offsets;
+}
+
+ReachedAddressesBitset::ReachedAddressesBitset(
+ uintptr_t start_address,
+ uintptr_t end_address,
+ std::atomic<uint32_t>* storage_ptr,
+ size_t storage_size)
+ : start_address_(start_address),
+ end_address_(end_address),
+ reached_(storage_ptr) {
+ DCHECK_LE(start_address_, end_address_);
+ DCHECK_LE(NumberOfReachableElements(), storage_size * kBitsPerElement);
+}
+
+size_t ReachedAddressesBitset::NumberOfReachableElements() const {
+ size_t reachable_bits =
+ (end_address_ + kBytesGranularity - 1) / kBytesGranularity -
+ start_address_ / kBytesGranularity;
+ return (reachable_bits + kBitsPerElement - 1) / kBitsPerElement;
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/reached_addresses_bitset.h b/chromium/base/android/reached_addresses_bitset.h
new file mode 100644
index 00000000000..472bab083d8
--- /dev/null
+++ b/chromium/base/android/reached_addresses_bitset.h
@@ -0,0 +1,73 @@
+// Copyright 2019 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_REACHED_ADDRESSES_BITSET_H_
+#define BASE_ANDROID_REACHED_ADDRESSES_BITSET_H_
+
+#include <atomic>
+#include <vector>
+
+#include "base/base_export.h"
+#include "base/no_destructor.h"
+
+namespace base {
+
+namespace android {
+
+// ReachedAddressesBitset is a set that stores addresses for the
+// ReachedCodeProfiler in compact form. Its main features are lock-free
+// thread-safety and fast adding of elements.
+//
+// The addresses are kept with |kBytesGranularity| to save the storage space.
+//
+// Once insterted, elements cannot be erased from the set.
+//
+// All methods can be called from any thread.
+class BASE_EXPORT ReachedAddressesBitset {
+ public:
+ // Returns an instance of ReachedAddressesBitset having enough storage space
+ // to keep all addresses from the .text section.
+ // Returns nullptr if SUPPORTS_CODE_ORDERING isn't defined.
+ // This instance is stored in the .bss section of the binary, meaning that it
+ // doesn't incur the binary size overhead and it doesn't increase the resident
+ // memory footprint when not used.
+ static ReachedAddressesBitset* GetTextBitset();
+
+ // Inserts |address| into the bitset iff |address| lies in the range between
+ // |start_address_| and |end_address_|.
+ void RecordAddress(uintptr_t address);
+
+ // Returns a list of recorded addresses in the form of offsets from
+ // |start_address_|.
+ std::vector<uint32_t> GetReachedOffsets() const;
+
+ private:
+ friend class ReachedAddressesBitsetTest;
+ friend class NoDestructor<ReachedAddressesBitset>;
+
+ // Represents the number of bytes that are mapped into the same bit in the
+ // bitset.
+ static constexpr size_t kBytesGranularity = 4;
+
+ // Constructs a ReachedAddressesBitset on top of an external storage of
+ // |storage_size| pointed by |storage_ptr|. This external storage must outlive
+ // the constructed bitset instance. The size of storage must be large enough
+ // to fit all addresses in the range between |start_address| and
+ // |end_address|.
+ ReachedAddressesBitset(uintptr_t start_address,
+ uintptr_t end_address,
+ std::atomic<uint32_t>* storage_ptr,
+ size_t storage_size);
+
+ size_t NumberOfReachableElements() const;
+
+ uintptr_t start_address_;
+ uintptr_t end_address_;
+ std::atomic<uint32_t>* reached_;
+};
+
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_REACHED_ADDRESSES_BITSET_H_
diff --git a/chromium/base/android/reached_addresses_bitset_unittest.cc b/chromium/base/android/reached_addresses_bitset_unittest.cc
new file mode 100644
index 00000000000..a2b11aa9508
--- /dev/null
+++ b/chromium/base/android/reached_addresses_bitset_unittest.cc
@@ -0,0 +1,78 @@
+// Copyright 2019 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/reached_addresses_bitset.h"
+
+#include <utility>
+
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace base {
+namespace android {
+
+using testing::ElementsAre;
+using testing::ElementsAreArray;
+
+constexpr uintptr_t kStartAddress = 0x1000;
+constexpr uintptr_t kEndAddress = 0x2000;
+constexpr size_t kStorageSize = 512;
+
+class ReachedAddressesBitsetTest : public testing::Test {
+ public:
+ ReachedAddressesBitsetTest()
+ : bitset_(kStartAddress, kEndAddress, storage_, kStorageSize) {
+ memset(storage_, 0, kStorageSize * sizeof(uint32_t));
+ EXPECT_TRUE(bitset()->GetReachedOffsets().empty());
+ }
+
+ ReachedAddressesBitset* bitset() { return &bitset_; }
+
+ private:
+ std::atomic<uint32_t> storage_[kStorageSize];
+ ReachedAddressesBitset bitset_;
+};
+
+TEST_F(ReachedAddressesBitsetTest, RecordStartAddress) {
+ bitset()->RecordAddress(kStartAddress);
+ EXPECT_THAT(bitset()->GetReachedOffsets(), ElementsAre(0));
+}
+
+TEST_F(ReachedAddressesBitsetTest, RecordLastAddress) {
+ bitset()->RecordAddress(kEndAddress - 4);
+ EXPECT_THAT(bitset()->GetReachedOffsets(),
+ ElementsAre(kEndAddress - 4 - kStartAddress));
+}
+
+TEST_F(ReachedAddressesBitsetTest, RecordAddressOutsideOfRange_Small) {
+ bitset()->RecordAddress(kStartAddress - 4);
+ EXPECT_THAT(bitset()->GetReachedOffsets(), ElementsAre());
+}
+
+TEST_F(ReachedAddressesBitsetTest, RecordAddressOutsideOfRange_Large) {
+ bitset()->RecordAddress(kEndAddress);
+ EXPECT_THAT(bitset()->GetReachedOffsets(), ElementsAre());
+}
+
+TEST_F(ReachedAddressesBitsetTest, RecordUnalignedAddresses) {
+ constexpr uint32_t aligned_offset = 0x100;
+ bitset()->RecordAddress(kStartAddress + aligned_offset + 1);
+ bitset()->RecordAddress(kStartAddress + aligned_offset + 2);
+ bitset()->RecordAddress(kStartAddress + aligned_offset + 3);
+ EXPECT_THAT(bitset()->GetReachedOffsets(), ElementsAre(aligned_offset));
+}
+
+TEST_F(ReachedAddressesBitsetTest, FillBitsetOneByOne) {
+ std::vector<uint32_t> expected_offsets;
+ for (uintptr_t address = kStartAddress; address < kEndAddress; address += 4) {
+ bitset()->RecordAddress(address);
+ expected_offsets.push_back(address - kStartAddress);
+ ASSERT_THAT(bitset()->GetReachedOffsets(),
+ ElementsAreArray(expected_offsets))
+ << "Last added: " << address;
+ }
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/reached_code_profiler.cc b/chromium/base/android/reached_code_profiler.cc
new file mode 100644
index 00000000000..619cf950f18
--- /dev/null
+++ b/chromium/base/android/reached_code_profiler.cc
@@ -0,0 +1,303 @@
+// Copyright 2019 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/reached_code_profiler.h"
+
+#include <signal.h>
+#include <sys/time.h>
+#include <ucontext.h>
+#include <unistd.h>
+
+#include <atomic>
+
+#include "base/android/library_loader/anchor_functions.h"
+#include "base/android/orderfile/orderfile_buildflags.h"
+#include "base/android/reached_addresses_bitset.h"
+#include "base/base_switches.h"
+#include "base/command_line.h"
+#include "base/feature_list.h"
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
+#include "base/files/important_file_writer.h"
+#include "base/functional/bind.h"
+#include "base/linux_util.h"
+#include "base/logging.h"
+#include "base/no_destructor.h"
+#include "base/path_service.h"
+#include "base/scoped_generic.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/strings/string_piece.h"
+#include "base/strings/stringprintf.h"
+#include "base/synchronization/lock.h"
+#include "base/task/single_thread_task_runner.h"
+#include "base/threading/thread.h"
+#include "base/time/time.h"
+#include "base/timer/timer.h"
+#include "build/build_config.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+
+#if !BUILDFLAG(SUPPORTS_CODE_ORDERING)
+#error Code ordering support is required for the reached code profiler.
+#endif
+
+namespace base {
+namespace android {
+
+namespace {
+
+#if !defined(NDEBUG) || defined(COMPONENT_BUILD) || defined(OFFICIAL_BUILD)
+// Always disabled for debug builds to avoid hitting a limit of signal
+// interrupts that can get delivered into a single HANDLE_EINTR. Also
+// debugging experience would be bad if there are a lot of signals flying
+// around.
+// Always disabled for component builds because in this case the code is not
+// organized in one contiguous region which is required for the reached code
+// profiler.
+// Disabled for official builds because `g_text_bitfield` isn't included in
+// official builds.
+constexpr const bool kConfigurationSupported = false;
+#else
+constexpr const bool kConfigurationSupported = true;
+#endif
+
+constexpr const char kDumpToFileFlag[] = "reached-code-profiler-dump-to-file";
+
+constexpr uint64_t kIterationsBeforeSkipping = 50;
+constexpr uint64_t kIterationsBetweenUpdates = 100;
+constexpr int kProfilerSignal = SIGWINCH;
+
+constexpr base::TimeDelta kSamplingInterval = base::Milliseconds(10);
+constexpr base::TimeDelta kDumpInterval = base::Seconds(30);
+
+void HandleSignal(int signal, siginfo_t* info, void* context) {
+ if (signal != kProfilerSignal)
+ return;
+
+ ucontext_t* ucontext = reinterpret_cast<ucontext_t*>(context);
+#if defined(ARCH_CPU_ARM64)
+ uintptr_t address = ucontext->uc_mcontext.pc;
+#else
+ uintptr_t address = ucontext->uc_mcontext.arm_pc;
+#endif
+ ReachedAddressesBitset::GetTextBitset()->RecordAddress(address);
+}
+
+struct ScopedTimerCloseTraits {
+ static absl::optional<timer_t> InvalidValue() { return absl::nullopt; }
+
+ static void Free(absl::optional<timer_t> x) { timer_delete(*x); }
+};
+
+// RAII object holding an interval timer.
+using ScopedTimer =
+ base::ScopedGeneric<absl::optional<timer_t>, ScopedTimerCloseTraits>;
+
+void DumpToFile(const base::FilePath& path,
+ scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
+ DCHECK(task_runner->BelongsToCurrentThread());
+
+ auto dir_path = path.DirName();
+ if (!base::DirectoryExists(dir_path) && !base::CreateDirectory(dir_path)) {
+ PLOG(ERROR) << "Could not create " << dir_path;
+ return;
+ }
+
+ std::vector<uint32_t> reached_offsets =
+ ReachedAddressesBitset::GetTextBitset()->GetReachedOffsets();
+ base::StringPiece contents(
+ reinterpret_cast<const char*>(reached_offsets.data()),
+ reached_offsets.size());
+ if (!base::ImportantFileWriter::WriteFileAtomically(path, contents,
+ "ReachedDump")) {
+ LOG(ERROR) << "Could not write reached dump into " << path;
+ }
+
+ task_runner->PostDelayedTask(
+ FROM_HERE, base::BindOnce(&DumpToFile, path, task_runner), kDumpInterval);
+}
+
+class ReachedCodeProfiler {
+ public:
+ static ReachedCodeProfiler* GetInstance() {
+ static base::NoDestructor<ReachedCodeProfiler> instance;
+ return instance.get();
+ }
+
+ ReachedCodeProfiler(const ReachedCodeProfiler&) = delete;
+ ReachedCodeProfiler& operator=(const ReachedCodeProfiler&) = delete;
+
+ // Starts to periodically send |kProfilerSignal| to all threads.
+ void Start(LibraryProcessType library_process_type,
+ base::TimeDelta sampling_interval) {
+ if (is_enabled_)
+ return;
+
+ // Set |kProfilerSignal| signal handler.
+ // TODO(crbug.com/916263): consider restoring |old_handler| after the
+ // profiler gets stopped.
+ struct sigaction old_handler;
+ struct sigaction sa;
+ sigemptyset(&sa.sa_mask);
+ sa.sa_sigaction = &HandleSignal;
+ sa.sa_flags = SA_RESTART | SA_SIGINFO;
+ int ret = sigaction(kProfilerSignal, &sa, &old_handler);
+ if (ret) {
+ PLOG(ERROR) << "Error setting signal handler. The reached code profiler "
+ "is disabled";
+ return;
+ }
+
+ // Create a new interval timer.
+ struct sigevent sevp;
+ memset(&sevp, 0, sizeof(sevp));
+ sevp.sigev_notify = SIGEV_THREAD;
+ sevp.sigev_notify_function = &OnTimerNotify;
+ timer_t timerid;
+ ret = timer_create(CLOCK_PROCESS_CPUTIME_ID, &sevp, &timerid);
+ if (ret) {
+ PLOG(ERROR)
+ << "timer_create() failed. The reached code profiler is disabled";
+ return;
+ }
+
+ timer_.reset(timerid);
+
+ // Start the interval timer.
+ struct itimerspec its;
+ memset(&its, 0, sizeof(its));
+ its.it_interval.tv_nsec =
+ checked_cast<long>(sampling_interval.InNanoseconds());
+ its.it_value = its.it_interval;
+ ret = timer_settime(timerid, 0, &its, nullptr);
+ if (ret) {
+ PLOG(ERROR)
+ << "timer_settime() failed. The reached code profiler is disabled";
+ return;
+ }
+
+ if (library_process_type == PROCESS_BROWSER)
+ StartDumpingReachedCode();
+
+ is_enabled_ = true;
+ }
+
+ // Stops profiling.
+ void Stop() {
+ timer_.reset();
+ dumping_thread_.reset();
+ is_enabled_ = false;
+ }
+
+ // Returns whether the profiler is currently enabled.
+ bool IsEnabled() { return is_enabled_; }
+
+ private:
+ ReachedCodeProfiler()
+ : current_pid_(getpid()), iteration_number_(0), is_enabled_(false) {}
+
+ static void OnTimerNotify(sigval_t ignored) {
+ ReachedCodeProfiler::GetInstance()->SendSignalToAllThreads();
+ }
+
+ void SendSignalToAllThreads() {
+ // This code should be thread-safe.
+ base::AutoLock scoped_lock(lock_);
+ ++iteration_number_;
+
+ if (iteration_number_ <= kIterationsBeforeSkipping ||
+ iteration_number_ % kIterationsBetweenUpdates == 0) {
+ tids_.clear();
+ if (!base::GetThreadsForProcess(current_pid_, &tids_)) {
+ LOG(WARNING) << "Failed to get a list of threads for process "
+ << current_pid_;
+ return;
+ }
+ }
+
+ pid_t current_tid = gettid();
+ for (pid_t tid : tids_) {
+ if (tid != current_tid)
+ tgkill(current_pid_, tid, kProfilerSignal);
+ }
+ }
+
+ void StartDumpingReachedCode() {
+ const base::CommandLine* cmdline = base::CommandLine::ForCurrentProcess();
+ if (!cmdline->HasSwitch(kDumpToFileFlag))
+ return;
+
+ base::FilePath dir_path(cmdline->GetSwitchValueASCII(kDumpToFileFlag));
+ if (dir_path.empty()) {
+ if (!base::PathService::Get(base::DIR_CACHE, &dir_path)) {
+ LOG(WARNING) << "Failed to get cache dir path.";
+ return;
+ }
+ }
+
+ auto file_path =
+ dir_path.Append(base::StringPrintf("reached-code-%d.txt", getpid()));
+
+ dumping_thread_ =
+ std::make_unique<base::Thread>("ReachedCodeProfilerDumpingThread");
+ dumping_thread_->StartWithOptions(
+ base::Thread::Options(base::ThreadType::kBackground));
+ dumping_thread_->task_runner()->PostDelayedTask(
+ FROM_HERE,
+ base::BindOnce(&DumpToFile, file_path, dumping_thread_->task_runner()),
+ kDumpInterval);
+ }
+
+ base::Lock lock_;
+ std::vector<pid_t> tids_;
+ const pid_t current_pid_;
+ uint64_t iteration_number_;
+ ScopedTimer timer_;
+ std::unique_ptr<base::Thread> dumping_thread_;
+
+ bool is_enabled_;
+
+ friend class NoDestructor<ReachedCodeProfiler>;
+};
+
+bool ShouldEnableReachedCodeProfiler() {
+ if (!kConfigurationSupported)
+ return false;
+
+ const base::CommandLine* cmdline = base::CommandLine::ForCurrentProcess();
+ return cmdline->HasSwitch(switches::kEnableReachedCodeProfiler);
+}
+
+} // namespace
+
+void InitReachedCodeProfilerAtStartup(LibraryProcessType library_process_type) {
+ // The profiler shouldn't be run as part of webview.
+ CHECK(library_process_type == PROCESS_BROWSER ||
+ library_process_type == PROCESS_CHILD);
+
+ if (!ShouldEnableReachedCodeProfiler())
+ return;
+
+ int interval_us = 0;
+ base::TimeDelta sampling_interval = kSamplingInterval;
+ if (base::StringToInt(
+ base::CommandLine::ForCurrentProcess()->GetSwitchValueNative(
+ switches::kReachedCodeSamplingIntervalUs),
+ &interval_us) &&
+ interval_us > 0) {
+ sampling_interval = base::Microseconds(interval_us);
+ }
+ ReachedCodeProfiler::GetInstance()->Start(library_process_type,
+ sampling_interval);
+}
+
+bool IsReachedCodeProfilerEnabled() {
+ return ReachedCodeProfiler::GetInstance()->IsEnabled();
+}
+
+bool IsReachedCodeProfilerSupported() {
+ return kConfigurationSupported;
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/reached_code_profiler.h b/chromium/base/android/reached_code_profiler.h
new file mode 100644
index 00000000000..6e7361427d2
--- /dev/null
+++ b/chromium/base/android/reached_code_profiler.h
@@ -0,0 +1,34 @@
+// Copyright 2019 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_REACHED_CODE_PROFILER_H_
+#define BASE_ANDROID_REACHED_CODE_PROFILER_H_
+
+#include "base/android/library_loader/library_loader_hooks.h"
+#include "base/base_export.h"
+
+namespace base {
+namespace android {
+
+// Initializes and starts the reached code profiler for |library_process_type|.
+// Reached symbols are not recorded before calling this function, so it has to
+// be called as early in startup as possible. This has to be called before the
+// process creates any thread.
+// TODO(crbug.com/916263): Currently, the reached code profiler must be
+// initialized before the tracing profiler. If we want to start it at later
+// point, we need to check that the tracing profiler isn't initialized first.
+BASE_EXPORT void InitReachedCodeProfilerAtStartup(
+ LibraryProcessType library_process_type);
+
+// Returns whether the reached code profiler is enabled.
+BASE_EXPORT bool IsReachedCodeProfilerEnabled();
+
+// Returns whether the reached code profiler can be possibly enabled for the
+// current build configuration.
+BASE_EXPORT bool IsReachedCodeProfilerSupported();
+
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_REACHED_CODE_PROFILER_H_
diff --git a/chromium/base/android/reached_code_profiler_stub.cc b/chromium/base/android/reached_code_profiler_stub.cc
new file mode 100644
index 00000000000..b0f27a51e85
--- /dev/null
+++ b/chromium/base/android/reached_code_profiler_stub.cc
@@ -0,0 +1,22 @@
+// Copyright 2019 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/reached_code_profiler.h"
+
+namespace base {
+namespace android {
+
+void InitReachedCodeProfilerAtStartup(LibraryProcessType library_process_type) {
+}
+
+bool IsReachedCodeProfilerEnabled() {
+ return false;
+}
+
+bool IsReachedCodeProfilerSupported() {
+ return false;
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/remove_stale_data.cc b/chromium/base/android/remove_stale_data.cc
new file mode 100644
index 00000000000..5cd90d4e88c
--- /dev/null
+++ b/chromium/base/android/remove_stale_data.cc
@@ -0,0 +1,57 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/remove_stale_data.h"
+
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
+#include "base/metrics/histogram_functions.h"
+#include "base/task/task_traits.h"
+#include "base/task/thread_pool.h"
+#include "base/trace_event/base_tracing.h"
+
+namespace base {
+namespace android {
+
+namespace {
+
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+enum class DeleteResult {
+ kNotFound = 0,
+ kDeleted = 1,
+ kDeleteError = 2,
+ kMaxValue = kDeleteError,
+};
+
+void RecordDeleteResult(DeleteResult result) {
+ base::UmaHistogramEnumeration("NetworkService.ClearStaleDataDirectoryResult",
+ result);
+}
+
+void RemoveStaleDataDirectoryOnPool(const base::FilePath& data_directory) {
+ TRACE_EVENT0("startup", "RemoveStaleDataDirectoryOnPool");
+ if (!base::PathExists(data_directory)) {
+ RecordDeleteResult(DeleteResult::kNotFound);
+ return;
+ }
+ if (base::DeletePathRecursively(data_directory)) {
+ RecordDeleteResult(DeleteResult::kDeleted);
+ return;
+ }
+ RecordDeleteResult(DeleteResult::kDeleteError);
+}
+
+} // namespace
+
+void RemoveStaleDataDirectory(const base::FilePath& data_directory) {
+ base::ThreadPool::PostTask(
+ FROM_HERE,
+ {base::TaskPriority::BEST_EFFORT, base::MayBlock(),
+ base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN},
+ base::BindOnce(&RemoveStaleDataDirectoryOnPool, data_directory));
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/remove_stale_data.h b/chromium/base/android/remove_stale_data.h
new file mode 100644
index 00000000000..473a9551302
--- /dev/null
+++ b/chromium/base/android/remove_stale_data.h
@@ -0,0 +1,25 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_REMOVE_STALE_DATA_H_
+#define BASE_ANDROID_REMOVE_STALE_DATA_H_
+
+#include "base/base_export.h"
+
+namespace base {
+
+class FilePath;
+
+namespace android {
+
+// Removes the `data_directory` with all its contents and records a histogram
+// allowing to estimate the rate of removals.
+// TODO(crbug.com/1331809): Remove this code after the data from the field shows
+// no removal is happening in practice, plus a few milestones.
+void BASE_EXPORT RemoveStaleDataDirectory(const base::FilePath& data_directory);
+
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_REMOVE_STALE_DATA_H_
diff --git a/chromium/base/android/scoped_hardware_buffer_fence_sync.cc b/chromium/base/android/scoped_hardware_buffer_fence_sync.cc
new file mode 100644
index 00000000000..694d03aff92
--- /dev/null
+++ b/chromium/base/android/scoped_hardware_buffer_fence_sync.cc
@@ -0,0 +1,37 @@
+// Copyright 2019 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/scoped_hardware_buffer_fence_sync.h"
+
+#include <utility>
+
+namespace base {
+namespace android {
+
+ScopedHardwareBufferFenceSync::ScopedHardwareBufferFenceSync(
+ ScopedHardwareBufferHandle handle,
+ ScopedFD fence_fd,
+ ScopedFD available_fence_fd,
+ bool is_video)
+ : handle_(std::move(handle)),
+ fence_fd_(std::move(fence_fd)),
+ available_fence_fd_(std::move(available_fence_fd)),
+ is_video_(is_video) {}
+
+ScopedHardwareBufferFenceSync::~ScopedHardwareBufferFenceSync() = default;
+
+ScopedHardwareBufferHandle ScopedHardwareBufferFenceSync::TakeBuffer() {
+ return std::move(handle_);
+}
+
+ScopedFD ScopedHardwareBufferFenceSync::TakeFence() {
+ return std::move(fence_fd_);
+}
+
+ScopedFD ScopedHardwareBufferFenceSync::TakeAvailableFence() {
+ return std::move(available_fence_fd_);
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/scoped_hardware_buffer_fence_sync.h b/chromium/base/android/scoped_hardware_buffer_fence_sync.h
new file mode 100644
index 00000000000..c692aeca450
--- /dev/null
+++ b/chromium/base/android/scoped_hardware_buffer_fence_sync.h
@@ -0,0 +1,47 @@
+// Copyright 2019 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_SCOPED_HARDWARE_BUFFER_FENCE_SYNC_H_
+#define BASE_ANDROID_SCOPED_HARDWARE_BUFFER_FENCE_SYNC_H_
+
+#include "base/android/scoped_hardware_buffer_handle.h"
+#include "base/base_export.h"
+#include "base/files/scoped_file.h"
+
+namespace base {
+namespace android {
+
+// This class provides a ScopedHardwareBufferHandle and may include a fence
+// which will be signaled when all pending work for the buffer has been finished
+// and it can be safely read from.
+class BASE_EXPORT ScopedHardwareBufferFenceSync {
+ public:
+ ScopedHardwareBufferFenceSync(
+ base::android::ScopedHardwareBufferHandle handle,
+ base::ScopedFD fence_fd,
+ base::ScopedFD available_fence_fd,
+ bool is_video);
+ virtual ~ScopedHardwareBufferFenceSync();
+
+ AHardwareBuffer* buffer() const { return handle_.get(); }
+ ScopedHardwareBufferHandle TakeBuffer();
+ ScopedFD TakeFence();
+ ScopedFD TakeAvailableFence();
+ bool is_video() const { return is_video_; }
+
+ // Provides fence which is signaled when the reads for this buffer are done
+ // and it can be reused. Must only be called once.
+ virtual void SetReadFence(base::ScopedFD fence_fd) = 0;
+
+ private:
+ ScopedHardwareBufferHandle handle_;
+ ScopedFD fence_fd_;
+ ScopedFD available_fence_fd_;
+ const bool is_video_;
+};
+
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_SCOPED_HARDWARE_BUFFER_FENCE_SYNC_H_
diff --git a/chromium/base/android/scoped_hardware_buffer_handle.cc b/chromium/base/android/scoped_hardware_buffer_handle.cc
new file mode 100644
index 00000000000..a78daa1c8e2
--- /dev/null
+++ b/chromium/base/android/scoped_hardware_buffer_handle.cc
@@ -0,0 +1,121 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/scoped_hardware_buffer_handle.h"
+
+#include "base/android/android_hardware_buffer_compat.h"
+#include "base/logging.h"
+#include "base/posix/unix_domain_socket.h"
+
+namespace base {
+namespace android {
+
+ScopedHardwareBufferHandle::ScopedHardwareBufferHandle() = default;
+
+ScopedHardwareBufferHandle::ScopedHardwareBufferHandle(
+ ScopedHardwareBufferHandle&& other) {
+ *this = std::move(other);
+}
+
+ScopedHardwareBufferHandle::~ScopedHardwareBufferHandle() {
+ reset();
+}
+
+// static
+ScopedHardwareBufferHandle ScopedHardwareBufferHandle::Adopt(
+ AHardwareBuffer* buffer) {
+ return ScopedHardwareBufferHandle(buffer);
+}
+
+// static
+ScopedHardwareBufferHandle ScopedHardwareBufferHandle::Create(
+ AHardwareBuffer* buffer) {
+ AndroidHardwareBufferCompat::GetInstance().Acquire(buffer);
+ return ScopedHardwareBufferHandle(buffer);
+}
+
+ScopedHardwareBufferHandle& ScopedHardwareBufferHandle::operator=(
+ ScopedHardwareBufferHandle&& other) {
+ reset();
+ std::swap(buffer_, other.buffer_);
+ return *this;
+}
+
+bool ScopedHardwareBufferHandle::is_valid() const {
+ return buffer_ != nullptr;
+}
+
+AHardwareBuffer* ScopedHardwareBufferHandle::get() const {
+ return buffer_;
+}
+
+void ScopedHardwareBufferHandle::reset() {
+ if (buffer_) {
+ AndroidHardwareBufferCompat::GetInstance().Release(buffer_);
+ buffer_ = nullptr;
+ }
+}
+
+AHardwareBuffer* ScopedHardwareBufferHandle::Take() {
+ AHardwareBuffer* buffer = buffer_;
+ buffer_ = nullptr;
+ return buffer;
+}
+
+ScopedHardwareBufferHandle ScopedHardwareBufferHandle::Clone() const {
+ DCHECK(buffer_);
+ AndroidHardwareBufferCompat::GetInstance().Acquire(buffer_);
+ return ScopedHardwareBufferHandle(buffer_);
+}
+
+ScopedFD ScopedHardwareBufferHandle::SerializeAsFileDescriptor() const {
+ DCHECK(is_valid());
+
+ ScopedFD reader, writer;
+ if (!CreateSocketPair(&reader, &writer)) {
+ PLOG(ERROR) << "socketpair";
+ return ScopedFD();
+ }
+
+ // NOTE: SendHandleToUnixSocket does NOT acquire or retain a reference to the
+ // buffer object. The caller is therefore responsible for ensuring that the
+ // buffer remains alive through the lifetime of this file descriptor.
+ int result =
+ AndroidHardwareBufferCompat::GetInstance().SendHandleToUnixSocket(
+ buffer_, writer.get());
+ if (result < 0) {
+ PLOG(ERROR) << "send";
+ return ScopedFD();
+ }
+
+ return reader;
+}
+
+// static
+ScopedHardwareBufferHandle
+ScopedHardwareBufferHandle::DeserializeFromFileDescriptor(ScopedFD fd) {
+ DCHECK(fd.is_valid());
+ DCHECK(AndroidHardwareBufferCompat::IsSupportAvailable());
+ AHardwareBuffer* buffer = nullptr;
+
+ // NOTE: Upon success, RecvHandleFromUnixSocket acquires a new reference to
+ // the AHardwareBuffer.
+ int result =
+ AndroidHardwareBufferCompat::GetInstance().RecvHandleFromUnixSocket(
+ fd.get(), &buffer);
+ if (result < 0) {
+ PLOG(ERROR) << "recv";
+ return ScopedHardwareBufferHandle();
+ }
+
+ return ScopedHardwareBufferHandle(buffer);
+}
+
+ScopedHardwareBufferHandle::ScopedHardwareBufferHandle(AHardwareBuffer* buffer)
+ : buffer_(buffer) {
+ DCHECK(AndroidHardwareBufferCompat::IsSupportAvailable());
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/scoped_hardware_buffer_handle.h b/chromium/base/android/scoped_hardware_buffer_handle.h
new file mode 100644
index 00000000000..f23fdd04724
--- /dev/null
+++ b/chromium/base/android/scoped_hardware_buffer_handle.h
@@ -0,0 +1,92 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_SCOPED_HARDWARE_BUFFER_HANDLE_H_
+#define BASE_ANDROID_SCOPED_HARDWARE_BUFFER_HANDLE_H_
+
+#include "base/base_export.h"
+#include "base/files/scoped_file.h"
+#include "base/memory/raw_ptr.h"
+
+extern "C" typedef struct AHardwareBuffer AHardwareBuffer;
+
+namespace base {
+namespace android {
+
+// Owns a single reference to an AHardwareBuffer object.
+class BASE_EXPORT ScopedHardwareBufferHandle {
+ public:
+ ScopedHardwareBufferHandle();
+
+ // Takes ownership of |other|'s buffer reference. Does NOT acquire a new one.
+ ScopedHardwareBufferHandle(ScopedHardwareBufferHandle&& other);
+
+ ScopedHardwareBufferHandle(const ScopedHardwareBufferHandle&) = delete;
+ ScopedHardwareBufferHandle& operator=(const ScopedHardwareBufferHandle&) =
+ delete;
+
+ // Releases this handle's reference to the underlying buffer object if still
+ // valid.
+ ~ScopedHardwareBufferHandle();
+
+ // Assumes ownership of an existing reference to |buffer|. This does NOT
+ // acquire a new reference.
+ static ScopedHardwareBufferHandle Adopt(AHardwareBuffer* buffer);
+
+ // Adds a reference to |buffer| managed by this handle.
+ static ScopedHardwareBufferHandle Create(AHardwareBuffer* buffer);
+
+ // Takes ownership of |other|'s buffer reference. Does NOT acquire a new one.
+ ScopedHardwareBufferHandle& operator=(ScopedHardwareBufferHandle&& other);
+
+ bool is_valid() const;
+
+ AHardwareBuffer* get() const;
+
+ // Releases this handle's reference to the underlying buffer object if still
+ // valid. Invalidates this handle.
+ void reset();
+
+ // Passes implicit ownership of this handle's reference over to the caller,
+ // invalidating |this|. Returns the raw buffer handle.
+ //
+ // The caller is responsible for eventually releasing this reference to the
+ // buffer object.
+ [[nodiscard]] AHardwareBuffer* Take();
+
+ // Creates a new handle with its own newly acquired reference to the
+ // underlying buffer object. |this| must be a valid handle.
+ ScopedHardwareBufferHandle Clone() const;
+
+ // Consumes a handle and returns a file descriptor which can be used to
+ // transmit the handle over IPC. A subsequent receiver may use
+ // |DeserializeFromFileDescriptor()| to recover the buffer handle.
+ //
+ // NOTE: The returned file descriptor DOES NOT own a reference to the
+ // underlying AHardwareBuffer. When using this for IPC, the caller is
+ // responsible for retaining at least one reference to the buffer object to
+ // keep it alive while the descriptor is in transit.
+ ScopedFD SerializeAsFileDescriptor() const;
+
+ // Consumes the supplied single-use file descriptor (which must have been
+ // returned by a previous call to |SerializeAsFileDescriptor()|, perhaps in
+ // a different process), and recovers an AHardwareBuffer object from it.
+ //
+ // This acquires a new reference to the AHardwareBuffer, with ownership passed
+ // to the caller via the returned ScopedHardwareBufferHandle.
+ [[nodiscard]] static ScopedHardwareBufferHandle DeserializeFromFileDescriptor(
+ ScopedFD fd);
+
+ private:
+ // Assumes ownership of an existing reference to |buffer|. This does NOT
+ // acquire a new reference.
+ explicit ScopedHardwareBufferHandle(AHardwareBuffer* buffer);
+
+ raw_ptr<AHardwareBuffer> buffer_ = nullptr;
+};
+
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_SCOPED_HARDWARE_BUFFER_HANDLE_H_
diff --git a/chromium/base/android/scoped_java_ref.cc b/chromium/base/android/scoped_java_ref.cc
new file mode 100644
index 00000000000..93e27173dd7
--- /dev/null
+++ b/chromium/base/android/scoped_java_ref.cc
@@ -0,0 +1,92 @@
+// Copyright 2012 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/scoped_java_ref.h"
+
+#include "base/android/jni_android.h"
+#include "base/check_op.h"
+
+namespace base {
+namespace android {
+namespace {
+
+const int kDefaultLocalFrameCapacity = 16;
+
+} // namespace
+
+ScopedJavaLocalFrame::ScopedJavaLocalFrame(JNIEnv* env) : env_(env) {
+ int failed = env_->PushLocalFrame(kDefaultLocalFrameCapacity);
+ DCHECK(!failed);
+}
+
+ScopedJavaLocalFrame::ScopedJavaLocalFrame(JNIEnv* env, int capacity)
+ : env_(env) {
+ int failed = env_->PushLocalFrame(capacity);
+ DCHECK(!failed);
+}
+
+ScopedJavaLocalFrame::~ScopedJavaLocalFrame() {
+ env_->PopLocalFrame(nullptr);
+}
+
+#if DCHECK_IS_ON()
+// This constructor is inlined when DCHECKs are disabled; don't add anything
+// else here.
+JavaRef<jobject>::JavaRef(JNIEnv* env, jobject obj) : obj_(obj) {
+ if (obj) {
+ DCHECK(env && env->GetObjectRefType(obj) == JNILocalRefType);
+ }
+}
+#endif
+
+JNIEnv* JavaRef<jobject>::SetNewLocalRef(JNIEnv* env, jobject obj) {
+ if (!env) {
+ env = AttachCurrentThread();
+ } else {
+ DCHECK_EQ(env, AttachCurrentThread()); // Is |env| on correct thread.
+ }
+ if (obj)
+ obj = env->NewLocalRef(obj);
+ if (obj_)
+ env->DeleteLocalRef(obj_);
+ obj_ = obj;
+ return env;
+}
+
+void JavaRef<jobject>::SetNewGlobalRef(JNIEnv* env, jobject obj) {
+ if (!env) {
+ env = AttachCurrentThread();
+ } else {
+ DCHECK_EQ(env, AttachCurrentThread()); // Is |env| on correct thread.
+ }
+ if (obj)
+ obj = env->NewGlobalRef(obj);
+ if (obj_)
+ env->DeleteGlobalRef(obj_);
+ obj_ = obj;
+}
+
+void JavaRef<jobject>::ResetLocalRef(JNIEnv* env) {
+ if (obj_) {
+ DCHECK_EQ(env, AttachCurrentThread()); // Is |env| on correct thread.
+ env->DeleteLocalRef(obj_);
+ obj_ = nullptr;
+ }
+}
+
+void JavaRef<jobject>::ResetGlobalRef() {
+ if (obj_) {
+ AttachCurrentThread()->DeleteGlobalRef(obj_);
+ obj_ = nullptr;
+ }
+}
+
+jobject JavaRef<jobject>::ReleaseInternal() {
+ jobject obj = obj_;
+ obj_ = nullptr;
+ return obj;
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/scoped_java_ref.h b/chromium/base/android/scoped_java_ref.h
new file mode 100644
index 00000000000..3245d06b17c
--- /dev/null
+++ b/chromium/base/android/scoped_java_ref.h
@@ -0,0 +1,537 @@
+// Copyright 2012 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_SCOPED_JAVA_REF_H_
+#define BASE_ANDROID_SCOPED_JAVA_REF_H_
+
+#include <jni.h>
+#include <stddef.h>
+
+#include <type_traits>
+#include <utility>
+
+#include "base/base_export.h"
+#include "base/check_op.h"
+#include "base/memory/raw_ptr.h"
+
+namespace base {
+namespace android {
+
+// Creates a new local reference frame, in which at least a given number of
+// local references can be created. Note that local references already created
+// in previous local frames are still valid in the current local frame.
+class BASE_EXPORT ScopedJavaLocalFrame {
+ public:
+ explicit ScopedJavaLocalFrame(JNIEnv* env);
+ ScopedJavaLocalFrame(JNIEnv* env, int capacity);
+
+ ScopedJavaLocalFrame(const ScopedJavaLocalFrame&) = delete;
+ ScopedJavaLocalFrame& operator=(const ScopedJavaLocalFrame&) = delete;
+
+ ~ScopedJavaLocalFrame();
+
+ private:
+ // This class is only good for use on the thread it was created on so
+ // it's safe to cache the non-threadsafe JNIEnv* inside this object.
+ raw_ptr<JNIEnv> env_;
+};
+
+// Forward declare the generic java reference template class.
+template <typename T>
+class JavaRef;
+
+// Template specialization of JavaRef, which acts as the base class for all
+// other JavaRef<> template types. This allows you to e.g. pass
+// ScopedJavaLocalRef<jstring> into a function taking const JavaRef<jobject>&
+template <>
+class BASE_EXPORT JavaRef<jobject> {
+ public:
+ // Initializes a null reference.
+ constexpr JavaRef() {}
+
+ // Allow nullptr to be converted to JavaRef. This avoids having to declare an
+ // empty JavaRef just to pass null to a function, and makes C++ "nullptr" and
+ // Java "null" equivalent.
+ constexpr JavaRef(std::nullptr_t) {}
+
+ JavaRef(const JavaRef&) = delete;
+ JavaRef& operator=(const JavaRef&) = delete;
+
+ // Public to allow destruction of null JavaRef objects.
+ ~JavaRef() {}
+
+ // TODO(torne): maybe rename this to get() for consistency with unique_ptr
+ // once there's fewer unnecessary uses of it in the codebase.
+ jobject obj() const { return obj_; }
+
+ explicit operator bool() const { return obj_ != nullptr; }
+
+ // Deprecated. Just use bool conversion.
+ // TODO(torne): replace usage and remove this.
+ bool is_null() const { return obj_ == nullptr; }
+
+ protected:
+// Takes ownership of the |obj| reference passed; requires it to be a local
+// reference type.
+#if DCHECK_IS_ON()
+ // Implementation contains a DCHECK; implement out-of-line when DCHECK_IS_ON.
+ JavaRef(JNIEnv* env, jobject obj);
+#else
+ JavaRef(JNIEnv* env, jobject obj) : obj_(obj) {}
+#endif
+
+ // Used for move semantics. obj_ must have been released first if non-null.
+ void steal(JavaRef&& other) {
+ obj_ = other.obj_;
+ other.obj_ = nullptr;
+ }
+
+ // The following are implementation detail convenience methods, for
+ // use by the sub-classes.
+ JNIEnv* SetNewLocalRef(JNIEnv* env, jobject obj);
+ void SetNewGlobalRef(JNIEnv* env, jobject obj);
+ void ResetLocalRef(JNIEnv* env);
+ void ResetGlobalRef();
+ jobject ReleaseInternal();
+
+ private:
+ jobject obj_ = nullptr;
+};
+
+// Forward declare the object array reader for the convenience function.
+template <typename T>
+class JavaObjectArrayReader;
+
+// Generic base class for ScopedJavaLocalRef and ScopedJavaGlobalRef. Useful
+// for allowing functions to accept a reference without having to mandate
+// whether it is a local or global type.
+template <typename T>
+class JavaRef : public JavaRef<jobject> {
+ public:
+ constexpr JavaRef() {}
+ constexpr JavaRef(std::nullptr_t) {}
+
+ JavaRef(const JavaRef&) = delete;
+ JavaRef& operator=(const JavaRef&) = delete;
+
+ ~JavaRef() {}
+
+ T obj() const { return static_cast<T>(JavaRef<jobject>::obj()); }
+
+ // Get a JavaObjectArrayReader for the array pointed to by this reference.
+ // Only defined for JavaRef<jobjectArray>.
+ // You must pass the type of the array elements (usually jobject) as the
+ // template parameter.
+ template <typename ElementType,
+ typename T_ = T,
+ typename = std::enable_if_t<std::is_same<T_, jobjectArray>::value>>
+ JavaObjectArrayReader<ElementType> ReadElements() const {
+ return JavaObjectArrayReader<ElementType>(*this);
+ }
+
+ protected:
+ JavaRef(JNIEnv* env, T obj) : JavaRef<jobject>(env, obj) {}
+};
+
+// Holds a local reference to a JNI method parameter.
+// Method parameters should not be deleted, and so this class exists purely to
+// wrap them as a JavaRef<T> in the JNI binding generator. Do not create
+// instances manually.
+template <typename T>
+class JavaParamRef : public JavaRef<T> {
+ public:
+ // Assumes that |obj| is a parameter passed to a JNI method from Java.
+ // Does not assume ownership as parameters should not be deleted.
+ JavaParamRef(JNIEnv* env, T obj) : JavaRef<T>(env, obj) {}
+
+ // Allow nullptr to be converted to JavaParamRef. Some unit tests call JNI
+ // methods directly from C++ and pass null for objects which are not actually
+ // used by the implementation (e.g. the caller object); allow this to keep
+ // working.
+ JavaParamRef(std::nullptr_t) {}
+
+ JavaParamRef(const JavaParamRef&) = delete;
+ JavaParamRef& operator=(const JavaParamRef&) = delete;
+
+ ~JavaParamRef() {}
+
+ // TODO(torne): remove this cast once we're using JavaRef consistently.
+ // http://crbug.com/506850
+ operator T() const { return JavaRef<T>::obj(); }
+};
+
+// Holds a local reference to a Java object. The local reference is scoped
+// to the lifetime of this object.
+// Instances of this class may hold onto any JNIEnv passed into it until
+// destroyed. Therefore, since a JNIEnv is only suitable for use on a single
+// thread, objects of this class must be created, used, and destroyed, on a
+// single thread.
+// Therefore, this class should only be used as a stack-based object and from a
+// single thread. If you wish to have the reference outlive the current
+// callstack (e.g. as a class member) or you wish to pass it across threads,
+// use a ScopedJavaGlobalRef instead.
+template <typename T>
+class ScopedJavaLocalRef : public JavaRef<T> {
+ public:
+ // Take ownership of a bare jobject. This does not create a new reference.
+ // This should only be used by JNI helper functions, or in cases where code
+ // must call JNIEnv methods directly.
+ static ScopedJavaLocalRef Adopt(JNIEnv* env, T obj) {
+ return ScopedJavaLocalRef(env, obj);
+ }
+
+ constexpr ScopedJavaLocalRef() {}
+ constexpr ScopedJavaLocalRef(std::nullptr_t) {}
+
+ // Copy constructor. This is required in addition to the copy conversion
+ // constructor below.
+ ScopedJavaLocalRef(const ScopedJavaLocalRef& other) : env_(other.env_) {
+ JavaRef<T>::SetNewLocalRef(env_, other.obj());
+ }
+
+ // Copy conversion constructor.
+ template <typename U,
+ typename = std::enable_if_t<std::is_convertible<U, T>::value>>
+ ScopedJavaLocalRef(const ScopedJavaLocalRef<U>& other) : env_(other.env_) {
+ JavaRef<T>::SetNewLocalRef(env_, other.obj());
+ }
+
+ // Move constructor. This is required in addition to the move conversion
+ // constructor below.
+ ScopedJavaLocalRef(ScopedJavaLocalRef&& other) : env_(other.env_) {
+ JavaRef<T>::steal(std::move(other));
+ }
+
+ // Move conversion constructor.
+ template <typename U,
+ typename = std::enable_if_t<std::is_convertible<U, T>::value>>
+ ScopedJavaLocalRef(ScopedJavaLocalRef<U>&& other) : env_(other.env_) {
+ JavaRef<T>::steal(std::move(other));
+ }
+
+ // Constructor for other JavaRef types.
+ explicit ScopedJavaLocalRef(const JavaRef<T>& other) { Reset(other); }
+
+ // Assumes that |obj| is a local reference to a Java object and takes
+ // ownership of this local reference.
+ // TODO(torne): make legitimate uses call Adopt() instead, and make this
+ // private.
+ ScopedJavaLocalRef(JNIEnv* env, T obj) : JavaRef<T>(env, obj), env_(env) {}
+
+ ~ScopedJavaLocalRef() { Reset(); }
+
+ // Null assignment, for disambiguation.
+ ScopedJavaLocalRef& operator=(std::nullptr_t) {
+ Reset();
+ return *this;
+ }
+
+ // Copy assignment.
+ ScopedJavaLocalRef& operator=(const ScopedJavaLocalRef& other) {
+ Reset(other);
+ return *this;
+ }
+
+ // Copy conversion assignment.
+ template <typename U,
+ typename = std::enable_if_t<std::is_convertible<U, T>::value>>
+ ScopedJavaLocalRef& operator=(const ScopedJavaLocalRef<U>& other) {
+ Reset(other);
+ return *this;
+ }
+
+ // Move assignment.
+ template <typename U,
+ typename = std::enable_if_t<std::is_convertible<U, T>::value>>
+ ScopedJavaLocalRef& operator=(ScopedJavaLocalRef<U>&& other) {
+ env_ = other.env_;
+ Reset();
+ JavaRef<T>::steal(std::move(other));
+ return *this;
+ }
+
+ // Assignment for other JavaRef types.
+ ScopedJavaLocalRef& operator=(const JavaRef<T>& other) {
+ Reset(other);
+ return *this;
+ }
+
+ void Reset() { JavaRef<T>::ResetLocalRef(env_); }
+
+ template <typename U,
+ typename = std::enable_if_t<std::is_convertible<U, T>::value>>
+ void Reset(const ScopedJavaLocalRef<U>& other) {
+ // We can copy over env_ here as |other| instance must be from the same
+ // thread as |this| local ref. (See class comment for multi-threading
+ // limitations, and alternatives).
+ env_ = JavaRef<T>::SetNewLocalRef(other.env_, other.obj());
+ }
+
+ void Reset(const JavaRef<T>& other) {
+ // If |env_| was not yet set (is still null) it will be attached to the
+ // current thread in SetNewLocalRef().
+ env_ = JavaRef<T>::SetNewLocalRef(env_, other.obj());
+ }
+
+ // Releases the local reference to the caller. The caller *must* delete the
+ // local reference when it is done with it. Note that calling a Java method
+ // is *not* a transfer of ownership and Release() should not be used.
+ T Release() { return static_cast<T>(JavaRef<T>::ReleaseInternal()); }
+
+ private:
+ // This class is only good for use on the thread it was created on so
+ // it's safe to cache the non-threadsafe JNIEnv* inside this object.
+ raw_ptr<JNIEnv> env_ = nullptr;
+
+ // Prevent ScopedJavaLocalRef(JNIEnv*, T obj) from being used to take
+ // ownership of a JavaParamRef's underlying object - parameters are not
+ // allowed to be deleted and so should not be owned by ScopedJavaLocalRef.
+ // TODO(torne): this can be removed once JavaParamRef no longer has an
+ // implicit conversion back to T.
+ ScopedJavaLocalRef(JNIEnv* env, const JavaParamRef<T>& other);
+
+ // Friend required to get env_ from conversions.
+ template <typename U>
+ friend class ScopedJavaLocalRef;
+
+ // Avoids JavaObjectArrayReader having to accept and store its own env.
+ template <typename U>
+ friend class JavaObjectArrayReader;
+};
+
+// Holds a global reference to a Java object. The global reference is scoped
+// to the lifetime of this object. This class does not hold onto any JNIEnv*
+// passed to it, hence it is safe to use across threads (within the constraints
+// imposed by the underlying Java object that it references).
+template <typename T>
+class ScopedJavaGlobalRef : public JavaRef<T> {
+ public:
+ constexpr ScopedJavaGlobalRef() {}
+ constexpr ScopedJavaGlobalRef(std::nullptr_t) {}
+
+ // Copy constructor. This is required in addition to the copy conversion
+ // constructor below.
+ ScopedJavaGlobalRef(const ScopedJavaGlobalRef& other) { Reset(other); }
+
+ // Copy conversion constructor.
+ template <typename U,
+ typename = std::enable_if_t<std::is_convertible<U, T>::value>>
+ ScopedJavaGlobalRef(const ScopedJavaGlobalRef<U>& other) {
+ Reset(other);
+ }
+
+ // Move constructor. This is required in addition to the move conversion
+ // constructor below.
+ ScopedJavaGlobalRef(ScopedJavaGlobalRef&& other) {
+ JavaRef<T>::steal(std::move(other));
+ }
+
+ // Move conversion constructor.
+ template <typename U,
+ typename = std::enable_if_t<std::is_convertible<U, T>::value>>
+ ScopedJavaGlobalRef(ScopedJavaGlobalRef<U>&& other) {
+ JavaRef<T>::steal(std::move(other));
+ }
+
+ // Conversion constructor for other JavaRef types.
+ explicit ScopedJavaGlobalRef(const JavaRef<T>& other) { Reset(other); }
+
+ // Create a new global reference to the object.
+ // Deprecated. Don't use bare jobjects; use a JavaRef as the input.
+ ScopedJavaGlobalRef(JNIEnv* env, T obj) { Reset(env, obj); }
+
+ ~ScopedJavaGlobalRef() { Reset(); }
+
+ // Null assignment, for disambiguation.
+ ScopedJavaGlobalRef& operator=(std::nullptr_t) {
+ Reset();
+ return *this;
+ }
+
+ // Copy assignment.
+ ScopedJavaGlobalRef& operator=(const ScopedJavaGlobalRef& other) {
+ Reset(other);
+ return *this;
+ }
+
+ // Copy conversion assignment.
+ template <typename U,
+ typename = std::enable_if_t<std::is_convertible<U, T>::value>>
+ ScopedJavaGlobalRef& operator=(const ScopedJavaGlobalRef<U>& other) {
+ Reset(other);
+ return *this;
+ }
+
+ // Move assignment.
+ template <typename U,
+ typename = std::enable_if_t<std::is_convertible<U, T>::value>>
+ ScopedJavaGlobalRef& operator=(ScopedJavaGlobalRef<U>&& other) {
+ Reset();
+ JavaRef<T>::steal(std::move(other));
+ return *this;
+ }
+
+ // Assignment for other JavaRef types.
+ ScopedJavaGlobalRef& operator=(const JavaRef<T>& other) {
+ Reset(other);
+ return *this;
+ }
+
+ void Reset() { JavaRef<T>::ResetGlobalRef(); }
+
+ template <typename U,
+ typename = std::enable_if_t<std::is_convertible<U, T>::value>>
+ void Reset(const ScopedJavaGlobalRef<U>& other) {
+ Reset(nullptr, other.obj());
+ }
+
+ void Reset(const JavaRef<T>& other) { Reset(nullptr, other.obj()); }
+
+ // Deprecated. You can just use Reset(const JavaRef&).
+ void Reset(JNIEnv* env, const JavaParamRef<T>& other) {
+ Reset(env, other.obj());
+ }
+
+ // Deprecated. Don't use bare jobjects; use a JavaRef as the input.
+ void Reset(JNIEnv* env, T obj) { JavaRef<T>::SetNewGlobalRef(env, obj); }
+
+ // Releases the global reference to the caller. The caller *must* delete the
+ // global reference when it is done with it. Note that calling a Java method
+ // is *not* a transfer of ownership and Release() should not be used.
+ T Release() { return static_cast<T>(JavaRef<T>::ReleaseInternal()); }
+};
+
+// Wrapper for a jobjectArray which supports input iteration, allowing Java
+// arrays to be iterated over with a range-based for loop, or used with
+// <algorithm> functions that accept input iterators.
+//
+// The iterator returns each object in the array in turn, wrapped in a
+// ScopedJavaLocalRef<T>. T will usually be jobject, but if you know that the
+// array contains a more specific type (such as jstring) you can use that
+// instead. This does not check the type at runtime!
+//
+// The wrapper holds a local reference to the array and only queries the size of
+// the array once, so must only be used as a stack-based object from the current
+// thread.
+//
+// Note that this does *not* update the contents of the array if you mutate the
+// returned ScopedJavaLocalRef.
+template <typename T>
+class JavaObjectArrayReader {
+ public:
+ class iterator {
+ public:
+ // We can only be an input iterator, as all richer iterator types must
+ // implement the multipass guarantee (always returning the same object for
+ // the same iterator position), which is not practical when returning
+ // temporary objects.
+ using iterator_category = std::input_iterator_tag;
+
+ using difference_type = ptrdiff_t;
+ using value_type = ScopedJavaLocalRef<T>;
+
+ // It doesn't make sense to return a reference type as the iterator creates
+ // temporary wrapper objects when dereferenced. Fortunately, it's not
+ // required that input iterators actually use references, and defining it
+ // as value_type is valid.
+ using reference = value_type;
+
+ // This exists to make operator-> work as expected: its return value must
+ // resolve to an actual pointer (otherwise the compiler just keeps calling
+ // operator-> on the return value until it does), so we need an extra level
+ // of indirection. This is sometimes called an "arrow proxy" or similar, and
+ // this version is adapted from base/value_iterators.h.
+ class pointer {
+ public:
+ explicit pointer(const reference& ref) : ref_(ref) {}
+ pointer(const pointer& ptr) = default;
+ pointer& operator=(const pointer& ptr) = delete;
+ reference* operator->() { return &ref_; }
+
+ private:
+ reference ref_;
+ };
+
+ iterator(const iterator&) = default;
+ ~iterator() = default;
+
+ iterator& operator=(const iterator&) = default;
+
+ bool operator==(const iterator& other) const {
+ DCHECK(reader_ == other.reader_);
+ return i_ == other.i_;
+ }
+
+ bool operator!=(const iterator& other) const {
+ DCHECK(reader_ == other.reader_);
+ return i_ != other.i_;
+ }
+
+ reference operator*() const {
+ DCHECK(i_ < reader_->size_);
+ // JNIEnv functions return unowned local references; take ownership with
+ // Adopt so that ~ScopedJavaLocalRef will release it automatically later.
+ return value_type::Adopt(
+ reader_->array_.env_,
+ static_cast<T>(reader_->array_.env_->GetObjectArrayElement(
+ reader_->array_.obj(), i_)));
+ }
+
+ pointer operator->() const { return pointer(operator*()); }
+
+ iterator& operator++() {
+ DCHECK(i_ < reader_->size_);
+ ++i_;
+ return *this;
+ }
+
+ iterator operator++(int) {
+ iterator old = *this;
+ ++*this;
+ return old;
+ }
+
+ private:
+ iterator(const JavaObjectArrayReader* reader, jsize i)
+ : reader_(reader), i_(i) {}
+ raw_ptr<const JavaObjectArrayReader<T>> reader_;
+ jsize i_;
+
+ friend JavaObjectArrayReader;
+ };
+
+ JavaObjectArrayReader(const JavaRef<jobjectArray>& array) : array_(array) {
+ size_ = array_.env_->GetArrayLength(array_.obj());
+ }
+
+ // Copy constructor to allow returning it from JavaRef::ReadElements().
+ JavaObjectArrayReader(const JavaObjectArrayReader& other) = default;
+
+ // Assignment operator for consistency with copy constructor.
+ JavaObjectArrayReader& operator=(const JavaObjectArrayReader& other) =
+ default;
+
+ // Allow move constructor and assignment since this owns a local ref.
+ JavaObjectArrayReader(JavaObjectArrayReader&& other) = default;
+ JavaObjectArrayReader& operator=(JavaObjectArrayReader&& other) = default;
+
+ bool empty() const { return size_ == 0; }
+
+ jsize size() const { return size_; }
+
+ iterator begin() const { return iterator(this, 0); }
+
+ iterator end() const { return iterator(this, size_); }
+
+ private:
+ ScopedJavaLocalRef<jobjectArray> array_;
+ jsize size_;
+
+ friend iterator;
+};
+
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_SCOPED_JAVA_REF_H_
diff --git a/chromium/base/android/scoped_java_ref_unittest.cc b/chromium/base/android/scoped_java_ref_unittest.cc
new file mode 100644
index 00000000000..b50a5d98fc9
--- /dev/null
+++ b/chromium/base/android/scoped_java_ref_unittest.cc
@@ -0,0 +1,340 @@
+// Copyright 2012 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/scoped_java_ref.h"
+
+#include <iterator>
+#include <type_traits>
+
+#include "base/android/jni_android.h"
+#include "base/android/jni_string.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+#define EXPECT_SAME_OBJECT(a, b) \
+ EXPECT_TRUE(env->IsSameObject((a).obj(), (b).obj()))
+
+namespace base {
+namespace android {
+
+namespace {
+int g_local_refs = 0;
+int g_global_refs = 0;
+
+const JNINativeInterface* g_previous_functions;
+
+jobject NewGlobalRef(JNIEnv* env, jobject obj) {
+ ++g_global_refs;
+ return g_previous_functions->NewGlobalRef(env, obj);
+}
+
+void DeleteGlobalRef(JNIEnv* env, jobject obj) {
+ --g_global_refs;
+ return g_previous_functions->DeleteGlobalRef(env, obj);
+}
+
+jobject NewLocalRef(JNIEnv* env, jobject obj) {
+ ++g_local_refs;
+ return g_previous_functions->NewLocalRef(env, obj);
+}
+
+void DeleteLocalRef(JNIEnv* env, jobject obj) {
+ --g_local_refs;
+ return g_previous_functions->DeleteLocalRef(env, obj);
+}
+} // namespace
+
+class ScopedJavaRefTest : public testing::Test {
+ protected:
+ void SetUp() override {
+ g_local_refs = 0;
+ g_global_refs = 0;
+ JNIEnv* env = AttachCurrentThread();
+ g_previous_functions = env->functions;
+ hooked_functions = *g_previous_functions;
+ env->functions = &hooked_functions;
+ // We inject our own functions in JNINativeInterface so we can keep track
+ // of the reference counting ourselves.
+ hooked_functions.NewGlobalRef = &NewGlobalRef;
+ hooked_functions.DeleteGlobalRef = &DeleteGlobalRef;
+ hooked_functions.NewLocalRef = &NewLocalRef;
+ hooked_functions.DeleteLocalRef = &DeleteLocalRef;
+ }
+
+ void TearDown() override {
+ JNIEnv* env = AttachCurrentThread();
+ env->functions = g_previous_functions;
+ }
+ // From JellyBean release, the instance of this struct provided in JNIEnv is
+ // read-only, so we deep copy it to allow individual functions to be hooked.
+ JNINativeInterface hooked_functions;
+};
+
+// The main purpose of this is testing the various conversions compile.
+TEST_F(ScopedJavaRefTest, Conversions) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jstring> str = ConvertUTF8ToJavaString(env, "string");
+ ScopedJavaGlobalRef<jstring> global(str);
+
+ // Contextual conversions to bool should be allowed.
+ EXPECT_TRUE(str);
+ EXPECT_FALSE(JavaRef<jobject>());
+
+ // All the types should convert from nullptr, even JavaRef.
+ {
+ JavaRef<jstring> null_ref(nullptr);
+ EXPECT_FALSE(null_ref);
+ ScopedJavaLocalRef<jobject> null_local(nullptr);
+ EXPECT_FALSE(null_local);
+ ScopedJavaGlobalRef<jarray> null_global(nullptr);
+ EXPECT_FALSE(null_global);
+ }
+
+ // Local and global refs should {copy,move}-{construct,assign}.
+ // Moves should leave the source as null.
+ {
+ ScopedJavaLocalRef<jstring> str2(str);
+ EXPECT_SAME_OBJECT(str2, str);
+ ScopedJavaLocalRef<jstring> str3(std::move(str2));
+ EXPECT_SAME_OBJECT(str3, str);
+ EXPECT_FALSE(str2);
+ ScopedJavaLocalRef<jstring> str4;
+ str4 = str;
+ EXPECT_SAME_OBJECT(str4, str);
+ ScopedJavaLocalRef<jstring> str5;
+ str5 = std::move(str4);
+ EXPECT_SAME_OBJECT(str5, str);
+ EXPECT_FALSE(str4);
+ }
+ {
+ ScopedJavaGlobalRef<jstring> str2(global);
+ EXPECT_SAME_OBJECT(str2, str);
+ ScopedJavaGlobalRef<jstring> str3(std::move(str2));
+ EXPECT_SAME_OBJECT(str3, str);
+ EXPECT_FALSE(str2);
+ ScopedJavaGlobalRef<jstring> str4;
+ str4 = global;
+ EXPECT_SAME_OBJECT(str4, str);
+ ScopedJavaGlobalRef<jstring> str5;
+ str5 = std::move(str4);
+ EXPECT_SAME_OBJECT(str5, str);
+ EXPECT_FALSE(str4);
+ }
+
+ // As above but going from jstring to jobject.
+ {
+ ScopedJavaLocalRef<jobject> obj2(str);
+ EXPECT_SAME_OBJECT(obj2, str);
+ ScopedJavaLocalRef<jobject> obj3(std::move(obj2));
+ EXPECT_SAME_OBJECT(obj3, str);
+ EXPECT_FALSE(obj2);
+ ScopedJavaLocalRef<jobject> obj4;
+ obj4 = str;
+ EXPECT_SAME_OBJECT(obj4, str);
+ ScopedJavaLocalRef<jobject> obj5;
+ obj5 = std::move(obj4);
+ EXPECT_SAME_OBJECT(obj5, str);
+ EXPECT_FALSE(obj4);
+ }
+ {
+ ScopedJavaGlobalRef<jobject> obj2(global);
+ EXPECT_SAME_OBJECT(obj2, str);
+ ScopedJavaGlobalRef<jobject> obj3(std::move(obj2));
+ EXPECT_SAME_OBJECT(obj3, str);
+ EXPECT_FALSE(obj2);
+ ScopedJavaGlobalRef<jobject> obj4;
+ obj4 = global;
+ EXPECT_SAME_OBJECT(obj4, str);
+ ScopedJavaGlobalRef<jobject> obj5;
+ obj5 = std::move(obj4);
+ EXPECT_SAME_OBJECT(obj5, str);
+ EXPECT_FALSE(obj4);
+ }
+
+ // Explicit copy construction or assignment between global<->local is allowed,
+ // but not implicit conversions.
+ {
+ ScopedJavaLocalRef<jstring> new_local(global);
+ EXPECT_SAME_OBJECT(new_local, str);
+ new_local = global;
+ EXPECT_SAME_OBJECT(new_local, str);
+ ScopedJavaGlobalRef<jstring> new_global(str);
+ EXPECT_SAME_OBJECT(new_global, str);
+ new_global = str;
+ EXPECT_SAME_OBJECT(new_local, str);
+ static_assert(!std::is_convertible<ScopedJavaLocalRef<jobject>,
+ ScopedJavaGlobalRef<jobject>>::value,
+ "");
+ static_assert(!std::is_convertible<ScopedJavaGlobalRef<jobject>,
+ ScopedJavaLocalRef<jobject>>::value,
+ "");
+ }
+
+ // Converting between local/global while also converting to jobject also works
+ // because JavaRef<jobject> is the base class.
+ {
+ ScopedJavaGlobalRef<jobject> global_obj(str);
+ ScopedJavaLocalRef<jobject> local_obj(global);
+ const JavaRef<jobject>& obj_ref1(str);
+ const JavaRef<jobject>& obj_ref2(global);
+ EXPECT_SAME_OBJECT(obj_ref1, obj_ref2);
+ EXPECT_SAME_OBJECT(global_obj, obj_ref2);
+ }
+ global.Reset(str);
+ const JavaRef<jstring>& str_ref = str;
+ EXPECT_EQ("string", ConvertJavaStringToUTF8(str_ref));
+ str.Reset();
+}
+
+TEST_F(ScopedJavaRefTest, RefCounts) {
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jstring> str;
+ // The ConvertJavaStringToUTF8 below creates a new string that would normally
+ // return a local ref. We simulate that by starting the g_local_refs count at
+ // 1.
+ g_local_refs = 1;
+ str.Reset(ConvertUTF8ToJavaString(env, "string"));
+ EXPECT_EQ(1, g_local_refs);
+ EXPECT_EQ(0, g_global_refs);
+ {
+ ScopedJavaGlobalRef<jstring> global_str(str);
+ ScopedJavaGlobalRef<jobject> global_obj(global_str);
+ EXPECT_EQ(1, g_local_refs);
+ EXPECT_EQ(2, g_global_refs);
+
+ auto str2 = ScopedJavaLocalRef<jstring>::Adopt(env, str.Release());
+ EXPECT_EQ(1, g_local_refs);
+ {
+ ScopedJavaLocalRef<jstring> str3(str2);
+ EXPECT_EQ(2, g_local_refs);
+ }
+ EXPECT_EQ(1, g_local_refs);
+ {
+ ScopedJavaLocalRef<jstring> str4((ScopedJavaLocalRef<jstring>(str2)));
+ EXPECT_EQ(2, g_local_refs);
+ }
+ EXPECT_EQ(1, g_local_refs);
+ {
+ ScopedJavaLocalRef<jstring> str5;
+ str5 = ScopedJavaLocalRef<jstring>(str2);
+ EXPECT_EQ(2, g_local_refs);
+ }
+ EXPECT_EQ(1, g_local_refs);
+ str2.Reset();
+ EXPECT_EQ(0, g_local_refs);
+ global_str.Reset();
+ EXPECT_EQ(1, g_global_refs);
+ ScopedJavaGlobalRef<jobject> global_obj2(global_obj);
+ EXPECT_EQ(2, g_global_refs);
+ }
+
+ EXPECT_EQ(0, g_local_refs);
+ EXPECT_EQ(0, g_global_refs);
+}
+
+class JavaObjectArrayReaderTest : public testing::Test {
+ protected:
+ void SetUp() override {
+ JNIEnv* env = AttachCurrentThread();
+ int_class_ = GetClass(env, "java/lang/Integer");
+ int_constructor_ = MethodID::Get<MethodID::TYPE_INSTANCE>(
+ env, int_class_.obj(), "<init>", "(I)V");
+ array_ = MakeArray(array_len_);
+
+ // Make array_len_ different Integer objects, keep a reference to each,
+ // and add them to the array.
+ for (jint i = 0; i < array_len_; ++i) {
+ jobject member = env->NewObject(int_class_.obj(), int_constructor_, i);
+ ASSERT_NE(member, nullptr);
+ array_members_[i] = ScopedJavaLocalRef<jobject>::Adopt(env, member);
+ env->SetObjectArrayElement(array_.obj(), i, member);
+ }
+ }
+
+ // Make an Integer[] with len elements, all initialized to null.
+ ScopedJavaLocalRef<jobjectArray> MakeArray(jsize len) {
+ JNIEnv* env = AttachCurrentThread();
+ jobjectArray array = env->NewObjectArray(len, int_class_.obj(), nullptr);
+ EXPECT_NE(array, nullptr);
+ return ScopedJavaLocalRef<jobjectArray>::Adopt(env, array);
+ }
+
+ static constexpr jsize array_len_ = 10;
+ ScopedJavaLocalRef<jclass> int_class_;
+ jmethodID int_constructor_;
+ ScopedJavaLocalRef<jobject> array_members_[array_len_];
+ ScopedJavaLocalRef<jobjectArray> array_;
+};
+
+// Must actually define the variable until C++17 :(
+constexpr jsize JavaObjectArrayReaderTest::array_len_;
+
+TEST_F(JavaObjectArrayReaderTest, ZeroLengthArray) {
+ JavaObjectArrayReader<jobject> zero_length(MakeArray(0));
+ EXPECT_TRUE(zero_length.empty());
+ EXPECT_EQ(zero_length.size(), 0);
+ EXPECT_EQ(zero_length.begin(), zero_length.end());
+}
+
+// Verify that we satisfy the C++ "InputIterator" named requirements.
+TEST_F(JavaObjectArrayReaderTest, InputIteratorRequirements) {
+ typedef JavaObjectArrayReader<jobject>::iterator It;
+
+ JNIEnv* env = AttachCurrentThread();
+ JavaObjectArrayReader<jobject> reader(array_);
+ It i = reader.begin();
+
+ EXPECT_TRUE(std::is_copy_constructible<It>::value);
+ It copy = i;
+ EXPECT_EQ(copy, i);
+ EXPECT_EQ(It(i), i);
+
+ EXPECT_TRUE(std::is_copy_assignable<It>::value);
+ It assign = reader.end();
+ It& assign2 = (assign = i);
+ EXPECT_EQ(assign, i);
+ EXPECT_EQ(assign2, assign);
+
+ EXPECT_TRUE(std::is_destructible<It>::value);
+
+ // Swappable
+ It left = reader.begin(), right = reader.end();
+ std::swap(left, right);
+ EXPECT_EQ(left, reader.end());
+ EXPECT_EQ(right, reader.begin());
+
+ // Basic check that iterator_traits works
+ bool same_type = std::is_same<std::iterator_traits<It>::iterator_category,
+ std::input_iterator_tag>::value;
+ EXPECT_TRUE(same_type);
+
+ // Comparisons
+ EXPECT_EQ(reader.begin(), reader.begin());
+ EXPECT_NE(reader.begin(), reader.end());
+
+ // Dereferencing
+ ScopedJavaLocalRef<jobject> o = *(reader.begin());
+ EXPECT_SAME_OBJECT(o, array_members_[0]);
+ EXPECT_TRUE(env->IsSameObject(o.obj(), reader.begin()->obj()));
+
+ // Incrementing
+ It preinc = ++(reader.begin());
+ EXPECT_SAME_OBJECT(*preinc, array_members_[1]);
+ It postinc = reader.begin();
+ EXPECT_SAME_OBJECT(*postinc++, array_members_[0]);
+ EXPECT_SAME_OBJECT(*postinc, array_members_[1]);
+}
+
+// Check that range-based for and the convenience function work as expected.
+TEST_F(JavaObjectArrayReaderTest, RangeBasedFor) {
+ JNIEnv* env = AttachCurrentThread();
+
+ int i = 0;
+ for (ScopedJavaLocalRef<jobject> element : array_.ReadElements<jobject>()) {
+ EXPECT_SAME_OBJECT(element, array_members_[i++]);
+ }
+ EXPECT_EQ(i, array_len_);
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/statistics_recorder_android.cc b/chromium/base/android/statistics_recorder_android.cc
new file mode 100644
index 00000000000..4d7fc80145a
--- /dev/null
+++ b/chromium/base/android/statistics_recorder_android.cc
@@ -0,0 +1,28 @@
+// Copyright 2016 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <string>
+
+#include "base/android/jni_string.h"
+#include "base/base_jni_headers/StatisticsRecorderAndroid_jni.h"
+#include "base/metrics/histogram_base.h"
+#include "base/metrics/statistics_recorder.h"
+#include "base/system/sys_info.h"
+
+using base::android::JavaParamRef;
+using base::android::ConvertUTF8ToJavaString;
+
+namespace base {
+namespace android {
+
+static ScopedJavaLocalRef<jstring> JNI_StatisticsRecorderAndroid_ToJson(
+ JNIEnv* env,
+ jint verbosityLevel) {
+ return ConvertUTF8ToJavaString(
+ env, base::StatisticsRecorder::ToJSON(
+ static_cast<JSONVerbosityLevel>(verbosityLevel)));
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/sys_utils.cc b/chromium/base/android/sys_utils.cc
new file mode 100644
index 00000000000..51c9fa0e893
--- /dev/null
+++ b/chromium/base/android/sys_utils.cc
@@ -0,0 +1,55 @@
+// Copyright 2013 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/sys_utils.h"
+
+#include <memory>
+
+#include "base/android/build_info.h"
+#include "base/base_jni_headers/SysUtils_jni.h"
+#include "base/process/process_metrics.h"
+#include "base/system/sys_info.h"
+#include "base/trace_event/base_tracing.h"
+
+namespace base {
+namespace android {
+
+bool SysUtils::IsLowEndDeviceFromJni() {
+ JNIEnv* env = AttachCurrentThread();
+ return Java_SysUtils_isLowEndDevice(env);
+}
+
+bool SysUtils::IsCurrentlyLowMemory() {
+ JNIEnv* env = AttachCurrentThread();
+ return Java_SysUtils_isCurrentlyLowMemory(env);
+}
+
+// static
+int SysUtils::AmountOfPhysicalMemoryKB() {
+ JNIEnv* env = AttachCurrentThread();
+ return Java_SysUtils_amountOfPhysicalMemoryKB(env);
+}
+
+// Logs the number of minor / major page faults to tracing (and also the time to
+// collect) the metrics. Does nothing if tracing is not enabled.
+static void JNI_SysUtils_LogPageFaultCountToTracing(JNIEnv* env) {
+ // This is racy, but we are OK losing data, and collecting it is potentially
+ // expensive (reading and parsing a file).
+ bool enabled;
+ TRACE_EVENT_CATEGORY_GROUP_ENABLED("startup", &enabled);
+ if (!enabled)
+ return;
+ TRACE_EVENT_BEGIN2("memory", "CollectPageFaultCount", "minor", 0, "major", 0);
+ std::unique_ptr<base::ProcessMetrics> process_metrics(
+ base::ProcessMetrics::CreateProcessMetrics(
+ base::GetCurrentProcessHandle()));
+ base::PageFaultCounts counts;
+ process_metrics->GetPageFaultCounts(&counts);
+ TRACE_EVENT_END2("memory", "CollectPageFaults", "minor", counts.minor,
+ "major", counts.major);
+}
+
+} // namespace android
+
+} // namespace base
diff --git a/chromium/base/android/sys_utils.h b/chromium/base/android/sys_utils.h
new file mode 100644
index 00000000000..c4ddd2176a5
--- /dev/null
+++ b/chromium/base/android/sys_utils.h
@@ -0,0 +1,26 @@
+// Copyright 2013 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_SYS_UTILS_H_
+#define BASE_ANDROID_SYS_UTILS_H_
+
+#include "base/android/jni_android.h"
+
+namespace base {
+namespace android {
+
+class BASE_EXPORT SysUtils {
+ public:
+ // Returns true iff this is a low-end device.
+ static bool IsLowEndDeviceFromJni();
+ // Returns true if system has low available memory.
+ static bool IsCurrentlyLowMemory();
+ // Returns amount of physical ram detected in KB, or 0 if detection failed.
+ static int AmountOfPhysicalMemoryKB();
+};
+
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_SYS_UTILS_H_
diff --git a/chromium/base/android/sys_utils_unittest.cc b/chromium/base/android/sys_utils_unittest.cc
new file mode 100644
index 00000000000..be89f4a64ce
--- /dev/null
+++ b/chromium/base/android/sys_utils_unittest.cc
@@ -0,0 +1,24 @@
+// Copyright 2013 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <stddef.h>
+#include <unistd.h>
+
+#include "base/system/sys_info.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace base {
+namespace android {
+
+TEST(SysUtils, AmountOfPhysicalMemory) {
+ // Check that the RAM size reported by sysconf() matches the one
+ // computed by base::SysInfo::AmountOfPhysicalMemory().
+ size_t sys_ram_size =
+ static_cast<size_t>(sysconf(_SC_PHYS_PAGES) * PAGE_SIZE);
+ EXPECT_EQ(sys_ram_size,
+ static_cast<size_t>(SysInfo::AmountOfPhysicalMemory()));
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/task_scheduler/post_task_android.cc b/chromium/base/android/task_scheduler/post_task_android.cc
new file mode 100644
index 00000000000..6bca848f601
--- /dev/null
+++ b/chromium/base/android/task_scheduler/post_task_android.cc
@@ -0,0 +1,39 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/task_scheduler/post_task_android.h"
+
+#include "base/android/task_scheduler/task_runner_android.h"
+#include "base/base_jni_headers/PostTask_jni.h"
+
+namespace base {
+
+// static
+void PostTaskAndroid::SignalNativeSchedulerReady() {
+ Java_PostTask_onNativeSchedulerReady(base::android::AttachCurrentThread());
+}
+
+// static
+void PostTaskAndroid::SignalNativeSchedulerShutdownForTesting() {
+ Java_PostTask_onNativeSchedulerShutdownForTesting(
+ base::android::AttachCurrentThread());
+}
+
+void JNI_PostTask_PostDelayedTask(
+ JNIEnv* env,
+ jint priority,
+ jboolean may_block,
+ jboolean use_thread_pool,
+ jbyte extension_id,
+ const base::android::JavaParamRef<jbyteArray>& extension_data,
+ const base::android::JavaParamRef<jobject>& task,
+ jlong delay,
+ const base::android::JavaParamRef<jstring>& runnable_class_name) {
+ TaskRunnerAndroid::Create(env, static_cast<jint>(TaskRunnerType::BASE),
+ priority, may_block, use_thread_pool, extension_id,
+ extension_data)
+ ->PostDelayedTask(env, task, delay, runnable_class_name);
+}
+
+} // namespace base
diff --git a/chromium/base/android/task_scheduler/post_task_android.h b/chromium/base/android/task_scheduler/post_task_android.h
new file mode 100644
index 00000000000..2588eae950c
--- /dev/null
+++ b/chromium/base/android/task_scheduler/post_task_android.h
@@ -0,0 +1,31 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_TASK_SCHEDULER_POST_TASK_ANDROID_H_
+#define BASE_ANDROID_TASK_SCHEDULER_POST_TASK_ANDROID_H_
+
+#include "base/android/jni_weak_ref.h"
+#include "base/base_export.h"
+
+namespace base {
+
+// C++ interface for PostTask.java
+class BASE_EXPORT PostTaskAndroid {
+ public:
+ PostTaskAndroid() = delete;
+ PostTaskAndroid(const PostTaskAndroid&) = delete;
+ PostTaskAndroid& operator=(const PostTaskAndroid&) = delete;
+
+ // Routes tasks posted via the Java PostTask APIs through the C++ PostTask
+ // APIs. Invoked once the C++ PostTask APIs are fully initialized.
+ static void SignalNativeSchedulerReady();
+
+ // Signals that the C++ PostTask APIs have shutdown. Needed to make unit tests
+ // that repeatedly create and destroy the scheduler work.
+ static void SignalNativeSchedulerShutdownForTesting();
+};
+
+} // namespace base
+
+#endif // BASE_ANDROID_TASK_SCHEDULER_POST_TASK_ANDROID_H_
diff --git a/chromium/base/android/task_scheduler/task_runner_android.cc b/chromium/base/android/task_scheduler/task_runner_android.cc
new file mode 100644
index 00000000000..304b8af7e8c
--- /dev/null
+++ b/chromium/base/android/task_scheduler/task_runner_android.cc
@@ -0,0 +1,183 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/task_scheduler/task_runner_android.h"
+
+#include <array>
+#include <string>
+#include <utility>
+
+#include "base/android/jni_string.h"
+#include "base/android_runtime_jni_headers/Runnable_jni.h"
+#include "base/base_jni_headers/TaskRunnerImpl_jni.h"
+#include "base/check.h"
+#include "base/functional/bind.h"
+#include "base/strings/strcat.h"
+#include "base/task/task_executor.h"
+#include "base/task/thread_pool/thread_pool_impl.h"
+#include "base/task/thread_pool/thread_pool_instance.h"
+#include "base/time/time.h"
+#include "base/trace_event/base_tracing.h"
+
+namespace base {
+
+// As a class so it can be friend'ed.
+class AndroidTaskTraits {
+ public:
+ AndroidTaskTraits() = delete;
+
+ static TaskTraits Create(
+ JNIEnv* env,
+ jint priority,
+ jboolean may_block,
+ jbyte extension_id,
+ const base::android::JavaParamRef<jbyteArray>& extension_data) {
+ return TaskTraits(
+ static_cast<TaskPriority>(priority), may_block,
+ TaskTraitsExtensionStorage(static_cast<uint8_t>(extension_id),
+ GetExtensionData(env, extension_data)));
+ }
+
+ private:
+ static std::array<uint8_t, TaskTraitsExtensionStorage::kStorageSize>
+ GetExtensionData(
+ JNIEnv* env,
+ const base::android::JavaParamRef<jbyteArray>& array_object) {
+ if (env->IsSameObject(array_object, nullptr))
+ return std::array<uint8_t, TaskTraitsExtensionStorage::kStorageSize>();
+
+ jbyteArray array = static_cast<jbyteArray>(array_object);
+ DCHECK_EQ(env->GetArrayLength(array),
+ static_cast<jsize>(TaskTraitsExtensionStorage::kStorageSize));
+
+ std::array<uint8_t, TaskTraitsExtensionStorage::kStorageSize> result;
+ jbyte* src_bytes = env->GetByteArrayElements(array, nullptr);
+ memcpy(&result[0], src_bytes, TaskTraitsExtensionStorage::kStorageSize);
+ env->ReleaseByteArrayElements(array, src_bytes, JNI_ABORT);
+ return result;
+ }
+};
+
+namespace {
+
+// TODO(1026641): Make destination explicit (separate APIs) on Java side too and
+// get rid of the need for TaskTraitsExtension/etc to reach the UI thread.
+TaskExecutor* GetTaskExecutor(bool use_thread_pool, const TaskTraits& traits) {
+ const bool has_extension =
+ traits.extension_id() != TaskTraitsExtensionStorage::kInvalidExtensionId;
+ DCHECK(has_extension ^ use_thread_pool)
+ << "A destination (e.g. ThreadPool or UiThreadTaskTraits) is required.";
+
+ if (use_thread_pool) {
+ DCHECK(ThreadPoolInstance::Get())
+ << "Hint: if this is in a unit test, you're likely merely missing a "
+ "base::test::TaskEnvironment member in your fixture (or your "
+ "fixture is using a base::test::SingleThreadTaskEnvironment and now "
+ "needs a full base::test::TaskEnvironment).\n";
+ return static_cast<internal::ThreadPoolImpl*>(ThreadPoolInstance::Get());
+ }
+
+ // Assume |has_extension| per above invariant.
+ TaskExecutor* executor = GetRegisteredTaskExecutorForTraits(traits);
+ DCHECK(executor)
+ << "A TaskExecutor wasn't yet registered for this extension.\n"
+ "Hint: if this is in a unit test, you're likely missing a "
+ "content::BrowserTaskEnvironment member in your fixture.";
+ return executor;
+}
+
+void RunJavaTask(base::android::ScopedJavaGlobalRef<jobject> task,
+ const std::string& runnable_class_name) {
+ // JNIEnv is thread specific, but we don't know which thread we'll be run on
+ // so we must look it up.
+ std::string event_name = base::StrCat({"JniPostTask: ", runnable_class_name});
+ TRACE_EVENT("toplevel", nullptr, [&](::perfetto::EventContext& ctx) {
+ ctx.event()->set_name(event_name.c_str());
+ });
+ JNI_Runnable::Java_Runnable_run(base::android::AttachCurrentThread(), task);
+}
+
+} // namespace
+
+jlong JNI_TaskRunnerImpl_Init(
+ JNIEnv* env,
+ jint task_runner_type,
+ jint priority,
+ jboolean may_block,
+ jboolean use_thread_pool,
+ jbyte extension_id,
+ const base::android::JavaParamRef<jbyteArray>& extension_data) {
+ TaskRunnerAndroid* task_runner =
+ TaskRunnerAndroid::Create(env, task_runner_type, priority, may_block,
+ use_thread_pool, extension_id, extension_data)
+ .release();
+ return reinterpret_cast<intptr_t>(task_runner);
+}
+
+TaskRunnerAndroid::TaskRunnerAndroid(scoped_refptr<TaskRunner> task_runner,
+ TaskRunnerType type)
+ : task_runner_(std::move(task_runner)), type_(type) {}
+
+TaskRunnerAndroid::~TaskRunnerAndroid() = default;
+
+void TaskRunnerAndroid::Destroy(JNIEnv* env) {
+ // This could happen on any thread.
+ delete this;
+}
+
+void TaskRunnerAndroid::PostDelayedTask(
+ JNIEnv* env,
+ const base::android::JavaRef<jobject>& task,
+ jlong delay,
+ jstring runnable_class_name) {
+ // This could be run on any java thread, so we can't cache |env| in the
+ // BindOnce because JNIEnv is thread specific.
+ task_runner_->PostDelayedTask(
+ FROM_HERE,
+ base::BindOnce(
+ &RunJavaTask, base::android::ScopedJavaGlobalRef<jobject>(task),
+ android::ConvertJavaStringToUTF8(env, runnable_class_name)),
+ Milliseconds(delay));
+}
+
+bool TaskRunnerAndroid::BelongsToCurrentThread(JNIEnv* env) {
+ // TODO(crbug.com/1026641): Move BelongsToCurrentThread from TaskRunnerImpl to
+ // SequencedTaskRunnerImpl on the Java side too.
+ if (type_ == TaskRunnerType::BASE)
+ return false;
+ return static_cast<SequencedTaskRunner*>(task_runner_.get())
+ ->RunsTasksInCurrentSequence();
+}
+
+// static
+std::unique_ptr<TaskRunnerAndroid> TaskRunnerAndroid::Create(
+ JNIEnv* env,
+ jint task_runner_type,
+ jint priority,
+ jboolean may_block,
+ jboolean use_thread_pool,
+ jbyte extension_id,
+ const base::android::JavaParamRef<jbyteArray>& extension_data) {
+ const TaskTraits task_traits = AndroidTaskTraits::Create(
+ env, priority, may_block, extension_id, extension_data);
+ TaskExecutor* const task_executor =
+ GetTaskExecutor(use_thread_pool, task_traits);
+ scoped_refptr<TaskRunner> task_runner;
+ switch (static_cast<TaskRunnerType>(task_runner_type)) {
+ case TaskRunnerType::BASE:
+ task_runner = task_executor->CreateTaskRunner(task_traits);
+ break;
+ case TaskRunnerType::SEQUENCED:
+ task_runner = task_executor->CreateSequencedTaskRunner(task_traits);
+ break;
+ case TaskRunnerType::SINGLE_THREAD:
+ task_runner = task_executor->CreateSingleThreadTaskRunner(
+ task_traits, SingleThreadTaskRunnerThreadMode::SHARED);
+ break;
+ }
+ return std::make_unique<TaskRunnerAndroid>(
+ task_runner, static_cast<TaskRunnerType>(task_runner_type));
+}
+
+} // namespace base
diff --git a/chromium/base/android/task_scheduler/task_runner_android.h b/chromium/base/android/task_scheduler/task_runner_android.h
new file mode 100644
index 00000000000..bb439c9477a
--- /dev/null
+++ b/chromium/base/android/task_scheduler/task_runner_android.h
@@ -0,0 +1,55 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_TASK_SCHEDULER_TASK_RUNNER_ANDROID_H_
+#define BASE_ANDROID_TASK_SCHEDULER_TASK_RUNNER_ANDROID_H_
+
+#include <memory>
+
+#include "base/android/jni_weak_ref.h"
+#include "base/task/single_thread_task_runner.h"
+
+namespace base {
+
+// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.base.task
+enum class TaskRunnerType { BASE, SEQUENCED, SINGLE_THREAD };
+
+// Native implementation backing TaskRunnerImpl.java which posts java tasks onto
+// a C++ TaskRunner.
+class TaskRunnerAndroid {
+ public:
+ explicit TaskRunnerAndroid(scoped_refptr<TaskRunner> task_runner,
+ TaskRunnerType type);
+
+ TaskRunnerAndroid(const TaskRunnerAndroid&) = delete;
+ TaskRunnerAndroid& operator=(const TaskRunnerAndroid&) = delete;
+
+ ~TaskRunnerAndroid();
+
+ void Destroy(JNIEnv* env);
+
+ void PostDelayedTask(JNIEnv* env,
+ const base::android::JavaRef<jobject>& task,
+ jlong delay,
+ jstring runnable_class_name);
+
+ bool BelongsToCurrentThread(JNIEnv* env);
+
+ static std::unique_ptr<TaskRunnerAndroid> Create(
+ JNIEnv* env,
+ jint task_runner_type,
+ jint priority,
+ jboolean may_block,
+ jboolean use_thread_pool,
+ jbyte extension_id,
+ const base::android::JavaParamRef<jbyteArray>& extension_data);
+
+ private:
+ const scoped_refptr<TaskRunner> task_runner_;
+ const TaskRunnerType type_;
+};
+
+} // namespace base
+
+#endif // BASE_ANDROID_TASK_SCHEDULER_TASK_RUNNER_ANDROID_H_
diff --git a/chromium/base/android/thread_instruction_count.cc b/chromium/base/android/thread_instruction_count.cc
new file mode 100644
index 00000000000..b063430d1a9
--- /dev/null
+++ b/chromium/base/android/thread_instruction_count.cc
@@ -0,0 +1,90 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/thread_instruction_count.h"
+
+#include "base/check_op.h"
+#include "base/logging.h"
+#include "base/no_destructor.h"
+#include "base/numerics/safe_conversions.h"
+#include "base/threading/thread_local_storage.h"
+
+#include <linux/perf_event.h>
+#include <sys/syscall.h>
+#include <unistd.h>
+
+namespace base {
+namespace android {
+
+namespace {
+
+constexpr int kPerfFdOpenFailed = -1;
+
+ThreadLocalStorage::Slot& InstructionCounterFdSlot() {
+ static NoDestructor<ThreadLocalStorage::Slot> fd_slot([](void* fd_ptr) {
+ int fd = checked_cast<int>(reinterpret_cast<intptr_t>(fd_ptr));
+ if (fd > 0)
+ close(fd);
+ });
+ return *fd_slot;
+}
+
+// Opens a new file descriptor that emits the value of
+// PERF_COUNT_HW_INSTRUCTIONS in userspace (excluding kernel and hypervisor
+// instructions) for the given |thread_id|, or 0 for the calling thread.
+//
+// Returns kPerfFdOpenFailed if opening the file descriptor failed.
+int OpenInstructionCounterFdForThread(int thread_id) {
+ struct perf_event_attr pe = {0};
+ pe.type = PERF_TYPE_HARDWARE;
+ pe.size = sizeof(struct perf_event_attr);
+ pe.config = PERF_COUNT_HW_INSTRUCTIONS;
+ pe.exclude_kernel = 1;
+ pe.exclude_hv = 1;
+
+ long fd = syscall(__NR_perf_event_open, &pe, thread_id, /* cpu */ -1,
+ /* group_fd */ -1, /* flags */ 0);
+ if (fd < 0) {
+ PLOG(ERROR) << "perf_event_open: omitting instruction counters";
+ return kPerfFdOpenFailed;
+ }
+ return checked_cast<int>(fd);
+}
+
+// Retrieves the active perf counter FD for the current thread, performing
+// lazy-initialization if necessary.
+int InstructionCounterFdForCurrentThread() {
+ auto& slot = InstructionCounterFdSlot();
+ int fd = checked_cast<int>(reinterpret_cast<intptr_t>(slot.Get()));
+ if (fd == 0) {
+ fd = OpenInstructionCounterFdForThread(0);
+ slot.Set(reinterpret_cast<void*>(fd));
+ }
+ return fd;
+}
+
+} // namespace
+
+// static
+bool ThreadInstructionCount::IsSupported() {
+ return InstructionCounterFdForCurrentThread() > 0;
+}
+
+// static
+ThreadInstructionCount ThreadInstructionCount::Now() {
+ DCHECK(IsSupported());
+ int fd = InstructionCounterFdForCurrentThread();
+ if (fd <= 0)
+ return ThreadInstructionCount();
+
+ uint64_t instructions = 0;
+ ssize_t bytes_read = read(fd, &instructions, sizeof(instructions));
+ CHECK_EQ(bytes_read, static_cast<ssize_t>(sizeof(instructions)))
+ << "Short reads of small size from kernel memory is not expected. If "
+ "this fails, use HANDLE_EINTR.";
+ return ThreadInstructionCount(instructions);
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/thread_instruction_count.h b/chromium/base/android/thread_instruction_count.h
new file mode 100644
index 00000000000..7553076bb2a
--- /dev/null
+++ b/chromium/base/android/thread_instruction_count.h
@@ -0,0 +1,63 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_THREAD_INSTRUCTION_COUNT_H_
+#define BASE_ANDROID_THREAD_INSTRUCTION_COUNT_H_
+
+#include <stdint.h>
+
+#include "base/base_export.h"
+
+namespace base {
+namespace android {
+
+// Represents the number of instructions that were retired between two samples
+// of a thread's performance counters.
+class BASE_EXPORT ThreadInstructionDelta {
+ public:
+ constexpr ThreadInstructionDelta() : delta_(0) {}
+ explicit constexpr ThreadInstructionDelta(int64_t delta) : delta_(delta) {}
+
+ constexpr int64_t ToInternalValue() const { return delta_; }
+
+ private:
+ int64_t delta_;
+};
+
+// Helper class for reading the current count of instructions retired for the
+// current thread via ThreadInstructionCount::Now(). Does *not* count
+// instructions retired while running in the kernel.
+//
+// Limitations:
+// * Crashes when used in sandboxed process
+// * Works on a userdebug build of Android 12, kernel 4.19. May require extra
+// effort to allow on later Android releases and kernel versions.
+class BASE_EXPORT ThreadInstructionCount {
+ public:
+ // Returns true if the platform supports hardware retired instruction
+ // counters. May crash in sandboxed processes.
+ static bool IsSupported();
+
+ // Returns the number of retired instructions relative to some epoch count,
+ // or 0 if getting the current instruction count failed / is disabled.
+ static ThreadInstructionCount Now();
+
+ explicit constexpr ThreadInstructionCount(uint64_t value = 0)
+ : value_(value) {}
+
+ constexpr ThreadInstructionDelta operator-(
+ ThreadInstructionCount other) const {
+ return ThreadInstructionDelta(static_cast<int64_t>(value_ - other.value_));
+ }
+
+ constexpr uint64_t ToInternalValue() const { return value_; }
+
+ private:
+ uint64_t value_;
+};
+
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_THREAD_INSTRUCTION_COUNT_H_
diff --git a/chromium/base/android/timezone_utils.cc b/chromium/base/android/timezone_utils.cc
new file mode 100644
index 00000000000..529ad003d85
--- /dev/null
+++ b/chromium/base/android/timezone_utils.cc
@@ -0,0 +1,24 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/timezone_utils.h"
+
+#include <string>
+
+#include "base/android/jni_android.h"
+#include "base/android/jni_string.h"
+#include "base/base_jni_headers/TimezoneUtils_jni.h"
+
+namespace base {
+namespace android {
+
+std::u16string GetDefaultTimeZoneId() {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ ScopedJavaLocalRef<jstring> timezone_id =
+ Java_TimezoneUtils_getDefaultTimeZoneId(env);
+ return ConvertJavaStringToUTF16(timezone_id);
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/timezone_utils.h b/chromium/base/android/timezone_utils.h
new file mode 100644
index 00000000000..0f3d711b831
--- /dev/null
+++ b/chromium/base/android/timezone_utils.h
@@ -0,0 +1,23 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_TIMEZONE_UTILS_H_
+#define BASE_ANDROID_TIMEZONE_UTILS_H_
+
+#include <jni.h>
+
+#include <string>
+
+#include "base/base_export.h"
+
+namespace base {
+namespace android {
+
+// Return an ICU timezone created from the host timezone.
+BASE_EXPORT std::u16string GetDefaultTimeZoneId();
+
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_TIMEZONE_UTILS_H_
diff --git a/chromium/base/android/trace_event_binding.cc b/chromium/base/android/trace_event_binding.cc
new file mode 100644
index 00000000000..7d15cba063a
--- /dev/null
+++ b/chromium/base/android/trace_event_binding.cc
@@ -0,0 +1,362 @@
+// Copyright 2014 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <jni.h>
+
+#include <set>
+
+#include "base/android/jni_string.h"
+#include "base/android/trace_event_binding.h"
+#include "base/base_jni_headers/TraceEvent_jni.h"
+#include "base/metrics/histogram_macros.h"
+#include "base/trace_event/base_tracing.h"
+#include "base/tracing_buildflags.h"
+
+#if BUILDFLAG(ENABLE_BASE_TRACING)
+#include "base/trace_event/trace_event_impl.h" // no-presubmit-check
+#endif // BUILDFLAG(ENABLE_BASE_TRACING)
+
+namespace base {
+namespace android {
+
+#if BUILDFLAG(ENABLE_BASE_TRACING)
+
+namespace {
+
+constexpr const char kAndroidViewHierarchyTraceCategory[] =
+ TRACE_DISABLED_BY_DEFAULT("android_view_hierarchy");
+constexpr const char kAndroidViewHierarchyEventName[] = "AndroidView";
+
+class TraceEnabledObserver
+ : public trace_event::TraceLog::EnabledStateObserver {
+ public:
+ ~TraceEnabledObserver() override = default;
+
+ // trace_event::TraceLog::EnabledStateObserver:
+ void OnTraceLogEnabled() override {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ base::android::Java_TraceEvent_setEnabled(env, true);
+ if (base::trace_event::TraceLog::GetInstance()
+ ->GetCurrentTraceConfig()
+ .IsEventPackageNameFilterEnabled()) {
+ base::android::Java_TraceEvent_setEventNameFilteringEnabled(env, true);
+ }
+ }
+ void OnTraceLogDisabled() override {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ base::android::Java_TraceEvent_setEnabled(env, false);
+ base::android::Java_TraceEvent_setEventNameFilteringEnabled(env, false);
+ }
+};
+
+} // namespace
+
+static void JNI_TraceEvent_RegisterEnabledObserver(JNIEnv* env) {
+ bool enabled = trace_event::TraceLog::GetInstance()->IsEnabled();
+ base::android::Java_TraceEvent_setEnabled(env, enabled);
+ trace_event::TraceLog::GetInstance()->AddOwnedEnabledStateObserver(
+ std::make_unique<TraceEnabledObserver>());
+}
+
+static void JNI_TraceEvent_StartATrace(
+ JNIEnv* env,
+ const JavaParamRef<jstring>& category_filter) {
+ // ATrace not supported for robolectric.
+#if BUILDFLAG(IS_ANDROID)
+ std::string category_filter_utf8 =
+ ConvertJavaStringToUTF8(env, category_filter);
+ base::trace_event::TraceLog::GetInstance()->StartATrace(category_filter_utf8);
+#endif
+}
+
+static void JNI_TraceEvent_StopATrace(JNIEnv* env) {
+ // ATrace not supported for robolectric.
+#if BUILDFLAG(IS_ANDROID)
+ base::trace_event::TraceLog::GetInstance()->StopATrace();
+#endif
+}
+
+static void JNI_TraceEvent_SetupATraceStartupTrace(
+ JNIEnv* env,
+ const JavaParamRef<jstring>& category_filter) {
+ // ATrace not supported for robolectric.
+#if BUILDFLAG(IS_ANDROID)
+ std::string category_filter_utf8 =
+ ConvertJavaStringToUTF8(env, category_filter);
+ base::trace_event::TraceLog::GetInstance()->SetupATraceStartupTrace(
+ category_filter_utf8);
+#endif
+}
+
+static jboolean JNI_TraceEvent_ViewHierarchyDumpEnabled(JNIEnv* env) {
+ static const unsigned char* enabled =
+ TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED(
+ kAndroidViewHierarchyTraceCategory);
+ return *enabled;
+}
+
+static void JNI_TraceEvent_InitViewHierarchyDump(
+ JNIEnv* env,
+ jlong id,
+ const JavaParamRef<jobject>& obj) {
+ SCOPED_UMA_HISTOGRAM_TIMER("Tracing.ViewHierarchyDump.DumpDuration");
+ TRACE_EVENT(
+ kAndroidViewHierarchyTraceCategory, kAndroidViewHierarchyEventName,
+ perfetto::TerminatingFlow::ProcessScoped(static_cast<uint64_t>(id)),
+ [&](perfetto::EventContext ctx) {
+ auto* event = ctx.event<perfetto::protos::pbzero::ChromeTrackEvent>();
+ auto* dump = event->set_android_view_dump();
+ Java_TraceEvent_dumpViewHierarchy(env, reinterpret_cast<jlong>(dump),
+ obj);
+ });
+}
+
+static jlong JNI_TraceEvent_StartActivityDump(JNIEnv* env,
+ const JavaParamRef<jstring>& name,
+ jlong dump_proto_ptr) {
+ auto* dump = reinterpret_cast<perfetto::protos::pbzero::AndroidViewDump*>(
+ dump_proto_ptr);
+ auto* activity = dump->add_activity();
+ activity->set_name(ConvertJavaStringToUTF8(env, name));
+ return reinterpret_cast<jlong>(activity);
+}
+
+static void JNI_TraceEvent_AddViewDump(
+ JNIEnv* env,
+ jint id,
+ jint parent_id,
+ jboolean is_shown,
+ jboolean is_dirty,
+ const JavaParamRef<jstring>& class_name,
+ const JavaParamRef<jstring>& resource_name,
+ jlong activity_proto_ptr) {
+ auto* activity = reinterpret_cast<perfetto::protos::pbzero::AndroidActivity*>(
+ activity_proto_ptr);
+ auto* view = activity->add_view();
+ view->set_id(id);
+ view->set_parent_id(parent_id);
+ view->set_is_shown(is_shown);
+ view->set_is_dirty(is_dirty);
+ view->set_class_name(ConvertJavaStringToUTF8(env, class_name));
+ view->set_resource_name(ConvertJavaStringToUTF8(env, resource_name));
+}
+
+#else // BUILDFLAG(ENABLE_BASE_TRACING)
+
+// Empty implementations when TraceLog isn't available.
+static void JNI_TraceEvent_RegisterEnabledObserver(JNIEnv* env) {
+ base::android::Java_TraceEvent_setEnabled(env, false);
+ // This code should not be reached when base tracing is disabled. Calling
+ // setEventNameFilteringEnabled to avoid "unused function" warning.
+ base::android::Java_TraceEvent_setEventNameFilteringEnabled(env, false);
+}
+static void JNI_TraceEvent_StartATrace(JNIEnv* env,
+ const JavaParamRef<jstring>&) {}
+static void JNI_TraceEvent_StopATrace(JNIEnv* env) {}
+static void JNI_TraceEvent_SetupATraceStartupTrace(
+ JNIEnv* env,
+ const JavaParamRef<jstring>&) {}
+static jboolean JNI_TraceEvent_ViewHierarchyDumpEnabled(JNIEnv* env) {
+ return false;
+}
+static void JNI_TraceEvent_InitViewHierarchyDump(
+ JNIEnv* env,
+ jlong id,
+ const JavaParamRef<jobject>& obj) {
+ DCHECK(false);
+ // This code should not be reached when base tracing is disabled. Calling
+ // dumpViewHierarchy to avoid "unused function" warning.
+ Java_TraceEvent_dumpViewHierarchy(env, 0, obj);
+}
+static jlong JNI_TraceEvent_StartActivityDump(JNIEnv* env,
+ const JavaParamRef<jstring>& name,
+ jlong dump_proto_ptr) {
+ return 0;
+}
+static void JNI_TraceEvent_AddViewDump(
+ JNIEnv* env,
+ jint id,
+ jint parent_id,
+ jboolean is_shown,
+ jboolean is_dirty,
+ const JavaParamRef<jstring>& class_name,
+ const JavaParamRef<jstring>& resource_name,
+ jlong activity_proto_ptr) {}
+
+#endif // BUILDFLAG(ENABLE_BASE_TRACING)
+
+namespace {
+
+// Boilerplate for safely converting Java data to TRACE_EVENT data.
+class TraceEventDataConverter {
+ public:
+ TraceEventDataConverter(JNIEnv* env, jstring jname, jstring jarg)
+ : name_(ConvertJavaStringToUTF8(env, jname)),
+ has_arg_(jarg != nullptr),
+ arg_(jarg ? ConvertJavaStringToUTF8(env, jarg) : "") {}
+
+ TraceEventDataConverter(const TraceEventDataConverter&) = delete;
+ TraceEventDataConverter& operator=(const TraceEventDataConverter&) = delete;
+
+ ~TraceEventDataConverter() = default;
+
+ // Return saved values to pass to TRACE_EVENT macros.
+ const char* name() { return name_.c_str(); }
+ const char* arg_name() { return has_arg_ ? "arg" : nullptr; }
+ const std::string& arg() { return arg_; }
+
+ private:
+ std::string name_;
+ bool has_arg_;
+ std::string arg_;
+};
+
+} // namespace
+
+static void JNI_TraceEvent_Instant(JNIEnv* env,
+ const JavaParamRef<jstring>& jname,
+ const JavaParamRef<jstring>& jarg) {
+ TraceEventDataConverter converter(env, jname, jarg);
+ if (converter.arg_name()) {
+ TRACE_EVENT_INSTANT(internal::kJavaTraceCategory, nullptr,
+ converter.arg_name(), converter.arg(),
+ [&](::perfetto::EventContext& ctx) {
+ ctx.event()->set_name(converter.name());
+ });
+ } else {
+ TRACE_EVENT_INSTANT(internal::kJavaTraceCategory, nullptr,
+ [&](::perfetto::EventContext& ctx) {
+ ctx.event()->set_name(converter.name());
+ });
+ }
+}
+
+static void JNI_TraceEvent_InstantAndroidIPC(JNIEnv* env,
+ const JavaParamRef<jstring>& jname,
+ jlong jdur) {
+ TRACE_EVENT_INSTANT(
+ internal::kJavaTraceCategory, "AndroidIPC",
+ [&](perfetto::EventContext ctx) {
+ TraceEventDataConverter converter(env, jname, nullptr);
+ auto* event = ctx.event<perfetto::protos::pbzero::ChromeTrackEvent>();
+ auto* android_ipc = event->set_android_ipc();
+ android_ipc->set_name(converter.name());
+ android_ipc->set_dur_ms(jdur);
+ });
+}
+
+#if BUILDFLAG(ENABLE_BASE_TRACING)
+
+static void JNI_TraceEvent_InstantAndroidToolbar(JNIEnv* env,
+ jint block_reason,
+ jint allow_reason,
+ jint snapshot_diff) {
+ using AndroidToolbar = perfetto::protos::pbzero::AndroidToolbar;
+ TRACE_EVENT_INSTANT(
+ internal::kJavaTraceCategory, "AndroidToolbar",
+ [&](perfetto::EventContext ctx) {
+ auto* event = ctx.event<perfetto::protos::pbzero::ChromeTrackEvent>();
+ auto* android_toolbar = event->set_android_toolbar();
+ if (block_reason >= 0) {
+ android_toolbar->set_block_capture_reason(
+ static_cast<AndroidToolbar::BlockCaptureReason>(block_reason));
+ }
+ if (allow_reason >= 0) {
+ android_toolbar->set_allow_capture_reason(
+ static_cast<AndroidToolbar::AllowCaptureReason>(allow_reason));
+ }
+ if (snapshot_diff >= 0) {
+ android_toolbar->set_snapshot_difference(
+ static_cast<AndroidToolbar::SnapshotDifference>(snapshot_diff));
+ }
+ });
+}
+
+#else // BUILDFLAG(ENABLE_BASE_TRACING)
+
+// Empty implementations when TraceLog isn't available.
+static void JNI_TraceEvent_InstantAndroidToolbar(JNIEnv* env,
+ jint block_reason,
+ jint allow_reason,
+ jint snapshot_diff) {}
+
+#endif // BUILDFLAG(ENABLE_BASE_TRACING)
+
+static void JNI_TraceEvent_Begin(JNIEnv* env,
+ const JavaParamRef<jstring>& jname,
+ const JavaParamRef<jstring>& jarg) {
+ TraceEventDataConverter converter(env, jname, jarg);
+ if (converter.arg_name()) {
+ TRACE_EVENT_BEGIN(internal::kJavaTraceCategory, nullptr,
+ converter.arg_name(), converter.arg(),
+ [&](::perfetto::EventContext& ctx) {
+ ctx.event()->set_name(converter.name());
+ });
+ } else {
+ TRACE_EVENT_BEGIN(internal::kJavaTraceCategory, nullptr,
+ [&](::perfetto::EventContext& ctx) {
+ ctx.event()->set_name(converter.name());
+ });
+ }
+}
+
+static void JNI_TraceEvent_End(JNIEnv* env,
+ const JavaParamRef<jstring>& jname,
+ const JavaParamRef<jstring>& jarg,
+ jlong jflow) {
+ TraceEventDataConverter converter(env, jname, jarg);
+ bool has_arg = converter.arg_name();
+ bool has_flow = jflow != 0;
+ if (has_arg && has_flow) {
+ TRACE_EVENT_END(internal::kJavaTraceCategory,
+ perfetto::Flow::ProcessScoped(static_cast<uint64_t>(jflow)),
+ converter.arg_name(), converter.arg());
+ } else if (has_arg) {
+ TRACE_EVENT_END(internal::kJavaTraceCategory, converter.arg_name(),
+ converter.arg());
+ } else if (has_flow) {
+ TRACE_EVENT_END(
+ internal::kJavaTraceCategory,
+ perfetto::Flow::ProcessScoped(static_cast<uint64_t>(jflow)));
+ } else {
+ TRACE_EVENT_END(internal::kJavaTraceCategory);
+ }
+}
+
+static void JNI_TraceEvent_BeginToplevel(JNIEnv* env,
+ const JavaParamRef<jstring>& jtarget) {
+ std::string target = ConvertJavaStringToUTF8(env, jtarget);
+ TRACE_EVENT_BEGIN(internal::kToplevelTraceCategory, nullptr,
+ [&](::perfetto::EventContext& ctx) {
+ ctx.event()->set_name(target.c_str());
+ });
+}
+
+static void JNI_TraceEvent_EndToplevel(JNIEnv* env,
+ const JavaParamRef<jstring>& jtarget) {
+ std::string target = ConvertJavaStringToUTF8(env, jtarget);
+ TRACE_EVENT_END(internal::kToplevelTraceCategory);
+}
+
+static void JNI_TraceEvent_StartAsync(JNIEnv* env,
+ const JavaParamRef<jstring>& jname,
+ jlong jid) {
+ TraceEventDataConverter converter(env, jname, nullptr);
+ TRACE_EVENT_BEGIN(internal::kJavaTraceCategory, nullptr,
+ perfetto::Track(static_cast<uint64_t>(jid)),
+ [&](::perfetto::EventContext& ctx) {
+ ctx.event()->set_name(converter.name());
+ });
+}
+
+static void JNI_TraceEvent_FinishAsync(JNIEnv* env,
+ const JavaParamRef<jstring>& jname,
+ jlong jid) {
+ TraceEventDataConverter converter(env, jname, nullptr);
+ TRACE_EVENT_END(internal::kJavaTraceCategory,
+ perfetto::Track(static_cast<uint64_t>(jid)));
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/trace_event_binding.h b/chromium/base/android/trace_event_binding.h
new file mode 100644
index 00000000000..8927fa673b4
--- /dev/null
+++ b/chromium/base/android/trace_event_binding.h
@@ -0,0 +1,19 @@
+// Copyright 2020 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_TRACE_EVENT_BINDING_H_
+#define BASE_ANDROID_TRACE_EVENT_BINDING_H_
+
+namespace base {
+namespace android {
+namespace internal {
+
+constexpr const char kJavaTraceCategory[] = "Java";
+constexpr const char kToplevelTraceCategory[] = "toplevel,Java";
+
+} // namespace internal
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_TRACE_EVENT_BINDING_H_
diff --git a/chromium/base/android/unguessable_token_android.cc b/chromium/base/android/unguessable_token_android.cc
new file mode 100644
index 00000000000..efff14bdb29
--- /dev/null
+++ b/chromium/base/android/unguessable_token_android.cc
@@ -0,0 +1,44 @@
+// Copyright 2016 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/unguessable_token_android.h"
+
+#include "base/base_jni_headers/UnguessableToken_jni.h"
+
+namespace base {
+namespace android {
+
+ScopedJavaLocalRef<jobject> UnguessableTokenAndroid::Create(
+ JNIEnv* env,
+ const base::UnguessableToken& token) {
+ const uint64_t high = token.GetHighForSerialization();
+ const uint64_t low = token.GetLowForSerialization();
+ DCHECK(high);
+ DCHECK(low);
+ return Java_UnguessableToken_create(env, static_cast<jlong>(high),
+ static_cast<jlong>(low));
+}
+
+absl::optional<base::UnguessableToken>
+UnguessableTokenAndroid::FromJavaUnguessableToken(
+ JNIEnv* env,
+ const JavaRef<jobject>& token) {
+ const uint64_t high = static_cast<uint64_t>(
+ Java_UnguessableToken_getHighForSerialization(env, token));
+ const uint64_t low = static_cast<uint64_t>(
+ Java_UnguessableToken_getLowForSerialization(env, token));
+ DCHECK(high);
+ DCHECK(low);
+ return base::UnguessableToken::Deserialize(high, low);
+}
+
+ScopedJavaLocalRef<jobject>
+UnguessableTokenAndroid::ParcelAndUnparcelForTesting(
+ JNIEnv* env,
+ const JavaRef<jobject>& token) {
+ return Java_UnguessableToken_parcelAndUnparcelForTesting(env, token);
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/android/unguessable_token_android.h b/chromium/base/android/unguessable_token_android.h
new file mode 100644
index 00000000000..07fc3504e0d
--- /dev/null
+++ b/chromium/base/android/unguessable_token_android.h
@@ -0,0 +1,44 @@
+// Copyright 2016 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_ANDROID_UNGUESSABLE_TOKEN_ANDROID_H_
+#define BASE_ANDROID_UNGUESSABLE_TOKEN_ANDROID_H_
+
+#include <jni.h>
+
+#include "base/android/scoped_java_ref.h"
+#include "base/base_export.h"
+#include "base/unguessable_token.h"
+
+namespace base {
+namespace android {
+
+class BASE_EXPORT UnguessableTokenAndroid {
+ public:
+ // Create a Java UnguessableToken with the same value as |token|.
+ static ScopedJavaLocalRef<jobject> Create(
+ JNIEnv* env,
+ const base::UnguessableToken& token);
+
+ // Create a native UnguessableToken from Java UnguessableToken |token|.
+ static absl::optional<base::UnguessableToken> FromJavaUnguessableToken(
+ JNIEnv* env,
+ const JavaRef<jobject>& token);
+
+ // Parcel UnguessableToken |token| and unparcel it, and return the result.
+ // While this method is intended for facilitating unit tests, it results only
+ // in a clone of |token|.
+ static ScopedJavaLocalRef<jobject> ParcelAndUnparcelForTesting(
+ JNIEnv* env,
+ const JavaRef<jobject>& token);
+
+ UnguessableTokenAndroid() = delete;
+ UnguessableTokenAndroid(const UnguessableTokenAndroid&) = delete;
+ UnguessableTokenAndroid& operator=(const UnguessableTokenAndroid&) = delete;
+};
+
+} // namespace android
+} // namespace base
+
+#endif // BASE_ANDROID_UNGUESSABLE_TOKEN_ANDROID_H_
diff --git a/chromium/base/android/unguessable_token_android_unittest.cc b/chromium/base/android/unguessable_token_android_unittest.cc
new file mode 100644
index 00000000000..0a399ec0ec5
--- /dev/null
+++ b/chromium/base/android/unguessable_token_android_unittest.cc
@@ -0,0 +1,46 @@
+// Copyright 2016 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/android/unguessable_token_android.h"
+
+#include "base/android/jni_android.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace base {
+namespace android {
+
+TEST(UnguessableTokenAndroid, BasicCreateToken) {
+ JNIEnv* env = AttachCurrentThread();
+ uint64_t high = 0x1234567812345678;
+ uint64_t low = 0x0583503029282304;
+ base::UnguessableToken token =
+ base::UnguessableToken::CreateForTesting(high, low);
+ ScopedJavaLocalRef<jobject> jtoken =
+ UnguessableTokenAndroid::Create(env, token);
+ absl::optional<base::UnguessableToken> result =
+ UnguessableTokenAndroid::FromJavaUnguessableToken(env, jtoken);
+
+ ASSERT_TRUE(result.has_value());
+ EXPECT_EQ(token, result.value());
+}
+
+TEST(UnguessableTokenAndroid, ParcelAndUnparcel) {
+ JNIEnv* env = AttachCurrentThread();
+ uint64_t high = 0x1234567812345678;
+ uint64_t low = 0x0583503029282304;
+ base::UnguessableToken token =
+ base::UnguessableToken::CreateForTesting(high, low);
+ ScopedJavaLocalRef<jobject> jtoken =
+ UnguessableTokenAndroid::Create(env, token);
+ ScopedJavaLocalRef<jobject> jtoken_clone =
+ UnguessableTokenAndroid::ParcelAndUnparcelForTesting(env, jtoken);
+ absl::optional<base::UnguessableToken> token_clone =
+ UnguessableTokenAndroid::FromJavaUnguessableToken(env, jtoken_clone);
+
+ ASSERT_TRUE(token_clone.has_value());
+ EXPECT_EQ(token, token_clone.value());
+}
+
+} // namespace android
+} // namespace base
diff --git a/chromium/base/files/file_path.cc b/chromium/base/files/file_path.cc
index a43c09317da..3a7cca6fad0 100644
--- a/chromium/base/files/file_path.cc
+++ b/chromium/base/files/file_path.cc
@@ -775,7 +775,7 @@ int FilePath::CompareIgnoreCase(StringPieceType string1,
#elif BUILDFLAG(IS_APPLE)
// Mac OS X specific implementation of file string comparisons.
-// cf. http://developer.apple.com/mac/library/technotes/tn/tn1150.html#UnicodeSubtleties
+// cf. https://developer.apple.com/library/archive/technotes/tn/tn1150.html#UnicodeSubtleties
//
// "When using CreateTextEncoding to create a text encoding, you should set
// the TextEncodingBase to kTextEncodingUnicodeV2_0, set the
@@ -801,11 +801,12 @@ int FilePath::CompareIgnoreCase(StringPieceType string1,
// Ignored characters are mapped to zero.
//
// cf. downloadable file linked in
-// http://developer.apple.com/mac/library/technotes/tn/tn1150.html#StringComparisonAlgorithm
+// https://developer.apple.com/library/archive/technotes/tn/tn1150.html#Downloads
namespace {
-const UInt16 lower_case_table[] = {
+// clang-format off
+const UInt16 lower_case_table[11 * 256] = {
// High-byte indices ( == 0 iff no case mapping and no ignorables )
/* 0 */ 0x0100, 0x0200, 0x0000, 0x0300, 0x0400, 0x0500, 0x0000, 0x0000,
@@ -1191,11 +1192,12 @@ const UInt16 lower_case_table[] = {
/* F */ 0xFFF0, 0xFFF1, 0xFFF2, 0xFFF3, 0xFFF4, 0xFFF5, 0xFFF6, 0xFFF7,
0xFFF8, 0xFFF9, 0xFFFA, 0xFFFB, 0xFFFC, 0xFFFD, 0xFFFE, 0xFFFF,
};
+// clang-format on
-// Returns the next non-ignorable codepoint within string starting from the
-// position indicated by index, or zero if there are no more.
-// The passed-in index is automatically advanced as the characters in the input
-// HFS-decomposed UTF-8 strings are read.
+// Returns the next non-ignorable codepoint within `string` starting from the
+// position indicated by `index`, or zero if there are no more.
+// The passed-in `index` is automatically advanced as the characters in the
+// input HFS-decomposed UTF-8 strings are read.
inline base_icu::UChar32 HFSReadNextNonIgnorableCodepoint(const char* string,
size_t length,
size_t* index) {
@@ -1206,12 +1208,16 @@ inline base_icu::UChar32 HFSReadNextNonIgnorableCodepoint(const char* string,
CBU8_NEXT(reinterpret_cast<const uint8_t*>(string), *index, length,
codepoint);
DCHECK_GT(codepoint, 0);
- if (codepoint > 0) {
+
+ // Note: Here, there are no lower case conversion implemented in the
+ // Supplementary Multilingual Plane (codepoint > 0xFFFF).
+
+ if (codepoint > 0 && codepoint <= 0xFFFF) {
// Check if there is a subtable for this upper byte.
int lookup_offset = lower_case_table[codepoint >> 8];
if (lookup_offset != 0)
codepoint = lower_case_table[lookup_offset + (codepoint & 0x00FF)];
- // Note: codepoint1 may be again 0 at this point if the character was
+ // Note: `codepoint` may be again 0 at this point if the character was
// an ignorable.
}
}
diff --git a/chromium/base/files/file_path_unittest.cc b/chromium/base/files/file_path_unittest.cc
index 3cfdcbe445c..08c3e75b7e1 100644
--- a/chromium/base/files/file_path_unittest.cc
+++ b/chromium/base/files/file_path_unittest.cc
@@ -1195,6 +1195,13 @@ TEST_F(FilePathTest, CompareIgnoreCase) {
{{FPL("K\u0301U\u032DO\u0304\u0301N"), FPL("\u1E31\u1E77\u1E53n")}, 0},
{{FPL("k\u0301u\u032Do\u0304\u0301n"), FPL("\u1E30\u1E76\u1E52n")}, 0},
{{FPL("k\u0301u\u032Do\u0304\u0302n"), FPL("\u1E30\u1E76\u1E52n")}, 1},
+
+ // Codepoints > 0xFFFF
+ // Here, we compare the `Adlam Letter Shu` in its capital and small version.
+ {{FPL("\U0001E921"), FPL("\U0001E943")}, -1},
+ {{FPL("\U0001E943"), FPL("\U0001E921")}, 1},
+ {{FPL("\U0001E921"), FPL("\U0001E921")}, 0},
+ {{FPL("\U0001E943"), FPL("\U0001E943")}, 0},
#endif
};
diff --git a/chromium/build/util/LASTCHANGE b/chromium/build/util/LASTCHANGE
index 144eafcd846..ecd3dffa411 100644
--- a/chromium/build/util/LASTCHANGE
+++ b/chromium/build/util/LASTCHANGE
@@ -1,2 +1,2 @@
-LASTCHANGE=ff31347a6f4dc4b829c8c47e04cb84e29290d1f5-refs/branch-heads/5615@{#1253}
+LASTCHANGE=3bd7c498c6d8c90fafb56211b896e34bd4308ca0-refs/branch-heads/5615@{#1445}
LASTCHANGE_YEAR=2023
diff --git a/chromium/build/util/LASTCHANGE.committime b/chromium/build/util/LASTCHANGE.committime
index a0ef1ab25a9..0c1d9ea5747 100644
--- a/chromium/build/util/LASTCHANGE.committime
+++ b/chromium/build/util/LASTCHANGE.committime
@@ -1 +1 @@
-1681430440 \ No newline at end of file
+1684890045 \ No newline at end of file
diff --git a/chromium/chrome/VERSION b/chromium/chrome/VERSION
index 7215308680d..cafbc31a3f7 100644
--- a/chromium/chrome/VERSION
+++ b/chromium/chrome/VERSION
@@ -1,4 +1,4 @@
MAJOR=112
MINOR=0
BUILD=5615
-PATCH=132
+PATCH=213
diff --git a/chromium/chrome/app/resources/chromium_strings_am.xtb b/chromium/chrome/app/resources/chromium_strings_am.xtb
index fbe1a08f0ee..0b351ee65be 100644
--- a/chromium/chrome/app/resources/chromium_strings_am.xtb
+++ b/chromium/chrome/app/resources/chromium_strings_am.xtb
@@ -52,10 +52,10 @@
<translation id="2241627712206172106">ኮምፒውተር የሚጋሩ ከሆኑ ጓደኛዎች እና ቤተሰብ ተለይተው ሊያስሱ እና Chromiumን በሚፈልጉበት መንገድ ማዋቀር ይችላሉ።</translation>
<translation id="2313870531055795960">በChromium ላይ በተከማቹ ደህንነታቸው ያልተጠበቁ ጣቢያዎች ዝርዝር ጋር ዩአርኤሎችን ይፈትሻል። አንድ ጣቢያ የእርስዎን የይለፍ ቃል ለመስረቅ ከሞከረ ወይም ጎጂ ፋይል ሲያወርዱ Chromium እንዲሁም የገጽ ይዘት ቢትስንም ጨምሮ ዩአርኤሎችን ወደ የጥንቃቄ አሰሳ ሊልክ ይችላል።</translation>
<translation id="2343156876103232566">አንድ ቁጥር ከዚህ ወደ የእርስዎ Android ስልክ ለመላክ በሁለቱም መሣሪያዎች ላይ በመለያ ወደ Chromium ይግቡ።</translation>
-<translation id="2347108572062610441">ይህ ቅጥያ Chromiumን ሲጀምሩት የሚታየውን ገጽ ቀይሮታል።</translation>
+<translation id="2347108572062610441">ይህ ቅጥያ Chromiumን ሲጀምሩት የሚታየውን ገፅ ቀይሮታል።</translation>
<translation id="2359808026110333948">ቀጥል</translation>
<translation id="2384373936468275798">የመለያ መግቢያ ዝርዝሮችዎ ጊዜ ያለፈባቸው ስለሆኑ ChromiumOS ውሂብዎን ማስመር አልቻለም።</translation>
-<translation id="2396765026452590966">ይህ «<ph name="EXTENSION_NAME" />» ቅጥያ Chromiumን ሲጀምሩት የሚታየውን ገጽ ቀይሮታል።</translation>
+<translation id="2396765026452590966">ይህ «<ph name="EXTENSION_NAME" />» ቅጥያ Chromiumን ሲጀምሩት የሚታየውን ገፅ ቀይሮታል።</translation>
<translation id="2401032172288869980">Chromium ለዚህ ጣቢያ የካሜራ እና የማይክሮፎን ፈቃዶች ያስፈልጉታል</translation>
<translation id="2483889755041906834">በChromium ውስጥ</translation>
<translation id="2485422356828889247">አራግፍ</translation>
@@ -247,7 +247,7 @@
<translation id="6442900851116057561">ChromiumOSን ዳግም አስጀምር</translation>
<translation id="6455857529632101747">ወደ Chromium መገለጫዎች እንኳን በደህና መጡ</translation>
<translation id="6457450909262716557">{SECONDS,plural, =1{Chromium በ1 ሰከንድ ውስጥ ዳግም ይጀምራል}one{Chromium በ# ሰከንዶች ውስጥ ዳግም ይጀምራል}other{Chromium በ# ሰከንዶች ውስጥ ዳግም ይጀምራል}}</translation>
-<translation id="6475912303565314141">እንዲሁም Chromiumን ሲጀምሩት የሚታየውን ገጽ ይቆጣጠራል።</translation>
+<translation id="6475912303565314141">እንዲሁም Chromiumን ሲጀምሩት የሚታየውን ገፅ ይቆጣጠራል።</translation>
<translation id="6510925080656968729">Chromiumን ያራግፉ</translation>
<translation id="6542839706527980775">እያንዳንዱ መገለጫ እንደ ዕልባቶች፣ ታሪክ፣ የይለፍ ቃላት እና ሌሎችም ያሉ የራሱ የChromium መረጃዎችን ይይዛል</translation>
<translation id="6570579332384693436">የሥርዓተ ፊደል አጻጻፍ ስህተቶችን ለማስተካከል፣ Chromium እርስዎ በጽሁፍ መስኮች ውስጥ የሚተይቡትን ጽሁፍ ወደ Google ይልካል</translation>
@@ -336,7 +336,7 @@ Chromium ቅንብሮችዎን ማስመለስ አልቻለም።</translation>
<translation id="8133124826068723441">ማስመር ለጎራዎ ስለማይገኝ ChromiumOS ውሂብዎን ማስመር አይችልም።</translation>
<translation id="813913629614996137">በማስጀመር ላይ…</translation>
<translation id="81770708095080097">ይህ ፋይል አደገኛ ስለሆነ Chromium አግዶታል።</translation>
-<translation id="8213374284266571500">እንደዚህ አይነት ፋይል አደገኛ ስለሆነ Chromium ይህን ፋይል አግዶታል።</translation>
+<translation id="8213374284266571500">እንደዚህ ዓይነት ፋይል አደገኛ ስለሆነ Chromium ይህን ፋይል አግዶታል።</translation>
<translation id="8248265253516264921">አንድ ምስል ጠቃሚ መግለጫ ከሌለው Chromium ለእርስዎ አንድ ለማቅረብ ይሞክራል። ዝርዝር መግለጫዎችን ለመፍጠር፣ ምስሎች ወደ Google ይላካሉ። ይህን በማንኛውም ጊዜ በቅንብሮች ውስጥ ሊያጠፉት ይችላሉ።</translation>
<translation id="8266560134891435528">እርስዎ በመለያ ስላልገቡ ስለሆኑ Chromium የይለፍ ቃላትዎን መፈተሽ አይችልም</translation>
<translation id="8276522524898344151">Chromium የይለፍ ቃላትን ለመቅዳት እየሞከረ ነው።</translation>
@@ -357,14 +357,14 @@ Chromium ቅንብሮችዎን ማስመለስ አልቻለም።</translation>
<translation id="8608079656141766906"><ph name="BEGIN_BOLD" />ይህንን ውሂብ እንዴት እንደሚጠቀሙበት፦<ph name="END_BOLD" /> ጣቢያዎች ስለዝንባሌዎችዎ መረጃን በChromium አማካኝነት ማከማቸት ይችላሉ። ለምሳሌ፣ ለማራቶን ጫማ ለመግዛት ጣቢያን ከጎበኙ ጣቢያው ዝንባሌዎን እንደ ማራቶን መሮጥ ሊገልጽ ይችላል። በኋላ ላይ ለሩጫ ለመመዝገብ ሌላ ጣቢያ ከጎበኙ ይህ ጣቢያ በዝንባሌዎችዎ ላይ ተመስርቶ የመሮጫ ጫማ ማስታወቂያ ሊያሳየዎት ይችላል።</translation>
<translation id="8619360774459241877">Chromiumን በማስጀመር ላይ...</translation>
<translation id="8621669128220841554">ተለይቶ ባልታወቀ ስህተት ምክንያት ጭነት ከሽፏል። እባክዎ Chromiumን እንደገና ያውርዱ።</translation>
-<translation id="8697124171261953979">እንዲሁም Chromiumን ሲጀምሩት ወይም ከኦምኒቦክሱ ሆነው ሲፈልጉ የሚታየውን ገጽ ይቆጣጠራል።</translation>
+<translation id="8697124171261953979">እንዲሁም Chromiumን ሲጀምሩት ወይም ከኦምኒቦክሱ ሆነው ሲፈልጉ የሚታየውን ገፅ ይቆጣጠራል።</translation>
<translation id="8704119203788522458">ይሄ የእርስዎ Chromium ነው</translation>
<translation id="8796602469536043152">Chromium ለዚህ ጣቢያ የእርስዎን ካሜራ እና ማይክሮፎን ለመድረስ ፈቃድ ያስፈልገዋል</translation>
<translation id="8833697763442816810">የChromiumOS ስርዓት</translation>
<translation id="8846118132221683440"><ph name="BEGIN_BOLD" />ምን ውሂብ ጥቅም ላይ እንደሚውል፦<ph name="END_BOLD" /> የአሰሳ ታሪክዎ፣ በዚህ መሣሪያ ላይ Chromiumን ተጠቅመው የጎበኟቸው የጣቢያዎች መዝገብ።</translation>
<translation id="8862326446509486874">ለስርዓተ-ደረጃ ጭነት ተገቢ መብቶች የሉዎትም። ጫኚውን እንደ አስተዳዳሪ በማሄድ እንደገና ይሞክሩ።</translation>
<translation id="8880203542552872219">እንደዚያ ከሆነ፣ ከእርስዎ አዲሱ የይለፍ ቃል ጋር እንዲዛመድ የእርስዎን በChromium የተቀመጠ የይለፍ ቃል አርትዕ ያድርጉ።</translation>
-<translation id="8897323336392112261">እንዲሁም Chromiumን ሲጀምሩት ወይም የመነሻ አዝራሩን ጠቅ ሲያደርጉት የሚታየውን ገጽ ይቆጣጠራል።</translation>
+<translation id="8897323336392112261">እንዲሁም Chromiumን ሲጀምሩት ወይም የመነሻ አዝራሩን ጠቅ ሲያደርጉት የሚታየውን ገፅ ይቆጣጠራል።</translation>
<translation id="8907580949721785412">Chromium የይለፍ ቃሎችን ለማሳየት እየሞከረ ነው። ይህንን ለመፍቀድ የWindows የይለፍ ቃልዎን ይተይቡ።</translation>
<translation id="8931379085695076764">Chromium ካለፉት ጥቂት ሳምንታት የአሰሳ ታሪክዎ ላይ በመመስረት ዝንባሌዎችዎን ሊገምት ይችላል። ይህ መረጃ በመሣሪያዎ ላይ ይቆያል።</translation>
<translation id="8941642502866065432">Chromiumን ማዘመን አልተቻለም</translation>
diff --git a/chromium/chrome/app/resources/chromium_strings_da.xtb b/chromium/chrome/app/resources/chromium_strings_da.xtb
index 2ae533c8d10..baea99089ad 100644
--- a/chromium/chrome/app/resources/chromium_strings_da.xtb
+++ b/chromium/chrome/app/resources/chromium_strings_da.xtb
@@ -42,7 +42,7 @@ De tilladelser, du har givet til websites og apps, gælder muligvis for denne ko
<translation id="2008474315282236005">Denne handling sletter ét element på denne enhed. Hvis du senere vil hente dine data igen, skal du logge ind på Chromium som <ph name="USER_EMAIL" />.</translation>
<translation id="2018879682492276940">Installationen mislykkedes. Prøv igen.</translation>
<translation id="2020032459870799438">Du kan tjekke, om dine andre adgangskoder er beskyttet mod brud på datasikkerheden og andre sikkerhedsproblemer ved at <ph name="BEGIN_LINK" />logge ind på Chromium<ph name="END_LINK" />.</translation>
-<translation id="2049376729098081731">Vælg, om du vil inkludere Chromium-historikken for at få mere tilpassede oplevelser i Googles tjenester</translation>
+<translation id="2049376729098081731">Vælg, om du vil inkludere Chromium-historikken for at få mere personligt tilpassede oplevelser i Googles tjenester</translation>
<translation id="2088953378266246249">Oplysninger om, hvordan Chromium administrerer sine rodcertifikater</translation>
<translation id="2174178932569897599">Tilpas Chromium</translation>
<translation id="2174917724755363426">Installationen er ikke fuldført. Er du sikker på, at du vil annullere?</translation>
@@ -84,7 +84,7 @@ De tilladelser, du har givet til websites og apps, gælder muligvis for denne ko
<translation id="3032787606318309379">Føjer til Chromium...</translation>
<translation id="3038232873781883849">Venter på at installere…</translation>
<translation id="3068515742935458733">Hjælp med at gøre Chromium bedre ved at sende fejlrapporter og <ph name="UMA_LINK" /> til Google</translation>
-<translation id="3101560983689755071">Din browserhistorik påvirker de annoncer, som du ser, og de interesser, som er estimeret nedenfor. Af hensyn til beskyttelsen af dine personlige oplysninger sletter Chromium automatisk dine interesser en gang om måneden. Interesserne kan blive opdateret, medmindre du fjerner dem.</translation>
+<translation id="3101560983689755071">Din browserhistorik påvirker de annoncer, som du ser, og de interesser, som er estimeret nedenfor. Af hensyn til privatlivsbeskyttelsen sletter Chromium automatisk dine interesser en gang om måneden. Interesserne kan blive opdateret, medmindre du fjerner dem.</translation>
<translation id="3103660991484857065">Installationsprogrammet kunne ikke pakke arkivet ud. Download Chromium igen.</translation>
<translation id="3130323860337406239">Chromium bruger din mikrofon.</translation>
<translation id="3155163173539279776">Genstart Chromium</translation>
@@ -109,7 +109,7 @@ De tilladelser, du har givet til websites og apps, gælder muligvis for denne ko
<translation id="3474745554856756813">Denne handling sletter <ph name="ITEMS_COUNT" /> elementer på denne enhed. Hvis du senere vil hente dine data igen, skal du logge ind på Chromium som <ph name="USER_EMAIL" />.</translation>
<translation id="3497319089134299931"><ph name="SHORTCUT" /> kan skifte mellem Chromium-profiler</translation>
<translation id="3509308970982693815">Luk alle Chromium-vinduer, og prøv igen.</translation>
-<translation id="3533435340678213462">Vi sletter automatisk de interesser, der er ældre end 4 uger, for at beskytte dine personlige oplysninger Mens du surfer, kan en interesse vises på listen igen. Du kan også fjerne interesser, som du ikke vil have, at Chromium skal tage med i betragtning.</translation>
+<translation id="3533435340678213462">Vi sletter automatisk de interesser, der er ældre end 4 uger, for at beskytte dit privatliv. Mens du surfer, kan en interesse vises på listen igen. Du kan også fjerne interesser, som du ikke vil have, at Chromium skal tage med i betragtning.</translation>
<translation id="3567254597502212821">Din browserhistorik, dvs. en oversigt over, hvilke websites du har besøgt i Chromium på denne enhed</translation>
<translation id="3575459661164320785">Der er skadelig software på din computer. Chromium kan fjerne den, gendanne dine indstillinger og deaktivere udgivelser, så din browser fungerer normalt igen.</translation>
<translation id="3593091352817399191">En anden konto er allerede logget ind. Hvis du vil holde din browsing adskilt, kan Chromium oprette en ny profil til dig.</translation>
@@ -118,7 +118,7 @@ De tilladelser, du har givet til websites og apps, gælder muligvis for denne ko
<translation id="364817392622123556">{COUNT,plural, =0{Der er en ny Chromium-opdatering, som anvendes, så snart du genstarter.}=1{Der er en ny Chromium-opdatering, som anvendes, så snart du genstarter. Dit inkognitovindue åbnes ikke igen.}one{Der er en ny Chromium-opdatering, som anvendes, så snart du genstarter. # inkognitovindue åbnes ikke igen.}other{Der er en ny Chromium-opdatering, som anvendes, så snart du genstarter. Dine # inkognitovinduer åbnes ikke igen.}}</translation>
<translation id="3651803019964686660">Hvis du vil sende et nummer fra <ph name="ORIGIN" /> til din Android-telefon, skal du logge ind på Chromium på begge enheder.</translation>
<translation id="3685209450716071127">Chromium kan ikke tjekke dine adgangskoder. Prøv at tjekke din internetforbindelse.</translation>
-<translation id="3702352323269013324">Få flere oplysninger om annoncetilpasning i Chromium</translation>
+<translation id="3702352323269013324">Få flere oplysninger om personlig tilpasning af annoncer i Chromium</translation>
<translation id="370962675267501463">{COUNT,plural, =0{Din administrator anmoder om, at du genstarter Chromium for at anvende denne opdatering}=1{Din administrator anmoder om, at du genstarter Chromium for at anvende denne opdatering. Dit inkognitovindue åbnes ikke igen.}one{Din administrator anmoder om, at du genstarter Chromium for at anvende denne opdatering. # inkognitovindue åbnes ikke igen.}other{Din administrator anmoder om, at du genstarter Chromium for at anvende denne opdatering. Dine # inkognitovinduer åbnes ikke igen.}}</translation>
<translation id="3713809861844741608">Åbn linket på en ny Chromium-&amp;fane</translation>
<translation id="378917192836375108">Med Chromium kan du klikke på et telefonnummer på nettet og ringe op til det via Skype!</translation>
@@ -179,7 +179,7 @@ De tilladelser, du har givet til websites og apps, gælder muligvis for denne ko
<translation id="5224391634244552924">Der er ingen gemte adgangskoder. Chromium kan tjekke dine adgangskoder, når du gemmer dem.</translation>
<translation id="5252179775517634216"><ph name="EXISTING_USER" /> er allerede logget ind på denne Chromium-profil. Denne handling vil oprette en ny Chromium-profil til <ph name="USER_EMAIL_ADDRESS" /></translation>
<translation id="5277894862589591112">Åbn Chromium igen for at anvende ændringerne</translation>
-<translation id="5296845517486664001">Når prøven er aktiveret, og hvis Chromium har placeret dig tilfældigt i en aktiv prøve, vil din browserhistorik påvirke de annoncer, du ser, og de interesser, som er estimeret nedenfor. Af hensyn til beskyttelsen af dine personlige oplysninger sletter Chromium dine interesser en gang om måneden.</translation>
+<translation id="5296845517486664001">Når prøven er aktiveret, og hvis Chromium har placeret dig tilfældigt i en aktiv prøve, vil din browserhistorik påvirke de annoncer, du ser, og de interesser, som er estimeret nedenfor. Af hensyn til privatlivsbeskyttelsen sletter Chromium dine interesser en gang om måneden.</translation>
<translation id="5358375970380395591">Du er ved at logge ind med en managerstyret konto og giver dens administrator kontrol over din profil i Chromium. Dine Chromium-data, f.eks. dine apps, bogmærker, historikdata, adgangskoder og andre indstillinger, knyttes permanent til <ph name="USER_NAME" />. Du kan slette disse data via kontrolpanelet for Google Konti, men du kan ikke knytte disse data til en anden konto. <ph name="LEARN_MORE" /></translation>
<translation id="5386450000063123300">Opdaterer Chromium (<ph name="PROGRESS_PERCENT" />)</translation>
<translation id="538767207339317086">Tillad login via Chromium</translation>
@@ -190,7 +190,7 @@ De tilladelser, du har givet til websites og apps, gælder muligvis for denne ko
<translation id="5438241569118040789"><ph name="PAGE_TITLE" /> – Chromium beta</translation>
<translation id="5473971139929175403">Chromium fungerer muligvis ikke korrekt, da det ikke længere understøttes af denne Linux-distribution</translation>
<translation id="5480860683791598150">Chromium skal have adgang til din lokation for at dele din lokation med dette website</translation>
-<translation id="5487574057737591516">Vi sletter automatisk de interesser, der er ældre end 4 uger, for at beskytte dine personlige oplysninger Mens du surfer, kan en interesse vises på listen igen. Hvis Chromium tager fejl, eller du ikke vil se visse annoncer, kan du fjerne en interesse.</translation>
+<translation id="5487574057737591516">Vi sletter automatisk de interesser, der er ældre end 4 uger, for at beskytte dit privatliv. Mens du surfer, kan en interesse vises på listen igen. Hvis Chromium tager fejl, eller du ikke vil se visse annoncer, kan du fjerne en interesse.</translation>
<translation id="549669000822060376">Vent, mens Chromium installerer de nyeste systemopdateringer.</translation>
<translation id="5496810170689441661">Chromium forsøger at redigere adgangskoder. Angiv din Windows-adgangskode for at tillade dette.</translation>
<translation id="5527463683072221100">Åbn PDF-filer i Chromium</translation>
@@ -205,9 +205,9 @@ De tilladelser, du har givet til websites og apps, gælder muligvis for denne ko
<translation id="5903106910045431592"><ph name="PAGE_TITLE" /> – Login på netværk</translation>
<translation id="5924017743176219022">Opretter forbindelse til internettet…</translation>
<translation id="5941711191222866238">Minimer</translation>
-<translation id="5972142260211327093">Hvis Chromium har placeret dig tilfældigt i en aktiv prøve, vil din browserhistorik påvirke de annoncer, du ser, og de interesser, som er estimeret nedenfor. Af hensyn til beskyttelsen af dine personlige oplysninger sletter Chromium dine interesser en gang om måneden. Interesserne opdateres, medmindre du fjerner dem.</translation>
+<translation id="5972142260211327093">Hvis Chromium har placeret dig tilfældigt i en aktiv prøve, vil din browserhistorik påvirke de annoncer, du ser, og de interesser, som er estimeret nedenfor. Af hensyn til privatlivsbeskyttelsen sletter Chromium dine interesser en gang om måneden. Interesserne opdateres, medmindre du fjerner dem.</translation>
<translation id="5987687638152509985">Opdater Chromium for at starte synkronisering</translation>
-<translation id="5988505247484123880">Det er almindeligt, at de websites, du besøger, husker ting, du er interesseret i, så din oplevelse tilpasses. Websites kan også gemme oplysninger med Chromium om dine interesser.</translation>
+<translation id="5988505247484123880">Det er almindeligt, at de websites, du besøger, husker ting, du er interesseret i, så din oplevelse personligt tilpasses. Websites kan også gemme oplysninger med Chromium om dine interesser.</translation>
<translation id="6003112304606738118">Downloader… Der er <ph name="HOURS" /> timer tilbage</translation>
<translation id="6040143037577758943">Luk</translation>
<translation id="6055895534982063517">Der findes en ny version af Chromium, som er hurtigere end nogensinde før.</translation>
@@ -240,7 +240,7 @@ De tilladelser, du har givet til websites og apps, gælder muligvis for denne ko
<translation id="6333502561965082103">En anden handling i Chromium er i gang. Prøv igen senere.</translation>
<translation id="6334986366598267305">Det er nu blevet nemmere at bruge Chromium med din Google-konto og på delte computere.</translation>
<translation id="6373523479360886564">Er du sikker på, at du vil afinstallere Chromium?</translation>
-<translation id="6384011394608460044"><ph name="BEGIN_BOLD" />Sådan bruger vi disse data:<ph name="END_BOLD" /> Chromium kan estimere dine interesser. Senere kan et website, du besøger, anmode Chromium om at se dine interesser med henblik på at tilpasse de annoncer, du ser.</translation>
+<translation id="6384011394608460044"><ph name="BEGIN_BOLD" />Sådan bruger vi disse data:<ph name="END_BOLD" /> Chromium kan estimere dine interesser. Senere kan et website, du besøger, anmode Chromium om at se dine interesser med henblik på at personligt tilpasse de annoncer, du ser.</translation>
<translation id="6403826409255603130">Chromium er en webbrowser, der kører websider og apps med lynets hast. Den er hurtig, stabil og brugervenlig. Beskyttelse mod malware og phishing er indbygget i Chromium, så du kan søge mere sikkert på internettet.</translation>
<translation id="6442900851116057561">Genstart Chromium OS</translation>
<translation id="6455857529632101747">Velkommen til Chromium-profiler</translation>
@@ -274,7 +274,7 @@ Visse funktioner kan være utilgængelige. Angiv en anden profilmappe, eller bru
<translation id="691026815377248078">Chromium skal have adgang til Bluetooth for at fortsætte
parringen. <ph name="IDS_BLUETOOTH_DEVICE_CHOOSER_AUTHORIZE_BLUETOOTH_LINK" /></translation>
<translation id="6929417474050522668">Når prøver er aktiveret, giver Ad measurement de websites, du besøger, mulighed for at anmode om oplysninger fra Chromium, som hjælper websitet med at måle, hvor godt dets annoncer klarer sig. Ad measurement begrænser sporing på tværs af websites ved at overføre så få oplysninger som muligt mellem websites.</translation>
-<translation id="6940431691900807093">Et website, du besøger, kan på et senere tidspunkt anmode Chromium om at se dine interesser med henblik på at tilpasse de annoncer, du får vist. Chromium kan dele op til 3 interesser.</translation>
+<translation id="6940431691900807093">Et website, du besøger, kan på et senere tidspunkt anmode Chromium om at se dine interesser med henblik på at personligt tilpasse de annoncer, du får vist. Chromium kan dele op til 3 interesser.</translation>
<translation id="6964305034639999644">Åbn linket i et Chromium-inko&amp;gnitovindue</translation>
<translation id="6978145336957848883">Svage adgangskoder er nemme at gætte. Få Chromium <ph name="BEGIN_LINK" />til at oprette og huske stærke adgangskoder for dig<ph name="END_LINK" />.</translation>
<translation id="6981396265751285733">Når denne indstilling er aktiveret, frigør Chromium hukommelse fra inaktive faner. Dette tildeler aktive faner og andre apps flere computerressourcer og gør Chromium hurtigere. Dine inaktive faner bliver automatisk aktive igen, når du vender tilbage til dem.</translation>
@@ -306,7 +306,7 @@ Chromium kan ikke gendanne dine præferencer.</translation>
<translation id="7483335560992089831">Kan ikke installere den samme version af Chromium som den, der kører i øjeblikket. Luk Chromium, og prøv igen.</translation>
<translation id="753534427205733210">{0,plural, =1{Chromium genstarter om 1 minut}one{Chromium genstarter om # minut}other{Chromium genstarter om # minutter}}</translation>
<translation id="7561906087460245826">Ryd også data fra Chromium (<ph name="URL" />)</translation>
-<translation id="7582945390259497898">Chromium kan estimere dine interesser. Senere kan et website, du besøger, anmode Chromium om at se dine interesser med henblik på at tilpasse de annoncer, du ser.</translation>
+<translation id="7582945390259497898">Chromium kan estimere dine interesser. Senere kan et website, du besøger, anmode Chromium om at se dine interesser med henblik på at personligt tilpasse de annoncer, du ser.</translation>
<translation id="7583399374488819119">Installationsprogram til <ph name="COMPANY_NAME" /></translation>
<translation id="7597596667193879455">Du har aktiveret Udvidet beskyttet browsing på din konto. Nu skal du aktivere funktionen for Chromium.</translation>
<translation id="761356813943268536">Chromium bruger dit kamera og din mikrofon.</translation>
@@ -315,7 +315,7 @@ Chromium kan ikke gendanne dine præferencer.</translation>
<translation id="7682213815243802460">Du kan få flere oplysninger om disse funktioner i Chromium-indstillingerne.</translation>
<translation id="7682601070171973634">Chromium afprøver nye funktioner, der giver websites mulighed for at levere den samme browseroplevelse med færre af dine data</translation>
<translation id="7686590090926151193">Chromium er ikke din standardbrowser</translation>
-<translation id="7689606757190482937">Synkroniser og tilpas Chromium på alle dine enheder</translation>
+<translation id="7689606757190482937">Synkroniser og personligt tilpas Chromium på alle dine enheder</translation>
<translation id="7745317241717453663">Denne handling sletter dine browserdata på denne enhed. Hvis du senere vil hente dine data igen, skal du logge ind på Chromium som <ph name="USER_EMAIL" />.</translation>
<translation id="7747138024166251722">Installationsprogrammet kunne ikke oprette en midlertidig mappe. Tjek, om der er tilstrækkelig diskplads, og om der er tilladelse til at installere software.</translation>
<translation id="7786760609782648049">Gør Chromium hurtigere</translation>
@@ -325,7 +325,7 @@ Chromium kan ikke gendanne dine præferencer.</translation>
<translation id="7859018312476869945">Når du indtaster noget i adresselinjen eller søgefeltet, sender Chromium det, du skriver, til din standardsøgemaskine for at få bedre forslag. Dette er deaktiveret i inkognitotilstand.</translation>
<translation id="7867198900892795913">Chromium kunne ikke opdatere til den nyeste version, så du går glip af nye funktioner og sikkerhedsrettelser.</translation>
<translation id="7872446069773932638">Downloader… Der er <ph name="SECONDS" /> sekunder tilbage</translation>
-<translation id="7877292582355102282"><ph name="BEGIN_BOLD" />Sådan kan du administrere dine data:<ph name="END_BOLD" /> Vi sletter automatisk de interesser, der er ældre end 4 uger, for at beskytte dine personlige oplysninger Mens du surfer, kan en interesse vises på listen igen. Du kan også fjerne interesser, som du ikke vil have, at Chromium skal tage med i betragtning.</translation>
+<translation id="7877292582355102282"><ph name="BEGIN_BOLD" />Sådan kan du administrere dine data:<ph name="END_BOLD" /> Vi sletter automatisk de interesser, der er ældre end 4 uger, for at beskytte dit privatliv. Mens du surfer, kan en interesse vises på listen igen. Du kan også fjerne interesser, som du ikke vil have, at Chromium skal tage med i betragtning.</translation>
<translation id="7937630085815544518">Du loggede ind på Chromium som <ph name="USER_EMAIL_ADDRESS" />. Brug den samme konto til at logge ind igen.</translation>
<translation id="7975919845073681630">Dette er en sekundær installation af Chromium, og den kan ikke gøres til din standardbrowser.</translation>
<translation id="7997934263947464652">Udvidelser, apps og temaer fra ukendte kilder kan skade din enhed. Chromium anbefaler, at de kun installeres via <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /></translation>
@@ -341,7 +341,7 @@ Chromium kan ikke gendanne dine præferencer.</translation>
<translation id="8276522524898344151">Chromium forsøger at kopiere adgangskoder.</translation>
<translation id="8290862415967981663">Denne fil kan være farlig, så Chromium har blokeret den.</translation>
<translation id="8325404639443959713">Gør mere med Chromium</translation>
-<translation id="8330519371938183845">Log ind for at synkronisere og tilpasse Chromium på alle dine enheder</translation>
+<translation id="8330519371938183845">Log ind for at synkronisere og personligt tilpasse Chromium på alle dine enheder</translation>
<translation id="8340674089072921962"><ph name="USER_EMAIL_ADDRESS" /> brugte tidligere Chromium</translation>
<translation id="8357820681460164151">Log ind, og aktivér derefter synkronisering for at få adgang til dine Chromium-ting på alle dine enheder</translation>
<translation id="8360718212975266891">Hvis du vil have fremtidige Chromium-opdateringer, skal du have Windows 10 eller nyere. Denne computer har Windows 8.</translation>
diff --git a/chromium/chrome/app/resources/chromium_strings_it.xtb b/chromium/chrome/app/resources/chromium_strings_it.xtb
index 46d65662dce..03202ff99d7 100644
--- a/chromium/chrome/app/resources/chromium_strings_it.xtb
+++ b/chromium/chrome/app/resources/chromium_strings_it.xtb
@@ -30,7 +30,7 @@ A questo account potrebbero essere applicate le autorizzazioni già concesse a s
<translation id="185970820835152459">Puoi gestire gli Account Google a cui hai eseguito l'accesso. I tuoi Account Google vengono usati per il browser Chromium, il Play Store, Gmail e altro ancora. Se vuoi aggiungere un account per qualcun altro, come un membro del gruppo Famiglia, aggiungi invece una nuova persona a <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Scopri di più<ph name="LINK_END" /></translation>
<translation id="1863308913976887472">I siti possono memorizzare su Chromium informazioni relative ai tuoi interessi. Ad esempio, se visiti un sito per acquistare scarpe per una maratona, il sito potrebbe definire come tuo interesse le maratone. Se in un secondo momento visiti un altro sito per registrarti a una gara, il sito può mostrarti un annuncio relativo a scarpe da corsa in base ai tuoi interessi.</translation>
<translation id="1881322772814446296">Stai per accedere con un account gestito e per dare al relativo amministratore il controllo del tuo profilo Chromium. I tuoi dati di Chromium, come app, Preferiti, cronologia, password e altre impostazioni, verranno collegati definitivamente a <ph name="USER_NAME" />. Potrai eliminare questi dati tramite la Dashboard di Google Account, ma non potrai associare questi dati a un altro account. Se preferisci puoi creare un nuovo profilo per mantenere separati i dati di Chromium esistenti. <ph name="LEARN_MORE" /></translation>
-<translation id="1906696617298807388">Quando digiti nella barra degli indirizzi o nella casella di ricerca, Chromium invia ciò che digiti a Google Drive per ricevere suggerimenti sugli elementi. Questa opzione è disattivata in incognito.</translation>
+<translation id="1906696617298807388">Quando digiti nella barra degli indirizzi o nella casella di ricerca, Chromium invia ciò che digiti a Google Drive per ricevere suggerimenti sugli elementi. Questa opzione è disattivata nella modalità di navigazione in incognito.</translation>
<translation id="1911763535808217981">Se disattivi questa funzione, puoi accedere ai siti Google quali Gmail senza accedere a Chromium</translation>
<translation id="1929939181775079593">Chromium non risponde. Riavviarlo ora?</translation>
<translation id="193439633299369377">Per applicare l'aggiornamento è necessario riavviare Chromium OS.</translation>
@@ -321,7 +321,7 @@ Chromium non è in grado di recuperare le impostazioni.</translation>
<translation id="7790626492778995050"><ph name="PAGE_TITLE" /> - Chromium Canary</translation>
<translation id="7828947555739565424">Esiste già un profilo Chromium con questo account su questo dispositivo</translation>
<translation id="7845233973568007926">L'installazione è terminata. Dovrai riavviare il computer per poter utilizzare <ph name="BUNDLE_NAME" />.</translation>
-<translation id="7859018312476869945">Quando digiti nella barra degli indirizzi o nella casella di ricerca, Chromium invia ciò che digiti al tuo motore di ricerca predefinito per ricevere suggerimenti migliori. Questa opzione è disattivata in incognito.</translation>
+<translation id="7859018312476869945">Quando digiti nella barra degli indirizzi o nella casella di ricerca, Chromium invia ciò che digiti al tuo motore di ricerca predefinito per ricevere suggerimenti migliori. Questa opzione è disattivata nella modalità di navigazione in incognito.</translation>
<translation id="7867198900892795913">Non è stato possibile aggiornare Chromium alla versione più recente, quindi non potrai utilizzare le nuove funzioni e gli aggiornamenti di sicurezza.</translation>
<translation id="7872446069773932638">Download in corso… Secondi rimanenti: <ph name="SECONDS" /></translation>
<translation id="7877292582355102282"><ph name="BEGIN_BOLD" />Come puoi gestire i tuoi dati:<ph name="END_BOLD" /> per tutelare la tua privacy, eliminiamo automaticamente i tuoi interessi risalenti a più di 4 settimane prima della data corrente. Mentre continui a navigare, un interesse potrebbe essere nuovamente visualizzato nell'elenco. Puoi anche rimuovere gli interessi che non vuoi che Chromium prenda in considerazione.</translation>
diff --git a/chromium/chrome/app/resources/chromium_strings_kn.xtb b/chromium/chrome/app/resources/chromium_strings_kn.xtb
index 837a079726d..49648f126fd 100644
--- a/chromium/chrome/app/resources/chromium_strings_kn.xtb
+++ b/chromium/chrome/app/resources/chromium_strings_kn.xtb
@@ -140,7 +140,7 @@
<translation id="421369550622382712">Chromium ಗಾಗಿ ಅದ್ಭುತ ಅಪ್ಲಿಕೇಶನ್‌‌ಗಳು, ಗೇಮ್‌ಗಳು, ಎಕ್ಸ್‌ಟೆನ್ಷನ್‌‌ಗಳು ಹಾಗೂ ಥೀಮ್‌ಗಳನ್ನು ಅನ್ವೇಷಿಸಿ.</translation>
<translation id="4216212958613226427">Chromium UI ತೋರಿಸಲು ಈ ಭಾಷೆಯನ್ನು ಬಳಸಲಾಗುತ್ತದೆ</translation>
<translation id="4222932583846282852">ರದ್ದುಗೊಳಿಸಲಾಗುತ್ತಿದೆ...</translation>
-<translation id="4230135487732243613">ಈ ಖಾತೆಗೆ ನಿಮ್ಮ Chromium ಡೇಟಾವನ್ನು ಲಿಂಕ್ ಮಾಡುವುದೇ?</translation>
+<translation id="4230135487732243613">ಈ ಖಾತೆಗೆ ನಿಮ್ಮ Chromium ಡೇಟಾವನ್ನು ಲಿಂಕ್ ಮಾಡಬೇಕೆ?</translation>
<translation id="4271805377592243930">Chromium ಜೊತೆಗೆ ಸಹಾಯ ಪಡೆಯಿರಿ</translation>
<translation id="4285930937574705105">ಅನಿರ್ದಿಷ್ಟ ದೋಷದಿಂದಾಗಿ ಸ್ಥಾಪನೆಯು ವಿಫಲಗೊಂಡಿದೆ. Chromium ಪ್ರಸ್ತುತ ಚಾಲನೆಯಲ್ಲಿದ್ದರೆ, ದಯವಿಟ್ಟು ಅದನ್ನು ಮುಚ್ಚಿರಿ ಮತ್ತು ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation>
<translation id="4304713468139749426">ಪಾಸ್‌ವರ್ಡ್ ನಿರ್ವಾಹಕ</translation>
@@ -227,7 +227,7 @@
<translation id="6245734527075554892">Chromium ನಲ್ಲಿ ಸಂಗ್ರಹಣೆ ಮಾಡಲಾಗಿರುವ ಅಸುರಕ್ಷಿತ ಸೈಟ್‌ಗಳ ಪಟ್ಟಿಯನ್ನು ಬಳಸಿ, URL ಗಳನ್ನು ಪರಿಶೀಲಿಸುತ್ತದೆ</translation>
<translation id="6248213926982192922">Chromium ಅನ್ನು ಡಿಫಾಲ್ಟ್ ಬ್ರೌಸರ್ ಮಾಡಿ</translation>
<translation id="6266342355635466082">ಅಪ್‌ಡೇಟ್‌ಗಳಿವೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸಲು Chromium ಗೆ ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ. ನಿಮ್ಮ ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕವನ್ನು ಪರಿಶೀಲಿಸಿ ನೋಡಿ.</translation>
-<translation id="6268381023930128611">Chromium ನಿಂದ ಸೈನ್‌ ಔಟ್‌ ಮಾಡುವುದೇ?</translation>
+<translation id="6268381023930128611">Chromium ನಿಂದ ಸೈನ್‌ ಔಟ್‌ ಮಾಡಬೇಕೆ?</translation>
<translation id="6273793429163604305">ತಯಾರಾಗಿರಿ...</translation>
<translation id="6281746429495226318">ನಿಮ್ಮ Chromium ಪ್ರೊಫೈಲ್ ಅನ್ನು ಕಸ್ಟಮೈಸ್ ಮಾಡಿ</translation>
<translation id="6290827346642914212">ನಿಮ್ಮ Chromium ಪ್ರೊಫೈಲ್ ಅನ್ನು ಹೆಸರಿಸಿ</translation>
@@ -290,7 +290,7 @@
<translation id="7337881442233988129">Chromium</translation>
<translation id="7339898014177206373">ಹೊಸ ವಿಂಡೊ</translation>
<translation id="734373864078049451">ನಿಮ್ಮ ವೆಬ್, ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳು ಮತ್ತು ಇತರ Chromium ಸಂಗತಿಗಳು ಇಲ್ಲಿ ಲೈವ್ ಆಗುತ್ತವೆ.</translation>
-<translation id="7349591376906416160"><ph name="TARGET_URL_HOSTNAME" /> ಗೆ ಪ್ರವೇಶ ಪಡೆಯುವುದಕ್ಕಾಗಿ <ph name="ALTERNATIVE_BROWSER_NAME" /> ಅನ್ನು ತೆರೆಯಲು, ನಿಮ್ಮ ಸಿಸ್ಟಂ ನಿರ್ವಾಹಕರು Chromium ಅನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿದ್ದಾರೆ.</translation>
+<translation id="7349591376906416160"><ph name="TARGET_URL_HOSTNAME" /> ಗೆ ಆ್ಯಕ್ಸೆಸ್ ಪಡೆಯುವುದಕ್ಕಾಗಿ <ph name="ALTERNATIVE_BROWSER_NAME" /> ಅನ್ನು ತೆರೆಯಲು, ನಿಮ್ಮ ಸಿಸ್ಟಂ ನಿರ್ವಾಹಕರು Chromium ಅನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿದ್ದಾರೆ.</translation>
<translation id="7398989605938454041">Chromium ಪ್ರೊಫೈಲ್‌ಗಳನ್ನು ಬಳಸಿಕೊಂಡು Chromium ಗೆ ಸಂಬಂಧಿಸಿದ ನಿಮ್ಮ ಎಲ್ಲಾ ಸಂಗತಿಗಳನ್ನು ನೀವು ಪ್ರತ್ಯೇಕವಾಗಿಸಬಹುದು. ಇದು ಕೆಲಸ ಮತ್ತು ಮೋಜಿನ ನಡುವೆ ವಿಭಜನೆಯನ್ನು ಸುಲಭಗೊಳಿಸುತ್ತದೆ.</translation>
<translation id="7449453770951226939"><ph name="PAGE_TITLE" /> - Chromium Dev</translation>
<translation id="7451052299415159299">ಈ ಸೈಟ್‌ಗಾಗಿ ನಿಮ್ಮ ಕ್ಯಾಮರಾವನ್ನು ಪ್ರವೇಶಿಸಲು Chromium ಗೆ ಅನುಮತಿಯ ಅಗತ್ಯವಿದೆ</translation>
diff --git a/chromium/chrome/app/resources/chromium_strings_ky.xtb b/chromium/chrome/app/resources/chromium_strings_ky.xtb
index 2daa96c6972..a2bef4fa0c2 100644
--- a/chromium/chrome/app/resources/chromium_strings_ky.xtb
+++ b/chromium/chrome/app/resources/chromium_strings_ky.xtb
@@ -22,7 +22,7 @@
<translation id="1625909126243026060">Chromium'дагы негизги купуялык жана коопсуздукту көзөмөлдөө каражаттарын карап көрүңүз</translation>
<translation id="1632539827495546968">Бул аккаунтту бир жолу гана колдонгону жатсаңыз, Chromium серепчисинен <ph name="GUEST_LINK_BEGIN" />Конок режимине<ph name="GUEST_LINK_END" /> өтүңүз. Эгер кимдир бирөөнүн аккаунтун кошкуңуз келсе, <ph name="DEVICE_TYPE" /> түзмөгүңүзгө <ph name="LINK_BEGIN" />жаңы кишини кошуңуз<ph name="LINK_END" />.
-Вебсайттарга жана колдонмолорго берилген уруксаттар ушул аккаунтка карата колдонулушу мүмкүн. Google аккаунттарыңызды <ph name="SETTINGS_LINK_BEGIN" />Жөндөөлөрдөн<ph name="SETTINGS_LINK_END" /> башкара аласыз.</translation>
+Вебсайттарга жана колдонмолорго берилген уруксаттар ушул аккаунтка карата колдонулушу мүмкүн. Google аккаунттарыңызды <ph name="SETTINGS_LINK_BEGIN" />Параметрлерден<ph name="SETTINGS_LINK_END" /> башкара аласыз.</translation>
<translation id="1640672724030957280">Жүктөлүп алынууда...</translation>
<translation id="1708666629004767631">Chromium'дун бир кыйла жаңы, коопсуз версиясы бар.</translation>
<translation id="17264556997921157">Сайттар жарнамаларды көрсөтүү үчүн колдонгон темаларды көрүп, өчүрө аласыз. Chromium сизди кызыктырган темаларды акыркы көргөн вебсайттарыңыздын негизинде божомолдойт.</translation>
@@ -31,14 +31,14 @@
<translation id="1808667845054772817">Chromium'ду кайра орнотуу</translation>
<translation id="185970820835152459">Кирип турган Google аккаунттарыңызды башкара аласыз. Google аккаунттарыңыз Chromium серепчисинде, Play Store'до, Gmail'де жана башка жерлерде колдонулат. Эгер кимдир бирөөнүн, мисалы, үй-бүлөлүк топтун мүчөсүнүн аккаунтун кошкуңуз келсе, жаңы адамды <ph name="DEVICE_TYPE" /> түзмөгүнө кошуп коюңуз. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation>
<translation id="1863308913976887472">Сайттар кызыккан нерселериңиз тууралуу маалыматты Chromium'да сакташы мүмкүн. Мисалы, марафон үчүн бут кийим сатып алуу үчүн сайтка баш баксаңыз, ал сайт "марафондо чуркоону" кызыккан нерсеңиз катары аныктайт. Кийинчерээк, жарышууга катталуу үчүн башка бир сайтка баш баксаңыз, ал сайт кызыккан нерселериңиздин негизинде чуркоо үчүн бут кийимдин жарнамасын көрсөтүшү мүмкүн.</translation>
-<translation id="1881322772814446296">Башкарылган аккаунт менен кирип, анын администраторунун милдетин Chromium профилиңизге өткөрүп берип жатасыз. Chromium дайын-даректериңизди, колдонмолоруңузду, кыстармаларыңызды, таржымалыңызды, сырсөздөрүңүздү жана башка жөндөөлөрдү <ph name="USER_NAME" /> менен биротоло байланыштырат. Бул дайындарды Google Каттоо эсептеринин жеке кеңсеси аркылуу жок кылсаңыз болот, бирок бул дайындарды башка аккаунтка байлай албайсыз. <ph name="LEARN_MORE" /></translation>
+<translation id="1881322772814446296">Башкарылган аккаунт менен кирип, анын администраторунун милдетин Chromium профилиңизге өткөрүп берип жатасыз. Chromium дайын-даректериңизди, колдонмолоруңузду, кыстармаларыңызды, таржымалыңызды, сырсөздөрүңүздү жана башка параметрлерди <ph name="USER_NAME" /> менен биротоло байланыштырат. Бул дайындарды Google Каттоо эсептеринин жеке кеңсеси аркылуу жок кылсаңыз болот, бирок бул дайындарды башка аккаунтка байлай албайсыз. <ph name="LEARN_MORE" /></translation>
<translation id="1906696617298807388">Дарек тилкесине же издөө кутучасына жазганыңызда, Chromium сизге ылайыктуу нерселерди сунуштоо максатында сурамды Google Drive'га жөнөтөт. Бул параметр Жашыруун режимде өчүк болот.</translation>
<translation id="1911763535808217981">Ушуну өчүрүү менен Gmail сыяктуу Google сайттарына Chromium'суз кире аласыз</translation>
<translation id="1929939181775079593">Chromium жооп бербей жатат. Өчүрүп кайра ишке киргизесизби?</translation>
<translation id="193439633299369377">Жаңыртууну колдонуу үчүн ChromiumOS өчүрүлүп күйгүзүлүшү керек.</translation>
<translation id="1940680973325097484">Бул аккаунтту бир жолу гана колдонгону жатсаңыз, Chromium серепчисинен Конок режимине өтүңүз. Эгер кимдир бирөөнүн аккаунтун кошкуңуз келсе, <ph name="DEVICE_TYPE" /> түзмөгүңүзгө <ph name="LINK_BEGIN" />жаңы кишини кошуңуз<ph name="LINK_END" />.
-Вебсайттарга жана колдонмолорго берилген уруксаттар ушул аккаунтка карата колдонулушу мүмкүн. Google аккаунттарыңызды <ph name="SETTINGS_LINK_BEGIN" />Жөндөөлөрдөн<ph name="SETTINGS_LINK_END" /> башкара аласыз.</translation>
+Вебсайттарга жана колдонмолорго берилген уруксаттар ушул аккаунтка карата колдонулушу мүмкүн. Google аккаунттарыңызды <ph name="SETTINGS_LINK_BEGIN" />Параметрлерден<ph name="SETTINGS_LINK_END" /> башкара аласыз.</translation>
<translation id="1953553007165777902">Жүктөлүп алынууда... <ph name="MINUTE" /> мүнөт калды</translation>
<translation id="1966382378801805537">Chromium демейки серепчини аныктап же коё албай жатат</translation>
<translation id="2008474315282236005">Ушуну менен түзмөктөгү 1 нерсе өчүрүлөт. Дайын-даректериңизди кийинчерээк чыгарып алуу үчүн Chromium'га <ph name="USER_EMAIL" /> аккаунту менен кириңиз.</translation>
@@ -113,7 +113,7 @@
<translation id="3509308970982693815">Бардык Chromium терезелерин жаап, дагы аракет кылып көрүңүз.</translation>
<translation id="3533435340678213462">Купуялыгыңызды камсыздоо үчүн 4 аптадан мурун кызыккан нерселериңизди автоматтык түрдө жок кылып турабыз. Жаңы сайттарды карап чыккан сайын кызыккан нерселериңиздин тизмеси жаңыланып турат. Же болбосо кызыккан нерселерге кошкуңуз келбегендерин алып салсаңыз болот.</translation>
<translation id="3567254597502212821">Бул түзмөктө Chromium аркылуу баш баккан жана көргөн сайттарыңыз.</translation>
-<translation id="3575459661164320785">Компьютериңизде кооптуу программа бар. Серепчиңизди кайра ойдогудай иштетүү үчүн Chromium аны алып салып, жөндөөлөрдү калыбына келтирип, кеңейтүүлөрдү өчүрө алат.</translation>
+<translation id="3575459661164320785">Компьютериңизде кооптуу программа бар. Серепчиңизди кайра ойдогудай иштетүү үчүн Chromium аны алып салып, параметрлерди калыбына келтирип, кеңейтүүлөрдү өчүрө алат.</translation>
<translation id="3593091352817399191">Башка аккаунт кирип турат. Сиз карап чыккан нерселерди ажыратуу максатында Chromium сиз үчүн өзүнчө профиль түзүп бере алат.</translation>
<translation id="363078681319665186">Chromium жаңыртууларын алып туруу үчүн macOS 10.15 же андан кийинки версиясын орнотушуңуз керек. Бул компьютерде macOS 10.13 версиясы колдонулууда.</translation>
<translation id="3639635944603682591">Бул адамдын серептөө дайындары бул түзмөктөн биротоло өчүрүлөт. Дайындарды калыбына келтирүү үчүн, Chromium'га <ph name="USER_EMAIL" /> аккаунту менен кириңиз.</translation>
@@ -157,7 +157,7 @@
<translation id="452711251841752011">Chromium'га кош келиңиз; серепчиде жаңы терезе ачылды</translation>
<translation id="4544142686420020088">Chromium жаңырган жок. Бир жерден ката кетти. <ph name="BEGIN_LINK" />Chrome'догу жаңыртуу маселелерин оңдоңуз.<ph name="END_LINK" /></translation>
<translation id="454579500955453258">Жаңы Chromium профилинде улантасызбы?</translation>
-<translation id="4567424176335768812"><ph name="USER_EMAIL_ADDRESS" /> катары кирдиңиз. Эми кыстармаларды, таржымалды жана башка жөндөөлөрдү бардык катталган түзмөктөрүңүздөн колдоно аласыз.</translation>
+<translation id="4567424176335768812"><ph name="USER_EMAIL_ADDRESS" /> катары кирдиңиз. Эми кыстармаларды, таржымалды жана башка параметрлерди бардык катталган түзмөктөрүңүздөн колдоно аласыз.</translation>
<translation id="4594305310729380060">Ушул түзмөктөгү Сырсөздөр бөлүмүнө</translation>
<translation id="459535195905078186">Chromium колдонмолору</translation>
<translation id="4613863813562375431">ChromiumOS версиясы</translation>
@@ -171,7 +171,7 @@
<translation id="4748217263233248895">Жаңы эле Chromium үчүн өзгөчө коопсуздук жаңыртуулары орнотулду. Өтмөктөрдү калыбына келтирүү үчүн аны өчүрүп-күйгүзүңүз.</translation>
<translation id="4765210420921718862">Каалаган убакта Chromium'дун параметрлерине өтүп, баш тартсаңыз болот. Сынамык версиялар жарнамалардын учурдагы көрсөтүлүшү менен чогуу колдонулат, андыктан өзгөрүүлөр дароо көрүнбөйт.</translation>
<translation id="4788777615168560705">Chromium сырсөздөрүңүздү текшере албай жатат. 24 сааттан кийин кайра аракет кылыңыз же <ph name="BEGIN_LINK" />Google аккаунтуңуздагы сырсөздөрдү текшериңиз<ph name="END_LINK" />.</translation>
-<translation id="479167709087336770">Ал Google Издөөдө колдонулган орфографияны текшерүүчү программаны колдонот. Серепчиде терилген текстти Google кызматтарына жөнөтүп турат. Бул параметрди каалаган убакта жөндөөлөргө өтүп, өзгөртүп койсоңуз болот.</translation>
+<translation id="479167709087336770">Ал Google Издөөдө колдонулган орфографияны текшерүүчү программаны колдонот. Серепчиде терилген текстти Google кызматтарына жөнөтүп турат. Бул параметрди каалаган убакта параметрлерге өтүп, өзгөртүп койсоңуз болот.</translation>
<translation id="4888717733111232871">mDNS трафигине уруксат берүү үчүн Chromium'дун кирүү эрежеси.</translation>
<translation id="4893347770495441059">&amp;Chromium'ду жаңыртуу үчүн кайра иштетиңиз</translation>
<translation id="4943838377383847465">Chromium фондук режимде.</translation>
@@ -363,7 +363,7 @@ Chromium параметрлериңизди калыбына келтире ал
<translation id="8796602469536043152">Бул сайтта иштөө үчүн Chromium камераңызды жана микрофонуңузду колдонушу керек</translation>
<translation id="8833697763442816810">ChromiumOS тутуму</translation>
<translation id="8846118132221683440"><ph name="BEGIN_BOLD" />Кайсы маалымат колдонулат:<ph name="END_BOLD" /> Бул түзмөктө Chromium аркылуу баш баккан жана көргөн сайттарыңыз.</translation>
-<translation id="8862326446509486874">Тутум деңгээлинде орнотууга тийиштүү укугуңуз жок. Орноткучту Администратор катары кайра иштетип көрүңүз.</translation>
+<translation id="8862326446509486874">Система деңгээлинде орнотууга тийиштүү укугуңуз жок. Орноткучту Администратор катары кайра иштетип көрүңүз.</translation>
<translation id="8880203542552872219">Эгер өзгөрткөн болсоңуз, Chromium'да сакталган сырсөзүңүздү жаңы сырсөзгө дал келгендей кылып түзөтүңүз.</translation>
<translation id="8897323336392112261">Chromium'ду иштетип баштаганда же Башкы бет баскычы чыкылдатылганда, кайсы бет көрсөтүлө тургандыгын көзөмөлдөйт.</translation>
<translation id="8907580949721785412">Chromium сырсөздөрдү көрсөткөнгө аракет кылууда. Уруксат берүү үчүн Windows сырсөзүңүздү жазыңыз.</translation>
diff --git a/chromium/chrome/app/resources/chromium_strings_mk.xtb b/chromium/chrome/app/resources/chromium_strings_mk.xtb
index ca21c69b988..29d5bafe8e4 100644
--- a/chromium/chrome/app/resources/chromium_strings_mk.xtb
+++ b/chromium/chrome/app/resources/chromium_strings_mk.xtb
@@ -157,7 +157,7 @@
<translation id="452711251841752011">Добре дојдовте на Chromium; отворен е нов прозорец во прелистувачот</translation>
<translation id="4544142686420020088">Chromium не се ажурираше, нешто тргна наопаку. <ph name="BEGIN_LINK" />Поправете ги проблемите со ажурирањето на Chromium и со неуспешните ажурирања.<ph name="END_LINK" /></translation>
<translation id="454579500955453258">Сакате да продолжите на нов профил на Chromium?</translation>
-<translation id="4567424176335768812">Најавени сте како <ph name="USER_EMAIL_ADDRESS" />. Сега може да пристапувате кон вашите обележувачи, историја и други поставки на сите најавени уреди.</translation>
+<translation id="4567424176335768812">Најавени сте како: <ph name="USER_EMAIL_ADDRESS" />. Сега може да пристапувате кон вашите обележувачи, историја и други поставки на сите најавени уреди.</translation>
<translation id="4594305310729380060">На Password Manager на уредов</translation>
<translation id="459535195905078186">Апликации на Chromium</translation>
<translation id="4613863813562375431">Верзија на Chromium OS</translation>
diff --git a/chromium/chrome/app/resources/chromium_strings_mr.xtb b/chromium/chrome/app/resources/chromium_strings_mr.xtb
index 0f07616e18e..1603bc63809 100644
--- a/chromium/chrome/app/resources/chromium_strings_mr.xtb
+++ b/chromium/chrome/app/resources/chromium_strings_mr.xtb
@@ -246,7 +246,7 @@
<translation id="6442900851116057561">ChromiumOS रीस्टार्ट करा</translation>
<translation id="6455857529632101747">Chromium प्रोफाइलमध्ये स्वागत आहे</translation>
<translation id="6457450909262716557">{SECONDS,plural, =1{Chromium १ सेकंदात रीस्टार्ट होईल}other{Chromium # सेकंदांत रीस्टार्ट होईल}}</translation>
-<translation id="6475912303565314141">तुम्ही Chromium सुरू करता तेव्हा कोणते पृष्ठ दर्शविले जाते हेदेखील हे नियंत्रित करते.</translation>
+<translation id="6475912303565314141">तुम्ही Chromium सुरू करता तेव्हा कोणते पेज दाखवावे हेदेखील ते नियंत्रित करते.</translation>
<translation id="6510925080656968729">Chromium अनइंस्टॉल करा</translation>
<translation id="6542839706527980775">प्रत्येक प्रोफाइलमध्ये तिची स्वतःची Chromium माहिती असते जसे की, बुकमार्क, इतिहास, पासवर्ड आणि आणखी बरेच काही</translation>
<translation id="6570579332384693436">शब्दलेखनाच्या चुकांमध्ये सुधारणा करण्यासाठी Chromium तुम्ही मजकूर भागामध्ये टाइप केलेला मजकूर Google ला पाठवते</translation>
@@ -357,7 +357,7 @@ Chromium तुमची सेटिंग्ज रिकव्हर कर
<translation id="8608079656141766906"><ph name="BEGIN_BOLD" />आम्ही हा डेटा कसा वापरतो:<ph name="END_BOLD" /> साइट तुमच्या स्वारस्यांबद्दलची माहिती Chromium वापरून स्टोअर करू शकतात. उदाहरणार्थ, तुम्ही मॅरेथॉनसाठी शूज खरेदी करण्यासाठी एखाद्या साइटला भेट दिल्यास, ती साइट तुमचे स्वारस्य मॅरेथॉनमध्ये धावणे म्हणून परिभाषित करू शकते. त्यानंतर, तुम्ही एखाद्या शर्यतीसाठी नोंदणी करण्याकरिता वेगळ्या साइटला भेट दिल्यास, ती साइट तुम्हाला तुमच्या स्वारस्यांनुसार धावण्यासाठीच्या शूजची जाहिरात दाखवू शकते.</translation>
<translation id="8619360774459241877">Chromium लाँच करत आहे...</translation>
<translation id="8621669128220841554">नमूद न केलेल्या एररमुळे स्थापना अयशस्वी झाली. कृपया Chromium पुन्‍हा डाउनलोड करा.</translation>
-<translation id="8697124171261953979">तुम्ही Chromium सुरू करता किंवा ओम्निबॉक्समधून शोध घेता तेव्हा कोणते पृष्ठ दर्शविले जाते हेदेखील हे नियंत्रित करते.</translation>
+<translation id="8697124171261953979">तुम्ही Chromium सुरू करता किंवा तुम्ही ओम्निबॉक्समधून शोध घेता तेव्हा कोणते पेज दाखवावे हेदेखील ते नियंत्रित करते.</translation>
<translation id="8704119203788522458">हे तुमचे Chromium आहे</translation>
<translation id="8796602469536043152">या साइटसाठी Chromium ला तुमचा कॅमेरा आणि मायक्रोफोन ॲक्सेस करण्याची परवानगी हवी आहे</translation>
<translation id="8833697763442816810">ChromiumOS सिस्टीम</translation>
diff --git a/chromium/chrome/app/resources/chromium_strings_ne.xtb b/chromium/chrome/app/resources/chromium_strings_ne.xtb
index 6db98b651ff..c5f9ca5297d 100644
--- a/chromium/chrome/app/resources/chromium_strings_ne.xtb
+++ b/chromium/chrome/app/resources/chromium_strings_ne.xtb
@@ -153,7 +153,7 @@
<translation id="4423735387467980091">Chromium आफू अनुकूल र नियन्त्रण गर्नुहोस्</translation>
<translation id="4427306783828095590">परिष्कृत सुरक्षा प्रयोग गरी फिसिङ तथा मालवेयरमाथि अझ राम्रोसँग रोक लगाउन सकिन्छ</translation>
<translation id="452711251841752011">Chromium मा तपाईंलाई स्वागत छ; ब्राउजरको नयाँ विन्डो खोलियो</translation>
-<translation id="4544142686420020088">Chromium अद्यावधिक भएन, केही चिज गडबड भयो। <ph name="BEGIN_LINK" />Chromium अद्यावधिक गर्दा देखिएका समस्या तथा अद्यावधिक नहुने समस्याहरू समाधान गर्नुहोस्।<ph name="END_LINK" /></translation>
+<translation id="4544142686420020088">Chromium अद्यावधिक भएन, कुनै समस्या आयो। <ph name="BEGIN_LINK" />Chromium अद्यावधिक गर्दा देखिएका समस्या तथा अद्यावधिक नहुने समस्याहरू समाधान गर्नुहोस्।<ph name="END_LINK" /></translation>
<translation id="454579500955453258">नयाँ Chromium प्रोफाइल प्रयोग गरी साइन इन गर्ने हो?</translation>
<translation id="4567424176335768812">तपाइँ <ph name="USER_EMAIL_ADDRESS" /> को रूपमा साइन इन हुनुभएको छ। अब तपाइँले तपाइँका सबै साइन इन भएका यन्त्रहरूमा तपाइँका पृष्ठमञ्जूषाहरू, इतिहास, र अन्य सेटिङहरू पहुँच गर्न सक्नुहुन्छ।</translation>
<translation id="4594305310729380060">यो डिभाइसको पासवर्ड म्यानेजरमा</translation>
diff --git a/chromium/chrome/app/resources/chromium_strings_nl.xtb b/chromium/chrome/app/resources/chromium_strings_nl.xtb
index 94029ecbc4c..67fd3022898 100644
--- a/chromium/chrome/app/resources/chromium_strings_nl.xtb
+++ b/chromium/chrome/app/resources/chromium_strings_nl.xtb
@@ -25,7 +25,7 @@ Sommige functies zijn wellicht niet beschikbaar en wijzigingen in voorkeuren wor
Rechten die je al hebt gegeven aan websites en apps, kunnen van toepassing zijn op dit account. Je kunt je Google-accounts beheren via <ph name="SETTINGS_LINK_BEGIN" />Instellingen<ph name="SETTINGS_LINK_END" />.</translation>
<translation id="1640672724030957280">Bezig met downloaden...</translation>
<translation id="1708666629004767631">Er is een nieuwe, veiligere versie van Chromium beschikbaar.</translation>
-<translation id="17264556997921157">Je kunt interessante onderwerpen bekijken en verwijderen die sites hebben gebruikt om je advertenties te laten zien. Chromium schat je interesses op basis van je recente browsegeschiedenis</translation>
+<translation id="17264556997921157">Je kunt interessante onderwerpen bekijken en verwijderen die sites hebben gebruikt om advertenties te tonen. Chromium schat je interesses op basis van je recente browsegeschiedenis</translation>
<translation id="1774152462503052664">Chromium laten uitvoeren op de achtergrond</translation>
<translation id="1779356040007214683">Om Chromium veiliger te maken, hebben we een aantal extensies uitgezet die niet worden vermeld in de <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> en mogelijk zonder je medeweten zijn geïnstalleerd.</translation>
<translation id="1808667845054772817">Chromium opnieuw installeren</translation>
diff --git a/chromium/chrome/app/resources/chromium_strings_sw.xtb b/chromium/chrome/app/resources/chromium_strings_sw.xtb
index 23fc574fdca..5815d3426ec 100644
--- a/chromium/chrome/app/resources/chromium_strings_sw.xtb
+++ b/chromium/chrome/app/resources/chromium_strings_sw.xtb
@@ -203,7 +203,7 @@ Huenda ruhusa ambazo tayari umezipa tovuti na programu zikatumika kwenye akaunti
<translation id="5698481217667032250">Onyesha Chromium katika lugha hii</translation>
<translation id="5862307444128926510">Karibu kwenye Chromium</translation>
<translation id="5883558403894052917">Chromium imegundua kwamba vipengee hivi vina programu hasidi:</translation>
-<translation id="5895138241574237353">Zzima na uwashe</translation>
+<translation id="5895138241574237353">Zima na uwashe</translation>
<translation id="5903106910045431592"><ph name="PAGE_TITLE" /> - Kuingia katika Akaunti ya Mtandao</translation>
<translation id="5924017743176219022">Inaunganisha kwenye Intaneti...</translation>
<translation id="5941711191222866238">Punguza</translation>
diff --git a/chromium/chrome/app/resources/chromium_strings_te.xtb b/chromium/chrome/app/resources/chromium_strings_te.xtb
index 6a4074fbd90..e51ec69441f 100644
--- a/chromium/chrome/app/resources/chromium_strings_te.xtb
+++ b/chromium/chrome/app/resources/chromium_strings_te.xtb
@@ -106,7 +106,7 @@
<translation id="347328004046849135">చోరీకి గురైన పాస్‌వర్డ్‌తో మీరు సైన్ ఇన్ చేసినప్పుడు Chromium మీకు తెలియజేస్తుంది</translation>
<translation id="3474745554856756813">ఇది ఈ పరికరం నుండి <ph name="ITEMS_COUNT" /> అంశాలను తొలగిస్తుంది. మీ డేటాను తర్వాత తిరిగి పొందడానికి, Chromiumకు <ph name="USER_EMAIL" /> లాగా సైన్ ఇన్ చేయండి.</translation>
<translation id="3497319089134299931"><ph name="SHORTCUT" /> Chromium ప్రొఫైళ్ల మధ్య స్విచ్ చేయగలదు</translation>
-<translation id="3509308970982693815">దయచేసి అన్ని Chromium విండోలను మూసివేసి, మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="3509308970982693815">దయచేసి అన్ని Chromium విండోలను మూసివేసి, మళ్లీ ట్రై చేయండి.</translation>
<translation id="3533435340678213462">మీ గోప్యతను రక్షించడానికి, 4 వారాల కంటే పాతవైన మీ ఆసక్తులను మేము ఆటోమేటిక్‌గా తొలగిస్తాము. మీరు బ్రౌజ్ చేస్తూ ఉంటే, ఆసక్తి ఉన్న ఆ టాపిక్ మళ్లీ లిస్ట్‌లో కనిపించవచ్చు. లేదా Chromium పరిగణనలోకి తీసుకోకూడదు అని మీరు భావించే ఆసక్తులను తీసివేయవచ్చు.</translation>
<translation id="3567254597502212821">మీ బ్రౌజింగ్ హిస్టరీ, ఈ పరికరంలో Chromiumను ఉపయోగించి మీరు సందర్శించిన సైట్‌ల రికార్డ్.</translation>
<translation id="3575459661164320785">మీ కంప్యూటర్‌లో మీ భద్రతకు హాని కలిగించే సాఫ్ట్‌వేర్‌ ఉంది. మీ బ్రౌజర్‌ని మళ్లీ సాధారణంగా పని చేసేలా చేయడానికి Chromium దానిని తీసివేసి, మీ సెట్టింగ్‌లను పునరుద్ధరించి, ఎక్స్‌టెన్షన్‌లను నిలిపివేయగలదు.</translation>
@@ -142,7 +142,7 @@
<translation id="4222932583846282852">రద్దు చేస్తోంది...</translation>
<translation id="4230135487732243613">మీ Chromium డేటాను ఈ ఖాతాకు జోడించాలా?</translation>
<translation id="4271805377592243930">Chromium గురించి సహాయాన్ని పొందండి</translation>
-<translation id="4285930937574705105">పేర్కొనబడని ఎర్రర్ కారణంగా ఇన్‌స్టాలేషన్ విఫలమైంది. ప్రస్తుతం Chromium అమలు చేయబడుతుంటే, దయచేసి దీనిని మూసివేసి, మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="4285930937574705105">పేర్కొనబడని ఎర్రర్ కారణంగా ఇన్‌స్టాలేషన్ విఫలమైంది. ప్రస్తుతం Chromium అమలు చేయబడుతుంటే, దయచేసి దీనిని మూసివేసి, మళ్లీ ట్రై చేయండి.</translation>
<translation id="4304713468139749426">పాస్‌వర్డ్ మేనేజర్</translation>
<translation id="4334294535648607276">డౌన్‌లోడ్ పూర్తయింది.</translation>
<translation id="439358628917130594">మీరు ఈ పరికరాన్ని ఉపయోగించడానికి ముందు సర్వీస్ నియమాలను చదివి, అంగీకరించాలని <ph name="MANAGER" /> కోరుతోంది. ఈ నియమాలు ChromiumOS నియమాలను విస్తరింపజేయవు, సవరించవు లేదా పరిమితం చేయవు.</translation>
@@ -221,7 +221,7 @@
<translation id="6134968993075716475">సురక్షిత బ్రౌజింగ్ ఆఫ్ చేయబడింది. దాన్ని ఆన్ చేయమని Chromium సిఫార్సు చేస్తోంది.</translation>
<translation id="6145820983052037069">మీరు ఇక్కడ Chromium ప్రొఫైళ్ల మధ్య స్విచ్ అవ్వవచ్చు</translation>
<translation id="6183079672144801177">మీ <ph name="TARGET_DEVICE_NAME" />లో మీరు Chromiumకు సైన్ ఇన్ చేశారని నిర్ధారించుకుని, ఆపై మళ్లీ పంపడానికి ట్రై చేయండి.</translation>
-<translation id="6212496753309875659">ఈ కంప్యూటర్‌లో ఇప్పటికే మరింత తాజాదైన Chromium వెర్షన్ ఉంది. సాఫ్ట్‌వేర్ పని చేయకపోతే, దయచేసి Chromiumను అన్ఇన్‌స్టాల్ చేసి, మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="6212496753309875659">ఈ కంప్యూటర్‌లో ఇప్పటికే మరింత తాజాదైన Chromium వెర్షన్ ఉంది. సాఫ్ట్‌వేర్ పని చేయకపోతే, దయచేసి Chromiumను అన్ఇన్‌స్టాల్ చేసి, మళ్లీ ట్రై చేయండి.</translation>
<translation id="6219195342503754812">{0,plural, =0{Chromium ఇప్పుడు తిరిగి ప్రారంభించబడుతుంది}=1{1 సెకనులో Chromium తిరిగి ప్రారంభించబడుతుంది}other{# సెకన్లలో Chromium తిరిగి ప్రారంభించబడుతుంది}}</translation>
<translation id="6241367896540709610">ఫైళ్లను డౌన్‌లోడ్ చేయడానికి Chromiumకు స్టోరేజ్ యాక్సెస్‌కు సంబంధించిన అనుమతి అవసరం</translation>
<translation id="6245734527075554892">Chromiumలో స్టోర్ చేయబడిన సురక్షితం కాని సైట్‌ల లిస్ట్‌తో కూడిన URLలను చెక్ చేస్తుంది</translation>
@@ -235,7 +235,7 @@
<translation id="6309712487085796862">Chromium మీ కెమెరాను ఉపయోగిస్తోంది.</translation>
<translation id="632355235628111698">Chromium ఈ ఫైల్‌ను బ్లాక్ చేసింది, ఎందుకంటే ఇది ప్రమాదకరమైనది</translation>
<translation id="6327105987658262776">అప్‌డేట్ ఏదీ అందుబాటులో లేదు.</translation>
-<translation id="6333502561965082103">Chromiumలో మరొక వ్యవస్థాపన జరుగుతోంది. దయచేసి తర్వాత మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="6333502561965082103">Chromiumలో మరొక వ్యవస్థాపన జరుగుతోంది. దయచేసి తర్వాత మళ్లీ ట్రై చేయండి.</translation>
<translation id="6334986366598267305">ఇప్పుడు మీ Google ఖాతాతో, షేర్ చేయ‌బ‌డిన కంప్యూట‌ర్‌ల‌లో Chromiumను సులభంగా ఉపయోగించవచ్చు.</translation>
<translation id="6373523479360886564">మీరు ఖచ్చితంగా Chromiumను అన్ఇన్‌స్టాల్ చేయాలనుకుంటున్నారా?</translation>
<translation id="6384011394608460044"><ph name="BEGIN_BOLD" />మేము ఈ డేటాను ఎలా ఉపయోగిస్తాము:<ph name="END_BOLD" /> Chromium మీ ఆసక్తులను అంచనా వేయగలదు. తర్వాత, మీరు చూసే యాడ్‌లను వ్యక్తిగతీకరించడం కోసం, మీరు సందర్శించే సైట్ మీ ఆసక్తులను చూడమని Chromiumను అడగవచ్చు.</translation>
@@ -283,7 +283,7 @@
<translation id="705851970750939768">Chromiumను అప్‌డేట్ చేయి</translation>
<translation id="7067091210845072982">చిత్రంలో ఉపయోగకరమైన వివరణ లేకుంటే, మీ కోసం ఒక వివరణను అందించడానికి Chromium ప్రయత్నిస్తుంది. వివరణలను క్రియేట్ చేయడానికి, చిత్రాలు Googleకు పంపబడతాయి.</translation>
<translation id="718435575166326686">ఈ సైట్ కోసం Chromiumకు కెమెరా అనుమతి అవసరం</translation>
-<translation id="7196312274710523067">Chromiumను ప్రారంభించడం సాధ్యపడలేదు. మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="7196312274710523067">Chromiumను ప్రారంభించడం సాధ్యపడలేదు. మళ్లీ ట్రై చేయండి.</translation>
<translation id="7197677400338048821">Chromium మీ పాస్‌వర్డ్‌లను చెక్ చేయలేకపోయింది. 24 గంటల తర్వాత మళ్లీ ట్రై చేయండి.</translation>
<translation id="7223968959479464213">విధి నిర్వాహకుడు - Chromium</translation>
<translation id="7246575524853130370">Chromium అంచనా ఆధారంగా మీ ఆసక్తులు</translation>
@@ -299,7 +299,7 @@
<translation id="7451052299415159299">ఈ సైట్ కోసం మీ కెమెరాను యాక్సెస్ చేయడానికి Chromiumకు అనుమతి అవసరం</translation>
<translation id="7461356015007898716">భవిష్యత్తులో Chromium అప్‌డేట్‌లను పొందడానికి, మీకు Windows 10 లేదా ఆ తర్వాత వచ్చిన ఏదైనా వెర్షన్ అవసరం అవుతుంది. ఈ కంప్యూటర్ Windows 7ను ఉపయోగిస్తోంది.</translation>
<translation id="7467949745582939695">Chromiumను రీ-లాంచ్ చేయాలా?</translation>
-<translation id="7483335560992089831">ప్రస్తుతం అమలు అవుతోన్న అదే Chromium వెర్షన్‌ను ఇన్‌స్టాల్ చేయలేరు. దయచేసి Chromiumను మూసివేసి, మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="7483335560992089831">ప్రస్తుతం అమలు అవుతోన్న అదే Chromium వెర్షన్‌ను ఇన్‌స్టాల్ చేయలేరు. దయచేసి Chromiumను మూసివేసి, మళ్లీ ట్రై చేయండి.</translation>
<translation id="753534427205733210">{0,plural, =1{1 నిమిషంలో Chromium తిరిగి ప్రారంభించబడుతుంది}other{# నిమిషాల్లో Chromium తిరిగి ప్రారంభించబడుతుంది}}</translation>
<translation id="7561906087460245826">అలాగే (<ph name="URL" />)లో ఉన్న Chromiumకి సంబంధించిన డేటాను తీసివేయండి</translation>
<translation id="7582945390259497898">Chromium మీ ఆసక్తులను అంచనా వేయగలదు. తర్వాత, మీరు చూసే యాడ్‌లను వ్యక్తిగతీకరించడం కోసం, మీరు సందర్శించే సైట్ మీ ఆసక్తులను చూడమని Chromiumను అడగవచ్చు.</translation>
diff --git a/chromium/chrome/app/resources/chromium_strings_zh-TW.xtb b/chromium/chrome/app/resources/chromium_strings_zh-TW.xtb
index 0ebb03e076b..21492d38226 100644
--- a/chromium/chrome/app/resources/chromium_strings_zh-TW.xtb
+++ b/chromium/chrome/app/resources/chromium_strings_zh-TW.xtb
@@ -312,7 +312,7 @@ Chromium 無法復原你的設定。</translation>
<translation id="7617377681829253106">Chromium 變得更進步了</translation>
<translation id="7649070708921625228">說明</translation>
<translation id="7682213815243802460">你可以前往 Chrome 設定進一步瞭解這些功能。</translation>
-<translation id="7682601070171973634">Chromium 正在探索新功能,讓網站能在使用較少資料的情況下提供相同的瀏覽體驗</translation>
+<translation id="7682601070171973634">Chromium 團隊正在研究新功能,設法讓網站減少存取個人資訊的情況,同時讓使用者享有相同的瀏覽體驗</translation>
<translation id="7686590090926151193">Chromium 不是你的預設瀏覽器</translation>
<translation id="7689606757190482937">進行同步處理即可在你的所有裝置上享有個人化的 Chromium 體驗</translation>
<translation id="7745317241717453663">登出後,系統會將你的瀏覽資料從這個裝置上刪除。日後如要重新取得你的資料,請以 <ph name="USER_EMAIL" /> 身分登入 Chromium。</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_af.xtb b/chromium/chrome/app/resources/generated_resources_af.xtb
index 5ce15fe960d..0d7a2ecd444 100644
--- a/chromium/chrome/app/resources/generated_resources_af.xtb
+++ b/chromium/chrome/app/resources/generated_resources_af.xtb
@@ -6755,7 +6755,7 @@ Jy het nog # gekompromitteerde wagwoorde. Google Wagwoordbestuurder beveel aan d
<translation id="7055451306017383754">Kon nie ontdeel nie want 'n program gebruik tans hierdie vouer. Die vouer sal ontdeel word wanneer Parallels Dekstop weer afgeskakel word.</translation>
<translation id="7056418393177503237">{0,plural, =1{Incognito}other{# oop Incognito-vensters}}</translation>
<translation id="7056526158851679338">Ondersoek toestelle</translation>
-<translation id="7057184853669165321">{NUM_MINS,plural, =1{Veiligheidskontrole het 1 minuut gelede plaasgevind}other{Veiligheidskontrole het {NUM_MINS} minute gelede plaasgevind}}</translation>
+<translation id="7057184853669165321">{NUM_MINS,plural, =1{Veiligheidsbevestiging het 1 minuut gelede plaasgevind}other{Veiligheidsbevestiging het {NUM_MINS} minute gelede plaasgevind}}</translation>
<translation id="7057767408836081338">Kon nie programdata verkry nie; probeer steeds om die program te laat loop …</translation>
<translation id="7058024590501568315">Versteekte netwerk</translation>
<translation id="7059858479264779982">Stel na outo-begin</translation>
@@ -7096,7 +7096,7 @@ Jy het nog # gekompromitteerde wagwoorde. Google Wagwoordbestuurder beveel aan d
<translation id="7401778920660465883">Maak hierdie boodskap toe</translation>
<translation id="7403642243184989645">Laai tans hulpbronne af</translation>
<translation id="7404065585741198296">Jou foon met 'n USB-kabel</translation>
-<translation id="7405938989981604410">{NUM_HOURS,plural, =1{Veiligheidskontrole het 1 uur gelede plaasgevind}other{Veiligheidskontrole het {NUM_HOURS} uur gelede plaasgevind}}</translation>
+<translation id="7405938989981604410">{NUM_HOURS,plural, =1{Veiligheidsbevestiging het 1 uur gelede plaasgevind}other{Veiligheidsbevestiginghet {NUM_HOURS} uur gelede plaasgevind}}</translation>
<translation id="740624631517654988">Opspringer geblokkeer</translation>
<translation id="7406912950279255498">Kleuromkeringmodus</translation>
<translation id="7407430846095439694">Voer in en bind</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_am.xtb b/chromium/chrome/app/resources/generated_resources_am.xtb
index 5bf4e0db954..ac429e447ea 100644
--- a/chromium/chrome/app/resources/generated_resources_am.xtb
+++ b/chromium/chrome/app/resources/generated_resources_am.xtb
@@ -15,7 +15,7 @@
<translation id="1009454959501038262">{NUM_SITES,plural, =1{ውሂብዎን ለመጠበቅ ፈቃዶች በ2 ወራት ውስጥ ካልጎበኙት ጣቢያ ተወግደዋል}one{ውሂብዎን ለመጠበቅ ፈቃዶች በ2 ወራት ውስጥ ካልጎበኙት ጣቢያ ተወግደዋል}other{ውሂብዎን ለመጠበቅ ፈቃዶች በ2 ወራት ውስጥ ካልጎበኟቸው ጣቢያዎች ተወግደዋል}}</translation>
<translation id="1009663062402466586">የጨዋታ መቆጣጠሪያዎች አሁን ይገኛሉ</translation>
<translation id="1010498023906173788">ይህ ትር ከተከታታይ ወደብ ጋር ተገናኝቷል።</translation>
-<translation id="1010833424573920260">{NUM_PAGES,plural, =1{ገጽ ምላሽ አይሰጥም}one{ገጾች ምላሽ አይሰጡም}other{ገጾች ምላሽ አይሰጡም}}</translation>
+<translation id="1010833424573920260">{NUM_PAGES,plural, =1{ገፅ ምላሽ አይሰጥም}one{ገጾች ምላሽ አይሰጡም}other{ገጾች ምላሽ አይሰጡም}}</translation>
<translation id="1011003645819296594">የተቀመጡ መሣሪያዎች</translation>
<translation id="1011355516189274711">የጽሑፍ-ወደ-ንግግር ድምፅ መጠን</translation>
<translation id="1012794136286421601">የእርስዎ የሰነዶች፣ ሉሆች፣ ተንሸራታቾች እና ስዕሎች ፋይሎች በመመሳሰል ላይ ናቸው። መስመር ላይ ወይም ከመስመር ውጭ እንዲደርሱባቸው የGoogle Drive መተግበሪያውን ይክፈቱ።</translation>
@@ -79,7 +79,7 @@
<translation id="106814709658156573">የጣት አሻራን ለማዋቀር በቁልፍ ሰሌዳው ከታች በስተግራ ጥግ የሚገኘውን የጣት አሻራ ዳሳሽ ልጅዎ እንዲነካው ያድርጉ። የልጅዎ የጣት አሻራ ውሂብ ደህንነቱ በተጠበቀ ሁኔታ ይከማቻል እና በጭራሽ ከዚህ <ph name="DEVICE_TYPE" /> አይወጣም።</translation>
<translation id="1069104208554708737">ይህ የይለፍ ቁልፍ እዚህ መሣሪያ ላይ ብቻ ይቀመጣል</translation>
<translation id="1069355737714877171"><ph name="PROFILE_NAME" /> የተባለውን የኢሲም መገለጫን ያስወግዱ</translation>
-<translation id="1069814191880976658">የተለየ ማያ ገጽ ምረጥ</translation>
+<translation id="1069814191880976658">የተለየ ማያ ገፅ ምረጥ</translation>
<translation id="1070377999570795893">በኮምፒውተርዎ ላይ ያለ ሌላ ፕሮግራም Chrome የሚሰራበት መንገድ ሊቀይር የሚችል አንድ ቅጥያ አክሏል።
<ph name="EXTENSION_NAME" /></translation>
@@ -97,7 +97,7 @@
<translation id="1079766198702302550">ሁልጊዜ የካሜራ መዳረሻ አግድ</translation>
<translation id="1081956462909987459">{NUM_TABS,plural, =1{<ph name="GROUP_TITLE" /> - 1 ትር}one{<ph name="GROUP_TITLE" /> - # ትሮች}other{<ph name="GROUP_TITLE" /> - # ትሮች}}</translation>
<translation id="1082214733466244292">የእርስዎ አስተዳዳሪ ለዚህ መሣሪያ አንዳንድ ተግባራትን አግዷል</translation>
-<translation id="1082398631555931481"><ph name="THIRD_PARTY_TOOL_NAME" />የእርስዎ Chrome ቅንብሮች ወደ የመጀመሪያቸው ነባሪዎች መመለስ ፈልጓል። ይሄ የእርስዎን መነሻ ገጽ፣ አዲስ የትር ገጽ እና የፍለጋ ፕሮግራም ዳግም ያስጀምራቸዋል፣ ቅጥያዎችዎን ያሰናክላቸዋል፣ እና ሁሉንም ትሮች ይነቅላቸዋል። እንዲሁም ሌሎች እንደ ኩኪዎች፣ ይዘት እና የጣቢያ ውሂብ ያለ ጊዜያዊ እና የተሸጎጠ ውሂብንም ያጸዳል።</translation>
+<translation id="1082398631555931481"><ph name="THIRD_PARTY_TOOL_NAME" />የእርስዎ Chrome ቅንብሮች ወደ የመጀመሪያቸው ነባሪዎች መመለስ ፈልጓል። ይሄ የእርስዎን መነሻ ገፅ፣ አዲስ የትር ገፅ እና የፍለጋ ፕሮግራም ዳግም ያስጀምራቸዋል፣ ቅጥያዎችዎን ያሰናክላቸዋል፣ እና ሁሉንም ትሮች ይነቅላቸዋል። እንዲሁም ሌሎች እንደ ኩኪዎች፣ ይዘት እና የጣቢያ ውሂብ ያለ ጊዜያዊ እና የተሸጎጠ ውሂብንም ያጸዳል።</translation>
<translation id="1082725763867769612">የመስመር ውጭ ፋይሎች</translation>
<translation id="1084096383128641877">ይህን የይለፍ ቃል ማስወገድ <ph name="DOMAIN" /> ላይ መለያዎን አይሰርዘውም። መለያዎን ከሌሎች ለመጠበቅ የይለፍ ቃልዎን ይቀይሩት ወይም <ph name="DOMAIN_LINK" /> ላይ መለያዎን ይሰርዙት።</translation>
<translation id="1084288067399862432">የተጠለፈው የይለፍ ቃል በተሳካ ሁኔታ ተቀይሯል።
@@ -114,7 +114,7 @@
<translation id="1093457606523402488">የሚታዩ አውታረ መረቦች፦</translation>
<translation id="1095761715416917775">የስምረት ውሂብዎን ሁልጊዜ መድረስ እንደሚችሉ ያረጋግጡ</translation>
<translation id="109647177154844434">Parallels ዴስክቶፕን ማራገፍ የWindows ምስልዎን ይሰርዘዋል። ይህ መተግበሪያዎቹን፣ ቅንብሮቹን እና ውሂቡን ያካትታል። እርግጠኛ ነዎት መቀጠል ይፈልጋሉ?</translation>
-<translation id="1097016918605049747">ይህን ገጽ መተርጎም አልተቻለም</translation>
+<translation id="1097016918605049747">ይህን ገፅ መተርጎም አልተቻለም</translation>
<translation id="1097658378307015415">ከመግባትዎ በፊት አውታረ መረብ <ph name="NETWORK_ID" />ን ለማንቃት እባክዎ እንደ እንግዳ ይግቡ</translation>
<translation id="1099383081182863812">የእርስዎን Chromecast በ<ph name="BEGIN_LINK" />Google Home መተግበሪያው<ph name="END_LINK" /> ውስጥ መመልከት ይችላሉ?</translation>
<translation id="1099962274138857708">ምስል ከ<ph name="DEVICE_NAME" /> ተቀድቷል</translation>
@@ -138,7 +138,7 @@
<translation id="1119447706177454957">ውስጣዊ ስህተት</translation>
<translation id="1122068467107743258">ሥራ</translation>
<translation id="1122198203221319518">&amp;መሣሪያዎች</translation>
-<translation id="1122242684574577509">ማረጋገጥ አልተሳካም። (<ph name="NETWORK_ID" />) እየተጠቀሙ ላሉበት Wi-Fi አውታረ መረብ የመግቢያ ገጽ ለመጎብኘት ጠቅ ያድርጉ።</translation>
+<translation id="1122242684574577509">ማረጋገጥ አልተሳካም። (<ph name="NETWORK_ID" />) እየተጠቀሙ ላሉበት Wi-Fi አውታረ መረብ የመግቢያ ገፅ ለመጎብኘት ጠቅ ያድርጉ።</translation>
<translation id="1122913801042512795">የእርስዎ መለያ በመለያ መግቢያ ዝርዝሮች ጊዜ ያለፈባቸው ናቸው። እባክዎ ዘግተው ይውጡ እና እንደገና በመለያ ይግቡ።</translation>
<translation id="1122960773616686544">የዕልባት ስም</translation>
<translation id="1124772482545689468">ተጠቃሚ</translation>
@@ -219,7 +219,7 @@
<translation id="1190086046506744802">በጣም ክፍተት ያለ</translation>
<translation id="11901918071949011">{NUM_FILES,plural, =1{ኮምፒውተርዎ ላይ የተከማቸ ፋይልን ይድርሱበት}one{ኮምፒውተርዎ ላይ የተከማቹ # ፋይሎችን ይድረሱባቸው}other{ኮምፒውተርዎ ላይ የተከማቹ # ፋይሎችን ይድረሱባቸው}}</translation>
<translation id="119092896208640858">በእርስዎ የGoogle መለያ ውስጥ እንዳለ ሆኖ ከዚህ መሣሪያ ብቻ የአሰሳ ውሂብን ለማጽዳት <ph name="BEGIN_LINK" />ዘግተው ይውጡ<ph name="END_LINK" />።</translation>
-<translation id="1191353342579061195">የእርስዎን ፍላጎቶች የሚያሟላውን ገጽታ ይምረጡ። የእርስዎን ገጽታ፣ ልጣፍ፣ የማያ ገጽ ማቆያ እና ሌሎች ለመቀየር በቀላሉ በዴስክቶፑ ላይ በቀኝ ጠቅ ያድርጉ።</translation>
+<translation id="1191353342579061195">የእርስዎን ፍላጎቶች የሚያሟላውን ገፅታ ይምረጡ። የእርስዎን ገፅታ፣ ልጣፍ፣ የማያ ገፅ ማቆያ እና ሌሎች ለመቀየር በቀላሉ በዴስክቶፑ ላይ በቀኝ ጠቅ ያድርጉ።</translation>
<translation id="1192706927100816598">{0,plural, =1{በ# ሰከንድ ውስጥ በራስ-ሰር ዘግተው እንዲወጡ ይደረጋሉ።
<ph name="DOMAIN" /> የእርስዎን ዘመናዊ ካርድ እንደገባ እንዲቆይ ይፈልግብዎታል።}one{በ# ሰከንዶች ውስጥ በራስ-ሰር ዘግተው እንዲወጡ ይደረጋሉ።
<ph name="DOMAIN" /> የእርስዎን ዘመናዊ ካርድ እንደገባ እንዲቆይ ይፈልግብዎታል።}other{በ# ሰከንዶች ውስጥ በራስ-ሰር ዘግተው እንዲወጡ ይደረጋሉ።
@@ -245,12 +245,12 @@
<translation id="1203942045716040624">የተጋራ ሰራተኛ፦ <ph name="SCRIPT_URL" /></translation>
<translation id="1211769675100312947">አቋራጮች ተመርጠው የሚሰበሰቡት በእርስዎ ነው</translation>
<translation id="1213254615020057352">የአጠቃቀም እና የምርመራ ውሂብ ይላኩ። የምርመራ፣ የመሣሪያ እና የመተግበሪያ አጠቃቀም ውሂብ በራስ-ሰር ወደ Google በመላክ የልጅዎን የAndroid ተሞክሮ እንዲሻሻል ያግዙ። ይህ ልጅዎን ለመለየት ስራ ላይ አይውልም፣ እና የስርዓት እና የመተግበሪያ እርጋታን እና ሌሎች ማሻሻያዎችን ያግዛል። አንዳንድ ውሑድ ውሂብ እንዲሁም የGoogle መተግበሪያዎችን እና እንደ የAndroid ገንቢዎች ያሉ አጋሮችን ያግዛሉ። ይህ ቅንብር በባለቤቱ ተፈጻሚ ይደረጋል። ባለቤቱ የዚህ መሣሪያ የምርመራ እና የአጠቃቀም ለGoogle ለመላክ ሊመርጥ ይችላሉ። የተጨማሪ የድር እና መተግበሪያ እንቅስቃሴ ቅንብር ለልጅዎ በርቶ ከሆነ ይህ ውሂብ ወደ የGoogle መለያቸው ሊቀመጥ ይችላል።</translation>
-<translation id="1213726621272705156">በዚህ ገጽ ላይ ካርዶችን እንደገና አያዩም</translation>
+<translation id="1213726621272705156">በዚህ ገፅ ላይ ካርዶችን እንደገና አያዩም</translation>
<translation id="121384500095351701">ይህ ፋይል ደህንነቱ በተጠበቀ ሁኔታ ሊወርድ አይችልም</translation>
<translation id="1215411991991485844">አዲስ የጀርባ መተግበሪያ ታክሏል</translation>
<translation id="1216542092748365687">የጣት አሻራን አስወግድ</translation>
<translation id="1216891999012841486">የዝማኔ ስሕተቶችን ስለማስተካከል የበለጠ ይወቁ</translation>
-<translation id="1217114730239853757">የChromeOS Flex አብሮገነብ የማያ ገጽ አንባቢ የሆነውን ChromeVox ማግበር ይፈልጋሉ? የሚፈልጉ ከሆነ የክፍተት አሞሌን ይጫኑ።</translation>
+<translation id="1217114730239853757">የChromeOS Flex አብሮገነብ የማያ ገፅ አንባቢ የሆነውን ChromeVox ማግበር ይፈልጋሉ? የሚፈልጉ ከሆነ የክፍተት አሞሌን ይጫኑ።</translation>
<translation id="1217483152325416304">የእርስዎ አካባቢያዊ ውሂብ በቅርቡ ይሰረዛል</translation>
<translation id="1217668622537098248">ከእርምጃ በኋላ ወደ ግራ ጠቅታ አድህር</translation>
<translation id="121783623783282548">የይለፍ ቃላትዎ አይዛመዱም።</translation>
@@ -303,8 +303,8 @@
<translation id="1261380933454402672">መለስተኛ</translation>
<translation id="126156426083987769">በቅንጭብ ማሳያ ሁነታ ፈቃዶች ችግር አጋጥሟል።</translation>
<translation id="1263231323834454256">የንባብ ዝርዝር</translation>
-<translation id="1263733306853729545">የዕጩ ዝርዝር ላይ ገጽ ለመፍጠር የ<ph name="MINUS" /> እና <ph name="EQUAL" /> ቁልፎችን ይጠቀሙ</translation>
-<translation id="126387934568812801">የተከፈቱ ትሮችን ቅጽበታዊ ገጽ ዕይታዎችን እና አርዕስቶችን አካትት</translation>
+<translation id="1263733306853729545">የዕጩ ዝርዝር ላይ ገፅ ለመፍጠር የ<ph name="MINUS" /> እና <ph name="EQUAL" /> ቁልፎችን ይጠቀሙ</translation>
+<translation id="126387934568812801">የተከፈቱ ትሮችን ቅጽበታዊ ገፅ ዕይታዎችን እና አርዕስቶችን አካትት</translation>
<translation id="1264083566674525434">የጣቢያ ፈቃዶችን ያርትዑ</translation>
<translation id="1264337193001759725">የአውታረ መረብ ዩአይ ምዝግብ ማስታወሻዎችን ለማየት ይህን ይመልከቱ፦ <ph name="DEVICE_LOG_LINK" /></translation>
<translation id="1265279736024499987">የእርስዎ መተግበሪያዎች እና ቅንብሮች በGoogle መለያዎ በገቡባቸው ሁሉም የChromeOS Flex መሣሪያዎች ላይ ይሰምራሉ። ለአሳሽ ስምረት አማራጮች ወደ <ph name="LINK_BEGIN" />የChrome ቅንብሮች<ph name="LINK_END" /> ይሂዱ።</translation>
@@ -344,7 +344,7 @@
<translation id="1303101771013849280">ለኤችቲኤምኤል ፋይል እልባት ያደርጋል</translation>
<translation id="1303671224831497365">ምንም የብሉቱዝ መሣሪያዎች አልተገኙም</translation>
<translation id="130491383855577612">Linux መተግበሪያዎች እና ፋይሎች በተሳካ ሁኔታ ተተክተዋል</translation>
-<translation id="1306390193749326011"><ph name="MODULE_NAME" />ን ከእንግዲህ ወዲያ በዚህ ገጽ ላይ ዳግም አያዩትም</translation>
+<translation id="1306390193749326011"><ph name="MODULE_NAME" />ን ከእንግዲህ ወዲያ በዚህ ገፅ ላይ ዳግም አያዩትም</translation>
<translation id="1306606229401759371">ቅንብሮችን ቀይር</translation>
<translation id="1307165550267142340">የእርስዎ ፒን ተፈጥሯል</translation>
<translation id="1307431692088049276">ዳግም አትጠይቀኝ</translation>
@@ -360,7 +360,7 @@
<translation id="1316248800168909509">ወደ <ph name="DEVICE" /> ማገናኘት አልተቻለም። እንደገና ይሞክሩ።</translation>
<translation id="1316495628809031177">ስምረት ባለበት ቆሟል</translation>
<translation id="1317637799698924700">የእርስዎ መትከያ ጣቢያ በ USB Type-C ተኳዃኝ ሁነታ ውስጥ ይሠራል።</translation>
-<translation id="1319983966058170660">የ<ph name="SUBPAGE_TITLE" /> ንዑስ ገጽ ተመለስ አዝራር</translation>
+<translation id="1319983966058170660">የ<ph name="SUBPAGE_TITLE" /> ንዑስ ገፅ ተመለስ አዝራር</translation>
<translation id="1322046419516468189">በእርስዎ <ph name="SAVED_PASSWORDS_STORE" /> ውስጥ የተቀመጡ የይለፍ ቃላትን ይመልከቱ እና ያስተዳድሩ</translation>
<translation id="1324106254079708331">የተነጣጠሩ ጥቃቶች አደጋ ያለበት የማንኛውም ሰው የግል Google መለያዎችን ይጠብቃል</translation>
<translation id="1327272175893960498">የKerberos ቲኬቶች</translation>
@@ -391,7 +391,7 @@
<translation id="1347512539447549782">የLinux ማከማቻ</translation>
<translation id="1347975661240122359">ባትሪው <ph name="BATTERY_LEVEL" />% ሲደርስ ዝማኔ ይጀምራል።</translation>
<translation id="1348966090521113558">የመዳፊት የተደራሽነት ቅንብሮች</translation>
-<translation id="1353275871123211385">እንደ የመተግበሪያ ማጽደቅ እና የማያ ገጽ ጊዜ ገደቦች ያሉ የወላጅ መቆጣጠሪያዎችን ለመጠቀም አንድ ልጅ በወላጅ የሚተዳደር የGoogle መለያ ሊኖረው ይገባል። የትምህርት ቤት መለያ በኋላ ላይ እንደ Google Classroom ላሉ መሣሪያዎች ሊታከል ይችላል።</translation>
+<translation id="1353275871123211385">እንደ የመተግበሪያ ማጽደቅ እና የማያ ገፅ ጊዜ ገደቦች ያሉ የወላጅ መቆጣጠሪያዎችን ለመጠቀም አንድ ልጅ በወላጅ የሚተዳደር የGoogle መለያ ሊኖረው ይገባል። የትምህርት ቤት መለያ በኋላ ላይ እንደ Google Classroom ላሉ መሣሪያዎች ሊታከል ይችላል።</translation>
<translation id="135389172849514421">ከመስመር ውጭ ይሰራል</translation>
<translation id="1353980523955420967">PPDን ማግኘት አልተቻለም። የእርስዎ Chromebook መስመር ላይ መሆኑን ያረጋግጡና እንደገና ይሞክሩ።</translation>
<translation id="1354045473509304750"><ph name="HOST" /> የእርስዎን ካሜራ እንዲጠቀም እና እንዲያንቀሳቅስ መፍቀዱን ይቀጥሉ</translation>
@@ -408,7 +408,7 @@
<translation id="1373176046406139583">የእርስዎ የመሣሪያ ታይነት ማያ ገጽዎ ተከፍቶ ሳለ ማን ለእርስዎ ማጋራት እንደሚችል ይቆጣጠራል። <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation>
<translation id="1374844444528092021">በ«<ph name="NETWORK_NAME" />» አውታረ መረብ የተፈለገው የእውቅና ማረጋገጫ ወይም አልተጫነም ወይም ከአሁን በኋላ እሴት ያለው አይደለም። እባክዎ አዲስ የእውቅና ማረጋገጫ ያግኙና እንደገና ለመገናኘት ይሞክሩ።</translation>
<translation id="1375321115329958930">የተቀመጡ የይለፍ ቃላት</translation>
-<translation id="1375557162880614858">የChromeOS Flex አብሮገነብ የማያ ገጽ አንባቢ የሆነውን ChromeVox ማግበር ይፈልጋሉ?</translation>
+<translation id="1375557162880614858">የChromeOS Flex አብሮገነብ የማያ ገፅ አንባቢ የሆነውን ChromeVox ማግበር ይፈልጋሉ?</translation>
<translation id="1375938286942050085">ውቅረት ተጠናቅቋል! ቀጥሎ መሣሪያዎን ለጨዋታ ዝግጁ ያድርጉ</translation>
<translation id="137651782282853227">የተቀመጡ አድራሻዎች እዚህ ይታያሉ</translation>
<translation id="1376771218494401509">&amp;መስኮትን ሰይም...</translation>
@@ -422,7 +422,7 @@
<translation id="1383861834909034572">ሲጠናቀቅ መክፈት</translation>
<translation id="1383876407941801731">ፍለጋ </translation>
<translation id="1384849755549338773">በሌሎች ቋንቋዎች ላሉ ድር ጣቢያዎች የGoogle ትርጉምን ያቅርቡ</translation>
-<translation id="138784436342154190">ነባሪ የጅምር ገጽ ወደነበረበት ገጽ ይመለስ?</translation>
+<translation id="138784436342154190">ነባሪ የጅምር ገፅ ወደነበረበት ገፅ ይመለስ?</translation>
<translation id="1388253969141979417">ማይክሮፎንዎን እንደሚጠቀሙበት ተፈቅዷል</translation>
<translation id="1388728792929436380">ዝማኔዎች ሲጠናቀቁ <ph name="DEVICE_TYPE" /> ዳግም ይነሳል።</translation>
<translation id="1389601498324964367">በኮታ የሚተዳደር ማከማቻ</translation>
@@ -459,7 +459,7 @@
<translation id="1414315029670184034">ጣቢያዎች ካሜራዎን እንዲጠቀሙ አይፍቀዱ</translation>
<translation id="1414648216875402825">በሂደት ላይ ያሉ ባህሪያትን የያዘ ያልተረጋጋ ወደሆነ የ<ph name="PRODUCT_NAME" /> ስሪት እያዘመኑ ነው። ብልሽቶች እና ያልተጠበቁ ሳንካዎች ያጋጥማሉ። እባክዎ በጥንቃቄ ይቀጥሉ።</translation>
<translation id="1415708812149920388">የቅንጥብ ሰሌዳ መዳረሻ ተከልክሏል</translation>
-<translation id="1415990189994829608"><ph name="EXTENSION_NAME" /> (የቅጥያ መታወቂያ «<ph name="EXTENSION_ID" />») በዚህ የክፍለ-ጊዜ አይነት ላይ አይፈቀድም።</translation>
+<translation id="1415990189994829608"><ph name="EXTENSION_NAME" /> (የቅጥያ መታወቂያ «<ph name="EXTENSION_ID" />») በዚህ የክፍለ-ጊዜ ዓይነት ላይ አይፈቀድም።</translation>
<translation id="1417428793154876133">{NUM_APPS,plural, =1{መተግበሪያ አስወግድ}one{መተግበሪያዎችን አስወግድ}other{መተግበሪያዎችን አስወግድ}}</translation>
<translation id="1417497355604638350">የምርመራ እና የአጠቃቀም ውሂብ ይላኩ።</translation>
<translation id="1418552618736477642">ማሳወቂያዎች እና መተግበሪያዎች</translation>
@@ -491,8 +491,8 @@
<translation id="1431188203598586230">የመጨረሻ የሶፍትዌር ዝማኔ</translation>
<translation id="1432581352905426595">የፍለጋ ፕሮግራሞችን ያቀናብሩ</translation>
<translation id="1433478348197382180">የንባብ ሁነታ</translation>
-<translation id="1434696352799406980">ይህ የእርስዎን የመነሻ ገጽ፣ አዲስ የትር ገጽ፣ የፍለጋ ፕሮግራምን እና የተሰኩ ትሮችን ዳግም ያቀናብራቸዋል። እንዲሁም ሁሉንም ቅጥያዎች ያሰናክላል እና እንደ ኩኪዎች ያለ ጊዜያዊ ውሂብን ያጸዳል። የእርስዎ ዕልባቶች፣ ታሪክ እና የተቀመጡ የይለፍ ቃላት አይጸዱም።</translation>
-<translation id="1434886155212424586">መነሻ ገጽ አዲሱ የትር ገጽ ነው</translation>
+<translation id="1434696352799406980">ይህ የእርስዎን የመነሻ ገፅ፣ አዲስ የትር ገፅ፣ የፍለጋ ፕሮግራምን እና የተሰኩ ትሮችን ዳግም ያቀናብራቸዋል። እንዲሁም ሁሉንም ቅጥያዎች ያሰናክላል እና እንደ ኩኪዎች ያለ ጊዜያዊ ውሂብን ያጸዳል። የእርስዎ ዕልባቶች፣ ታሪክ እና የተቀመጡ የይለፍ ቃላት አይጸዱም።</translation>
+<translation id="1434886155212424586">መነሻ ገፅ አዲሱ የትር ገፅ ነው</translation>
<translation id="1436390408194692385">ለ<ph name="TICKET_TIME_LEFT" /> የሚሰራ</translation>
<translation id="1436784010935106834">ተወግዷል</translation>
<translation id="1437986450143295708">ችግሩን በዝርዝር ይግለጹ</translation>
@@ -507,9 +507,9 @@
አስቀድመው ለመተግበሪያዎች የሰጧቸው ፈቃዶች በዚህ መለያ ላይ ተፈጻሚ ሊሆኑ ይችላሉ። ለAndroid መተግበሪያዎች ፈቃዶችን በ<ph name="APPS_LINK_BEGIN" />መተግበሪያዎች ቅንብሮች<ph name="APPS_LINK_END" /> ውስጥ መቆጣጠር ይችላሉ።</translation>
<translation id="1448779317883494811">የብሩሽ መሣሪያ</translation>
<translation id="1449191289887455076">ምደባን እና <ph name="RESPONSE" />ን ለማረጋገጥ «<ph name="CURRENTKEY" />»ን በድጋሜ ይጫኑ።</translation>
-<translation id="1451375123200651445">ድረ-ገጽ፣ ነጠላ ፋይል</translation>
+<translation id="1451375123200651445">ድረ-ገፅ፣ ነጠላ ፋይል</translation>
<translation id="1453561711872398978"><ph name="BEGIN_LINK" />የስህተት እርማት<ph name="END_LINK" /> ምዝግብ ማስታወሻዎችን ላክ (የሚመከር)</translation>
-<translation id="1454223536435069390">ቅጽበታዊ ገጽ እይታ አ&amp;ንሳ</translation>
+<translation id="1454223536435069390">ቅጽበታዊ ገፅ እይታ አ&amp;ንሳ</translation>
<translation id="145432137617179457">የፊደል አራሚ ቋንቋዎች</translation>
<translation id="1455119378540982311">የቅድመ-ቅምጥ መስኮት መጠኖች</translation>
<translation id="1457907785077086338">የመተግበሪያ ባጅ ቀለም</translation>
@@ -541,7 +541,7 @@
<translation id="1477654881618305065">የእርስዎ ድርጅት ይህን ይዘት እርስዎ እንዲያጋሩ አይፈቅድም። እገዛ ካስፈለገዎት አስተዳዳሪዎን ያነጋግሩ።</translation>
<translation id="1478340334823509079">ዝርዝሮች፦ <ph name="FILE_NAME" /></translation>
<translation id="1478607704480248626">መጫን አልነቃም</translation>
-<translation id="1480571698637441426">ጥያቄዎችን በሚጠይቁበት ጊዜ የተበጁ ምላሾችን ለማግኘት ረዳትዎ በማያ ገጽዎ ላይ ያለው ቅጽበታዊ ገጽ እይታን እንዲደርስ ይፍቀዱለት። ይህ እንዲሁም በመጫወት ላይ ያሉ የዘፈኖች ወይም የቪዲዮዎች መረጃን ሊያካትት ይችላል።</translation>
+<translation id="1480571698637441426">ጥያቄዎችን በሚጠይቁበት ጊዜ የተበጁ ምላሾችን ለማግኘት ረዳትዎ በማያ ገፅዎ ላይ ያለው ቅጽበታዊ ገፅ እይታን እንዲደርስ ይፍቀዱለት። ይህ እንዲሁም በመጫወት ላይ ያሉ የዘፈኖች ወይም የቪዲዮዎች መረጃን ሊያካትት ይችላል።</translation>
<translation id="1480663089572535854">ለ«ምረጥ» የተሰጠውን ተልዕኮ ለመቀየር ተመልሰው መሄድ ይችላሉ። በቅንብሮች ውስጥ ሁልጊዜ ራስ-ቃኝን ማጥፋት ይችላሉ።</translation>
<translation id="1481537595330271162">የዲስክ መጠንን መቀየር ላይ ስህተት</translation>
<translation id="1482626744466814421">ይህን ትር ዕልባት ያድርጉት...</translation>
@@ -564,7 +564,7 @@
<translation id="1504551620756424144">የተጋሩ አቃፊዎች <ph name="BASE_DIR" /> ላይ በWindows ላይ ይገኛሉ።</translation>
<translation id="1505494256539862015">የይለፍ ቃላትን ወደ ውጭ ላክ</translation>
<translation id="1506061864768559482">የፍለጋ ፕሮግራም</translation>
-<translation id="1507170440449692343">ይህ ገጽ ካሜራዎን እንዳይደርስበት ታግዷል።</translation>
+<translation id="1507170440449692343">ይህ ገፅ ካሜራዎን እንዳይደርስበት ታግዷል።</translation>
<translation id="1507246803636407672">አ&amp;ስወግድ</translation>
<translation id="1509163368529404530">ቡድንን &amp;ወደነበረበት መልስ</translation>
<translation id="1509281256533087115">በዩኤስቢ በኩል ማንኛውም <ph name="DEVICE_NAME_AND_VENDOR" /> ይደርሳል</translation>
@@ -602,7 +602,7 @@
<translation id="1535228823998016251">ጮክ ያለ</translation>
<translation id="1535753739390684432">የተወሰነ ጽሁፍ ጮክ ተብሎ ሲነበብ ይስሙ። መጀመሪያ በማያ ገጽዎ ግርጌ ላይ ያለውን የለመናገር ምረጥ አዶውን ይምረጡ፣ ከዚያ ጽሑፉን ያድምቁ።</translation>
<translation id="1536754031901697553">ግንኙነት በማቋረጥ ላይ...</translation>
-<translation id="1537254971476575106">የሙሉ ማያ ገጽ ማጉያ</translation>
+<translation id="1537254971476575106">የሙሉ ማያ ገፅ ማጉያ</translation>
<translation id="15373452373711364">ትልቅ የመዳፊት ጠቋሚ</translation>
<translation id="1540605929960647700">የማሳያ ሁነታውን ያንቁ</translation>
<translation id="1541346352678737112">ምንም አውታረ መረብ አልተገኘም</translation>
@@ -614,7 +614,7 @@
<translation id="1545749641540134597">የኪውአር ኮድ ይቃኙ</translation>
<translation id="1545775234664667895">የተጫነ ገጽታ '<ph name="THEME_NAME" />'</translation>
<translation id="1546031833947068368">{COUNT,plural, =1{የእርስዎ ማንነትን የማያሳውቅ መስኮት እንደገና አይከፈትም።}one{የእርስዎ # ማንነትን የማያሳውቅ መስኮት እንደገና አይከፈትም።}other{የእርስዎ # ማንነትን የማያሳውቁ መስኮቶች እንደገና አይከፈቱም።}}</translation>
-<translation id="1546280085599573572">ይህ ቅጥያ የመነሻ አዝራሩን ጠቅ ሲያደርጉ የሚታየውን ገጽ ቀይሮታል።</translation>
+<translation id="1546280085599573572">ይህ ቅጥያ የመነሻ አዝራሩን ጠቅ ሲያደርጉ የሚታየውን ገፅ ቀይሮታል።</translation>
<translation id="1546452108651444655"><ph name="CHILD_NAME" /> የሚከተሉትን ማድረግ የሚችል <ph name="EXTENSION_TYPE" /> መጫን ይፈልጋል፦</translation>
<translation id="1547123415014299762">የሶስተኛ ወገን ኩኪዎች ይፈቀዳሉ</translation>
<translation id="1547808936554660006">የተጫኑ የኢሲም መገለጫዎች በPowerwash እንደማይወገዱ እረዳለሁ</translation>
@@ -748,7 +748,7 @@
<translation id="1644574205037202324">ታሪክ</translation>
<translation id="1644852018355792105">ለመሣሪያ <ph name="DEVICE" /> የብሉቱዝ የይለፍ ቁልፍን ያስገቡ</translation>
<translation id="1645004815457365098">ያልታወቀ ምንጭ</translation>
-<translation id="1645516838734033527">የእርስዎን <ph name="DEVICE_TYPE" /> ደህንነቱ እንደተጠበቀ ለማቆየት Smart Lock በእርስዎ ስልክ ላይ የማያ ገጽ መቆለፊያ ያስፈልገዋል።</translation>
+<translation id="1645516838734033527">የእርስዎን <ph name="DEVICE_TYPE" /> ደህንነቱ እንደተጠበቀ ለማቆየት Smart Lock በእርስዎ ስልክ ላይ የማያ ገፅ መቆለፊያ ያስፈልገዋል።</translation>
<translation id="1646982517418478057">ይህን የዕውቅና ማረጋገጫ ፋይል ለማመስጠር እባክዎ የይለፍ ቃል ያስገቡ</translation>
<translation id="1647408325348388858">በዚህ የድር መተግበሪያ ውስጥ <ph name="FILE_NAME" />ን ይከፈት እና ያርትዑ?</translation>
<translation id="1648528859488547844">አካባቢን ለመወሰን Wi‑Fi፣ ብሉቱዝ ወይም የተንቀሳቃሽ ስልክ አውታረ መረቦችን ተጠቀም</translation>
@@ -758,7 +758,7 @@
<translation id="1656528038316521561">የበስተጀርባ ብርሃን-ከልነት</translation>
<translation id="1657406563541664238">የአጠቃቀም ስታቲክሶችን እና የስንኩል ሪፖርቶችን ወደ Google በቀጥታ በመላክ <ph name="PRODUCT_NAME" />ን የተሻለ ለማድረግ እገዛ ያድርጉ።</translation>
<translation id="1657937299377480641">የለትምህርታዊ ግብዓቶች መዳረሻን እንዲያገኙ እንደገና ወደ መለያ ለመግባት ወላጅ ፈቃድ እንዲሰጠዎት ይጠይቋቸው</translation>
-<translation id="1658424621194652532">ይህ ገጽ ማይክሮፎንዎን እየደረሰበት ነው።</translation>
+<translation id="1658424621194652532">ይህ ገፅ ማይክሮፎንዎን እየደረሰበት ነው።</translation>
<translation id="1660204651932907780">ጣቢያዎች ድምጽን እንዲያጫውቱ ፍቀድ (የሚመከር)</translation>
<translation id="1660763353352708040">የኃይል አስማሚ ችግር</translation>
<translation id="1661156625580498328">የAES ምሥጠራን ተግብር (የሚመከር)።</translation>
@@ -837,7 +837,7 @@
<translation id="1724801751621173132">ግቤት ቅጥ</translation>
<translation id="1725562816265788801">የትር ሽብለላ</translation>
<translation id="1726503915437308071">ሰያፍ ቅርጸ-ቁምፊ</translation>
-<translation id="1729533290416704613">እንዲሁም ከኦምኒቦክሱ ሆነው ሲፈልጉ የሚታየውን ገጽ ይቆጣጠራል።</translation>
+<translation id="1729533290416704613">እንዲሁም ከኦምኒቦክሱ ሆነው ሲፈልጉ የሚታየውን ገፅ ይቆጣጠራል።</translation>
<translation id="1730666151302379551">የቀድሞ የይለፍ ቃልን ዘንጋ</translation>
<translation id="1730917990259790240"><ph name="BEGIN_PARAGRAPH1" />መተግበሪያዎችን ለማስወገድ ወደ ቅንብሮች &gt; Google Play መደብር &gt; የAndroid ምርጫዎችን ያስተዳድሩ &gt;መተግበሪያዎች ወይም የመተግበሪያ አስተዳዳሪ ይሂዱ። ከዚያ ለማራገፍ የሚፈልጉትን መተግበሪያ መታ ያድርጉ (መተግበሪያውን ለማግኘት ወደ ቀኝ ወይም ወደ ግራ ማንሸራተት ሊኖርብዎት ይችላል)። ከዚያ አራግፍ ወይም አሰናክል የሚለውን መታ ያድርጉ።<ph name="END_PARAGRAPH1" /></translation>
<translation id="1730989807608739928">ወደ የመጨረሻው ትር ይሸብልሉ</translation>
@@ -854,7 +854,7 @@
<translation id="1741314857973421784">ቀጥል</translation>
<translation id="1743970419083351269">የውርዶች አሞሌን ዝጋ</translation>
<translation id="1744060673522309905">መሣሪያውን ከጎራው ጋር ማቀላቀል አልተቻለም። ማከል ከሚችሉት የመሣሪያዎች ብዛት አለመብለጥዎን ያረጋግጡ።</translation>
-<translation id="1744108098763830590">የጀርባ ገጽ</translation>
+<translation id="1744108098763830590">የጀርባ ገፅ</translation>
<translation id="1745732479023874451">እውቂያዎችን ያስተዳድሩ</translation>
<translation id="1748283190377208783">{0,plural, =1{ሥራ ላይ ያልዋለ ብዙ ቁጥር}one{በዚህ የድር መተግበሪያ ውስጥ # ፋይሎችን ይክፈቱ እና ያርትዑ?}other{በዚህ የድር መተግበሪያ ውስጥ # ፋይሎችን ይክፈቱ እና ያርትዑ?}}</translation>
<translation id="1748563609363301860">ይህንን ይለፍ ቃል በGoogle መለያዎ ወይም በዚህ መሣሪያ ላይ ብቻ ማስቀመጥ ይችላሉ</translation>
@@ -877,7 +877,7 @@
<translation id="1763808908432309942">በአዲስ ትር ውስጥ ይከፍታል</translation>
<translation id="1764226536771329714">ቅድመ-ይሁንታ</translation>
<translation id="176587472219019965">&amp;አዲስ መስኮት</translation>
-<translation id="1766575458646819543">ከሙሉ ማያ ገጽ ዕይታ ወጥቷል</translation>
+<translation id="1766575458646819543">ከሙሉ ማያ ገፅ ዕይታ ወጥቷል</translation>
<translation id="1766957085594317166">በእርስዎ የ Google መለያ ውስጥ ደህንነቱ በተጠበቀ መንገድ የይለፍ ቃላትን ያስቀምጡ እና ዳግመኛ እነርሱን መተየብ አይኖርብዎትም</translation>
<translation id="1767043563165955993">በAndroid መተግበሪያዎች ተጠቀም</translation>
<translation id="1768212860412467516">ለ <ph name="EXPERIMENT_NAME" /> ግብረመልስ ይላኩ።</translation>
@@ -898,7 +898,7 @@
<translation id="1780273119488802839">ዕልባቶችን በማስመጣት ላይ...</translation>
<translation id="178092663238929451">በዙሪያዎ ካሉ ሰዎች ፋይሎችን መቀበል እና መላክ እንዲችሉ አቅራቢያ አጋራን ያዋቅሩ</translation>
<translation id="1781291988450150470">የአሁኑ ፒን</translation>
-<translation id="1781502536226964113">የአዲስ ትር ገጽ ክፈት</translation>
+<translation id="1781502536226964113">የአዲስ ትር ገፅ ክፈት</translation>
<translation id="1781553166608855614">የሚነገረው ቋንቋ</translation>
<translation id="1781771911845953849">መለያዎች እና ማስመር</translation>
<translation id="1781979858217752599">የመስኮት ኦዲዮን አጋራ</translation>
@@ -918,7 +918,7 @@
<translation id="1797117170091578105">የእርስዎን የChromebook ቁልፍ ሰሌዳ በመጠቀም ይጫወቱ። ቁልፎችን ለተወሰኑ እርምጃዎች ማበጀት ይችላሉ።</translation>
<translation id="1800502858278951817"><ph name="SITE_NAME" />ን ለማንበብ እና ለመለወጥ ምንም ቅጥያዎች አልጠየቁም</translation>
<translation id="1802624026913571222">ክዳኑ ሲዘጋ ተኛ</translation>
-<translation id="1802687198411089702">ይህ ገጽ ምላሽ እየሰጠ አይደለም። እሱን መጠበቅ ወይም ትተው መውጣት ይችላል።</translation>
+<translation id="1802687198411089702">ይህ ገፅ ምላሽ እየሰጠ አይደለም። እሱን መጠበቅ ወይም ትተው መውጣት ይችላል።</translation>
<translation id="1803531841600994172">የሚተረጎምበት ቋንቋ</translation>
<translation id="1803545009660609783">ዳግም አሰልጥን</translation>
<translation id="1805545709333681504">የቀድሞውን ይለፍ ቃል ያስገቡ</translation>
@@ -987,7 +987,7 @@
<translation id="1848219224579402567">ክዳኑ ሲዘጋ ዘግተህ ውጣ</translation>
<translation id="184862733444771842">የባህሪ ጥያቄ</translation>
<translation id="1849016657376805933">ማንኛውም የኤችአይዲ መሣሪያ</translation>
-<translation id="1849186935225320012">ይህ ገጽ የMIDI መሳሪያዎች ሙሉ ቁጥጥር አለው።</translation>
+<translation id="1849186935225320012">ይህ ገፅ የMIDI መሳሪያዎች ሙሉ ቁጥጥር አለው።</translation>
<translation id="1850145825777333687">የመሣሪያ መግቢያ ማስረጃዎች</translation>
<translation id="1850508293116537636">በ&amp;ሰዓት መዞሪያ አቅጣጫ አሽከርክር</translation>
<translation id="185111092974636561"><ph name="BEGIN_PARAGRAPH1" />ከመመዝገብዎ በፊት <ph name="DEVICE_OS" /> የመሣሪያውን ባለቤትነት መውሰድ እንዲችል TPMን ማጽዳት ይኖርብዎታል።<ph name="END_PARAGRAPH1" />
@@ -1040,7 +1040,7 @@
<translation id="1887597546629269384">እንደገና «Hey Google» ይበሉ</translation>
<translation id="189035593835762169">የአገልግሎት ውል</translation>
<translation id="1891362123137972260">የዲስክ ቦታ በጣም ዝቅተኛ ነው። እባክዎ የዲስክ ቦታ ያስለቅቁ።</translation>
-<translation id="189210018541388520">ሙሉ ማያ ገጽ ክፈት</translation>
+<translation id="189210018541388520">ሙሉ ማያ ገፅ ክፈት</translation>
<translation id="1892341345406963517">ሰላም <ph name="PARENT_NAME" /></translation>
<translation id="189358972401248634">ሌሎች ቋንቋዎች</translation>
<translation id="1895658205118569222">አጥፋ</translation>
@@ -1077,7 +1077,7 @@
<translation id="192564025059434655">የድሮ የChrome መተግበሪያዎች ስሪቶች ከዲሴምበር 2022 በኋላ በWindows መሣሪያዎች ላይ አይከፍቱም። አዲስ ስሪት የሚገኝ ከሆነ መፈተሽ ይችላሉ።</translation>
<translation id="1926339101652878330">እነዚህ ቅንብሮች በድርጅት መመሪያ ነው ቁጥጥር የሚደረግባቸው። እባክዎ ለተጨማሪ መረጃ አስተዳዳሪዎን ያግኙ።</translation>
<translation id="1927632033341042996">ጣት <ph name="NEW_FINGER_NUMBER" /></translation>
-<translation id="192817607445937251">ማያ ገጽ መቆለፊያ ፒን</translation>
+<translation id="192817607445937251">ማያ ገፅ መቆለፊያ ፒን</translation>
<translation id="1928696683969751773">ዝማኔዎች</translation>
<translation id="1929186283613845153">ይህ ፋይል እየተቃኘ ነው።</translation>
<translation id="1929343511231420085">ማንኛውም ተከታታይ ወደብ</translation>
@@ -1090,7 +1090,7 @@
<translation id="1935303383381416800">አካባቢዎን ለማየት ተፈቅዷል</translation>
<translation id="1936157145127842922">በአቃፊ አሳይ</translation>
<translation id="1936931585862840749">ስንት ቅጂዎች መታተም እንዳለባቸው ለማመላከት ቁጥር ይጠቀሙ (ከ1 እስከ <ph name="MAX_COPIES" />)።</translation>
-<translation id="1937774647013465102"><ph name="ARCHITECTURE_DEVICE" /> በሆነው በዚህ መሣሪያ የመያዣ ኪነ ህንፃ አይነት <ph name="ARCHITECTURE_CONTAINER" />ን ማስመጣት አይቻልም። ይህን መያዣ በተለየ መሣሪያ ወደነበረበት ለመመለስ መሞከር፣ ወይም ደግሞ በፋይሎች መተግበሪያ ውስጥ በመክፈት በዚህ መያዣ ውስጥ ይያሉ ፋይሎችን መድረስ ይችላሉ።</translation>
+<translation id="1937774647013465102"><ph name="ARCHITECTURE_DEVICE" /> በሆነው በዚህ መሣሪያ የመያዣ ኪነ ህንፃ ዓይነት <ph name="ARCHITECTURE_CONTAINER" />ን ማስመጣት አይቻልም። ይህን መያዣ በተለየ መሣሪያ ወደነበረበት ለመመለስ መሞከር፣ ወይም ደግሞ በፋይሎች መተግበሪያ ውስጥ በመክፈት በዚህ መያዣ ውስጥ ይያሉ ፋይሎችን መድረስ ይችላሉ።</translation>
<translation id="1938320257168860255">የሆነ ችግር ተፈጥሯል። ስልክዎ በቅርብ ርቀት መኖሩን፣ የተከፈተ መሆኑን፣ እንዲሁም ብሉቱዝ እና Wi-Fi የበሩ መሆናቸውን ያረጋግጡ።</translation>
<translation id="1938351510777341717">ውጫዊ ትዕዛዝ</translation>
<translation id="1940546824932169984">የተገናኙ መሣሪያዎች</translation>
@@ -1103,21 +1103,21 @@
<translation id="1944921356641260203">ዝማኔ ተገኝቷል</translation>
<translation id="1947136734041527201">በማንነት አገልግሎት ያለዎትን መለያ ተጠቅመው ወደ ድር ጣቢያዎች እንዲገቡ ያስችልዎታል</translation>
<translation id="1949584741547056205">ፈጣን መልሶች</translation>
-<translation id="1949849604471335579">ልጣፍ፣ የማያ ገጽ ማቆያ፣ የቀለማት ቅልሞች እና ሌሎችንም ያብጁ</translation>
+<translation id="1949849604471335579">ልጣፍ፣ የማያ ገፅ ማቆያ፣ የቀለማት ቅልሞች እና ሌሎችንም ያብጁ</translation>
<translation id="1951012854035635156">ረዳት</translation>
<translation id="1954597385941141174">ጣቢያዎች ከዩኤስቢ መሣሪያዎች ጋር ለመገናኘት መጠየቅ ይችላሉ</translation>
<translation id="1954813140452229842">ማጋራትን ማፈናጠጥ ላይ ስህተት። እባክዎ ምስክርነቶችዎን ይፈትሹና እንደገና ይሞክሩ።</translation>
<translation id="1956050014111002555">ፋይሉ እንዲገቡ ያልተደረጉ በርካታ የእውቅና ማረጋገጫዎችን ይዞ ነበር፦</translation>
<translation id="1956167375087861299">የተጠበቀ ይዘትን ለማጫወት ለዪዎችን እንዲጠቀም አልተፈቀደም</translation>
<translation id="1956390763342388273">ይህ ሁሉንም ፋይሎች ከ«<ph name="FOLDER_PATH" />» ይሰቅላል። ጣቢያውን የሚያምኑት ከሆነ ብቻ ይህን ያድርጉ።</translation>
-<translation id="1962233722219655970">ይህ ገጽ በኮምፒውተርዎ ላይ የማይሰራ የቤተኛ ደንበኛ መተግበሪያ ይጠቀማል።</translation>
+<translation id="1962233722219655970">ይህ ገፅ በኮምፒውተርዎ ላይ የማይሰራ የቤተኛ ደንበኛ መተግበሪያ ይጠቀማል።</translation>
<translation id="1963976881984600709">መደበኛ ጥበቃ</translation>
<translation id="1965624977906726414">ምንም ልዩ ፍቃዶች የሉትም።</translation>
<translation id="1966649499058910679">እያንዳንዱ ቃል ሲነገር ማድመቅ</translation>
<translation id="1967970931040389207">መገናኛ ነጥብን አብራ</translation>
<translation id="1969011864782743497"><ph name="DEVICE_NAME" /> (USB)</translation>
<translation id="1969654639948595766">የWebRTC ጽሁፍ ምዝግብ ማስታወሻዎች (<ph name="WEBRTC_TEXT_LOG_COUNT" />)</translation>
-<translation id="1972325230031091483">አሁን ባለው የድረ-ገጽ ጉብኝትዎ ላይ በመመስረት ይዘቱ በንቃት ስለተጫነ በፍጥነት ያስሱታል</translation>
+<translation id="1972325230031091483">አሁን ባለው የድረ-ገፅ ጉብኝትዎ ላይ በመመስረት ይዘቱ በንቃት ስለተጫነ በፍጥነት ያስሱታል</translation>
<translation id="197288927597451399">አስቀምጥ</translation>
<translation id="1973763416111613016"><ph name="FILE_NAME" /> ደህንነቱ በተጠበቀ ሁኔታ ሊወርድ አይችልም። የውርዶች አሞሌ አካባቢውን ለመቀየር Shift+F6 ይጫኑ።</translation>
<translation id="1973886230221301399">ChromeVox</translation>
@@ -1140,7 +1140,7 @@
<translation id="1989112275319619282">አስስ</translation>
<translation id="1989903373608997757">ሁልጊዜ ይጠቀሙ</translation>
<translation id="1990046457226896323">የንግግር ፋይሎች ወርደዋል</translation>
-<translation id="1990512225220753005">በዚህ ገጽ ላይ አቋራጮችን አታሳይ</translation>
+<translation id="1990512225220753005">በዚህ ገፅ ላይ አቋራጮችን አታሳይ</translation>
<translation id="1990727803345673966">ምትኬ የተቀመጠላቸው የLinux ፋይሎች እና መተግበሪያዎች ወደነበሩበት እየተመለሱ ነው</translation>
<translation id="199191324030140441">አትረብሽን አጥፋ</translation>
<translation id="1992397118740194946">ያልተዘጋጀ</translation>
@@ -1181,7 +1181,7 @@
<translation id="2033758234986231162">ከስልክዎ ጋር ያለውን ግንኙነት ማስጠበቅ አልተቻለም። ስልክዎ በቅርብ ርቀት መኖሩን፣ የተከፈተ መሆኑን፣ እንዲሁም ብሉቱዝ እና Wi-Fi የበሩ መሆናቸውን ያረጋግጡ።</translation>
<translation id="2034346955588403444">ሌላ የWiFi አውታረ መረብ አክል</translation>
<translation id="2035211704574173780">ግርጥነት</translation>
-<translation id="203574396658008164">ከማያ ገጽ ቁልፍ ሆነህ ማስታወሻ መውሰድን አንቃ</translation>
+<translation id="203574396658008164">ከማያ ገፅ ቁልፍ ሆነህ ማስታወሻ መውሰድን አንቃ</translation>
<translation id="2037445849770872822">ለዚህ የ Google መለያ ክትትል ተቀናብሯል። ተጨማሪ የወላጅ ቁጥጥሮችን ለማቀናበር፣ ቀጥል የሚለውን ይምረጡ።
አለበለዚያ፣ በዚህ መለያ ላይ የተደረጉ ለውጦች በዚህ መሣሪያ ላይ እንዲታይ አሁኑኑ ዘግተው ይውጡ።
@@ -1204,7 +1204,7 @@
<translation id="2048554637254265991">የመያዣ አስተዳዳሪውን ማስጀመር ላይ ስህተት። እባክዎ እንደገና ይሞክሩ።</translation>
<translation id="2048653237708779538">እርምጃ አይገኝም</translation>
<translation id="204914487372604757">አቋራጭ ፍጠር</translation>
-<translation id="2050339315714019657">በቁመት</translation>
+<translation id="2050339315714019657">የቁም ፎቶ</translation>
<translation id="2051555741181591333">መገናኛ ነጥብ በራስ ሰር አሰናክል</translation>
<translation id="2052572566310583903">በሌሎች መሣሪያዎችዎ ላይ ተጭነዋል</translation>
<translation id="2053105195397337973">ጣቢያዎችን በማንቃት ወቅት የማስታወቂያ አይፈለጌ መልዕክት እና መጭበርበርን እንዲያቆሙ እያስቻልን ክትትልን የምንገድብባቸውን መንገዶች እያሰስን ነው።</translation>
@@ -1319,7 +1319,7 @@
<translation id="2140902257485550046">በዚህ ጣቢያ ላይ ያሉትን ሁሉንም ቅጥያዎች ለማገድ ምረጥ</translation>
<translation id="2142328300403846845">አገናኙን ክፈት እንደ</translation>
<translation id="2142582065325732898">የቅርብ ጊዜ የChrome ትሮችን ለመመልከት <ph name="LINK1_BEGIN" />የChrome ስምረት<ph name="LINK1_END" />ን ያብሩ። <ph name="LINK2_BEGIN" />የበለጠ ለመረዳት<ph name="LINK2_END" /></translation>
-<translation id="2143765403545170146">በሙሉ ማያ ገጽ ውስጥ ሁልጊዜ የመሣሪያ አሞሌውን አሳይ</translation>
+<translation id="2143765403545170146">በሙሉ ማያ ገፅ ውስጥ ሁልጊዜ የመሣሪያ አሞሌውን አሳይ</translation>
<translation id="2143778271340628265">የእራስ ተኪ ውቅር</translation>
<translation id="2143915448548023856">የማሳያ ቅንብሮች</translation>
<translation id="2144536955299248197">የእውቅና ማረጋገጫ ተመልካች፦ <ph name="CERTIFICATE_NAME" /></translation>
@@ -1340,8 +1340,8 @@
<translation id="2156294658807918600">አገልግሎት ሠራተኛ፦ <ph name="SCRIPT_URL" /></translation>
<translation id="2156877321344104010">የደህንነት ፍተሻውን እንደገና አሂድ</translation>
<translation id="2157474325782140681">ተጨማሪ ባሕሪያትን ለማግኘት፣ ከዚህ Chromebook ጋር እንዲሠራ የተዘጋጀውን የ Dell ተከላ ጣቢያ ይጠቀሙ።</translation>
-<translation id="215753907730220065">ከሙሉ ገጽ ዕይታ ውጣ</translation>
-<translation id="2157875535253991059">ይህ ገጽ አሁን ሙሉ ማያ ገጽ ነው።</translation>
+<translation id="215753907730220065">ከሙሉ ገፅ ዕይታ ውጣ</translation>
+<translation id="2157875535253991059">ይህ ገፅ አሁን ሙሉ ማያ ገፅ ነው።</translation>
<translation id="2158475082070321257">ወደ ድምቀቱ የሚወስድ አገናኝን ቅዳ</translation>
<translation id="2159488579268505102">USB-C</translation>
<translation id="2161058806218011758">የ<ph name="SHORTCUT" /> ወሰን ለ<ph name="EXTENSION_NAME" /></translation>
@@ -1366,12 +1366,12 @@
<translation id="2178585470774851578">የsshd ስውር አገልጋይን የሚያዋቅሩ እና ከዩኤስቢ አንጻፊዎች ማስነሳትን የሚያነቁ የChromeOS Flex ስህተት ማረሚያ ባህሪያትን እያነቁ ነው።</translation>
<translation id="2178614541317717477">CA Compromise</translation>
<translation id="2179416702468739594">የሚገኙ መገለጫዎችን በመፈለግ ላይ። ይህ የተንቀሳቃሽ ስልክ አውታረ መረብዎ ለጥቂት ደቂቃዎች እንዲቋረጥ ሊያደርግ ይችላል።</translation>
-<translation id="2180620921879609685">ይዘትን በማንኛውም ገጽ ላይ አግድ</translation>
+<translation id="2180620921879609685">ይዘትን በማንኛውም ገፅ ላይ አግድ</translation>
<translation id="2182058453334755893">ወደ የእርስዎ ቅንጥብ ሰሌዳ ላይ ተቀድቷል</translation>
<translation id="2183570493397356669">የቀጥል አዝራር ተሰናክሏል</translation>
<translation id="2184515124301515068">Chrome ጣቢያዎች መቼ ድምጽን ማጫወት እንደሚችሉ እንዲመርጥ ይፍቀዱ (የሚመከር)</translation>
<translation id="2186206192313702726">Google ሌንስ</translation>
-<translation id="2186711480981247270">ከሌላ መሣሪያ የተጋራ ገጽ</translation>
+<translation id="2186711480981247270">ከሌላ መሣሪያ የተጋራ ገፅ</translation>
<translation id="2187675480456493911">በመለያዎ ላይ ካሉ ሌሎች መሣሪያዎች ጋር ሰምሯል። በሌሎች ተጠቃሚዎች የተቀየሩ ቅንብሮች አይሰምሩም። <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation>
<translation id="2187895286714876935">የአገልጋይ ዕውቅና ማረጋገጫ ስህተት</translation>
<translation id="2187906491731510095">ቅጥያዎች ተዘምነዋል</translation>
@@ -1457,7 +1457,7 @@
<translation id="22614517036276112">ይህ ሰነድ ወይም የእርስዎ መሣሪያ አንዳንድ የድርጅትዎን የደህንነት መመሪያዎች አያሟላም። ምን መስተካከል እንዳለበት ለማወቅ አስተዳዳሪዎን ያነጋግሩ።</translation>
<translation id="2262477216570151239">ከመድገም በፊት አዘግይ</translation>
<translation id="2263189956353037928">ዘግተው ይውጡ እና ተመልሰው ይግቡ</translation>
-<translation id="2263371730707937087">የማያ ገጽ ዕድሳት ፍጥነት</translation>
+<translation id="2263371730707937087">የማያ ገፅ ዕድሳት ፍጥነት</translation>
<translation id="2263679799334060788">ግብረመልስዎ Google Castን ለማሻሻል ይረዳናል እንዲሁም ምስጋና ይቸረዋል።
በcast ላይ ለሚከሰቱ ችግሮች መላ ለመፈለግ ለማገዝ እባክዎ <ph name="BEGIN_LINK" />የእገዛ ማዕከልን<ph name="END_LINK" /> ይመልከቱ።</translation>
<translation id="22665427234727190">አንድ ጣቢያ የብሉቱዝ መሣሪያዎችን መድረስ ሲፈልግ ጠይቅ (የሚመከር)</translation>
@@ -1482,19 +1482,19 @@
<translation id="228293613124499805">እርስዎ የሚጎበኟቸው አብዛኞቹ ጣቢያዎች ምርጫዎችዎን ወይም እርስዎ ያጋሩትን መረጃ በጣቢያው ውስጥ በማስቀመጥ ብዙ ጊዜ የእርስዎን ተሞክሮ ለማሻሻል በመሣሪያዎ ላይ ውሂብን ሊያስቀምጡ ይችላሉ። ይህ ቅንብር እንደበራ እንዲቆይ እንመክራለን።</translation>
<translation id="2285109769884538519">{COUNT,plural, =0{ሁሉንም በ&amp;አዲስ የትር ቡድን ይክፈቱ}=1{በ&amp;አዲስ የትር ቡድን ይክፈቱ}one{ሁሉንም ({COUNT}) በ&amp;አዲስ የትር ቡድን ይክፈቱ}other{ሁሉንም ({COUNT}) በ&amp;አዲስ የትር ቡድን ይክፈቱ}}</translation>
<translation id="2285942871162473373">የእርስዎ የጣት አሻራዎች ተለይተው ሊታወቁ አልተቻለም። እንደገና ይሞክሩ።</translation>
-<translation id="2287944065963043964">መግቢያ ገጽ</translation>
+<translation id="2287944065963043964">መግቢያ ገፅ</translation>
<translation id="2290615375132886363">የጡባዊ ዳሰሳ አዝራሮች</translation>
<translation id="2291452790265535215">የጎን ፓነሉን ለእልባቶች፣ ለጉዞዎች እና ለሌሎችም ለመጠቀም ይሞክሩ</translation>
<translation id="229182044471402145">ተዛማጅ ቅርጸ-ቁምፊ አልተገኘም።</translation>
<translation id="2292848386125228270"><ph name="PRODUCT_NAME" /> እባክዎ እንደ መደበኛ ተጠቃሚ ያስጀምሩት። እንደ ለግንባታ ስርወ ሆኖ ማሄድ ካስፈለግዎት፣ ከ--no-sandbox ጠቁም ጋር እንደገና ያሂዱት።</translation>
-<translation id="2294081976975808113">የማያ ገጽ ግላዊነት</translation>
+<translation id="2294081976975808113">የማያ ገፅ ግላዊነት</translation>
<translation id="2294358108254308676"><ph name="PRODUCT_NAME" />ን መጫን ይፈልጋሉ?</translation>
<translation id="229477815107578534">ቅንብሮችዎን ይገምግሙ</translation>
<translation id="2295864384543949385"><ph name="NUM_RESULTS" /> ውጤቶች</translation>
<translation id="2296022312651137376"><ph name="DOMAIN_NAME" /> ወደ <ph name="EMAIL" /> ሲገባ መሣሪያው መስመር ላይ እንዲሆን ይፈልጋል</translation>
<translation id="2296218178174497398">የመሳሪያ ግኝት</translation>
<translation id="2297705863329999812">አታሚዎችን ይፈልጉ</translation>
-<translation id="2297822946037605517">ይህንን ገጽ ያጋሩ</translation>
+<translation id="2297822946037605517">ይህንን ገፅ ያጋሩ</translation>
<translation id="2299734369537008228">ተንሸራታች፦ <ph name="MIN_LABEL" /> እስከ <ph name="MAX_LABEL" /></translation>
<translation id="2299941608784654630">በ debugd የተሰበሰቡ ሁሉም ምዝግብ ፋይሎችን እንደ የተለየ ማህደር አድርገው ያካትቱ።</translation>
<translation id="2300214399009193026">PCIe</translation>
@@ -1542,7 +1542,7 @@
<translation id="2318143611928805047">የወረቀት መጠን</translation>
<translation id="2318817390901984578">የAndroid መተግበሪያዎችን ለመጠቀም የእርስዎን <ph name="DEVICE_TYPE" /> ኃይል ይሙሉ እና ያዘምኑ።</translation>
<translation id="2319459402137712349">የቁልፍ ሰሌዳውን ለመክፈት የጽሑፍ መስክ ይምረጡ። እንዲሁም በማያ ገጽዎ ግርጌ ላይ የቁልፍ ሰሌዳ አዶን መምረጥ ይችላሉ።</translation>
-<translation id="2319993584768066746">የመግቢያ ገጽ ፎቶዎች</translation>
+<translation id="2319993584768066746">የመግቢያ ገፅ ፎቶዎች</translation>
<translation id="2322193970951063277">ራስጌዎች እና ግርጌዎች</translation>
<translation id="2322318151094136999">አንድ ጣቢያ ተከታታይ ወደቦችን መድረስ ሲፈልግ ይጠይቅ (የሚመከር)</translation>
<translation id="2322622365472107569">ማብቂያ ሰዓት <ph name="TIME" /></translation>
@@ -1562,7 +1562,7 @@
<translation id="2332948465534020594">አትረብሽ ነቅቷል</translation>
<translation id="233471714539944337">አደጋ ሊያስከትል የሚችል ይዘት</translation>
<translation id="2335111415680198280">{0,plural, =1{# መስኮትን ዝጋ}one{# መስኮቶችን ዝጋ}other{# መስኮቶችን ዝጋ}}</translation>
-<translation id="2335122562899522968">ይህ ገጽ ኩኪዎችን አዋቅሯል።</translation>
+<translation id="2335122562899522968">ይህ ገፅ ኩኪዎችን አዋቅሯል።</translation>
<translation id="2336228925368920074">ለሁሉም ትሮች ዕልባት አብጅ...</translation>
<translation id="2336376423977300504">መስኮቶች ሲዘጉ ሁልጊዜ ኩኪዎችን አጽዳ</translation>
<translation id="2336381494582898602">Powerwash</translation>
@@ -1573,7 +1573,7 @@
<translation id="2343747224442182863">በዚህ ትር ላይ አተኩር</translation>
<translation id="2344032937402519675">ከአገልጋዩ ጋር መገናኘት አልተቻለም። የአውታረ መረብ ግንኙነትዎን ይፈትሹ እና እንደገና ይሞክሩ። አሁንም ችግር እያጋጠምዎት ከሆነ የእርስዎን Chromebook እንደገና ለመጀመር ይሞክሩ።</translation>
<translation id="234559068082989648">የድሮ የChrome መተግበሪያዎች ስሪቶች ከዲሴምበር 2022 በኋላ አይከፍቱም። ወደ አዲስ ስሪት ለማዘመን ወይም ይህን መተግበሪያ ለማስወገድ አስተዳዳሪዎን ያነጋግሩ።</translation>
-<translation id="2345723121311404059">1 ገጽ ወደ <ph name="PRINTER_NAME" /></translation>
+<translation id="2345723121311404059">1 ገፅ ወደ <ph name="PRINTER_NAME" /></translation>
<translation id="23463457491630512">ለምሳሌ፣ ለማራቶን ጫማ ለመግዛት ጣቢያን ከጎበኙ ጣቢያው ዝንባሌዎን እንደ ማራቶን መሮጥ ሊገልጽ ይችላል። በኋላ ላይ ለሩጫ ለመመዝገብ ሌላ ጣቢያ ከጎበኙ ይህ ጣቢያ በዝንባሌዎችዎ ላይ ተመስርቶ የመሮጫ ጫማ ማስታወቂያ ሊያሳየዎት ይችላል።</translation>
<translation id="2348176352564285430">መተግበሪያ፦ <ph name="ARC_PROCESS_NAME" /></translation>
<translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - ፈቃድ ተጠይቋል፣ ምላሽ ለመስጠት Ctrl + ወደፊት ይጫኑ</translation>
@@ -1583,10 +1583,10 @@
<translation id="2349896577940037438">የእርስዎ የተጨማሪ ድር እና መተግበሪያ እንቅስቃሴ ቅንብር በርቶ ከሆነ ይህ ውሂብ በGoogle መለያዎ ላይ ሊቀመጥ ይችላል። በaccount.google.com ላይ የእርስዎን ውሂብ ማየት፣ መሰረዝ እና የእርስዎን መለያ ቅንብሮች መለወጥ ይችላሉ።</translation>
<translation id="2350133097354918058">ዳግም ተጭኗል</translation>
<translation id="2350182423316644347">መተግበሪያን በማስጀመር ላይ...</translation>
-<translation id="235028206512346451">ከመሳሪያዎ ከወጡ ማያዎ በራስ-ሰር ይቆለፋል። ከመሳሪያዎ ፊት ለፊት ሲሆኑ ማያዎ ይበልጥ ረጅም ለሆነ ጊዜ ንቁ ይሆናል። ማያ ገጽ ቆልፍን እየተጠቀሙ ካልሆኑ መሣሪያዎ ከመቆለፍ ይልቅ ይተኛል።</translation>
+<translation id="235028206512346451">ከመሳሪያዎ ከወጡ ማያዎ በራስ-ሰር ይቆለፋል። ከመሳሪያዎ ፊት ለፊት ሲሆኑ ማያዎ ይበልጥ ረጅም ለሆነ ጊዜ ንቁ ይሆናል። ማያ ገፅ ቆልፍን እየተጠቀሙ ካልሆኑ መሣሪያዎ ከመቆለፍ ይልቅ ይተኛል።</translation>
<translation id="2352495879228166246">{NUM_ITEMS,plural, =1{1 ንጥል}one{{NUM_ITEMS} ንጥሎች}other{{NUM_ITEMS} ንጥሎች}}</translation>
<translation id="2352662711729498748">&lt; 1 ሜባ</translation>
-<translation id="2352810082280059586">የማያ ገጽ ቁልፍ ማስታወሻዎች በራስ-ሰር ወደ <ph name="LOCK_SCREEN_APP_NAME" /> ይቀመጣሉ። የእርስዎ በጣም የቅርብ ጊዜው ማስታወሻ በማያ ገጽ ቁልፍ ላይ ይቀራል።</translation>
+<translation id="2352810082280059586">የማያ ገፅ ቁልፍ ማስታወሻዎች በራስ-ሰር ወደ <ph name="LOCK_SCREEN_APP_NAME" /> ይቀመጣሉ። የእርስዎ በጣም የቅርብ ጊዜው ማስታወሻ በማያ ገፅ ቁልፍ ላይ ይቀራል።</translation>
<translation id="2353297238722298836">ካሜራ እና ማይክሮፎን ይፈቀዳሉ</translation>
<translation id="2353910600995338714">ወደ ውጭ መላክ ተሳክቷል</translation>
<translation id="2355314311311231464">የመለያ ዝርዝሮችዎ ሊወጡ ስላልቻሉ ማቅረብ አልተሳካም። እባክዎ እንደገና ይሞክሩ። የስህተት ኮድ፦ <ph name="ERROR_CODE" />።</translation>
@@ -1616,7 +1616,7 @@
<translation id="2376056713414548745">ጮክ ብለህ አንብብ</translation>
<translation id="2377588536920405462">በመሣሪያዎ ላይ ዋናውን የአካባቢ ቅንብር በማጥፋት አካባቢን ማጥፋት ይችላሉ። እንዲሁም በአካባቢ ቅንብሮች ውስጥ Wi-Fiን፣ የተንቀሳቃሽ ስልክ አውታረ መረቦችን እና ዳሳሾችን መጠቀም ለአካባቢ ማጥፋት ይችላሉ።</translation>
<translation id="2377667304966270281">ከባድ ስህተቶች</translation>
-<translation id="237828693408258535">ይህ ገጽ ይተርጎም?</translation>
+<translation id="237828693408258535">ይህ ገፅ ይተርጎም?</translation>
<translation id="2378982052244864789">የቅጥያውን ማውጫ ይምረጡ።</translation>
<translation id="2379281330731083556">የስርዓት መገናኛ ተጠቅመው ያትሙ... <ph name="SHORTCUT_KEY" /></translation>
<translation id="2381499968174336913">የተጋራ ትር ቅድመ ዕይታ</translation>
@@ -1683,13 +1683,13 @@
<translation id="2445484935443597917">አዲስ መገለጫ ፍጠር</translation>
<translation id="2445726032315793326">ከፊል ማጉያ</translation>
<translation id="244641233057214044">ከፍለጋዎ ጋር የሚዛመድ</translation>
-<translation id="2448312741937722512">አይነት</translation>
+<translation id="2448312741937722512">ዓይነት</translation>
<translation id="2448810255793562605">የመዳረሻ መቀየሪያ ራስ-ሰር ቅኝት</translation>
<translation id="2450223707519584812">የGoogle ኤፒአይ ቁልፎች ስለጎደሉ ተጠቃሚዎችን ማከል አይችሉም። ለዝርዝሩ <ph name="DETAILS_URL" />ን ይመልከቱ።</translation>
<translation id="2450849356604136918">ምንም ገቢር እይታዎች የሉም</translation>
<translation id="2451298179137331965">2x</translation>
<translation id="245322989586167203">ጣቢያዎች አውታረ መረብዎን እንደማቀናበር ላሉ የውሂብ ማስተላለፊያ ባህሪዎች አብዛኛው ጊዜ ከተከታታይ ወደቦች ጋር ይገናኛሉ</translation>
-<translation id="2453706416476934374"><ph name="SUPERVISED_USER_NAME" /> ጥያቄዎችን በሚጠይቅበት ጊዜ የተበጁ ምላሾችን ለማግኘት ረዳት በ<ph name="SUPERVISED_USER_NAME" /> ማያ ገጽ ላይ ያለው ቅጽበታዊ ገጽ እይታን እንዲደርስ ይፍቀዱለት። ይህ እንዲሁም በመጫወት ላይ ያሉ የዘፈኖች ወይም የቪዲዮዎች መረጃን ሊያካትት ይችላል።</translation>
+<translation id="2453706416476934374"><ph name="SUPERVISED_USER_NAME" /> ጥያቄዎችን በሚጠይቅበት ጊዜ የተበጁ ምላሾችን ለማግኘት ረዳት በ<ph name="SUPERVISED_USER_NAME" /> ማያ ገፅ ላይ ያለው ቅጽበታዊ ገፅ እይታን እንዲደርስ ይፍቀዱለት። ይህ እንዲሁም በመጫወት ላይ ያሉ የዘፈኖች ወይም የቪዲዮዎች መረጃን ሊያካትት ይችላል።</translation>
<translation id="2453860139492968684">ጨርስ</translation>
<translation id="2454206500483040640">የተከፋፈለ</translation>
<translation id="2454247629720664989">ቁልፍ ቃል</translation>
@@ -1718,7 +1718,7 @@
<translation id="2470702053775288986">የማይደገፉ ቅጥያዎች ተሰናክለዋል</translation>
<translation id="2471469610750100598">ጥቁር (ነባሪ)</translation>
<translation id="2471506181342525583">የአካባቢ መዳረሻ ተፈቅዷል</translation>
-<translation id="2473195200299095979">ይህን ገጽ መተርጎም</translation>
+<translation id="2473195200299095979">ይህን ገፅ መተርጎም</translation>
<translation id="2475982808118771221">ስህተት ተከስቷል</translation>
<translation id="2476974672882258506"><ph name="PARALLELS_DESKTOP" /> ለማራገፍ መስኮቶቹን ይዝጉ።</translation>
<translation id="2477065602824695373">ብዙ መቀየሪያዎችን ስላዋቀሩ ራስ-ቅኝት ጠፍቷል።</translation>
@@ -1755,7 +1755,7 @@
<translation id="2501920221385095727">ተጣባቂ ቁልፎች</translation>
<translation id="2502441965851148920">ራስ-ሰር ዝማኔዎች ነቅተዋል። ራስዎ የሚያደርጓቸው ዝማኔዎች በአስተዳዳሪዎ ተሰናክለዋል።</translation>
<translation id="2502719318159902502">ሙሉ መዳረሻ</translation>
-<translation id="2505324914378689427">{SCREEN_INDEX,plural, =1{ማያ ገጽ #}one{ማያ ገጽ #}other{ማያ ገጽ #}}</translation>
+<translation id="2505324914378689427">{SCREEN_INDEX,plural, =1{ማያ ገፅ #}one{ማያ ገፅ #}other{ማያ ገፅ #}}</translation>
<translation id="2505402373176859469"><ph name="RECEIVED_AMOUNT" /> ከ <ph name="TOTAL_SIZE" /></translation>
<translation id="2505669838803949807">የእርስዎ መሣሪያ EID <ph name="EID_NUMBER" /> ነው። የደንበኛ አገልግሎት ተወካይ እርስዎ ይህን አገልግሎት እንዲያገብሩ የEID ቁጥር ሊጠቀም ይችላል።</translation>
<translation id="250704661983564564">የማሳያ አደራደር</translation>
@@ -1777,7 +1777,7 @@
<translation id="252418934079508528"><ph name="DEVICE_OS" />ን ይጫኑ</translation>
<translation id="2526590354069164005">ዴስክቶፕ</translation>
<translation id="2526619973349913024">ዝማኔን ፈልግ</translation>
-<translation id="2527167509808613699">ማንኛውም አይነት ግንኙነት</translation>
+<translation id="2527167509808613699">ማንኛውም ዓይነት ግንኙነት</translation>
<translation id="2529887123641260401">በማንኛውም ጊዜ ከማብሪያ/ማጥፊያ መዳረሻ ቅንብሮች ሆነው የእርስዎን ቅንብሮችን መቀየር ወይም የውቅረት መመሪያን እንደገና መክፈት ይችላሉ።</translation>
<translation id="2530166226437958497">መላ መፈለግ</translation>
<translation id="2531530485656743109"><ph name="BEGIN_PARAGRAPH1" />የሆነ ችግር ተፈጥሯል እና <ph name="DEVICE_OS" /> ሊጫን አልቻለም።<ph name="END_PARAGRAPH1" />
@@ -1825,16 +1825,16 @@
<translation id="257088987046510401">ገፅታዎች </translation>
<translation id="2571655996835834626">የድር ጣቢያዎችን መዳረሻ የሚቆጣጠሩ እንደ ኩኪዎች፣ ጃቫስክሪፕት፣ ተሰኪዎች፣ የስነምድራዊ መገኛ ቦታ፣ ማይክራፎን፣ ካሜራ ወዘተ የመሳሰሉ ባህሪዎች የእርስዎን ቅንብሮች ይለውጡ።</translation>
<translation id="2572032849266859634">ወደ <ph name="VOLUME_NAME" /> ተነባቢ-ብቻ መዳረሻ ተሰጥቷል።</translation>
-<translation id="2573276323521243649">ከአምሳያ መምረጫ ገጽ ተመለስ</translation>
+<translation id="2573276323521243649">ከአምሳያ መምረጫ ገፅ ተመለስ</translation>
<translation id="2573417407488272418">ከማሻሻያው በፊት የመተግበሪያዎችን እና የፋይሎችን ምትክ ወደ ፋይሎች &gt; የእኔ ፋይሎች ያስቀምጡ።</translation>
<translation id="2573831315551295105">ለ«<ph name="ACTION" />» መቀየሪያን ይመድቡ</translation>
-<translation id="2575247648642144396">ቅጥያው በአሁኑ ገጽ ላይ መስራት ሲችል ይህ አዶ የሚታይ ይሆናል። አዶውን ጠቅ በማድረግ ወይም <ph name="EXTENSION_SHORTCUT" />ን በመጫን ይህንን ቅጥያ ይጠቀሙበት።</translation>
+<translation id="2575247648642144396">ቅጥያው በአሁኑ ገፅ ላይ መስራት ሲችል ይህ አዶ የሚታይ ይሆናል። አዶውን ጠቅ በማድረግ ወይም <ph name="EXTENSION_SHORTCUT" />ን በመጫን ይህንን ቅጥያ ይጠቀሙበት።</translation>
<translation id="2575407791320728464">ልክ ያልሆነ ዩአርኤል። በትክክል መቀረጹን ያረጋግጡ።</translation>
<translation id="2575441894380764255">ረባሽ ወይም አሳሳች ማስታወቂያዎችን ለማሳየት አልተፈቀደም</translation>
<translation id="2575713839157415345">{YEARS,plural, =1{ይህ መሣሪያ ለ1 ዓመት የሚቀመጥ ሲሆን በቀጣዩ ጊዜ ላይ ያለ ኮድ ማገናኘት ይችላሉ። ይህ በአስተዳዳሪዎ የሚቀናበር ነው።}one{ይህ መሣሪያ ለ{YEARS} ዓመታት የሚቀመጥ ሲሆን በቀጣዩ ጊዜ ላይ ያለ ኮድ ማገናኘት ይችላሉ። ይህ በአስተዳዳሪዎ የሚቀናበር ነው።}other{ይህ መሣሪያ ለ{YEARS} ዓመታት የሚቀመጥ ሲሆን በቀጣዩ ጊዜ ላይ ያለ ኮድ ማገናኘት ይችላሉ። ይህ በአስተዳዳሪዎ የሚቀናበር ነው።}}</translation>
<translation id="257779572837908839">እንደ Chromebox ለስብሰባዎች ያዋቅሩ</translation>
<translation id="2579309488038515659">መገናኛ ነጥብን ያንቁ</translation>
-<translation id="2579596474754516455">ሲያስፈልግ ለማያ ገጽ አንባቢ ጽሑፍን ለመቀየር የPDF ምስሎችን ይቃኙ</translation>
+<translation id="2579596474754516455">ሲያስፈልግ ለማያ ገፅ አንባቢ ጽሑፍን ለመቀየር የPDF ምስሎችን ይቃኙ</translation>
<translation id="2580889980133367162">ሁልጊዜም <ph name="HOST" /> ከአንድ በላይ ፋይሎችን እንዲያወርድ ይፍቀዱ</translation>
<translation id="258095186877893873">ረጅም</translation>
<translation id="2581455244799175627">የሦስተኛ ወገን ኩኪዎችን ስለመፍቀድ ተጨማሪ</translation>
@@ -1878,7 +1878,7 @@
<translation id="262154978979441594">የGoogle ረዳት የድምፅ ሞዴልን ያሠለጥኑ</translation>
<translation id="26224892172169984">ማንኛውም ጣቢያ ፕሮቶኮሎችን እንዲቆጣጣር አትፍቀድ</translation>
<translation id="262373406453641243">Colemak</translation>
-<translation id="2624142942574147739">ይህ ገጽ ካሜራዎን እና ማይክሮፎንዎን እየደረሰባቸው ነው።</translation>
+<translation id="2624142942574147739">ይህ ገፅ ካሜራዎን እና ማይክሮፎንዎን እየደረሰባቸው ነው።</translation>
<translation id="2626799779920242286">እባክዎ ቆይተው እንደገና ይሞክሩ።</translation>
<translation id="2627424346328942291">ማጋራት አይችሉም</translation>
<translation id="2628770867680720336">የADB ስህተት ማረሚያን ለማንቃት በዚህ Chromebook ላይ የፋብሪካ ዳግም ቅንብር ያስፈልጋል። <ph name="BEGIN_LINK_LEARN_MORE" />የበለጠ ለመረዳት<ph name="END_LINK_LEARN_MORE" /></translation>
@@ -1921,13 +1921,13 @@
<translation id="2659971421398561408">የCrostini ዲስክ መጠን መቀየር</translation>
<translation id="2660779039299703961">ክስተት</translation>
<translation id="266079277508604648">ከአታሚ ጋር መገናኘት አልተቻለም። አታሚው መብራቱንና በWi-Fi ወይም በዩኤስቢ ከእርስዎ Chromebook ጋር መገናኘቱን ያረጋግጡ።</translation>
-<translation id="2661315027005813059">የጀርባ/ፊት መሸጎጫ ገጽ፦<ph name="BACK_FORWARD_CACHE_PAGE_URL" /></translation>
+<translation id="2661315027005813059">የጀርባ/ፊት መሸጎጫ ገፅ፦<ph name="BACK_FORWARD_CACHE_PAGE_URL" /></translation>
<translation id="2661714428027871023">በቀላል ሁነታ አማካኝነት በበለጠ ፍጥነት ያስሱ እና ያነሰ ውሂብ ይጠቀሙ። ተጨማሪ ለማወቅ ጠቅ ያድርጉ።</translation>
<translation id="2662876636500006917">የChrome የድር ገበያ</translation>
<translation id="2663302507110284145">ቋንቋ</translation>
<translation id="2665394472441560184">አዲስ ቃል ያክሉ</translation>
<translation id="2665647207431876759">ጊዜው አልፏል</translation>
-<translation id="2665717534925640469">ይህ ገጽ አሁን ሙሉ ማያ ገጽ ነው፣ እናም የመዳፊትዎ ጠቋሚን አሰናክሎታል።</translation>
+<translation id="2665717534925640469">ይህ ገፅ አሁን ሙሉ ማያ ገፅ ነው፣ እናም የመዳፊትዎ ጠቋሚን አሰናክሎታል።</translation>
<translation id="2665919335226618153">ኧረ ቴች! ቅርጸት በሚሰራለት ጊዜ የሆነ ስህተት ነበር።</translation>
<translation id="2666247341166669829">የግራ የባትሪ ደረጃ <ph name="PERCENTAGE" />%።</translation>
<translation id="2667144577800272420">ሌሎች መተግበሪያዎች ከ<ph name="APP_NAME" /> ጋር ተመሳሳይ የሆኑ አገናኞችን ለመክፈት ተቀናብረዋል። ይህ <ph name="APP_NAME_2" /> እና <ph name="APP_NAME_3" /> የሚደገፉ አገናኞችን እንዳይከፍቱ ያሰናክላቸዋል።</translation>
@@ -1936,7 +1936,7 @@
<translation id="2669454659051515572">ይህን መሣሪያ የሚጠቀም ማንኛውም ሰው የወረዱ ፋይሎችን መመልከት ይችላል</translation>
<translation id="2670102641511624474"><ph name="APP_NAME" /> የChrome ትር እያጋራ ነው።</translation>
<translation id="2670403088701171361">ጣቢያዎች በቅንጥብ ሰሌዳዎ ላይ ጽሁፍ ወይም ምስሎችን እንዲያዩ አይፍቀዱላቸው</translation>
-<translation id="2670429602441959756">ይህ ገጽ እስካሁን በVR ውስጥ የማይደገፉ ባህሪያትን ይዟል። በመውጣት ላይ...</translation>
+<translation id="2670429602441959756">ይህ ገፅ እስካሁን በVR ውስጥ የማይደገፉ ባህሪያትን ይዟል። በመውጣት ላይ...</translation>
<translation id="2671451824761031126">የእርስዎ ዕልባቶች እና ቅንብሮች ዝግጁ ናቸው</translation>
<translation id="2672142220933875349">መጥፎ የcrx ፋይል፣ ጥቅል መክፈት አልተሳካም።</translation>
<translation id="2673135533890720193">የአሰሳ ታሪክዎን ያነብባል</translation>
@@ -2001,7 +2001,7 @@
<translation id="2729327310379176711">Chrome ክትትልን ለመቀነስ እና እያሰሱ ባሉበት ጊዜ ይበልጥ ደህንነትዎን ለመጠበቅ አዲስ መንገዶችን እያገኘ ነው። እንዲሁም Chrome <ph name="ESTIMATE_INTERESTS_LINK" /> እና እነሱን እንዲያስተዳድሯቸው ያስችልዎታል። ከዚያ የሚጎበኟቸው ጣቢያዎች ማስታወቂያዎችን ለእርስዎ ለማሳየት Chromeን ስለእርስዎ ዝንባሌዎች መጠየቅ ይችላሉ።</translation>
<translation id="2730029791981212295">የLinux መተግበሪያዎችን እና ፋይሎችን በምትኬ ማስቀመጥ</translation>
<translation id="2730901670247399077">የስሜት ገላጭ ምስል አስተያየት ጥቆማዎች</translation>
-<translation id="273093730430620027">ይህ ገጽ ካሜራዎን እየደረሰበት ነው።</translation>
+<translation id="273093730430620027">ይህ ገፅ ካሜራዎን እየደረሰበት ነው።</translation>
<translation id="2731392572903530958">የተ&amp;ዘጋውን መስኮት ዳግም ክፈት</translation>
<translation id="2731700343119398978">እባክዎ ይጠብቁ...</translation>
<translation id="2731971182069536520">መሣሪያዎን ዳግም በሚያስነሱበት ቀጣዩ ጊዜ ላይ አስተዳዳሪዎ አካባቢያዊ ውሂብዎን የሚሰርዝ የአንድ ጊዜ ዝማኔ ያከናውናል።</translation>
@@ -2020,7 +2020,7 @@
<translation id="2740531572673183784">እሺ</translation>
<translation id="2740876196999178364">እነዚህ የይለፍ ቁልፎች የሚቀመጡት በዚህ መሣሪያ ላይ ብቻ ነው። በእርስዎ የGoogle መለያ ላይ አይቀመጡም</translation>
<translation id="2741713322780029189">የመልሶ ማግኛ ተርሚናል ክፈት</translation>
-<translation id="2741912629735277980">በመለያ መግቢያ ማያ ገጽ ላይ ዩአይ አሳይ</translation>
+<translation id="2741912629735277980">በመለያ መግቢያ ማያ ገፅ ላይ ዩአይ አሳይ</translation>
<translation id="2742448780373473567"><ph name="DEVICE_OS" />ን መጫን በእርስዎ መሣሪያ ላይ ያለውን ሁሉንም ውሂብ ይደመስሳል።</translation>
<translation id="274290345632688601">የLinux መተግበሪያዎችን እና ፋይሎችን ወደ ነበሩበት በመመለስ ላይ</translation>
<translation id="274318651891194348">የቁልፍ ሰሌዳን በመፈለግ ላይ</translation>
@@ -2035,7 +2035,7 @@
<translation id="2754825024506485820">በGoogle Play መደብር ላይ ከምርታማነት እስከ መዝናኛ ያሉ የሚያስፈልጉዎትን መተግበሪያዎች ያግኙ። መተግበሪያዎችን በማንኛውም ጊዜ መጫን ይችላሉ።</translation>
<translation id="2755349111255270002">ይህን <ph name="DEVICE_TYPE" /> ዳግም አቀናብር</translation>
<translation id="2755367719610958252">የተደራሽነት ባህሪያትን ያቀናብሩ</translation>
-<translation id="275662540872599901">ማያ ገጽ ጠፍቷል</translation>
+<translation id="275662540872599901">ማያ ገፅ ጠፍቷል</translation>
<translation id="2757161511365746634">ማተሚያን አሳይ</translation>
<translation id="2757338480560142065">እያስቀመጡት ያለው የይለፍ ቃል ከ<ph name="WEBSITE" /> ይለፍ ቃል ጋር የሚዛመድ መሆኑን ያረጋግጡ</translation>
<translation id="2761632996810146912"><ph name="HASHTAG_SETTINGS" /> ለ<ph name="SEARCH_QUERY" /> ምንም የፍለጋ ውጤቶች አልተመለሱም</translation>
@@ -2092,7 +2092,7 @@
<translation id="2799223571221894425">ዳግም አስጀምር</translation>
<translation id="2800309299477632167">ብጁ የቁልፍ አደራደር</translation>
<translation id="2800760947029405028">ምስል ስቀል</translation>
-<translation id="2801954693771979815">የማያ ገጽ መጠን</translation>
+<translation id="2801954693771979815">የማያ ገፅ መጠን</translation>
<translation id="2802557211515765772">ምንም የሚተዳደሩ ማተሚያዎች የሉም።</translation>
<translation id="2803313416453193357">አቃፊ ክፈት</translation>
<translation id="2803719750464280163">እባክዎ <ph name="PASSKEY" /> በ<ph name="DEVICE" /> የብሉቱዝ መሣሪያው ላይ የሚታየው የይለፍ ቁልፍ መሆኑን ያረጋግጡ።</translation>
@@ -2113,7 +2113,7 @@
<translation id="2812049959647166806">Thunderbolt አይደገፍም</translation>
<translation id="2813094189969465044">የወላጅ መቆጣጠሪያዎች</translation>
<translation id="281390819046738856">ጥያቄ ሊፈረም አልተቻለም።</translation>
-<translation id="2814489978934728345">ይህን ገጽ መጫን አቁም</translation>
+<translation id="2814489978934728345">ይህን ገፅ መጫን አቁም</translation>
<translation id="2815693974042551705">የዕልባት አቃፊ</translation>
<translation id="2816319641769218778">የይለፍ ቃላትን ውወደ Google መለያዎ ለማስቀመት ስምረትን ያብሩ።</translation>
<translation id="2816628817680324566">ይህ ጣቢያ የደህንነት ቁልፍዎ እንዲለይ ይፈቀድለት?</translation>
@@ -2160,7 +2160,7 @@
<translation id="2861941300086904918">ቤተኛ የደንበኛ ደህንነት አቀናባሪ</translation>
<translation id="2862815659905780618">የLinux ግንባታ አካባቢን አስወግድ</translation>
<translation id="2864601841139725659">የእርስዎን የመገለጫ ሥዕል ያቀናብሩ</translation>
-<translation id="2865919525181940183">በአሁኑ ጊዜ በማያ ገጹ ላይ ያሉ የፕሮግራሞች ቅጽበታዊ ገጽ እይታ</translation>
+<translation id="2865919525181940183">በአሁኑ ጊዜ በማያ ገጹ ላይ ያሉ የፕሮግራሞች ቅጽበታዊ ገፅ እይታ</translation>
<translation id="286674810810214575">የኃይል ምንጮች በመፈተሽ ላይ...</translation>
<translation id="2867768963760577682">እንደተሰካ ትር ክፈት</translation>
<translation id="2868746137289129307">ይህ ቅጥያ ጊዜው ያለፈበት እና በድርጅት መመሪያ የተሰናከለ ነው። ይበልጥ አዲስ የሆነ ስሪት ሲገኝ በራስ-ሰር ሊነቃ ይችላል።</translation>
@@ -2220,7 +2220,7 @@
<translation id="2913331724188855103">ጣቢያዎች የኩኪ ውሂብ እንዲያስቀምጡ እና እንዲያነቡ ይፍቀዱ (የሚመከር)</translation>
<translation id="2915102088417824677">የእንቅስቃሴ ምዝግብ ማስታወሻን ይመልከቱ</translation>
<translation id="2915873080513663243">ራስ-ቅኝት</translation>
-<translation id="2916073183900451334">አንድ ድረ-ገጽ ላይ Tabን መጫን አገናኞችንና እንዲሁም የቅጽ መስኮችን ያደምቃል።</translation>
+<translation id="2916073183900451334">አንድ ድረ-ገፅ ላይ Tabን መጫን አገናኞችንና እንዲሁም የቅጽ መስኮችን ያደምቃል።</translation>
<translation id="2916745397441987255">በቅጥያዎች ውስጥ ይፈልጉ</translation>
<translation id="2918484639460781603">ወደ ቅንብሮች ይሂዱ</translation>
<translation id="2918484644467055090">ይህ መሣሪያ በተለየ ጎራ የሚተዳደር መሆኑ ምልክት ስለተደረገበት የእርስዎ መለያ ወዳለበት ጎራ መመዝገብ አይችልም።</translation>
@@ -2251,7 +2251,7 @@
<translation id="2941112035454246133">ዝቅተኛ</translation>
<translation id="2942279350258725020">የAndroid መልዕክቶች</translation>
<translation id="2942560570858569904">በመጠበቅ ላይ...</translation>
-<translation id="2942581856830209953">ይህን ገጽ ብጁ ያድርጉ</translation>
+<translation id="2942581856830209953">ይህን ገፅ ብጁ ያድርጉ</translation>
<translation id="2943268899142471972">የAnsible የመመሪያ ደብተር ወይም የCrostini ምትኬ ፋይል ይምረጡ</translation>
<translation id="2944060181911631861">የአጠቃቀም እና የምርመራ ውሂብ ይላኩ። የምርመራ፣ የመሣሪያ እና የመተግበሪያ አጠቃቀም ውሂብ በራስ-ሰር ወደ በራስ-ሰር ወደ Google በመላክ የAndroid ተሞክሮዎ እንዲሻሻል ያግዙ። ይህ የስርዓት እና የመተግበሪያ እርጋታን እና ሌሎች ማሻሻያዎችን ያግዛል። አንዳንድ ውሑድ ውሂብ እንዲሁም የGoogle መተግበሪያዎችን እና እንደ የAndroid ገንቢዎች ያሉ አጋሮችን ያግዛሉ። የእርስዎ የተጨማሪ ድር እና መተግበሪያ እንቅስቃሴ ቅንብር በርቶ ከሆነ ይህ ውሂብ በGoogle መለያዎ ላይ ሊቀመጥ ይችላል። <ph name="BEGIN_LINK1" />የበለጠ ለመረዳት<ph name="END_LINK1" /></translation>
<translation id="2946054015403765210">ወደ ፋይሎች ሂድ</translation>
@@ -2338,7 +2338,7 @@
<translation id="3016641847947582299">ክፍለ አካል ተዘምኗል</translation>
<translation id="3017079585324758401">ጀርባ</translation>
<translation id="3019023222666709803">የቀስት መሣሪያ</translation>
-<translation id="3019285239893817657">የንዑስ ገጽ አዝራር</translation>
+<translation id="3019285239893817657">የንዑስ ገፅ አዝራር</translation>
<translation id="3019595674945299805">የVPN አገልግሎት</translation>
<translation id="3020183492814296499">አቋራጮች</translation>
<translation id="3020990233660977256">መለያ ቁጥር፦ <ph name="SERIAL_NUMBER" /></translation>
@@ -2373,7 +2373,7 @@
<translation id="304499331062371949">ማናቸውም ቅጥያዎች <ph name="SITE_NAME" />ን እንዲያነብቡ እና እንዲቀይሩ አይፍቀዱ</translation>
<translation id="3045447014237878114">ይህ ጣቢያ በርካታ ፋይሎችን በራስ-ሰር አውርዷል</translation>
<translation id="3046178388369461825">የLinux ዲስክ ቦታ በጣም ዝቅተኛ ነው</translation>
-<translation id="3046910703532196514">ድረ-ገጽ፣ ሙሉ</translation>
+<translation id="3046910703532196514">ድረ-ገፅ፣ ሙሉ</translation>
<translation id="304747341537320566">የንግግር ፕሮግራሞች</translation>
<translation id="3048336643003835855">የኤችአይዲ መሳሪያዎች ከአቅራቢ <ph name="VENDOR_ID" /></translation>
<translation id="3048917188684939573">Cast እና የመሣሪያ ምዝግብ ማስታወሻዎች</translation>
@@ -2410,7 +2410,7 @@
<translation id="3083899879156272923">ማያ ገጹን በማያ ገጹ መሃል ላይ ያንቀሳቅሱት</translation>
<translation id="3083998949001524405">የሦስተኛ ወገን ኩኪዎችን መጠቀም ተፈቅዷል</translation>
<translation id="3084548735795614657">ለመጫን ጣል ያድርጉ</translation>
-<translation id="3084771660770137092">ወይም Chrome ማህደረ ትውስታ አልቆበታል ወይም የድረ-ገጹ ሂደት በሌላ ምክንያት ተቋርጧል። ለመቀጠል ዳግም ይጫኑ ወይም ወደ ሌላ ገጽ ይሂዱ።</translation>
+<translation id="3084771660770137092">ወይም Chrome ማህደረ ትውስታ አልቆበታል ወይም የድረ-ገጹ ሂደት በሌላ ምክንያት ተቋርጧል። ለመቀጠል ዳግም ይጫኑ ወይም ወደ ሌላ ገፅ ይሂዱ።</translation>
<translation id="3085412380278336437">ጣቢያ የእርስዎን ካሜራ መጠቀም ይችላል</translation>
<translation id="3085431803365340433">Chrome አሳሽ ሊዘመን አልቻለም</translation>
<translation id="3088052000289932193">ጣቢያ MIDIን እየተጠቀመ ነው</translation>
@@ -2493,7 +2493,7 @@
<translation id="3163511056918491211">የእርስዎን ውሂብ በቀላሉ ወደነበረበት ይመልሱ ወይም በማንኛውም ጊዜ መሣሪያዎች ይቀያይሩ። የእርስዎ ምትኬዎች ወደ Google ተሰቅለዋል እና የእርስዎን የGoogle መለያ የይለፍ ቃል በመጠቀም ተመስጥረዋል።</translation>
<translation id="3164329792803560526">ወደ <ph name="APP_NAME" /> ይህን ትር በማጋራት ላይ</translation>
<translation id="3165390001037658081">አንዳንድ የአገልግሎት አቅራቢዎች ይህን ባህሪ ሊያግዱት ይችላሉ።</translation>
-<translation id="3169930038976362151">የእርስዎን ፍላጎቶች የሚያሟላውን ገጽታ ይምረጡ። የእርስዎን ገጽታ፣ ልጣፍ፣ የማያ ገጽ ማቆያ እና ሌሎች ለመቀየር በቀላሉ በዴስክቶፑ ላይ ይንኩ እና ይያዙ።</translation>
+<translation id="3169930038976362151">የእርስዎን ፍላጎቶች የሚያሟላውን ገፅታ ይምረጡ። የእርስዎን ገፅታ፣ ልጣፍ፣ የማያ ገፅ ማቆያ እና ሌሎች ለመቀየር በቀላሉ በዴስክቶፑ ላይ ይንኩ እና ይያዙ።</translation>
<translation id="3170072451822350649">እንዲሁም መግባቱን ትተው <ph name="LINK_START" />እንደ እንግዳ ማሰስ<ph name="LINK_END" /> ይችላሉ።</translation>
<translation id="31774765611822736">በግራ በኩል አዲስ ትር</translation>
<translation id="3177909033752230686">የገጽ ቋንቋ፦</translation>
@@ -2587,7 +2587,7 @@
<translation id="3269689705184377744">{COUNT,plural, =1{ፋይል}one{# ፋይሎች}other{# ፋይሎች}}</translation>
<translation id="326999365752735949">የማውረድ ችግር</translation>
<translation id="3270965368676314374">በኮምፒውተርዎ ላይ ያሉ ፎቶዎችን፣ ሙዚቃን እና ሌላ ማህደረመረጃ ያነብባል፣ ይቀይራል እና ይሰርዛል</translation>
-<translation id="3274763671541996799">አሁን ወደ ሙሉ ማያ ገጽ ሄደዋል።</translation>
+<translation id="3274763671541996799">አሁን ወደ ሙሉ ማያ ገፅ ሄደዋል።</translation>
<translation id="3275778809241512831">የእርስዎ ውስጣዊ ደህንነት ቁልፍ አሁን ላይ ደህንነቱ የማያስተማምን ነው። እርስዎ አብረው ከሚጠቀሙበት ከማናቸውም አገልግሎት ላይ እባክዎ ያስወግዱት። ችግሩን መፍትሔ ለመስጠት፣ የደህንነት ቁልፉን እባክዎ ዳግም ያቀናብሩ።</translation>
<translation id="3275778913554317645">እንደ መስኮት ክፈት</translation>
<translation id="3277214528693754078">በጽሑፍ ጠቋሚ (የጽሑፍ ጠቋሚ አሰሳ) ያስሱ</translation>
@@ -2609,7 +2609,7 @@
<translation id="3289886661311231677">ከጣቢያዎች ጋር እንዲጋሩ የማይፈልጓቸውን ርዕሶች ማገድ ይችላሉ። እንዲሁም Chrome ከ4 ሳምንታት በላይ የቆዩ ርዕሶችዎን በራስ-ሰር ሰርዝ ይሰርዛል።</translation>
<translation id="3290249595466894471">አዲስ ስጋቶችን ፈልጎ ለማግኘት እንዲያግዝ በተጨማሪም የገጾች፣ ውርዶች፣ የቅጥያ እንቅስቃሴ እና የሥርዓት መረጃ ትንሽ ናሙና ይልካል</translation>
<translation id="3293181007446299124">የእርስዎ የአሰሳ ታሪክ በመሣሪያዎ ላይ የግል ሆኖ ይቆያል እና ማንነትዎን ለመጠበቅ ሪፖርቶች ዘግይተው ይላካሉ</translation>
-<translation id="3293644607209440645">ይህን ገጽ ላክ</translation>
+<translation id="3293644607209440645">ይህን ገፅ ላክ</translation>
<translation id="32939749466444286">የLinux መያዣ አልጀመረም። እባክዎ እንደገና ይሞክሩ።</translation>
<translation id="3294437725009624529">እንግዳ</translation>
<translation id="3294686910656423119">የአጠቃቀም ስታቲስቲክስ እና የብልሽት ሪፖርቶች</translation>
@@ -2630,7 +2630,7 @@
<translation id="3305389145870741612">ቅርጸት የመስራት ሂደቱ አንድ ሁለት ሰከንዶች ሊወስድ ይችላል። እባክዎ ይጠብቁ።</translation>
<translation id="3305661444342691068">PDF በቅድመ እይታ ክፈት</translation>
<translation id="3307176291962384345">ለ<ph name="MERCHANT_NAME" /> የዋጋ ቅናሾች ያግኙ</translation>
-<translation id="3308116878371095290">ይህ ገጽ ኩኪዎችን ከማቀናጀት ተከልክሏል።</translation>
+<translation id="3308116878371095290">ይህ ገፅ ኩኪዎችን ከማቀናጀት ተከልክሏል።</translation>
<translation id="3308134619352333507">አዘራር ደብቅ</translation>
<translation id="3308852433423051161">የGoogle ረዳትን በመጫን ላይ...</translation>
<translation id="3309330461362844500">የእውቅና ማረጋገጫ መገለጫ መታወቂያ</translation>
@@ -2645,7 +2645,7 @@
<translation id="3317678681329786349">ካሜራ እና ማይክሮፎን ታግደዋል</translation>
<translation id="3319306431415395200">በ<ph name="VISUAL_SEARCH_PROVIDER" /> በምስሎች ውስጥ ያለ ጽሑፍን ተርጉም</translation>
<translation id="3320630259304269485">የጥንቃቄ አሰሳ (ከአደገኛ ጣቢያዎች መጠበቅ) እና ሌሎች የደህንነት ቅንብሮች</translation>
-<translation id="3323521181261657960">ጉርሻ! ተጨማሪ የማያ ገጽ ጊዜ አለዎት</translation>
+<translation id="3323521181261657960">ጉርሻ! ተጨማሪ የማያ ገፅ ጊዜ አለዎት</translation>
<translation id="3323577066981719144">እዚህ የሚያደርጓቸው ለውጦች በChrome አሳሽ ላይ ብቻ ይተገበራሉ። በእርስዎ የLacros Chrome አሳሽ ቅንብሮች ላይ ለውጦችን ለማድረግ የLacros Chrome አሳሽ ይክፈቱ እና ወደ ቅንብሮች ይሂዱ።</translation>
<translation id="3325804108816646710">የሚገኙ መገለጫዎችን በመፈለግ ላይ...</translation>
<translation id="3325910708063135066">ካሜራ እና ማይክሮፎን በMac System Preferences ውስጥ ጠፍተዋል</translation>
@@ -2672,7 +2672,7 @@
<translation id="3348038390189153836">ተነቃይ መሣሪያ ተገኝቷል</translation>
<translation id="3348131053948466246">ስሜት ገላጭ ምስል ተጠቁሟል። ለመዳሰስ ወደ ላይ እና ወደ ታች ይጫኑና ለማስገባት አስገባን ይጫኑ።</translation>
<translation id="3349933790966648062">የማህደረ ትውስታ</translation>
-<translation id="3353786022389205125">«ከእንቅልፍ ሲነቃ ማያ ገጽ ቆልፍን አሳይ» የሚለውን ያብሩ እና እንደገና ይሞክሩ</translation>
+<translation id="3353786022389205125">«ከእንቅልፍ ሲነቃ ማያ ገፅ ቆልፍን አሳይ» የሚለውን ያብሩ እና እንደገና ይሞክሩ</translation>
<translation id="3354768182971982851">የድሮ የChrome መተግበሪያዎች ስሪቶች ከዲሴምበር 2022 በኋላ በMac መሣሪያዎች ላይ አይከፍቱም። አዲስ ስሪት የሚገኝ ከሆነ መፈተሽ ይችላሉ።</translation>
<translation id="3354972872297836698">ከ<ph name="DEVICE_NAME" /> መሣሪያ ጋር መጣመር አልቻለም፤ እንደገና ለመሞከር መሣሪያ ይምረጡ</translation>
<translation id="335581015389089642">ንግግር</translation>
@@ -2754,7 +2754,7 @@
<translation id="3429086384982427336">ከዚህ በታች የተዘረዘሩት መተግበሪያዎች የፕሮቶኮል አገናኞችን በጭራሽ አይይዙም።</translation>
<translation id="3429160811076349561">የሙከራ ባህሪዎች ጠፍተዋል</translation>
<translation id="3429271624041785769">የድር ይዘት ቋንቋዎች</translation>
-<translation id="3429275422858276529">ይህን ገጽ በቀላሉ በኋላ እንዲያገኙ ዕልባት ያድርጉት</translation>
+<translation id="3429275422858276529">ይህን ገፅ በቀላሉ በኋላ እንዲያገኙ ዕልባት ያድርጉት</translation>
<translation id="3432762828853624962">የተጋሩ ሠራተኞች</translation>
<translation id="3433507769937235446">ፈቃድ ላይ ቆልፍ</translation>
<translation id="3433621910545056227">ውይ! ስርዓቱ የመሣሪያ ጭነት-ሰዓት አይነታዎች ቁልፉን መመስረት አልተሳካለትም።</translation>
@@ -2770,7 +2770,7 @@
<translation id="3439153939049640737"><ph name="HOST" /> ሁልጊዜ የማይክሮፎንዎ መዳረሻ ይፈቀድለት</translation>
<translation id="3439970425423980614">PDF በቅድመ እይታ በመክፈት ላይ</translation>
<translation id="3440663250074896476">ለ<ph name="BOOKMARK_NAME" /> ተጨማሪ እርምጃዎች</translation>
-<translation id="3441653493275994384">ማያ ገጽ</translation>
+<translation id="3441653493275994384">ማያ ገፅ</translation>
<translation id="3441663102605358937">ይህንን መለያ ለማረጋገጥ እንደገና ወደ <ph name="ACCOUNT" /> በመለያ ይግቡ</translation>
<translation id="3442674350323953953"><ph name="DEVICE_OS" />ን ለማሻሻል እንዲረዳው Google የእርስዎን የሃርድዌር ውሂብ እንዲጠቅም ይፍቀዱ። ካልተቀበሉ፣ ይህ ውሂብ አሁንም ትክክለኛ ዝማኔዎችን ለመወሰን ወደ Google ይላካል፣ ነገር ግን በሌላ መንገድ አልተከማችም ወይም ጥቅም ላይ አይውልም።</translation>
<translation id="3444726579402183581"><ph name="ORIGIN" /> <ph name="FILENAME" />ን ማየት ይችላል</translation>
@@ -2812,7 +2812,7 @@
<translation id="3471876058939596279">HDMI እና USB Type-C ወደቦች በተመሳሳይ ጊዜ አንድ ላይ ጥቅም ላይ ሊውሉ አይችሉም። የተለየ ቪዲዮ ወደብ ይጠቀሙ።</translation>
<translation id="3472469028191701821">በአዲስ ትር ውስጥ ይከፍታል</translation>
<translation id="3473241910002674503">በጡባዊ ሁነታ ላይ ወደ ቤት ይዳስሱ፣ ይመለሱ እና መተግበሪያዎችን ይቀይሩ።</translation>
-<translation id="3473479545200714844">የማያ ገጽ ማጉያ</translation>
+<translation id="3473479545200714844">የማያ ገፅ ማጉያ</translation>
<translation id="3474218480460386727">ለአዲስ ቃላት 99 ፊደሎችን ወይም ከዚያ ያነሰ ይጠቀሙ</translation>
<translation id="3474624961160222204">እንደ <ph name="NAME" /> ይቀጥሉ</translation>
<translation id="3475843873335999118">ይቅርታ፣ የጣት አሻራዎ አሁንም አልታወቀም። እባክዎ የይለፍ ቃልዎን ያስገቡት።</translation>
@@ -2865,7 +2865,7 @@
<translation id="3518866566087677312">በኋላ ሊመለሱባቸው የሚፈልጓቸውን ነገሮች ዕልባት ያድርጉ</translation>
<translation id="3518985090088779359">ተቀበል እና ቀጥል</translation>
<translation id="3519564332031442870">የህትመት ደጀን አገልግሎት</translation>
-<translation id="3519938335881974273">ገጽ አስቀምጥ እንደ…</translation>
+<translation id="3519938335881974273">ገፅ አስቀምጥ እንደ…</translation>
<translation id="3520824492621090923">የኪዮስክ እና የምልክት ቋንቋ መሣሪያ ምዝገባ ይረጋገጥ?</translation>
<translation id="3521405806571557477">ለ<ph name="SITE_NAME" /> የተቀመጠ ውሂብን አጥፋ</translation>
<translation id="3521606918211282604">የዲስክ መጠንን ለውጥ</translation>
@@ -2900,7 +2900,7 @@
<translation id="3554493885489666172">የእርስዎ መሣሪያ በ<ph name="PROFILE_NAME" /> ነው የሚተዳደረው። አስተዳዳሪዎች በዚህ መሣሪያ ላይ በማንኛውም መገለጫ ውስጥ ያለውን ውሂብ መድረስ ይችላሉ።</translation>
<translation id="3555812735919707620">ቅጥያ አስወገድ</translation>
<translation id="3556000484321257665">የእርስዎ የፍለጋ ፕሮግራም ወደ <ph name="URL" /> ተቀይሯል።</translation>
-<translation id="3557101512409028104">የድር ጣቢያ ገደቦችን እና የማያ ገጽ ጊዜ ገደቦችን በFamily Link ያቀናብሩ</translation>
+<translation id="3557101512409028104">የድር ጣቢያ ገደቦችን እና የማያ ገፅ ጊዜ ገደቦችን በFamily Link ያቀናብሩ</translation>
<translation id="3557267430539505890"><ph name="BEGIN_PARAGRAPH1" />የChromeOS መሣሪያዎች ራስ-ሰር ሪፖርቶችን እንዲልኩ መፍቀድ እኛ በChromeOS ውስጥ ምን መስተካከል እና መሻሻል እንዳለበት ቅድሚያ እንድንሰጥ ያግዘናል። እነዚህ ሪፖርቶች እንደ ChromeOS ሲበላሽ፣ የትኛዎቹ ባህሪያት ስራ ላይ እንደዋሉ እና በተለምዶ ምን ያህል ማህደረ ትውስታ ስራ ላይ ውሎ እንደነበር ያሉ ነገሮችን ሊያካትቱ ይችላሉ።<ph name="END_PARAGRAPH1" />
<ph name="BEGIN_PARAGRAPH2" />በማንኛውም ጊዜ በልጅዎ የChromeOS መሣሪያ ቅንብሮች ውስጥ እነዚህን ሪፖርቶች መፍቀድ መጀመር ወይም ማቆም ይችላሉ። እርስዎ የጎራ አስተዳዳሪ ከሆኑ ይህን ቅንብር በአስተዳዳሪ መሥሪያው ውስጥ መቀየር ይችላሉ።<ph name="END_PARAGRAPH2" /></translation>
<translation id="3559262020195162408">በመሣሪያው ላይ መመሪያን መጫን አልተሳካም።</translation>
@@ -2997,7 +2997,7 @@
<translation id="3640613767643722554">የእርስዎ ረዳት ድምጽዎን ለይቶ እንዲያውቅ ያስተምሩት</translation>
<translation id="3641456520301071208">ጣቢያዎች አካባቢዎን ሊጠይቁ ይችላሉ</translation>
<translation id="3642070413432681490">ክብ ጠቋሚ</translation>
-<translation id="3642699533549879077">ሌላ ሰው የእርስዎን ማያ ገጽ ሲመለከት ማንቂያ ይደርስዎታል እንዲሁም የማሳወቂያ ይዘት ይደበቃል።</translation>
+<translation id="3642699533549879077">ሌላ ሰው የእርስዎን ማያ ገፅ ሲመለከት ማንቂያ ይደርስዎታል እንዲሁም የማሳወቂያ ይዘት ይደበቃል።</translation>
<translation id="3643962751030964445">ይህ መሣሪያ በ<ph name="DEVICE_MANAGER" /> የሚተዳደር ነው። ለ<ph name="USER_EMAIL_ADDRESS" /> መለያ አዲስ መገለጫ በ<ph name="DEVICE_MANAGER" /> ይፈለጋል</translation>
<translation id="3645372836428131288">የጣት አሻራውን የተለየ ክፍል ለመያዝ በቀስታ ያንቀሳቅሱት።</translation>
<translation id="3647051300407077858">የማሳወቂያ ፈቃዶችን ገምግም</translation>
@@ -3037,7 +3037,7 @@
<translation id="3680683624079082902">የጽሑፍ-ወደ-ንግግር ድምፅ</translation>
<translation id="3681311097828166361">ለሰጡን ግብረመልስ እናመሰግናለን። አሁን ከመስመር ውጭ ነዎት፣ እና የእርስዎ ሪፖርት በኋላ ላይ ይላካል።</translation>
<translation id="3681548574519135185">የትኩረት ቀለበት</translation>
-<translation id="3683524264665795342">የ<ph name="APP_NAME" /> ማያ ገጽ ማጋራት ጥያቄ</translation>
+<translation id="3683524264665795342">የ<ph name="APP_NAME" /> ማያ ገፅ ማጋራት ጥያቄ</translation>
<translation id="3685598397738512288">የLinux ዩኤስቢ ምርጫዎች</translation>
<translation id="3687598459967813435">ሁልጊዜ ከ<ph name="WEBSITE" /> የሚመጡ ማሳወቂያዎችን ፍቀድ</translation>
<translation id="368789413795732264">ይህን ፋይል ለመጻፍ በመሞከር ላይ ሳለ ስህተት ነበር፦ <ph name="ERROR_TEXT" />።</translation>
@@ -3077,14 +3077,14 @@
<translation id="3711931198657368127">ይለጥፉና ወደ <ph name="URL" /> ይሂዱ</translation>
<translation id="3711945201266135623">ከህትመት አገልጋዩ <ph name="NUM_PRINTERS" /> አታሚዎች ተገኝተዋል</translation>
<translation id="3712050472459130149">የመለያ ዝማኔ ያስፈልጋል</translation>
-<translation id="3712897371525859903">ገጽ አስቀምጥ &amp;እንደ…</translation>
+<translation id="3712897371525859903">ገፅ አስቀምጥ &amp;እንደ…</translation>
<translation id="371300529209814631">ወደ ኋላ/ወደ ፊት</translation>
<translation id="3713047097299026954">ይህ የደህንነት ቁልፍ ምንም በመለያ መግቢያ ውሂብ የለውም</translation>
<translation id="3713091615825314967">ራስ-ሰር ዝማኔዎች በርተዋል።</translation>
<translation id="371370241367527062">የፊት ማይክሮፎን</translation>
<translation id="3714195043138862580">ይህ የቅንጭብ ማሳያ መሣሪያ ወደ አቅርቦትን ማስወገድ ሁኔታ ተመድቧል።</translation>
<translation id="3719310907809321183"><ph name="CARD_IDENTIFIER" /> ተሞልቷል።</translation>
-<translation id="3719826155360621982">መነሻ ገጽ</translation>
+<translation id="3719826155360621982">መነሻ ገፅ</translation>
<translation id="372062398998492895">CUPS</translation>
<translation id="3721119614952978349">እርስዎ እና Google</translation>
<translation id="3722108462506185496">ምናባዊ ማሽንን ማስጀመር አልተቻለም። እባክዎ እንደገና ይሞክሩ።</translation>
@@ -3123,13 +3123,13 @@
<translation id="375636864092143889">ጣቢያ የእርስዎን ማይክሮፎን እየተጠቀመ ነው</translation>
<translation id="3756485814916578707">ማያ ገጽን Cast በማድረግ ላይ</translation>
<translation id="3756578970075173856">ፒን ያዘጋጁ</translation>
-<translation id="3756795331760037744">Google ረዳት ለማገዝ በ<ph name="SUPERVISED_USER_NAME" /> ማያ ገጽ ላይ ያለ መረጃን እንዲጠቀም ይፍቀዱለት</translation>
+<translation id="3756795331760037744">Google ረዳት ለማገዝ በ<ph name="SUPERVISED_USER_NAME" /> ማያ ገፅ ላይ ያለ መረጃን እንዲጠቀም ይፍቀዱለት</translation>
<translation id="3756806135608816820">ጣቢያዎች የብሉቱዝ መሣሪያዎችን ለመፈለግ መጠየቅ ይችላሉ</translation>
<translation id="3757733214359997190">ምንም ጣቢያዎች አልተገኙም</translation>
<translation id="375841316537350618">ተኪ ስክሪፕትን በማውረድ ላይ...</translation>
<translation id="3758842566811519622">ኩኪዎች ተቀናብረዋል</translation>
<translation id="3759933321830434300">የድረ-ገጾች ክፍሎችን ያግዳል</translation>
-<translation id="3760460896538743390">&amp;የጀርባ ገጽ ይመርምሩ</translation>
+<translation id="3760460896538743390">&amp;የጀርባ ገፅ ይመርምሩ</translation>
<translation id="37613671848467444">&amp;ማንነትን በማያሳውቅ መስኮት ውስጥ ክፈት</translation>
<translation id="3761556954875533505">ጣቢያ ፋይሎችን እንዲያርትዕ ይፈቀድለት?</translation>
<translation id="3763549179847864476">የግላዊነት መመሪያ የተመለስ አዝራር</translation>
@@ -3187,8 +3187,8 @@
<translation id="380329542618494757">ስም</translation>
<translation id="3803345858388753269">የቪዲዮ ጥራት</translation>
<translation id="3803367742635802571">የሚጎበኟቸው ጣቢያዎች እንደተነደፉት መስራታቸውን ሊያቆሙ ይችላሉ</translation>
-<translation id="380408572480438692">የአፈጻጸም ውሂብ ስብስብን ማንቃት Google ከጊዜ ወደ ጊዜ ስርዓቱን እንዲያሻሽለው ያግዘዋል። የግብረ መልስ ሪፖርት ፋይል እስኪያደርጉ (Alt-Shift-I) እና የአፈጻጸም ውሂብ እስኪያካትቱ ድረስ ምንም ውሂብ አይላክም። በማንኛውም ጊዜ ስብስቡን ለማሰናከል ወደዚህ ማያ ገጽ መመለስ ይችላሉ።</translation>
-<translation id="3807249107536149332"><ph name="EXTENSION_NAME" /> (የቅጥያ መታወቂያ «<ph name="EXTENSION_ID" />») በመግቢያ ገጽ ላይ አይፈቀድም።</translation>
+<translation id="380408572480438692">የአፈጻጸም ውሂብ ስብስብን ማንቃት Google ከጊዜ ወደ ጊዜ ስርዓቱን እንዲያሻሽለው ያግዘዋል። የግብረ መልስ ሪፖርት ፋይል እስኪያደርጉ (Alt-Shift-I) እና የአፈጻጸም ውሂብ እስኪያካትቱ ድረስ ምንም ውሂብ አይላክም። በማንኛውም ጊዜ ስብስቡን ለማሰናከል ወደዚህ ማያ ገፅ መመለስ ይችላሉ።</translation>
+<translation id="3807249107536149332"><ph name="EXTENSION_NAME" /> (የቅጥያ መታወቂያ «<ph name="EXTENSION_ID" />») በመግቢያ ገፅ ላይ አይፈቀድም።</translation>
<translation id="3807747707162121253">&amp;ይቅር</translation>
<translation id="3808202562160426447">ደብዛዛ የዳራ ይዘት</translation>
<translation id="3808443763115411087">የCrostini Android መተግበሪያ ግንባታ</translation>
@@ -3212,7 +3212,7 @@
<translation id="3819164369574292143">በማያ ገጹ ላይ ያሉ ንጥሎችን ለማተለቅ ያጉሉ። ማጉያን ለማብራት እና ለማጥፋት Search + Ctrl + Mን ይጠቀሙ። ከጎላ በኋላ ለመንቀሳቀስ Ctrl + Alt + የአቅጣጫ ቁልፎችን ይጠቀሙ።</translation>
<translation id="3819257035322786455">ምትኬ ያስቀምጡ</translation>
<translation id="3819261658055281761">ሥርዓቱ ለዚህ መሣሪያ የረጅም ጊዜ ኤፒአይ መዳረሻ ማስመሰያን ማከማቸት አልቻለም።</translation>
-<translation id="3819800052061700452">&amp;በሙሉ ገጽ ማያ አሳይ</translation>
+<translation id="3819800052061700452">&amp;በሙሉ ገፅ ማያ አሳይ</translation>
<translation id="3820638253182943944">{MUTED_NOTIFICATIONS_COUNT,plural, =1{አሳይ}one{ሁሉንም አሳይ}other{ሁሉንም አሳይ}}</translation>
<translation id="3820749202859700794">የSECG ሞላላ ጥምዝ secp521r1 (እንዲሁም NIST P-521 በመባል የሚታወቅ)</translation>
<translation id="3821074617718452587">የስልክ ሃብ ማሳወቂያዎች</translation>
@@ -3220,11 +3220,11 @@
<translation id="3823019343150397277">አይ ቢ ኤ ኤን</translation>
<translation id="3823310065043511710">ለLinux ቢያንስ <ph name="INSTALL_SIZE" /> ቦታ ይመከራል።</translation>
<translation id="3824621460022590830">የመሣሪያ ምዝገባ ማስመሰያ ልክ ያልሆነ ነው። እባክዎ የእርስዎን የመሣሪያ ባለቤት ወይም አስተዳዳሪ ያነጋግሩ። የስህተት ኮድ፦ <ph name="ERROR_CODE" />።</translation>
-<translation id="3825041664272812989">{FILE_TYPE_COUNT,plural, =1{ለዚህ የፋይል አይነት ምርጫዬን አስታውስ፡- <ph name="FILE_TYPES" />}one{ለእነዚህ የፋይል አይነቶች ምርጫዬን አስታውስ፡- <ph name="FILE_TYPES" />}other{ለእነዚህ የፋይል አይነቶች ምርጫዬን አስታውስ፡- <ph name="FILE_TYPES" />}}</translation>
+<translation id="3825041664272812989">{FILE_TYPE_COUNT,plural, =1{ለዚህ የፋይል ዓይነት ምርጫዬን አስታውስ፡- <ph name="FILE_TYPES" />}one{ለእነዚህ የፋይል አይነቶች ምርጫዬን አስታውስ፡- <ph name="FILE_TYPES" />}other{ለእነዚህ የፋይል አይነቶች ምርጫዬን አስታውስ፡- <ph name="FILE_TYPES" />}}</translation>
<translation id="3825635794653163640">ለመተግበሪያ ማንቂያዎች በመተግበሪያ አዶ ላይ ነጥብን ያሳዩ</translation>
<translation id="3826071569074535339">የእንቅስቃሴ ዳሳሾችን እንዲጠቀም ተፈቅዷል</translation>
<translation id="3826440694796503677">የእርስዎ አስተዳዳሪ ተጨማሪ የGoogle መለያዎችን ማከል አሰናክሏል</translation>
-<translation id="3827774300009121996">&amp;በሙሉ ገጽ ማያ አሳይ</translation>
+<translation id="3827774300009121996">&amp;በሙሉ ገፅ ማያ አሳይ</translation>
<translation id="3828029223314399057">ዕልባቶች ፈልግ</translation>
<translation id="3828953470056652895"><ph name="BEGIN_LINK1" />የGoogle አገልግሎት ውሉን<ph name="END_LINK1" />፣ <ph name="BEGIN_LINK2" />የChrome እና የChromeOS ተጨማሪ አገልግሎት ውሉን<ph name="END_LINK2" /> እና <ph name="BEGIN_LINK3" />የPlay አገልግሎት ውሉን<ph name="END_LINK3" /> አንብቤ ተስማምቼባቸዋለሁ።</translation>
<translation id="3829765597456725595">SMB ፋይል ማጋራት</translation>
@@ -3314,11 +3314,11 @@
<translation id="3909701002594999354">ሁሉንም &amp;መቆጣጠሪያዎች አሳይ</translation>
<translation id="3909791450649380159">&amp;ቁረጥ</translation>
<translation id="39103738135459590">የማግበሪያ ኮድ</translation>
-<translation id="3911824782900911339">የአዲስ ትር ገጽ</translation>
+<translation id="3911824782900911339">የአዲስ ትር ገፅ</translation>
<translation id="3914173277599553213">የሚያስፈልግ</translation>
<translation id="3915280005470252504">በድምጽ ይፈልጉ</translation>
<translation id="3916233823027929090">የደህንነት ፍተሻዎች ተከናውነዋል</translation>
-<translation id="3916445069167113093">የዚህ አይነት ፋይል ኮምፒውተርዎን ሊጎዳ ይችላል። <ph name="FILE_NAME" />ን ለማንኛውም ማስቀመጥ ይፈልጋሉ?</translation>
+<translation id="3916445069167113093">የዚህ ዓይነት ፋይል ኮምፒውተርዎን ሊጎዳ ይችላል። <ph name="FILE_NAME" />ን ለማንኛውም ማስቀመጥ ይፈልጋሉ?</translation>
<translation id="3917184139185490151">የእርስዎ ኮምፒውተር ደህንነቱ የተጠበቀ ሞዱል አለው፣ ይህም በChromeOS ውስጥ ብዙ ወሳኝ የደህንነት ባህሪያትን ለመተግበር ሥራ ላይ የሚውል ነው። የበለጠ ለመረዳት የChromebook እገዛ ማዕከሉን ይጎብኙ፦ https://support.google.com/chromebook/?p=sm</translation>
<translation id="3918972485393593704">ዝርዝሮችን ለGoogle ሪፖርት አድርግ</translation>
<translation id="3919145445993746351">በሁሉም ኮምፒውተሮችዎ ላይ ቅጥያዎችዎን ለማግኘት ስምረትን ያብሩ</translation>
@@ -3329,7 +3329,7 @@
<translation id="3920909973552939961">የክፍያ ተቆጣጣሪዎችን ለመጫን አልተፈቀደም</translation>
<translation id="3922823422695198027">ሌሎች መተግበሪያዎች ከ<ph name="APP_NAME" /> ጋር ተመሳሳይ የሆኑ አገናኞችን ለመክፈት ተቀናብረዋል። ይህ <ph name="APP_NAME_2" />፣ <ph name="APP_NAME_3" /> እና <ph name="APP_NAME_4" /> የሚደገፉ አገናኞችን እንዳይከፍቱ ያሰናክላቸዋል።</translation>
<translation id="3923184630988645767">የውሂብ አጠቃቀም</translation>
-<translation id="3923676227229836009">ይህ ገጽ ፋይሎችን እንዲመለከት ይፈቀድለታል</translation>
+<translation id="3923676227229836009">ይህ ገፅ ፋይሎችን እንዲመለከት ይፈቀድለታል</translation>
<translation id="3924145049010392604">Meta</translation>
<translation id="3924487862883651986">ዩአርኤሎችን ለመፈተሽ ወደ ደህንነቱ የተጠበቀ አሰሳ ይልካቸዋል። አዲስ ስጋቶችን ፈልጎ ለማግኘት እንዲያግዝ በተጨማሪም የገጾች፣ የማውረዶች፣ የቅጥያ እንቅስቃሴ እና የሥርዓት መረጃ ትንሽ ናሙና ይልካል። እርስዎን በመላው የGoogle መተግበሪያዎች ላይ ለመጠበቅ ይህን ውሂብ ለጊዜው ከGoogle መለያዎ ጋር ያገናኘዋል።</translation>
<translation id="3925573269917483990">ካሜራ፦</translation>
@@ -3400,7 +3400,7 @@
<translation id="3979395879372752341">አዲስ ቅጥያ ታክሏል (<ph name="EXTENSION_NAME" />)</translation>
<translation id="3979748722126423326"><ph name="NETWORKDEVICE" />ን አንቃ</translation>
<translation id="3981058120448670012">ለ<ph name="REMAINING_TIME" /> በአቅራቢያ ላሉ መሣሪያዎች እንደ <ph name="DEVICE_NAME" /> ሆኖ ይታያል...</translation>
-<translation id="3981760180856053153">ልክ ያልሆነ የማስቀመጥ አይነት ገብቷል።</translation>
+<translation id="3981760180856053153">ልክ ያልሆነ የማስቀመጥ ዓይነት ገብቷል።</translation>
<translation id="3981902534690264083">ማስታወቂያ ሰሪዎች ማስታወቂያዎች እንዴት እንደሚሰሩ መረዳት ይችላሉ</translation>
<translation id="3982375475032951137">የእርስዎን አሳሽ በጥቂት ቀላል እርምጃዎችን ያቀናብሩ</translation>
<translation id="3983400541576569538">ከአንዳንድ መተግበሪያዎች የተገኘ ውሂብ ሊጠፋ ይችላል</translation>
@@ -3449,7 +3449,7 @@
<translation id="402707738228916911"><ph name="AUTHORIZE_INSTRUCTION_NAME" /> መመሪያ ተቀባይነት አግኝቷል</translation>
<translation id="4027958407426528157">ድር ጣቢያዎችን በእርስዎ <ph name="DEVICE_TYPE" /> ላይ በተጫኑ መተግበሪያዎች ውስጥ ይክፈቱ</translation>
<translation id="4028467762035011525">የግቤት ዘዴዎችን ያክሉ</translation>
-<translation id="4029556917477724407">ከ <ph name="PAGE_TITLE" /> ገጽ ይመለሱ</translation>
+<translation id="4029556917477724407">ከ <ph name="PAGE_TITLE" /> ገፅ ይመለሱ</translation>
<translation id="4031179711345676612">ማይክሮፎን ተፈቅዷል</translation>
<translation id="4031527940632463547">ዳሳሾች ታግደዋል</translation>
<translation id="4033415645631238123">ከእንግዲህ በSmart Lock መግባት አይገኝም። አሁንም በSmart Lock መክፈት ይችላሉ።</translation>
@@ -3468,7 +3468,7 @@
<translation id="4042941173059740150">በ<ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> አማካኝነት ወደ <ph name="SITE_ETLD_PLUS_ONE" /> ይቀጥሉ</translation>
<translation id="4043267180218562935">የጠቋሚ መጠን</translation>
<translation id="4044612648082411741">የእርስዎን የዕውቅና ማረጋገጫ ይለፍ ቃል ያስገቡ</translation>
-<translation id="4044708573046946214">ማያ ገጽ መቆለፊያ የይለፍ ቃል</translation>
+<translation id="4044708573046946214">ማያ ገፅ መቆለፊያ የይለፍ ቃል</translation>
<translation id="404493185430269859">ነባሪ የፍለጋ ፕሮግራም</translation>
<translation id="4045180775310929593">ማስታወሻ አክል...</translation>
<translation id="4046013316139505482">እነዚህ ቅጥያዎች በዚህ ጣቢያ ላይ ያለውን መረጃ መመልከትና መቀየር አያስፈልጋቸውም።</translation>
@@ -3506,7 +3506,7 @@
<translation id="4079140982534148664">የበለጸገ ፊደል አራሚን ተጠቀም</translation>
<translation id="4084682180776658562">ዕልባት</translation>
<translation id="4084835346725913160">ዝጋ <ph name="TAB_NAME" /></translation>
-<translation id="4085298594534903246">በዚህ ገጽ ላይ ጃቫስክሪፕት ታግዷል።</translation>
+<translation id="4085298594534903246">በዚህ ገፅ ላይ ጃቫስክሪፕት ታግዷል።</translation>
<translation id="4087089424473531098">ቅጥያውን ፈጥሯል፦ <ph name="EXTENSION_FILE" /></translation>
<translation id="408721682677442104">የMIDI መሣሪያዎች ሙሉ ቁጥጥር ተከልክሏል</translation>
<translation id="4087328411748538168">በቀኝ በኩል አሳይ</translation>
@@ -3528,12 +3528,12 @@
<translation id="4099060993766194518">ነባሪ የፍለጋ ፕሮግራም ወደነበረበት ይመለስ?</translation>
<translation id="4099874310852108874">የአውታረ መረብ ስህተት ተከስቷል።</translation>
<translation id="4100733287846229632">የመሣሪያው ቦታ እጅግ በጣም ዝቅተኛ ነው</translation>
-<translation id="4100853287411968461">አዲስ የማያ ገጽ ጊዜ ገደብ</translation>
+<translation id="4100853287411968461">አዲስ የማያ ገፅ ጊዜ ገደብ</translation>
<translation id="4101352914005291489">የተደበቀ SSID</translation>
<translation id="4102469565336584882">ልክ ያልሆነ ኮድ። የእርስዎ ግቤት የLPA:1$&lt;smdp address&gt;$&lt;activation code&gt; ቅርጸት ሊኖረው ይገባል።</translation>
<translation id="4102906002417106771">powerwash ለማድረግ እንደገና ያስጀምሩ</translation>
<translation id="4104163789986725820">ወደ &amp;ውጪ ላክ...</translation>
-<translation id="4104944259562794668">በቅንብሮች &gt; ደኅንነት እና ግላዊነት &gt; ማያ ገጽ ቁልፍ እና መግቢያ ውስጥ በኋላ ሊያነቁት ይችላሉ</translation>
+<translation id="4104944259562794668">በቅንብሮች &gt; ደኅንነት እና ግላዊነት &gt; ማያ ገፅ ቁልፍ እና መግቢያ ውስጥ በኋላ ሊያነቁት ይችላሉ</translation>
<translation id="4107048419833779140">የማከማቻ መሣሪያዎችን ለይተው ይወቁ እና ያስወጡ</translation>
<translation id="4108314971463891922">ተከተል</translation>
<translation id="4109135793348361820">መስኮት ወደ <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />) ውሰድ</translation>
@@ -3556,7 +3556,7 @@
<translation id="4124935795427217608">ዩኒኮርን</translation>
<translation id="412730574613779332">Spandex</translation>
<translation id="4130199216115862831">የመሣሪያ ምዝግብ ማስታወሻ</translation>
-<translation id="4130207949184424187">አንድ ቅጥያ ከኦምኒቦክሱ ሆነው ሲፈልጉ የሚታየውን ገጽ ቀይሮታል።</translation>
+<translation id="4130207949184424187">አንድ ቅጥያ ከኦምኒቦክሱ ሆነው ሲፈልጉ የሚታየውን ገፅ ቀይሮታል።</translation>
<translation id="4130750466177569591">እስማማለሁ</translation>
<translation id="413121957363593859">አካላት</translation>
<translation id="4131410914670010031">ጥቁር እና ነጭ</translation>
@@ -3575,13 +3575,13 @@
<translation id="4139326893730851150">የፊርምዌር ዝማኔዎች</translation>
<translation id="4142052906269098341">የእርስዎን <ph name="DEVICE_TYPE" /> በስልክዎ መክፈት አለብዎት። <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation>
<translation id="4142518881503042940">ተፈልገው የተገኙ አታሚዎችን ወደ የእርስዎ መገለጫ ያስቀምጡ ወይም አዲስ አታሚ ያክሉ። <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation>
-<translation id="4144218403971135344">የተሻለ ጥራት ያለውን ቪዲዮ ያግኙ እና የባትሪ ዕድሜ ይቆጥቡ። ቪዲዮ በእርስዎ የCast-የነቃ ማያ ገጽ ላይ ብቻ ይጫወታል።</translation>
+<translation id="4144218403971135344">የተሻለ ጥራት ያለውን ቪዲዮ ያግኙ እና የባትሪ ዕድሜ ይቆጥቡ። ቪዲዮ በእርስዎ የCast-የነቃ ማያ ገፅ ላይ ብቻ ይጫወታል።</translation>
<translation id="4144468798716165316">ፈጣን ትዕዛዞች</translation>
<translation id="4146026355784316281">ሁልጊዜ ከሥርዓት ተመልካች ጋር ክፈት</translation>
<translation id="4146785383423576110">ዳግም አዘጋጅ እና አጽዳ</translation>
<translation id="4147911968024186208">እባክዎ እንደገና ይሞክሩ። ይህን ስህተት በድጋሚ ከተመለከቱ እባክዎ የድጋፍ ተወካይዎን ያነጋግሩ።</translation>
<translation id="4150201353443180367">ማሳያ</translation>
-<translation id="4150569944729499860">የማያ ገጽ አውድ</translation>
+<translation id="4150569944729499860">የማያ ገፅ አውድ</translation>
<translation id="4152011295694446843">የእርስዎን እልባቶች እዚህ ያገኛሉ</translation>
<translation id="4152670763139331043">{NUM_TABS,plural, =1{1 ትር}one{# ትሮች}other{# ትሮች}}</translation>
<translation id="4154664944169082762">የጣት አሻራዎች</translation>
@@ -3665,9 +3665,9 @@
<translation id="424726838611654458">ሁልጊዜ በAdobe Reader ክፈት</translation>
<translation id="4248098802131000011">የይለፍ ቃላትዎን ከውሂብ ጥሰቶች እና ሌሎች የደህንነት ችግሮች ይጠብቁ</translation>
<translation id="4249248555939881673">የአውታረ መረብ ግንኙነትን በመጠበቅ ላይ...</translation>
-<translation id="4249373718504745892">ይህ ገጽ ካሜራዎን እና ማይክሮፎንዎን እንዳይደርስባቸው ታግዷል።</translation>
+<translation id="4249373718504745892">ይህ ገፅ ካሜራዎን እና ማይክሮፎንዎን እንዳይደርስባቸው ታግዷል።</translation>
<translation id="424963718355121712">መተግበሪያዎች ተፅዕኖ ከሚያሳርፉበት አስተናጋጅ መቅረብ አለባቸው</translation>
-<translation id="4250229828105606438">ቅጽበታዊ ገጽ እይታ</translation>
+<translation id="4250229828105606438">ቅጽበታዊ ገፅ እይታ</translation>
<translation id="4250680216510889253">አይ</translation>
<translation id="4251377547188244181">የኪዮስክ እና የምልክት ቋንቋ መሣሪያ ምዝገባ</translation>
<translation id="4252899949534773101">ብሉቱዝ ተሰናክሏል</translation>
@@ -3709,17 +3709,17 @@
<translation id="4281844954008187215">የአግልግሎት ውል</translation>
<translation id="4282196459431406533">Smart Lock በርቷል</translation>
<translation id="4284755288573763878">የተሻሻለ ደህንነት ይጥፋ?</translation>
-<translation id="4284903252249997120">የChromeVox የማያ ገጽ አንባቢ እና ለመናገር ምረጥ</translation>
+<translation id="4284903252249997120">የChromeVox የማያ ገፅ አንባቢ እና ለመናገር ምረጥ</translation>
<translation id="4285418559658561636">የይለፍ ቃልን ያዘምኑ</translation>
<translation id="4285498937028063278">ይንቀሉ</translation>
<translation id="428565720843367874">የጸረ-ቫይረስ ሶፍትዌር ይህንን ፋይል እየቃኘ ሳለ ድንገት አልተሳካም።</translation>
-<translation id="4287099557599763816">ማያ ገጽ አንባቢ</translation>
+<translation id="4287099557599763816">ማያ ገፅ አንባቢ</translation>
<translation id="428715201724021596">ከመገለጫ ጋር በመገናኘት ላይ። ይህ ጥቂት ደቂቃዎችን ሊወስድ ይችላል።</translation>
<translation id="4287157641315808225">አዎ፣ ChromeVoxን አግብር</translation>
<translation id="4287502603002637393">{MUTED_NOTIFICATIONS_COUNT,plural, =1{አሳይ}one{ሁሉንም አሳይ}other{ሁሉንም አሳይ}}</translation>
<translation id="4289540628985791613">ማጠቃለያ</translation>
<translation id="4289732974614035569">አንድ ፒን ይምረጡ</translation>
-<translation id="4290791284969893584">አንድ ገጽ ከዘጉ በኋላ እርስዎ የጀመሯቸው ሥራዎች ላይጠናቀቁ ይችላሉ</translation>
+<translation id="4290791284969893584">አንድ ገፅ ከዘጉ በኋላ እርስዎ የጀመሯቸው ሥራዎች ላይጠናቀቁ ይችላሉ</translation>
<translation id="4291265871880246274">የመግቢያ መገናኛ</translation>
<translation id="429234155571566255">እነዚህ በቅርቡ የታዩ የምግብ አዘገጃጀቶች</translation>
<translation id="4295072614469448764">መተግበሪያ በእርስዎ መን There may also be an icon in your Launcher.</translation>
@@ -3727,12 +3727,12 @@
<translation id="4297219207642690536">ዳግም ይጀምሩ እና ዳግም ያቀናብሩ</translation>
<translation id="4297813521149011456">ማዞር አሳይ</translation>
<translation id="4299022904780065004">አዲስ &amp;ማንነትን የማያሳውቅ መስኮት</translation>
-<translation id="4301671483919369635">ይህ ገጽ ፋይሎችን አርትዖት እንዲያደርግ ይፈቀድለታል</translation>
+<translation id="4301671483919369635">ይህ ገፅ ፋይሎችን አርትዖት እንዲያደርግ ይፈቀድለታል</translation>
<translation id="4303079906735388947">ለእርስዎ የደህንነት ቁልፍ አዲስ ፒን ያቀናብሩ</translation>
<translation id="4304713468139749426">የይለፍ ቃል አስተዳዳሪ</translation>
<translation id="4305402730127028764">ወደ <ph name="DEVICE_NAME" /> ይቅዱ</translation>
<translation id="4305817255990598646">ቀይር</translation>
-<translation id="4306119971288449206">መተግበሪያዎች በይዘት አይነት «<ph name="CONTENT_TYPE" />» ሊቀርቡ ይገባል</translation>
+<translation id="4306119971288449206">መተግበሪያዎች በይዘት ዓይነት «<ph name="CONTENT_TYPE" />» ሊቀርቡ ይገባል</translation>
<translation id="4307992518367153382">መሠረታዊ</translation>
<translation id="4309165024397827958">የአካባቢ ፈቃድ ያላቸው የAndroid መተግበሪያዎች እና አገልግሎቶች የመሣሪያዎን አካባቢ እንዲጠቀሙ ይፍቀዱ። Google በየጊዜው የአካባቢ ውሂብን ሊሰበስብና የአካባቢ ትክክለኝነትን እና በአካባቢ ላይ የተመሠረቱ አገልግሎቶችን ለማሻሻል ይህን ውሂብ ስም-አልባ በሆነ መልኩ ሊጠቀምበት ይችላል።</translation>
<translation id="4309183709806093061">እንዲሁም የሥርዓት ኦዲዮን አጋራ። ይህ መሣሪያ ግብረመልስን ለመከላከል ድምጸ-ከል ይደረጋል።</translation>
@@ -3807,13 +3807,13 @@
<translation id="4378551569595875038">በመገናኘት ላይ...</translation>
<translation id="4378556263712303865">መሣሪያን ማግኘት</translation>
<translation id="4379281552162875326">«<ph name="APP_NAME" />» ይራገፍ?</translation>
-<translation id="4380648069038809855">ወደ ሙሉ ገጽ ዕይታ ገብቷል</translation>
+<translation id="4380648069038809855">ወደ ሙሉ ገፅ ዕይታ ገብቷል</translation>
<translation id="4383048856908088702">ይህ ትር ቦዝኖ ሳለ የማህደረ ትውስታ ቆጣቢ ለሌሎች ተግባሮች <ph name="MEMORY_VALUE" /> ማህደረ ትውስታ ነፃ አድርጓል። ይህን በማንኛውም ጊዜ በ<ph name="SETTINGS_LINK" /> ውስጥ ሊቀይሩት ይችላሉ።</translation>
<translation id="4384312707950789900">ወደ የሚመረጥ ያክሉ</translation>
<translation id="4384652540891215547">ቅጥያውን አግብር</translation>
<translation id="4384886290276344300">የቁልፍ ሰሌዳ ቅንብሮችን ይቀይሩ</translation>
<translation id="438503109373656455">ሳራቶጋ</translation>
-<translation id="4385146930797718821">ቅጽበታዊ ገጽ እይታ ወደ ቅንጥብ ሰሌዳ ተቀድቷል</translation>
+<translation id="4385146930797718821">ቅጽበታዊ ገፅ እይታ ወደ ቅንጥብ ሰሌዳ ተቀድቷል</translation>
<translation id="4385905942116811558">የብሉቱዝ እና የዩኤስቢ መሣሪያዎችን በመፈለግ ላይ</translation>
<translation id="4387890294700445764">የተጠለፉ የይለፍ ቃላት</translation>
<translation id="4388650384344483842">ቢያንስ 8 ቁምፊዎችን ይጠቀሙ</translation>
@@ -3938,7 +3938,7 @@
<translation id="4493167769966437077"><ph name="LANGUAGE_NAME" />ን በጭራሽ ትርጉም ከማይቀርብባቸው ቋንቋዎች አስወግድ</translation>
<translation id="4493468155686877504">የተመከሩ (<ph name="INSTALL_SIZE" />)</translation>
<translation id="4495002167047709180">ይህ ቅጥያ <ph name="SITE" /> ላይ ይፈቀድ?</translation>
-<translation id="4495419450179050807">በዚህ ገጽ ላይ አታሳይ</translation>
+<translation id="4495419450179050807">በዚህ ገፅ ላይ አታሳይ</translation>
<translation id="4497145443434063861">ፒሲ እና Chromecast በተለያዩ የWi-Fi አውታረ መረቦች ላይ ናቸው (ለምሳሌ፦ 2.4 ጊኸ እና 5 ጊኸ)</translation>
<translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> ተበላሽቷል</translation>
<translation id="4500647907053779331">ምርጫዎችን ወደ <ph name="LANGUAGE" /> ይተርጉሙ</translation>
@@ -4046,7 +4046,7 @@
<translation id="4581774856936278355">Linux እንደነበረ መመለስ ላይ ስህተት</translation>
<translation id="4582297591746054421">ጣቢያዎች እንደ እርስዎ የቀዱትን የጽሑፍ ቅርጸት ማቆየት ያሉ ባህሪያትን ለማግኘት አብዛኛውን ጊዜ ቅንጥብ ሰሌዳዎን ያነብባሉ</translation>
<translation id="4582563038311694664">ሁሉንም ቅንብሮች ዳግም አስጀምር</translation>
-<translation id="4585793705637313973">ገጽ ያርትዑ</translation>
+<translation id="4585793705637313973">ገፅ ያርትዑ</translation>
<translation id="4586275095964870617"><ph name="URL" /> በአማራጭ አሳሽ ውስጥ ሊከፈት አልቻለም። እባክዎ የእርስዎን የሥርዓት አስተዳዳሪ ያነጋግሩ።</translation>
<translation id="4587589328781138893">ጣቢያዎች</translation>
<translation id="4589713469967853491">ምዝግብ ማስታወሻዎች በተሳካ ሁኔታ ወደ የውርዶች ማውጫ ተጽፈዋል።</translation>
@@ -4056,7 +4056,7 @@
<translation id="4592891116925567110">የስታይለስ መሳያ መተግበሪያ</translation>
<translation id="4593021220803146968">&amp;ወደዚህ ሂድ <ph name="URL" /></translation>
<translation id="4594218792629569101">ገፁን ወደ ዝርዝርዎ ግርጌ ለመውሰድ «እንደተነበበ ምልክት አድርግ»ን ይምረጡ</translation>
-<translation id="4594577641390224176">ስለ ገጽ ስርዓቱን እየፈለጉ ነው? ይጎብኙ</translation>
+<translation id="4594577641390224176">ስለ ገፅ ስርዓቱን እየፈለጉ ነው? ይጎብኙ</translation>
<translation id="4595560905247879544">መተግበሪያዎች እና ቅጥያዎች በአስተዳዳሪው ብቻ ነው ሊቀየሩ የሚችሉት (<ph name="CUSTODIAN_NAME" />)።</translation>
<translation id="4596295440756783523">እነዚህን አገልጋዮች የሚለዩ የዕውቅና ማረጋገጫዎች በፋይሉ ላይ አለዎት</translation>
<translation id="4598345735110653698">የይለፍ ቁልፎችን አስተዳድር</translation>
@@ -4074,7 +4074,7 @@
<translation id="4611114513649582138">የውሂብ ግንኙነት ይገኛል</translation>
<translation id="4612841084470706111">ለሁሉም የተጠየቁ ጣቢያዎች ፈቃድን ይስጡ</translation>
<translation id="4613144866899789710">የLinux ጭነትን በመሰረዝ ላይ...</translation>
-<translation id="4613271546271159013">አዲስ ትር ሲከፍቱ የሚኖረውን ገጽ አንድ ቅጥያ ለውጦታል።</translation>
+<translation id="4613271546271159013">አዲስ ትር ሲከፍቱ የሚኖረውን ገፅ አንድ ቅጥያ ለውጦታል።</translation>
<translation id="4615586811063744755">ምንም ኩኪ አልተመረጠም</translation>
<translation id="461661862154729886">የኃይል ምንጭ</translation>
<translation id="4617001782309103936">በጣም አጭር</translation>
@@ -4126,7 +4126,7 @@
ቅንብሮችን ከካርዱ ምናሌ ማቀናበር ወይም በChromeን አብጅ ውስጥ ተጨማሪ አማራጮችን ማየት ይችላሉ።</translation>
<translation id="4654236001025007561">ፋይሎችን በዙሪያዎ ላሉ የChromebooks እና የAndroid መሣሪያዎች ያጋሩ</translation>
<translation id="4657914796247705218">የTrackPoint ፍጥነት</translation>
-<translation id="4658285806588491142">የእርስዎን ማያ ገጽ የግል ያድርጉት</translation>
+<translation id="4658285806588491142">የእርስዎን ማያ ገፅ የግል ያድርጉት</translation>
<translation id="4658648180588730283">የ<ph name="APPLICATION_NAME" /> መተግበሪያው ከመስመር ውጭ አይገኝም።</translation>
<translation id="465878909996028221">http፣ https እና ፋይል ፕሮቶኮሎች ብቻ ለአሳሽ አቅጣጫ መቀየሮች ይደገፋሉ።</translation>
<translation id="4659126640776004816">ወደ የእርስዎ የ Google መለያ ሲገቡ፣ ይህ ባህሪ ይበራል።</translation>
@@ -4152,7 +4152,7 @@
<translation id="4676595058027112862">የስልክ ሃብ፣ የበለጠ ለመረዳት</translation>
<translation id="4677772697204437347">የጂፒዩ ማህደረ ትውስታ</translation>
<translation id="4678848110205818817">ክሬዲት/ዴቢት ካርድ</translation>
-<translation id="4680105648806843642">በዚህ ገጽ ላይ ድምፅ ተዘግቷል</translation>
+<translation id="4680105648806843642">በዚህ ገፅ ላይ ድምፅ ተዘግቷል</translation>
<translation id="4680112532510845139">ምስልን እዚህ ጣል ያድርጉ</translation>
<translation id="4681453295291708042">የአቅራቢያ አጋራ ያሰናክሉ</translation>
<translation id="4681512854288453141">የምንጭ መመሪያ</translation>
@@ -4203,7 +4203,7 @@
<translation id="472738079453283624">ምርቶች</translation>
<translation id="4727847987444062305">የሚተዳደር የእንግዳ ክፍለ-ጊዜ</translation>
<translation id="4728558894243024398">መድረክ</translation>
-<translation id="4730492586225682674">በማያ ገጽ ቁልፍ ላይ የስታይለስ የቅርብ ጊዜ ማስታወሻ</translation>
+<translation id="4730492586225682674">በማያ ገፅ ቁልፍ ላይ የስታይለስ የቅርብ ጊዜ ማስታወሻ</translation>
<translation id="4730888769809690665">ማሳወቂያዎች ለ<ph name="SITE" /> ተፈቅደዋል</translation>
<translation id="473140019006744096">ይህን ዝማኔ ለማጠናቀቅ በዚህ መሣሪያ ላይ በቂ ቦታ የለም። በመሣሪያዎ ላይ <ph name="NECESSARY_SPACE" /> ያጽዱ እና እንደገና ይሞክሩ።</translation>
<translation id="4733161265940833579"><ph name="BATTERY_PERCENTAGE" />% (ግራ)</translation>
@@ -4237,7 +4237,7 @@
<translation id="4761104368405085019">ማይክፎሮንዎን ይጠቀማል</translation>
<translation id="4762489666082647806">የጠቋሚ ቀለም</translation>
<translation id="4762718786438001384">የመሣሪያ የዲስክ ቦታ እጅግ በጣም ዝቅተኛ ነው</translation>
-<translation id="4763408175235639573">ይህን ገጽ ሲመለከቱት የሚከተሉት ኩኪዎች ተቀናብረዋል</translation>
+<translation id="4763408175235639573">ይህን ገፅ ሲመለከቱት የሚከተሉት ኩኪዎች ተቀናብረዋል</translation>
<translation id="4763757134413542119"><ph name="USER_EMAIL" /> ትክክለኛ የGoogle for Education account መለያ አይደለም። የእርስዎን አስተዳዳሪ ያነጋግሩ። አስተዳዳሪ ከሆኑ የሚከተለውን በመጎብኘት ድርጅትዎን ማዋቀር ይችላሉ፦ g.co/workspace/edusignup</translation>
<translation id="4765524037138975789">{MONTHS,plural, =1{ይህ መሣሪያ ለ1 ወር የሚቀመጥ ሲሆን በቀጣዩ ጊዜ ላይ ያለ ኮድ ማገናኘት ይችላሉ። ይህ በአስተዳዳሪዎ የሚቀናበር ነው።}one{ይህ መሣሪያ ለ{MONTHS} ወራት የሚቀመጥ ሲሆን በቀጣዩ ጊዜ ላይ ያለ ኮድ ማገናኘት ይችላሉ። ይህ በአስተዳዳሪዎ የሚቀናበር ነው።}other{ይህ መሣሪያ ለ{MONTHS} ወራት የሚቀመጥ ሲሆን በቀጣዩ ጊዜ ላይ ያለ ኮድ ማገናኘት ይችላሉ። ይህ በአስተዳዳሪዎ የሚቀናበር ነው።}}</translation>
<translation id="4765582662863429759">የAndroid መልዕክቶች ከስልክዎ የሚመጡ ጽሑፎችን ወደ የእርስዎ Chromebook እንዲያስተላልፉ ያስችለዋል</translation>
@@ -4255,7 +4255,7 @@
<translation id="4779083564647765204">ማጉሊያ</translation>
<translation id="4779136857077979611">ኦኒጊሪ</translation>
<translation id="4779766576531456629">የኢሲም የተንቀሳቃሽ ስልክ አውታረ መረብን ዳግም ይሰይሙ</translation>
-<translation id="4780321648949301421">ገጽ አስቀምጥ እንደ…</translation>
+<translation id="4780321648949301421">ገፅ አስቀምጥ እንደ…</translation>
<translation id="4781443161433589743">በChrome በጣም ጠንካራው ደህንነት ላይ ነዎት</translation>
<translation id="4781584184731045253">ውሂብ እና ፈቃዶችን አጽዳ</translation>
<translation id="4785719467058219317">በዚህ ድር ጣቢያ ያልተመዘገበ የደህንነት ቁልፍ እየተጠቀሙ ነው</translation>
@@ -4267,7 +4267,7 @@
<translation id="4792290259143007505">የTrackPoint ማፋጠኛን አንቃ</translation>
<translation id="4792711294155034829">&amp;ችግር ሪፖርት ያድርጉ...</translation>
<translation id="4794810983896241342">ዝማኔዎች <ph name="BEGIN_LINK" />በአስተዳዳሪዎ<ph name="END_LINK" /> ነው የሚቀናበሩት</translation>
-<translation id="479536056609751218">ድረ-ገጽ፣ ኤች ቲ ኤም ኤል ብቻ</translation>
+<translation id="479536056609751218">ድረ-ገፅ፣ ኤች ቲ ኤም ኤል ብቻ</translation>
<translation id="4796142525425001238">ሁልጊዜ ወደነበረበት መልስ</translation>
<translation id="4797314204379834752">ተግባራትን ለማደራጀት፣ ለመስመር ላይ ግብይት እና ለሌሎችም የትር ቡድኖችን ለመጠቀም ይሞክሩ</translation>
<translation id="4798236378408895261"><ph name="BEGIN_LINK" />የብሉቱዝ ምዝግብ ማስታወሻ<ph name="END_LINK" />ን ያያይዙ (Google ውስጣዊ)</translation>
@@ -4322,7 +4322,7 @@
<translation id="4839910546484524995">የእርስዎን መሣሪያ ይፈትሹ</translation>
<translation id="4840096453115567876">ለማንኛውም ማንነት ከማያሳውቅ ሁነታ ይውጡ?</translation>
<translation id="4841741146571978176">ተፈላጊ ምናባዊ ማሽን የለም። ለመቀጠል እባክዎ <ph name="VM_TYPE" />ን ለማቀናበር ይሞክሩ</translation>
-<translation id="4842976633412754305">ይህ ገጽ ፈቃድ ከሌላቸው ምንጮች የመጡ ጽሑፎችን ለመጫን እየሞከረ ነው።</translation>
+<translation id="4842976633412754305">ይህ ገፅ ፈቃድ ከሌላቸው ምንጮች የመጡ ጽሑፎችን ለመጫን እየሞከረ ነው።</translation>
<translation id="4844333629810439236">ሌሎች የቁልፍ ሰሌዳዎች</translation>
<translation id="484462545196658690">ራስ-ሰር</translation>
<translation id="4844633725025837809">ለታከለው ደህንነት በመሣሪያዎ ላይ ያሉ የይለፍ ቃላትን ወደ Google የይለፍ ቃል አስተዳዳሪ ከመቀመጣቸው በፊት ያመስጥሩ</translation>
@@ -4361,7 +4361,7 @@
<translation id="4876273079589074638">መሐንዲሶቻችን ይህን ስንክል እንዲመረምሩና እንዲጠግኑት ያግዟቸው። ከቻሉ የተከተሏቸውን ደረጃዎች በሙሉ በትክክል ይግለጹ። ምንም አይረባም የሚባል ዝርዝር የለም!</translation>
<translation id="4876895919560854374">ማያ ገጹን ይከፍተዋል እና ይዘገዋል</translation>
<translation id="4877276003880815204">አባለ ነገሮችን መርምር</translation>
-<translation id="4877652723592270843">የChromeOS Flex አብሮገነብ የማያ ገጽ አንባቢ የሆነውን ChromeVox ማግበር ይፈልጋሉ? ከፈለጉ ሁለቱንም የድምጽ መጠን ቁልፎች ለአምስት ሰከንዶች ተጭነው ይያዙ።</translation>
+<translation id="4877652723592270843">የChromeOS Flex አብሮገነብ የማያ ገፅ አንባቢ የሆነውን ChromeVox ማግበር ይፈልጋሉ? ከፈለጉ ሁለቱንም የድምጽ መጠን ቁልፎች ለአምስት ሰከንዶች ተጭነው ይያዙ።</translation>
<translation id="4878634973244289103">ግብረመልስን መላክ አልተቻለም። እባክዎ ቆይተው እንደገና ይሞክሩ።</translation>
<translation id="4878653975845355462">ብጁ በስተጀርባዎች በእርስዎ አስተዳዳሪ ጠፍተዋል</translation>
<translation id="4878718769565915065">የጣት አሻራን ወደዚህ የደህንነት ቁልፍ ማከል አልተሳካም</translation>
@@ -4388,12 +4388,12 @@
<translation id="4893073099212494043">የቀጣይ ቃል ግምትን አንቃ</translation>
<translation id="4893336867552636863">ይሄ የአሰሳ ውሂብዎን ለዘለዓለም ከዚህ መሣሪያ ይሰርዘዋል።</translation>
<translation id="4893454800196085005">ጥሩ - ዲቪዲ</translation>
-<translation id="4893522937062257019">በማያ ገጽ ቁልፉ ላይ</translation>
+<translation id="4893522937062257019">በማያ ገፅ ቁልፉ ላይ</translation>
<translation id="4898011734382862273">የ«<ph name="CERTIFICATE_NAME" />» እውቅና ማረጋገጫ አንድ የእውቅና ማረጋገጫ ባለሥልጣንን ይወክላል</translation>
<translation id="4899052647152077033">ቀለማትን ገልብጥ</translation>
<translation id="4899696330053002588">ማስታወቂያዎችን ይዟል</translation>
<translation id="489985760463306091">ጎጂ ሶፍትዌርን ማስወገዱን ለመጨረስ ኮምፒውተርዎን ዳግም ያስነሱት</translation>
-<translation id="4900392736118574277">የእርስዎ ጅምር ገጽ ወደ <ph name="URL" /> ተቀይሯል።</translation>
+<translation id="4900392736118574277">የእርስዎ ጅምር ገፅ ወደ <ph name="URL" /> ተቀይሯል።</translation>
<translation id="490051679772058907"><ph name="REFRESH_RATE" /> ኸዝ - የተጠላለፈ</translation>
<translation id="4900652253009739885">ለ«ምረጥ» የተመደበውን ብቸኛውን መቀየሪያ ማስወገድ አይቻልም። ለ<ph name="RESPONSE" /> ማንኛውንም ቁልፍ ይጫኑ።</translation>
<translation id="4901154724271753917">በቅርቡ የተዘጉትን ዘርጋ</translation>
@@ -4452,7 +4452,7 @@
<translation id="4955710816792587366">የእርስዎን ፒን ይምረጡ</translation>
<translation id="4959262764292427323">በማናቸውም መሣሪያ ላይ እርስዎ ሊጠቀሙባቸው እንዲችሉ የይለፍ ቃላት በእርስዎ Google መለያ ውስጥ ይቀመጣሉ</translation>
<translation id="4960294539892203357"><ph name="WINDOW_TITLE" /> - <ph name="PROFILE_NAME" /></translation>
-<translation id="4961318399572185831">የCast ማያ ገጽ</translation>
+<translation id="4961318399572185831">የCast ማያ ገፅ</translation>
<translation id="4961361269522589229">የምግብ አዘገጃጀት ሐሳቦች</translation>
<translation id="496185450405387901">ይህ መተግበሪያ በእርስዎ አስተዳዳሪ ተጭኗል።</translation>
<translation id="4963789650715167449">የአሁኑን ትር ያስወግዱ</translation>
@@ -4479,7 +4479,7 @@
<translation id="4986728572522335985">ይህ ፒኑን ጨምሮ በደህንነቱ ቁልፉ ላይ ያለው ሁሉምን ውሂብ ይሰርዛል</translation>
<translation id="4988526792673242964">ገፆች</translation>
<translation id="49896407730300355">በሰዓት መዞሪያ አቅጣጫ &amp;ተቃራኒ አሽከርክር</translation>
-<translation id="4989966318180235467">&amp;የጀርባ ገጽ ይመርምሩ</translation>
+<translation id="4989966318180235467">&amp;የጀርባ ገፅ ይመርምሩ</translation>
<translation id="4991420928586866460">የላይኛው ረድፍ ቁልፎች እንደ የተግባር ቁልፍ ተጠቀምባቸው</translation>
<translation id="4992458225095111526">Powerwashን ያረጋግጡ</translation>
<translation id="4992473555164495036">የእርስዎ አስተዳዳሪ ሊገኙ የሚችሉትን የግቤት ዘዴዎች ገድቧቸዋል።</translation>
@@ -4561,7 +4561,7 @@
<translation id="5072836811783999860">የሚቀናበሩ ዕልባቶችን አሳይ</translation>
<translation id="5072900412896857127">የGoogle Play የአገልግሎት ውልን መጫን አይቻልም። እባክዎ የእርስዎን አውታረ መረብ ይፈትሹ እና እንደገና ይሞክሩ።</translation>
<translation id="5073956501367595100">{0,plural,offset:2 =1{<ph name="FILE1" />}=2{<ph name="FILE1" />፣ <ph name="FILE2" />}one{<ph name="FILE1" />፣ <ph name="FILE2" />፣ እና # ተጨማሪ}other{<ph name="FILE1" />፣ <ph name="FILE2" />፣ እና # ተጨማሪ}}</translation>
-<translation id="5074318175948309511">አዲሶቹ ቅንብሮች ከመተግበራቸው በፊት ይህ ገጽ ዳግም መጫን ሊኖርበት ይችላል።</translation>
+<translation id="5074318175948309511">አዲሶቹ ቅንብሮች ከመተግበራቸው በፊት ይህ ገፅ ዳግም መጫን ሊኖርበት ይችላል።</translation>
<translation id="5074761966806028321">ውቅረትን ለማጠናቀቅ ፈቃድ አሁንም ያስፈልጋል</translation>
<translation id="5075563999073408211">መሣሪያዎን በአንድ ወይም በተጨማሪ መቀያየሪያዎች ይቆጣጠሩ። መቀያየሪያዎች የቁልፍ ሰሌዳ ቁልፎች፣ የመጫወቻ ንጣፍ አዝራሮች ወይም የተመደቡ መሣሪያዎች መሆን ይችላሉ።</translation>
<translation id="5075910247684008552">ደህንነታቸው በተጠበቁ ጣቢያዎች ላይ በነባሪነት ደህንነቱ ያልተጠበቀ ይዘት ይታገዳል</translation>
@@ -4575,7 +4575,7 @@
<translation id="5085162214018721575">ዝማኔዎችን በመፈተሽ ላይ</translation>
<translation id="5086082738160935172">HID</translation>
<translation id="508645147179720015">ማስታወሻ ከ1000 ቁምፊዎች በላይ ነው</translation>
-<translation id="5086874064903147617">ነባሪ ጅምር ገጽ ወደነበረበት ይመለስ?</translation>
+<translation id="5086874064903147617">ነባሪ ጅምር ገፅ ወደነበረበት ይመለስ?</translation>
<translation id="5087249366037322692">በሶስተኛ ወገን ታክሏል</translation>
<translation id="5087580092889165836">ካርድ አክል</translation>
<translation id="5088534251099454936">PKCS #1 SHA-512 ከRSA ምስጠራ ጋር</translation>
@@ -4633,10 +4633,10 @@
<translation id="5139955368427980650">&amp;ክፈት</translation>
<translation id="5141421572306659464">ዋና መለያ</translation>
<translation id="5142793792982256885">የመዳሰሻ ሰሌዳ ሽብለላ ፍጥነት</translation>
-<translation id="5143374789336132547">ይህ «<ph name="EXTENSION_NAME" />» ቅጥያ የመነሻ አዝራሩን ጠቅ ሲያደርጉ የሚታየውን ገጽ ቀይሮታል።</translation>
+<translation id="5143374789336132547">ይህ «<ph name="EXTENSION_NAME" />» ቅጥያ የመነሻ አዝራሩን ጠቅ ሲያደርጉ የሚታየውን ገፅ ቀይሮታል።</translation>
<translation id="5143612243342258355">ይህ ፋይል አደገኛ ነው</translation>
-<translation id="5143712164865402236">ወደ ሙሉ ገጽ ዕይታ ግባ</translation>
-<translation id="5145464978649806571">ከመሣሪያዎ ከወጡ ማያዎ በራስ-ሰር ይቆለፋል። ከመሣሪያዎ ፊት ለፊት ሲሆኑ ማያዎ ይበልጥ ረጅም ለሆነ ጊዜ ንቁ ይሆናል። ማያ ገጽ ቆልፍ ከተሰናከለ መሣሪያዎ ከመቆለፍ ይልቅ ይተኛል።</translation>
+<translation id="5143712164865402236">ወደ ሙሉ ገፅ ዕይታ ግባ</translation>
+<translation id="5145464978649806571">ከመሣሪያዎ ከወጡ ማያዎ በራስ-ሰር ይቆለፋል። ከመሣሪያዎ ፊት ለፊት ሲሆኑ ማያዎ ይበልጥ ረጅም ለሆነ ጊዜ ንቁ ይሆናል። ማያ ገፅ ቆልፍ ከተሰናከለ መሣሪያዎ ከመቆለፍ ይልቅ ይተኛል።</translation>
<translation id="514575469079499857">አካባቢን ለመወሰን የአይፒ አድራሻዎን ይጠቀሙ (ነባሪ)</translation>
<translation id="5146896637028965135">የሥርዓት ድምጽ</translation>
<translation id="5147103632304200977">አንድ ጣቢያ የHID መሣሪያዎችን መድረስ ሲፈልግ ጠይቅ (የሚመከር)</translation>
@@ -4649,7 +4649,7 @@
<translation id="5154702632169343078">ርዕሰ ጉዳይ</translation>
<translation id="5155327081870541046">በአድራሻ አሞሌው ላይ ሊፈልጉት ለሚፈልጉት ጣቢያ እንደ «@bookmarks» ያለ አቋራጭ ያስገቡ። ከዚያ የመረጡትን የቁልፍ ሰሌዳ አቋራጭ ይጫኑ እና የፍለጋ ቃልዎን ያስገቡ።</translation>
<translation id="5156638757840305347">ጠቋሚ ሲታይ ወይም ሲንቀሳቀስ ይደምቃል።</translation>
-<translation id="5157635116769074044">ይህን ገጽ የመነሻ ገጹ ላይ ይሰኩት...</translation>
+<translation id="5157635116769074044">ይህን ገፅ የመነሻ ገጹ ላይ ይሰኩት...</translation>
<translation id="5158206172605340248">የአጽንዖት ምልክቶች ምናሌ ተሰናብቷል።</translation>
<translation id="5159094275429367735">Crostiniን ያዋቅሩ</translation>
<translation id="5159419673777902220">የእርስዎ ወላጅ የቅጥያ ፈቃዶችን አሰናክለዋል</translation>
@@ -4706,7 +4706,7 @@
<translation id="5208988882104884956">ግማሽ ወርድ</translation>
<translation id="520902706163766447">በአሁኑ ጊዜ ክፍት በሆኑ ትሮች ላይ ለመፈለግ የብቅ-ባይ አረፋን በከፍተኛው Chrome UI ውስጥ ያንቁ።</translation>
<translation id="5209320130288484488">ምንም መሣሪያዎች አልተገኙም</translation>
-<translation id="5209513429611499188">የአጠቃቀም ገጽ <ph name="USAGE_PAGE" /> አጠቃቀሞች ያላቸው የኤችአይዲ መሣሪያዎች</translation>
+<translation id="5209513429611499188">የአጠቃቀም ገፅ <ph name="USAGE_PAGE" /> አጠቃቀሞች ያላቸው የኤችአይዲ መሣሪያዎች</translation>
<translation id="5210365745912300556">ትር ዝጋ</translation>
<translation id="5213114823401215820">የተዘጋ ቡድንን እንደገና ይክፈቱ</translation>
<translation id="5213481667492808996">የእርስዎ የ«<ph name="NAME" />» ውሂብ አገልግሎት ጥቅም ላይ ለመዋል ዝግጁ ነው</translation>
@@ -4727,7 +4727,7 @@
<translation id="5234764350956374838">አሰናብት</translation>
<translation id="5235050375939235066">መተግበሪያ ይራገፍ?</translation>
<translation id="523505283826916779">የተደራሽነት ቅንብሮች</translation>
-<translation id="5235750401727657667">አዲስ ትር በሚከፈትበት ጊዜ የሚመለከቱትን ገጽ ይተኩ</translation>
+<translation id="5235750401727657667">አዲስ ትር በሚከፈትበት ጊዜ የሚመለከቱትን ገፅ ይተኩ</translation>
<translation id="5236374273162681467">በሁሉም መሣሪያዎችዎ ላይ በቀላሉ ለመጠቀም ወደ Google መለያዎ ሊወስዷቸው ይችላሉ</translation>
<translation id="523862956770478816">የጣቢያ ፈቃዶች</translation>
<translation id="5242724311594467048">«<ph name="EXTENSION_NAME" />» ይንቃ?</translation>
@@ -4759,7 +4759,7 @@
<translation id="5265797726250773323">በመጫን ወቅት ስህተት</translation>
<translation id="5266113311903163739">የእውቅና ማረጋገጫ ስልጣን የማስመጣት ስህተት</translation>
<translation id="526622169288322445">ለ<ph name="ADDRESS_SUMMARY" /> ተጨማሪ እርምጃዎች</translation>
-<translation id="5268373933383932086">የእርስዎ ገጽ፣ የእርስዎ መንገድ</translation>
+<translation id="5268373933383932086">የእርስዎ ገፅ፣ የእርስዎ መንገድ</translation>
<translation id="5269977353971873915">ማተም አልተሳካም</translation>
<translation id="5273806377963980154">የጣቢያ ዩአርኤል ያርትዑ</translation>
<translation id="5273966423195882879">ገጽታ ላይ የተመሰረተ ቀለም</translation>
@@ -4787,7 +4787,7 @@
<translation id="5287425679749926365">የእርስዎ መለያዎች</translation>
<translation id="5288106344236929384">ተጨማሪ እርምጃዎች፣ ለ<ph name="USERNAME" /> <ph name="DOMAIN" /> ላይ የይለፍ ቁልፍ አማራጮች</translation>
<translation id="5288678174502918605">የተ&amp;ዘጋውን ትር ዳግም ክፈት</translation>
-<translation id="52895863590846877">ገጽ በ<ph name="LANGUAGE" /> አይደለም</translation>
+<translation id="52895863590846877">ገፅ በ<ph name="LANGUAGE" /> አይደለም</translation>
<translation id="52912272896845572">የግል ቁልፍ ፋይል ልክ አይደለም።</translation>
<translation id="5291739252352359682">በChrome አሳሽ ውስጥ ለሚዲያ የመግለጫ ጽሑፎችን በራስ-ሰር ይፈጥራል (በአሁኑ ጊዜ በእንግሊዝኛ የሚገኝ) ኦዲዮ እና መግለጫ ጽሑፎች በአካባቢ ውስጥ የሚስተናገዱ ሲሆኑ መሣሪያውን በጭራሽ አይተዉት።</translation>
<translation id="529175790091471945">ይህን መሣሪያ ቅርጸት ይስሩለት</translation>
@@ -4795,7 +4795,7 @@
<translation id="5293170712604732402">ቅንብሮች ወደ የመጀመሪያቸው ነባሪዎች መልሳቸው</translation>
<translation id="5294097441441645251">በንዑስ ሆሄ ቁምፊ ወይም የስር መስመር መጀመር አለበት</translation>
<translation id="5294618183559481278">ከመሣሪያዎ ፊት ለፊት ሰዎችን ለማግኘት የእርስዎ <ph name="DEVICE_TYPE" /> አብሮገነብ ዳሳሽዎ ይጠቀማል። ሁሉም ውሂብ ወዲያውኑ በመሣሪያዎ ላይ ይሰናዳል እንዲሁም ከዚያ ይሰረዛል። የዳሳሽ ውሂብ ወደ Google በጭራሽ አይላክም። <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation>
-<translation id="5296350763804564124">የመሣሪያዎን ማያ ገጽ ሳይመለከቱ መጠቀም እንዲችሉ የቃል ግብረመልስን ይስሙ። የብሬይል ግብረመልስ በተገናኘ መሣሪያ ይገኛል።</translation>
+<translation id="5296350763804564124">የመሣሪያዎን ማያ ገፅ ሳይመለከቱ መጠቀም እንዲችሉ የቃል ግብረመልስን ይስሙ። የብሬይል ግብረመልስ በተገናኘ መሣሪያ ይገኛል።</translation>
<translation id="5297005732522718715">የእንደ ሞደም መሰካት ውቅረትን አድስ</translation>
<translation id="5297082477358294722">የይለፍ ቃል ተቀምጧል። የተቀመጡ የይለፍ ቃላትን በእርስዎ <ph name="SAVED_PASSWORDS_STORE" /> ይመልከቱ እና ያስተዳድሩ።</translation>
<translation id="5297946558563358707">ሌላ ሰው የእርስዎን ማያ ገጽን ሲመለከት የግላዊነት ዓይን አዶ በማያ ገጽዎ ታችኛው ክፍል በስተቀኝ በኩል ያሳዩ</translation>
@@ -4838,7 +4838,7 @@
<translation id="5333896723098573627">መተግበሪያዎችን ለማስወገድ ወደ ቅንብሮች &gt; መተግበሪያዎች &gt; የGoogle Play መደብር &gt; የAndroid ምርጫዎችን ያስተዳድሩ &gt;መተግበሪያዎች ወይም የመተግበሪያ አስተዳዳሪ ይሂዱ። ከዚያ ለማራገፍ የሚፈልጉትን መተግበሪያ መታ ያድርጉ (መተግበሪያውን ለማግኘት ወደ ቀኝ ወይም ወደ ግራ ማንሸራተት ሊኖርብዎት ይችላል)። ከዚያ አራግፍ ወይም አሰናክል የሚለውን መታ ያድርጉ።</translation>
<translation id="5334113802138581043">የማይክሮፎን መዳረሻ</translation>
<translation id="5334142896108694079">የስክሪፕት መሸጎጫ</translation>
-<translation id="5336688142483283574">ይህ ገጽ እንዲሁም ከታሪክዎ እና የ<ph name="SEARCH_ENGINE" /> እንቅስቃሴ ይወገዳል።</translation>
+<translation id="5336688142483283574">ይህ ገፅ እንዲሁም ከታሪክዎ እና የ<ph name="SEARCH_ENGINE" /> እንቅስቃሴ ይወገዳል።</translation>
<translation id="5336689872433667741">ጠቋሚ እና የመዳሰሻ ሰሌዳ</translation>
<translation id="5337771866151525739">በሶስተኛ ወገን የተጫነ።</translation>
<translation id="5337926771328966926">አሁን ያለው የመሣሪያ ስም <ph name="DEVICE_NAME" /> ነው</translation>
@@ -4860,7 +4860,7 @@
<translation id="5355099869024327351">ረዳቱ ማሳውቂያዎችን ለእርስዎ እንዲያሳይ ፍቀድ</translation>
<translation id="5355191726083956201">የተሻሻለ ጥበቃ በርቷል</translation>
<translation id="5355501370336370394">የድርጅት መሣሪያ ይመዝገቡ</translation>
-<translation id="5355926466126177564">ይህ «<ph name="EXTENSION_NAME" />» ቅጥያ ከኦምኒቦክሱ ሆነው ሲፈልጉ የሚታየውን ገጽ ቀይሮታል።</translation>
+<translation id="5355926466126177564">ይህ «<ph name="EXTENSION_NAME" />» ቅጥያ ከኦምኒቦክሱ ሆነው ሲፈልጉ የሚታየውን ገፅ ቀይሮታል።</translation>
<translation id="5356155057455921522">ይህ ከእርስዎ አስተዳዳሪ የመጣ ዝማኔ የእርስዎን ድርጅት መተግበሪያዎች በፍጥነት እንዲከፈቱ ያደርጋቸዋል። ይህ ጥቂት ደቂቃዎችን ሊወስድ ይችላል።</translation>
<translation id="5359910752122114278">1 ውጤት</translation>
<translation id="5359944933953785675"><ph name="NUM" /> ትር</translation>
@@ -4900,7 +4900,7 @@
<translation id="5397378439569041789">ለኪዮስክ ወይም ለምልክት ቁንቋ መሣሪያ ይመዝገቡ</translation>
<translation id="5397794290049113714">እርስዎ</translation>
<translation id="5398497406011404839">የተደበቁ እልባቶች</translation>
-<translation id="5398572795982417028">ከወሰን ውጭ ያለ ገጽ ማጣቀሻ፣ ገደቡ <ph name="MAXIMUM_PAGE" /> ነው</translation>
+<translation id="5398572795982417028">ከወሰን ውጭ ያለ ገፅ ማጣቀሻ፣ ገደቡ <ph name="MAXIMUM_PAGE" /> ነው</translation>
<translation id="5401426944298678474">ጣቢያን አትከተል</translation>
<translation id="5401851137404501592">ለመቀጠል <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> የእርስዎን ስም፣ ኢሜይል አድራሻ እና የመገለጫ ሥዕል ለዚህ ጣቢያ ያጋራል።</translation>
<translation id="5402367795255837559">ብሬይል</translation>
@@ -4964,7 +4964,7 @@
<translation id="5457113250005438886">ልክ ያልሆነ</translation>
<translation id="5457459357461771897">በኮምፒውተርዎ ላይ ፎቶዎችን፣ ሙዚቃ እና ሌላ ማህደረ መረጃን ያነብባል</translation>
<translation id="5458214261780477893">ድቮራክ</translation>
-<translation id="5458998536542739734">የማያ ገጽ ቁልፍ ማስታወሻዎች</translation>
+<translation id="5458998536542739734">የማያ ገፅ ቁልፍ ማስታወሻዎች</translation>
<translation id="5459864179070366255">ለመጫን ይቀጥሉ</translation>
<translation id="5461050611724244538">የስልክዎ ግንኙነት ጠፍቷል</translation>
<translation id="5463275305984126951">የ<ph name="LOCATION" /> ጠቋሚ</translation>
@@ -5006,7 +5006,7 @@
<translation id="549211519852037402">ቤዥ እና ነጭ</translation>
<translation id="5492637351392383067">የመሣሪያ ላይ ምስጠራ</translation>
<translation id="5493455553805432330">እርሳ</translation>
-<translation id="5493792505296048976">ማያ ገጽ አብራ</translation>
+<translation id="5493792505296048976">ማያ ገፅ አብራ</translation>
<translation id="5494016731375030300">በቅርቡ የተዘጉ ትሮች</translation>
<translation id="5494362494988149300">&amp;ሲጠናቀቅ ክፈት</translation>
<translation id="5495466433285976480">ይሄ ዳግም ከአስጀመሩ በኋላ ሁሉንም አካባቢያዊ ተጠቃሚዎችን፣ ፋይሎችን፣ ውሂብ እና ሌሎች ቅንብሮችን ያስወግዳል። ሁሉም ተጠቃሚዎች እንደገና መግባት ይኖርባቸዋል።</translation>
@@ -5041,7 +5041,7 @@
<translation id="5517412723934627386"><ph name="NETWORK_TYPE" /> - <ph name="NETWORK_DISPLAY_NAME" /></translation>
<translation id="5518219166343146486">አንድ ጣቢያ ወደ ቅንጥብ ሰሌዳ የተቀዱትን ጽሁፍ እና ምስሎች መመልከት ሲፈልግ ይጠይቅ</translation>
<translation id="5519195206574732858">LTE</translation>
-<translation id="5521078259930077036">የጠበቁት የመነሻ ገጽ ይሄ ነው?</translation>
+<translation id="5521078259930077036">የጠበቁት የመነሻ ገፅ ይሄ ነው?</translation>
<translation id="5522156646677899028">ይህ ቅጥያ ከባድ የደህንነት ተጋላጭነት ያካትታል።</translation>
<translation id="5522403133543437426">በአድራሻ አሞሌ ውስጥ ሥራ ላይ የዋለ የፍለጋ ፕሮግራም</translation>
<translation id="5523149538118225875">{NUM_EXTENSIONS,plural, =1{አንድ ቅጥያ በአስተዳዳሪዎ ተጭኗል}one{# ቅጥያዎች በአስተዳዳሪዎ ተጭነዋል}other{# ቅጥያዎች በአስተዳዳሪዎ ተጭነዋል}}</translation>
@@ -5075,7 +5075,7 @@
<translation id="5553089923092577885">የሰርቲፊኬት መመሪያ ጉድኝቶች</translation>
<translation id="5554240068773209752">መቆጣጠሪያዎችን ለማበጀት እዚህ ጠቅ ያድርጉ</translation>
<translation id="5554403733534868102">ከዚህ በኋላ ዝማኔዎችን መጠበቅ የለም</translation>
-<translation id="5554489410841842733">ቅጥያው በአሁኑ ገጽ ላይ በሚተገበርብት ጊዜ ይህ አዶ የሚታይ ይሆናል።</translation>
+<translation id="5554489410841842733">ቅጥያው በአሁኑ ገፅ ላይ በሚተገበርብት ጊዜ ይህ አዶ የሚታይ ይሆናል።</translation>
<translation id="5554720593229208774">የኢሜይል እውቅና ማረጋገጫ ባለስልጣን</translation>
<translation id="5554866693883022680">ይህንን አገናኝ ለመክፈት በእርስዎ <ph name="DEVICE_TYPE" /> ላይ መተግበሪያ ይምረጡ</translation>
<translation id="5555363196923735206">ካሜራን ይገልብጡ</translation>
@@ -5116,7 +5116,7 @@
<ph name="BEGIN_PARAGRAPH4" />የእርስዎ ተጨማሪ የድር እና መተግበሪያ እንቅስቃሴ ቅንብር በርቶ ከሆነ ይህ ውሂብ ወደ የእርስዎ Google መለያ ሊቀመጥ ይችላል። account.google.com ላይ የእርስዎን ውሂብ መመልከት፣ መሰረዝ እና የመለያ ቅንብሮችዎን መቀየር ይችላሉ።<ph name="END_PARAGRAPH4" /></translation>
<translation id="5585019845078534178">ካርዶች</translation>
<translation id="5585118885427931890">የዕልባት አቃፊ መፍጠር አልተቻለም።</translation>
-<translation id="558563010977877295">የተወሰነ ገጽ ወይም የገጾች ስብስብ ይክፈቱ</translation>
+<translation id="558563010977877295">የተወሰነ ገፅ ወይም የገጾች ስብስብ ይክፈቱ</translation>
<translation id="5585898376467608182">የእርስዎ መሣሪያ ማከማቻው ዝቅተኛ ነው። <ph name="APP_NAME" />ን ለመጠቀም ቢያንስ <ph name="MINIMUM_SPACE" /> ባዶ ቦታ ያስፈልጋል። ባዶ ቦታን ለመጨመር ከመሣሪያው ፋይሎችን ይሰርዙ።</translation>
<translation id="5585912436068747822">ቅርጸት መስራት አልተሳካም</translation>
<translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation>
@@ -5158,7 +5158,7 @@
<translation id="5624120631404540903">የይለፍ ቃሎችን አስተዳድር</translation>
<translation id="5625225435499354052">በGoogle Pay ውስጥ ያርትዑ</translation>
<translation id="5626134646977739690">ስም፦</translation>
-<translation id="5627086634964711283">እንዲሁም የመነሻ አዝራሩን ጠቅ ሲያደርጉት ምን ገጽ እንደሚታይ ይቆጣጠራል።</translation>
+<translation id="5627086634964711283">እንዲሁም የመነሻ አዝራሩን ጠቅ ሲያደርጉት ምን ገፅ እንደሚታይ ይቆጣጠራል።</translation>
<translation id="5627676517703583263">ከChrome ጋር በዘመናዊ መንገድ ያስሱ</translation>
<translation id="5627832140542566187">የማሳያ አቀማመጥ</translation>
<translation id="5628393161682339323">ቅጥያውን ጠቅ ሳደርግ</translation>
@@ -5176,10 +5176,10 @@
<translation id="5636996382092289526"><ph name="NETWORK_ID" />ን ለመጠቀም መጀመሪያ <ph name="LINK_START" />የአውታረ መረቡ መግቢያ ገጹን መጎብኘት<ph name="LINK_END" /> አለብዎት፣ ይህም በጥቂት ሰከንዶች ውስጥ በራስ-ሰር ይከፈታል። ካልሆነ አውታረ መረቡ ስራ ላይ ሊውል አይችልም።</translation>
<translation id="5637476008227280525">የተንቀሳቃሽ ስልክ ውሂብን አንቃ</translation>
<translation id="5638309510554459422">ቅጥያዎችን እና ገጽታዎችን በ<ph name="BEGIN_LINK" />Chrome ድር መደብር<ph name="END_LINK" /> ላይ ያግኙ</translation>
-<translation id="5639549361331209298">ይህን ገጽ ዳግም ይጫኑ፣ ተጨማሪ አማራጮችን ለማየት ይያዙት</translation>
+<translation id="5639549361331209298">ይህን ገፅ ዳግም ይጫኑ፣ ተጨማሪ አማራጮችን ለማየት ይያዙት</translation>
<translation id="5640133431808313291">የደህንነት ቁልፎችን ያቀናብሩ</translation>
<translation id="5641608986289282154"><ph name="DEVICE_OS" />ን መጠቀም ይጀምሩ</translation>
-<translation id="5641648607875312660">የቅጽበታዊ ገጽ እይታ ምስል አርታዒ</translation>
+<translation id="5641648607875312660">የቅጽበታዊ ገፅ እይታ ምስል አርታዒ</translation>
<translation id="5642508497713047">CRL ፈራሚ</translation>
<translation id="5643321261065707929">የሚለካ አውታረ መረብ</translation>
<translation id="5643620609347735571">አጽዳ እና ቀጥል</translation>
@@ -5259,7 +5259,7 @@
<translation id="5723967018671998714">ማንነት በማያሳውቅ ሁነታ ላይ የሦስተኛ ወገን ኩኪዎች ይታገዳሉ</translation>
<translation id="5724642200346111167">ሁሉንም መስኮቶች ሲዘጉ የጣቢያ ውሂብ ከመሣሪያዎ ይጸዳል</translation>
<translation id="5727728807527375859">ቅጥያዎች፣ መተግበሪያዎች እና ገፅታዎች ኮምፒውተርዎን ሊጎዱ ይችላሉ። እርግጠኛ ነዎት መቀጠል ይፈልጋሉ?</translation>
-<translation id="5728450728039149624">የSmart Lock ማያ ገጽ መቆለፊያ አማራጮች</translation>
+<translation id="5728450728039149624">የSmart Lock ማያ ገፅ መቆለፊያ አማራጮች</translation>
<translation id="5729712731028706266">&amp;እይታ</translation>
<translation id="5731247495086897348">ለ&amp;ጥፍና እና ሂድ</translation>
<translation id="5733109311583381874">የልወጣ እጩዎችን ለማበጀት የራስዎን ቃላት ወደ የተጠቃሚ መዝገበ ቃላት ያክሉ።</translation>
@@ -5367,7 +5367,7 @@
<translation id="5828545842856466741">መገለጫ አክል...</translation>
<translation id="5828633471261496623">በማተም ላይ...</translation>
<translation id="5830205393314753525"><ph name="APP_NAME" />ን መክፈት አልተቻለም</translation>
-<translation id="5830720307094128296">ገጽ አስቀምጥ &amp;እንደ…</translation>
+<translation id="5830720307094128296">ገፅ አስቀምጥ &amp;እንደ…</translation>
<translation id="5832813618714645810">መገለጫዎች</translation>
<translation id="583281660410589416">ያልታወቀ </translation>
<translation id="5832970156002835240">በሁሉም ጣቢያዎች ላይ ፍቀድ</translation>
@@ -5480,7 +5480,7 @@
<translation id="5924047253200400718">እገዛን ያግኙ<ph name="SCANNING_STATUS" /></translation>
<translation id="5924527146239595929">አዲስ ፎቶ ያንሱ ወይም አንድ ነባር ፎቶ ወይም አዶ ይምረጡ።
<ph name="LINE_BREAK" />
- ይህ ሥዕል በChromebook መለያ መግቢያ ማያ ገጽ እና ማያ ገጽ ቁልፍ ላይ ይታያል።</translation>
+ ይህ ሥዕል በChromebook መለያ መግቢያ ማያ ገፅ እና ማያ ገፅ ቁልፍ ላይ ይታያል።</translation>
<translation id="5925147183566400388">የዕውቅና ማረጋገጫ ስራ መግለጫ ጠቋሚ</translation>
<translation id="5927232971138258197">ይህ ቅጥያ <ph name="HOST" />ን ማንበብ እና መለወጥ ይችላል</translation>
<translation id="592740088639760830">ይህንን መያዣ ያቁሙ</translation>
@@ -5520,7 +5520,7 @@
<translation id="5955304353782037793">app</translation>
<translation id="5955721306465922729">አንድ ድር ጣቢያ ይህን መተግበሪያ መክፈት ይፈልጋል።</translation>
<translation id="5955809630138889698">ይህ መሣሪያ ምናልባት ለመስመር ላይ የቅንጭብ ማሳያ ሁነታ ብቻ ብቁ ሊሆን ይችላል። ለተጨማሪ ዝርዝሮች እባክዎ የእርስዎን የድጋፍ ተወካይ ያነጋግሩ።</translation>
-<translation id="5956585768868398362">የጠበቁት የፍለጋ ገጽ ይሄ ነው?</translation>
+<translation id="5956585768868398362">የጠበቁት የፍለጋ ገፅ ይሄ ነው?</translation>
<translation id="5957918771633727933">የሚገኙ የኢሲም መገለጫዎች የሉም። አዲስ <ph name="BEGIN_LINK" />መገለጫ<ph name="END_LINK" /> ያውርዱ።</translation>
<translation id="5957987129450536192">ከመገለጫ ምስልዎ አጠገብ ያለውን ለመናገር-ይምረጡ አዶ መታ ያድርጉ፣ ከዚያ መስማት የሚፈልጉትን ነገር ይምረጡ።</translation>
<translation id="5959471481388474538">አውታረ መረብ አይገኝም</translation>
@@ -5528,7 +5528,7 @@
<translation id="5963413905009737549">ክፍል</translation>
<translation id="5963453369025043595"><ph name="NUM_HANDLES" /> (<ph name="NUM_KILOBYTES_LIVE" /> ጫፍ)</translation>
<translation id="5964113968897211042">{COUNT,plural, =0{ሁሉንም በ&amp;አዲስ መስኮት ውስጥ ክፈት}=1{በ&amp;አዲስ መስኮት ውስጥ ክፈት}one{ሁሉንም ({COUNT}) በ&amp;አዲስ መስኮት ውስጥ ክፈት}other{ሁሉንም ({COUNT}) በ&amp;አዲስ መስኮት ውስጥ ክፈት}}</translation>
-<translation id="5965661248935608907">እንዲሁም የመነሻ አዝራሩን ጠቅ ሲያደርጉ ወይም ከኦምኒቦክሱ ሆነው ሲፈልጉ ምን ገጽ እንደሚታይ ይቆጣጠራል።</translation>
+<translation id="5965661248935608907">እንዲሁም የመነሻ አዝራሩን ጠቅ ሲያደርጉ ወይም ከኦምኒቦክሱ ሆነው ሲፈልጉ ምን ገፅ እንደሚታይ ይቆጣጠራል።</translation>
<translation id="5968022600320704045">ምንም የፍለጋ ውጤቶች የሉም</translation>
<translation id="5969364029958154283">ስለ ቅንብሮችን ዳግም ማስጀመር የበለጠ ይወቁ</translation>
<translation id="5969419185858894314"><ph name="ORIGIN" /> በ<ph name="FOLDERNAME" /> ውስጥ ያሉ ፋይሎችን መመልከት ይችላል</translation>
@@ -5590,7 +5590,7 @@
<translation id="6019851026059441029">አሪፍ - ኤችዲ</translation>
<translation id="6020431688553761150">አገልጋይ ይህን መርጃ እንዲደርሱበት አልፈቀደለዎትም።</translation>
<translation id="6021293122504240352">የ<ph name="APPS" /> መተግበሪያዎች ከአሁን በኋላ አይደገፉም</translation>
-<translation id="6022526133015258832">ሙሉ ማያ ገጽ ክፈት</translation>
+<translation id="6022526133015258832">ሙሉ ማያ ገፅ ክፈት</translation>
<translation id="6022659036123304283">Chromeን የራስዎ ያድርጉት</translation>
<translation id="6023643151125006053">ይህ መሣሪያ (SN፦ <ph name="SERIAL_NUMBER" />) በ<ph name="SAML_DOMAIN" /> አስተዳዳሪ ተቆልፎ ነበር።</translation>
<translation id="6025215716629925253">የቁልል መከታተያ</translation>
@@ -5606,7 +5606,7 @@
<translation id="6040143037577758943">ዝጋ</translation>
<translation id="6041046205544295907"><ph name="BEGIN_PARAGRAPH1" />የGoogle አካባቢ አገልግሎት የዚህ መሣሪያ አካባቢ እንዲገምት ለማገዝ እንደ Wi-Fi፣ የተንቀሳቃሽ ስልክ አውታረ መረቦች እና ዳሳሾች ያሉ ምንጮችን ይጠቀማል።<ph name="END_PARAGRAPH1" />
<ph name="BEGIN_PARAGRAPH2" />በዚህ መሣሪያ ላይ ዋናውን የአካባቢ ቅንብርን በማጥፋት አካባቢን ማጥፋት ይችላሉ። እንዲሁም በአካባቢ ቅንብሮች ውስጥ Wi-Fiን፣ የተንቀሳቃሽ ስልክ አውታረ መረቦችን እና ዳሳሾችን መጠቀም ለአካባቢ ማጥፋት ይችላሉ።<ph name="END_PARAGRAPH2" /></translation>
-<translation id="6041155700700864984">ከሙሉ ማያ ገጽ ውጣ</translation>
+<translation id="6041155700700864984">ከሙሉ ማያ ገፅ ውጣ</translation>
<translation id="6042308850641462728">ተጨማሪ</translation>
<translation id="604388835206766544">ውቅረትን መተንተን አልተሳካም</translation>
<translation id="6043994281159824495">አሁን ዘግተህ ውጣ</translation>
@@ -5633,7 +5633,7 @@
<translation id="6061408389284235459">አንድ ማሳወቂያ ወደ <ph name="DEVICE_NAME" /> ተልኳል</translation>
<translation id="6063284707309177505">የQR ኮድ ፍጠር</translation>
<translation id="6063847492705284550"><ph name="BEGIN_BOLD" />ማስታወሻ፦<ph name="END_BOLD" /> ተመሳሳይ ድምፅ ወይም ቀረጻ የ<ph name="SUPERVISED_USER_NAME" />ን የግል ውጤቶች ሊደርስበት ይችል ይሆናል። ባትሪ ለመቆጠብ ይህ መሣሪያ ከኃይል ምንጭ ጋር ሲገናኝ ብቻ «Hey Google» እንዲበራ በ<ph name="SUPERVISED_USER_NAME" />ረዳት ቅንብሮች ውስጥ መምረጥ ይችላሉ።</translation>
-<translation id="6064217302520318294">ማያ ገጽ መቆለፊያ</translation>
+<translation id="6064217302520318294">ማያ ገፅ መቆለፊያ</translation>
<translation id="6065145031947216733">የእርስዎ አሰሳ ይለይ?</translation>
<translation id="6065289257230303064">የሰርቲፊኬት ርዕስ የማውጫ አይነታዎች</translation>
<translation id="6066794465984119824">የምስል ሃሽ አልተዘጋጀም</translation>
@@ -5666,9 +5666,9 @@
<translation id="6085886413119427067">እንዴት ደህንነቱ በተጠበቀ ግንኙነት ላይ ከድር ጣቢያዎች ጋር እንደሚገናኙ ይወስናል</translation>
<translation id="6086004606538989567">ያረጋገጡት መለያ ይህን መሣሪያ የመድረስ ፈቃድ የለውም።</translation>
<translation id="6086846494333236931">በእርስዎ አስተዳዳሪ የተጫነ</translation>
-<translation id="6087746524533454243">የአሳሹን ስለ ገጽ እየፈለጉ ነው? ይጎብኙ</translation>
+<translation id="6087746524533454243">የአሳሹን ስለ ገፅ እየፈለጉ ነው? ይጎብኙ</translation>
<translation id="6087960857463881712">ግሩም ፊት</translation>
-<translation id="608912389580139775">ይህን ገጽ ወደ የንባብ ዝርዝርዎ ለማከል የዕልባት አዶውን ጠቅ ያድርጉ</translation>
+<translation id="608912389580139775">ይህን ገፅ ወደ የንባብ ዝርዝርዎ ለማከል የዕልባት አዶውን ጠቅ ያድርጉ</translation>
<translation id="6090760257419195752">የተሰናበቱ ማስጠንቀቂያዎች</translation>
<translation id="6091761513005122595">አጋራ በተሳካ ሁኔታ ተፈናጥጧል።</translation>
<translation id="6093803049406781019">መገለጫን አጥፋ</translation>
@@ -5697,7 +5697,7 @@
<translation id="6113942107547980621">Smart Lockን ለመጠቀም፣ በእርስው ስልክ ላይ ወደ ተቀዳሚ የተጠቃሚ መገለጫ ይቀይሩ</translation>
<translation id="6116921718742659598">የቋንቋ እና ግቤት ቅንብሮችን ይቀይሩ</translation>
<translation id="6119927814891883061">መሳሪያን ወደ <ph name="DEVICE_NAME" /> ይሰይሙ</translation>
-<translation id="6120205520491252677">ይህን ገጽ የመነሻ ገጹ ላይ ይሰኩት...</translation>
+<translation id="6120205520491252677">ይህን ገፅ የመነሻ ገጹ ላይ ይሰኩት...</translation>
<translation id="6120707837086723438">በቅርብ ጊዜ የምግብ አሰራር ፍለጋ እንቅስቃሴዎ ላይ በመመስረት የተጠቆሙ የምግብ አሰራሮችን እየተመለከቱ ነው።
<ph name="BREAK" />
<ph name="BREAK" />
@@ -5777,7 +5777,7 @@
<translation id="6195693561221576702">ይህ መሣሪያ በመስመር ውጭ የቅንጭብ ማሳያ ሁነታ ላይ ሊቀናበር አይችልም።</translation>
<translation id="6196640612572343990">የሦስተኛ ወገን ኩኪዎችን አግድ</translation>
<translation id="6196854373336333322">ይህ «<ph name="EXTENSION_NAME" />» ቅጥያ የተኪ ቅንብሮችዎን ተቆጣጥሯል፣ ይሄ ማለት መስመር ላይ የሚያደርጉት ማንኛውም ነገር ሊቀይር፣ ሊሰብር ወይም በድብቅ ሊከታተል ይችላል። ይሄ ለውጥ ለምን እንደተከሰተ እርግጠኛ ካልሆኑ የማይፈልጉት ነገር ሳይሆን አይቀርም።</translation>
-<translation id="6197128521826316819">ለዚህ ገጽ የQR ኮድ ፍጠር</translation>
+<translation id="6197128521826316819">ለዚህ ገፅ የQR ኮድ ፍጠር</translation>
<translation id="6198252989419008588">ፒን ይቀይሩ</translation>
<translation id="6200047250927636406">ፋይልን አስወግድ</translation>
<translation id="6200151268994853226">ቅጥያ አቀናብር</translation>
@@ -5825,7 +5825,7 @@
<translation id="6237474966939441970">የስታይለስ ማስታወሻ መጻፊያ መተግበሪያ</translation>
<translation id="623755660902014047">የንባብ ሁነታ</translation>
<translation id="6238767809035845642">ከሌላ መሣሪያ የተጋራ ጽሁፍ</translation>
-<translation id="6238923052227198598">በማያ ገጽ መቆለፊያ ላይ የቅርብ ጊዜውን ማስታወሻ አቆይ</translation>
+<translation id="6238923052227198598">በማያ ገፅ መቆለፊያ ላይ የቅርብ ጊዜውን ማስታወሻ አቆይ</translation>
<translation id="6239558157302047471">&amp;ክፈፍን ዳግም ጫን</translation>
<translation id="6240821072888636753">ሁልጊዜ ጠይቅ</translation>
<translation id="6241530762627360640">ከስርዓትዎ ጋር ስለተጣመሩ የብሉቱዝ መሣሪያዎች ያለ መረጃ ይደርሳልና አቅራቢያ ያሉ የብሉቱዝ መሣሪያዎችን ያገኛል።</translation>
@@ -5843,7 +5843,7 @@
<translation id="624789221780392884">ማዘመኛ ዝግጁ ነው</translation>
<translation id="6248988683584659830">የፍለጋ ቅንብሮች </translation>
<translation id="6249200942125593849">A11yን አቀናብር</translation>
-<translation id="6250186368828697007">የእርስዎን ማያ ገጽ በሚያጋሩበት ጊዜ ዝርዝሮች ይደበቃሉ</translation>
+<translation id="6250186368828697007">የእርስዎን ማያ ገፅ በሚያጋሩበት ጊዜ ዝርዝሮች ይደበቃሉ</translation>
<translation id="6251870443722440887">የGDI መያዣዎች</translation>
<translation id="625369703868467034">የአውታረ መረብ ጤና</translation>
<translation id="6253801023880399036">የይለፍ ቃላት በ<ph name="GOOGLE_PASSWORD_MANAGER" /> ላይ ተቀምጠዋል።</translation>
@@ -5863,10 +5863,10 @@
<translation id="6270770586500173387"><ph name="BEGIN_LINK1" />የስርዓት እና መተግበሪያ መረጃ<ph name="END_LINK1" />፣ እና <ph name="BEGIN_LINK2" />መለኪያዎች<ph name="END_LINK2" />ን ላክ</translation>
<translation id="6271348838875430303">እርማት ተቀልብሷል</translation>
<translation id="6273677812470008672">ጥራት</translation>
-<translation id="6274202259872570803">ማያ ገጽ መቅርጽ</translation>
+<translation id="6274202259872570803">ማያ ገፅ መቅርጽ</translation>
<translation id="6276210637549544171">ተኪ <ph name="PROXY_SERVER" /> የተጠቃሚ ስም እና የይለፍ ቃል ያስፈልገዋል።</translation>
<translation id="6277105963844135994">የአውታረ መረብ ጊዜ ማብቂያ</translation>
-<translation id="6277518330158259200">ቅጽበታዊ ገጽ እይታ ፎቶ አን&amp;ሳ</translation>
+<translation id="6277518330158259200">ቅጽበታዊ ገፅ እይታ ፎቶ አን&amp;ሳ</translation>
<translation id="6278428485366576908">ገጽታ</translation>
<translation id="6278776436938569440">አካባቢ ይቀይሩ</translation>
<translation id="6279183038361895380">የእርስዎን ጠቋሚ ለማሳየት |<ph name="ACCELERATOR" />| ይጫኑ</translation>
@@ -5956,7 +5956,7 @@
<translation id="6363990818884053551">ማስመርን ለመጀመር እርስዎ መሆንዎን ያረጋግጡ</translation>
<translation id="6365069501305898914">Facebook</translation>
<translation id="6365411474437319296">ቤተሰብ እና ጓደኛዎች ያክሉ</translation>
-<translation id="6367097275976877956">የChromeOS አብሮገነብ የማያ ገጽ አንባቢ የሆነውን ChromeVox ማግበር ይፈልጋሉ? የሚፈልጉ ከሆነ የክፍተት አሞሌን ይጫኑ።</translation>
+<translation id="6367097275976877956">የChromeOS አብሮገነብ የማያ ገፅ አንባቢ የሆነውን ChromeVox ማግበር ይፈልጋሉ? የሚፈልጉ ከሆነ የክፍተት አሞሌን ይጫኑ።</translation>
<translation id="6367985768157257101">በአቅራቢያ አጋራ ይቀበሉ?</translation>
<translation id="6368276408895187373">ነቅቷል – <ph name="VARIATION_NAME" /></translation>
<translation id="636850387210749493">የድርጅት ምዝገባ</translation>
@@ -6029,7 +6029,7 @@
<translation id="6434309073475700221">ጣለው</translation>
<translation id="6434325376267409267">እርስዎ <ph name="APP_NAME" />ን መጠቀም ከመቻልዎ በፊት የእርስዎ መሣሪያ መዘመን አለበት።</translation>
<translation id="6436164536244065364">በድር መደብር ውስጥ ይመልከቱ</translation>
-<translation id="6436610005579237680">ለእርስዎ ይበልጥ የተበጁ ምላሾችን ለማግኘት ጥያቄዎችን ሲጠይቁ የGoogle ረዳት በማያ ገጽዎ ላይ ያለውን ቅጽበታዊ ገጽ እይታ እንዲደርስ ይፍቀዱለት። የእርስዎ ረዳት እንዲሁም በመጫወት ላይ ያሉ የዘፈኖች ወይም የቪዲዮዎች መረጃን ሊጠቀም ይችላል።</translation>
+<translation id="6436610005579237680">ለእርስዎ ይበልጥ የተበጁ ምላሾችን ለማግኘት ጥያቄዎችን ሲጠይቁ የGoogle ረዳት በማያ ገፅዎ ላይ ያለውን ቅጽበታዊ ገፅ እይታ እንዲደርስ ይፍቀዱለት። የእርስዎ ረዳት እንዲሁም በመጫወት ላይ ያሉ የዘፈኖች ወይም የቪዲዮዎች መረጃን ሊጠቀም ይችላል።</translation>
<translation id="6436778875248895551">«<ph name="EXTENSION_NAME" />» ቅጥያ በአስተዳዳሪዎ ታግዷል</translation>
<translation id="6438234780621650381">ቅንብሮችን ዳግም አስጀምር</translation>
<translation id="6438475350605608554">አስቀድመው የይለፍ ቃላትዎን በሌላ ትር ውስጥ እያስመጡ ነው</translation>
@@ -6044,14 +6044,14 @@
<translation id="6446213738085045933">የዴስክቶፕ አቋራጭ ፍጠር</translation>
<translation id="6447842834002726250">ኩኪዎች</translation>
<translation id="6450876761651513209">ከግላዊነት ጋር የሚዛመዱ ቅንብሮችዎን ይቀይራል</translation>
-<translation id="6451344358166983408">ጣቢያ ወይም ገጽ</translation>
+<translation id="6451344358166983408">ጣቢያ ወይም ገፅ</translation>
<translation id="6451591602925140504">{NUM_PAGES,plural, =0{<ph name="PAGE_TITLE" />}=1{<ph name="PAGE_TITLE" /> እና 1 ሌላ ትር}one{<ph name="PAGE_TITLE" /> እና # ሌሎች ትሮች}other{<ph name="PAGE_TITLE" /> እና # ሌሎች ትሮች}}</translation>
<translation id="6451689256222386810">የእርስዎን የይለፍ ሐረግ ከረሱት ወይም ይህን ቅንብር መለወጥ ከፈለጉ <ph name="BEGIN_LINK" />ስምረትን ዳግም ያስጀምሩ<ph name="END_LINK" /></translation>
<translation id="6452181791372256707">አይቀበሉ</translation>
<translation id="6452251728599530347"><ph name="PERCENT" /> ተጠናቅቋል።</translation>
<translation id="645286928527869380">የምግብ አዘገጃጀት ሐሳቦች</translation>
<translation id="6452961788130242735">የአውታረ መረብ ችግር ወይም መጥፎ ይዞታ</translation>
-<translation id="6453191633103419909">የትር/ማያ ገጽ የማሳየት ጥራት</translation>
+<translation id="6453191633103419909">የትር/ማያ ገፅ የማሳየት ጥራት</translation>
<translation id="6453921811609336127">ወደ ቀጣዩ የግቤት ስልት ለመቀየር <ph name="BEGIN_SHORTCUT" /><ph name="BEGIN_CTRL" />Ctrl<ph name="END_CTRL" /><ph name="SEPARATOR1" /><ph name="BEGIN_SHIFT" />ቀያይር<ph name="END_SHIFT" /><ph name="SEPARATOR2" /><ph name="BEGIN_SPACE" />ክፍተት<ph name="END_SPACE" /><ph name="END_SHORTCUT" /> ይጫኑ</translation>
<translation id="6455264371803474013">በተወሰኑ ጣቢያዎች ላይ</translation>
<translation id="6455894534188563617">&amp;አዲስ አቃፊ</translation>
@@ -6083,7 +6083,7 @@
<translation id="6477822444490674459">የማሳወቂያ ስምረት በሥራ መገለጫ ውስጥ ላሉ ስልኮች አይደገፍም። <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation>
<translation id="6478248366783946499">አደገኛ ፋይል ይቀመጥ?</translation>
<translation id="6480327114083866287">በ<ph name="MANAGER" /> የሚተዳደር</translation>
-<translation id="6482559668224714696">የሙሉ ማያ ገጽ ማጉያ</translation>
+<translation id="6482559668224714696">የሙሉ ማያ ገፅ ማጉያ</translation>
<translation id="6483485061007832714">ውርድን ይክፈቱ</translation>
<translation id="6483805311199035658"><ph name="FILE" /> በመክፈት ላይ…</translation>
<translation id="6486301003991593638">የይለፍ ቁልፎችን ለማስተዳደር አዲስ የሆነ የWindows ስሪትን ይጠቀሙ</translation>
@@ -6113,8 +6113,8 @@
<translation id="6512808201725371249">ለዚህ መለያ አንድ የይለፍ ቃል አስቀድሞ ወደ Google የይለፍ ቃል አስተዳዳሪዎ (<ph name="USER_EMAIL" />) ላይ ተቀምጧል</translation>
<translation id="6513247462497316522">ከሌላ አውታረ መረብ ጋር ካልተገናኙ Google Chrome የተንቀሳቃሽ ውሂብን ይጠቀማል።</translation>
<translation id="6514010653036109809">የሚገኝ መሣሪያ፦</translation>
-<translation id="6514565641373682518">ይህ ገጽ የመዳፊት ጠቋሚዎን አሰናክሏል።</translation>
-<translation id="6517709704288360414">መሣሪያዎ ከአንግዲህ በትክክል ላይሰራ ይችላል፣ እና የደህንነት እና የአፈጻጸም ችግሮች ሊያጋጥሙዎት ይችላሉ። ዝማኔዎችን ማጥፋት ምንም አይነት ችግሮች ካጋጠሙዎት ሕጋዊ የይገባኛል ጥያቄዎች በማቅረብ መብትዎ ላይ ተጽዕኖ ሊያሳርፍ ይችላል።</translation>
+<translation id="6514565641373682518">ይህ ገፅ የመዳፊት ጠቋሚዎን አሰናክሏል።</translation>
+<translation id="6517709704288360414">መሣሪያዎ ከአንግዲህ በትክክል ላይሰራ ይችላል፣ እና የደህንነት እና የአፈጻጸም ችግሮች ሊያጋጥሙዎት ይችላሉ። ዝማኔዎችን ማጥፋት ምንም ዓይነት ችግሮች ካጋጠሙዎት ሕጋዊ የይገባኛል ጥያቄዎች በማቅረብ መብትዎ ላይ ተጽዕኖ ሊያሳርፍ ይችላል።</translation>
<translation id="6518014396551869914">ምስል ቅ&amp;ዳ</translation>
<translation id="6518133107902771759">አረጋግጥ</translation>
<translation id="651942933739530207"><ph name="APP_NAME" /> ማያ ገጽዎን እና የድምፅ ውፅዓትዎን እንዲጋራ ይፈልጋሉ?</translation>
@@ -6140,7 +6140,7 @@
<translation id="6532527800157340614">የእርስዎ የመዳረሻ ማስመሰያ ተሰርስሮ ሊወጣ አልቻለም። እባክዎ የአውታረ መረብ ግንኙነትዎን ይፈትሹትና እንደገና ይሞክሩ።</translation>
<translation id="6532663472409656417">በድርጅት ተመዝግቧል</translation>
<translation id="6533315466883598769">Google ትርጉምን ይጠቀሙ</translation>
-<translation id="6535331821390304775"><ph name="ORIGIN" /> የዚህ አይነት አገናኞችን በተጓዳኙ መተግበሪያ ውስጥ እንዲከፍት ሁልጊዜ ፍቀድ</translation>
+<translation id="6535331821390304775"><ph name="ORIGIN" /> የዚህ ዓይነት አገናኞችን በተጓዳኙ መተግበሪያ ውስጥ እንዲከፍት ሁልጊዜ ፍቀድ</translation>
<translation id="653659894138286600">ሰነዶችን እና ምስሎችን ይቃኙ</translation>
<translation id="6537613839935722475">ስም ፊደላትን፣ ቁጥሮችን እና ሰረዝን (-) መጠቀም ይችላል</translation>
<translation id="6538098297809675636">ኮድን ፈልጎ በማግኘት ላይ ስህተት</translation>
@@ -6183,7 +6183,7 @@
<translation id="657229725818377235">ከአደገኛ ድር ጣቢያዎች እና ውርዶች ተጨማሪ ጥብቃን ያግኙ</translation>
<translation id="6573096386450695060">ሁልጊዜ ፍቀድ</translation>
<translation id="6573497332121198392">አቋራጭን ማስወገድ አልተቻለም</translation>
-<translation id="657402800789773160">ይህን ገጽ &amp;ዳግም ጫን</translation>
+<translation id="657402800789773160">ይህን ገፅ &amp;ዳግም ጫን</translation>
<translation id="6577284282025554716">ማውረድ ተሰርዟል፦ <ph name="FILE_NAME" /></translation>
<translation id="657866106756413002">አውታረ መረብ የጤና ቅጽበተ-ፎቶ</translation>
<translation id="6579369886355986318">ሁሉንም &amp;መቆጣጠሪያዎች አሳይ</translation>
@@ -6225,7 +6225,7 @@
<translation id="6602956230557165253">ለማሰስ የግራ እና ቀኝ የቀስት ቁልፎችን ይጠቀሙ።</translation>
<translation id="6603185457265641428">ታሪክ ማስመር እንዳለብዎት ይምረጡ</translation>
<translation id="6605847144724004692">እስካሁን በምንም ተጠቃሚዎች ደረጃ አልተሰጠውም።</translation>
-<translation id="6606671997164410857">በሌላ መሣሪያ ላይ የGoogle ረዳትን አስቀድመው ያቀናብሩ ይመስላል። በዚህ መሣሪያ ላይ የማያ ገጽ ሁኔታን በማብራት ከእርስዎ ረዳት የበለጠ ያግኙ።</translation>
+<translation id="6606671997164410857">በሌላ መሣሪያ ላይ የGoogle ረዳትን አስቀድመው ያቀናብሩ ይመስላል። በዚህ መሣሪያ ላይ የማያ ገፅ ሁኔታን በማብራት ከእርስዎ ረዳት የበለጠ ያግኙ።</translation>
<translation id="6607831829715835317">&amp;ተጨማሪ መሣሪያዎች</translation>
<translation id="6607890859198268021"><ph name="USER_EMAIL" /> አስቀድሞ በ<ph name="DOMAIN" /> የሚተዳደር ነው በተለየ የGoogle መለያ የወላጅ መቆጣጠሪያዎችን ለመጠቀም ከቅንብር በኋላ ዘግተው ይውጡ፣ ከዚያ በመለያ መግቢያ ገጹ ላይ «ሰው አክል» የሚለውን ይምረጡ።</translation>
<translation id="6608166463665411119">ኢሲምን ዳግም አስጀምር</translation>
@@ -6279,7 +6279,7 @@
<translation id="6655190889273724601">የገንቢ ሁነት</translation>
<translation id="6655458902729017087">መለያዎችን ደብቅ</translation>
<translation id="6657585470893396449">የይለፍ ቃል</translation>
-<translation id="6659213950629089752">ይህ ገጽ በ«<ph name="NAME" />» ቅጥያው ነው የጎላው</translation>
+<translation id="6659213950629089752">ይህ ገፅ በ«<ph name="NAME" />» ቅጥያው ነው የጎላው</translation>
<translation id="6659594942844771486">ትር</translation>
<translation id="6660819301598582123">The quick brown fox jumps over the lazy dog</translation>
<translation id="666099631117081440">የአትም አገልጋዮች</translation>
@@ -6311,15 +6311,15 @@
<translation id="6686665106869989887">ትር ወደ ቀኝ ተወስዷል</translation>
<translation id="6686817083349815241">የይለፍ ቃልዎን ያስቀምጡ</translation>
<translation id="6687079240787935001"><ph name="MODULE_TITLE" /> ደብቅ</translation>
-<translation id="6689714331348768690"><ph name="SUPERVISED_USER_NAME" /> ወደ ኮምፒዩተሩ እንዲመጡ ይጠይቁ። የልጅዎን የድምጽ ሞዴል ለመፍጠር ልጅዎ በዚህ ማያ ገጽ ላይ ጥቂት ሐረጎችን ያነብባሉ።
+<translation id="6689714331348768690"><ph name="SUPERVISED_USER_NAME" /> ወደ ኮምፒዩተሩ እንዲመጡ ይጠይቁ። የልጅዎን የድምጽ ሞዴል ለመፍጠር ልጅዎ በዚህ ማያ ገፅ ላይ ጥቂት ሐረጎችን ያነብባሉ።
<ph name="BR" />
<ph name="SUPERVISED_USER_NAME" /> በንባብ ላይ እገዛ ከፈለጉ ልጅዎ ከእርስዎ በኋላ እንዲደግሙት ያድርጉ። ረዳቱ ከእርስዎ ይልቅ የልጅዎን ድምፅ እንዲማር ከማይክሮፎኑ ራቅ ብለው ያንሾካሹኩ።</translation>
<translation id="6690659332373509948">ይህን ፋይል መተንተን አልተቻለም፦ <ph name="FILE_NAME" /></translation>
<translation id="6691541770654083180">ምድር</translation>
<translation id="6691936601825168937">&amp;ወደ ፊት</translation>
-<translation id="6693745645188488741">{COUNT,plural, =1{1 ገጽ}one{{COUNT} ገጾች}other{{COUNT} ገጾች}}</translation>
+<translation id="6693745645188488741">{COUNT,plural, =1{1 ገፅ}one{{COUNT} ገጾች}other{{COUNT} ገጾች}}</translation>
<translation id="6697172646384837537">የእርስዎ የይለፍ ቃላት ወዴት እንደሚመጡ ይምረጡ</translation>
-<translation id="6697492270171225480">አንድ ገጽ ሊገኝ ካልቻለ የተመሳሳይ ገጾች የአስተያየት ጥቆማዎችን አሳይ</translation>
+<translation id="6697492270171225480">አንድ ገፅ ሊገኝ ካልቻለ የተመሳሳይ ገጾች የአስተያየት ጥቆማዎችን አሳይ</translation>
<translation id="6697690052557311665">ለማጋራት በፋይሎች መተግበሪያው ውስጥ አንድ አቃፊን በቀኝ ጠቅ ያድርጉ፣ ከዚያ «ለLinux አጋራ»ን ይምረጡ።</translation>
<translation id="6698810901424468597">ውሂብዎን በ<ph name="WEBSITE_1" /> እና <ph name="WEBSITE_2" /> ላይ ያነብባል እና ይቀይራል</translation>
<translation id="6700093763382332031">የተንቀሳቃሽ ስልክ ሲም ቁልፍ</translation>
@@ -6343,7 +6343,7 @@
<translation id="6715803357256707211">የእርስዎን የLinux መተግበሪያ መጫን ወቅት ስህተት አጋጥሟል። ለዝርዝሮች ማሳወቂያ ላይ ጠቅ ያድርጉ።</translation>
<translation id="671619610707606484">ይህ በጣቢያዎች የተከማቸ <ph name="TOTAL_USAGE" /> ውሂብን ያጠፋል</translation>
<translation id="6716798148881908873">የአውታረ መረብ ግንኙነት ጠፍቷል። የአውታረ መረብ ግንኙነትዎን ይፈትሹት ወይም ሌላ የWi-Fi አውታረ መረብ ይሞክሩ።</translation>
-<translation id="671928215901716392">ማያ ገጽ ይቆልፉ</translation>
+<translation id="671928215901716392">ማያ ገፅ ይቆልፉ</translation>
<translation id="6721744718589119342">ለተጨማሪ መረጃ ወይም ዝማኔዎች በኢሜይል ልንልክልዎ እንችላለን</translation>
<translation id="6721972322305477112">&amp;ፋይል</translation>
<translation id="672208878794563299">ይህ ጣቢያ በሚቀጥለው ጊዜ እንደገና ይጠይቃል።</translation>
@@ -6400,7 +6400,7 @@
<translation id="6776589734354015877">ተጨማሪ ባህሪያትን ያገኙ</translation>
<translation id="6776729248872343918">ፈጣን ጥምረትን ያንቁ</translation>
<translation id="6777817260680419853">አቅጣጫ ማዞር ታግዷል</translation>
-<translation id="6779092717724412415">እንደዚህ አይነት ድምቀት ለመፍጠር ማንኛውንም ጽሁፍ ይምረጡ እና የቀኝ-ጠቅ ያድርጉ።</translation>
+<translation id="6779092717724412415">እንደዚህ ዓይነት ድምቀት ለመፍጠር ማንኛውንም ጽሁፍ ይምረጡ እና የቀኝ-ጠቅ ያድርጉ።</translation>
<translation id="6779447100905857289">የእርስዎ ተሳቢዎች</translation>
<translation id="677965093459947883">በጣም ትንሽ</translation>
<translation id="6781005693196527806">&amp;የፍለጋ ፕሮግራሞችን ያስተዳድሩ...</translation>
@@ -6418,7 +6418,7 @@
<translation id="6787839852456839824">የቁልፍ ሰሌዳ አቋራጮች</translation>
<translation id="6788210894632713004">ያልተጠቃለለ ቅጥያ</translation>
<translation id="6789592661892473991">አግድም ክፈል</translation>
-<translation id="6789834167207639931">መልሶ ማግኘትን ለማጠናቀቅ በቀጣዩ ማያ ገጽ ላይ የGoogle መለያ የይለፍ ቃልዎን እንደገና ያስገቡ</translation>
+<translation id="6789834167207639931">መልሶ ማግኘትን ለማጠናቀቅ በቀጣዩ ማያ ገፅ ላይ የGoogle መለያ የይለፍ ቃልዎን እንደገና ያስገቡ</translation>
<translation id="6790428901817661496">አጫውት</translation>
<translation id="6790497603648687708"><ph name="EXTENSION_NAME" /> በርቀት ታክሏል</translation>
<translation id="6790820461102226165">ሰው አክል...</translation>
@@ -6452,12 +6452,12 @@
<ph name="FOOTER_MESSAGE" /></translation>
<translation id="6810613314571580006">የተከማቹ ምስክርነቶችን በመጠቀም በራስ-ሰር ወደ ድር ጣቢያዎች ይግቡ። ባህሪው ሲሰናከል ወደ አንድ ድር ጣቢያ ከመግባትዎ በፊት ሁልጊዜ ማረጋገጫ እንዲሰጡ ይጠየቃሉ።</translation>
<translation id="6810768462515084623">ውይ! የይለፍ ቃዎ ጊዜው ያለፈበት ይመስላል። እባክዎ በሌላ መሣሪያ ላይ ያድሱትና እንደገና ይሞክሩ።</translation>
-<translation id="6811034713472274749">ገጽ ለመመልከት ዝግጁ ነው</translation>
+<translation id="6811034713472274749">ገፅ ለመመልከት ዝግጁ ነው</translation>
<translation id="6811151703183939603">ጥንካሬ</translation>
<translation id="6811332638216701903">የዲኤችሲፒ አስተናጋጅ ስም</translation>
<translation id="6812349420832218321"><ph name="PRODUCT_NAME" /> እንደ ስር ሊሄድ አይችልም።</translation>
<translation id="6812841287760418429">ለውጦችን አስቀምጥ</translation>
-<translation id="6813907279658683733">መላው ማያ ገጽ</translation>
+<translation id="6813907279658683733">መላው ማያ ገፅ</translation>
<translation id="6815376457351236663">ለማንኛውም ክፈት</translation>
<translation id="6817174620439930047">አንድ ጣቢያ የMIDI መሣሪያዎችን ለመድረስ ለሚመለከተው ሥርዓት ብቻ የተወሰኑ መልእክቶችን ለመጠቀም ሲፈልግ ጠይቅ (የሚመከር)</translation>
<translation id="6818198425579322765">የሚተረጎመው የገጽ ቋንቋ</translation>
@@ -6523,9 +6523,9 @@
<translation id="6863496016067551393">ሁሉም ቅጥያዎች ተፈቅደዋል</translation>
<translation id="686366188661646310">የይለፍ ቃል ይሰረዝ?</translation>
<translation id="6865313869410766144">የራስ-ሙላ ቅጽ ውሂብ</translation>
-<translation id="6865598234501509159">ገጽ በ<ph name="LANGUAGE" /> አይደለም</translation>
+<translation id="6865598234501509159">ገፅ በ<ph name="LANGUAGE" /> አይደለም</translation>
<translation id="6865708901122695652">የWebRTC ክስተት ምዝግብ ማስታወሻዎች (<ph name="WEBRTC_EVENT_LOG_COUNT" />)</translation>
-<translation id="686609795364435700">ጸጥታ</translation>
+<translation id="686609795364435700">ፀጥታ</translation>
<translation id="686664946474413495">የቀለም ሙቀት መጠን</translation>
<translation id="6867086642466184030">ሌሎች መተግበሪያዎች ከ<ph name="APP_NAME" /> ጋር ተመሳሳይ የሆኑ አገናኞችን ለመክፈት ተቀናብረዋል። ይህ <ph name="APP_NAME_2" />፣ <ph name="APP_NAME_3" />፣ <ph name="APP_NAME_4" /> እና <ph name="NUMBER_OF_OTHER_APPS" /> ሌሎች መተግበሪያዎች የሚደገፉ አገናኞችን እንዳይከፍቱ ያሰናክላቸዋል።</translation>
<translation id="6867400383614725881">አዲስ ማንነት የማያሳውቅ ትር</translation>
@@ -6536,7 +6536,7 @@
<translation id="6876155724392614295">ቢስክሌት</translation>
<translation id="6876469544038980967">አጋዥ አይደለም</translation>
<translation id="6878422606530379992">ዳሳሾች ተፈቅደዋል</translation>
-<translation id="6880587130513028875">በዚህ ገጽ ላይ ምስሎች ታግደዋል።</translation>
+<translation id="6880587130513028875">በዚህ ገፅ ላይ ምስሎች ታግደዋል።</translation>
<translation id="688312408602122936">በSteam በኩል የተጫኑ ማናቸውምም ጨዋታዎች እና መተግበሪያዎች እንዲሁም ከዚህ መሣሪያ ይወገዳሉ።</translation>
<translation id="6883319974225028188">ውይ! ሥርዓቱ የመሣሪያ ውቅረቱን ማስቀመጥ አልቻለም።</translation>
<translation id="6884474387073389421">እርግጠኛ ነዎት የተመረጠውን የመለያ መግቢያ ውሂብ መሰረዝ ይፈልጋሉ?</translation>
@@ -6604,7 +6604,7 @@
<translation id="6943939122536910181">ከ<ph name="DEVICE" /> ጋር ያለው ግንኙነት ተቋርጧል</translation>
<translation id="6944708469742828051">ይህ የይለፍ ቁልፍ Windows Hello ውስጥ ብቻ ይቀመጣል</translation>
<translation id="6945221475159498467">ይምረጡ</translation>
-<translation id="694592694773692225">በዚህ ገጽ ላይ አቅጣጫ ማዞር ታግዷል።</translation>
+<translation id="694592694773692225">በዚህ ገፅ ላይ አቅጣጫ ማዞር ታግዷል።</translation>
<translation id="6947015141909171112">በቅርብ ጊዜ የምግብ አሰራሮች ፍለጋ እንቅስቃሴዎ ላይ የተመሰረቱ የምግብ አሰራሮችን እየተመለከቱ ነው።
<ph name="BREAK" />
<ph name="BREAK" />
@@ -6633,10 +6633,10 @@
<translation id="6966370001499648704">የትኛዎቹን ስልኮች እንደ የደህንነት ቁልፎች እንደሚጠቀሙ ይቆጣጠሩ</translation>
<translation id="6967430741871315905">መሣሪያው ይፈቀድ እንደሆነ ማረጋገጥ አልተቻለም</translation>
<translation id="696780070563539690">ጣቢያዎች በተለያዩ ጣቢያዎች ላይ ለምሳሌ ማስታወቂያዎችን ግላዊነት ለማላበስ የእርስዎን የአሰሳ እንቅስቃሴ ለመመልከት ኩኪዎችን መጠቀም አይችሉም</translation>
-<translation id="6968288415730398122">ማያ ገጽ መቆለፊያን ለማዋቀር የይለፍ ቃልዎን ያስገቡ</translation>
+<translation id="6968288415730398122">ማያ ገፅ መቆለፊያን ለማዋቀር የይለፍ ቃልዎን ያስገቡ</translation>
<translation id="6969047215179982698">የአቅራቢያ አጋራን ያጥፉ</translation>
<translation id="6969216690072714773">ከዚህ መሣሪያ ጋር የሚገናኘውን መረጃ አዲሱን ያስገቡ ወይም ነባሩን ያዘምኑ።</translation>
-<translation id="6970480684834282392">የጀማሪ አይነት</translation>
+<translation id="6970480684834282392">የጀማሪ ዓይነት</translation>
<translation id="6970543303783413625">የይለፍ ቃላትን ማምጣት አልተቻለም። በአንድ ጊዜ ማስመጣት የሚችሉት እስከ <ph name="COUNT" /> የይለፍ ቃላት ድረስ ብቻ ነው።</translation>
<translation id="6970856801391541997">የተወሰኑ ገጾችን አትም</translation>
<translation id="6970861306198150268">ለዚህ ጣቢያ የአሁኑን የይለፍ ቃልዎን ማስቀመጥዎን ያረጋግጡ</translation>
@@ -6705,12 +6705,12 @@
<translation id="7014961128696979283">Steamን አስጀምር</translation>
<translation id="7015088858756332848">Chromebook ላይ Steamን ማስጀመር አልተቻለም። እባክዎ እንደገና ይሞክሩ</translation>
<translation id="7017004637493394352">እንደገና «Ok Google» ይበሉ</translation>
-<translation id="7017219178341817193">አዲስ ገጽ ያክሉ</translation>
+<translation id="7017219178341817193">አዲስ ገፅ ያክሉ</translation>
<translation id="7017354871202642555">መስኮት ከተዋቀረ በኋላ ሁነታውን ማስቀመጥ አልተቻለም።</translation>
<translation id="7018275672629230621">የአሰሳ ታሪክዎን ያነብባል እና ይቀይራል</translation>
<translation id="7019546817926942979">መሣሪያዎ መሰካት አለበት። Linuxን ደረጃ ማሻሻል የእርስዎን ባትሪ በጉልህ በሚባል ደረጃ ያንጠፈጥፈዋል። የእርስዎን መሣሪያ ወደ ኃይል መሙያ ያገናኙ እና እንደገና ይሞክሩ።</translation>
<translation id="7019805045859631636">ፈጣን</translation>
-<translation id="7022562585984256452">የእርስዎ መነሻ ገጽ ተዋቅሯል።</translation>
+<translation id="7022562585984256452">የእርስዎ መነሻ ገፅ ተዋቅሯል።</translation>
<translation id="7025082428878635038">በእጅ ምልክቶች የሚታሰስበት አዲስ መንገድ</translation>
<translation id="7025190659207909717">የተንቀሳቃሽ ስልክ ውሂብ አገልግሎት ማቀናበር</translation>
<translation id="7025895441903756761">ደህንነት እና ግላዊነት</translation>
@@ -6761,7 +6761,7 @@
<translation id="706626672220389329">ማጋራትን ማፈናጠጥ ላይ ስህተት። የተገለጸው ማጋራት አስቀድሞ ተፈናጥጧል።</translation>
<translation id="7067396782363924830">ድባባዊ ቀለማት</translation>
<translation id="7067725467529581407">ይህን ዳግም አታሳይ።</translation>
-<translation id="7069811530847688087"><ph name="WEBSITE" /> ይበልጥ አዲስ ወይም የተለየ አይነት ደህንነት ቁልፍ ሊያስፈልገው ይችላል።</translation>
+<translation id="7069811530847688087"><ph name="WEBSITE" /> ይበልጥ አዲስ ወይም የተለየ ዓይነት ደህንነት ቁልፍ ሊያስፈልገው ይችላል።</translation>
<translation id="7070484045139057854">ይህ የጣቢያ ውሂብን ማንበብ እና መቀየር ይችላል</translation>
<translation id="7072010813301522126">አቋራጭ ስም</translation>
<translation id="7074066049407662839">የይለፍ ቃላትን ለማስቀመጥ ይግቡ</translation>
@@ -6806,7 +6806,7 @@
<translation id="7115361495406486998">ሊደረስባቸው የሚችሉ እውቂያዎች የሉም</translation>
<translation id="7117228822971127758">እባክዎ ቆይተው እንደገና ይሞክሩ</translation>
<translation id="711840821796638741">የሚቀናበሩ ዕልባቶችን አሳይ</translation>
-<translation id="711985611146095797">ይህ ገጽ በመለያ የገቡትን የGoogle መለያዎችዎን እንዲያስተዳድሩ ያስችልዎታል። <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation>
+<translation id="711985611146095797">ይህ ገፅ በመለያ የገቡትን የGoogle መለያዎችዎን እንዲያስተዳድሩ ያስችልዎታል። <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation>
<translation id="7120762240626567834">VPN ካልተገናኘ በስተቀር የChrome አሳሽ እና የAndroid ትራፊክ ይታገዳሉ</translation>
<translation id="7121438501124788993">የገንቢ ሁነታ</translation>
<translation id="7121728544325372695">ዘመናዊ ዳሾች</translation>
@@ -6841,7 +6841,7 @@
<translation id="716640248772308851">«<ph name="EXTENSION" />» ምልክት በተደረገባቸው አካባቢዎች ውስጥ ምስሎችን፣ ቪዲዮ እና የድምጽ ፋይሎችን ማንበብ ይችላል።</translation>
<translation id="7166815366658507447">መገናኛ ነጥብ ነቅቷል</translation>
<translation id="7167327771183668296">ራስ-ሰር ጠቅታዎች</translation>
-<translation id="7167486101654761064">&amp;ሁልጊዜ እንዲህ አይነት ፋይሎችን ክፈት</translation>
+<translation id="7167486101654761064">&amp;ሁልጊዜ እንዲህ ዓይነት ፋይሎችን ክፈት</translation>
<translation id="716775164025088943">የእርስዎ ዕልባቶች፣ ታሪክ፣ የይለፍ ቃላት እና ሌሎችም ከእንግዲህ አይሰምሩም።</translation>
<translation id="716810439572026343"><ph name="FILE_NAME" />ን በማውረድ ላይ</translation>
<translation id="7168109975831002660">አነስተኛ የቅርፀ ቁምፊ መጠን</translation>
@@ -6894,16 +6894,16 @@
<translation id="7219762788664143869">{NUM_WEAK,plural, =0{ምንም ደካማ የይለፍ ቃላት የሉም}=1{1 ደካማ የይለፍ ቃል}one{{NUM_WEAK} ደካማ የይለፍ ቃላት}other{{NUM_WEAK} ደካማ የይለፍ ቃላት}}</translation>
<translation id="7220019174139618249">የይለፍ ቃላትን ወደ «<ph name="FOLDER" />» መላክ አልተቻለም</translation>
<translation id="722099540765702221">የኃይል መሙያ ምንጭ</translation>
-<translation id="7221869452894271364">ይህን ገጽ ዳግም ጫን</translation>
+<translation id="7221869452894271364">ይህን ገፅ ዳግም ጫን</translation>
<translation id="7222204278952406003">Chrome ነባሪው አሳሽዎ ነው</translation>
<translation id="7222232353993864120">ኢሜይል አድራሻ</translation>
<translation id="7222235798733126207">በጣቢያዎች መካከል የተገደበ ማጋራት</translation>
<translation id="722408235435815623">{MEMBERS,plural, =1{1 ጣቢያ በ<ph name="FPS_OWNER" /> ቡድን ውስጥ}one{{MEMBERS} ጣቢያ በ<ph name="FPS_OWNER" /> ቡድን ውስጥ}other{{MEMBERS} ጣቢያዎች በ<ph name="FPS_OWNER" /> ቡድን ውስጥ}}</translation>
<translation id="7225082563376899794">የይለፍ ቃላትን በሚሞሉበት ጊዜ Windows Helloን ይጠቀሙ</translation>
-<translation id="7225179976675429563">የአውታረ መረብ አይነት ይጎድላል</translation>
+<translation id="7225179976675429563">የአውታረ መረብ ዓይነት ይጎድላል</translation>
<translation id="7227458944009118910">ከዚህ በታች የተዘረዘሩት መተግበሪያዎች የፕሮቶኮል አገናኞችንም ማስተናገድ ይችላሉ። ሌሎች መተግበሪያዎች ፈቃድ ይጠይቃሉ።</translation>
<translation id="7228056665272655255">የጣት አሻራን ለማዋቀር በቁልፍ ሰሌዳው ከላይ በስተቀኝ ጥግ የሚገኘውን የጣት አሻራ ዳሳሽ ልጅዎ እንዲነኩት ያድርጉ። የልጅዎ የጣት አሻራ ውሂብ ደህንነቱ በተጠበቀ ሁኔታ ይከማቻል እና በጭራሽ ከዚህ <ph name="DEVICE_TYPE" /> አይወጣም።</translation>
-<translation id="7228523857728654909">ማያ ገጽ መቆለፊያ እና በመለያ መግባት</translation>
+<translation id="7228523857728654909">ማያ ገፅ መቆለፊያ እና በመለያ መግባት</translation>
<translation id="7228854227189381547">አትቀይር</translation>
<translation id="7230222852462421043">መስኮትን &amp;ወደነበረበት መልስ</translation>
<translation id="7231260028442989757">የስልክዎን ማሳወቂያዎች ይመልከቱ፣ ያሰናብቱ እና ምላሽ ይስጡ</translation>
@@ -6980,7 +6980,7 @@
<translation id="7299337219131431707">የእንግዳ አሰሳን ያንቁ</translation>
<translation id="7299515639584427954">የሚደገፉ አገናኞች ነባሪ መተግበሪያ ይቀየር?</translation>
<translation id="7299588179200441056"><ph name="URL" /> - <ph name="FOLDER" /></translation>
-<translation id="7301470816294041580">«Ok Google፣ ይህ ዘፈን ምንድን ነው?» ወይም «Ok Google፣ የእኔ ማያ ገጽ ላይ ምን አለ?» ብለው መጠየቅ ይችላሉ</translation>
+<translation id="7301470816294041580">«Ok Google፣ ይህ ዘፈን ምንድን ነው?» ወይም «Ok Google፣ የእኔ ማያ ገፅ ላይ ምን አለ?» ብለው መጠየቅ ይችላሉ</translation>
<translation id="730289542559375723">{NUM_APPLICATIONS,plural, =1{ይህ መተግበሪያ Chrome በአግባቡ እንዳይሠራ ሊከላከል ይችላል።}one{እነዚህ መተግበሪያዎች Chrome በአግባቡ እንዳይሠራ ሊከላከሉ ይችላሉ።}other{እነዚህ መተግበሪያዎች Chrome በአግባቡ እንዳይሠራ ሊከላከሉ ይችላሉ።}}</translation>
<translation id="7303281435234579599">ውይ! የቅንጭብ ማሳያ ሁነታን በማቀናበር ላይ ሳለ የሆነ ነገር ተሳስቷል።</translation>
<translation id="7303900363563182677">ይህ ጣቢያ ወደ ቅንጥብ ሰሌዳው የተቀዱ ጽሑፍን እና ምስሎችን እንዳይመለከት ታግዷል</translation>
@@ -7011,8 +7011,8 @@
<translation id="7339763383339757376">PKCS #7፣ ነጠላ ሰርቲፊኬት</translation>
<translation id="7339785458027436441">በሚጽፉበት ጊዜ ሆሄ ያረጋግጡ</translation>
<translation id="7339898014177206373">አዲሰ መስኮት</translation>
-<translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> አሁን በሙሉ ማያ ገጽ ላይ ነው።</translation>
-<translation id="7340650977506865820">ጣቢያ የእርስዎን ማያ ገጽ በማጋራት ላይ ነው</translation>
+<translation id="7340431621085453413"><ph name="FULLSCREEN_ORIGIN" /> አሁን በሙሉ ማያ ገፅ ላይ ነው።</translation>
+<translation id="7340650977506865820">ጣቢያ የእርስዎን ማያ ገፅ በማጋራት ላይ ነው</translation>
<translation id="7340757554212515731">የብልሽት ሪፖርቶችን እና የምርመራ እና የአጠቃቀም ውሂብን በራስ-ሰር ወደ Google ይልካል</translation>
<translation id="734088800888587319">የአውታረ መረብ መለኪያዎች</translation>
<translation id="7341834142292923918">የዚህ ጣቢያ መዳረሻ ይፈልጋል</translation>
@@ -7078,7 +7078,7 @@
<translation id="7392118418926456391">የቫይረስ ቅኝት አልተሳካም</translation>
<translation id="7392915005464253525">የተ&amp;ዘጋውን መስኮት ዳግም ክፈት</translation>
<translation id="7393073300870882456">{COUNT,plural, =1{1 ንጥል ተቀድቷል}one{{COUNT} ንጥሎች ተቀድተዋል}other{{COUNT} ንጥሎች ተቀድተዋል}}</translation>
-<translation id="7395774987022469191">መላው ማያ ገጽ</translation>
+<translation id="7395774987022469191">መላው ማያ ገፅ</translation>
<translation id="7396017167185131589">የተጋሩ አቃፊዎች እዚህ ይታያሉ</translation>
<translation id="7396845648024431313"><ph name="APP_NAME" /> ስርዓት በሚነሳበት ጊዜ ይጀመርና ሁሉንም የሌሎች <ph name="PRODUCT_NAME" /> መስኮቶችን ከዘጉ በኋላም እንኳ በጀርባ ውስጥ መሄዱን ይቀጥላል።</translation>
<translation id="7399045143794278225">ስምረትን አብጅ</translation>
@@ -7122,7 +7122,7 @@
<translation id="7424153922653300265">ኃይል ቆጣቢ በርቷል</translation>
<translation id="7424818322350938336">አውታረመረብ ታክሏል</translation>
<translation id="7427315069950454694">የዛሬ ማህደረ ትውስታዎችዎ</translation>
-<translation id="7427348830195639090">የጀርባው ገጽ፦ <ph name="BACKGROUND_PAGE_URL" /></translation>
+<translation id="7427348830195639090">የጀርባው ገፅ፦ <ph name="BACKGROUND_PAGE_URL" /></translation>
<translation id="7427798576651127129">ጥሪ ከ<ph name="DEVICE_NAME" /></translation>
<translation id="7431719494109538750">ምንም HID መሣሪያዎች አልተገኙም</translation>
<translation id="7431991332293347422">ፍለጋን እና ተጨማሪ ነገሮችን ግላዊነት ለማላበስ የእርስዎ የአሰሳ ታሪክ እንዴት ጥቅም ላይ እንደሚውል ይቆጣጠሩ</translation>
@@ -7178,7 +7178,7 @@
<translation id="7475671414023905704">የNetscape የጠፋ የይለፍ ቃል URL</translation>
<translation id="7476454130948140105">ባትሪ ለዝማኔ በጣም ዝቅተኛ ነው (<ph name="BATTERY_PERCENT" />)</translation>
<translation id="7476989672001283112">በራስ-ሰር የታገዱ <ph name="PERMISSION" /> እና <ph name="COUNT" />ተጨማሪ</translation>
-<translation id="7477748600276493962">ለዚህ ገጽ የQR ኮድ ፍጠር</translation>
+<translation id="7477748600276493962">ለዚህ ገፅ የQR ኮድ ፍጠር</translation>
<translation id="7477793887173910789">የእርስዎን ሙዚቃ፣ ቪዲዮዎች እና ተጨማሪ ነገሮች ይቆጣጠሩ</translation>
<translation id="7478069565037869084">ሰፊ</translation>
<translation id="7478485216301680444">የኪዮስክ መተግበሪያ ሊጫን አልቻለም።</translation>
@@ -7204,7 +7204,7 @@
<translation id="7497981768003291373">ምንም በቅርብ ጊዜ የተቀረጹ WebRTC የጽሑፍ ምዝግብ ማስታወሻዎች የለዎትም።</translation>
<translation id="7501957181231305652">ወይም</translation>
<translation id="7502220299952823578">ወደ «እነዚህን ጣቢያዎች ሁልጊዜ ገቢር አድርገህ አቆይ» ዝርዝሩ ያክሉ</translation>
-<translation id="7503191893372251637">የNetscape ሰርቲፊኬት አይነት</translation>
+<translation id="7503191893372251637">የNetscape ሰርቲፊኬት ዓይነት</translation>
<translation id="7503985202154027481">ወደዚህ ጣቢያ ያደረጉት የጉብኝትዎ መዝገብ በደህንነት ቁልፍዎ ላይ ይቀመጣል።</translation>
<translation id="750509436279396091">የውርዶች አቃፊን ከፍት</translation>
<translation id="7505717542095249632"><ph name="MERCHANT" /> ደብቅ</translation>
@@ -7337,7 +7337,7 @@
<translation id="7630426712700473382">ይህ መሣሪያ በ<ph name="MANAGER" /> የሚተዳደር ሲሆን በየጊዜው በመለያ እንዲገቡ ይጠይቀዎታል።</translation>
<translation id="7631014249255418691">Linux መተግበሪያዎች እና ፋይሎች በተሳካ ሁኔታ በምትኬ ተቀምጠዋል</translation>
<translation id="7631205654593498032">መሣሪያዎችዎን ሲያገናኙ የእርስዎ <ph name="DEVICE_TYPE" /> እነዚህን ማድረግ እንደሚችል ይስማማሉ፦</translation>
-<translation id="7631887513477658702">&amp;ሁልጊዜ እንዲህ አይነት ፋይሎችን ክፈት</translation>
+<translation id="7631887513477658702">&amp;ሁልጊዜ እንዲህ ዓይነት ፋይሎችን ክፈት</translation>
<translation id="7632948528260659758">የሚከተሉትን የኪዮስክ መተግበሪያዎች ማዘመን አልተሳካም፦</translation>
<translation id="7633724038415831385">ይህ ዝማኔ የሚጠብቁበት ብቸኛው ጊዜ ነው። በChromebooks ላይ የሶፍትዌር ዝማኔዎች የሚከናወኑት በበስተጀርባ ነው።</translation>
<translation id="7634280112532283638">የአይፈለጌ መልዕክት እና የመጭበርበር ቅነሳ</translation>
@@ -7454,7 +7454,7 @@
<translation id="771721654176725387">ይሄ የአሰሳ ውሂብዎን ለዘለዓለም ከዚህ መሣሪያ ይሰርዘዋል። ውሂቡን መልሶ ለማግኘት፣ አስምርን ያብሩ እንደ</translation>
<translation id="7717845620320228976">ዝማኔዎች ካለ ተመልከት</translation>
<translation id="7718490543420739837">ታይታ የቁልፍ ሰሌዳ፣ በቃል ማስጻፍ፣ የማብሪያ/ማጥፊያ መዳረሻ እና ተጨማሪ</translation>
-<translation id="7719367874908701697">ገጽ አጉላ</translation>
+<translation id="7719367874908701697">ገፅ አጉላ</translation>
<translation id="7719588063158526969">የመሣሪያ ስም በጣም ረጅም ነው</translation>
<translation id="7721179060400456005">መስኮቶች ማሳያዎችን ለመሸፈን እንዲችሉ ይፍቀዱ</translation>
<translation id="7721237513035801311"><ph name="SWITCH" /> (<ph name="DEVICE_TYPE" />)</translation>
@@ -7463,14 +7463,14 @@
<translation id="7724603315864178912">ቁረጥ</translation>
<translation id="7726391492136714301">የስልክዎን ማሳወቂያዎች እና መተግበሪያዎች ይመልከቱ</translation>
<translation id="7728465250249629478">የመሣሪያ ቋንቋን ይቀይሩ</translation>
-<translation id="7728570244950051353">ከአንቀላፋ ሁነታ ማያ ገጽ ቆልፍ</translation>
+<translation id="7728570244950051353">ከአንቀላፋ ሁነታ ማያ ገፅ ቆልፍ</translation>
<translation id="7728668285692163452">የሰርጥ ለውጥ በኋላ ላይ ነው የሚተገበረው</translation>
-<translation id="7730449930968088409">የእርስዎ ማያ ገጽ ይዘት ይቀርጻል</translation>
-<translation id="7730683939467795481">ይህ ገጽ በ «<ph name="EXTENSION_NAME" />» ቅጥያ ነበር የተለወጠዉ</translation>
+<translation id="7730449930968088409">የእርስዎ ማያ ገፅ ይዘት ይቀርጻል</translation>
+<translation id="7730683939467795481">ይህ ገፅ በ «<ph name="EXTENSION_NAME" />» ቅጥያ ነበር የተለወጠዉ</translation>
<translation id="7735165285389721951">ሌላ የSteam ውቅረት በማሄድ ላይ ነው። እባክዎ እንደገና ከመሞከርዎ በፊት እስኪጨርስ ድረስ ይጠብቁት</translation>
<translation id="7737115349420013392">ከ«<ph name="DEVICE_NAME" />» ጋር በማጣመር ላይ ...</translation>
<translation id="7737203573077018777"><ph name="PROOF_OF_POSSESSION_INSTRUCTION_NAME" /> መመሪያ ተቀባይነት አግኝቷል</translation>
-<translation id="7737846262459425222">ይህን በማንኛውም ጊዜ በቅንብሮች &gt; Google ረዳት &gt; የማያ ገጽ አውድ ውስጥ መለወጥ ይችላሉ።</translation>
+<translation id="7737846262459425222">ይህን በማንኛውም ጊዜ በቅንብሮች &gt; Google ረዳት &gt; የማያ ገፅ አውድ ውስጥ መለወጥ ይችላሉ።</translation>
<translation id="7737948071472253612">ካሜራዎን ለመጠቀም አልተፈቀደም</translation>
<translation id="77381465218432215">የአነጋገር ምልክቶች እና ልዩ ቁምፊዎችን አሳይ</translation>
<translation id="7740996059027112821">መደበኛ</translation>
@@ -7498,7 +7498,7 @@
<translation id="7757787379047923882">ከ<ph name="DEVICE_NAME" /> የተጋራ ጽሁፍ</translation>
<translation id="7758143121000533418">Family Link</translation>
<translation id="7758450972308449809">የማሳያዎን ድንበሮች ያስተካክሉ</translation>
-<translation id="7760004034676677601">የጠበቁት የጅማሬ ገጽ ይሄ ነው?</translation>
+<translation id="7760004034676677601">የጠበቁት የጅማሬ ገፅ ይሄ ነው?</translation>
<translation id="7762024824096060040">ይህንን መለያ መጠቀም አይችሉም</translation>
<translation id="7764225426217299476">አድራሻ አክል</translation>
<translation id="7764256770584298012"><ph name="DOWNLOAD_RECEIVED" /> ከ<ph name="DOWNLOAD_DOMAIN" /></translation>
@@ -7507,7 +7507,7 @@
<translation id="7766082757934713382">ራስ-ሰር መተግበሪያን እና የስርዓት ዝማኔዎችን ባሉበት በማቆም የአውታረ መረብ የውሂብ አጠቃቀም ለመቀነስ ይረዳል</translation>
<translation id="7766807826975222231">ጉብኝት ያድርጉ</translation>
<translation id="7766838926148951335">ፈቃዶችን ተቀበል</translation>
-<translation id="7767554953520855281">የእርስዎን ማያ ገጽ በሚያጋሩበት ጊዜ ዝርዝሮች ይደበቃሉ</translation>
+<translation id="7767554953520855281">የእርስዎን ማያ ገፅ በሚያጋሩበት ጊዜ ዝርዝሮች ይደበቃሉ</translation>
<translation id="7767972280546034736">ለ<ph name="APP_NAME" /> የይለፍ ቁልፍ ይፍጠሩ</translation>
<translation id="7768507955883790804">እርስዎ ሲጎበኟቸው ጣቢያዎች ይህን ቅንብር በራስ-ሰር ይከተሉታል</translation>
<translation id="7768526219335215384"><ph name="ORIGIN" /> በ <ph name="FOLDERNAME" /> ውስጥ ያሉትን ፋይሎች ማየት ይችላል</translation>
@@ -7529,19 +7529,19 @@
<translation id="7777624210360383048">አቋራጭ <ph name="SHORTCUT" /> ለ<ph name="EXTENSION_NAME" /></translation>
<translation id="7781335840981796660">ሁሉም የተጠቃሚ መለያዎች እና አካባቢያዊ ውሂብ ይወገዳሉ።</translation>
<translation id="7782102568078991263">ከGoogle ተጨማሪ የጥቆማ አስተያየቶች የሉም</translation>
-<translation id="7782717250816686129">በመለያ መግቢያ ማያ ገጽ ላይ ቀጣይነት ያለው ውሂብን ያከማቹ እና ምስክረነቶችን ወደ ክፍለ ጊዜው ያስገቡ።</translation>
+<translation id="7782717250816686129">በመለያ መግቢያ ማያ ገፅ ላይ ቀጣይነት ያለው ውሂብን ያከማቹ እና ምስክረነቶችን ወደ ክፍለ ጊዜው ያስገቡ።</translation>
<translation id="778330624322499012"><ph name="PLUGIN_NAME" />ን መጫን አልተቻለም</translation>
<translation id="7784067724422331729">በኮምፒውተርዎ ላይ ያሉት የደህንነት ቅንብሮች ይህንን ፋይል አግደውታል።</translation>
<translation id="7784796923038949829">የጣቢያን ውሂብ ማንበብ ወይም መቀየር አልተቻለም</translation>
<translation id="778480864305029524">ቅጽበታዊ እንደ ሞደም መሰካትን ለመጠቀም ለGoogle Play አገልግሎቶች ማሳወቂያዎችን ያብሩ።</translation>
<translation id="7785471469930192436">መተግበር የሚችል ከሆነ የፍለጋ ታሪክዎን ለመሰረዝ የፍለጋ ፕሮግራምዎን መመሪያዎች ይመልከቱ።</translation>
<translation id="7786889348652477777">&amp;መተግበሪያን ዳግም ጫን</translation>
-<translation id="7787308148023287649">በሌላ ማያ ገጽ ላይ አሳይ</translation>
+<translation id="7787308148023287649">በሌላ ማያ ገፅ ላይ አሳይ</translation>
<translation id="7788298548579301890">ሌላ ፕሮግራም Chrome የሚሰራበትን መንገድ የሚለውጥ መተግበሪያ በኮምፒውተርዎ ታክሏል።
<ph name="EXTENSION_NAME" /></translation>
-<translation id="7789963078219276159">የጅምር ገጽ ጀርባው ወደ <ph name="CATEGORY" /> ተቀይሯል።</translation>
+<translation id="7789963078219276159">የጅምር ገፅ ጀርባው ወደ <ph name="CATEGORY" /> ተቀይሯል።</translation>
<translation id="7791543448312431591">ያክሉ</translation>
<translation id="7792012425874949788">መግባት ላይ የሆነ ችግር ተፈጥሯል</translation>
<translation id="7792388396321542707">ማጋራት አቁም</translation>
@@ -7556,9 +7556,9 @@
<translation id="7804072833593604762">ትር ተዘግቷል</translation>
<translation id="7805768142964895445">ሁኔታ</translation>
<translation id="7807067443225230855">ፍለጋ እና ረዳት</translation>
-<translation id="7807117920154132308"><ph name="SUPERVISED_USER_NAME" /> አስቀድመው በሌላ መሣሪያ ላይ Google ረዳትን ያቀናበሩ ይመስላሉ። <ph name="SUPERVISED_USER_NAME" /> በዚህ መሣሪያ ላይ የማያ ገጽ ሁኔታን በማብራት ከረዳት የበለጠ ማግኘት ይችላል።</translation>
+<translation id="7807117920154132308"><ph name="SUPERVISED_USER_NAME" /> አስቀድመው በሌላ መሣሪያ ላይ Google ረዳትን ያቀናበሩ ይመስላሉ። <ph name="SUPERVISED_USER_NAME" /> በዚህ መሣሪያ ላይ የማያ ገፅ ሁኔታን በማብራት ከረዳት የበለጠ ማግኘት ይችላል።</translation>
<translation id="7807711621188256451"><ph name="HOST" /> ሁልጊዜ የእርስዎ ካሜራ መዳረሻ ይፈቀድለት</translation>
-<translation id="7810202088502699111">በዚህ ገጽ ብቅ-ባዮች ታግደዋል።</translation>
+<translation id="7810202088502699111">በዚህ ገፅ ብቅ-ባዮች ታግደዋል።</translation>
<translation id="7814458197256864873">&amp;ቅዳ</translation>
<translation id="7815583197273433531">ለ<ph name="EXTENSION_NAME" /> <ph name="SHORTCUT" /> አቋራጭን አርትዕ</translation>
<translation id="7815680994978050279">አደገኛ ውርድ ታግዷል</translation>
@@ -7575,13 +7575,13 @@
<translation id="7828642077514646543">ስህተት፦ የዕውቅና ማረጋገጫን መፍታት አልተቻለም</translation>
<translation id="7829877209233347340">አንድ ወላጅ የትምህርት ቤት መለያ ለማከል ፈቃድ እንዲሰጡ ይጠይቋቸው</translation>
<translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation>
-<translation id="783229689197954457">Google ቅናሽ ካገኘ በዚህ ገጽ ላይ ያዩታል</translation>
+<translation id="783229689197954457">Google ቅናሽ ካገኘ በዚህ ገፅ ላይ ያዩታል</translation>
<translation id="7833720883933317473">የተቀመጡ ብጁ ቃላት እዚህ ይታያሉ</translation>
<translation id="7835178595033117206">ዕልባት ተወግዷል</translation>
<translation id="7836535163829106376">የ<ph name="FILE_NAMES" />ን ዩአርኤል መክፈት አይቻልም</translation>
<translation id="7836577093182643605">ለጣቢያዎች እንዲጋሩ የማይፈልጓቸው ያገዷቸው ርዕሶች ዝርዝር</translation>
<translation id="7836850009646241041">የደህንነት ቁልፍዎን ዳግም ለመንካት ይሞክሩ</translation>
-<translation id="7837776265184002579">የእርስዎ ጅምር ገጽ ወደ <ph name="URL" /> ተቀይሯል።</translation>
+<translation id="7837776265184002579">የእርስዎ ጅምር ገፅ ወደ <ph name="URL" /> ተቀይሯል።</translation>
<translation id="7838838951812478896">«<ph name="NETWORK_NAME" />»ን ከ<ph name="DEVICE_NAME" /> ማስቀመጥ አልተቻለም</translation>
<translation id="7838971600045234625">{COUNT,plural, =1{ወደ <ph name="ATTACHMENTS" /> <ph name="DEVICE_NAME" /> ተልኳል}one{ወደ <ph name="ATTACHMENTS" /> <ph name="DEVICE_NAME" /> ተልኳል}other{ወደ <ph name="ATTACHMENTS" /> <ph name="DEVICE_NAME" /> ተልኳል}}</translation>
<translation id="7839051173341654115">ማህደረመረጃን ይመልከቱ/ምትኬ ያስቀምጡ</translation>
@@ -7606,7 +7606,7 @@
<translation id="7855678561139483478">ትር ወደ አዲስ መስኮት ውሰድ</translation>
<translation id="7857004848504343806">የእርስዎ ኮምፒውተር የደህንነት ሞዱል አለው፣ ይህም በChromeOS Flex ውስጥ ብዙ ወሳኝ የደህንነት ባህሪያትን ለመተግበር ሥራ ላይ ይውላል። የበለጠ ለመረዳት የChromebook እገዛ ማዕከሉን ይጎብኙ፦ https://support.google.com/chromebook/?p=sm</translation>
<translation id="7857093393627376423">የጽሑፍ ጥቆማ አስተያየቶች</translation>
-<translation id="7857949311770343000">የጠበቁት የአዲስ ትር ገጽ ይሄ ነው?</translation>
+<translation id="7857949311770343000">የጠበቁት የአዲስ ትር ገፅ ይሄ ነው?</translation>
<translation id="7858328180167661092"><ph name="APP_NAME" /> (Windows)</translation>
<translation id="786073089922909430">አገልግሎት፦ <ph name="ARC_PROCESS_NAME" /></translation>
<translation id="7861215335140947162">&amp;የወረዱ</translation>
@@ -7619,7 +7619,7 @@
<translation id="7870730066603611552">ቅንብርን የሚከተሉትን የማስመር አማራጮች ይገምግሙ</translation>
<translation id="7870790288828963061">ምንም አዲስ ስሪት ያላቸው የKiosk መተግበሪያዎች አልተገኙም። ምንም የሚዘምን ነገር የለም። እባክዎ የዩ.ኤስ.ቢ. ስቲኩን ያስወግዱ።</translation>
<translation id="7871049986386271121">ሁሌም በዚህ ጣቢያ ላይ</translation>
-<translation id="7871109039747854576">በዕጩ ዝርዝር ላይ ገጽ ለመፍጠር የ<ph name="COMMA" /> እና <ph name="PERIOD" /> ቁልፎችን ይጠቀሙ</translation>
+<translation id="7871109039747854576">በዕጩ ዝርዝር ላይ ገፅ ለመፍጠር የ<ph name="COMMA" /> እና <ph name="PERIOD" /> ቁልፎችን ይጠቀሙ</translation>
<translation id="787268756490971083">አጥፋ</translation>
<translation id="7872758299142009420">በጣም ብዙ የታቀፉ ቡድኖች፦ <ph name="ERROR_LINE" /></translation>
<translation id="7874257161694977650">Chrome በስተጀርባዎች</translation>
@@ -7652,7 +7652,7 @@
<translation id="7901405293566323524">የስልክ መገናኛ</translation>
<translation id="7903290522161827520">የአሳሽ ክፍሎችን እየፈለጉ ነው? ይጎብኙ</translation>
<translation id="7903429136755645827">የእርስዎ የጨዋታ መቆጣጠሪያዎችን ለማበጀት ጠቅ ያድርጉ</translation>
-<translation id="7903481341948453971">የይለፍ ቃላትን በሚሞሉበት ጊዜ ማያ ገጽ መቆለፊያዎን ይጠቀሙ</translation>
+<translation id="7903481341948453971">የይለፍ ቃላትን በሚሞሉበት ጊዜ ማያ ገፅ መቆለፊያዎን ይጠቀሙ</translation>
<translation id="7903742244674067440">የእነዚህን ዕውቅና ማረጋገጫ ባለሥልጣናት የሚለዩ የዕውቅና ማረጋገጫዎች በፋይሉ ላይ አለዎት</translation>
<translation id="7903925330883316394">ፍጆታ፦ <ph name="UTILITY_TYPE" /></translation>
<translation id="7903984238293908205">ካታካና</translation>
@@ -7688,11 +7688,11 @@
<translation id="7926975587469166629">የካርድ ቅጽል ስም</translation>
<translation id="7928175190925744466">ይህን የይለፍ ቃለ አስቀድመው ለውጠዋል?</translation>
<translation id="7930294771522048157">የተቀመጡ የመክፈያ ዘዴዎች እዚህ ላይ ብቅ ይላሉ</translation>
-<translation id="79312157130859720"><ph name="APP_NAME" /> የእርስዎን ማያ ገጽ እና ኦዲዮ እያጋራ ነው።</translation>
+<translation id="79312157130859720"><ph name="APP_NAME" /> የእርስዎን ማያ ገፅ እና ኦዲዮ እያጋራ ነው።</translation>
<translation id="793293630927785390">አዲስ የWi-Fi አውታረ መረብ መገናኛ</translation>
<translation id="7932969338829957666">የተጋሩ አቃፊዎች <ph name="BASE_DIR" /> ላይ በLinux ላይ ይይገኛሉ።</translation>
<translation id="7933314993013528982">{NUM_TABS,plural, =1{የጣቢያን ድምጸ-ከል አንሳ}one{የጣቢያዎችን ድምጸ-ከል አንሳ}other{የጣቢያዎችን ድምጸ-ከል አንሳ}}</translation>
-<translation id="7933518760693751884">አንድ ገጽ ለኋላ ለማስቀመጥ፣ የዕልባት አዶን ጠቅ ያድርጉ</translation>
+<translation id="7933518760693751884">አንድ ገፅ ለኋላ ለማስቀመጥ፣ የዕልባት አዶን ጠቅ ያድርጉ</translation>
<translation id="7933634003144813719">የተጋሩ አቃፊዎችን ያቀናብሩ</translation>
<translation id="793531125873261495">ምናባዊ ማሽንን በማውረድ ላይ ስህተት። እባክዎ እንደገና ይሞክሩ።</translation>
<translation id="7935451262452051102"><ph name="PERCENT" />% ተጠናቅቋል</translation>
@@ -7800,7 +7800,7 @@ nil</translation>
<translation id="8018313076035239964">ድር ጣቢያዎች ምን መረጃ መጠቀም እና ምን ይዘት ለእርስዎ ማሳየት እንደሚችሉ ይቆጣጠሩ</translation>
<translation id="8023133589013344428">በChromeOS Flex ቅንብሮች ውስጥ ቋንቋዎችን ያቀናብሩ</translation>
<translation id="8023801379949507775">ቅጥያዎችን አሁን አዘምን</translation>
-<translation id="8025151549289123443">ማያ ገጽ መቆለፊያ እና በመለያ መግባት</translation>
+<translation id="8025151549289123443">ማያ ገፅ መቆለፊያ እና በመለያ መግባት</translation>
<translation id="8026334261755873520">የአሰሳ ውሂብ አጽዳ</translation>
<translation id="8026471514777758216">ሁሉም መሣሪያዎችዎ</translation>
<translation id="8028060951694135607">Microsoft Key Recovery</translation>
@@ -7814,7 +7814,7 @@ nil</translation>
<translation id="8033023935541439900">የአጽንዖት ምልክቶች ምናሌ ክፍት ነው። ለማሰስ ወደ ግራ ወይም ወደ ቀኝ ይጫኑ እና ለማስገባት አስገባን ይጫኑ።</translation>
<translation id="8033827949643255796">ተመርጧል</translation>
<translation id="8033958968890501070">ጊዜው አልቋል</translation>
-<translation id="8035059678007243127">ማንነት የማያሳውቅ የጀርባ/ፊት መሸጎጫ ገጽ፦ <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation>
+<translation id="8035059678007243127">ማንነት የማያሳውቅ የጀርባ/ፊት መሸጎጫ ገፅ፦ <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation>
<translation id="8036193484521570992">ራስ-ሙላን ለማሻሻል ያግዙ</translation>
<translation id="8037117027592400564">ተሰብስቦ በተሰራ ንግግር አማካኝነት ሁሉንም የተነገሩ ጽሑፎች ያነብባል</translation>
<translation id="8037357227543935929">ጠይቅ (ነባሪ)</translation>
@@ -7841,8 +7841,8 @@ nil</translation>
<translation id="8051193500142930381">ካሜራ የሚያስፈልጋቸው ባህሪዎች አይሰሩም</translation>
<translation id="8051390370038326517"><ph name="HOST" /> ሁልጊዜ የMIDI መሣሪያዎች ሙሉ ቁጥጥር እንዲኖረው ይፍቀዱ</translation>
<translation id="8053278772142718589">PKCS #12 ፋይሎች</translation>
-<translation id="8053390638574070785">ይህን ገጽ ዳግም ጫን</translation>
-<translation id="8054517699425078995">የዚህ አይነት ፋይል መሣሪያዎን ሊጎዳ ይችላል። <ph name="FILE_NAME" />ን ለማንኛውም ማስቀመጥ ይፈልጋሉ?</translation>
+<translation id="8053390638574070785">ይህን ገፅ ዳግም ጫን</translation>
+<translation id="8054517699425078995">የዚህ ዓይነት ፋይል መሣሪያዎን ሊጎዳ ይችላል። <ph name="FILE_NAME" />ን ለማንኛውም ማስቀመጥ ይፈልጋሉ?</translation>
<translation id="8054563304616131773">እባክዎ ትክክለኛ የኢሜይል አድራሻ ያስገቡ</translation>
<translation id="8054883179223321715">ለተወሰኑ የቪዲዮ ጣቢያዎች የሚገኝ</translation>
<translation id="8054921503121346576">የUSB ቁልፍ ሰሌዳ ተገናኝቷል</translation>
@@ -7957,7 +7957,7 @@ nil</translation>
<translation id="8157248655669507702">የኢሲም መገለጫን ለመጫን የተንቀሳቃሽ ስልክ ውሂብን ያንቁ</translation>
<translation id="8157704005178149728">ክትትልን በማቀናበር ላይ</translation>
<translation id="8158117992543756526">ይህ መሣሪያ በ<ph name="MONTH_AND_YEAR" /> ውስጥ ራስ-ሰር የሶፍትዌር እና የደህንነት ዝማኔዎችን ማግኘት አቁሟል። <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation>
-<translation id="8159652640256729753">እንደ የተከፈለ ማያ ገጽ እና ዴስኮችን መቀየር ላሉ እርምጃዎች የንዝረት ማረጋገጫን ይቀበሉ። <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation>
+<translation id="8159652640256729753">እንደ የተከፈለ ማያ ገፅ እና ዴስኮችን መቀየር ላሉ እርምጃዎች የንዝረት ማረጋገጫን ይቀበሉ። <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation>
<translation id="816055135686411707">የእውቅና ማረጋገጫ ዕምነት ማዘጋጀት ላይ ስህተት</translation>
<translation id="8160775796528709999">የቀጥታ መግለጫ ጽሑፍን በቅንብሮች ውስጥ በማንቃት ለኦዲዮ እና ቪድዮ መግለጫ ጽሑፎችን ያግኙ</translation>
<translation id="816095449251911490"><ph name="SPEED" /> - <ph name="RECEIVED_AMOUNT" />, <ph name="TIME_REMAINING" /></translation>
@@ -8037,7 +8037,7 @@ nil</translation>
<translation id="8230446983261649357">ጣቢያዎች ምስሎችን እንዲያሳዩ አትፍቀድ</translation>
<translation id="8233028084277069927">አሁን ክፈት</translation>
<translation id="8234795456569844941">እባክዎ መሐንዲሶቻችን ይህን ችግር እንዲፈቱት ያግዟቸው። ልክ የመገለጫ ስህተት መልዕክቱን ከማግኘትዎ በፊት ምን እንደተከሰተ ይንገሩን፦</translation>
-<translation id="8235418492073272647">ገጽ ከ<ph name="DEVICE_NAME" /> ተጋርቷል</translation>
+<translation id="8235418492073272647">ገፅ ከ<ph name="DEVICE_NAME" /> ተጋርቷል</translation>
<translation id="8236911020904880539">ይውጡ</translation>
<translation id="8236917170563564587">በምትኩ ይህን ትር አጋራ</translation>
<translation id="8237647586961940482">ጠቆር ያለ ሮዝ እና ቀይ</translation>
@@ -8092,7 +8092,7 @@ nil</translation>
<translation id="8272443605911821513">በ«ተጨማሪ መሣሪያዎች» ምናሌው ውስጥ ቅጥያዎች የሚለውን ጠቅ በማድረግ ቅጥያዎችዎን ያቀናብሩ።</translation>
<translation id="8272786333453048167">እንደገና ፍቀድ</translation>
<translation id="8273905181216423293">አሁን አውርድ</translation>
-<translation id="827488840488530039">ሊጎበኙት እየሞከሩ ያሉት ገጽ የእርስዎን የKerberos ቲኬቶች ለማረጋገጥ አልቻለም</translation>
+<translation id="827488840488530039">ሊጎበኙት እየሞከሩ ያሉት ገፅ የእርስዎን የKerberos ቲኬቶች ለማረጋገጥ አልቻለም</translation>
<translation id="8274921654076766238">ማጉያ የቁልፍ ሰሌዳ ትኩረትን ይከተላል</translation>
<translation id="8274924778568117936">ዝማኔው እስኪጨርስ ድረስ የእርስዎን <ph name="DEVICE_TYPE" /> አያጥፉት ወይም አይዝጉት። መጫኑ ከተጠናቀቀ በኋላ የእርስዎ <ph name="DEVICE_TYPE" /> ዳግም ይነሳል።</translation>
<translation id="8275038454117074363">ከውጭ አስመጣ</translation>
@@ -8134,10 +8134,10 @@ nil</translation>
<translation id="8314835274931377415">የማብሪያ/ማጥፊያ መዳረሻ ውቅረት ይጀምር?</translation>
<translation id="8317671367883557781">የአውታረ መረብ ግንኙነት ያክሉ</translation>
<translation id="8317965619823678157">የይለፍ ቃላትን ቅዳ</translation>
-<translation id="8318266828739827371">የጎላውን የማያ ገጽዎን ቦታ ለማየት የተከፈለ ማያ ገጽ ዕይታን ይጠቀሙ። ማጉያን ለማብራት እና ለማጥፋት Search + Ctrl + Dን ይጠቀሙ።</translation>
+<translation id="8318266828739827371">የጎላውን የማያ ገፅዎን ቦታ ለማየት የተከፈለ ማያ ገፅ ዕይታን ይጠቀሙ። ማጉያን ለማብራት እና ለማጥፋት Search + Ctrl + Dን ይጠቀሙ።</translation>
<translation id="8319414634934645341">የተስፋፋ ቁልፍ አጠቃቀም</translation>
<translation id="8321837372750396788">ይህ <ph name="DEVICE_TYPE" /> በ<ph name="MANAGER" /> ነው የሚተዳደረው።</translation>
-<translation id="8322814362483282060">ይህ ገጽ ማይክሮፎንዎን እንዳይደርስበት ታግዷል።</translation>
+<translation id="8322814362483282060">ይህ ገፅ ማይክሮፎንዎን እንዳይደርስበት ታግዷል።</translation>
<translation id="8323167517179506834">ዩአርኤል ይተይቡ</translation>
<translation id="8323317289166663449">በኮምፒተርዎ እና በሁሉም ድር ጣቢያዎች ላይ ሁሉንም ውሂብዎን ያንብቡ እና ይቀይሩ</translation>
<translation id="8324784016256120271">ጣቢያዎች በተለያዩ ጣቢያዎች ላይ ለምሳሌ ማስታወቂያዎችን ግላዊነት ለማላበስ የእርስዎን የአሰሳ እንቅስቃሴ ለመመልከት ኩኪዎችን መጠቀም ይችላሉ</translation>
@@ -8147,7 +8147,7 @@ nil</translation>
<translation id="8327676037044516220">ፈቃዶች እና የይዘት ቅንብሮች</translation>
<translation id="8330617762701840933">ወደ አማራጭ አሳሽ የሚያዞሩ ድር ጣቢያዎች ዝርዝር።</translation>
<translation id="8330689128072902965">በአቅራቢያ ያሉ እውቂያዎች ለእርስዎ ማጋራት ይችላሉ። ለመቀየር ጠቅ ያድርጉ።</translation>
-<translation id="8331323939220256760">{FILE_TYPE_COUNT,plural, =1{የሚደገፍ የፋይል አይነት፡- <ph name="FILE_TYPE1" />}=2{የሚደገፉ የፋይል አይነቶች፦ <ph name="FILE_TYPE1" />፣ <ph name="FILE_TYPE2" />}=3{የሚደገፉ የፋይል አይነቶች፦ <ph name="FILE_TYPE1" />፣ <ph name="FILE_TYPE2" />፣ <ph name="FILE_TYPE3" />}=4{የሚደገፉ የፋይል አይነቶች፦ <ph name="FILE_TYPE1" />፣ <ph name="FILE_TYPE2" />፣ <ph name="FILE_TYPE3" />፣ <ph name="FILE_TYPE4" />}one{የሚደገፉ የፋይል አይነቶች፦ <ph name="FILE_TYPE1" />፣ <ph name="FILE_TYPE2" />፣ <ph name="FILE_TYPE3" />፣ <ph name="FILE_TYPE4" /> (<ph name="LINK" />እና {OVERFLOW_COUNT} ሌሎች<ph name="END_LINK" />)}other{የሚደገፉ የፋይል አይነቶች፦ <ph name="FILE_TYPE1" />፣ <ph name="FILE_TYPE2" />፣ <ph name="FILE_TYPE3" />፣ <ph name="FILE_TYPE4" /> (<ph name="LINK" />እና {OVERFLOW_COUNT} ሌሎች<ph name="END_LINK" />)}}</translation>
+<translation id="8331323939220256760">{FILE_TYPE_COUNT,plural, =1{የሚደገፍ የፋይል ዓይነት፡- <ph name="FILE_TYPE1" />}=2{የሚደገፉ የፋይል አይነቶች፦ <ph name="FILE_TYPE1" />፣ <ph name="FILE_TYPE2" />}=3{የሚደገፉ የፋይል አይነቶች፦ <ph name="FILE_TYPE1" />፣ <ph name="FILE_TYPE2" />፣ <ph name="FILE_TYPE3" />}=4{የሚደገፉ የፋይል አይነቶች፦ <ph name="FILE_TYPE1" />፣ <ph name="FILE_TYPE2" />፣ <ph name="FILE_TYPE3" />፣ <ph name="FILE_TYPE4" />}one{የሚደገፉ የፋይል አይነቶች፦ <ph name="FILE_TYPE1" />፣ <ph name="FILE_TYPE2" />፣ <ph name="FILE_TYPE3" />፣ <ph name="FILE_TYPE4" /> (<ph name="LINK" />እና {OVERFLOW_COUNT} ሌሎች<ph name="END_LINK" />)}other{የሚደገፉ የፋይል አይነቶች፦ <ph name="FILE_TYPE1" />፣ <ph name="FILE_TYPE2" />፣ <ph name="FILE_TYPE3" />፣ <ph name="FILE_TYPE4" /> (<ph name="LINK" />እና {OVERFLOW_COUNT} ሌሎች<ph name="END_LINK" />)}}</translation>
<translation id="8331822764922665615">ቡድንዎን ይሰይሙ፣ ቀለም ይምረጡ እና Escን ይጫኑ</translation>
<translation id="833256022891467078">በCrostini የተጋሩ ውሂቦች</translation>
<translation id="833262891116910667">አድምቅ</translation>
@@ -8197,7 +8197,7 @@ nil</translation>
<translation id="8376451933628734023">ይህ የድር መተግበሪያ ሌላ መተግበሪያ ነው ብለው እንዲያስቡት ለማታለል እየሞከረ ከሆነ ያራግፉት።</translation>
<translation id="8377625247046155446">ይህ የይለፍ ቁልፍ እዚህ መሣሪያ ላይ ብቻ ይቀመጣል። እርስዎ ሁሉንም ማንነትዎን የማያሳውቁ መስኮቶችን ከዘጓቸው በኋላ እዚህ መሣሪያ ላይ እንዳለ ይቆያል።</translation>
<translation id="8378714024927312812">በእርስዎ ድርጅት የሚተዳደር</translation>
-<translation id="8379878387931047019">ይህ መሣሪያ በዚህ ድር ጣቢያ የተጠየቀውን የደህንነት ቁልፍ አይነት አይደግፍም</translation>
+<translation id="8379878387931047019">ይህ መሣሪያ በዚህ ድር ጣቢያ የተጠየቀውን የደህንነት ቁልፍ ዓይነት አይደግፍም</translation>
<translation id="8379991678458444070">ይህን ትር ዕልባት በማድረግ በፍጥነት ወደዚህ ተመልሰው ይምጡ</translation>
<translation id="8380266723152870797">የመስኮት ስም</translation>
<translation id="8380941800586852976">አደገኛ</translation>
@@ -8236,7 +8236,7 @@ nil</translation>
<translation id="8410775397654368139">Google Play</translation>
<translation id="8412136526970428322">የተፈቀዱ <ph name="PERMISSION" /> እና <ph name="COUNT" /> ተጨማሪ</translation>
<translation id="8413385045638830869">በመጀመሪያ ጠይቅ (የሚመከር)</translation>
-<translation id="8413956290606243087">የChromeOS አብሮገነብ የማያ ገጽ አንባቢ የሆነውን ChromeVox ማግበር ይፈልጋሉ?</translation>
+<translation id="8413956290606243087">የChromeOS አብሮገነብ የማያ ገፅ አንባቢ የሆነውን ChromeVox ማግበር ይፈልጋሉ?</translation>
<translation id="8414249071344507766">ትውስታዎች ለሁለት ቀናት ተደብቀዋል</translation>
<translation id="8414396119627470038">ወደ <ph name="SITE_ETLD_PLUS_ONE" /> በ<ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> በመለያ ይግቡ</translation>
<translation id="8414685983518053656">ማስታወሻዎች</translation>
@@ -8331,7 +8331,7 @@ nil</translation>
<translation id="8502536196501630039">ከGoogle Play መተግበሪያዎችን ለመጠቀም፣ የእርስዎን መተግበሪያዎች እነበሩበት በመጀመሪያ መመለስ አለብዎት። አንዳንድ ውሂብ ጠፍቶ ሊሆን ይችላል።</translation>
<translation id="8503813439785031346">የተጣቃሚ ስም</translation>
<translation id="850382998924680137">ዛሬ ታይቷል</translation>
-<translation id="8507227974644337342">የማያ ገጽ ጥራት</translation>
+<translation id="8507227974644337342">የማያ ገፅ ጥራት</translation>
<translation id="850875081535031620">ምንም ጎጂ ሶፍትዌር አልተገኘም</translation>
<translation id="8509177919508253835">የደህንነት ቁልፎችን ዳግም ያስጀምሩ እና ፒኖችን ይፍጠሩ</translation>
<translation id="8509646642152301857">የፊደል ማረሚያ መዝገበ-ቃላት ማውረድ አልተሳካም።</translation>
@@ -8346,7 +8346,7 @@ nil</translation>
<translation id="8523493869875972733">ለውጦችን አስቀምጥ</translation>
<translation id="8523849605371521713">በመመሪያ የታከለ</translation>
<translation id="8524783101666974011">ወደ የእርስዎ የGoogle መለያ ካርዶችን ያስቀምጡ</translation>
-<translation id="8525306231823319788">ሙሉ ማያ ገጽ</translation>
+<translation id="8525306231823319788">ሙሉ ማያ ገፅ</translation>
<translation id="8526813720153458066">SSH</translation>
<translation id="8528074251912154910">ቋንቋዎችን አክል</translation>
<translation id="8528479410903501741">አይቢኤኤንን ያስቀምጡ</translation>
@@ -8369,7 +8369,7 @@ nil</translation>
<translation id="8546306075665861288">የምስል መሸጎጫ</translation>
<translation id="8546930481464505581">ተነኪ አሞሌን አብጅ</translation>
<translation id="8547821378890700958"><ph name="BEGIN_PARAGRAPH1" /><ph name="USER_EMAIL" /> የሚተዳደረው በ<ph name="MANAGER" /> ነው። ይህን ኢሜል እንደ ተጨማሪ መለያ ማከል አይችሉም።<ph name="END_PARAGRAPH1" />
- <ph name="BEGIN_PARAGRAPH2" /><ph name="USER_EMAIL" />ን ለመጠቀም መጀመሪያ ከእርስዎ <ph name="DEVICE_TYPE" /> ዘግተው ይውጡ። ከዞያ በመግቢያ ገጽ ግርጌ ላይ ሰው አክልን ይምረጡ<ph name="END_PARAGRAPH2" /></translation>
+ <ph name="BEGIN_PARAGRAPH2" /><ph name="USER_EMAIL" />ን ለመጠቀም መጀመሪያ ከእርስዎ <ph name="DEVICE_TYPE" /> ዘግተው ይውጡ። ከዞያ በመግቢያ ገፅ ግርጌ ላይ ሰው አክልን ይምረጡ<ph name="END_PARAGRAPH2" /></translation>
<translation id="85486688517848470">የላይኛው ረድፍ ቁልፎች ባህሪን ለመቀየር የፍለጋ ቁልፉን ይያዙ</translation>
<translation id="8549316893834449916">ወደ የእርስዎን Chromebook ለመግባት የGoogle መለያዎን ይጠቀማሉ – ለGmail፣ Drive፣ YouTube እና ተጨማሪ የሚጠቀሙበት ተመሳሳዩ መለያ።</translation>
<translation id="8551388862522347954">ፍቃዶች</translation>
@@ -8403,7 +8403,7 @@ nil</translation>
<translation id="8581809080475256101">ወደፊት ለመሄድ ይጫኑ፣ ታሪክን ለማየት የአውድ ምናሌ</translation>
<translation id="8584280235376696778">&amp;ቪዲዮ በአዲስ ትር ክፈት</translation>
<translation id="8584427708066927472">የይለፍ ቃል ከዚህ መሣሪያ ተሰርዟል</translation>
-<translation id="8584843865238667486">ከአጠቃቀም ገጽ <ph name="USAGE_PAGE" /> አጠቃቀም <ph name="USAGE" /> ያላቸው የኤችአይዲ መሣሪያዎች</translation>
+<translation id="8584843865238667486">ከአጠቃቀም ገፅ <ph name="USAGE_PAGE" /> አጠቃቀም <ph name="USAGE" /> ያላቸው የኤችአይዲ መሣሪያዎች</translation>
<translation id="8585480574870650651">Crostiniን አስወግድ</translation>
<translation id="8585841788766257444">ከዚህ በታች የተዘረዘሩት ጣቢያዎች ከነባሪው ይልቅ ብጁ ቅንብርን ይከተላሉ</translation>
<translation id="8588866096426746242">የመገለጫ ስታቲስቲክስ</translation>
@@ -8484,7 +8484,7 @@ nil</translation>
<translation id="864892689521194669">የChromeOS Flex ባህሪያት እና አፈጻጸም እንዲሻሻል ያግዙ</translation>
<translation id="8649026945479135076">የሚጎበኟቸው ጣቢያዎች ልምድዎን ግላዊነት ማላበስ እንዲችሉ እርስዎ የሚፈልጓቸውን ነገሮች ማስታወስ የተለመደ ነው። እንዲሁም ጣቢያዎች ስለዝንባሌዎችዎ መረጃን በChrome አማካኝነት ማከማቸት ይችላሉ።</translation>
<translation id="8650543407998814195">ምንም እንኳ ከእንግዲህ የድሮ መገለጫዎን መድረስ ባይችሉም አሁንም ሊያስወግዱት ይችላሉ።</translation>
-<translation id="8651585100578802546">ይህ ገጽ እንደገና እንዲጀምር አስገድድ</translation>
+<translation id="8651585100578802546">ይህ ገፅ እንደገና እንዲጀምር አስገድድ</translation>
<translation id="8652400352452647993">የጥቅል ቅጥያ ስህተት</translation>
<translation id="8654151524613148204">ይህ ፋይል ኮምፒውተርዎ እንዳይሰራው በጣም ትልቅ ነው። እናዝናለን።</translation>
<translation id="8655295600908251630">ሰርጥ</translation>
@@ -8504,7 +8504,7 @@ nil</translation>
<translation id="866611985033792019">የኢሜይል ተጠቃሚዎችን ለመለየት ይህን የዕውቅና ማረጋገጫ እመን</translation>
<translation id="8666321716757704924">ለ<ph name="WEBSITE" /> ፈቃዶች እንደገና ተፈቅደዋል</translation>
<translation id="8666759526542103597">በአሳሽ ላይ የተመሰረተ ማስታወቂያን ግላዊነት ስለማላበስ</translation>
-<translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> አሁን ሙሉ ማያ ገጽ ነው፣ እናም የመዳፊትዎ ጠቋሚን አሰናክሎታል።</translation>
+<translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> አሁን ሙሉ ማያ ገፅ ነው፣ እናም የመዳፊትዎ ጠቋሚን አሰናክሎታል።</translation>
<translation id="8667760277771450375">ጣቢያዎች የማስታወቂያ አይፈለጌ መልዕክት እና መጭበርበርን እንዲያቆሙ እያስቻልን የጣቢያ ተሳጋሪ ክትትልን የምንገድብባቸውን መንገዶች እየሰስን ነው።</translation>
<translation id="8668378421690365723">የእርስዎ መሣሪያ ከእንግዲህ በትክክል ላይሰራ እና የደህንነት እና የአፈጻጸም ችግሮች ሊያጋጥሙዎት ይችላሉ።</translation>
<translation id="8669284339312441707">ይበልጥ ሞቅ ያለ</translation>
@@ -8535,7 +8535,7 @@ nil</translation>
<translation id="8694596275649352090">በእንቅልፍ ወይም ክዳኑ በተዘጋ ጊዜ ቆልፍ</translation>
<translation id="8695139659682234808">ከውቅረት በኋላ የወላጅ መቆጣጠሪያዎችን ያክሉ</translation>
<translation id="8695825812785969222">&amp;ቦታ ክፈት…</translation>
-<translation id="8698269656364382265">ወደ ቀዳሚው ማያ ገጽ ለመመለስ ከግራ ጎኑ ወደ ውስጥ ይጥረጉ።</translation>
+<translation id="8698269656364382265">ወደ ቀዳሚው ማያ ገፅ ለመመለስ ከግራ ጎኑ ወደ ውስጥ ይጥረጉ።</translation>
<translation id="869884720829132584">የመተግበሪያዎች ምናሌ</translation>
<translation id="869891660844655955">የሚያበቀበት ጊዜ</translation>
<translation id="8699188901396699995">ለ<ph name="PRINTER_NAME" /> PPD</translation>
@@ -8595,7 +8595,7 @@ nil</translation>
<translation id="8745034592125932220">ወደ መሣሪያዎ ውሂብ ለማስቀመጥ አልተፈቀደለትም</translation>
<translation id="8746654918629346731">«<ph name="EXTENSION_NAME" />»ን አስቀድመው ጠይቀዋል</translation>
<translation id="874689135111202667">{0,plural, =1{አንድ ፋይል ወደዚህ ጣቢያ ይሰቀል?}one{# ፋይሎች ወደዚህ ጣቢያ ይሰቀሉ?}other{# ፋይሎች ወደዚህ ጣቢያ ይሰቀሉ?}}</translation>
-<translation id="8749805710397399240">የእርስዎን ማያ ገጽ cast ማድረግ አልተቻለም። በሥርዓት ምርጫዎች ውስጥ የማያ ገጽ መቅጃ ፈቃድን ይፈትሹ።</translation>
+<translation id="8749805710397399240">የእርስዎን ማያ ገፅ cast ማድረግ አልተቻለም። በሥርዓት ምርጫዎች ውስጥ የማያ ገፅ መቅጃ ፈቃድን ይፈትሹ።</translation>
<translation id="8749826920799243530">መሣሪያ አልተመዘገበም</translation>
<translation id="8749863574775030885">ካልታወቀ አቅራቢ የመጡ የዩኤስቢ መሣሪያዎችን ይደርሳል</translation>
<translation id="8750155211039279868"><ph name="ORIGIN" /> ወደ ተከታታይ ወደብ ማገናኘት ይፈልጋል</translation>
@@ -8620,7 +8620,7 @@ nil</translation>
<translation id="8766796754185931010">Kotoeri</translation>
<translation id="8767621466733104912">Chromeን ለሁሉም ተጠቃሚዎች በራስ-ሰር አዘምን</translation>
<translation id="8770406935328356739">የቅጥያ ስርወ ማውጫ</translation>
-<translation id="8771300903067484968">የጅምር ገጽ ጀርባው ወደ ነባሪው ጀርባ ዳግም ተጀምሯል።</translation>
+<translation id="8771300903067484968">የጅምር ገፅ ጀርባው ወደ ነባሪው ጀርባ ዳግም ተጀምሯል።</translation>
<translation id="8773280816776735812">የአይቢኤኤን እሴትን አሳይ</translation>
<translation id="8773302562181397928"><ph name="PRINTER_NAME" />ን አስቀምጥ</translation>
<translation id="8774379074441005279">ወደነበረበት መመለስን ያረጋግጡ</translation>
@@ -8725,7 +8725,7 @@ nil</translation>
<translation id="8859402192569844210">የአገልግሎት ውሎች ሊጫኑ አልቻሉም</translation>
<translation id="8859662783913000679">የወላጅ መለያ</translation>
<translation id="8860973272057162405">{COUNT,plural, =1{{COUNT} መለያ}one{{COUNT} መለያ}other{{COUNT} መለያዎች}}</translation>
-<translation id="8861568709166518036">ወደ መነሻ ለመዳሰስ፣ ለመመለስ እና መተግበሪያዎችን ለመቀየርን በማያ ገጽ ላይ ያሉ አዝራሮችን ይጠቀሙ። ChromeVox ወይም የራስ-ሰር ጠቅ ማድረጊያዎች ከበራ በራስ-ሰር ይበራል።</translation>
+<translation id="8861568709166518036">ወደ መነሻ ለመዳሰስ፣ ለመመለስ እና መተግበሪያዎችን ለመቀየርን በማያ ገፅ ላይ ያሉ አዝራሮችን ይጠቀሙ። ChromeVox ወይም የራስ-ሰር ጠቅ ማድረጊያዎች ከበራ በራስ-ሰር ይበራል።</translation>
<translation id="8862003515646449717">ወደ ፈጣን አሳሽ ቀይር</translation>
<translation id="8863753581171631212">አገናኝ በአዲስ <ph name="APP" /> ውስጥ ክፈት</translation>
<translation id="8864055848767439877"><ph name="TAB_NAME" /> ለ <ph name="APP_NAME" /> በማጋራት ላይ</translation>
@@ -8872,7 +8872,7 @@ nil</translation>
<translation id="8993945059918628059">የጣት አሻራ ዳሳሹን በጣትዎ ይንኩት። የጣት አሻራዎ ውሂብ ደህንነቱ በተጠበቀ ሁኔታ ይከማቻል እና በጭራሽ ከእርስዎ <ph name="DEVICE_TYPE" /> አይወጣም።</translation>
<translation id="899403249577094719">የNetscape ሰርቲፊኬት መሰረት</translation>
<translation id="899657321862108550">የእርስዎ Chrome፣ በሁሉም ቦታ ላይ</translation>
-<translation id="8998078711690114234">ይህ የፋይል አይነት አደገኛ ሊሆን ይችላል። <ph name="ORIGIN" />ን የሚያምኑት ከሆነ ብቻ ይህን ፋይል ያስቀምጡ</translation>
+<translation id="8998078711690114234">ይህ የፋይል ዓይነት አደገኛ ሊሆን ይችላል። <ph name="ORIGIN" />ን የሚያምኑት ከሆነ ብቻ ይህን ፋይል ያስቀምጡ</translation>
<translation id="8999560016882908256">የክፍል አጻጻፍ ስህተት፦ <ph name="ERROR_LINE" /></translation>
<translation id="9000185763019430629">ከእርስዎ <ph name="DEVICE_TYPE" /> በቀኝ-እጅ በኩል ያለውን የጣት አሻራ ዳሳሹን ይንኩ። የጣት አሻራዎ ውሂብ ደህንነቱ በተጠበቀ ሁኔታ ይከማቻል እና በጭራሽ ከእርስዎ <ph name="DEVICE_TYPE" /> አይወጣም።</translation>
<translation id="9003185744423389627">ከመሣሪያ አስተዳደር አገልጋይ ጋር ያለው ግንኙነት <ph name="FAILURE_TIME" /> ላይ ከ«<ph name="STATUS_TEXT" />» ሁኔታ ጋር አልተሳካም</translation>
@@ -8880,10 +8880,10 @@ nil</translation>
<translation id="9003677638446136377">እንደገና ፈትሽ</translation>
<translation id="9004754973617721124">ለ<ph name="SITE_NAME" />፣ በእሱ ስር ላሉት ሁሉም ጣቢያዎች እና ለተጫነ ለእሱ መተግበሪያ የጣቢያ ውሂብ እና ፈቃዶች ይጽዱ?</translation>
<translation id="9008201768610948239">ችላ በል</translation>
-<translation id="9008201858626224558"><ph name="SUBPAGE_TITLE" /> የዝርዝሮች ገጽ መመለሻ አዝራር</translation>
+<translation id="9008201858626224558"><ph name="SUBPAGE_TITLE" /> የዝርዝሮች ገፅ መመለሻ አዝራር</translation>
<translation id="9008828754342192581">ከዚህ ቀደም ሁሉንም ቅጥያዎች በ<ph name="ORIGIN" /> ላይ ለመፍቀድ መርጠዋል</translation>
<translation id="9009369504041480176">በማስገባት ላይ (<ph name="PROGRESS_PERCENT" />%)...</translation>
-<translation id="9009708085379296446">ይህን ገጽ ለመለወጥ ፈልገው ነው?</translation>
+<translation id="9009708085379296446">ይህን ገፅ ለመለወጥ ፈልገው ነው?</translation>
<translation id="9011163749350026987">ሁልጊዜ አዶን አሳይ</translation>
<translation id="9011262023858991985">ይህን ትር cast በማድረግ ላይ</translation>
<translation id="9011393886518328654">የልቀት ማስታወሻዎች</translation>
@@ -8928,7 +8928,7 @@ nil</translation>
<translation id="9037965129289936994">የመጀመሪያውን አሳይ</translation>
<translation id="9038489124413477075">ያልተሰየመ አቃፊ</translation>
<translation id="9039014462651733343">{NUM_ATTEMPTS,plural, =1{አንድ ቀሪ ሙከራ አለዎት።}one{# ቀሪ ሙከራዎች አለዎት።}other{# ቀሪ ሙከራዎች አለዎት።}}</translation>
-<translation id="9040473193163777637">የChromeOS አብሮገነብ የማያ ገጽ አንባቢ የሆነውን ChromeVox ማግበር ይፈልጋሉ? የሚፈልጉ ከሆነ ሁለቱንም የድምጽ መጠን ቁልፎችን ለአምስት ሰከንዶች ተጭነው ይያዙ።</translation>
+<translation id="9040473193163777637">የChromeOS አብሮገነብ የማያ ገፅ አንባቢ የሆነውን ChromeVox ማግበር ይፈልጋሉ? የሚፈልጉ ከሆነ ሁለቱንም የድምጽ መጠን ቁልፎችን ለአምስት ሰከንዶች ተጭነው ይያዙ።</translation>
<translation id="9040661932550800571">ለ<ph name="ORIGIN" /> የይለፍ ቃል ይዘምን?</translation>
<translation id="9041692268811217999">ማሽንዎ ላይ የአካባቢያዊ ፋይሎች መዳረሻ በአስተዳዳሪዎ ተሰናክሏል</translation>
<translation id="904224458472510106">ይህ ክወና ሊቀለበስ አይችልም</translation>
@@ -9000,7 +9000,7 @@ nil</translation>
<translation id="9101691533782776290">መተግበሪያ አስጀምር</translation>
<translation id="9102610709270966160">ቅጥያውን አንቃ</translation>
<translation id="9102864637938129124">ጣቢያዎች እና አስተዋዋቂዎች የማስታወቂያዎች አፈጻጸም እንዴት እንደሆነ መረዳት ይችላሉ። ይህ ቅንብር በርቷል።</translation>
-<translation id="9103479157856427471">የጎላ ማያ ገጽ የቁልፍ ሰሌዳ ትኩረትን ይከተላል</translation>
+<translation id="9103479157856427471">የጎላ ማያ ገፅ የቁልፍ ሰሌዳ ትኩረትን ይከተላል</translation>
<translation id="9103868373786083162">ለመመለስ ይጫኑ፣ ታሪክን ለማየት የአውድ ምናሌ</translation>
<translation id="9108035152087032312">&amp;መስኮትን ሰይም...</translation>
<translation id="9108072915170399168">የአሁኑ የውሂብ አጠቃቀም ቅንብር ያለበይነመረብ ነው</translation>
@@ -9085,16 +9085,16 @@ nil</translation>
<translation id="9176476835295860688">የአጠቃቀም እና የምርመራ ውሂብ ይላኩ። ይህ መሣሪያ በአሁኑ ጊዜ በራስ-ሰር የምርመራ፣ የመሣሪያ እና የመተግበሪያ አጠቃቀም ውሂብ ወደ Google እየላከ ነው። ይህ የስርዓት እና የመተግበሪያ እርጋታን እና ሌሎች ማሻሻያዎችን ያግዛል። አንዳንድ ውሑድ ውሂብ እንዲሁም የGoogle መተግበሪያዎችን እና እንደ የAndroid ገንቢዎች ያሉ አጋሮችን ያግዛሉ። ይህ <ph name="BEGIN_LINK1" />ቅንብር<ph name="END_LINK1" /> በባለቤቱ ተፈጻሚ ይደረጋል። የእርስዎ የተጨማሪ ድር እና መተግበሪያ እንቅስቃሴ ቅንብር በርቶ ከሆነ ይህ ውሂብ በGoogle መለያዎ ላይ ሊቀመጥ ይችላል። <ph name="BEGIN_LINK2" />የበለጠ ለመረዳት<ph name="END_LINK2" /></translation>
<translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> - የብሉቱዝ መሣሪያ ተገናኝቷል</translation>
<translation id="9178061802301856367">የመለያ መግቢያ ውሂብን ይሰርዙ</translation>
-<translation id="9179524979050048593">የመግቢያ ገጽ ተጠቃሚ ስም</translation>
+<translation id="9179524979050048593">የመግቢያ ገፅ ተጠቃሚ ስም</translation>
<translation id="9180281769944411366">ይህ ሂደት ጥቂት ደቂቃዎችን ሊወስድ ይችላል። የLinux መያዣውን በመጀመር ላይ።</translation>
-<translation id="9180380851667544951">ጣቢያ የእርስዎን ማያ ገጽ ማጋራት ይችላል</translation>
+<translation id="9180380851667544951">ጣቢያ የእርስዎን ማያ ገፅ ማጋራት ይችላል</translation>
<translation id="9182556968660520230">ጣቢያዎች የተጠበቀ ይዘትን እንዲጫወቱ አይፍቀዱ</translation>
<translation id="9183331776983279456">Chrome ከ4 ሳምንታት በላይ የቆዩ ጣቢያዎችን በራስ-ሰር ይሰርዛል። እርስዎ እንደገና የጎበኙት ጣቢያ በዝርዝሩ ላይ እንደገና ሊታይ ይችላል። ወይም አንድ ጣቢያ ለእርስዎ ማስታወቂያዎችን እንዳይጠቁም ማገድ ይችላሉ።</translation>
<translation id="918352324374649435">{COUNT,plural, =1{መተግበሪያ}one{# መተግበሪያዎች}other{# መተግበሪያዎች}}</translation>
<translation id="9186963452600581158">በልጅ Google መለያ ይግቡ</translation>
<translation id="9187967020623675250">ቁልፎች አይዛመዱም። ለ<ph name="RESPONSE" /> ማንኛውንም ቁልፍ ይጫኑ።</translation>
<translation id="9188732951356337132">የአጠቃቀም እና የምርመራ ውሂብ ይላኩ። ይህ መሣሪያ በአሁኑ ጊዜ በራስ-ሰር የምርመራ፣ የመሣሪያ እና የመተግበሪያ አጠቃቀም ውሂብ ወደ Google እየላከ ነው። ይህ ልጅዎን ለመለየት ስራ ላይ አይውልም፣ እና የስርዓት እና የመተግበሪያ እርጋታን እና ሌሎች ማሻሻያዎችን ያግዛል። አንዳንድ ውሑድ ውሂብ እንዲሁም የGoogle መተግበሪያዎችን እና እንደ የAndroid ገንቢዎች ያሉ አጋሮችን ያግዛሉ። የተጨማሪ የድር እና መተግበሪያ እንቅስቃሴ ቅንብር ለልጅዎ በርቶ ከሆነ ይህ ውሂብ ወደ የGoogle መለያቸው ሊቀመጥ ይችላል። <ph name="BEGIN_LINK2" />የበለጠ ለመረዳት<ph name="END_LINK2" /></translation>
-<translation id="9192019773545828776">የመሣሪያዎን ማያ ገጽ ሳይመለከቱ መጠቀም እንዲችሉ የቃል ግብረመልስን ይስሙ። የብሬይል ግብረመልስ በተገናኘ መሣሪያ ይገኛል። ChromeVoxን ለማብራት እና ለማጥፋት Ctrl + Alt + Zን ይጠቀሙ። ለማሰስ Search + የግራ ቀስት ወይም የቀኝ ቀስትን ይጠቀሙ። ለመምረጥ (ማግበር) Search + Spaceን ይጠቀሙ።</translation>
+<translation id="9192019773545828776">የመሣሪያዎን ማያ ገፅ ሳይመለከቱ መጠቀም እንዲችሉ የቃል ግብረመልስን ይስሙ። የብሬይል ግብረመልስ በተገናኘ መሣሪያ ይገኛል። ChromeVoxን ለማብራት እና ለማጥፋት Ctrl + Alt + Zን ይጠቀሙ። ለማሰስ Search + የግራ ቀስት ወይም የቀኝ ቀስትን ይጠቀሙ። ለመምረጥ (ማግበር) Search + Spaceን ይጠቀሙ።</translation>
<translation id="919686179725692564">የእርስዎን መተግበሪያዎች ምትኬ ስለማስቀመጥ የበለጠ ይወቁ</translation>
<translation id="9198090666959937775">የ Android ስልክዎን እንደ ደህንነት ቁልፍ ይጠቀሙበት</translation>
<translation id="9199503643457729322">ከግላዊነት መመሪያ ለማሰስ ጠቅ ያድርጉ።</translation>
@@ -9102,12 +9102,12 @@ nil</translation>
<translation id="920045321358709304"><ph name="SEARCH_ENGINE" />ን ፈልግ</translation>
<translation id="9201023452444595544">ማናቸውም የመስመር ውጭ ውሂብ ይጸዳል</translation>
<translation id="9201117361710210082">ከዚህ ቀደም ታይቷል</translation>
-<translation id="9201220332032049474">የማያ ገጽ መቆለፊያ አማራጮች</translation>
+<translation id="9201220332032049474">የማያ ገፅ መቆለፊያ አማራጮች</translation>
<translation id="9201842707396338580">የሆነ ችግር ተፈጥሯል። እባክዎ የእርስዎን የመሣሪያ ባለቤት ወይም አስተዳዳሪ ያነጋግሩ። የስህተት ኮድ፦ <ph name="ERROR_CODE" />።</translation>
<translation id="9203398526606335860">&amp;መገለጫ መስራት ነቅቷል</translation>
<translation id="9203904171912129171">መሣሪያ ይምረጡ</translation>
<translation id="920410963177453528">ሌላ ፓነል ለመምረጥ ተቆልቋዩን ጠቅ ያድርጉ</translation>
-<translation id="9206889157914079472">ከማያ ገጽ ቁልፍ በስቲለስ ማስታወሻ መጻፍ</translation>
+<translation id="9206889157914079472">ከማያ ገፅ ቁልፍ በስቲለስ ማስታወሻ መጻፍ</translation>
<translation id="9209563766569767417">የLinux መያዣ ቅንብሩን በመፈተሽ ላይ</translation>
<translation id="9209689095351280025">ጣቢያዎች እርስዎን በመላ ድር ላይ የሚከታተሉ ኩኪዎችን መጠቀም አይችሉም</translation>
<translation id="9211177926627870898">ዝማኔ ያስፈልጋል</translation>
@@ -9132,7 +9132,7 @@ nil</translation>
<translation id="932327136139879170">መነሻ</translation>
<translation id="932508678520956232">ማተም ማስጀመር አልተቻለም።</translation>
<translation id="933427034780221291">{NUM_FILES,plural, =1{ይህ ፋይል ለደህንነት ፍተሻ በጣም ትልቅ ነው። እስከ 50 ሜባ የሚያህሉ ፋይሎችን መስቀል ይችላሉ።}one{አንዳንድ እነዚህ ፋይሎች ለደህንነት ፍተሻ በጣም ትልቅ ናቸው። እስከ 50 ሜባ የሚያህሉ ፋይሎችን መስቀል ይችላሉ።}other{አንዳንድ እነዚህ ፋይሎች ለደህንነት ፍተሻ በጣም ትልቅ ናቸው። እስከ 50 ሜባ የሚያህሉ ፋይሎችን መስቀል ይችላሉ።}}</translation>
-<translation id="93343527085570547">በሕግ ነክ ምክንያቶች የይዘት ለውጦችን ለመጠየቅ ወደ <ph name="BEGIN_LINK1" />ሕጋዊ እገዛ ገጽ<ph name="END_LINK1" /> ይሂዱ። አንዳንድ የመለያ እና የሥርዓት መረጃ ወደ Google ሊላክ ይችል ይሆናል። እርስዎ ለእኛ የሚሰጡንን መረጃ በእኛ <ph name="BEGIN_LINK2" />የግላዊነት መመሪያ<ph name="END_LINK2" /> እና <ph name="BEGIN_LINK3" />የአገልግሎት ውሎች<ph name="END_LINK3" /> መሠረት ቴክኒክ ችግሮችን መፍትሔ ለመስጠት እና የእኛን አገልግሎቶች ለማሻሻል እንዲያግዘን እንጠቀምበታለን።</translation>
+<translation id="93343527085570547">በሕግ ነክ ምክንያቶች የይዘት ለውጦችን ለመጠየቅ ወደ <ph name="BEGIN_LINK1" />ሕጋዊ እገዛ ገፅ<ph name="END_LINK1" /> ይሂዱ። አንዳንድ የመለያ እና የሥርዓት መረጃ ወደ Google ሊላክ ይችል ይሆናል። እርስዎ ለእኛ የሚሰጡንን መረጃ በእኛ <ph name="BEGIN_LINK2" />የግላዊነት መመሪያ<ph name="END_LINK2" /> እና <ph name="BEGIN_LINK3" />የአገልግሎት ውሎች<ph name="END_LINK3" /> መሠረት ቴክኒክ ችግሮችን መፍትሔ ለመስጠት እና የእኛን አገልግሎቶች ለማሻሻል እንዲያግዘን እንጠቀምበታለን።</translation>
<translation id="93393615658292258">የይለፍ ቃል ብቻ</translation>
<translation id="934244546219308557">ይህን ቡድን ይሰይሙ</translation>
<translation id="934503638756687833">ካስፈለገ እንዲሁም እዚህ ያልተዘረዘሩ ንጥሎች ሊወገዱ ይችላሉ። በChrome የግላዊነት ነጭ ወረቀት ላይ ስለ&lt;a href="<ph name="URL" />"&gt;የማይፈለግ ሶፍትዌር ጥበቃ&lt;/a&gt; የበለጠ ይረዱ።</translation>
@@ -9163,7 +9163,7 @@ nil</translation>
<translation id="963000966785016697">በ<ph name="VISUAL_SEARCH_PROVIDER" /> ምስልን ፈልግ</translation>
<translation id="964286338916298286">የእርስዎ የአይቲ አስተዳዳሪ Chrome Goodiesን ለመሣሪያዎ አሰናክሏል።</translation>
<translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{መተግበሪያ}one{መተግበሪያዎች}other{መተግበሪያዎች}}</translation>
-<translation id="964790508619473209">የማያ ገጽ አደራደር</translation>
+<translation id="964790508619473209">የማያ ገፅ አደራደር</translation>
<translation id="965211523698323809">ከእርስዎ <ph name="DEVICE_TYPE" /> ሆነው የጽሑፍ መልዕክቶችን ይላኩ እና ይቀበሉ። <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation>
<translation id="96535553604365597">Google Cast ላይ ያለውን ችግር ሪፖርት ያድርጉ</translation>
<translation id="967398046773905967">ማናቸውም ጣቢያዎች የHID መሣሪያዎችን እንዲደርሱ አይፍቀዱ</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_ar.xtb b/chromium/chrome/app/resources/generated_resources_ar.xtb
index d5fb215bdab..de71ad5a92a 100644
--- a/chromium/chrome/app/resources/generated_resources_ar.xtb
+++ b/chromium/chrome/app/resources/generated_resources_ar.xtb
@@ -1200,7 +1200,7 @@
<translation id="2048554637254265991">حدث خطأ في تشغيل مدير الحاويات. يُرجى إعادة المحاولة.</translation>
<translation id="2048653237708779538">الإجراء غير متاح</translation>
<translation id="204914487372604757">إنشاء اختصار</translation>
-<translation id="2050339315714019657">عمودي</translation>
+<translation id="2050339315714019657">وضع "بورتريه"</translation>
<translation id="2051555741181591333">إيقاف نقطة الاتصال تلقائيًا</translation>
<translation id="2052572566310583903">التطبيق مثبَّت على أجهزتك الأخرى.</translation>
<translation id="2053105195397337973">نستكشف طرقًا للحد من تتبّع البيانات ونشاط التصفّح، مع السماح للمواقع الإلكترونية بحظر الرسائل الإعلانية غير المرغوب فيها ومنع الاحتيال.</translation>
@@ -3255,7 +3255,7 @@
<translation id="3855676282923585394">إشارات وإعدادات الاستيراد...</translation>
<translation id="3856096718352044181">يُرجى إثبات صلاحية مقدّم الخدمة أو المحاولة مجددًا.</translation>
<translation id="3856800405688283469">اختيار منطقة زمنية</translation>
-<translation id="3857807444929313943">رفع الإصبع، ثم اللمس مرة أخرى</translation>
+<translation id="3857807444929313943">ارفع الإصبع، ثم المس أداة الاستشعار مرة أخرى</translation>
<translation id="3858860766373142691">الاسم</translation>
<translation id="385939467708172187">استخدام كلمة مرور قوية</translation>
<translation id="3861638017150647085">اسم المستخدم "<ph name="USERNAME" />" غير متوفر.</translation>
@@ -5940,7 +5940,7 @@
<translation id="6345878117466430440">وضع علامة "مقروءة"</translation>
<translation id="6347010704471250799">عرض إشعار</translation>
<translation id="634887995541211148">‏يتيح لك هذا الخيار إمكانية تشغيل حاوية Bruschetta على جهازك.</translation>
-<translation id="6349101878882523185">تثبيت <ph name="APP_NAME" /></translation>
+<translation id="6349101878882523185">تثبيت "<ph name="APP_NAME" />"</translation>
<translation id="6354918092619878358">‏منحنى SECG ناقص المقطع secp256r1‏ (aka ANSI X9.62 prime256v1‏، NIST P-256)</translation>
<translation id="635609604405270300">يُرجى إبقاء الجهاز مشغَّلاً</translation>
<translation id="63566973648609420">‏لا يمكن لأحد قراءة بياناتك المشفرة سوى من لديه عبارة المرور التي تستخدمها. ولا يتم إرسال عبارة المرور إلى شركة Google أو تخزينها لديها. إذا نسيت عبارة المرور أو رغبت في تغيير هذا الإعداد، فسيلزمك <ph name="BEGIN_LINK" />إعادة ضبط المزامنة<ph name="END_LINK" />.</translation>
@@ -7093,7 +7093,7 @@
<translation id="7403642243184989645">جارٍ تنزيل موارد</translation>
<translation id="7404065585741198296">‏توصيل هاتفك باستخدام كابل USB</translation>
<translation id="7405938989981604410">{NUM_HOURS,plural, =1{تم تفعيل ميزة "التحقّق من الأمان" قبل ساعة واحدة.}zero{تم تفعيل ميزة "التحقّق من الأمان" قبل {NUM_HOURS} ساعة.}two{تم تفعيل ميزة "التحقّق من الأمان" قبل ساعتَين ({NUM_HOURS}).}few{تم تفعيل ميزة "التحقّق من الأمان" قبل {NUM_HOURS} ساعات.}many{تم تفعيل ميزة "التحقّق من الأمان" قبل {NUM_HOURS} ساعة.}other{تم تفعيل ميزة "التحقّق من الأمان" قبل {NUM_HOURS} ساعة.}}</translation>
-<translation id="740624631517654988">تم منع النوافذ المنبثقة.</translation>
+<translation id="740624631517654988">تم حظر نافذة منبثقة.</translation>
<translation id="7406912950279255498">وضع "قلب الألوان"</translation>
<translation id="7407430846095439694">الاستيراد والربط</translation>
<translation id="7407504355934009739">يحظر معظم المستخدمين الإشعارات من هذا الموقع الإلكتروني.</translation>
@@ -7268,7 +7268,7 @@
<translation id="7557411183415085169">‏أوشكت مساحة التخزين في Linux على النفاد</translation>
<translation id="7559719679815339381">‏يُرجى الانتظار ...بينما يتم تحديث تطبيق Kiosk. لا تقم بإزالة جهاز USB.</translation>
<translation id="7560756177962144929">مزامنة <ph name="DEVICE_TYPE" /></translation>
-<translation id="7561196759112975576">دومًا</translation>
+<translation id="7561196759112975576">دائمًا</translation>
<translation id="7561982940498449837">إغلاق القائمة</translation>
<translation id="756445078718366910">فتح نافذة المتصفح</translation>
<translation id="7564847347806291057">إنهاء العملية</translation>
@@ -9092,7 +9092,7 @@
<translation id="9180281769944411366">‏قد تستغرق هذه العملية بضع دقائق. جارٍ بدء تشغيل حاوية نظام التشغيل Linux.</translation>
<translation id="9180380851667544951">يمكن للموقع الإلكتروني مشاركة شاشتك.</translation>
<translation id="9182556968660520230">عدم السماح للمواقع الإلكترونية بتشغيل المحتوى المحمي</translation>
-<translation id="9183331776983279456">‏يحذف Chrome تلقائيًا المواقع الإلكترونية التي مر عليها أكثر من 4 أسابيع. وقد يظهر في القائمة مرة أخرى أي موقع إلكتروني تكرِّر زيارته، أو يمكنك منع موقع إلكتروني من اقتراح إعلانات لك.</translation>
+<translation id="9183331776983279456">‏يحذف Chrome تلقائيًا المواقع الإلكترونية التي مر عليها أكثر من 4 أسابيع. وقد يظهر في القائمة مجددًا أي موقع إلكتروني تكرِّر زيارته. يمكنك أيضًا منع موقع إلكتروني معيّن من اقتراح إعلانات لك.</translation>
<translation id="918352324374649435">{COUNT,plural, =1{تطبيق واحد}zero{# تطبيق}two{تطبيقان}few{# تطبيقات}many{# تطبيقًا}other{# تطبيق}}</translation>
<translation id="9186963452600581158">‏تسجيل الدخول باستخدام حساب طفل على Google</translation>
<translation id="9187967020623675250">مفاتيح التحكّم غير متطابقة. يمكنك الضغط على أي مفتاح لاختيار <ph name="RESPONSE" />.</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_as.xtb b/chromium/chrome/app/resources/generated_resources_as.xtb
index 2569faced93..f723fe7f1ca 100644
--- a/chromium/chrome/app/resources/generated_resources_as.xtb
+++ b/chromium/chrome/app/resources/generated_resources_as.xtb
@@ -136,7 +136,7 @@
<translation id="1116639326869298217">আপোনাৰ পৰিচয় সত্যাপন কৰিব পৰা নগ'ল</translation>
<translation id="1116694919640316211">ইয়াৰ বিষয়ে</translation>
<translation id="1116779635164066733">এই ছেটিংটো "<ph name="NAME" />" এক্সটেনশ্বনৰ জৰিয়তে বলৱৎ কৰা হৈছে।</translation>
-<translation id="1118738876271697201">ছিষ্টেমটোৱে ডিভাইচৰ ম'ডেল আৰু ক্ৰমিক নম্বৰ নিৰ্ধাৰণ কৰিব নোৱাৰিলে।</translation>
+<translation id="1118738876271697201">ছিষ্টেমটোৱে ডিভাইচৰ মডেল আৰু ক্ৰমিক নম্বৰ নিৰ্ধাৰণ কৰিব নোৱাৰিলে।</translation>
<translation id="1119447706177454957">আভ্যন্তৰীণ আসোঁৱাহ</translation>
<translation id="1122068467107743258">কৰ্মস্থান</translation>
<translation id="1122198203221319518">&amp;সঁজুলি</translation>
@@ -1544,7 +1544,7 @@
<translation id="2316129865977710310">নালাগে, ধন্যবাদ</translation>
<translation id="2317842250900878657"><ph name="PROGRESS_PERCENT" />% হ'ল</translation>
<translation id="2318143611928805047">কাগজৰ আকাৰ</translation>
-<translation id="2318817390901984578">Android এপ্ ব্যৱহাৰ কৰিবলৈ আপোনাৰ <ph name="DEVICE_TYPE" /> চ্চাৰ্জ আৰু আপডে'ট কৰক।</translation>
+<translation id="2318817390901984578">Android এপ্ ব্যৱহাৰ কৰিবলৈ আপোনাৰ <ph name="DEVICE_TYPE" /> চাৰ্জ আৰু আপডে'ট কৰক।</translation>
<translation id="2319459402137712349">কীব’ৰ্ডখন খুলিবলৈ এটা পাঠ ক্ষেত্ৰ বাছনি কৰক। আপুনি আপোনাৰ স্ক্ৰীনখনৰ তলফালে থকা কীব’ৰ্ডখনো বাছনি কৰিব পাৰে।</translation>
<translation id="2319993584768066746">ছাইন-ইন স্ক্ৰীনৰ ফট'সমূহ</translation>
<translation id="2322193970951063277">হে’ডাৰ আৰু ফুটাৰ</translation>
@@ -1959,7 +1959,7 @@
<translation id="2688196195245426394">ডিভাইচটো ছার্ভাৰৰ সৈতে পঞ্জীয়ন কৰোঁতে আসোঁৱাহ হৈছে: <ph name="CLIENT_ERROR" />।</translation>
<translation id="2688734475209947648">আপুনি এই পাছৱৰ্ডটো মনত ৰখাৰ প্ৰয়োজন নহ’ব। এইটো <ph name="ACCOUNT" />ৰ Google পাছৱৰ্ড পৰিচালকত ছেভ কৰা হ’ব।</translation>
<translation id="2690024944919328218">ভাষাৰ বিকল্প দেখুৱাওক</translation>
-<translation id="2691385045260836588">ম’ডেল</translation>
+<translation id="2691385045260836588">মডেল</translation>
<translation id="2691440343905273290">ইনপুট ছেটিং সলনি কৰক</translation>
<translation id="2693176596243495071">আমি দুঃখিত! কোনো অজ্ঞাত আসোঁৱাহ হৈছে। অনুগ্ৰহ কৰি পাছত আকৌ চেষ্টা কৰক বা সমস্যাটো যদি হৈয়েই থাকে, নিজৰ প্ৰশাসকৰ সৈতে যোগাযোগ কৰক।</translation>
<translation id="2698147581454716013">এইটো এটা বাণ্ডল কৰা ডিভাইচ আৰু ইয়াক কিঅ’স্ক আৰু ছাইনেজ আপগ্ৰে’ডৰ সৈতে পঞ্জীয়ন কৰিব নোৱাৰি।</translation>
@@ -3681,7 +3681,7 @@
<translation id="4253183225471855471">কোনো নেটৱৰ্ক বিচাৰি পোৱা নগ’ল। অনুগ্ৰহ কৰি আপোনাৰ ছিমখন ভৰাওক আৰু পুনৰ চেষ্টা কৰাৰ আগতে আপোনাৰ ডিভাইচটো ৰিবুট কৰক।</translation>
<translation id="4254414375763576535">ডাঙৰ পইণ্টাৰ</translation>
<translation id="4254813446494774748">অনুবাদৰ ভাষা:</translation>
-<translation id="425573743389990240">চ্চাৰ্জ খৰচ হোৱাৰ হাৰ ৱাট এককত ( ঋণাত্মক মানে বেটাৰী চ্চার্জ হৈ থকাটো বুজাব)</translation>
+<translation id="425573743389990240">চাৰ্জ খৰচ হোৱাৰ হাৰ ৱাট এককত ( ঋণাত্মক মানে বেটাৰী চ্চার্জ হৈ থকাটো বুজাব)</translation>
<translation id="4256316378292851214">ডিডিঅ’ ছে&amp;ভ কৰাৰ বিকল্প...</translation>
<translation id="4258348331913189841">ফাইলৰ ছিষ্টেম</translation>
<translation id="4259388776256904261">এইটোৰ বাবে কিছু সময় লাগিব পাৰে</translation>
@@ -4786,7 +4786,7 @@
<translation id="5281013262333731149">ইয়াত খোল খায়: <ph name="OPEN_BROWSER" /></translation>
<translation id="528208740344463258">Android এপ্‌ ডাউনল’ড কৰি ব্যৱহাৰ কৰিবলৈ আপুনি প্ৰথমতে প্ৰয়োজনীয় আপডে’টসমূহ ইনষ্টল কৰিব লাগিব। <ph name="DEVICE_TYPE" /> আপডে’ট হৈ থকা সময়ত আপুনি এইটো ব্যৱহাৰ কৰিব নোৱাৰে। ইনষ্টল হোৱা সম্পূৰ্ণ হ’লে আপোনাৰ <ph name="DEVICE_TYPE" /> ৰিষ্টাৰ্ট হ’ব।</translation>
<translation id="5282733140964383898">"ট্ৰেক নকৰিব" সুবিধাটো সক্ষম কৰা মানে আপোনাৰ ব্ৰাজিং ট্ৰেফিকৰ সৈতে এটা অনুৰোধ অন্তর্ভুক্ত কৰা হ’ব। কোনো ৱেবছাইটে অনুৰোধটোক সঁহাৰি জনোৱা বা নজনোৱা আৰু অনুৰোধটো কেনেকৈ কার্যকৰী কৰে তাৰ ওপৰত ফলাফলসমূহ নির্ভৰ কৰে। উদাহৰণস্বৰূপে, কিছুমান ৱেবছাইটে আপোনাক আপুনি চোৱা অন্য ৱেবছাইটসমূহৰ ভিত্তিক নোহোৱা কিছুমান বিজ্ঞাপন প্ৰদর্শন কৰি এই অনুৰোধলৈ সঁহাৰি জনাব পাৰে। বহুতো ৱেবছাইটে তথাপিও আপোনাৰ ব্ৰাউজিং ডেটা সংগ্ৰহ আৰু ব্যৱহাৰ কৰিব - উদাহৰণস্বৰূপে সুৰক্ষা উন্নত কৰিবলৈ, সমল যোগান ধৰিবলৈ, সেই ৱেবছাইটসমূহত সেৱা, বিজ্ঞাপন আৰু চুপাৰিছসমূহ প্ৰদান কৰিবলৈ আৰু ৰিপর্টিং কৰা পৰিসংখ্যা সৃষ্টি কৰিবলৈ ডেটা সংগ্ৰহ আৰু ব্যৱহাৰ কৰিব। <ph name="BEGIN_LINK" />অধিক জানক<ph name="END_LINK" /></translation>
-<translation id="5283677936944177147">আমি দুঃখিত! ছিষ্টেমটোৱে ডিভাইচৰ ম'ডেল আৰু ক্ৰমিক নম্বৰ নিৰ্ধাৰণ কৰিব নোৱাৰিলে।</translation>
+<translation id="5283677936944177147">আমি দুঃখিত! ছিষ্টেমটোৱে ডিভাইচৰ মডেল আৰু ক্ৰমিক নম্বৰ নিৰ্ধাৰণ কৰিব নোৱাৰিলে।</translation>
<translation id="5284445933715251131">ডাউনল’ড কৰি থকাটো অব্যাহত ৰাখক</translation>
<translation id="5285635972691565180"><ph name="DISPLAY_ID" /> প্ৰদৰ্শন কৰক</translation>
<translation id="5286194356314741248">স্কেন কৰি থকা হৈছে</translation>
@@ -6617,7 +6617,7 @@
আপুনি কাৰ্ড মেনুৰ পৰা ছেটিং পৰিচালনা কৰিব পাৰে অথবা Chrome কাষ্টমাইজ কৰকত অধিক বিকল্প চাব পাৰে।</translation>
<translation id="6949089178006131285">ChromeOS Flex নেটৱৰ্কৰ তথ্য পঢ়া</translation>
<translation id="6949434160682548041">পাছৱর্ড (ঐচ্ছিক)</translation>
-<translation id="6950627417367801484">এপসমূহ পুনঃস্থাপন কৰক</translation>
+<translation id="6950627417367801484">এপ্‌সমূহ পুনঃস্থাপন কৰক</translation>
<translation id="6952242901357037157">আপুনি ইয়াত নিজৰ <ph name="BEGIN_LINK" />Google একাউণ্ট<ph name="END_LINK" />ৰ পৰা পাছৱৰ্ডসমূহো দেখুৱাব পাৰে</translation>
<translation id="6954936693361896459">তাৰ পৰিৱৰ্তে এই টেবটো কাষ্ট কৰক</translation>
<translation id="6955446738988643816">পপআপ পৰীক্ষা কৰক</translation>
@@ -6889,7 +6889,7 @@
<translation id="7203150201908454328">বিস্তাৰিত</translation>
<translation id="720715819012336933">{NUM_PAGES,plural, =1{পৃষ্ঠাৰ বাহিৰ হওক}one{পৃষ্ঠাসমূহৰ বাহিৰ হওক}other{পৃষ্ঠাসমূহৰ বাহিৰ হওক}}</translation>
<translation id="7207457272187520234">ব্যৱহাৰ আৰু ডায়েগন’ষ্টিক ডেটা পঠিয়াওক। এই ডিভাইচটোৱে বর্তমান স্বয়ংক্ৰিয়ভাৱে Googleলৈ ডায়েগন’ষ্টিক, ডিভাইচ আৰু এপ্ ব্যৱহাৰৰ ডেটা পঠিয়াই আছে। এই কার্যটোৱে ছিষ্টেম আৰু এপৰ স্থিৰতা আৰু অন্য উন্নয়নত সহায় কৰিব। কিছুমান একত্ৰিত ডেটাই Google এপ্‌ আৰু Android বিকাশকৰ্তাৰ দৰে অংশীদাৰকো সহায় কৰিব। এই ছেটিংটো গৰাকীয়ে বলৱৎ কৰিছে। যদি আপোনাৰ অতিৰিক্ত ৱেব আৰু এপৰ কার্যকলাপৰ ছেটিংটো অন কৰা হয় তেন্তে এই ডেটাখিনি আপোনাৰ Google একাউণ্টত ছেভ কৰা হ’ব পাৰে।</translation>
-<translation id="7207631048330366454">এপসমূহ সন্ধান কৰক</translation>
+<translation id="7207631048330366454">এপ্‌সমূহ সন্ধান কৰক</translation>
<translation id="7210471695184432500">এই ডিভাইচটোত Google Password Managerলৈ পাছৱৰ্ড আমদানি কৰিবলৈ, এটা CSV ফাইল বাছনি কৰক</translation>
<translation id="7210499381659830293">এক্সটেনশ্বন প্ৰিণ্টাৰ</translation>
<translation id="7211783048245131419">এই পৰ্যন্ত কোনো ছুইচ আবণ্টন কৰা হোৱা নাই</translation>
@@ -7239,7 +7239,7 @@
<translation id="7528224636098571080">নুখুলিব</translation>
<translation id="7529411698175791732">আপোনাৰ ইণ্টাৰনেট সংযোগ পৰীক্ষা কৰক। তথাপিও যদি সমস্যাটো থাকেই, ছাইন আউট কৰি পুনৰ ছাইন ইন কৰি চাওক।</translation>
<translation id="7529876053219658589">{0,plural, =1{অতিথিৰ ৱিণ্ড’ বন্ধ কৰক}one{অতিথিৰ ৱিণ্ড’ বন্ধ কৰক}other{অতিথিৰ ৱিণ্ড’ বন্ধ কৰক}}</translation>
-<translation id="7530016656428373557">চ্চাৰ্জ খৰচ হোৱাৰ হাৰ ৱাট এককত</translation>
+<translation id="7530016656428373557">চাৰ্জ খৰচ হোৱাৰ হাৰ ৱাট এককত</translation>
<translation id="7531310913436731628">Mac ছিষ্টেম অগ্ৰাধিকাৰসমূহত অৱস্থান অফ কৰা আছে</translation>
<translation id="7531771599742723865">ডিভাইচটো ব্যৱহাৰ হৈ আছে</translation>
<translation id="7531779363494549572">ছেটিংসমূহ &gt; এপ্ আৰু জাননী &gt; জাননী-লৈ যাওক</translation>
@@ -7440,7 +7440,7 @@
<translation id="7702907602086592255">ড’মেইন</translation>
<translation id="7704305437604973648">কাৰ্য</translation>
<translation id="7704521324619958564">Play Store খোলক</translation>
-<translation id="7705276765467986571">বুকমাৰ্ক ম’ডেল ল’ড কৰিব পৰা নগ’ল৷</translation>
+<translation id="7705276765467986571">বুকমাৰ্ক মডেল ল’ড কৰিব পৰা নগ’ল৷</translation>
<translation id="7705334495398865155">অন্যই এই ডিভাইচটো ট্ৰেক কৰাটো প্ৰতিহত কৰিবলৈ আপোনাৰ হাৰ্ডৱেৰৰ আইডি (BSSID) যাদৃচ্ছিক কৰক।</translation>
<translation id="7705524343798198388">VPN</translation>
<translation id="7707108266051544351">এই ছাইটটোক ম'শ্বন ছেন্সৰসমূহ ব্যৱহাৰ কৰাৰ পৰা অৱৰোধ কৰা হৈছে।</translation>
@@ -7736,7 +7736,7 @@
<translation id="7961015016161918242">কেতিয়াও নহয়</translation>
<translation id="7963001036288347286">টাচ্‌পেডৰ এক্সিলাৰেশ্বন</translation>
<translation id="7963608432878156675">ব্লুটুথ আৰু নেটৱৰ্ক সংযোগৰ বাবে এই নামটো অন্য ডিভাইচসমূহে দেখা পায়</translation>
-<translation id="7963826112438303517">আপোনাৰ Assistantএ এই ৰেকর্ডিংসমূহ আৰু আপোনাৰ কথিত অনুৰোধসমূহ আপোনাৰ কণ্ঠধ্বনিৰ ম’ডেল সৃষ্টি কৰিবলৈ ব্যৱহাৰ কৰে, যিটো কেৱল আপোনাৰ কণ্ঠধ্বনি মিলোৱা সুবিধাটো অন কৰি ৰখা ডিভাইচসমূহত ষ্ট’ৰ কৰা হয়। Assistantৰ ছেটিংসমূহ-ত কণ্ঠধ্বনি চাওক বা পুনৰাই প্ৰশিক্ষণ দিয়ক।</translation>
+<translation id="7963826112438303517">আপোনাৰ Assistantএ এই ৰেকর্ডিংসমূহ আৰু আপোনাৰ কথিত অনুৰোধসমূহ আপোনাৰ কণ্ঠধ্বনিৰ মডেল সৃষ্টি কৰিবলৈ ব্যৱহাৰ কৰে, যিটো কেৱল আপোনাৰ কণ্ঠধ্বনি মিলোৱা সুবিধাটো অন কৰি ৰখা ডিভাইচসমূহত ষ্ট’ৰ কৰা হয়। Assistantৰ ছেটিংসমূহ-ত কণ্ঠধ্বনি চাওক বা পুনৰাই প্ৰশিক্ষণ দিয়ক।</translation>
<translation id="7966241909927244760">প্ৰতিচ্ছবিৰ ঠিকনা প্ৰ&amp;তিলিপি কৰক</translation>
<translation id="7966571622054096916">{COUNT,plural, =1{বুকমাৰ্কৰ তালিকাত ১ টা বস্তু আছে}one{বুকমাৰ্কৰ তালিকাত {COUNT} টা বস্তু আছে}other{বুকমাৰ্কৰ তালিকাত {COUNT} টা বস্তু আছে}}</translation>
<translation id="7968072247663421402">প্ৰদানকাৰীৰ বিকল্পসমূহ</translation>
@@ -8317,7 +8317,7 @@
<translation id="8487678622945914333">জুম ইন কৰক</translation>
<translation id="8487699605742506766">হটস্পট</translation>
<translation id="8489156414266187072">ব্যক্তিগত পৰামৰ্শসমূহ কেৱল আপোনাৰ একাউণ্টত দেখুওৱা হয়</translation>
-<translation id="8490896350101740396">তলৰ কিঅ’স্ক এপসমূহ "<ph name="UPDATED_APPS" />" আপডে’ট কৰা হৈছে। আপডে’টৰ প্ৰক্ৰিয়া সম্পূর্ণ কৰিবলৈ ডিভাইচটো ৰিবুট কৰক।</translation>
+<translation id="8490896350101740396">তলৰ কিঅ’স্ক এপ্‌সমূহ "<ph name="UPDATED_APPS" />" আপডে’ট কৰা হৈছে। আপডে’টৰ প্ৰক্ৰিয়া সম্পূর্ণ কৰিবলৈ ডিভাইচটো ৰিবুট কৰক।</translation>
<translation id="8492822722330266509">ছাইটসমূহে পপ-আপ পঠিয়াব আৰু ৰিডাইৰেক্টসমূহ ব্যৱহাৰ কৰিব পাৰে</translation>
<translation id="8492960370534528742">Google Castৰ মতামত</translation>
<translation id="8493236660459102203">মাইক্ৰ'ফ'ন:</translation>
@@ -8328,7 +8328,7 @@
<translation id="8498395510292172881">Chromeতে পঢ়ি থাকক</translation>
<translation id="8499083585497694743">মাইক্ৰ’ফ’ন আনমিউট কৰক</translation>
<translation id="8499526927826495298"><ph name="BEGIN_LINK1" />স্বয়ংক্ৰিয়ভাৱে পূৰ হোৱা মেটাডেটা<ph name="END_LINK1" /> পঠিয়াওক</translation>
-<translation id="8502536196501630039">Google Playৰ এপসমূহ ব্যৱহাৰ কৰিবলৈ, আপুনি প্ৰথমে আপোনাৰ এপসমূহ পুনঃস্থাপন কৰিবই লাগিব৷ কিছুমান ডেটা হেৰুৱাব লগা হ’ব পাৰে৷</translation>
+<translation id="8502536196501630039">Google Playৰ এপ্‌সমূহ ব্যৱহাৰ কৰিবলৈ, আপুনি প্ৰথমে আপোনাৰ এপ্‌সমূহ পুনঃস্থাপন কৰিবই লাগিব৷ কিছুমান ডেটা হেৰুৱাব লগা হ’ব পাৰে৷</translation>
<translation id="8503813439785031346">ব্যৱহাৰকাৰীৰ নাম</translation>
<translation id="850382998924680137">আজি চাইছে</translation>
<translation id="8507227974644337342">স্ক্ৰীনৰ ৰিজ’লিউশ্বন</translation>
@@ -8816,7 +8816,7 @@
<translation id="8945274638472141382">চিহ্নৰ আকাৰ</translation>
<translation id="8946359700442089734">ডিবাগিঙৰ সুবিধাসমূহ এই <ph name="IDS_SHORT_PRODUCT_NAME" /> ডিভাইচটোত সম্পূৰ্ণৰূপে সক্ষম কৰা হোৱা নাছিল।</translation>
<translation id="894763922177556086">উন্নত মানৰ</translation>
-<translation id="8948939328578167195"><ph name="WEBSITE" />এ আপোনাৰ সুৰক্ষা সম্পৰ্কীয় চাবিৰ মেক আৰু ম'ডেল চাব বিচাৰিছে</translation>
+<translation id="8948939328578167195"><ph name="WEBSITE" />এ আপোনাৰ সুৰক্ষা সম্পৰ্কীয় চাবিৰ মেক আৰু মডেল চাব বিচাৰিছে</translation>
<translation id="895054485242522631">ছাইটসমূহে ম'শ্বন ছেন্সৰ ব্যৱহাৰ কৰিব পাৰে</translation>
<translation id="8951256747718668828">কোনো আসোঁৱাহৰ বাবে পুনঃস্থাপন সম্পূৰ্ণ কৰিব পৰা নগ'ল</translation>
<translation id="8951465597020890363">যিকোনো প্ৰকাৰে অতিথি ম’ডৰ পৰা বাহিৰ হ’বনে?</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_az.xtb b/chromium/chrome/app/resources/generated_resources_az.xtb
index 40c46563c81..8983d940eb8 100644
--- a/chromium/chrome/app/resources/generated_resources_az.xtb
+++ b/chromium/chrome/app/resources/generated_resources_az.xtb
@@ -6699,7 +6699,7 @@ Daha # oğurlanmış parolunuz var. Google Parol Meneceri bu parolları indi yox
<translation id="7022562585984256452">Əsas səhifəniz ayarlandı.</translation>
<translation id="7025082428878635038">Jestlərlə naviqasiyanın yeni yolu ilə tanış olun</translation>
<translation id="7025190659207909717">Mobil data xidmətini idarə edin</translation>
-<translation id="7025895441903756761">Güvənlik və Məxfilik</translation>
+<translation id="7025895441903756761">Güvənlik və məxfilik</translation>
<translation id="7027258625819743915">{COUNT,plural, =0{Hamısını &amp;Anonim Pəncərədə Açın}=1{&amp;Anonim Pəncərədə Açın}other{Hamısını ({COUNT}) &amp;Anonim Pəncərədə Açın}}</translation>
<translation id="7029307918966275733">Crostini quraşdırılmayıb. Kreditlərə baxmaq üçün Crostini'ni quraşdırın.</translation>
<translation id="7029809446516969842">Parollar</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_be.xtb b/chromium/chrome/app/resources/generated_resources_be.xtb
index abe68198b49..c4be410e4a3 100644
--- a/chromium/chrome/app/resources/generated_resources_be.xtb
+++ b/chromium/chrome/app/resources/generated_resources_be.xtb
@@ -1199,7 +1199,7 @@
<translation id="2048554637254265991">Памылка запуску менеджара кантэйнераў. Паўтарыце спробу.</translation>
<translation id="2048653237708779538">Дзеянне недаступнае</translation>
<translation id="204914487372604757">Стварыць ярлык</translation>
-<translation id="2050339315714019657">Кніжная арыентацыя</translation>
+<translation id="2050339315714019657">Партрэт</translation>
<translation id="2051555741181591333">Аўтаматычна адключаць хот-спот</translation>
<translation id="2052572566310583903">Усталявана на іншых вашых прыладах</translation>
<translation id="2053105195397337973">Мы апрабоўваем спосабы, якія дазваляюць абмяжоўваць механізмы адсочвання паводзін і дапамагаюць сайтам спыняць рассылку рэкламнага спама і прадухіляць махлярства.</translation>
@@ -3833,7 +3833,7 @@
<translation id="4404843640767531781">Бацькі заблакіравалі праграму "<ph name="APP_NAME" />" – запытайце ў іх дазвол на яе выкарыстанне.</translation>
<translation id="4405117686468554883">*.jpeg, *.jpg, *.png</translation>
<translation id="4405224443901389797">Перамясціць у…</translation>
-<translation id="4406883609789734330">Імгненныя субцітры</translation>
+<translation id="4406883609789734330">Аўтаматычныя субцітры</translation>
<translation id="4407039574263172582">Каб працягнуць, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> абагуліць ваша імя, адрас электроннай пошты і відарыс профілю з гэтым сайтам. Азнаёмцеся з <ph name="BEGIN_LINK" />умовамі выкарыстання<ph name="END_LINK" /> сайта.</translation>
<translation id="4408599188496843485">Да&amp;ведка</translation>
<translation id="4409271659088619928">Ваша пошукавая сістэма – <ph name="DSE" />. Каб выдаліць гісторыю пошуку, выканайце інструкцыі гэтай сістэмы (калі яны даступныя).</translation>
@@ -9080,7 +9080,7 @@
<translation id="9180281769944411366">Гэты працэс можа заняць некалькі хвілін. Ідзе запуск кантэйнера Linux.</translation>
<translation id="9180380851667544951">Сайт можа абагульваць ваш экран</translation>
<translation id="9182556968660520230">Не дазваляць сайтам прайграваць абароненае змесціва</translation>
-<translation id="9183331776983279456">Chrome аўтаматычна выдаляе сайты, наведаныя больш чым 4 тыдні таму назад. Сайт, які вы наведаеце паўторна, можа з'явіцца ў спісе зноў. Вы таксама можаце забараніць сайту прапаноўваць вам рэкламу, заблакіраваўшы яго.</translation>
+<translation id="9183331776983279456">Chrome аўтаматычна выдаляе сайты, наведаныя больш чым за 4 тыдні таму. Сайт, які вы наведаеце паўторна, можа з'явіцца ў спісе зноў. Вы таксама можаце забараніць сайту прапаноўваць вам рэкламу, заблакіраваўшы яго.</translation>
<translation id="918352324374649435">{COUNT,plural, =1{Праграма}one{# праграма}few{# праграмы}many{# праграм}other{# праграмы}}</translation>
<translation id="9186963452600581158">Увайсці праз Уліковы запіс Google дзіцяці</translation>
<translation id="9187967020623675250">Клавішы не супадаюць Каб <ph name="RESPONSE" />, націсніце любую клавішу.</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_bg.xtb b/chromium/chrome/app/resources/generated_resources_bg.xtb
index 8fad2164c64..10b29ec40fe 100644
--- a/chromium/chrome/app/resources/generated_resources_bg.xtb
+++ b/chromium/chrome/app/resources/generated_resources_bg.xtb
@@ -366,7 +366,7 @@
<translation id="1324106254079708331">Предпазва личните профили в Google на всички хора, които са изложени на риск от насочени атаки</translation>
<translation id="1327272175893960498">Пропуски за Kerberos</translation>
<translation id="1327495825214193325">За да активирате отстраняването на грешки през ADB, трябва да рестартирате това устройство <ph name="DEVICE_TYPE" />. За деактивирането му е необходимо да бъдат възстановени фабричните настройки.</translation>
-<translation id="1327527584824210101">Използвайте кода си за достъп</translation>
+<translation id="1327527584824210101">Използвайте ключа си за достъп</translation>
<translation id="1327794256477341646">Функциите, които изискват достъп до местоположението ви, няма да работят</translation>
<translation id="1329466763986822896">Подобряване на поверителността за тази точка за достъп</translation>
<translation id="1331977651797684645">Това бях аз.</translation>
@@ -1204,7 +1204,7 @@
<translation id="2048554637254265991">Грешка при стартирането на мениджъра на контейнерите. Моля, опитайте отново.</translation>
<translation id="2048653237708779538">Действието не може да се извърши</translation>
<translation id="204914487372604757">Създаване на пряк път</translation>
-<translation id="2050339315714019657">Вертикално</translation>
+<translation id="2050339315714019657">Портрет</translation>
<translation id="2051555741181591333">Автоматично деактивиране на точката за достъп</translation>
<translation id="2052572566310583903">Инсталирани на другите ви устройства</translation>
<translation id="2053105195397337973">Проучваме начини да ограничим проследяването, като същевременно даваме възможност на сайтовете да спират нежеланите реклами и измамите.</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_bn.xtb b/chromium/chrome/app/resources/generated_resources_bn.xtb
index 02ed3490166..9a262dbd294 100644
--- a/chromium/chrome/app/resources/generated_resources_bn.xtb
+++ b/chromium/chrome/app/resources/generated_resources_bn.xtb
@@ -3908,7 +3908,7 @@
<translation id="4451757071857432900">সাইটে থাকা ব্যাঘাত সৃষ্টিকারী বা বিভ্রান্তিকর বিজ্ঞাপন ব্লক করা হয়েছে (প্রস্তাবিত)</translation>
<translation id="4452898361839215358">অথবা PPD বেছে নিন। <ph name="LINK_BEGIN" />আরও জানুন<ph name="LINK_END" /></translation>
<translation id="4453430595102511050">আপনার কীবোর্ডের উপরের ডানদিকের কোণে থাকা ফিঙ্গারপ্রিন্ট সেন্সর টাচ করুন। আপনার ফিঙ্গারপ্রিন্ট ডেটা সুরক্ষিতভাবে স্টোর করে রাখা হয় এবং তা <ph name="DEVICE_TYPE" /> থেকে কখনও শেয়ার করা হয় না।</translation>
-<translation id="4453946976636652378"><ph name="SEARCH_ENGINE_NAME" />-এ সার্চ করুন অথবা ইউআরএল টাইপ করুন</translation>
+<translation id="4453946976636652378"><ph name="SEARCH_ENGINE_NAME" />-এ সার্চ করুন অথবা URL টাইপ করুন</translation>
<translation id="4458535500699390320">এই ট্যাবটি ইনঅ্যাক্টিভ থাকাকালীন, মেমরি সেভার অন্যান্য টাস্কের জন্য মেমরি খালি করে। আপনি সেটিংস থেকে এটি যেকোনও সময় পরিবর্তন করতে পারেন।</translation>
<translation id="4459169140545916303"><ph name="DEVICE_LAST_ACTIVATED_TIME" /> দিন আগে ব্যবহার করা হয়েছে</translation>
<translation id="4460014764210899310">আলাদা করুন</translation>
@@ -5448,7 +5448,7 @@
<translation id="5884447826201752041">প্রতিটি এক্সটেনশনের জন্য কাস্টমাইজ করুন</translation>
<translation id="5884474295213649357">এই ট্যাব একটি USB ডিভাইসের সাথে সংযুক্ত করা আছে।</translation>
<translation id="5885314688092915589">আপনার প্রতিষ্ঠান এই প্রোফাইল ম্যানেজ করবে</translation>
-<translation id="5886009770935151472">আঙ্গুল ১</translation>
+<translation id="5886009770935151472">আঙুল ১</translation>
<translation id="5886112770923972514">আশেপাশের ডিভাইসে কানেক্ট করে দ্রুত পেয়ার সেট-আপ করুন</translation>
<translation id="5886384907280980632">এখনই বন্ধ করুন</translation>
<translation id="5888889603768021126">এর মাধ্যমে সাইন-ইন করেছেন</translation>
@@ -9096,7 +9096,7 @@
<translation id="9180281769944411366">এতে কয়েক মিনিট সময় লাগতে পারে। Linux কন্টেনার শুরু করা হচ্ছে।</translation>
<translation id="9180380851667544951">সাইটটি আপনার স্ক্রিন শেয়ার করতে পারে</translation>
<translation id="9182556968660520230">সাইটগুলিকে Play নিরাপত্তা কানেক্ট করতে দেয় না</translation>
-<translation id="9183331776983279456">৪ সপ্তাহের বেশি পুরনো সাইট Chrome অটোমেটিক মুছে দেয়। আপনি আবার ভিজিট করেছেন এমন সাইট তালিকায় আবার দেখা যেতে পারে। বা সাইটকে আপনার জন্য বিজ্ঞাপন সাজেস্ট করা থেকে ব্লক করতে পারেন।</translation>
+<translation id="9183331776983279456">৪ সপ্তাহের বেশি পুরনো সাইট Chrome অটোমেটিক মুছে দেয়। আপনি আবার ভিজিট করেছেন এমন সাইট, তালিকায় আবার দেখা যেতে পারে। বা কোনও সাইটকে আপনার জন্য বিজ্ঞাপনের সাজেশন দেওয়া থেকে ব্লক করতে পারবেন।</translation>
<translation id="918352324374649435">{COUNT,plural, =1{অ্যাপ}one{#টি অ্যাপ}other{#টি অ্যাপ}}</translation>
<translation id="9186963452600581158">আপনার সন্তানের Google অ্যাকাউন্ট ব্যবহার করে সাইন-ইন করুন</translation>
<translation id="9187967020623675250">'কী' মিলছে না। <ph name="RESPONSE" />-এর জন্য যেকোনও 'কী' প্রেস করুন।</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_bs.xtb b/chromium/chrome/app/resources/generated_resources_bs.xtb
index 1c4e791952d..e5be601b3c3 100644
--- a/chromium/chrome/app/resources/generated_resources_bs.xtb
+++ b/chromium/chrome/app/resources/generated_resources_bs.xtb
@@ -3184,7 +3184,7 @@ Domena <ph name="DOMAIN" /> zahtijeva da pametna kartica ostane umetnuta.</trans
<translation id="3798449238516105146">Verzija</translation>
<translation id="3798632811625902122">Bluetooth uređaj <ph name="DEVICE" /> traži odobrenje za uparivanje.</translation>
<translation id="3798670284305777884">Zvučnik (interni)</translation>
-<translation id="3799128412641261490">Postavke prekidača za pristup</translation>
+<translation id="3799128412641261490">Postavke Pristupa pomoću prekidača</translation>
<translation id="3800030395703848668">Prikaži opcije liste</translation>
<translation id="3800806661949714323">Prikaži sve (preporučeno)</translation>
<translation id="3800828618615365228">Dodatni uslovi za Google Chrome i ChromeOS</translation>
@@ -3262,7 +3262,7 @@ Domena <ph name="DOMAIN" /> zahtijeva da pametna kartica ostane umetnuta.</trans
<translation id="3855676282923585394">Uvezite oznake i postavke…</translation>
<translation id="3856096718352044181">Potvrdite da je ovo važeći pružalac usluga ili pokušajte ponovo kasnije</translation>
<translation id="3856800405688283469">Izbor vremenske zone</translation>
-<translation id="3857807444929313943">Podignite i ponovo dodirnite</translation>
+<translation id="3857807444929313943">Podignite prst i ponovo dodirnite senzor</translation>
<translation id="3858860766373142691">Naziv</translation>
<translation id="385939467708172187">Koristite jaku lozinku</translation>
<translation id="3861638017150647085">Korisničko ime "<ph name="USERNAME" />" nije dostupno</translation>
@@ -3622,7 +3622,7 @@ Domena <ph name="DOMAIN" /> zahtijeva da pametna kartica ostane umetnuta.</trans
<translation id="4193575319002689239">Prikaži kartice</translation>
<translation id="4193836101014293726">Nije moguće izbrisati ovaj profil</translation>
<translation id="419427585139779713">Unesite slog po slog</translation>
-<translation id="4194570336751258953">Omogući funkciju Dodirni za klik</translation>
+<translation id="4194570336751258953">Omogući dodir za klik</translation>
<translation id="4195378859392041564">Mišem kliknite na bilo koju tipku, a zatim pritisnite neku tipku tastature da je prilagodite</translation>
<translation id="4195421689821407315">Nesigurno preuzimanje</translation>
<translation id="4195643157523330669">Otvori u novoj kartici</translation>
@@ -6734,7 +6734,7 @@ Imate još # ugroženih lozinki. Googleov Upravitelj lozinki preporučuje da odm
<translation id="7034692021407794547">Administrator s privilegijama upravljanja naplatom najprije mora prihvatiti Uslove korištenja usluge hardvera za Google Meet u odjeljku hardver za Google Meet administratorske konzole.</translation>
<translation id="7036706669646341689">Preporučuje se <ph name="DISK_SIZE" /> prostora za Linux. Da oslobodite prostor, izbrišite fajlove s uređaja.</translation>
<translation id="7037509989619051237">Tekst za pregledanje</translation>
-<translation id="7038632520572155338">Prekidač za pristup</translation>
+<translation id="7038632520572155338">Pristup pomoću prekidača</translation>
<translation id="7038710352229712897">Dodajte drugi Google račun za korisnika <ph name="USER_NAME" /></translation>
<translation id="7039326228527141150">Pristup USB uređajima dobavljača <ph name="VENDOR_NAME" /></translation>
<translation id="7039912931802252762">Prijava na Microsoft pametnu karticu</translation>
@@ -6787,7 +6787,7 @@ Imate još # ugroženih lozinki. Googleov Upravitelj lozinki preporučuje da odm
<translation id="7086672505018440886">Uključi fajlove zapisnika Chromea u arhivu.</translation>
<translation id="7088434364990739311">Pokretanje provjere ažuriranja nije uspjelo (kôd greške <ph name="ERROR" />).</translation>
<translation id="7088674813905715446">Administrator je opozvao pristup ovom uređaju. Da biste ga omogućili za prijavu, administrator mora staviti uređaj na čekanje.</translation>
-<translation id="7088960765736518739">Prekidač za pristup</translation>
+<translation id="7088960765736518739">Pristup pomoću prekidača</translation>
<translation id="7089253021944603172">Kartica je ponovo aktivna</translation>
<translation id="7090160970140261931">Možete dodati još računa na uređaj <ph name="DEVICE_TYPE" /> da ih koristite s web lokacijama i Android aplikacijama. Također možete kontrolirati koji računi se koriste s Android aplikacijama.</translation>
<translation id="7090714929377281710">Automatski isključi pristupnu tačku</translation>
@@ -7771,7 +7771,7 @@ Pritisnite dodijeljeni prekidač ili tipku da uklonite dodjeljivanje.</translati
<translation id="7988355189918024273">Omogućavanje funkcija pristupačnosti</translation>
<translation id="7988805580376093356">Zadržite OS i pokrenite <ph name="DEVICE_OS" /> s USB-a.</translation>
<translation id="7990863024647916394"><ph name="DISPLAY_NAME" /> glas <ph name="COUNT" /></translation>
-<translation id="7991296728590311172">Postavke prekidača za pristup</translation>
+<translation id="7991296728590311172">Postavke Pristupa pomoću prekidača</translation>
<translation id="7992203134935383159">Sinteza govora</translation>
<translation id="7994515119120860317">Prevedi tekst na slici putem usluge <ph name="VISUAL_SEARCH_PROVIDER" /></translation>
<translation id="799570308305997052">Web prikaz</translation>
@@ -9079,7 +9079,7 @@ Domena <ph name="DOMAIN" /> zahtijeva da pametna kartica ostane umetnuta.}}</tra
<translation id="9166253503936244008">Skenirajte ovaj QR kôd uređajem koji ima pristupni ključ koji želite koristiti za aplikaciju <ph name="APP_NAME" /></translation>
<translation id="9167063903968449027">Prikaži Listu za čitanje</translation>
<translation id="9167450455589251456">Profil nije podržan</translation>
-<translation id="9168436347345867845">Uradit ću to kasnije</translation>
+<translation id="9168436347345867845">Ostavi za kasnije</translation>
<translation id="9169496697824289689">Prikaži prečice na tastaturi</translation>
<translation id="916964310188958970">Zbog čega ovaj prijedlog?</translation>
<translation id="9170048603158555829">Thunderbolt</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_ca.xtb b/chromium/chrome/app/resources/generated_resources_ca.xtb
index b76c0b8b041..3c535f48184 100644
--- a/chromium/chrome/app/resources/generated_resources_ca.xtb
+++ b/chromium/chrome/app/resources/generated_resources_ca.xtb
@@ -1196,7 +1196,7 @@ Pots gestionar la configuració d'aquest compte instal·lant l'aplicació Family
<translation id="2048554637254265991">S'ha produït un error en iniciar el gestor de contenidors. Torna-ho a provar.</translation>
<translation id="2048653237708779538">Acció no disponible</translation>
<translation id="204914487372604757">Crea la drecera</translation>
-<translation id="2050339315714019657">Vertical</translation>
+<translation id="2050339315714019657">Retrat</translation>
<translation id="2051555741181591333">Desactiva automàticament el punt d'accés Wi‐Fi</translation>
<translation id="2052572566310583903">Instal·lada als altres dispositius teus</translation>
<translation id="2053105195397337973">Estem explorant maneres de restringir el seguiment i de, alhora, permetre que els llocs web aturin el frau i el contingut brossa publicitari.</translation>
@@ -1776,7 +1776,7 @@ Pots gestionar la configuració d'aquest compte instal·lant l'aplicació Family
<translation id="2532144599248877204">Mantén la bateria al voltant del 80% per augmentar-ne la durada. La bateria es carregarà completament abans del moment en què l'acostumes a desconnectar de l'alimentació.</translation>
<translation id="2532198298278778531">Gestiona el DNS segur a la configuració de ChromeOS Flex</translation>
<translation id="2532589005999780174">Mode d'alt contrast</translation>
-<translation id="2533649878691950253">S'ha impedit que aquest lloc web sabés la teva ubicació exacta perquè normalment no ho permets</translation>
+<translation id="2533649878691950253">S'ha impedit que aquest lloc web sabés la teva ubicació precisa perquè normalment no ho permets</translation>
<translation id="253434972992662860">P&amp;ausa</translation>
<translation id="253557089021624350">Nombre de processos actius</translation>
<translation id="2535799430745250929">No hi ha cap xarxa mòbil</translation>
@@ -4137,7 +4137,7 @@ Pots gestionar la configuració d'aquest compte instal·lant l'aplicació Family
<translation id="4667027203988048332">Quines dades s'utilitzen:</translation>
<translation id="4668279686271488041">Les dades de mesurament d'anuncis se suprimeixen regularment del dispositiu</translation>
<translation id="4672759829555593783">Obre <ph name="FILE_NAME" /> ara</translation>
-<translation id="46733273239502219">També s'esborraran les dades sense connexió de les aplicacions instal·lades</translation>
+<translation id="46733273239502219">També s'esborraran les dades fora de línia de les aplicacions instal·lades</translation>
<translation id="4673442866648850031">Obre les eines del llapis òptic en extreure'l</translation>
<translation id="4675065861091108046">Havies triat l'opció de permetre totes les extensions a <ph name="ORIGIN" /></translation>
<translation id="4675828034887792601">Crea dreceres per cercar llocs web i gestionar el teu motor de cerca</translation>
@@ -7307,7 +7307,7 @@ Tens # contrasenyes més en perill. El gestor de contrasenyes de Google recomana
<translation id="7614260613810441905">Pregunta'm quan un lloc web vulgui editar els fitxers o les carpetes del dispositiu (opció recomanada)</translation>
<translation id="761530003705945209">Crea còpies de seguretat a Google Drive. Canvia de dispositiu o restaura'n les dades fàcilment en qualsevol moment. La còpia de seguretat inclou dades d'aplicacions. Les còpies de seguretat es pengen a Google i s'encripten amb la contrasenya del teu Compte de Google.</translation>
<translation id="7615365294369022248">S'ha produït un error en afegir un compte</translation>
-<translation id="7615807797520072741">Restablir la versió clàssica de Chrome</translation>
+<translation id="7615807797520072741">Restableix la versió clàssica de Chrome</translation>
<translation id="7616214729753637086">S'està registrant el dispositiu...</translation>
<translation id="7617263010641145920">Activa Play Store</translation>
<translation id="7617648809369507487">Utilitza missatges més discrets</translation>
@@ -9084,7 +9084,7 @@ Obtén informació sobre les dades que Google recull i sobre el motiu pel qual h
<translation id="9199503643457729322">Fes-hi clic per sortir de la Guia de privadesa.</translation>
<translation id="9200339982498053969"><ph name="ORIGIN" /> podrà editar els fitxers de la carpeta <ph name="FOLDERNAME" /></translation>
<translation id="920045321358709304">Cerca <ph name="SEARCH_ENGINE" /></translation>
-<translation id="9201023452444595544">S'esborraran totes les dades sense connexió</translation>
+<translation id="9201023452444595544">S'esborraran totes les dades fora de línia</translation>
<translation id="9201117361710210082">S'ha vist anteriorment</translation>
<translation id="9201220332032049474">Opcions de bloqueig de pantalla</translation>
<translation id="9201842707396338580">S'ha produït un error. Contacta amb el propietari o l'administrador del dispositiu. Codi d'error: <ph name="ERROR_CODE" />.</translation>
@@ -9109,7 +9109,7 @@ Obtén informació sobre les dades que Google recull i sobre el motiu pel qual h
<translation id="9222839025964079645">Algunes contrasenyes no s'han importat (<ph name="COUNT" />)</translation>
<translation id="923467487918828349">Mostra-ho tot</translation>
<translation id="924818813611903184">Gestiona els idiomes a la configuració de Chrome OS</translation>
-<translation id="929117907539171075">També s'esborraran les dades sense connexió de l'aplicació instal·lada</translation>
+<translation id="929117907539171075">També s'esborraran les dades fora de línia de l'aplicació instal·lada</translation>
<translation id="930268624053534560">Marques de temps detallades</translation>
<translation id="930893132043726269">Actualment hi ha itinerància</translation>
<translation id="93140074055951850">Les aplicacions d'Android s'han aturat</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_cs.xtb b/chromium/chrome/app/resources/generated_resources_cs.xtb
index 729437482c9..8ad5c1cb828 100644
--- a/chromium/chrome/app/resources/generated_resources_cs.xtb
+++ b/chromium/chrome/app/resources/generated_resources_cs.xtb
@@ -1198,7 +1198,7 @@ Chcete-li spravovat nastavení tohoto účtu, nainstalujte si do zařízení apl
<translation id="2048554637254265991">Správce kontejneru se nepodařilo spustit. Zkuste to znovu.</translation>
<translation id="2048653237708779538">Akce není k dispozici</translation>
<translation id="204914487372604757">Vytvořit zástupce</translation>
-<translation id="2050339315714019657">Na výšku</translation>
+<translation id="2050339315714019657">Portrét</translation>
<translation id="2051555741181591333">Automaticky deaktivovat hotspot</translation>
<translation id="2052572566310583903">Nainstalováno v jiných vašich zařízeních</translation>
<translation id="2053105195397337973">Zkoumáme možnosti, jak zabránit sledování a zároveň webům umožnit potírání reklamního spamu a podvodů.</translation>
@@ -2807,7 +2807,7 @@ Zpráva serveru: <ph name="SERVER_MSG" /></translation>
<translation id="3473241910002674503">Umožňuje přejít na domovskou stránku či zpět a přepínat aplikace pomocí tlačítek v režimu tabletu.</translation>
<translation id="3473479545200714844">Lupa obrazovky</translation>
<translation id="3474218480460386727">Nová slova smí mít maximálně 99 písmen</translation>
-<translation id="3474624961160222204">Pokrač. jako <ph name="NAME" /></translation>
+<translation id="3474624961160222204">Pokračovat jako <ph name="NAME" /></translation>
<translation id="3475843873335999118">Otisk prstu stále nebyl rozpoznán. Zadejte prosím heslo.</translation>
<translation id="3476303763173086583">Odesílat údaje o využití a diagnostice. Pomozte prostředí Android svého dítěte zlepšit tím, že necháte do Googlu automaticky odesílat diagnostické údaje a údaje o využití zařízení a aplikací. Tyto údaje nebudou používány ke zjištění totožnosti dítěte a pomohou nám se zvyšováním stability systému a aplikací a dalšími vylepšeními. Některá souhrnná data budou moci využít také naši partneři, např. vývojáři aplikací pro Android. Toto nastavení je <ph name="BEGIN_LINK1" />vyžadováno<ph name="END_LINK1" /> vlastníkem. Vlastník může zvolit, že se diagnostické údaje a údaje o využití z tohoto zařízení mají odesílat do Googlu. Pokud má dítě zapnuté dodatečné nastavení Aktivita na webu a v aplikacích, mohou se tato data ukládat do jeho účtu Google. <ph name="BEGIN_LINK2" />Další informace<ph name="END_LINK2" /></translation>
<translation id="347670947055184738">Jejda! Systému se nepodařilo načíst zásady pro vaše zařízení.</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_da.xtb b/chromium/chrome/app/resources/generated_resources_da.xtb
index 0a95d457536..55d03929b6e 100644
--- a/chromium/chrome/app/resources/generated_resources_da.xtb
+++ b/chromium/chrome/app/resources/generated_resources_da.xtb
@@ -178,13 +178,13 @@ Du kan til enhver tid tjekke dine adgangskoder i <ph name="GOOGLE_PASSWORD_MANAG
<translation id="1150565364351027703">Solbriller</translation>
<translation id="1151917987301063366">Tillad altid, at <ph name="HOST" /> kan få adgang til sensorer</translation>
<translation id="1152181876167086799">Tillad, at alle udvidelser læser og ændrer <ph name="SITE_NAME" /></translation>
-<translation id="1152346050262092795">Angiv din adgangskode igen for at bekræfte din konto.</translation>
+<translation id="1152346050262092795">Angiv din adgangskode igen for at verificere din konto.</translation>
<translation id="1153636665119721804">Google-programmet Avanceret beskyttelse</translation>
<translation id="1155545602507378023">Nej, kun denne enhed</translation>
<translation id="1155816283571436363">Opretter forbindelse til din telefon</translation>
<translation id="1158080958325422608">Anvend store bogstaver</translation>
<translation id="1158238185437008462">Se minder</translation>
-<translation id="1160842321113409343">Vi sletter automatisk websites, der er ældre end 4 uger, fra listen for at beskytte dine personlige oplysninger. Et website, du besøger igen, kan blive vist på listen igen. Du kan også fjerne et website, hvis du ikke vil have, at websitet nogensinde skal definere interesser for dig igen.</translation>
+<translation id="1160842321113409343">Vi sletter automatisk websites, der er ældre end 4 uger, fra listen for at beskytte dit privatliv. Et website, du besøger igen, kan blive vist på listen igen. Du kan også fjerne et website, hvis du ikke vil have, at websitet nogensinde skal definere interesser for dig igen.</translation>
<translation id="1161575384898972166">Log ind på <ph name="TOKEN_NAME" /> for at eksportere klientcertifikatet.</translation>
<translation id="116173250649946226">Din administrator har indstillet et standardtema, der ikke kan ændres.</translation>
<translation id="1162213688509394031">Skjul titellinjen</translation>
@@ -351,7 +351,7 @@ Du kan til enhver tid tjekke dine adgangskoder i <ph name="GOOGLE_PASSWORD_MANAG
<translation id="1307165550267142340">Din pinkode blev oprettet</translation>
<translation id="1307431692088049276">Spørg mig ikke igen</translation>
<translation id="1307559529304613120">Ups! Systemet kunne ikke gemme det langfristede API-adgangstoken for denne enhed.</translation>
-<translation id="131112695174432497">Data, der påvirker annoncetilpasning, slettes</translation>
+<translation id="131112695174432497">Data, der påvirker personlig tilpasning af annoncer, slettes</translation>
<translation id="1312811472299082263">Opret via en Ansible Playbook eller en Crostini-backupfil</translation>
<translation id="1313264149528821971"><ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> og <ph name="PERMISSION_3" /> blev fjernet</translation>
<translation id="1313405956111467313">Automatisk proxykonfiguration</translation>
@@ -369,7 +369,7 @@ Du kan til enhver tid tjekke dine adgangskoder i <ph name="GOOGLE_PASSWORD_MANAG
<translation id="1327495825214193325">Hvis du vil aktivere ADB-fejlretning, skal du genstarte denne <ph name="DEVICE_TYPE" />. Du skal gendanne fabriksindstillingerne på den for at deaktivere det.</translation>
<translation id="1327527584824210101">Brug din adgangsnøgle</translation>
<translation id="1327794256477341646">Funktioner, der skal bruge din lokation, fungerer ikke</translation>
-<translation id="1329466763986822896">Gør beskyttelsen af personlige oplysninger bedre for dette hotspot</translation>
+<translation id="1329466763986822896">Gør privatlivsbeskyttelsen bedre for dette hotspot</translation>
<translation id="1331977651797684645">Det var mig.</translation>
<translation id="1333489022424033687">Visse funktioner på <ph name="ORIGIN" /> fungerer muligvis ikke, før du har ryddet data, som andre websites har gemt på enheden</translation>
<translation id="1333965224356556482">Tillad ikke, at websites ser din lokation</translation>
@@ -974,7 +974,7 @@ De tilladelser, du har givet til apps, gælder muligvis for denne konto. Du kan
<translation id="1831848493690504725">Vi kan ikke få forbindelse til Google via det forbundne netværk. Prøv at vælge et andet netværk eller tjekke dine netværksindstillinger eller proxyindstillinger (hvis du bruger en proxy).</translation>
<translation id="1832459821645506983">Ja tak</translation>
<translation id="1832511806131704864">Telefonændring opdateret</translation>
-<translation id="1832848789136765277">Bekræft din identitet for at sikre, at du altid har adgang til dine synkroniserede data</translation>
+<translation id="1832848789136765277">Verificer din identitet for at sikre, at du altid har adgang til dine synkroniserede data</translation>
<translation id="1834503245783133039">Downloaden blev ikke fuldført: <ph name="FILE_NAME" /></translation>
<translation id="1835261175655098052">Opgraderer Linux</translation>
<translation id="1835612721186505600">Brug kameratilladelsen til at give apps og websites adgang</translation>
@@ -1209,7 +1209,7 @@ Du kan administrere indstillingerne for denne konto ved at installere Family Lin
<translation id="2048554637254265991">Fejl i opstart af containeradministration. Prøv igen.</translation>
<translation id="2048653237708779538">Handlingen er ikke tilgængelig</translation>
<translation id="204914487372604757">Opret genvej</translation>
-<translation id="2050339315714019657">Stående</translation>
+<translation id="2050339315714019657">Portræt</translation>
<translation id="2051555741181591333">Deaktiver hotspot automatisk</translation>
<translation id="2052572566310583903">Installeret på dine andre enheder</translation>
<translation id="2053105195397337973">Vi undersøger mulighederne for at begrænse sporing og samtidig give websites mulighed for at forhindre annoncespam og -svindel.</translation>
@@ -1218,7 +1218,7 @@ Du kan administrere indstillingerne for denne konto ved at installere Family Lin
<translation id="2055585478631012616">Du logges ud af disse websites, også i åbne faner</translation>
<translation id="205560151218727633">Google Assistent-logo</translation>
<translation id="2058456167109518507">Der blev registreret en enhed</translation>
-<translation id="2058581283817163201">Bekræft med denne telefon</translation>
+<translation id="2058581283817163201">Verificer med denne telefon</translation>
<translation id="2059913712424898428">Tidszone</translation>
<translation id="2060375639911876205">Fjern eSIM-profil</translation>
<translation id="2061366302742593739">Intet at vise</translation>
@@ -1343,7 +1343,7 @@ Du kan administrere indstillingerne for denne konto ved at installere Family Lin
<translation id="2154484045852737596">Rediger kort</translation>
<translation id="2155772377859296191">Ligner <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
<translation id="2156294658807918600">Scripttjeneste: <ph name="SCRIPT_URL" /></translation>
-<translation id="2156877321344104010">Kør sikkerhedstjek igen</translation>
+<translation id="2156877321344104010">Kør timer for tryghedstjek igen</translation>
<translation id="2157474325782140681">Hvis du vil have yderligere funktioner, skal du bruge en Dell-dockingstation, som er udviklet til at fungere sammen med denne Chromebook.</translation>
<translation id="215753907730220065">Afslut fuld skærm</translation>
<translation id="2157875535253991059">Denne side er nu i fuld skærm.</translation>
@@ -1585,7 +1585,7 @@ Du kan administrere indstillingerne for denne konto ved at installere Family Lin
<translation id="2348176352564285430">App: <ph name="ARC_PROCESS_NAME" /></translation>
<translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> – Der er anmodet om tilladelse. Tryk på Ctrl + skåstregtasten for at svare</translation>
<translation id="234889437187286781">Der kunne ikke indlæses data</translation>
-<translation id="2348939752188770364">Ryd tilpassede data...</translation>
+<translation id="2348939752188770364">Ryd personligt tilpassede data...</translation>
<translation id="2349610121459545414">Tillad fortsat, at dette website kan få adgang til din lokation</translation>
<translation id="2349896577940037438">Hvis indstillingen for yderligere web- og appaktivitet er aktiveret, gemmes disse data muligvis på din Google-konto. Du kan se dine data, slette dem, og ændre dine kontoindstillinger på account.google.com.</translation>
<translation id="2350133097354918058">Genindlæst</translation>
@@ -1755,7 +1755,7 @@ Du kan administrere indstillingerne for denne konto ved at installere Family Lin
<translation id="2498539833203011245">Minimer</translation>
<translation id="2498765460639677199">Kæmpestor</translation>
<translation id="2499747912851752301">Eksporterer adgangskoder...</translation>
-<translation id="2500471369733289700">Websitet er blokeret for at beskytte dine personlige oplysninger</translation>
+<translation id="2500471369733289700">Websitet er blokeret for at beskytte dit privatliv</translation>
<translation id="2501173422421700905">Certifikat venter</translation>
<translation id="2501278716633472235">Gå tilbage</translation>
<translation id="2501797496290880632">Angiv en genvej</translation>
@@ -2072,7 +2072,7 @@ Du kan administrere indstillingerne for denne konto ved at installere Family Lin
<translation id="2777251078198759550">Slet denne container</translation>
<translation id="2777525873368474674">Indsæt billedlink</translation>
<translation id="2778471504622896352">Føj eksterne apps til ChromeOS-applisten</translation>
-<translation id="2781120507965857989">Aktivér synkronisering for at få dine bogmærker, dine adgangskoder, din historik m.m. på denne enhed og andre enheder, som synkroniseres. Google kan bruge din historik til at tilpasse Søgning og andre Google-tjenester.</translation>
+<translation id="2781120507965857989">Aktivér synkronisering for at få dine bogmærker, dine adgangskoder, din historik m.m. på denne enhed og andre enheder, som synkroniseres. Google kan bruge din historik til at personligt tilpasse Søgning og andre Google-tjenester.</translation>
<translation id="2781692009645368755">Google Pay</translation>
<translation id="2781800772148653810">Udvidelser er tilladt på dette website</translation>
<translation id="2782104745158847185">Der opstod en fejl ved installation af Linux-appen</translation>
@@ -2201,7 +2201,7 @@ Du kan administrere indstillingerne for denne konto ved at installere Family Lin
<translation id="2891922230654533301">Vil du logge ind på <ph name="APP_NAME" /> med din enhed?</translation>
<translation id="2893013536106749396">Vælg kort, der holder dig orienteret om ting, der er vigtige for dig</translation>
<translation id="2893168226686371498">Standardbrowser</translation>
-<translation id="2893180576842394309">Google kan bruge din historik til at tilpasse Søgning og andre Google-tjenester</translation>
+<translation id="2893180576842394309">Google kan bruge din historik til at personligt tilpasse Søgning og andre Google-tjenester</translation>
<translation id="2894757982205307093">Ny fane i gruppe</translation>
<translation id="289695669188700754">Nøgle-id: <ph name="KEY_ID" /></translation>
<translation id="2897713966423243833">Denne tilpassede indstilling fjernes, når du lukker alle inkognitovinduer</translation>
@@ -2543,7 +2543,7 @@ Du kan administrere indstillingerne for denne konto ved at installere Family Lin
<translation id="3214531106883826119"><ph name="BEGIN_BOLD" />Bemærk!<ph name="END_BOLD" /> En lignende stemme eller en optagelse af den kan muligvis bruges til at få adgang til det personlige indhold, der tilhører <ph name="SUPERVISED_USER_NAME" />.</translation>
<translation id="3217843140356091325">Vil du oprette en genvej?</translation>
<translation id="321834671654278338">Afinstallationsprogram til Linux</translation>
-<translation id="3220943972464248773">Bekræft din identitet for at synkronisere dine adgangskoder</translation>
+<translation id="3220943972464248773">Verificer din identitet for at synkronisere dine adgangskoder</translation>
<translation id="3222066309010235055">Forhåndsgengivelse: <ph name="PRERENDER_CONTENTS_NAME" /></translation>
<translation id="3222779980972075989">Slut til <ph name="USB_VM_NAME" /></translation>
<translation id="3223531857777746191">Knappen Nulstil</translation>
@@ -2759,7 +2759,7 @@ Du kan administrere indstillingerne for denne konto ved at installere Family Lin
<translation id="3424969259347320884">Beskriv, hvad du foretog dig, da fanen gik ned</translation>
<translation id="3427092606871434483">Tillad (standardindstilling)</translation>
<translation id="3429086384982427336">De apps, der er angivet nedenfor, håndterer aldrig protokollinks.</translation>
-<translation id="3429160811076349561">Prøvefunktioner er slået fra</translation>
+<translation id="3429160811076349561">Labs er slået fra</translation>
<translation id="3429271624041785769">Sprog for webindhold</translation>
<translation id="3429275422858276529">Tilføj denne side som bogmærke, så du nemt kan finde den igen</translation>
<translation id="3432762828853624962">Shared Workers</translation>
@@ -2778,7 +2778,7 @@ Du kan administrere indstillingerne for denne konto ved at installere Family Lin
<translation id="3439970425423980614">Åbner PDF i fremviseren</translation>
<translation id="3440663250074896476">Flere handlinger for <ph name="BOOKMARK_NAME" /></translation>
<translation id="3441653493275994384">Skærm</translation>
-<translation id="3441663102605358937">Log ind på <ph name="ACCOUNT" /> igen for at bekræfte denne konto</translation>
+<translation id="3441663102605358937">Log ind på <ph name="ACCOUNT" /> igen for at verificere denne konto</translation>
<translation id="3442674350323953953">Giv Google tilladelse til at bruge dine hardwaredata til at hjælpe med at forbedre <ph name="DEVICE_OS" />. Hvis du afviser, bliver disse data stadig sendt til Google med henblik på at levere de rigtige opdateringer, men de bliver ikke gemt eller brugt udover det.</translation>
<translation id="3444726579402183581"><ph name="ORIGIN" /> vil kunne se <ph name="FILENAME" /></translation>
<translation id="3445047461171030979">Hurtige svar i Google Assistent</translation>
@@ -3062,7 +3062,7 @@ Du kan administrere indstillingerne for denne konto ved at installere Family Lin
<translation id="369522892592566391">{NUM_FILES,plural, =0{Sikkerhedstjekket blev gennemført. Dine data uploades.}=1{Sikkerhedstjekket blev gennemført. Din fil uploades.}one{Sikkerhedstjekket blev gennemført. Din fil uploades.}other{Sikkerhedstjekket blev gennemført. Dine filer uploades.}}</translation>
<translation id="3698471669415859717">Gennemgangen er fuldført</translation>
<translation id="3699624789011381381">Mailadresse</translation>
-<translation id="3699920817649120894">Vil du deaktivere synkronisering og tilpasning?</translation>
+<translation id="3699920817649120894">Vil du deaktivere synkronisering og personlig tilpasning?</translation>
<translation id="3700888195348409686">Præsenterer (<ph name="PAGE_ORIGIN" />)</translation>
<translation id="3700993174159313525">Tillad ikke, at websites registrerer din kameraposition</translation>
<translation id="3702500414347826004"><ph name="URL" /> blev inkluderet i dine opstartssider.</translation>
@@ -3080,7 +3080,7 @@ Du kan administrere indstillingerne for denne konto ved at installere Family Lin
<translation id="3708295717182051206">Undertekster</translation>
<translation id="3708684582558000260">Tillad ikke, at lukkede websites kan afslutte afsendingen eller modtagelsen af data</translation>
<translation id="3709244229496787112">Browseren blev lukket ned, inden overførslen var færdig.</translation>
-<translation id="371174301504454251">Vi sletter automatisk websites, der er ældre end 4 uger, fra listen for at beskytte dine personlige oplysninger. Et website, du besøger igen, kan blive vist på listen igen. Du kan også fjerne et website, hvis du ikke vil have, at websitet nogensinde skal definere interesser for dig igen.</translation>
+<translation id="371174301504454251">Vi sletter automatisk websites, der er ældre end 4 uger, fra listen for at beskytte dit privatliv. Et website, du besøger igen, kan blive vist på listen igen. Du kan også fjerne et website, hvis du ikke vil have, at websitet nogensinde skal definere interesser for dig igen.</translation>
<translation id="3711931198657368127">Ind&amp;sæt, og gå til <ph name="URL" /></translation>
<translation id="3711945201266135623">Der blev fundet <ph name="NUM_PRINTERS" /> printere på printerserveren</translation>
<translation id="3712050472459130149">Kontoopdatering er påkrævet</translation>
@@ -3145,7 +3145,7 @@ Du kan administrere indstillingerne for denne konto ved at installere Family Lin
<translation id="3764753550716962406">Vil du tillade, at Google bruger din kurv til at finde tilgængelige rabatter?</translation>
<translation id="3764974059056958214">{COUNT,plural, =1{Sender <ph name="ATTACHMENTS" /> til <ph name="DEVICE_NAME" />}one{Sending <ph name="ATTACHMENTS" /> to <ph name="DEVICE_NAME" />}other{Sender <ph name="ATTACHMENTS" /> til <ph name="DEVICE_NAME" />}}</translation>
<translation id="3765246971671567135">Politikken for offlinedemotilstand kunne ikke læses.</translation>
-<translation id="3765696567014520261">Websites kan ikke bruge dine cookies til at se din browseraktivitet på forskellige websites for f.eks. at tilpasse annoncer. Funktionerne på visse websites virker muligvis ikke</translation>
+<translation id="3765696567014520261">Websites kan ikke bruge dine cookies til at se din browseraktivitet på forskellige websites for f.eks. at personligt tilpasse annoncer. Funktionerne på visse websites virker muligvis ikke</translation>
<translation id="3766687283066842296">Få flere oplysninger om Telefonstyring</translation>
<translation id="3766811143887729231"><ph name="REFRESH_RATE" /> Hz</translation>
<translation id="377050016711188788">Is</translation>
@@ -3262,7 +3262,7 @@ Du kan administrere indstillingerne for denne konto ved at installere Family Lin
<translation id="3854976556788175030">Papirbakken er fuld</translation>
<translation id="3855441664322950881">Pak udvidelse</translation>
<translation id="3855676282923585394">Importer bogmærker og indstillinger...</translation>
-<translation id="3856096718352044181">Bekræft, at dette er en gyldig udbyder, eller prøv igen senere</translation>
+<translation id="3856096718352044181">Verificer, at dette er en gyldig udbyder, eller prøv igen senere</translation>
<translation id="3856800405688283469">Vælg tidszone</translation>
<translation id="3857807444929313943">Løft, og berør igen</translation>
<translation id="3858860766373142691">Navn</translation>
@@ -3900,7 +3900,7 @@ Vil du starte <ph name="CONTROL_PANEL_APPLET_NAME" />?</translation>
<translation id="4445446646109808714">Slutbrugerlicensaftale: <ph name="EULA_LINK" /></translation>
<translation id="4446933390699670756">Spejlet</translation>
<translation id="4448914100439890108">Skjul adgangskoden for <ph name="USERNAME" /> på <ph name="DOMAIN" /></translation>
-<translation id="4449948729197510913">Dit brugernavn tilhører din organisations virksomhedskonto. Hvis du vil tilmelde enheder på kontoen, skal du først bekræfte ejerskab af domænet i Administrationskonsol. Du skal have administratorrettigheder på kontoen for at bekræfte.</translation>
+<translation id="4449948729197510913">Dit brugernavn tilhører din organisations virksomhedskonto. Hvis du vil tilmelde enheder på kontoen, skal du først verificere ejerskab af domænet i Administrationskonsol. Du skal have administratorrettigheder på kontoen for at verificere.</translation>
<translation id="4449996769074858870">Denne fane afspiller lyd.</translation>
<translation id="4450974146388585462">Diagnosticer</translation>
<translation id="445099924538929605"><ph name="DEVICE_OS" /> har registreret en aktiv TMP-enhed, som kan gemme dine data på en mere sikker måde.</translation>
@@ -4047,7 +4047,7 @@ Vil du starte <ph name="CONTROL_PANEL_APPLET_NAME" />?</translation>
<translation id="457386861538956877">Flere...</translation>
<translation id="4574741712540401491">• <ph name="LIST_ITEM_TEXT" /></translation>
<translation id="4576541033847873020">Par Bluetooth-enhed</translation>
-<translation id="4576763597586015380">Hvis du vil fortsætte med at gemme adgangskoder på din Google-konto, skal du bekræfte din identitet</translation>
+<translation id="4576763597586015380">Hvis du vil fortsætte med at gemme adgangskoder på din Google-konto, skal du verificere din identitet</translation>
<translation id="4579453506923101210">Glem den tilsluttede telefon</translation>
<translation id="4579581181964204535"><ph name="HOST_NAME" /> kunne ikke castes.</translation>
<translation id="4579876313423027742">Gå til <ph name="LINK_BEGIN" />indstillingerne for Chrome-browseren<ph name="LINK_END" /> for at gå til browsernotifikationerne</translation>
@@ -4485,7 +4485,7 @@ Brug Ctrl+Alt+Lysstyrke ned for at zoome ud.</translation>
<translation id="4977942889532008999">Bekræft adgang</translation>
<translation id="4980805016576257426">Denne udvidelse indeholder malware.</translation>
<translation id="4981449534399733132"><ph name="BEGIN_LINK" />Log ind<ph name="END_LINK" /> for at rydde browserdata fra alle dine synkroniserede enheder og din Google-konto.</translation>
-<translation id="4986706507552097681">Du kan altid vælge, hvad der skal synkroniseres, i indstillingerne. Google kan tilpasse Søgning og andre tjenester baseret på din historik.</translation>
+<translation id="4986706507552097681">Du kan altid vælge, hvad der skal synkroniseres, i indstillingerne. Google kan personligt tilpasse Søgning og andre tjenester baseret på din historik.</translation>
<translation id="4986728572522335985">Denne handling sletter alle data på sikkerhedsnøglen, bl.a. pinkoden</translation>
<translation id="4988526792673242964">Sider</translation>
<translation id="49896407730300355">Roter m&amp;od uret</translation>
@@ -4813,7 +4813,7 @@ Brug Ctrl+Alt+Lysstyrke ned for at zoome ud.</translation>
<translation id="5299109548848736476">Do Not Track</translation>
<translation id="5299558715747014286">Se og administrer dine fanegupper</translation>
<translation id="5300287940468717207">Vil du nulstille websitetilladelserne?</translation>
-<translation id="5300426565656326054">Browserbaseret personlig annoncetilpasning</translation>
+<translation id="5300426565656326054">Browserbaseret personlig tilpasning af annoncer</translation>
<translation id="5300589172476337783">Vis</translation>
<translation id="5300719150368506519">Sender webadresserne for de sider, du besøger, til Google</translation>
<translation id="5301751748813680278">Anvender som gæst.</translation>
@@ -5074,7 +5074,7 @@ Flere kontakter kan tildeles denne handling.</translation>
<translation id="5544482392629385159">Enhed <ph name="DEVICE_INDEX" /> af <ph name="DEVICE_COUNT" />: <ph name="DEVICE_NAME" /></translation>
<translation id="554517701842997186">Gengivelse</translation>
<translation id="5545335608717746497">{NUM_TABS,plural, =1{Føj fane til gruppe}one{Føj fane til gruppe}other{Føj faner til gruppe}}</translation>
-<translation id="5545693483061321551">Websites kan ikke bruge dine cookies til at se din browseraktivitet på forskellige websites for f.eks. at tilpasse annoncer. Funktionerne på visse websites virker muligvis ikke.</translation>
+<translation id="5545693483061321551">Websites kan ikke bruge dine cookies til at se din browseraktivitet på forskellige websites for f.eks. at personligt tilpasse annoncer. Funktionerne på visse websites virker muligvis ikke.</translation>
<translation id="5546865291508181392">Find</translation>
<translation id="5548075230008247516">Markeringen af alle elementer er fjernet, og markeringstilstanden er afsluttet.</translation>
<translation id="5548159762883465903">{NUM_OTHER_TABS,plural, =0{"<ph name="TAB_TITLE" />"}=1{"<ph name="TAB_TITLE" />" og 1 anden fane}one{"<ph name="TAB_TITLE" />" og # anden fane}other{"<ph name="TAB_TITLE" />" og # andre faner}}</translation>
@@ -5381,7 +5381,7 @@ Flere kontakter kan tildeles denne handling.</translation>
<translation id="5832813618714645810">Profiler</translation>
<translation id="583281660410589416">Ukendt</translation>
<translation id="5832970156002835240">Tillad på alle websites</translation>
-<translation id="5833397272224757657">Anvender indhold på websites, du besøger, samt browseraktivitet og -interaktioner, så din brugeroplevelse tilpasses</translation>
+<translation id="5833397272224757657">Anvender indhold på websites, du besøger, samt browseraktivitet og -interaktioner, så din brugeroplevelse kan personligt tilpasses</translation>
<translation id="5833726373896279253">Disse indstillinger kan kun ændres af ejeren:</translation>
<translation id="583431638776747">Websitet var ikke tilgængeligt</translation>
<translation id="5834581999798853053">Omkring <ph name="TIME" /> minutter tilbage</translation>
@@ -5943,7 +5943,7 @@ Flere kontakter kan tildeles denne handling.</translation>
<translation id="6338968693068997776">Tilføj USB-enhed</translation>
<translation id="6339668969738228384">Opret en ny profil for <ph name="USER_EMAIL_ADDRESS" /></translation>
<translation id="6340071272923955280">Internet Printing Protocol (IPPS)</translation>
-<translation id="6340526405444716530">Tilpasning</translation>
+<translation id="6340526405444716530">Personlig tilpasning</translation>
<translation id="6341850831632289108">Find din fysiske placering</translation>
<translation id="6342069812937806050">Lige nu</translation>
<translation id="6343003829431264373">Kun lige sider</translation>
@@ -5963,7 +5963,7 @@ Flere kontakter kan tildeles denne handling.</translation>
<translation id="6361850914223837199">Info om fejl:</translation>
<translation id="6362853299801475928">&amp;Rapporter et problem...</translation>
<translation id="6363786367719063276">Se logfiler</translation>
-<translation id="6363990818884053551">Bekræft din identitet for at starte synkroniseringen</translation>
+<translation id="6363990818884053551">Verificer din identitet for at starte synkroniseringen</translation>
<translation id="6365069501305898914">Facebook</translation>
<translation id="6365411474437319296">Tilføj familie og venner</translation>
<translation id="6367097275976877956">Vil du aktivere ChromeVox, der er den indbyggede skærmlæser til ChromeOS? Tryk på mellemrumstasten for at aktivere.</translation>
@@ -6479,7 +6479,7 @@ Du har # andre kompromitterede adgangskoder. Google Adgangskodeadministrator anb
<translation id="6824564591481349393">Kopier mailadress&amp;e</translation>
<translation id="6824584962142919697">&amp;Inspect elements (Undersøg elementer)</translation>
<translation id="6825184156888454064">Sorter efter navn</translation>
-<translation id="6826872289184051766">Bekræft via USB</translation>
+<translation id="6826872289184051766">Verificer via USB</translation>
<translation id="6827121912381363404">Tillad, at alle udvidelser kan læse og ændre <ph name="PERMITTED_SITE" /></translation>
<translation id="6827517233063803343">Dine apps og indstillinger synkroniseres på tværs af alle de ChromeOS-enheder, hvor du er logget ind med din Google-konto. Du kan se muligheder for synkronisering af browseren i <ph name="LINK_BEGIN" />indstillingerne for Chrome<ph name="LINK_END" />.</translation>
<translation id="6827767090350758381">Gamle versioner af Chrome-apps kan ikke åbnes på Windows-enheder efter december 2022. Kontakt din administrator, hvis du vil opdatere til en ny version af denne app eller fjerne den.</translation>
@@ -6503,7 +6503,7 @@ Du har # andre kompromitterede adgangskoder. Google Adgangskodeadministrator anb
<translation id="6840214587087739194">Adressen er slettet</translation>
<translation id="6841143363521180029">Krypteret</translation>
<translation id="6841186874966388268">Fejl</translation>
-<translation id="6842136130964845393">Bekræft din identitet for at sikre, at du altid har adgang til dine gemte adgangskoder</translation>
+<translation id="6842136130964845393">Verificer din identitet for at sikre, at du altid har adgang til dine gemte adgangskoder</translation>
<translation id="6842749380892715807">XML-websitelister blev sidst downloadet <ph name="LAST_DATE_DOWNLOAD" />.</translation>
<translation id="6842868554183332230">Websites registrerer som regel, hvornår du aktivt bruger din enhed, så de kan angive din tilgængelighed i chatapps</translation>
<translation id="6843264316370513305">Fejlretning af netværk</translation>
@@ -6642,7 +6642,7 @@ Du har # andre kompromitterede adgangskoder. Google Adgangskodeadministrator anb
<translation id="6965978654500191972">Enhed</translation>
<translation id="6966370001499648704">Styr, hvilke telefoner du bruger som sikkerhedsnøgler</translation>
<translation id="6967430741871315905">Det var ikke muligt at tjekke, om enheden er tilladt</translation>
-<translation id="696780070563539690">Websites kan ikke anvende dine cookies til at se din browseraktivitet på forskellige websites for f.eks. at tilpasse annoncer</translation>
+<translation id="696780070563539690">Websites kan ikke anvende dine cookies til at se din browseraktivitet på forskellige websites for f.eks. at personligt tilpasse annoncer</translation>
<translation id="6968288415730398122">Angiv din adgangskode for at konfigurere skærmlåsen</translation>
<translation id="6969047215179982698">Deaktiver Deling tæt på</translation>
<translation id="6969216690072714773">Angiv nye oplysninger, eller opdater de eksisterende oplysninger, der skal tilknyttes denne enhed.</translation>
@@ -7135,7 +7135,7 @@ Du har # andre kompromitterede adgangskoder. Google Adgangskodeadministrator anb
<translation id="7427348830195639090">Baggrundsside: <ph name="BACKGROUND_PAGE_URL" /></translation>
<translation id="7427798576651127129">Ring fra <ph name="DEVICE_NAME" /></translation>
<translation id="7431719494109538750">Der blev ikke fundet nogen HID-enheder</translation>
-<translation id="7431991332293347422">Bestem selv, hvordan din browserhistorik skal bruges til at tilpasse søgeresultater m.m.</translation>
+<translation id="7431991332293347422">Bestem selv, hvordan din browserhistorik skal bruges til at personligt tilpasse søgeresultater m.m.</translation>
<translation id="7432200167665670017">Din administrator har blokeret "<ph name="EXTENSION_NAME" />" – app-id <ph name="EXTENSION_ID" /></translation>
<translation id="7433708794692032816">Indsæt chipkortet for at blive ved med at bruge din <ph name="DEVICE_TYPE" /></translation>
<translation id="7433957986129316853">Behold den</translation>
@@ -7268,7 +7268,7 @@ Du har # andre kompromitterede adgangskoder. Google Adgangskodeadministrator anb
<translation id="7553242001898162573">Angiv din adgangskode</translation>
<translation id="755472745191515939">Din administrator tillader ikke brug af dette sprog</translation>
<translation id="7554791636758816595">Ny fane</translation>
-<translation id="7556033326131260574">Smart Lock kunne ikke bekræfte din konto. Angiv din adgangskode for at få adgang.</translation>
+<translation id="7556033326131260574">Smart Lock kunne ikke verificere din konto. Angiv din adgangskode for at få adgang.</translation>
<translation id="7556242789364317684"><ph name="SHORT_PRODUCT_NAME" /> kan ikke gendanne dine indstillinger. Denne fejl kan korrigeres ved at lade <ph name="SHORT_PRODUCT_NAME" /> nulstille din enhed med Powerwash.</translation>
<translation id="7557194624273628371">Omdirigering af port i Linux</translation>
<translation id="7557411183415085169">Linux er ved at løbe tør for diskplads</translation>
@@ -7353,7 +7353,7 @@ Du har # andre kompromitterede adgangskoder. Google Adgangskodeadministrator anb
<translation id="7634280112532283638">Reducering af spam og svindel</translation>
<translation id="7634566076839829401">Noget gik galt. Prøv igen.</translation>
<translation id="7635048370253485243">Fastgjort af din administrator</translation>
-<translation id="7635711411613274199">Om de annoncer, du ser på nettet, er tilpassede, afhænger af denne indstilling, dvs. <ph name="BEGIN_LINK1" />Annonceemner<ph name="LINK_END1" />, dine <ph name="BEGIN_LINK2" />cookieindstillinger<ph name="LINK_END2" />, og om det website, du besøger, tilpasser annoncer</translation>
+<translation id="7635711411613274199">Om de annoncer, du ser på nettet, er personligt tilpasset, afhænger af denne indstilling, dvs. <ph name="BEGIN_LINK1" />Annonceemner<ph name="LINK_END1" />, dine <ph name="BEGIN_LINK2" />cookieindstillinger<ph name="LINK_END2" />, og om det website, du besøger, tilpasser annoncer</translation>
<translation id="7636919061354591437">Installer på denne enhed</translation>
<translation id="7637253234491814483">Tryk på fingeraftrykslæseren øverst til højre på tastaturet ved siden af afbryderknappen. Dine fingeraftryksdata gemmes sikkert og forlader aldrig din <ph name="DEVICE_TYPE" />.</translation>
<translation id="7637272932128132922">Mens denne fane var inaktiv, frigjorde Hukommelsessparefunktion hukommelse til andre opgaver. Du kan til enhver tid ændre dette i <ph name="SETTINGS_LINK" />.</translation>
@@ -7453,7 +7453,7 @@ Du har # andre kompromitterede adgangskoder. Google Adgangskodeadministrator anb
<translation id="7709152031285164251">Mislykket - <ph name="INTERRUPT_REASON" /></translation>
<translation id="7710568461918838723">&amp;Cast...</translation>
<translation id="7711900714716399411">Forbind din telefon til computeren med et USB-kabel. Hvis din telefon allerede er tilsluttet, skal du tage stikket ud og sætte det i igen.</translation>
-<translation id="7711968363685835633">Deaktiver brugerdefinerede konverteringer og forslag samt brugerordbog</translation>
+<translation id="7711968363685835633">Deaktiver personligt tilpassede konverteringer og forslag samt brugerordbog</translation>
<translation id="7712739869553853093">Dialogboks for udskriftsvisning</translation>
<translation id="7713139339518499741">Naturlig stemme</translation>
<translation id="7714307061282548371">Cookies fra <ph name="DOMAIN" /> er tilladt</translation>
@@ -7714,7 +7714,7 @@ Tryk på en kontakt eller tast, der er tildelt en handling, for at fjerne tildel
<translation id="7942349550061667556">Rød</translation>
<translation id="7943368935008348579">Download PDF-filer</translation>
<translation id="7943837619101191061">Tilføj placering...</translation>
-<translation id="7944772052836377867">Synkronisering skal bekræfte din identitet</translation>
+<translation id="7944772052836377867">Synkronisering skal verificere din identitet</translation>
<translation id="7945031593909029181">"<ph name="CHROME_EXTENSION_NAME" />" vil oprette forbindelse</translation>
<translation id="7945703887991230167">Foretrukken stemme</translation>
<translation id="7946586320617670168">Oprindelsen skal være sikker</translation>
@@ -7841,7 +7841,7 @@ Opbevar din nøglefil på et sikkert sted. Du skal bruge den til at oprette nye
<translation id="8049705080247101012">Google har markeret "<ph name="EXTENSION_NAME" />" som skadelig, og installationen blev forhindret</translation>
<translation id="8049948037269924837">Omvendt rulning på touchplade</translation>
<translation id="8050038245906040378">Microsoft-signering af kommerciel kode</translation>
-<translation id="8050191834453426339">Bekræft igen</translation>
+<translation id="8050191834453426339">Verificer igen</translation>
<translation id="8051193500142930381">Funktioner, der skal bruge et kamera, fungerer ikke</translation>
<translation id="8051390370038326517">Tillad altid, at <ph name="HOST" /> kan få fuld kontrol over MIDI-enheder</translation>
<translation id="8053278772142718589">PKCS #12-filer</translation>
@@ -7951,7 +7951,7 @@ Opbevar din nøglefil på et sikkert sted. Du skal bruge den til at oprette nye
<translation id="8147346945017130012">Vær med til at forbedre funktionerne og ydeevnen i Chrome og ChromeOS ved automatisk at sende nedbrudsrapporter samt diagnostik- og brugsdata til Google.</translation>
<translation id="8147900440966275470">Der blev fundet <ph name="NUM" /> fane</translation>
<translation id="8148760431881541277">Begræns login</translation>
-<translation id="8149564499626272569">Bekræft via din telefon med et USB-kabel</translation>
+<translation id="8149564499626272569">Verificer via din telefon med et USB-kabel</translation>
<translation id="815114315010033526">Brug QR-kode i stedet</translation>
<translation id="8151638057146502721">Konfigurer</translation>
<translation id="8154790740888707867">Ingen fil</translation>
@@ -8144,7 +8144,7 @@ Opbevar din nøglefil på et sikkert sted. Du skal bruge den til at oprette nye
<translation id="8322814362483282060">Denne side er blokeret fra at få adgang til din mikrofon.</translation>
<translation id="8323167517179506834">Angiv webadresse</translation>
<translation id="8323317289166663449">Læse og redigere alle dine data på din computer og alle websites</translation>
-<translation id="8324784016256120271">Websites kan anvende cookies til at se din browseraktivitet på forskellige websites for f.eks. at tilpasse annoncer</translation>
+<translation id="8324784016256120271">Websites kan anvende cookies til at se din browseraktivitet på forskellige websites for f.eks. at personligt tilpasse annoncer</translation>
<translation id="8325413836429495820">Har ikke tilladelse til at se din udklipsholder</translation>
<translation id="8326478304147373412">PKCS #7, certifikatkæde</translation>
<translation id="8327386430364625757">Matematisk skrifttype</translation>
@@ -8301,7 +8301,7 @@ Opbevar din nøglefil på et sikkert sted. Du skal bruge den til at oprette nye
<translation id="8468087214092422866">Har ikke tilladelse til at søge efter Bluetooth-enheder</translation>
<translation id="8470513973197838199">Gemte adgangskoder til <ph name="ORIGIN" /></translation>
<translation id="8471525937465764768">Websites opretter normalt forbindelse til USB-enheder for at kunne udskrive dokumenter eller gemme filer på en lagerenhed</translation>
-<translation id="8471959340398751476">Rabatter er slået fra. Du kan slå rabatter til i menuen for tilpasning</translation>
+<translation id="8471959340398751476">Rabatter er slået fra. Du kan slå rabatter til i menuen for personlig tilpasning</translation>
<translation id="8472563193954285009">{COUNT,plural, =0{Dine adgangskoder er unikke}=1{{COUNT} genbrugt adgangskode}one{{COUNT} genbrugt adgangskode}other{{COUNT} genbrugte adgangskoder}}</translation>
<translation id="8472623782143987204">hardwarebaseret</translation>
<translation id="8473863474539038330">Adresser m.m.</translation>
@@ -8315,7 +8315,7 @@ Opbevar din nøglefil på et sikkert sted. Du skal bruge den til at oprette nye
<translation id="8480082892550707549">Selvom du tidligere har downloadet filer fra dette website, kan det stadig være midlertidigt usikkert (hacket). Prøv at downloade denne fil på et senere tidspunkt.</translation>
<translation id="8480869669560681089">Ukendt enhed fra <ph name="VENDOR_NAME" /></translation>
<translation id="8481187309597259238">Bekræft USB-tilladelse</translation>
-<translation id="8481980314595922412">Prøvefunktioner er slået til</translation>
+<translation id="8481980314595922412">Labs er slået til</translation>
<translation id="8483248364096924578">IP-adresse</translation>
<translation id="8486666913807228950">Årsag: Den omvendte regel <ph name="REVERT_RULE" /> blev fundet på listen "Gennemtving åbning i".</translation>
<translation id="8487678622945914333">Zoom ind</translation>
@@ -8486,7 +8486,7 @@ Opbevar din nøglefil på et sikkert sted. Du skal bruge den til at oprette nye
<translation id="8648408795949963811">Farvetemperatur for Nattelys</translation>
<translation id="8648544143274677280"><ph name="SITE_NAME" /> vil gerne have tilladelse til at: <ph name="FIRST_PERMISSION" />, <ph name="SECOND_PERMISSION" /> og andre ting</translation>
<translation id="864892689521194669">Vær med til at forbedre funktionerne og ydeevnen i ChromeOS Flex</translation>
-<translation id="8649026945479135076">Det er almindeligt, at de websites, du besøger, husker ting, du er interesseret i, så din oplevelse tilpasses. Websites kan også gemme oplysninger med Chrome om dine interesser.</translation>
+<translation id="8649026945479135076">Det er almindeligt, at de websites, du besøger, husker ting, du er interesseret i, så din oplevelse personligt tilpasses. Websites kan også gemme oplysninger med Chrome om dine interesser.</translation>
<translation id="8650543407998814195">Du kan godt fjerne din gamle profil, selvom du ikke længere har adgang til den.</translation>
<translation id="8651585100578802546">Gennemtving genindlæsning af denne side</translation>
<translation id="8652400352452647993">Fejl i pakkeudvidelse</translation>
@@ -8507,7 +8507,7 @@ Opbevar din nøglefil på et sikkert sted. Du skal bruge den til at oprette nye
<translation id="8665180165765946056">Sikkerhedskopieringen blev fuldført</translation>
<translation id="866611985033792019">Hav tillid til dette certifikat i forbindelse med identifikation af e-mailbrugere</translation>
<translation id="8666321716757704924">Der er igen givet tilladelser for <ph name="WEBSITE" /></translation>
-<translation id="8666759526542103597">Om browserbaseret personlig annoncetilpasning</translation>
+<translation id="8666759526542103597">Om browserbaseret personlig tilpasning af annoncer</translation>
<translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> er nu i fuld skærm og har deaktiveret din musemarkør.</translation>
<translation id="8667760277771450375">Vi undersøger mulighederne for at begrænse sporing på tværs af websites og samtidig give websites mulighed for at forhindre annoncespam og -svindel.</translation>
<translation id="8668378421690365723">Din enhed fungerer muligvis ikke længere korrekt, og du kan opleve problemer med sikkerheden og ydeevnen.</translation>
@@ -8678,7 +8678,7 @@ Opbevar din nøglefil på et sikkert sted. Du skal bruge den til at oprette nye
<translation id="881782782501875829">Tilføj portnummer</translation>
<translation id="881799181680267069">Skjul andre</translation>
<translation id="8818152010000655963">Baggrund</translation>
-<translation id="8818958672113348984">Bekræft via din telefon</translation>
+<translation id="8818958672113348984">Verificer via din telefon</translation>
<translation id="8820817407110198400">Bogmærker</translation>
<translation id="8821045908425223359">Konfigurer automatisk IP-adressen</translation>
<translation id="8821268776955756404"><ph name="APP_NAME" /> er klar til brug.</translation>
@@ -8761,7 +8761,7 @@ Opbevar din nøglefil på et sikkert sted. Du skal bruge den til at oprette nye
<translation id="8881020143150461183">Prøv igen. Kontakt <ph name="CARRIER_NAME" /> for at få teknisk support.</translation>
<translation id="888256071122006425">Indstillinger for mus og touchplade</translation>
<translation id="8883273463630735858">Aktivér acceleration af touchplade</translation>
-<translation id="8884023684057697730"><ph name="BEGIN_BOLD" />Sådan administrerer du dine data:<ph name="END_BOLD" /> Vi sletter automatisk websites, der er ældre end 4 uger, fra listen for at beskytte dine personlige oplysninger. Et website, du besøger igen, kan blive vist på listen igen. Du kan også fjerne et website, hvis du ikke vil have, at websitet nogensinde skal definere interesser for dig igen.</translation>
+<translation id="8884023684057697730"><ph name="BEGIN_BOLD" />Sådan administrerer du dine data:<ph name="END_BOLD" /> Vi sletter automatisk websites, der er ældre end 4 uger, fra listen for at beskytte dit privatliv. Et website, du besøger igen, kan blive vist på listen igen. Du kan også fjerne et website, hvis du ikke vil have, at websitet nogensinde skal definere interesser for dig igen.</translation>
<translation id="8884570509232205463">Din enhed låses nu kl. <ph name="UNLOCK_TIME" />.</translation>
<translation id="8888253246822647887">Din app åbner, når opgraderingen er fuldført. Opgraderinger kan tage et par minutter.</translation>
<translation id="8889651696183044030"><ph name="ORIGIN" /> kan redigere følgende filer og mapper</translation>
@@ -9094,7 +9094,7 @@ Opbevar din nøglefil på et sikkert sted. Du skal bruge den til at oprette nye
<translation id="9180281769944411366">Denne proces kan tage et par minutter. Linux-containeren startes.</translation>
<translation id="9180380851667544951">Websitet kan dele din skærm</translation>
<translation id="9182556968660520230">Tillad ikke, at websites afspiller beskyttet indhold</translation>
-<translation id="9183331776983279456">Chrome sletter automatisk websites, der er mere end 4 uger gamle. Et website, du besøger igen, kan blive dukke op på listen igen. Du kan også blokere et website, så det ikke kan foreslå annoncer til dig.</translation>
+<translation id="9183331776983279456">Chrome sletter automatisk websites, der er mere end 4 uger gamle. Et website, du besøger igen, kan komme tilbage på listen. Du kan også blokere et website, så det ikke kan foreslå annoncer til dig.</translation>
<translation id="918352324374649435">{COUNT,plural, =1{App}one{# app}other{# apps}}</translation>
<translation id="9186963452600581158">Log ind med et barns Google-konto</translation>
<translation id="9187967020623675250">Tasterne stemmer ikke overens. Tryk på en vilkårlig tast for at <ph name="RESPONSE" />.</translation>
@@ -9140,7 +9140,7 @@ Opbevar din nøglefil på et sikkert sted. Du skal bruge den til at oprette nye
<translation id="93343527085570547">Gå til <ph name="BEGIN_LINK1" />siden med juridisk hjælp<ph name="END_LINK1" /> for at anmode om ændringer af indhold af juridiske årsager. Nogle konto- og systemoplysninger sendes muligvis til Google. Vi bruger de oplysninger, du giver os, til at hjælpe med at løse tekniske problemer og forbedre vores tjenester i overensstemmelse med vores <ph name="BEGIN_LINK2" />privatlivspolitik<ph name="END_LINK2" /> og <ph name="BEGIN_LINK3" />servicevilkår<ph name="END_LINK3" />.</translation>
<translation id="93393615658292258">Kun adgangskode</translation>
<translation id="934244546219308557">Navngiv denne gruppe</translation>
-<translation id="934503638756687833">Elementer, der ikke er angivet her, fjernes også om nødvendigt. Få flere oplysninger om &lt;a href="<ph name="URL" />"&gt;beskyttelse mod uønsket software&lt;/a&gt; i rapporten om beskyttelse af personlige oplysninger i Chrome.</translation>
+<translation id="934503638756687833">Elementer, der ikke er angivet her, fjernes også om nødvendigt. Få flere oplysninger om &lt;a href="<ph name="URL" />"&gt;beskyttelse mod uønsket software&lt;/a&gt; i rapporten om privatlivbeskyttelse i Chrome.</translation>
<translation id="93480724622239549">Fejl</translation>
<translation id="935854577147268200">Smart Lock-telefonen er blevet ændret. Angiv din adgangskode for at opdatere Smart Lock. Næste gang låser din telefon din <ph name="DEVICE_TYPE" /> op. Du kan deaktivere Smart Lock i Indstillinger</translation>
<translation id="936646668635477464">Kamera og mikrofon</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_de.xtb b/chromium/chrome/app/resources/generated_resources_de.xtb
index 710d5497a8a..d32598017a9 100644
--- a/chromium/chrome/app/resources/generated_resources_de.xtb
+++ b/chromium/chrome/app/resources/generated_resources_de.xtb
@@ -1193,7 +1193,7 @@ Wenn du die Family Link App auf deinem Gerät installierst, kannst du die Einste
<translation id="2048554637254265991">Fehler beim Starten des Container-Managers. Bitte versuche es noch einmal.</translation>
<translation id="2048653237708779538">Aktion nicht verfügbar</translation>
<translation id="204914487372604757">Verknüpfung erstellen</translation>
-<translation id="2050339315714019657">Hochformat</translation>
+<translation id="2050339315714019657">Porträt</translation>
<translation id="2051555741181591333">Hotspot automatisch deaktivieren</translation>
<translation id="2052572566310583903">Auf deinen anderen Geräten installiert</translation>
<translation id="2053105195397337973">Wir probieren neue Optionen aus, um Tracking einzuschränken und Websites gleichzeitig zu ermöglichen, Werbespam und Betrug zu verhindern.</translation>
@@ -1938,7 +1938,7 @@ Wenn du die Family Link App auf deinem Gerät installierst, kannst du die Einste
<translation id="2683638487103917598">Ordner sortiert</translation>
<translation id="2684004000387153598">Um fortzufahren, klicke auf Ok. Klicke dann auf "Person hinzufügen", um ein neues Profil für deine E-Mail-Adresse zu erstellen.</translation>
<translation id="2687403674020088961">Alle Cookies blockieren (nicht empfohlen)</translation>
-<translation id="2687407218262674387">Nutzungsbedingungen von Google</translation>
+<translation id="2687407218262674387">Google-Nutzungsbedingungen</translation>
<translation id="2687621393791886981">Später fragen</translation>
<translation id="2688196195245426394">Fehler bei der Registrierung des Geräts auf dem Server: <ph name="CLIENT_ERROR" />.</translation>
<translation id="2688734475209947648">Du musst dir dieses Passwort nicht merken. Es wird im Google Passwortmanager für <ph name="ACCOUNT" /> gespeichert.</translation>
@@ -2841,7 +2841,7 @@ Servernachricht: <ph name="SERVER_MSG" /></translation>
<translation id="3507888235492474624">Noch einmal nach Bluetooth-Geräten suchen</translation>
<translation id="3508492320654304609">Deine Anmeldedaten konnten nicht gelöscht werden</translation>
<translation id="3508920295779105875">Anderen Ordner wählen...</translation>
-<translation id="3509379002674019679">Du kannst Passwörter erstellen, speichern und verwalten, damit du dich auf Websites und in Apps einfach anmelden kannst.</translation>
+<translation id="3509379002674019679">Hier kannst du Passwörter erstellen, speichern und verwalten, damit du dich einfacher auf Websites und in Apps anmelden kannst.</translation>
<translation id="3511200754045804813">Noch einmal suchen</translation>
<translation id="3511307672085573050">Adr&amp;esse des Links kopieren</translation>
<translation id="351152300840026870">Schriftart mit fester Breite</translation>
@@ -7878,7 +7878,7 @@ Speichere deine Schlüsseldatei an einem sicheren Ort. Du benötigst die Datei,
<translation id="8098616321286360457">Netzwerkverbindung erforderlich</translation>
<translation id="810068641062493918"><ph name="LANGUAGE" /> ausgewählt. Drücke zum Aufheben der Auswahl die Suchtaste + Leertaste.</translation>
<translation id="8100972288595615768">Websitedaten und Berechtigungen für <ph name="SITE_NAME" /> löschen?</translation>
-<translation id="8101409298456377967">Du kannst Passwörter erstellen, speichern und verwalten, damit du dich auf Websites und in Apps einfach anmelden kannst. <ph name="BEGIN_LINK" />Weitere Informationen<ph name="END_LINK" /></translation>
+<translation id="8101409298456377967">Hier kannst du Passwörter erstellen, speichern und verwalten, damit du dich einfacher auf Websites und in Apps anmelden kannst. <ph name="BEGIN_LINK" />Weitere Informationen<ph name="END_LINK" /></translation>
<translation id="810185532889603849">Personalisierte Farbe</translation>
<translation id="8101987792947961127">Powerwash beim nächsten Neustart erforderlich</translation>
<translation id="8102139037507939978">Personenidentifizierbare Informationen aus system_logs.txt entfernen.</translation>
@@ -7937,7 +7937,7 @@ Speichere deine Schlüsseldatei an einem sicheren Ort. Du benötigst die Datei,
<translation id="8157248655669507702">Damit du ein eSIM-Profil installieren kannst, musst du mobile Daten aktivieren</translation>
<translation id="8157704005178149728">Elternaufsicht wird eingerichtet</translation>
<translation id="8158117992543756526">Dieses Gerät erhält seit <ph name="MONTH_AND_YEAR" /> keine automatischen Software- und Sicherheitsupdates mehr. <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation>
-<translation id="8159652640256729753">Wenn diese Option aktiviert ist, vibriert das Gerät, wenn du beispielsweise zwischen Desktops wechselst oder den Modus für geteilten Bildschirm aktivierst. <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation>
+<translation id="8159652640256729753">Wenn diese Option aktiviert ist, vibriert das Gerät, wenn du beispielsweise zwischen Desktops wechselst oder den Splitscreen-Modus aktivierst. <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation>
<translation id="816055135686411707">Fehler beim Festlegen der Vertrauenswürdigkeit des Zertifikats</translation>
<translation id="8160775796528709999">Aktiviere „Automatische Untertitel“ in den Einstellungen, um deine Audioinhalte und Videos zu untertiteln</translation>
<translation id="816095449251911490"><ph name="SPEED" /> - <ph name="RECEIVED_AMOUNT" />, <ph name="TIME_REMAINING" /></translation>
@@ -8114,7 +8114,7 @@ Speichere deine Schlüsseldatei an einem sicheren Ort. Du benötigst die Datei,
<translation id="8314835274931377415">Einrichtung des Schalterzugriffs starten?</translation>
<translation id="8317671367883557781">Netzwerkverbindung hinzufügen</translation>
<translation id="8317965619823678157">Passwörter kopieren</translation>
-<translation id="8318266828739827371">Im geteilten Bildschirm siehst du den vergrößerten Bereich des Bildschirms Drücke die Suchtaste + Strg + D, um die angedockte Lupe zu aktivieren oder zu deaktivieren.</translation>
+<translation id="8318266828739827371">In der Splitscreen-Ansicht siehst du den vergrößerten Bereich des Bildschirms. Drücke die Suchtaste + Strg + D, um die angedockte Lupe zu aktivieren oder zu deaktivieren.</translation>
<translation id="8319414634934645341">Erweiterte Schlüsselverwendung</translation>
<translation id="8321837372750396788">Dieses Gerät (<ph name="DEVICE_TYPE" />) wird nun von <ph name="MANAGER" /> verwaltet.</translation>
<translation id="8322814362483282060">Diese Seite darf nicht auf dein Mikrofon zugreifen.</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_el.xtb b/chromium/chrome/app/resources/generated_resources_el.xtb
index c02fc370fc4..fd5f7a9c041 100644
--- a/chromium/chrome/app/resources/generated_resources_el.xtb
+++ b/chromium/chrome/app/resources/generated_resources_el.xtb
@@ -1208,7 +1208,7 @@
<translation id="2048554637254265991">Σφάλμα κατά την έναρξη του διαχειριστή κοντέινερ. Δοκιμάστε ξανά.</translation>
<translation id="2048653237708779538">Η ενέργεια δεν είναι διαθέσιμη</translation>
<translation id="204914487372604757">Δημιουργία συντόμευσης</translation>
-<translation id="2050339315714019657">Κάθετα</translation>
+<translation id="2050339315714019657">Πορτρέτο</translation>
<translation id="2051555741181591333">Αυτόματη απενεργοποίηση σημείου πρόσβασης Wi-Fi</translation>
<translation id="2052572566310583903">Εγκατεστημένη σε άλλες συσκευές σας</translation>
<translation id="2053105195397337973">Εξετάζουμε τρόπους περιορισμού της παρακολούθησης, επιτρέποντας ταυτόχρονα στους ιστοτόπους να εμποδίζουν τις ανεπιθύμητες διαφημίσεις και την απάτη.</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_es-419.xtb b/chromium/chrome/app/resources/generated_resources_es-419.xtb
index 02ff8a7157a..c76d50afde7 100644
--- a/chromium/chrome/app/resources/generated_resources_es-419.xtb
+++ b/chromium/chrome/app/resources/generated_resources_es-419.xtb
@@ -296,7 +296,7 @@ Puedes revisar las contraseñas en cualquier momento, en <ph name="GOOGLE_PASSWO
<translation id="1254593899333212300">Conexión directa a Internet</translation>
<translation id="1257336506558170607">Exportar el certificado seleccionado</translation>
<translation id="1258491128795710625">Novedades</translation>
-<translation id="1259152067760398571">Ayer se ejecutó la verificación de seguridad</translation>
+<translation id="1259152067760398571">Ayer se ejecutó la Verificación de seguridad</translation>
<translation id="1260451001046713751">Siempre permitir ventanas emergentes y redireccionamientos de <ph name="HOST" /></translation>
<translation id="1260810365552581339">Es posible que Linux no tenga suficiente espacio en el disco. Puedes aumentar el espacio del disco de Linux y volver a intentar restablecer la copia de seguridad en <ph name="LINK_START" />Configuración<ph name="LINK_END" />.</translation>
<translation id="1261380933454402672">Moderada</translation>
@@ -804,7 +804,7 @@ Es posible que se apliquen a esta cuenta los permisos que otorgaste a apps. Pued
<translation id="1703666494654169921">No permitir que los sitios usen datos ni dispositivos de realidad virtual</translation>
<translation id="1704097193565924901">Usar mayúsculas</translation>
<translation id="1704230497453185209">No permitir que los sitios reproduzcan sonido</translation>
-<translation id="1704970325597567340">El <ph name="DATE" />, se ejecutó la verificación de seguridad</translation>
+<translation id="1704970325597567340">El <ph name="DATE" />, se ejecutó la Verificación de seguridad</translation>
<translation id="1706586824377653884">Agregado por el administrador</translation>
<translation id="170658918174941828">Se enviará la versión de Chrome y del sistema operativo, la configuración de Cast, las estadísticas de rendimiento de la duplicación y los registros de diagnóstico de canales de comunicación, así como la información que elijas incluir arriba. Estos comentarios se usan para diagnosticar problemas y mejorar la función. La información personal que envíes de forma explícita o accidental se protegerá de acuerdo con nuestras políticas de privacidad. Si envías estos comentarios, aceptas que Google pueda usarlos para mejorar sus productos o servicios.</translation>
<translation id="1708291623166985230">Hotspot inhabilitado</translation>
@@ -1062,7 +1062,7 @@ Es posible que se apliquen a esta cuenta los permisos que otorgaste a apps. Pued
<translation id="192494336144674234">Abrir con</translation>
<translation id="1925017091976104802">Presiona <ph name="MODIFIER_KEY_DESCRIPTION" /> para copiar</translation>
<translation id="1925021887439448749">Ingresa una dirección web personalizada</translation>
-<translation id="1925124445985510535">A las <ph name="TIME" />, se ejecutó la verificación de seguridad</translation>
+<translation id="1925124445985510535">A las <ph name="TIME" />, se ejecutó la Verificación de seguridad</translation>
<translation id="192564025059434655">Las versiones anteriores de las Apps de Chrome dejarán de funcionar en dispositivos con Windows después de diciembre de 2022. Puedes comprobar si hay una nueva versión disponible.</translation>
<translation id="1926339101652878330">Esta configuración se controla por medio de una política de la empresa. Ponte en contacto con tu administrador para obtener más información.</translation>
<translation id="1927632033341042996">Dedo <ph name="NEW_FINGER_NUMBER" /></translation>
@@ -1193,7 +1193,7 @@ Para administrar la configuración de esta cuenta, instala la app de Family Lin
<translation id="2048554637254265991">Se produjo un error al iniciar el administrador de contenedores. Vuelve a intentarlo.</translation>
<translation id="2048653237708779538">La acción no está disponible</translation>
<translation id="204914487372604757">Crear accesos directos</translation>
-<translation id="2050339315714019657">Vertical</translation>
+<translation id="2050339315714019657">Retrato</translation>
<translation id="2051555741181591333">Inhabilitar el hotspot automáticamente</translation>
<translation id="2052572566310583903">Instaladas en tus otros dispositivos</translation>
<translation id="2053105195397337973">Estamos explorando formas de restringir el seguimiento, a la vez que habilitamos a los sitios para frenar el fraude y el spam de anuncios.</translation>
@@ -1327,7 +1327,7 @@ Para administrar la configuración de esta cuenta, instala la app de Family Lin
<translation id="2154484045852737596">Editar tarjeta</translation>
<translation id="2155772377859296191">Resolución: <ph name="WIDTH" /> × <ph name="HEIGHT" /></translation>
<translation id="2156294658807918600">Service Worker: <ph name="SCRIPT_URL" /></translation>
-<translation id="2156877321344104010">Volver a ejecutar la verificación de seguridad</translation>
+<translation id="2156877321344104010">Volver a ejecutar la Verificación de seguridad</translation>
<translation id="2157474325782140681">Para obtener más funciones, usa una estación de conexión Dell diseñada para funcionar con esta Chromebook.</translation>
<translation id="215753907730220065">Salir de pantalla completa</translation>
<translation id="2157875535253991059">Esta página está en modo de pantalla completa.</translation>
@@ -2182,7 +2182,7 @@ Para administrar la configuración de esta cuenta, instala la app de Family Lin
<translation id="2891922230654533301">¿Quieres usar tu dispositivo para acceder a <ph name="APP_NAME" />?</translation>
<translation id="2893013536106749396">Elige las tarjetas que te mantienen al tanto de lo que te importa.</translation>
<translation id="2893168226686371498">Navegador predeterminado</translation>
-<translation id="2893180576842394309">Es posible que Google use tu historial para personalizar la Búsqueda, los anuncios y otros servicios de Google.</translation>
+<translation id="2893180576842394309">Es posible que Google use tu historial para personalizar la Búsqueda y otros servicios de Google.</translation>
<translation id="2894757982205307093">Nueva pestaña en el grupo</translation>
<translation id="289695669188700754">ID de clave: <ph name="KEY_ID" /></translation>
<translation id="2897713966423243833">Se quitará esta configuración personalizada cuando cierres todas las ventanas de incógnito</translation>
@@ -2460,7 +2460,7 @@ Para administrar la configuración de esta cuenta, instala la app de Family Lin
<translation id="3143754809889689516">Reproducir desde el principio</translation>
<translation id="3144647712221361880">Abrir vínculo como</translation>
<translation id="3149510190863420837">Aplicaciones de Chrome</translation>
-<translation id="3150693969729403281">Ejecuta la verificación de seguridad ahora</translation>
+<translation id="3150693969729403281">Ejecuta la Verificación de seguridad ahora</translation>
<translation id="3150927491400159470">Volver a cargar de manera forzada</translation>
<translation id="315116470104423982">Datos móviles</translation>
<translation id="3151539355209957474">Hora de inicio</translation>
@@ -2476,7 +2476,7 @@ Para administrar la configuración de esta cuenta, instala la app de Family Lin
<translation id="3160928651883997588">Preferencias de VPN</translation>
<translation id="3161522574479303604">Todos los idiomas</translation>
<translation id="3162853326462195145">Cuenta de una institución educativa</translation>
-<translation id="3162899666601560689">Los sitios pueden usar cookies para mejorar la experiencia de navegación, por ejemplo, para mantener el acceso a ellos o recordar elementos del carrito de compras.</translation>
+<translation id="3162899666601560689">Los sitios pueden usar cookies para mejorar la experiencia de navegación, por ejemplo, para mantener el acceso a ellos o recordar artículos del carrito de compras.</translation>
<translation id="3163201441334626963">Producto desconocido <ph name="PRODUCT_ID" /> del proveedor <ph name="VENDOR_ID" /></translation>
<translation id="3163511056918491211">Cambia de dispositivo o restablece tus datos fácilmente en cualquier momento. Las copias de seguridad se suben a Google y se encriptan con la contraseña de tu Cuenta de Google.</translation>
<translation id="3164329792803560526">Compartiendo esta pestaña en <ph name="APP_NAME" /></translation>
@@ -2565,7 +2565,7 @@ Para administrar la configuración de esta cuenta, instala la app de Family Lin
<translation id="3264582393905923483">Contexto</translation>
<translation id="3265459715026181080">Cerrar ventana</translation>
<translation id="3266022278425892773">Entorno de desarrollo de Linux</translation>
-<translation id="3266274118485960573">Se está ejecutando la verificación de seguridad.</translation>
+<translation id="3266274118485960573">Se está ejecutando la Verificación de seguridad.</translation>
<translation id="3267726687589094446">Seguir permitiendo las descargas automáticas de varios archivos</translation>
<translation id="3268451620468152448">Pestañas abiertas</translation>
<translation id="3269093882174072735">Cargar imagen</translation>
@@ -2654,7 +2654,7 @@ Para administrar la configuración de esta cuenta, instala la app de Family Lin
<translation id="3342361181740736773">"<ph name="TRIGGERING_EXTENSION_NAME" />" desea quitar esta extensión.</translation>
<translation id="3343046414300263892">Aumentar el tamaño de la fuente</translation>
<translation id="3343977377045378693">Realizando la configuración</translation>
-<translation id="3345634917232014253">Hace un momento, se ejecutó la verificación de seguridad</translation>
+<translation id="3345634917232014253">Hace un momento, se ejecutó la Verificación de seguridad</translation>
<translation id="3345886924813989455">No se ha encontrado el navegador compatible</translation>
<translation id="3347086966102161372">Copiar dirección de la imagen</translation>
<translation id="3348038390189153836">Se detectó un dispositivo removible.</translation>
@@ -5011,7 +5011,7 @@ Puedes asignar varios interruptores a esta acción.</translation>
<translation id="5499476581866658341">Ahora puedes ver las fotos y el contenido multimedia recientes de tu teléfono</translation>
<translation id="549957179819296104">Ícono nuevo</translation>
<translation id="5500168250243071806">Es posible que el <ph name="BEGIN_LINK_SEARCH" />historial de búsqueda<ph name="END_LINK_SEARCH" /> y <ph name="BEGIN_LINK_GOOGLE" />otras formas de actividad<ph name="END_LINK_GOOGLE" /> se guarden en tu Cuenta de Google cuando accedes. Podrás borrarlas en cualquier momento.</translation>
-<translation id="5500709606820808700">Hoy se ejecutó la verificación de seguridad</translation>
+<translation id="5500709606820808700">Hoy se ejecutó la Verificación de seguridad</translation>
<translation id="5501322521654567960">Panel lateral alineado a la izquierda</translation>
<translation id="5501809658163361512">{COUNT,plural, =1{No fue posible recibir <ph name="ATTACHMENTS" /> de <ph name="DEVICE_NAME" />}other{No fue posible recibir <ph name="ATTACHMENTS" /> de <ph name="DEVICE_NAME" />}}</translation>
<translation id="5502500733115278303">Importado desde Firefox</translation>
@@ -5426,7 +5426,7 @@ Puedes asignar varios interruptores a esta acción.</translation>
<translation id="5884447826201752041">Personalizar para cada extensión</translation>
<translation id="5884474295213649357">Esta pestaña está conectada a un dispositivo USB.</translation>
<translation id="5885314688092915589">Tu organización administrará este perfil</translation>
-<translation id="5886009770935151472">Dedo 1</translation>
+<translation id="5886009770935151472">Huella dactilar 1</translation>
<translation id="5886112770923972514">Conéctate a dispositivos cercanos con Vinculación rápida y configúralos rápidamente</translation>
<translation id="5886384907280980632">Desactivar ahora</translation>
<translation id="5888889603768021126">Accediste con</translation>
@@ -5896,7 +5896,7 @@ Puedes asignar varios interruptores a esta acción.</translation>
<translation id="6310141306111263820">No fue posible instalar el perfil de eSIM. Para obtener ayuda, comunícate con el proveedor.</translation>
<translation id="6311165245110979290">Tarjeta virtual disponible</translation>
<translation id="6311220991371174222">No se puede iniciar Chrome porque se produjo un error al abrir tu perfil. Intenta reiniciar Chrome.</translation>
-<translation id="6312567056350025599">{NUM_DAYS,plural, =1{Se ejecutó hace 1 día la verificación de seguridad}other{Se ejecutó hace {NUM_DAYS} días la verificación de seguridad}}</translation>
+<translation id="6312567056350025599">{NUM_DAYS,plural, =1{Se ejecutó hace 1 día la Verificación de seguridad}other{Se ejecutó hace {NUM_DAYS} días la Verificación de seguridad}}</translation>
<translation id="6312638141433622592">Ofrece mostrar artículos en el modo de lectura, cuando sea compatible</translation>
<translation id="6313641880021325787">SALIR DE RV</translation>
<translation id="6313950457058510656">Desactivar la Conexión instantánea mediante dispositivo móvil</translation>
@@ -6190,7 +6190,7 @@ Puedes asignar varios interruptores a esta acción.</translation>
<translation id="6587958707401001932">Elegir la configuración predeterminada</translation>
<translation id="6588043302623806746">Usar DNS seguro</translation>
<translation id="6588047202935130957">Es posible que aparezca una lista de intereses aquí mientras navegas en la Web.</translation>
-<translation id="659005207229852190">Se completó la verificación de seguridad.</translation>
+<translation id="659005207229852190">Se completó la Verificación de seguridad.</translation>
<translation id="6590458744723262880">Cambiar nombre de carpeta</translation>
<translation id="6592267180249644460">Fecha y hora de captura de registro de WebRTC: <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
<translation id="6592808042417736307">Se capturó tu huella dactilar</translation>
@@ -6735,7 +6735,7 @@ Tienes # contraseñas hackeadas más. El Administrador de contraseñas de Go
<translation id="7055451306017383754">No se puede dejar de compartir esta carpeta porque una app la está usando. Dejará de compartirse la próxima vez que se cierre Parallels Desktop.</translation>
<translation id="7056418393177503237">{0,plural, =1{Incógnito}other{# ventanas de incógnito abierta}}</translation>
<translation id="7056526158851679338">&amp;Inspeccionar dispositivos</translation>
-<translation id="7057184853669165321">{NUM_MINS,plural, =1{La verificación de seguridad se ejecutó hace 1 minuto}other{La verificación de seguridad se ejecutó hace {NUM_MINS} minutos}}</translation>
+<translation id="7057184853669165321">{NUM_MINS,plural, =1{La Verificación de seguridad se ejecutó hace 1 minuto}other{La Verificación de seguridad se ejecutó hace {NUM_MINS} minutos}}</translation>
<translation id="7057767408836081338">No se pudieron obtener los datos de la app. Se intenta ejecutar la app de todos modos…</translation>
<translation id="7058024590501568315">Red oculta</translation>
<translation id="7059858479264779982">Permitir inicio automático</translation>
@@ -6964,7 +6964,7 @@ Tienes # contraseñas hackeadas más. El Administrador de contraseñas de Go
<translation id="7295614427631867477">Ten en cuenta que Android, Play y las apps asociadas se rigen por sus propias políticas de uso y recopilación de datos.</translation>
<translation id="729583233778673644">Permite la encriptación AES y RC4. Esta opción es riesgosa, ya que los cifrados RC4 son inseguros.</translation>
<translation id="7297726121602187087">Verde oscuro</translation>
-<translation id="7298195798382681320">Recomendada</translation>
+<translation id="7298195798382681320">Recomendado</translation>
<translation id="7299337219131431707">Habilitar navegación como invitado</translation>
<translation id="7299515639584427954">¿Quieres cambiar la app predeterminada para los vínculos compatibles?</translation>
<translation id="7299588179200441056"><ph name="URL" /> - <ph name="FOLDER" /></translation>
@@ -7076,7 +7076,7 @@ Tienes # contraseñas hackeadas más. El Administrador de contraseñas de Go
<translation id="7401778920660465883">Descartar este mensaje</translation>
<translation id="7403642243184989645">Descarga de recursos</translation>
<translation id="7404065585741198296">Tu teléfono con un cable USB</translation>
-<translation id="7405938989981604410">{NUM_HOURS,plural, =1{Se ejecutó hace 1 hora la verificación de seguridad}other{Se ejecutó hace {NUM_HOURS} horas la verificación de seguridad}}</translation>
+<translation id="7405938989981604410">{NUM_HOURS,plural, =1{Se ejecutó hace 1 hora la Verificación de seguridad}other{Se ejecutó hace {NUM_HOURS} horas la Verificación de seguridad}}</translation>
<translation id="740624631517654988">Ventana emergente (pop-up) bloqueada</translation>
<translation id="7406912950279255498">Modo de inversión de colores</translation>
<translation id="7407430846095439694">Importar y vincular</translation>
@@ -7227,7 +7227,7 @@ Tienes # contraseñas hackeadas más. El Administrador de contraseñas de Go
<translation id="7531779363494549572">Ve a Configuración &gt; Apps y notificaciones &gt; Notificaciones.</translation>
<translation id="7532009420053991888"><ph name="LINUX_APP_NAME" /> no responde. Selecciona "Forzar cierre" para cerrar la app.</translation>
<translation id="7535730537657706072">Para borrar del dispositivo el historial de navegación en modo Incógnito, cierra todas las pestañas de incógnito.</translation>
-<translation id="7537451260744431038">Los sitios no pueden usar cookies para mejorar la experiencia de navegación, por ejemplo, para mantener el acceso a ellos o recordar elementos del carrito de compras.</translation>
+<translation id="7537451260744431038">Los sitios no pueden usar cookies para mejorar la experiencia de navegación, por ejemplo, para mantener el acceso a ellos o recordar artículos del carrito de compras.</translation>
<translation id="7538088324298143359">Buscar en la imagen con <ph name="SEARCH_ENGINE" /></translation>
<translation id="7540972813190816353">Se produjo un error al buscar actualizaciones: <ph name="ERROR" /></translation>
<translation id="7541076351905098232"><ph name="MANAGER" /> revirtió este dispositivo a una versión anterior. Guarda los archivos importantes y, luego, reinicia el sistema. Se borrarán todos los datos del dispositivo.</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_es.xtb b/chromium/chrome/app/resources/generated_resources_es.xtb
index df5ed6374a3..e311c85619c 100644
--- a/chromium/chrome/app/resources/generated_resources_es.xtb
+++ b/chromium/chrome/app/resources/generated_resources_es.xtb
@@ -265,7 +265,7 @@ Comprueba tus contraseñas en cualquier momento en el <ph name="GOOGLE_PASSWORD_
<translation id="1227660082540388410">Editar clave de acceso</translation>
<translation id="1227993798763400520">Error al enviar. Vuelve a intentarlo.</translation>
<translation id="1230417814058465809">La protección estándar está activada. Para navegar con aún más seguridad, usa la protección mejorada.</translation>
-<translation id="1231733316453485619">¿Activar sincronización?</translation>
+<translation id="1231733316453485619">¿Activar la sincronización?</translation>
<translation id="1232569758102978740">Sin título</translation>
<translation id="1233497634904001272">Vuelve a tocar tu llave de seguridad para completar la solicitud.</translation>
<translation id="1233721473400465416">Configuración regional</translation>
@@ -1196,7 +1196,7 @@ Puedes gestionar la configuración de esta cuenta instalando la aplicación Fami
<translation id="2048554637254265991">Se ha producido un problema al iniciar el gestor de contenedores. Inténtalo de nuevo.</translation>
<translation id="2048653237708779538">Acción no disponible</translation>
<translation id="204914487372604757">Crear acceso directo</translation>
-<translation id="2050339315714019657">Vertical</translation>
+<translation id="2050339315714019657">Retrato</translation>
<translation id="2051555741181591333">Inhabilitar punto de acceso automáticamente</translation>
<translation id="2052572566310583903">Instaladas en tus otros dispositivos</translation>
<translation id="2053105195397337973">Estamos buscando formas de restringir el seguimiento, al tiempo que permitimos que los sitios puedan detener el spam publicitario y el fraude.</translation>
@@ -5397,7 +5397,7 @@ Puedes asignar esta acción a varios interruptores.</translation>
<translation id="5857675236236529683">Cuando quieras, consulta tu lista de lectura aquí</translation>
<translation id="5858490737742085133">Terminal</translation>
<translation id="585979798156957858">Tecla meta externa</translation>
-<translation id="5860033963881614850">Desactivado</translation>
+<translation id="5860033963881614850">Desactivada</translation>
<translation id="5860254591544742609">Mostrar barra de título</translation>
<translation id="5860491529813859533">Activar</translation>
<translation id="5860494867054883682">Actualizando el canal del dispositivo a <ph name="CHANNEL_NAME" /> (<ph name="PROGRESS_PERCENT" />)</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_eu.xtb b/chromium/chrome/app/resources/generated_resources_eu.xtb
index 65c1d69dacb..4fcc9739ebe 100644
--- a/chromium/chrome/app/resources/generated_resources_eu.xtb
+++ b/chromium/chrome/app/resources/generated_resources_eu.xtb
@@ -1770,7 +1770,7 @@ Voice Match-ekin, Google-ren Laguntzailea zerbitzuak <ph name="SUPERVISED_USER_N
<translation id="2526619973349913024">Bilatu eguneratzeak</translation>
<translation id="2527167509808613699">Edozein motatako konexioa</translation>
<translation id="2529887123641260401">Ezarpenak aldatzeko edo konfigurazio-gida berriro irekitzeko, joan Erabilerraztasun-osagarriaren ezarpenak atalera.</translation>
-<translation id="2530166226437958497">Irtenbideak</translation>
+<translation id="2530166226437958497">Konponbideak</translation>
<translation id="2531530485656743109"><ph name="BEGIN_PARAGRAPH1" />Arazoren bat izan da eta ezin izan da instalatu <ph name="DEVICE_OS" />.<ph name="END_PARAGRAPH1" />
<ph name="BEGIN_PARAGRAPH2" />Laguntza gehiago behar baduzu, joan g.co/flex/InstallErrors helbidera.<ph name="END_PARAGRAPH2" /></translation>
<translation id="2532144599248877204">Bateria gutxi gorabehera % 80an mantentzen du haren iraupena luzatzeko. Bateria guztiz kargatuko da korrontetik deskonektatu aurretik.</translation>
@@ -2668,7 +2668,7 @@ Txartel adimenduna sartuta edukitzea eskatzen du <ph name="DOMAIN" /> domeinuak.
<translation id="3354972872297836698">Ezin izan da parekatu <ph name="DEVICE_NAME" /> gailuarekin; berriro saiatzeko, hautatu gailua</translation>
<translation id="335581015389089642">Hizketa</translation>
<translation id="3355936511340229503">Konexio-errorea</translation>
-<translation id="3356036636691722598">Gozatu jokoez Chromebook-ean</translation>
+<translation id="3356036636691722598">Gozatu bideojokoez Chromebook-ean</translation>
<translation id="3356469410714175391">(Txartel birtuala gaituta dago)</translation>
<translation id="3356580349448036450">Osatuta</translation>
<translation id="3359256513598016054">Ziurtagiri-gidalerroaren murriztapenak</translation>
@@ -2747,7 +2747,7 @@ Txartel adimenduna sartuta edukitzea eskatzen du <ph name="DOMAIN" /> domeinuak.
<translation id="3429271624041785769">Sareko edukiaren hizkuntzak</translation>
<translation id="3429275422858276529">Egin orri honen laster-marka, geroago bizkor aurkitzeko</translation>
<translation id="3432762828853624962">Shared Workers</translation>
-<translation id="3433507769937235446">Irtetean pantaila blokeatzeko eginbidea</translation>
+<translation id="3433507769937235446">Blokeatu irtetean</translation>
<translation id="3433621910545056227">Sistemak ezin izan du ezarri gailuaren instalazio-atributuen blokeoa.</translation>
<translation id="3434107140712555581">% <ph name="BATTERY_PERCENTAGE" /></translation>
<translation id="3434272557872943250">Haurraren kontuko Sareko eta aplikazioetako jarduera gehigarriak ezarpena aktibatuta badago, baliteke datu horiek haren Google-ko kontuan gordetzea. Lortu ezarpen horiei buruzko informazio gehiago eta ikasi haiek doitzen families.google.com helbidean.</translation>
@@ -3248,7 +3248,7 @@ Txartel adimenduna sartuta edukitzea eskatzen du <ph name="DOMAIN" /> domeinuak.
<translation id="3855676282923585394">Inportatu laster-markak eta ezarpenak…</translation>
<translation id="3856096718352044181">Egiaztatu hornitzaile horrek balio duela edo saiatu berriro geroago</translation>
<translation id="3856800405688283469">Hautatu ordu-zona</translation>
-<translation id="3857807444929313943">Jaso hatza eta ukitu berriro</translation>
+<translation id="3857807444929313943">Jaso hatza eta sakatu berriro</translation>
<translation id="3858860766373142691">Izena</translation>
<translation id="385939467708172187">Erabili pasahitz konplexu bat</translation>
<translation id="3861638017150647085">"<ph name="USERNAME" />" erabiltzaile-izena ez dago erabilgarri</translation>
@@ -3985,7 +3985,7 @@ Txartel adimenduna sartuta edukitzea eskatzen du <ph name="DOMAIN" /> domeinuak.
<translation id="4538417792467843292">Ezabatu hitza</translation>
<translation id="4538792345715658285">Enpresaren gidalerroen arabera instalatuta.</translation>
<translation id="4541123282641193691">Ezin izan da egiaztatu kontua. Saiatu berriro edo berrabiarazi Chromebook-a.</translation>
-<translation id="4541662893742891060">Ezin da konektatu profil honetara. Laguntza teknikoa eskuratzeko, jarri harremanetan operadorearekin.</translation>
+<translation id="4541662893742891060">Ezin da konektatu profil honetara. Laguntza teknikoa eskuratzeko, jarri operadorearekin harremanetan.</translation>
<translation id="4541706525461326392">Profila kentzen. Agian minutu batzuk beharko dira.</translation>
<translation id="4542332958571335077">{NUM_PASSWORDS,plural, =1{Gailuko pasahitz bat Google-ren Pasahitz-kudeatzailea zerbitzura inportatu da}other{Gailuko {NUM_PASSWORDS} pasahitz Google-ren Pasahitz-kudeatzailea zerbitzura inportatu dira}}</translation>
<translation id="4542520061254486227">Irakurri <ph name="WEBSITE_1" /> eta <ph name="WEBSITE_2" /> webguneetan dituzun datuak</translation>
@@ -5667,7 +5667,7 @@ Erabilerraztasun-etengailu bat baino gehiago eslei diezazkiokezu ekintza horri.<
<translation id="6095984072944024315">−</translation>
<translation id="6096047740730590436">Ireki maximizatuta</translation>
<translation id="6096326118418049043">X.500 izena</translation>
-<translation id="609662062217584106">UPIko IDa</translation>
+<translation id="609662062217584106">UPIko identifikatzailea</translation>
<translation id="6097480669505687979">Tokirik egiten ez baduzu, baliteke erabiltzaileak eta datuak automatikoki kentzea.</translation>
<translation id="6097600385983390082">Itxi da ahozko bilaketa</translation>
<translation id="6098793583803863900">Fitxategi ezezagun bat aztertzen ari gara, eduki arriskutsurik duen ikusteko.</translation>
@@ -5893,7 +5893,7 @@ Txartel adimenduna sartuta edukitzea eskatzen du <ph name="DOMAIN" /> domeinuak.
<translation id="6309443618838462258">Administratzaileak ez du onartzen idazketa-metodo hau</translation>
<translation id="630948338437014525">oroitzapenak</translation>
<translation id="6309510305002439352">Mikrofonoa erabiltzeko baimena desaktibatuta dago</translation>
-<translation id="6310141306111263820">Ezin izan da instalatu eSIMaren profila. Laguntza eskuratzeko, jarri harremanetan operadorearekin.</translation>
+<translation id="6310141306111263820">Ezin izan da instalatu eSIMaren profila. Laguntza eskuratzeko, jarri operadorearekin harremanetan.</translation>
<translation id="6311165245110979290">Txartel birtuala erabilgarri</translation>
<translation id="6311220991371174222">Ezin da Chrome abiarazi arazoren bat izan delako profila irekitzean. Berrabiarazi Chrome.</translation>
<translation id="6312567056350025599">{NUM_DAYS,plural, =1{Atzo egin zen segurtasun-egiaztapena}other{Duela {NUM_DAYS} egun egin zen segurtasun-egiaztapena}}</translation>
@@ -7712,7 +7712,7 @@ Esleipen bat kentzeko, berriz, sakatu esleipen bat daukan erabilerraztasun-eteng
<translation id="7955105108888461311">Eska iezadazu zuzenean</translation>
<translation id="7955177647836564772">Smart Lock aktibatuta badago eta telefonoa, berriz, desblokeatuta, ez duzu pasahitzik edo PINik idatzi behar</translation>
<translation id="7956373551960864128">Gordetako inprimagailuak</translation>
-<translation id="7957074856830851026">Ikusi gailuaren informazioa, hala nola serie-zenbakia edo baliabidearen IDa</translation>
+<translation id="7957074856830851026">Ikusi gailuaren informazioa, hala nola serie-zenbakia edo baliabidearen identifikatzailea</translation>
<translation id="7959074893852789871">Fitxategiak ziurtagiri bat baino gehiago ditu eta horietako batzuk inportatu dira:</translation>
<translation id="7959665254555683862">Ezkutuko moduko beste fitxa bat</translation>
<translation id="7961015016161918242">Inoiz ez</translation>
@@ -7737,7 +7737,7 @@ Esleipen bat kentzeko, berriz, sakatu esleipen bat daukan erabilerraztasun-eteng
<translation id="7975504106303186033">Chrome Education-eko gailu hau G Suite for Education-eko kontu batekin erregistratu behar duzu. Beste kontu bat erregistratzeko, joan g.co/workspace/edusignup helbidera.</translation>
<translation id="7978412674231730200">Gako pribatua</translation>
<translation id="7978450511781612192">Zure Google-ko kontuetako saioa amaituko da. Aurrerantzean, ez dira sinkronizatuko laster-markak, historia, pasahitzak eta beste.</translation>
-<translation id="7980084013673500153">Erreproduzigai IDa: <ph name="ASSET_ID" /></translation>
+<translation id="7980084013673500153">Erreproduzigaiaren identifikatzailea: <ph name="ASSET_ID" /></translation>
<translation id="7981313251711023384">Aurrekargatu orriak azkarrago arakatzeko eta bilatzeko</translation>
<translation id="7981662863948574132">Erakutsi gailuaren EID zenbakiaren eta QR kodearen leiho gainerakorra</translation>
<translation id="7981670705071137488">Aurrerantzean, softwarea atzeko planoan eguneratuko da. Ezarpenak atalean berrikus ditzakezu softwarea eguneratzeko aukeraren inguruko hobespenak.</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_fa.xtb b/chromium/chrome/app/resources/generated_resources_fa.xtb
index fef55c7e0ee..af6cb177784 100644
--- a/chromium/chrome/app/resources/generated_resources_fa.xtb
+++ b/chromium/chrome/app/resources/generated_resources_fa.xtb
@@ -246,7 +246,7 @@
<translation id="120368089816228251">نت موسیقی</translation>
<translation id="1203942045716040624">Shared Worker: <ph name="SCRIPT_URL" /></translation>
<translation id="1211769675100312947">میان‌برها توسط شما گزینش می‌شوند</translation>
-<translation id="1213254615020057352">‏داده‌های استفاده و عیب‌یابی را ارسال کنید. با ارسال خودکار داده‌های عیب‌یابی و داده‌های استفاده از دستگاه و برنامه به Google به بهبود تجربه Android خود کمک کنید. این داده‌ها برای شناسایی فرزندتان استفاده نخواهند شد و به بهبود پایداری سیستم و برنامه و موارد دیگر کمک خواهد کرد. بعضی داده‌های انبوهشی نیز به برنامه‌ها و شرکای Google (مانند «برنامه‌نویس‌های Android») کمک می‌کند. این تنظیم را مالک اعمال می‌کند. ممکن است مالک انتخاب کند داده‌های استفاده و عیب‌یابی این دستگاه به Google ارسال شود. اگر تنظیم «فعالیت وب و برنامه» تکمیلی برای فرزندتان روشن باشد، ممکن است این داده‌ها در «حساب Google» او ذخیره شود.</translation>
+<translation id="1213254615020057352">‏داده‌های استفاده و عیب‌یابی را ارسال کنید. با ارسال خودکار داده‌های عیب‌یابی و داده‌های استفاده از دستگاه و برنامه به Google به بهبود تجربه Android خود کمک کنید. این داده‌ها برای شناسایی فرزندتان استفاده نخواهند شد و به بهبود پایداری سیستم و برنامه و موارد دیگر کمک خواهد کرد. بعضی داده‌های انبوهشی نیز به برنامه‌ها و شرکای Google (مانند «برنامه‌نویس‌های Android») کمک می‌کند. این تنظیم را مالک اعمال می‌کند. ممکن است مالک انتخاب کند داده‌های استفاده و عیب‌یابی این دستگاه به Google ارسال شود. اگر تنظیم «فعالیت‌ها در وب و برنامه» تکمیلی برای فرزندتان روشن باشد، ممکن است این داده‌ها در «حساب Google» او ذخیره شود.</translation>
<translation id="1213726621272705156">دیگر کارتی در این صفحه نخواهید دید</translation>
<translation id="121384500095351701">نمی‌توان این فایل را به‌طور ایمن بارگیری کرد</translation>
<translation id="1215411991991485844">برنامه جدید پس‌زمینه اضافه شد</translation>
@@ -1205,7 +1205,7 @@
<translation id="2048554637254265991">خطایی در راه‌اندازی مدیر محتوی وجود داشت. لطفاً دوباره امتحان کنید.</translation>
<translation id="2048653237708779538">کنش دردسترس نیست</translation>
<translation id="204914487372604757">ایجاد میان‌بر</translation>
-<translation id="2050339315714019657">عمودی</translation>
+<translation id="2050339315714019657">پرتره</translation>
<translation id="2051555741181591333">غیرفعال کردن خودکار نقطه اتصال</translation>
<translation id="2052572566310583903">در دیگر دستگاه‌هایتان نصب شده است</translation>
<translation id="2053105195397337973">در تلاشیم روش‌هایی برای محدود کردن ردیابی پیدا کنیم که هم‌زمان به سایت‌ها امکان بدهند هرزآگهی و تقلب را متوقف کنند.</translation>
@@ -1427,7 +1427,7 @@
<translation id="2232751457155581899">سایت‌ها می‌توانند ردیابی موقعیت دوربین را درخواست کنند</translation>
<translation id="2232876851878324699">این فایل دارای یک مجوز است، که وارد نشده است:</translation>
<translation id="2233502537820838181">&amp;اطلاعات بیشتر</translation>
-<translation id="223356358902285214">فعالیت برنامه و وب</translation>
+<translation id="223356358902285214">فعالیت‌ها در وب و برنامه</translation>
<translation id="2234827758954819389">راهنمای حریم خصوصی</translation>
<translation id="2234876718134438132">‏همگام‌سازی و سرویس‌های Google</translation>
<translation id="2235344399760031203">کوکی‌های شخص ثالث مسدود شده‌اند</translation>
@@ -1583,7 +1583,7 @@
<translation id="234889437187286781">خطا در بارگیری اطلاعات</translation>
<translation id="2348939752188770364">پاک کردن اطلاعات شخصی‌سازی…</translation>
<translation id="2349610121459545414">دسترسی این سایت به مکان شما همچنان مجاز باشد</translation>
-<translation id="2349896577940037438">‏اگر تنظیم «فعالیت وب و برنامه» تکمیلی روشن باشد، ممکن است این داده‌ها در «حساب Google» شما ذخیره شود. می‌توانید در account.google.com، داده‌هایتان را ببینید، حذف کنید، و تنظیمات حسابتان را تغییر دهید.</translation>
+<translation id="2349896577940037438">‏اگر تنظیم «فعالیت‌ها در وب و برنامه» تکمیلی روشن باشد، ممکن است این داده‌ها در «حساب Google» شما ذخیره شود. می‌توانید در account.google.com، داده‌هایتان را ببینید، حذف کنید، و تنظیمات حسابتان را تغییر دهید.</translation>
<translation id="2350133097354918058">بار کردن مجدد شد</translation>
<translation id="2350182423316644347">راه‌اندازی برنامه کاربردی...</translation>
<translation id="235028206512346451">اگر از دستگاهتان دور شوید، صفحه‌نمایش به‌طور خودکار قفل می‌شود. وقتی مقابل دستگاهتان هستید، صفحه‌نمایش به‌مدت طولانی‌تری بیدار می‌ماند. اگر از صفحه قفل استفاده نمی‌کنید، دستگاه به‌جای قفل شدن به خواب می‌رود.</translation>
@@ -1624,7 +1624,7 @@
<translation id="2379281330731083556">چاپ با استفاده از گفتگوی سیستم... <ph name="SHORTCUT_KEY" /></translation>
<translation id="2381499968174336913">پیش‌نمای برگه هم‌رسانی‌شده</translation>
<translation id="2381756643783702095">قبل از ارسال سؤال شود (توصیه می‌شود)</translation>
-<translation id="2383825469508278924">تغییر نگاشت کلیدهای صفحه‌کلید، کلیدهای عملکرد و غیره</translation>
+<translation id="2383825469508278924">تغییر نگاشت کلیدهای صفحه‌کلید، کلیدهای کار و غیره</translation>
<translation id="2387052489799050037">رفتن به صفحه اصلی</translation>
<translation id="2387602571959163792"><ph name="DESK_NAME" /> (فعلی)</translation>
<translation id="2390347491606624519">اتصال به پراکسی امکان‌پذیر نیست، لطفاً دوباره به سیستم وارد شوید</translation>
@@ -2256,7 +2256,7 @@
<translation id="2942560570858569904">درحال انتظار…</translation>
<translation id="2942581856830209953">سفارشی کردن این صفحه</translation>
<translation id="2943268899142471972">‏فایل پشتیبان Crostini یا «دفترچه Ansible» را انتخاب کنید</translation>
-<translation id="2944060181911631861">‏داده‌های استفاده و عیب‌یابی را ارسال کنید. با ارسال خودکار داده‌های تشخیص عیب و داده‌های استفاده از دستگاه و برنامه به Google، به بهبود تجربه استفاده از Android کمک کنید. این داده‌ها به بهبود پایداری سیستم و برنامه و موارد دیگر کمک خواهد کرد. بعضی داده‌های انبوهشی نیز به برنامه‌ها و شرکای Google (مانند برنامه‌نویس‌های Android) کمک می‌کند. اگر تنظیم «فعالیت وب و برنامه» تکمیلی روشن باشد، ممکن است این داده‌ها در حساب Google شما ذخیره شود. <ph name="BEGIN_LINK1" />بیشتر بدانید<ph name="END_LINK1" /></translation>
+<translation id="2944060181911631861">‏داده‌های استفاده و عیب‌یابی را ارسال کنید. با ارسال خودکار داده‌های تشخیص عیب و داده‌های استفاده از دستگاه و برنامه به Google، به بهبود تجربه استفاده از Android کمک کنید. این داده‌ها به بهبود پایداری سیستم و برنامه و موارد دیگر کمک خواهد کرد. بعضی داده‌های انبوهشی نیز به برنامه‌ها و شرکای Google (مانند برنامه‌نویس‌های Android) کمک می‌کند. اگر تنظیم «فعالیت‌ها در وب و برنامه» تکمیلی روشن باشد، ممکن است این داده‌ها در حساب Google شما ذخیره شود. <ph name="BEGIN_LINK1" />بیشتر بدانید<ph name="END_LINK1" /></translation>
<translation id="2946054015403765210">رفتن به فایل‌ها</translation>
<translation id="2946119680249604491">افزودن اتصال</translation>
<translation id="2946640296642327832">فعال کردن بلوتوث</translation>
@@ -2762,7 +2762,7 @@
<translation id="3433507769937235446">قفل شدن با دور شدن</translation>
<translation id="3433621910545056227">اوه! این سیستم نتوانست قفل ویژگی‌های زمان نصب دستگاه را ایجاد کند.</translation>
<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />٪</translation>
-<translation id="3434272557872943250">‏اگر تنظیم «فعالیت وب و برنامه» تکمیلی برای فرزندتان روشن باشد، ممکن است این داده‌ها در «حساب Google» او ذخیره شود. در families.google.com، درباره این تنظیمات و نحوه تغییر آن‌ها بیشتر بدانید.</translation>
+<translation id="3434272557872943250">‏اگر تنظیم «فعالیت‌ها در وب و برنامه» تکمیلی برای فرزندتان روشن باشد، ممکن است این داده‌ها در «حساب Google» او ذخیره شود. در families.google.com، درباره این تنظیمات و نحوه تغییر آن‌ها بیشتر بدانید.</translation>
<translation id="3434475275396485144">سرپرست تلفن این تنظیم را مدیریت می‌کند</translation>
<translation id="3434512374684753970">صدا و ویدیو</translation>
<translation id="3435688026795609344">«<ph name="EXTENSION_NAME" />» <ph name="CODE_TYPE" /> شما را درخواست می‌کند</translation>
@@ -2819,7 +2819,7 @@
<translation id="3474218480460386727">واژه جدید حداکثر ۹۹ حرف می‌تواند داشته باشد</translation>
<translation id="3474624961160222204">ادامه دادن به‌عنوان <ph name="NAME" /></translation>
<translation id="3475843873335999118">متأسفیم، اثر انگشتتان هنوز شناسایی نشده است. لطفاً گذرواژه‌تان را وارد کنید.</translation>
-<translation id="3476303763173086583">‏داده‌های استفاده و عیب‌یابی را ارسال کنید. با ارسال خودکار داده‌های عیب‌یابی و داده‌های استفاده از دستگاه و برنامه به Google به بهبود تجربه Android خود کمک کنید. این داده‌ها برای شناسایی فرزندتان استفاده نخواهند شد و به بهبود پایداری سیستم و برنامه و موارد دیگر کمک خواهد کرد. بعضی داده‌های انبوهشی نیز به برنامه‌ها و شرکای Google (مانند برنامه‌نویس‌های Android) کمک می‌کند. این <ph name="BEGIN_LINK1" />تنظیم<ph name="END_LINK1" /> توسط مالک اعمال می‌شود. ممکن است مالک انتخاب کند داده‌های استفاده و عیب‌یابی این دستگاه به Google ارسال شود. اگر تنظیم «فعالیت وب و برنامه» تکمیلی برای فرزندتان روشن باشد، ممکن است این داده‌ها در حساب Google او ذخیره شود. <ph name="BEGIN_LINK2" />بیشتر بدانید<ph name="END_LINK2" /></translation>
+<translation id="3476303763173086583">‏داده‌های استفاده و عیب‌یابی را ارسال کنید. با ارسال خودکار داده‌های عیب‌یابی و داده‌های استفاده از دستگاه و برنامه به Google به بهبود تجربه Android خود کمک کنید. این داده‌ها برای شناسایی فرزندتان استفاده نخواهند شد و به بهبود پایداری سیستم و برنامه و موارد دیگر کمک خواهد کرد. بعضی داده‌های انبوهشی نیز به برنامه‌ها و شرکای Google (مانند برنامه‌نویس‌های Android) کمک می‌کند. این <ph name="BEGIN_LINK1" />تنظیم<ph name="END_LINK1" /> توسط مالک اعمال می‌شود. ممکن است مالک انتخاب کند داده‌های استفاده و عیب‌یابی این دستگاه به Google ارسال شود. اگر تنظیم «فعالیت‌ها در وب و برنامه» تکمیلی برای فرزندتان روشن باشد، ممکن است این داده‌ها در حساب Google او ذخیره شود. <ph name="BEGIN_LINK2" />بیشتر بدانید<ph name="END_LINK2" /></translation>
<translation id="347670947055184738">وای! سیستم نتوانست خط‌مشی را برای دستگاهتان واکشی کند.</translation>
<translation id="347785443197175480">همچنان دسترسی به دوربین و میکروفون شما، توسط <ph name="HOST" /> مجاز باشد</translation>
<translation id="3479552764303398839">حالا نه</translation>
@@ -3620,7 +3620,7 @@
<translation id="4193575319002689239">نمایش کارت‌ها</translation>
<translation id="4193836101014293726">نمی‌توان این نمایه را حذف کرد</translation>
<translation id="419427585139779713">هر بار یک هجا وارد می‌شود</translation>
-<translation id="4194570336751258953">فعال کردن ضربه بجای کلیک</translation>
+<translation id="4194570336751258953">فعال کردن ضربه به‌جای کلیک</translation>
<translation id="4195378859392041564">با موشواره روی یکی از کلیدها کلیک کنید، سپس یکی از کلیدهای صفحه‌کلید را فشار دهید تا آن را سفارشی کنید</translation>
<translation id="4195421689821407315">بارگیری غیرایمن</translation>
<translation id="4195643157523330669">باز کردن در برگهٔ جدید</translation>
@@ -3641,7 +3641,7 @@
<translation id="4210048056321123003">درحال بارگیری دستگاه مجازی</translation>
<translation id="4210380525132844778">دلیل: <ph name="RULE" /> در فهرست «<ph name="LIST_NAME" />» پیدا شد.</translation>
<translation id="421182450098841253">&amp;نمایش نوار نشانک‌ها</translation>
-<translation id="4211851069413100178">‏داده‌های استفاده و عیب‌یابی را ارسال کنید. با ارسال خودکار داده‌های تشخیص عیب و داده‌های استفاده از دستگاه و برنامه به Google، به بهبود تجربه استفاده از Android کمک کنید. این داده‌ها به بهبود پایداری سیستم و برنامه و موارد دیگر کمک خواهد کرد. بعضی داده‌های انبوهشی نیز به برنامه‌ها و شرکای Google (مانند برنامه‌نویس‌های Android) کمک می‌کند. این <ph name="BEGIN_LINK1" />تنظیم<ph name="END_LINK1" /> توسط مالک اعمال می‌شود. ممکن است مالک انتخاب کند داده‌های استفاده و عیب‌یابی این دستگاه به Google ارسال شود. اگر تنظیم «فعالیت وب و برنامه» تکمیلی روشن باشد، ممکن است این داده‌ها در حساب Google شما ذخیره شود. <ph name="BEGIN_LINK2" />بیشتر بدانید<ph name="END_LINK2" /></translation>
+<translation id="4211851069413100178">‏داده‌های استفاده و عیب‌یابی را ارسال کنید. با ارسال خودکار داده‌های تشخیص عیب و داده‌های استفاده از دستگاه و برنامه به Google، به بهبود تجربه استفاده از Android کمک کنید. این داده‌ها به بهبود پایداری سیستم و برنامه و موارد دیگر کمک خواهد کرد. بعضی داده‌های انبوهشی نیز به برنامه‌ها و شرکای Google (مانند برنامه‌نویس‌های Android) کمک می‌کند. این <ph name="BEGIN_LINK1" />تنظیم<ph name="END_LINK1" /> توسط مالک اعمال می‌شود. ممکن است مالک انتخاب کند داده‌های استفاده و عیب‌یابی این دستگاه به Google ارسال شود. اگر تنظیم «فعالیت‌ها در وب و برنامه» تکمیلی روشن باشد، ممکن است این داده‌ها در حساب Google شما ذخیره شود. <ph name="BEGIN_LINK2" />بیشتر بدانید<ph name="END_LINK2" /></translation>
<translation id="4211904048067111541">‏توقف استفاده در برنامه‌های Android</translation>
<translation id="42126664696688958">صادر کردن</translation>
<translation id="42137655013211669">سرور، دسترسی به این منبع را ممنوع کرد.</translation>
@@ -4511,7 +4511,7 @@
<translation id="5016491575926936899">می‌توانید از رایانه پیامک ارسال کنید، اتصال اینترنت را به‌اشتراک بگذارید، به اعلان‌های مکالمه پاسخ دهید، و قفل <ph name="DEVICE_TYPE" /> را با تلفنتان باز کنید.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation>
<translation id="5017643436812738274">‏با نشانگر نوشتار می‌توانید صفحه‌ها را پیمایش کنید. برای خاموش شدن، Ctrl+Search+7 را فشار دهید.</translation>
<translation id="5018207570537526145">باز کردن وب‌سایت افزونه</translation>
-<translation id="5018526990965779848">‏داده‌های استفاده و عیب‌یابی را ارسال کنید. با ارسال خودکار داده‌های تشخیص عیب و داده‌های استفاده از دستگاه و برنامه به Google، به بهبود تجربه استفاده از Android کمک کنید. این داده‌ها به بهبود پایداری سیستم و برنامه و موارد دیگر کمک خواهد کرد. بعضی داده‌های انبوهشی نیز به برنامه‌ها و شرکای Google (مانند «برنامه‌نویس‌های Android») کمک می‌کند. اگر تنظیم «فعالیت وب و برنامه» تکمیلی روشن باشد، ممکن است این داده‌ها در «حساب Google» شما ذخیره شود.</translation>
+<translation id="5018526990965779848">‏داده‌های استفاده و عیب‌یابی را ارسال کنید. با ارسال خودکار داده‌های تشخیص عیب و داده‌های استفاده از دستگاه و برنامه به Google، به بهبود تجربه استفاده از Android کمک کنید. این داده‌ها به بهبود پایداری سیستم و برنامه و موارد دیگر کمک خواهد کرد. بعضی داده‌های انبوهشی نیز به برنامه‌ها و شرکای Google (مانند «برنامه‌نویس‌های Android») کمک می‌کند. اگر تنظیم «فعالیت‌ها در وب و برنامه» تکمیلی روشن باشد، ممکن است این داده‌ها در «حساب Google» شما ذخیره شود.</translation>
<translation id="5020008942039547742">پنجره دیگری را انتخاب کنید</translation>
<translation id="5021750053540820849">هنوز به‌روزرسانی نشده است</translation>
<translation id="5024511550058813796">سابقه‌تان در همه دستگاه‌های همگام‌سازی‌شده دردسترس خواهد بود تا بتوانید آنچه را انجام می‌دادید ادامه دهید</translation>
@@ -4698,7 +4698,7 @@
<translation id="5195863934285556588">‏<ph name="BEGIN_PARAGRAPH1" />«خدمات مکان Google» از منابعی مانند Wi-Fi، شبکه‌های تلفن همراه، و حسگرها برای کمک به تخمین مکان دستگاه شما استفاده می‌کند.<ph name="END_PARAGRAPH1" />
<ph name="BEGIN_PARAGRAPH2" />هرزمان خواستید می‌توانید با رفتن به «تنظیمات &gt; برنامه‌ها &gt; فروشگاه Google Play &gt; مدیریت اولویت‌های Android &gt; امنیت و مکان &gt; مکان»، مکان Android را در این دستگاه خاموش کنید. همچنین می‌توانید با خاموش کردن «دقت مکان Google» در همان منو، استفاده از Wi-Fi، شبکه‌های تلفن همراه، و حسگرها را برای مکان Android خاموش کنید.<ph name="END_PARAGRAPH2" /></translation>
<translation id="5197255632782567636">اینترنت</translation>
-<translation id="5198430103906431024">‏داده‌های استفاده و عیب‌یابی را ارسال کنید. این دستگاه درحال‌حاضر به‌صورت‌ خودکار داده‌های عیب‌یابی و داده‌های استفاده از دستگاه و برنامه را برای Google ارسال می‌کند. این داده‌ها به بهبود پایداری سیستم و برنامه و موارد دیگر کمک خواهد کرد. بعضی داده‌های انبوهشی نیز به برنامه‌ها و شرکای Google (مانند «برنامه‌نویس‌های Android») کمک می‌کند. اگر تنظیم «فعالیت وب و برنامه» تکمیلی روشن باشد، ممکن است این داده‌ها در «حساب Google» شما ذخیره شود.</translation>
+<translation id="5198430103906431024">‏داده‌های استفاده و عیب‌یابی را ارسال کنید. این دستگاه درحال‌حاضر به‌صورت‌ خودکار داده‌های عیب‌یابی و داده‌های استفاده از دستگاه و برنامه را برای Google ارسال می‌کند. این داده‌ها به بهبود پایداری سیستم و برنامه و موارد دیگر کمک خواهد کرد. بعضی داده‌های انبوهشی نیز به برنامه‌ها و شرکای Google (مانند «برنامه‌نویس‌های Android») کمک می‌کند. اگر تنظیم «فعالیت‌ها در وب و برنامه» تکمیلی روشن باشد، ممکن است این داده‌ها در «حساب Google» شما ذخیره شود.</translation>
<translation id="5199729219167945352">آزمایشات</translation>
<translation id="5203920255089865054">{NUM_EXTENSIONS,plural, =1{برای دیدن این افزونه، کلیک کنید}one{برای دیدن این افزونه‌ها، کلیک کنید}other{برای دیدن این افزونه‌ها، کلیک کنید}}</translation>
<translation id="5204673965307125349">لطفاً دستگاه را پاورواش کنید و دوباره امتحان کنید.</translation>
@@ -5119,7 +5119,7 @@
<translation id="5584915726528712820">‏<ph name="BEGIN_PARAGRAPH1" />این اطلاعاتی عمومی درباره دستگاهتان و نحوه استفاده شما از آن است (مثلاً میزان شارژ باتری، فعالیت سیستم و برنامه و خطاها). از این داده‌ها برای بهبود Android استفاده می‌شود و بعضی از اطلاعات جمع‌آوری‌شده به برنامه‌ها و شرکای Google (ازجمله برنامه‌نویسان Android) نیز کمک می‌کند برنامه‌ها و محصولاتشان را بهتر کنند.<ph name="END_PARAGRAPH1" />
<ph name="BEGIN_PARAGRAPH2" />خاموش کردن این ویژگی بر توانایی دستگاهتان در ارسال اطلاعات موردنیاز برای سرویس‌های ضروری (مانند به‌روزرسانی‌های سیستم و امنیت) بی‌تأثیر است.<ph name="END_PARAGRAPH2" />
<ph name="BEGIN_PARAGRAPH3" />مالک می‌تواند این ویژگی را از «تنظیمات &gt; پیشرفته &gt; ارسال خودکار داده‌های تشخیصی و میزان استفاده به Google» کنترل کند.<ph name="END_PARAGRAPH3" />
- <ph name="BEGIN_PARAGRAPH4" />اگر تنظیم تکمیلی «فعالیت وب و برنامه» روشن باشد، ممکن است این داده‌ها در حساب Google شما ذخیره شود. می‌توانید در account.google.com، داده‌هایتان را ببینید، حذف کنید و تنظیمات حسابتان را تغییر دهید.<ph name="END_PARAGRAPH4" /></translation>
+ <ph name="BEGIN_PARAGRAPH4" />اگر تنظیم تکمیلی «فعالیت‌ها در وب و برنامه» روشن باشد، ممکن است این داده‌ها در حساب Google شما ذخیره شود. می‌توانید در account.google.com، داده‌هایتان را ببینید، حذف کنید و تنظیمات حسابتان را تغییر دهید.<ph name="END_PARAGRAPH4" /></translation>
<translation id="5585019845078534178">کارت‌ها</translation>
<translation id="5585118885427931890">پوشه نشانک ایجاد نشد.</translation>
<translation id="558563010977877295">باز کردن یک صفحه خاص یا مجموعه‌ای از صفحات</translation>
@@ -6361,7 +6361,7 @@
<translation id="6725206449694821596">‏پروتکل چاپ اینترنتی (IPP)</translation>
<translation id="6725970970008349185">تعداد کاندیداها برای نمایش در هر صفحه</translation>
<translation id="672609503628871915">مشاهده تازه‌ها</translation>
-<translation id="67269783048918309">‏داده‌های استفاده و عیب‌یابی را ارسال کنید. این دستگاه درحال‌حاضر به‌صورت‌ خودکار داده‌های عیب‌یابی و داده‌های استفاده از دستگاه و برنامه را برای Google ارسال می‌کند. این داده‌ها برای شناسایی فرزندتان استفاده نخواهند شد و به بهبود پایداری سیستم و برنامه و موارد دیگر کمک خواهد کرد. بعضی داده‌های انبوهشی نیز به برنامه‌ها و شرکای Google (مانند برنامه‌نویس‌های Android) کمک می‌کند. این <ph name="BEGIN_LINK1" />تنظیم<ph name="END_LINK1" /> توسط مالک اعمال می‌شود. اگر تنظیم «فعالیت وب و برنامه» تکمیلی برای فرزندتان روشن باشد، ممکن است این داده‌ها در حساب Google او ذخیره شود. <ph name="BEGIN_LINK2" />بیشتر بدانید<ph name="END_LINK2" /></translation>
+<translation id="67269783048918309">‏داده‌های استفاده و عیب‌یابی را ارسال کنید. این دستگاه درحال‌حاضر به‌صورت‌ خودکار داده‌های عیب‌یابی و داده‌های استفاده از دستگاه و برنامه را برای Google ارسال می‌کند. این داده‌ها برای شناسایی فرزندتان استفاده نخواهند شد و به بهبود پایداری سیستم و برنامه و موارد دیگر کمک خواهد کرد. بعضی داده‌های انبوهشی نیز به برنامه‌ها و شرکای Google (مانند برنامه‌نویس‌های Android) کمک می‌کند. این <ph name="BEGIN_LINK1" />تنظیم<ph name="END_LINK1" /> توسط مالک اعمال می‌شود. اگر تنظیم «فعالیت‌ها در وب و برنامه» تکمیلی برای فرزندتان روشن باشد، ممکن است این داده‌ها در حساب Google او ذخیره شود. <ph name="BEGIN_LINK2" />بیشتر بدانید<ph name="END_LINK2" /></translation>
<translation id="6728528977475057549">‏IBAN با انتهای <ph name="LAST_FOUR_DIGITS" /></translation>
<translation id="6729192290958770680">نام کاربری‌تان را وارد کنید</translation>
<translation id="6731320427842222405">این مرحله ممکن است چند دقیقه طول بکشد</translation>
@@ -6471,7 +6471,7 @@
<translation id="6818802132960437751">مجهز به محافظ دربرابر ویروس</translation>
<translation id="6818920801736417483">گذرواژه‌ها ذخیره شود؟</translation>
<translation id="6820079682647046800">‏اصالت‌سنجی Kerberos انجام نشد</translation>
-<translation id="6823174134746916417">کلیک با یک ضربه روی صفحه لمسی</translation>
+<translation id="6823174134746916417">ضربه به‌جای کلیک برای صفحه لمسی</translation>
<translation id="6824564591481349393">کپی آدرس &amp;ایمیل</translation>
<translation id="6824584962142919697">&amp;بازرسی عناصر</translation>
<translation id="6825184156888454064">به‌ترتیب نام</translation>
@@ -6511,7 +6511,7 @@
<translation id="6848388270925200958">درحال‌حاضر، کارت‌هایی دارید که فقط در این دستگاه قابل استفاده‌اند</translation>
<translation id="6848716236260083778">برای راه‌اندازی اثر انگشت، از فرزندتان بخواهید حسگر اثر انگشت را لمس کند. داده‌های اثر انگشت فرزندتان به‌صورت ایمن ذخیره می‌شود و هرگز از این <ph name="DEVICE_TYPE" /> خارج نمی‌شود.</translation>
<translation id="6850286078059909152">رنگ نوشتار</translation>
-<translation id="6851181413209322061">‏داده‌های استفاده و عیب‌یابی را ارسال کنید. این دستگاه درحال‌حاضر به‌صورت‌ خودکار داده‌های عیب‌یابی و داده‌های استفاده از دستگاه و برنامه را برای Google ارسال می‌کند. این داده‌ها برای شناسایی فرزندتان استفاده نخواهند شد و به بهبود پایداری سیستم و برنامه و موارد دیگر کمک خواهد کرد. بعضی داده‌های انبوهشی نیز به برنامه‌ها و شرکای Google (مانند «برنامه‌نویس‌های Android») کمک می‌کند. این تنظیم را مالک اعمال می‌کند. اگر «فعالیت وب و برنامه» تکمیلی برای فرزندتان روشن باشد، ممکن است این داده‌ها در «حساب Google» او ذخیره شود.</translation>
+<translation id="6851181413209322061">‏داده‌های استفاده و عیب‌یابی را ارسال کنید. این دستگاه درحال‌حاضر به‌صورت‌ خودکار داده‌های عیب‌یابی و داده‌های استفاده از دستگاه و برنامه را برای Google ارسال می‌کند. این داده‌ها برای شناسایی فرزندتان استفاده نخواهند شد و به بهبود پایداری سیستم و برنامه و موارد دیگر کمک خواهد کرد. بعضی داده‌های انبوهشی نیز به برنامه‌ها و شرکای Google (مانند «برنامه‌نویس‌های Android») کمک می‌کند. این تنظیم را مالک اعمال می‌کند. اگر «فعالیت‌ها در وب و برنامه» تکمیلی برای فرزندتان روشن باشد، ممکن است این داده‌ها در «حساب Google» او ذخیره شود.</translation>
<translation id="6851497530878285708">برنامه فعال شد</translation>
<translation id="6853029310037965825"><ph name="APP_TYPE" /> نصب‌شده از <ph name="BEGIN_LINK" /><ph name="INSTALL_SOURCE" /><ph name="END_LINK" /></translation>
<translation id="6853388645642883916">به‌روزرسان در حالت خواب</translation>
@@ -6888,7 +6888,7 @@
<translation id="7201420661433230412">مشاهده فایل‌ها</translation>
<translation id="7203150201908454328">باز شده</translation>
<translation id="720715819012336933">{NUM_PAGES,plural, =1{خروج از صفحه}one{خروج از صفحه‌ها}other{خروج از صفحه‌ها}}</translation>
-<translation id="7207457272187520234">‏داده‌های استفاده و عیب‌یابی را ارسال کنید. این دستگاه درحال‌حاضر به‌صورت‌ خودکار داده‌های عیب‌یابی و داده‌های استفاده از دستگاه و برنامه را برای Google ارسال می‌کند. این داده‌ها به بهبود پایداری سیستم و برنامه و موارد دیگر کمک خواهد کرد. بعضی داده‌های انبوهشی نیز به برنامه‌ها و شرکای Google (مانند «برنامه‌نویس‌های Android») کمک می‌کند. این تنظیم را مالک اعمال می‌کند. اگر تنظیم «فعالیت وب و برنامه» تکمیلی روشن باشد، ممکن است این داده‌ها در «حساب Google» شما ذخیره شود.</translation>
+<translation id="7207457272187520234">‏داده‌های استفاده و عیب‌یابی را ارسال کنید. این دستگاه درحال‌حاضر به‌صورت‌ خودکار داده‌های عیب‌یابی و داده‌های استفاده از دستگاه و برنامه را برای Google ارسال می‌کند. این داده‌ها به بهبود پایداری سیستم و برنامه و موارد دیگر کمک خواهد کرد. بعضی داده‌های انبوهشی نیز به برنامه‌ها و شرکای Google (مانند «برنامه‌نویس‌های Android») کمک می‌کند. این تنظیم را مالک اعمال می‌کند. اگر تنظیم «فعالیت‌ها در وب و برنامه» تکمیلی روشن باشد، ممکن است این داده‌ها در «حساب Google» شما ذخیره شود.</translation>
<translation id="7207631048330366454">جستجوی برنامه‌ها</translation>
<translation id="7210471695184432500">‏برای وارد کردن گذرواژه‌های این دستگاه در «مدیر گذرواژه Google»، فایل CSV موردنظر را انتخاب کنید</translation>
<translation id="7210499381659830293">چاپگرهای افزونه</translation>
@@ -7601,7 +7601,7 @@
<translation id="784934925303690534">محدوده زمانی</translation>
<translation id="7850717413915978159">‏<ph name="BEGIN_PARAGRAPH1" />اگر به دستگاه‌های ChromeOS اجازه دهید گزارش‌های خودکار ارسال کند، به ما کمک می‌کنید آنچه را باید در ChromeOS درست کنیم و بهبود ببخشیم اولویت‌بندی کنیم. این گزارش‌ها می‌تواند شامل مواردی ازاین‌قبیل باشد: چه زمانی ChromeOS خراب می‌شود، از کدام ویژگی‌ها استفاده می‌کنید، معمولاً از چه مقدار حافظه استفاده می‌کنید، و داده‌های استفاده و عیب‌یابی برنامه Android. برخی‌از داده‌های انبوهشی به برنامه‌ها و شرکای Google، مثل توسعه‌دهندگان Android، هم کمک می‌کند.<ph name="END_PARAGRAPH1" />
<ph name="BEGIN_PARAGRAPH2" />هرزمان خواستید می‌توانید مجاز بودن این گزارش‌ها را در تنظیمات دستگاه ChromeOS شروع یا متوقف کنید. اگر سرپرست دامنه هستید، می‌توانید این تنظیم را در «کنسول سرپرست» تغییر دهید.<ph name="END_PARAGRAPH2" />
- <ph name="BEGIN_PARAGRAPH3" />اگر تنظیم «فعالیت وب و برنامه» برای «حساب Google» شما روشن باشد، ممکن است داده‌های Android در «حساب Google» شما ذخیره شود. می‌توانید در account.google.com، داده‌هایتان را ببینید، حذف کنید، و تنظیمات حسابتان را تغییر دهید.<ph name="END_PARAGRAPH3" /></translation>
+ <ph name="BEGIN_PARAGRAPH3" />اگر تنظیم «فعالیت‌ها در وب و برنامه» برای «حساب Google» شما روشن باشد، ممکن است داده‌های Android در «حساب Google» شما ذخیره شود. می‌توانید در account.google.com، داده‌هایتان را ببینید، حذف کنید، و تنظیمات حسابتان را تغییر دهید.<ph name="END_PARAGRAPH3" /></translation>
<translation id="7851021205959621355">‏<ph name="BEGIN_BOLD" />توجه:<ph name="END_BOLD" /> ممکن است صدای مشابه یا صدای ضبط‌شده هم بتواند به نتایج شخصی یا «دستیار» شما دسترسی یابد. برای صرفه‌جویی در مصرف باتری، می‌توانید در «تنظیمات دستیار» گزینه‌ای را انتخاب کنید تا فقط زمانی که این دستگاه به منبع نیرو متصل است، «Ok Google» روشن شود.</translation>
<translation id="7851457902707056880">ورود به سیستم فقط محدود به حساب مالک است. لطفاً سیستم را دوباره راه‌اندازی کنید و با حساب مالک به سیستم وارد شوید. دستگاه به صورت خودکار بعد از ۳۰ ثانیه دوباره راه‌اندازی می‌شود.</translation>
<translation id="7851716364080026749">همیشه دسترسی به دوربین و میکروفون مسدود شود</translation>
@@ -8082,7 +8082,7 @@
<translation id="8267961145111171918">‏<ph name="BEGIN_PARAGRAPH1" />این اطلاعاتی عمومی درباره این دستگاه و نحوه استفاده از آن است (مثلاً میزان شارژ باتری، فعالیت سیستم و برنامه و خطاها). از این داده‌ها برای بهبود Android استفاده می‌شود و بعضی از اطلاعات جمع‌آوری‌شده به برنامه‌ها و شرکای Google (ازجمله برنامه‌نویسان Android) نیز کمک می‌کند برنامه‌ها و محصولاتشان را بهتر کنند.<ph name="END_PARAGRAPH1" />
<ph name="BEGIN_PARAGRAPH2" />خاموش کردن این ویژگی بر توانایی این دستگاه در ارسال اطلاعات موردنیاز برای سرویس‌های ضروری (مانند به‌روزرسانی‌های سیستم و امنیت) بی‌تأثیر است.<ph name="END_PARAGRAPH2" />
<ph name="BEGIN_PARAGRAPH3" />مالک می‌تواند این ویژگی را از «تنظیمات &gt; پیشرفته &gt; ارسال خودکار داده‌های تشخیصی و میزان استفاده به Google» کنترل کند.<ph name="END_PARAGRAPH3" />
- <ph name="BEGIN_PARAGRAPH4" />اگر تنظیم تکمیلی «فعالیت وب و برنامه» برای فرزندتان روشن باشد، ممکن است این داده‌ها در حساب Google او ذخیره شود. درباره این تنظیمات و نحوه تغییر آن‌ها در families.google.com، اطلاعات بیشتری کسب کنید.<ph name="END_PARAGRAPH4" /></translation>
+ <ph name="BEGIN_PARAGRAPH4" />اگر تنظیم تکمیلی «فعالیت‌ها در وب و برنامه» برای فرزندتان روشن باشد، ممکن است این داده‌ها در حساب Google او ذخیره شود. درباره این تنظیمات و نحوه تغییر آن‌ها در families.google.com، اطلاعات بیشتری کسب کنید.<ph name="END_PARAGRAPH4" /></translation>
<translation id="826905130698769948">گواهینامه کارخواه نامعتبر است</translation>
<translation id="8270162672241199380">‏نصب‌کننده Steam</translation>
<translation id="827097179112817503">نمایش دکمه صفحه اصلی</translation>
@@ -8304,7 +8304,7 @@
<translation id="8475313423285172237">‏برنامه‌ای دیگر بر روی رایانه شما یک برنامه افزودنی را اضافه کرده است که ممکن است نحوه کارکرد Chrome را تغییر دهد.</translation>
<translation id="8476491056950015181">‏<ph name="BEGIN_PARAGRAPH1" />اجازه دادن به دستگاه‌های ChromeOS برای ارسال گزارش‌های خودکار، به ما کمک می‌کند آنچه را باید در ChromeOS درست کنیم و بهبود ببخشیم اولویت‌بندی کنیم. این گزارش‌ها می‌تواند شامل مواردی ازاین‌قبیل باشد: چه زمانی ChromeOS ازکار می‌افتد، از کدام ویژگی‌ها استفاده می‌شود، معمولاً چه مقدار حافظه استفاده می‌شود، و داده‌های تشخیص عیب و استفاده برنامه Android. برخی‌از داده‌های انبوهشی نیز به برنامه‌ها و شرکای Google (مانند توسعه‌دهندگان نرم‌افزار Android) کمک می‌کند.<ph name="END_PARAGRAPH1" />
<ph name="BEGIN_PARAGRAPH2" />هرزمان بخواهید می‌توانید مجاز کردن این گزارش‌ها را در تنظیمات دستگاه ChromeOS فرزندتان شروع یا متوقف کنید. اگر سرپرست دامنه هستید، می‌توانید این تنظیم را در «کنسول سرپرست» تغییر دهید.<ph name="END_PARAGRAPH2" />
- <ph name="BEGIN_PARAGRAPH4" />اگر تنظیم «فعالیت وب و برنامه» تکمیلی برای «حساب Google» فرزندتان روشن باشد، ممکن است داده‌های فرزندتان در این حساب ذخیره شود. در families.google.com، درباره این تنظیمات و نحوه تغییر آن‌ها بیشتر بدانید.<ph name="END_PARAGRAPH4" /></translation>
+ <ph name="BEGIN_PARAGRAPH4" />اگر تنظیم «فعالیت‌ها در وب و برنامه» تکمیلی برای «حساب Google» فرزندتان روشن باشد، ممکن است داده‌های فرزندتان در این حساب ذخیره شود. در families.google.com، درباره این تنظیمات و نحوه تغییر آن‌ها بیشتر بدانید.<ph name="END_PARAGRAPH4" /></translation>
<translation id="8477241577829954800">از دور خارج شده</translation>
<translation id="8477384620836102176">&amp;عمومی</translation>
<translation id="8479176401914456949">کد نامعتبر است. لطفاً دوباره امتحان کنید.</translation>
@@ -8412,7 +8412,7 @@
<translation id="8591783563402255548">۱ ثانیه</translation>
<translation id="8592141010104017453">هرگز اعلان نشان داده نشود</translation>
<translation id="859246725979739260">دسترسی این سایت به مکان شما مسدود شده است.</translation>
-<translation id="8593121833493516339">‏داده‌های استفاده و عیب‌یابی را ارسال کنید. با ارسال خودکار داده‌های عیب‌یابی و داده‌های استفاده از دستگاه و برنامه به Google به بهبود تجربه Android خود کمک کنید. این داده‌ها برای شناسایی فرزندتان استفاده نخواهند شد و به بهبود پایداری سیستم و برنامه و موارد دیگر کمک خواهد کرد. بعضی داده‌های انبوهشی نیز به برنامه‌ها و شرکای Google (مانند برنامه‌نویس‌های Android) کمک می‌کند. اگر «فعالیت وب و برنامه» تکمیلی برای فرزندتان روشن باشد، ممکن است این داده‌ها در حساب Google او ذخیره شود. <ph name="BEGIN_LINK1" />بیشتر بدانید<ph name="END_LINK1" /></translation>
+<translation id="8593121833493516339">‏داده‌های استفاده و عیب‌یابی را ارسال کنید. با ارسال خودکار داده‌های عیب‌یابی و داده‌های استفاده از دستگاه و برنامه به Google به بهبود تجربه Android خود کمک کنید. این داده‌ها برای شناسایی فرزندتان استفاده نخواهند شد و به بهبود پایداری سیستم و برنامه و موارد دیگر کمک خواهد کرد. بعضی داده‌های انبوهشی نیز به برنامه‌ها و شرکای Google (مانند برنامه‌نویس‌های Android) کمک می‌کند. اگر «فعالیت‌ها در وب و برنامه» تکمیلی برای فرزندتان روشن باشد، ممکن است این داده‌ها در حساب Google او ذخیره شود. <ph name="BEGIN_LINK1" />بیشتر بدانید<ph name="END_LINK1" /></translation>
<translation id="8596540852772265699">فایل‌های سفارشی</translation>
<translation id="8597404194697561297">‏به Steam در Chromebook خوش آمدید</translation>
<translation id="8597845839771543242">قالب محصول:</translation>
@@ -8463,7 +8463,7 @@
<translation id="8636500887554457830">به سایت‌ها اجازه داده نشود بالاپر ارسال کنند یا از هدایت استفاده کنند</translation>
<translation id="8637688295594795546">به‌روزرسانی سیستم موجود است. در حال آماده سازی برای بارگیری...</translation>
<translation id="8639047128869322042">درحال بررسی وجود نرم‌افزار مضر...</translation>
-<translation id="8639635302972078117">‏داده‌های استفاده و عیب‌یابی را ارسال کنید. این دستگاه درحال‌حاضر به‌صورت‌ خودکار داده‌های عیب‌یابی و داده‌های استفاده از دستگاه و برنامه را برای Google ارسال می‌کند. این داده‌ها برای شناسایی فرزندتان استفاده نخواهند شد و به بهبود پایداری سیستم و برنامه و موارد دیگر کمک خواهد کرد. بعضی داده‌های انبوهشی نیز به برنامه‌ها و شرکای Google (مانند «برنامه‌نویس‌های Android») کمک می‌کند. اگر تنظیم «فعالیت وب و برنامه» تکمیلی برای فرزندتان روشن باشد، ممکن است این داده‌ها در «حساب Google» او ذخیره شود.</translation>
+<translation id="8639635302972078117">‏داده‌های استفاده و عیب‌یابی را ارسال کنید. این دستگاه درحال‌حاضر به‌صورت‌ خودکار داده‌های عیب‌یابی و داده‌های استفاده از دستگاه و برنامه را برای Google ارسال می‌کند. این داده‌ها برای شناسایی فرزندتان استفاده نخواهند شد و به بهبود پایداری سیستم و برنامه و موارد دیگر کمک خواهد کرد. بعضی داده‌های انبوهشی نیز به برنامه‌ها و شرکای Google (مانند «برنامه‌نویس‌های Android») کمک می‌کند. اگر تنظیم «فعالیت‌ها در وب و برنامه» تکمیلی برای فرزندتان روشن باشد، ممکن است این داده‌ها در «حساب Google» او ذخیره شود.</translation>
<translation id="8642900771896232685">۲ ثانیه</translation>
<translation id="8642947597466641025">طولانی تر کردن متن</translation>
<translation id="8643403533759285912">حذف گروه</translation>
@@ -8564,7 +8564,7 @@
<translation id="8719472795285728850">درحال گوش دادن به فعالیت‌های افزونه...</translation>
<translation id="8720200012906404956">شبکه تلفن همراه جستجو شود. <ph name="BEGIN_LINK" />بیشتر بدانید<ph name="END_LINK" /></translation>
<translation id="8720816553731218127">مهلت مقداردهی اولیه از ویژگی‌های زمان نصب به پایان رسیده است.</translation>
-<translation id="8722912030556880711">‏داده‌های استفاده و عیب‌یابی را ارسال کنید. این دستگاه درحال‌حاضر به‌صورت‌ خودکار داده‌های عیب‌یابی و داده‌های استفاده از دستگاه و برنامه را برای Google ارسال می‌کند. این داده‌ها به بهبود پایداری سیستم و برنامه و موارد دیگر کمک خواهد کرد. بعضی داده‌های انبوهشی نیز به برنامه‌ها و شرکای Google (مانند برنامه‌نویس‌های Android) کمک می‌کند. اگر تنظیم «فعالیت وب و برنامه» تکمیلی روشن باشد، ممکن است این داده‌ها در حساب Google شما ذخیره شود. <ph name="BEGIN_LINK2" />بیشتر بدانید<ph name="END_LINK2" /></translation>
+<translation id="8722912030556880711">‏داده‌های استفاده و عیب‌یابی را ارسال کنید. این دستگاه درحال‌حاضر به‌صورت‌ خودکار داده‌های عیب‌یابی و داده‌های استفاده از دستگاه و برنامه را برای Google ارسال می‌کند. این داده‌ها به بهبود پایداری سیستم و برنامه و موارد دیگر کمک خواهد کرد. بعضی داده‌های انبوهشی نیز به برنامه‌ها و شرکای Google (مانند برنامه‌نویس‌های Android) کمک می‌کند. اگر تنظیم «فعالیت‌ها در وب و برنامه» تکمیلی روشن باشد، ممکن است این داده‌ها در حساب Google شما ذخیره شود. <ph name="BEGIN_LINK2" />بیشتر بدانید<ph name="END_LINK2" /></translation>
<translation id="8724405322205516354">وقتی این نماد را می‌بینید، از اثر انگشتتان برای شناسایی یا تأیید خریدها استفاده کنید.</translation>
<translation id="8724409975248965964">اثر انگشت اضافه شد</translation>
<translation id="8724859055372736596">&amp;نمایش در پوشه</translation>
@@ -8798,7 +8798,7 @@
<translation id="8929696694736010839">فقط جلسه «ناشناس» کنونی</translation>
<translation id="8930351635855238750">تنظیمات جدید کوکی بعد از بارگیری مجدد صفحه اعمال می‌شود</translation>
<translation id="8930622219860340959">بی سیم</translation>
-<translation id="8931076093143205651">‏داده‌های استفاده و عیب‌یابی را ارسال کنید. با ارسال خودکار داده‌های تشخیص عیب و داده‌های استفاده از دستگاه و برنامه به Google، به بهبود تجربه استفاده از Android کمک کنید. این داده‌ها به بهبود پایداری سیستم و برنامه و موارد دیگر کمک خواهد کرد. بعضی داده‌های انبوهشی نیز به برنامه‌ها و شرکای Google (مانند «برنامه‌نویس‌های Android») کمک می‌کند. این تنظیم را مالک اعمال می‌کند. ممکن است مالک انتخاب کند داده‌های استفاده و عیب‌یابی این دستگاه به Google ارسال شود. اگر تنظیم «فعالیت وب و برنامه» تکمیلی روشن باشد، ممکن است این داده‌ها در «حساب Google» شما ذخیره شود.</translation>
+<translation id="8931076093143205651">‏داده‌های استفاده و عیب‌یابی را ارسال کنید. با ارسال خودکار داده‌های تشخیص عیب و داده‌های استفاده از دستگاه و برنامه به Google، به بهبود تجربه استفاده از Android کمک کنید. این داده‌ها به بهبود پایداری سیستم و برنامه و موارد دیگر کمک خواهد کرد. بعضی داده‌های انبوهشی نیز به برنامه‌ها و شرکای Google (مانند «برنامه‌نویس‌های Android») کمک می‌کند. این تنظیم را مالک اعمال می‌کند. ممکن است مالک انتخاب کند داده‌های استفاده و عیب‌یابی این دستگاه به Google ارسال شود. اگر تنظیم «فعالیت‌ها در وب و برنامه» تکمیلی روشن باشد، ممکن است این داده‌ها در «حساب Google» شما ذخیره شود.</translation>
<translation id="8931475688782629595">مدیریت همگام‌سازی‌ها</translation>
<translation id="8932654652795262306">جزئیات اشتراک‌گذاری اینترنت فوری</translation>
<translation id="893298445929867520">سبدها پنهان شد. هروقت تغییری ایجاد کنید ظاهر خواهد شد.</translation>
@@ -9081,8 +9081,8 @@
<translation id="9170848237812810038">&amp;واگرد</translation>
<translation id="9170884462774788842">‏برنامه‌ای دیگر بر روی رایانه شما یک زمینه را اضافه کرده است که ممکن است نحوه کارکرد Chrome را تغییر دهد.</translation>
<translation id="917350715406657904">به حداکثر زمانی که ولی‌تان برای استفاده از <ph name="APP_NAME" /> تعیین کرده است رسیده‌اید. می‌توانید فردا به‌مدت <ph name="TIME_LIMIT" /> از آن استفاده کنید.</translation>
-<translation id="9174401638287877180">‏داده‌های استفاده و عیب‌یابی را ارسال کنید. با ارسال خودکار داده‌های عیب‌یابی و داده‌های استفاده از دستگاه و برنامه به Google به بهبود تجربه Android خود کمک کنید. این داده‌ها برای شناسایی فرزندتان استفاده نخواهند شد و به بهبود پایداری سیستم و برنامه و موارد دیگر کمک خواهد کرد. بعضی داده‌های انبوهشی نیز به برنامه‌ها و شرکای Google (مانند «برنامه‌نویس‌های Android») کمک می‌کند. اگر تنظیم «فعالیت وب و برنامه» تکمیلی برای فرزندتان روشن باشد، ممکن است این داده‌ها در «حساب Google» او ذخیره شود.</translation>
-<translation id="9176476835295860688">‏داده‌های استفاده و عیب‌یابی را ارسال کنید. این دستگاه درحال‌حاضر به‌صورت‌ خودکار داده‌های عیب‌یابی و داده‌های استفاده از دستگاه و برنامه را برای Google ارسال می‌کند. این داده‌ها به بهبود پایداری سیستم و برنامه و موارد دیگر کمک خواهد کرد. بعضی داده‌های انبوهشی نیز به برنامه‌ها و شرکای Google (مانند برنامه‌نویس‌های Android) کمک می‌کند. این <ph name="BEGIN_LINK1" />تنظیم<ph name="END_LINK1" /> توسط مالک اعمال می‌شود. اگر تنظیم «فعالیت وب و برنامه» تکمیلی روشن باشد، ممکن است این داده‌ها در حساب Google شما ذخیره شود. <ph name="BEGIN_LINK2" />بیشتر بدانید<ph name="END_LINK2" /></translation>
+<translation id="9174401638287877180">‏داده‌های استفاده و عیب‌یابی را ارسال کنید. با ارسال خودکار داده‌های عیب‌یابی و داده‌های استفاده از دستگاه و برنامه به Google به بهبود تجربه Android خود کمک کنید. این داده‌ها برای شناسایی فرزندتان استفاده نخواهند شد و به بهبود پایداری سیستم و برنامه و موارد دیگر کمک خواهد کرد. بعضی داده‌های انبوهشی نیز به برنامه‌ها و شرکای Google (مانند «برنامه‌نویس‌های Android») کمک می‌کند. اگر تنظیم «فعالیت‌ها در وب و برنامه» تکمیلی برای فرزندتان روشن باشد، ممکن است این داده‌ها در «حساب Google» او ذخیره شود.</translation>
+<translation id="9176476835295860688">‏داده‌های استفاده و عیب‌یابی را ارسال کنید. این دستگاه درحال‌حاضر به‌صورت‌ خودکار داده‌های عیب‌یابی و داده‌های استفاده از دستگاه و برنامه را برای Google ارسال می‌کند. این داده‌ها به بهبود پایداری سیستم و برنامه و موارد دیگر کمک خواهد کرد. بعضی داده‌های انبوهشی نیز به برنامه‌ها و شرکای Google (مانند برنامه‌نویس‌های Android) کمک می‌کند. این <ph name="BEGIN_LINK1" />تنظیم<ph name="END_LINK1" /> توسط مالک اعمال می‌شود. اگر تنظیم «فعالیت‌ها در وب و برنامه» تکمیلی روشن باشد، ممکن است این داده‌ها در حساب Google شما ذخیره شود. <ph name="BEGIN_LINK2" />بیشتر بدانید<ph name="END_LINK2" /></translation>
<translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> - دستگاه بلوتوث متصل شد</translation>
<translation id="9178061802301856367">حذف داده‌های ورود به سیستم</translation>
<translation id="9179524979050048593">نام کاربری صفحه ورود به سیستم</translation>
@@ -9093,7 +9093,7 @@
<translation id="918352324374649435">{COUNT,plural, =1{برنامه}one{# برنامه}other{# برنامه}}</translation>
<translation id="9186963452600581158">‏ورود به سیستم با «حساب Google» فرزند</translation>
<translation id="9187967020623675250">کلیدها مطابقت ندارند. برای <ph name="RESPONSE" />، یکی از کلیدها را فشار دهید.</translation>
-<translation id="9188732951356337132">‏داده‌های استفاده و عیب‌یابی را ارسال کنید. این دستگاه درحال‌حاضر به‌صورت‌ خودکار داده‌های عیب‌یابی و داده‌های استفاده از دستگاه و برنامه را برای Google ارسال می‌کند. این داده‌ها برای شناسایی فرزندتان استفاده نخواهند شد و به بهبود پایداری سیستم و برنامه و موارد دیگر کمک خواهد کرد. بعضی داده‌های انبوهشی نیز به برنامه‌ها و شرکای Google (مانند برنامه‌نویس‌های Android) کمک می‌کند. اگر تنظیم «فعالیت وب و برنامه» تکمیلی برای فرزندتان روشن باشد، ممکن است این داده‌ها در حساب Google او ذخیره شود. <ph name="BEGIN_LINK2" />بیشتر بدانید<ph name="END_LINK2" /></translation>
+<translation id="9188732951356337132">‏داده‌های استفاده و عیب‌یابی را ارسال کنید. این دستگاه درحال‌حاضر به‌صورت‌ خودکار داده‌های عیب‌یابی و داده‌های استفاده از دستگاه و برنامه را برای Google ارسال می‌کند. این داده‌ها برای شناسایی فرزندتان استفاده نخواهند شد و به بهبود پایداری سیستم و برنامه و موارد دیگر کمک خواهد کرد. بعضی داده‌های انبوهشی نیز به برنامه‌ها و شرکای Google (مانند برنامه‌نویس‌های Android) کمک می‌کند. اگر تنظیم «فعالیت‌ها در وب و برنامه» تکمیلی برای فرزندتان روشن باشد، ممکن است این داده‌ها در حساب Google او ذخیره شود. <ph name="BEGIN_LINK2" />بیشتر بدانید<ph name="END_LINK2" /></translation>
<translation id="9192019773545828776">‏با شنیدن بازخورد گفتاری می‌توانید بدون نگاه کردن به صفحه‌نمایش از دستگاهتان استفاده کنید. بازخورد بریل ازطریق دستگاه متصل دردسترس است. از کلیدهای «مهار + دگرساز + Z» برای روشن و خاموش کردن ChromeVox استفاده کنید. از «جستجو + کلید چپ‌بَر یا کلید راست‌بَر» برای پیمایش استفاده کنید. از کلیدهای «جستجو + فاصله» برای انتخاب (فعال کردن) استفاده کنید.</translation>
<translation id="919686179725692564">درباره پشتیبان‌گیری از برنامه‌ها بیشتر بدانید</translation>
<translation id="9198090666959937775">‏استفاده از تلفن Android به‌عنوان کلید امنیتی</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_fi.xtb b/chromium/chrome/app/resources/generated_resources_fi.xtb
index 2903721455b..a3bb96a64c6 100644
--- a/chromium/chrome/app/resources/generated_resources_fi.xtb
+++ b/chromium/chrome/app/resources/generated_resources_fi.xtb
@@ -1207,7 +1207,7 @@ Voit ylläpitää tilin asetuksia asentamalla laitteellesi Family Link ‑sovell
<translation id="2048554637254265991">Virhe säilönhallinnan käynnistyksessä. Yritä uudelleen.</translation>
<translation id="2048653237708779538">Toiminto ei ole käytettävissä</translation>
<translation id="204914487372604757">Luo pikakuvake</translation>
-<translation id="2050339315714019657">Pystysuunta</translation>
+<translation id="2050339315714019657">Muotokuva</translation>
<translation id="2051555741181591333">Poista hotspot käytöstä automaattisesti</translation>
<translation id="2052572566310583903">Asennettu muille laitteillesi</translation>
<translation id="2053105195397337973">Kokeilemme uusia tapoja rajoittaa seurantaa tarjoten samalla sivustoille mahdollisuuksia estää mainosspämmäystä ja petoksia.</translation>
@@ -2946,7 +2946,7 @@ Voit ylläpitää tilin asetuksia asentamalla laitteellesi Family Link ‑sovell
<translation id="3593152357631900254">Ota Fuzzy-Pinyin-tila käyttöön</translation>
<translation id="3593965109698325041">Varmenteen nimirajoitukset</translation>
<translation id="3596012367874587041">Sovellusasetukset</translation>
-<translation id="3596414637720633074">Kolmannen osapuolen evästeiden estäminen incognito-tilassa</translation>
+<translation id="3596414637720633074">Estä kolmannen osapuolen evästeet incognito-tilassa</translation>
<translation id="3598010454707842106">Valitse Yksilöi Chromea</translation>
<translation id="3599221874935822507">Korotettu</translation>
<translation id="3600051066689725006">Verkkopyynnön tiedot</translation>
@@ -3750,7 +3750,7 @@ Voit ylläpitää tilin asetuksia asentamalla laitteellesi Family Link ‑sovell
<translation id="4314497418046265427">Yhdistä puhelimesi ja <ph name="DEVICE_TYPE" />, niin saat enemmän aikaan</translation>
<translation id="4314815835985389558">Synkronointiasetusten muokkaus</translation>
<translation id="4316850752623536204">Kehittäjän verkkosivusto</translation>
-<translation id="4317733381297736564">Sovelluksen sisäiset ostokset</translation>
+<translation id="4317733381297736564">Sovelluksensisäiset ostokset</translation>
<translation id="4317820549299924617">Vahvistus ei onnistunut</translation>
<translation id="4320177379694898372">Ei internetyhteyttä</translation>
<translation id="432160826079505197">Näytä <ph name="FILE_NAME" /> Finderissä</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_fr-CA.xtb b/chromium/chrome/app/resources/generated_resources_fr-CA.xtb
index 20736ee0d5b..69cc2f48c31 100644
--- a/chromium/chrome/app/resources/generated_resources_fr-CA.xtb
+++ b/chromium/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -1897,7 +1897,7 @@ https://support.google.com/chrome/?p=applescript</translation>
Vous ne pouvez pas modifier ce paramètre, car la protection avancée est activée.</translation>
<translation id="2645047101481282803">Votre appareil est géré par <ph name="PROFILE_NAME" /></translation>
<translation id="2645388244376970260">Diffusion de cet onglet sur <ph name="DEVICE_NAME" /></translation>
-<translation id="2645435784669275700">Chrome OS</translation>
+<translation id="2645435784669275700">ChromeOS</translation>
<translation id="2649045351178520408">Chaîne de certificats codés Base 64 ASCII</translation>
<translation id="265156376773362237">Préchargement standard</translation>
<translation id="2652129567809778422">Sélectionner un mot de passe</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_fr.xtb b/chromium/chrome/app/resources/generated_resources_fr.xtb
index 7f9ca99e1d4..2a61e782a26 100644
--- a/chromium/chrome/app/resources/generated_resources_fr.xtb
+++ b/chromium/chrome/app/resources/generated_resources_fr.xtb
@@ -857,7 +857,7 @@ Les autorisations que vous avez déjà accordées aux applis peuvent s'appliquer
<translation id="17513872634828108">Onglets ouverts</translation>
<translation id="175196451752279553">&amp;Rouvrir l'onglet fermé</translation>
<translation id="1753067873202720523">Votre Chromebook risque de ne pas se charger lorsqu'il est allumé.</translation>
-<translation id="1753905327828125965">Les + visités</translation>
+<translation id="1753905327828125965">Les plus visités</translation>
<translation id="1755601632425835748">Taille du texte</translation>
<translation id="1755872274219796698">Transférer les mots de passe</translation>
<translation id="1757132445735080748">Pour terminer la configuration de Linux, mettez à jour ChromeOS Flex et réessayez.</translation>
@@ -2064,7 +2064,7 @@ Vous pouvez gérer les paramètres de ce compte en installant l'application Fami
<translation id="2783298271312924866">Téléchargé</translation>
<translation id="2783321960289401138">Créer un raccourci…</translation>
<translation id="2783829359200813069">Sélectionner les types de chiffrement</translation>
-<translation id="2783952358106015700">Utiliser votre clé de sécurité avec <ph name="APP_NAME" /></translation>
+<translation id="2783952358106015700">Utilisez votre clé de sécurité avec <ph name="APP_NAME" /></translation>
<translation id="2785267875302712148">Check-up Mots de passe</translation>
<translation id="2785873697295365461">Descripteurs de fichiers</translation>
<translation id="2785975315093449168">GTK</translation>
@@ -2186,7 +2186,7 @@ Vous pouvez gérer les paramètres de ce compte en installant l'application Fami
<translation id="2891922230654533301">Utiliser cet appareil pour vous connecter à <ph name="APP_NAME" /> ?</translation>
<translation id="2893013536106749396">Choisissez les fiches qui vous tiendront informé sur les sujets qui vous intéressent</translation>
<translation id="2893168226686371498">Navigateur par défaut</translation>
-<translation id="2893180576842394309">Google peut utiliser votre historique pour personnaliser la recherche et d'autres services Google</translation>
+<translation id="2893180576842394309">Google pourra utiliser votre historique pour personnaliser la recherche et d'autres de ses services</translation>
<translation id="2894757982205307093">Nouvel onglet dans le groupe</translation>
<translation id="289695669188700754">ID de clé : <ph name="KEY_ID" /></translation>
<translation id="2897713966423243833">Ce paramètre personnalisé sera supprimé lorsque vous fermerez toutes les fenêtres de navigation privée</translation>
@@ -2480,7 +2480,7 @@ Vous pouvez gérer les paramètres de ce compte en installant l'application Fami
<translation id="3160928651883997588">Préférences VPN</translation>
<translation id="3161522574479303604">Toutes les langues</translation>
<translation id="3162853326462195145">Compte scolaire</translation>
-<translation id="3162899666601560689">Les sites peuvent utiliser des cookies pour améliorer votre expérience de navigation, par exemple pour maintenir votre connexion ou mémoriser les articles de votre panier</translation>
+<translation id="3162899666601560689">Les sites peuvent utiliser des cookies pour améliorer votre expérience de navigation, par exemple pour vous maintenir connecté ou se souvenir des articles de votre panier</translation>
<translation id="3163201441334626963">Produit inconnu <ph name="PRODUCT_ID" /> du fournisseur <ph name="VENDOR_ID" /></translation>
<translation id="3163511056918491211">Restaurez vos données ou changez d'appareil, facilement et à tout moment. Vos sauvegardes sont importées dans Google et chiffrées à l'aide du mot de passe de votre compte Google.</translation>
<translation id="3164329792803560526">Partage de l'onglet avec <ph name="APP_NAME" />…</translation>
@@ -3435,7 +3435,7 @@ Souhaitez-vous lancer <ph name="CONTROL_PANEL_APPLET_NAME" /> ?</translation>
<translation id="402184264550408568">(TCP)</translation>
<translation id="4021909830315618592">Copier les détails de la version</translation>
<translation id="4021941025609472374">Fermer les onglets à gauche</translation>
-<translation id="402211067068791756">Cette action effacera <ph name="TOTAL_USAGE" /> des données stockées par les sites affichés</translation>
+<translation id="402211067068791756"><ph name="TOTAL_USAGE" /> de données stockées par les sites affichés seront effacées</translation>
<translation id="4022426551683927403">&amp;Ajouter au dictionnaire</translation>
<translation id="4025039777635956441">Bloquer le site sélectionné</translation>
<translation id="402707738228916911">Instruction <ph name="AUTHORIZE_INSTRUCTION_NAME" /> reçue</translation>
@@ -3820,7 +3820,7 @@ Souhaitez-vous lancer <ph name="CONTROL_PANEL_APPLET_NAME" /> ?</translation>
<translation id="4396956294839002702">{COUNT,plural, =0{Tout &amp;ouvrir}=1{&amp;Ouvrir le favori}one{Tout &amp;ouvrir ({COUNT})}other{Tout &amp;ouvrir ({COUNT})}}</translation>
<translation id="4397372003838952832">Vous n'aurez pas besoin de mémoriser ce mot de passe. Il sera enregistré dans le <ph name="GOOGLE_PASSWORD_MANAGER" /> pour <ph name="EMAIL" />.</translation>
<translation id="4397844455100743910">En savoir plus sur les demandes d'accès.</translation>
-<translation id="439817266247065935">Votre appareil ne s'est arrêté pas correctement. Redémarrez Linux pour utiliser les applications Linux.</translation>
+<translation id="439817266247065935">Votre appareil ne s'est pas arrêté correctement. Redémarrez Linux pour utiliser les applications Linux.</translation>
<translation id="4400367121200150367">Les sites pour lesquels vos mots de passe ne seront jamais enregistrés s'afficheront ici</translation>
<translation id="4400632832271803360">Maintenir la touche du lanceur d'applications enfoncée pour modifier la fonction des touches de la rangée supérieure</translation>
<translation id="4400963414856942668">Vous pouvez cliquer sur l'étoile pour ajouter un onglet à vos favoris</translation>
@@ -4768,7 +4768,7 @@ Appuyez sur Ctrl+Alt+Baisser la luminosité pour faire un zoom arrière.</transl
<translation id="5278823018825269962">ID d'état</translation>
<translation id="5279600392753459966">Tout bloquer</translation>
<translation id="5280064835262749532">Mettre à jour les identifiants pour <ph name="SHARE_PATH" /></translation>
-<translation id="5280243692621919988">Effacer les cookies et les données des sites à la fermeture du navigateur</translation>
+<translation id="5280243692621919988">Effacer les cookies et les données des sites quand vous fermez toutes les fenêtres</translation>
<translation id="5280335021886535443">Appuyez sur |<ph name="ACCELERATOR" />| pour sélectionner cette info-bulle.</translation>
<translation id="5280426389926346830">Créer un raccourci ?</translation>
<translation id="5281013262333731149">S'ouvre dans : <ph name="OPEN_BROWSER" /></translation>
@@ -5779,7 +5779,7 @@ Assurez-vous de ne pas dévoiler d'informations sensibles.</translation>
<translation id="6201608810045805374">Supprimer ce compte ?</translation>
<translation id="6202304368170870640">Vous pouvez utiliser votre code pour vous connecter à votre appareil ou le déverrouiller.</translation>
<translation id="6205314730813004066">Confidentialité des annonces</translation>
-<translation id="6206199626856438589">Vous allez être déconnecté des sites affichés, y compris dans les onglets ouverts</translation>
+<translation id="6206199626856438589">Vous serez déconnecté des sites affichés, y compris dans les onglets ouverts</translation>
<translation id="6206311232642889873">Cop&amp;ier l'image</translation>
<translation id="6206521455877863927">Y compris les sites appartenant au même domaine, par exemple google.com et mail.google.com. Les sites que vous consultez peuvent enregistrer des données sur votre appareil.</translation>
<translation id="6207200176136643843">Réinitialiser le niveau de zoom par défaut</translation>
@@ -7922,7 +7922,7 @@ Conservez votre fichier de clé en lieu sûr. Vous en aurez besoin lors de la cr
<translation id="8137559199583651773">Gérer les extensions</translation>
<translation id="8138217203226449454">Vouliez-vous modifier votre moteur de recherche ?</translation>
<translation id="8138997515734480534">État de <ph name="VM_NAME" /></translation>
-<translation id="8139447493436036221">fichiers Google Drive</translation>
+<translation id="8139447493436036221">Fichiers Google Drive</translation>
<translation id="8140070492745508800"><ph name="FIRST_DEVICE" />, <ph name="SECOND_DEVICE" /></translation>
<translation id="8141418916163800697">Vous pouvez configurer d'autres fonctionnalités dans les paramètres de Phone Hub</translation>
<translation id="8141584439523427891">Ouverture dans le navigateur secondaire…</translation>
@@ -8263,7 +8263,7 @@ Conservez votre fichier de clé en lieu sûr. Vous en aurez besoin lors de la cr
<translation id="8446884382197647889">En savoir plus</translation>
<translation id="8447409163267621480">Vous devez inclure la touche Ctrl ou la touche Alt</translation>
<translation id="844850004779619592">Aucune commande trouvée</translation>
-<translation id="8448729345478502352">Agrandir ou réduire la taille des éléments à l'écran</translation>
+<translation id="8448729345478502352">Agrandissez ou réduisez la taille des éléments à l'écran</translation>
<translation id="8449008133205184768">Coller en adaptant le style</translation>
<translation id="8449036207308062757">Gérer l'espace de stockage</translation>
<translation id="845702320058262034">Connexion impossible. Assurez-vous que le Bluetooth est activé sur votre téléphone.</translation>
@@ -9079,7 +9079,7 @@ Conservez votre fichier de clé en lieu sûr. Vous en aurez besoin lors de la cr
<translation id="9180281769944411366">Cette opération peut prendre quelques minutes. Démarrage du conteneur Linux…</translation>
<translation id="9180380851667544951">Le site peut partager votre écran</translation>
<translation id="9182556968660520230">Ne pas autoriser les sites à lire du contenu protégé</translation>
-<translation id="9183331776983279456">Chrome supprime automatiquement les sites de plus de quatre semaines. Un site peut réapparaître dans la liste si vous le consultez à nouveau. Vous pouvez également empêcher un site de vous suggérer des annonces.</translation>
+<translation id="9183331776983279456">Chrome supprime automatiquement les sites de plus de quatre semaines. Un site peut réapparaître dans la liste si vous le consultez de nouveau. Vous pouvez aussi empêcher un site de vous suggérer des annonces.</translation>
<translation id="918352324374649435">{COUNT,plural, =1{Application}one{# application}other{# applications}}</translation>
<translation id="9186963452600581158">Se connecter avec le compte Google d'un enfant</translation>
<translation id="9187967020623675250">Les touches ne correspondent pas. Appuyez sur une touche pour <ph name="RESPONSE" />.</translation>
@@ -9090,7 +9090,7 @@ Conservez votre fichier de clé en lieu sûr. Vous en aurez besoin lors de la cr
<translation id="9199503643457729322">Cliquez pour quitter le Guide sur la confidentialité.</translation>
<translation id="9200339982498053969"><ph name="ORIGIN" /> pourra modifier les fichiers du dossier <ph name="FOLDERNAME" /></translation>
<translation id="920045321358709304">Rechercher avec <ph name="SEARCH_ENGINE" /></translation>
-<translation id="9201023452444595544">Toutes les données hors connexion vont être effacées</translation>
+<translation id="9201023452444595544">Les éventuelles données hors connexion seront effacées</translation>
<translation id="9201117361710210082">Consulté précédemment</translation>
<translation id="9201220332032049474">Options de verrouillage de l'écran</translation>
<translation id="9201842707396338580">Une erreur s'est produite. Veuillez contacter le propriétaire ou l'administrateur de l'appareil. Code d'erreur : <ph name="ERROR_CODE" />.</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_gl.xtb b/chromium/chrome/app/resources/generated_resources_gl.xtb
index d7528e1bc38..bf8fb0005e7 100644
--- a/chromium/chrome/app/resources/generated_resources_gl.xtb
+++ b/chromium/chrome/app/resources/generated_resources_gl.xtb
@@ -296,7 +296,7 @@ Comproba os teus contrasinais cando queiras no <ph name="GOOGLE_PASSWORD_MANAGER
<translation id="1254593899333212300">Conexión directa a Internet</translation>
<translation id="1257336506558170607">Exportar o certificado seleccionado</translation>
<translation id="1258491128795710625">Novidades</translation>
-<translation id="1259152067760398571">A comprobación de seguranza executouse onte</translation>
+<translation id="1259152067760398571">A Comprobación de seguranza executouse onte</translation>
<translation id="1260451001046713751">Permitir sempre ventás emerxentes e redireccións desde <ph name="HOST" /></translation>
<translation id="1260810365552581339">É posible que Linux non teña suficiente espazo no disco. Podes aumentar o espazo e tentar a restauración de novo en <ph name="LINK_START" />Configuración<ph name="LINK_END" />.</translation>
<translation id="1261380933454402672">Moderada</translation>
@@ -806,7 +806,7 @@ Pode que se lle apliquen a esta conta os permisos que xa lles concedeses ás apl
<translation id="1703666494654169921">Non permitir que os sitios utilicen datos nin dispositivos de realidade virtual</translation>
<translation id="1704097193565924901">Usar maiúsculas</translation>
<translation id="1704230497453185209">Non permitir que os sitios reproduzan son</translation>
-<translation id="1704970325597567340">A comprobación de seguranza executouse o <ph name="DATE" /></translation>
+<translation id="1704970325597567340">A Comprobación de seguranza executouse o <ph name="DATE" /></translation>
<translation id="1706586824377653884">Engadido polo administrador</translation>
<translation id="170658918174941828">Enviaranse a versión de Chrome, a versión do sistema operativo, as opcións de configuración de Cast, as estatísticas de rendemento de proxección e os rexistros de diagnóstico de canles de comunicación, así como a información que seleccionases máis arriba. Estes comentarios utilízanse para diagnosticar problemas e axudar a mellorar a función. A información persoal que envíes, de forma explícita ou ben por erro, protexerase de acordo coas nosas políticas de privacidade. Ao enviar estes comentarios, aceptas que Google poida utilizalos para mellorar os seus produtos ou servizos.</translation>
<translation id="1708291623166985230">A zona wifi está desactivada</translation>
@@ -1064,7 +1064,7 @@ Pode que se lle apliquen a esta conta os permisos que xa lles concedeses ás apl
<translation id="192494336144674234">Abrir con</translation>
<translation id="1925017091976104802">Preme <ph name="MODIFIER_KEY_DESCRIPTION" /> para pegar</translation>
<translation id="1925021887439448749">Introducir enderezo web personalizado</translation>
-<translation id="1925124445985510535">A comprobación de seguranza executouse á seguinte hora: <ph name="TIME" /></translation>
+<translation id="1925124445985510535">A Comprobación de seguranza executouse á seguinte hora: <ph name="TIME" /></translation>
<translation id="192564025059434655">As versións antigas das aplicacións de Chrome non se poderán abrir nos dispositivos Windows despois de decembro de 2022. Podes comprobar se hai unha nova versión dispoñible.</translation>
<translation id="1926339101652878330">Estas opcións de configuración están controladas pola política empresarial. Ponte en contacto co administrador para obter máis información.</translation>
<translation id="1927632033341042996">Dedo <ph name="NEW_FINGER_NUMBER" /></translation>
@@ -1329,7 +1329,7 @@ https://www.chromium.org/chromium-os/how-tos-and-troubleshooting/debugging-featu
<translation id="2154484045852737596">Editar tarxeta</translation>
<translation id="2155772377859296191">A resolución parece de <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
<translation id="2156294658807918600">Service worker: <ph name="SCRIPT_URL" /></translation>
-<translation id="2156877321344104010">Executar comprobación de seguranza de novo</translation>
+<translation id="2156877321344104010">Executar Comprobación de seguranza de novo</translation>
<translation id="2157474325782140681">Para gozar de funcións adicionais, utiliza unha base de Dell deseñada para funcionar con este Chromebook.</translation>
<translation id="215753907730220065">Saír do modo de pantalla completa</translation>
<translation id="2157875535253991059">Esta páxina está agora en pantalla completa.</translation>
@@ -2462,7 +2462,7 @@ Se máis tarde decides que prefires que o teu fillo ou filla non utilice Voice M
<translation id="3143754809889689516">Reproducir desde o principio</translation>
<translation id="3144647712221361880">Abrir ligazón como</translation>
<translation id="3149510190863420837">Aplicacións de Chrome</translation>
-<translation id="3150693969729403281">Realizar agora a comprobación de seguranza</translation>
+<translation id="3150693969729403281">Realizar agora a Comprobación de seguranza</translation>
<translation id="3150927491400159470">Volver cargar de maneira forzada</translation>
<translation id="315116470104423982">Datos móbiles</translation>
<translation id="3151539355209957474">Hora de inicio</translation>
@@ -2656,7 +2656,7 @@ Se máis tarde decides que prefires que o teu fillo ou filla non utilice Voice M
<translation id="3342361181740736773">Á extensión "<ph name="TRIGGERING_EXTENSION_NAME" />" gustaríalle eliminar esta extensión.</translation>
<translation id="3343046414300263892">Aumentar o tamaño do tipo de letra</translation>
<translation id="3343977377045378693">Configurando</translation>
-<translation id="3345634917232014253">A comprobación de seguranza executouse hai un momento</translation>
+<translation id="3345634917232014253">A Comprobación de seguranza executouse hai un momento</translation>
<translation id="3345886924813989455">Non se atopou ningún navegador compatible</translation>
<translation id="3347086966102161372">C&amp;opiar enderezo da imaxe</translation>
<translation id="3348038390189153836">Dispositivo extraíble detectado</translation>
@@ -4642,7 +4642,7 @@ Se queres afastala, usa Control + Alt + Reducir brillo.</translation>
<translation id="5155327081870541046">Na barra de enderezos, escribe o atallo do sitio no que queres realizar buscas (por exemplo: "@marcadores"). Despois preme o atallo de teclado que prefiras e escribe o termo de busca.</translation>
<translation id="5156638757840305347">Destácase o cursor cando aparece ou cando se move</translation>
<translation id="5157635116769074044">Fixar esta páxina á pantalla de inicio...</translation>
-<translation id="5158206172605340248">Pechouse o menú de acentos gráficos.</translation>
+<translation id="5158206172605340248">Pechouse o menú de acentos.</translation>
<translation id="5159094275429367735">Configurar Crostini</translation>
<translation id="5159419673777902220">Teu pai ou túa nai desactivou os permisos para as extensións</translation>
<translation id="5160634252433617617">Teclado físico</translation>
@@ -5013,7 +5013,7 @@ Podes asignarlles esta acción a varios interruptores.</translation>
<translation id="5499476581866658341">Xa podes acceder ao contido multimedia e ás fotos recentes do teu teléfono</translation>
<translation id="549957179819296104">Icona nova</translation>
<translation id="5500168250243071806">Cando teñas a sesión iniciada, é posible que se garden na túa Conta de Google o <ph name="BEGIN_LINK_SEARCH" />historial de busca<ph name="END_LINK_SEARCH" /> e <ph name="BEGIN_LINK_GOOGLE" />outros datos da túa actividade<ph name="END_LINK_GOOGLE" />. Podes eliminalos en calquera momento.</translation>
-<translation id="5500709606820808700">A comprobación de seguranza executouse hoxe</translation>
+<translation id="5500709606820808700">A Comprobación de seguranza executouse hoxe</translation>
<translation id="5501322521654567960">Panel lateral aliñado á esquerda</translation>
<translation id="5501809658163361512">{COUNT,plural, =1{Produciuse un erro ao recibir <ph name="ATTACHMENTS" /> deste dispositivo: <ph name="DEVICE_NAME" />}other{Produciuse un erro ao recibir <ph name="ATTACHMENTS" /> deste dispositivo: <ph name="DEVICE_NAME" />}}</translation>
<translation id="5502500733115278303">Importados desde Firefox</translation>
@@ -5333,7 +5333,7 @@ Podes asignarlles esta acción a varios interruptores.</translation>
<translation id="5801568494490449797">Preferencias</translation>
<translation id="5804241973901381774">Permisos</translation>
<translation id="5804259315582798390">Non se puido activar a recuperación de datos locais</translation>
-<translation id="5805268472388605531">Mantén premidas as teclas para ver os acentos gráficos e outros caracteres especiais</translation>
+<translation id="5805268472388605531">Mantén premidas as teclas para ver os acentos e outros caracteres especiais</translation>
<translation id="5805697420284793859">Xestor de ventás</translation>
<translation id="5806447147478173900">Almacenamento total usado polos sitios mostrados: <ph name="TOTAL_USAGE" /></translation>
<translation id="5806773519584576205">0° (predeterminado)</translation>
@@ -5614,7 +5614,7 @@ Podes asignarlles esta acción a varios interruptores.</translation>
<translation id="6055392876709372977">PKCS n.º 1 SHA-256 con cifrado RSA</translation>
<translation id="6055544610007596637">Instala aplicacións para o teu dispositivo (<ph name="DEVICE_TYPE" />) desde Google Play Store</translation>
<translation id="6056710589053485679">Recarga normal</translation>
-<translation id="6057312498756061228">Este ficheiro é demasiado grande para realizar unha comprobación de seguranza. Podes abrir ficheiros de ata 50 MB.</translation>
+<translation id="6057312498756061228">Este ficheiro é demasiado grande para realizar unha Comprobación de seguranza. Podes abrir ficheiros de ata 50 MB.</translation>
<translation id="6057381398996433816">Bloqueouse a posibilidade de que este sitio utilice os sensores de movemento e luz.</translation>
<translation id="6059276912018042191">Pestanas recentes de Chrome</translation>
<translation id="6059652578941944813">Xerarquía de certificados</translation>
@@ -5895,7 +5895,7 @@ Podes xestionar a configuración desde o menú da tarxeta ou ver máis opcións
<translation id="6310141306111263820">Non se puido instalar o perfil de eSIM. Para obter axuda, ponte en contacto co teu operador.</translation>
<translation id="6311165245110979290">Tarxeta virtual dispoñible</translation>
<translation id="6311220991371174222">Non se pode iniciar Chrome porque se produciu un erro ao abrir o perfil. Proba a reiniciar Chrome.</translation>
-<translation id="6312567056350025599">{NUM_DAYS,plural, =1{A comprobación de seguranza executouse hai 1 día}other{A comprobación de seguranza executouse hai {NUM_DAYS} días}}</translation>
+<translation id="6312567056350025599">{NUM_DAYS,plural, =1{A Comprobación de seguranza executouse hai 1 día}other{A Comprobación de seguranza executouse hai {NUM_DAYS} días}}</translation>
<translation id="6312638141433622592">Ofrece a opción de mostrar os artigos no modo de lector sempre que sexa posible</translation>
<translation id="6313641880021325787">SAÍR DA RV</translation>
<translation id="6313950457058510656">Desactivar Conexión compartida instantánea</translation>
@@ -6734,7 +6734,7 @@ Podes xestionar a configuración desde o menú da tarxeta ou ver máis opcións
<translation id="7055451306017383754">Non se puido deixar de compartir este cartafol porque había unha aplicación usándoo. O cartafol deixará de compartirse cando Parallels Desktop se apague.</translation>
<translation id="7056418393177503237">{0,plural, =1{Incógnito}other{# ventás do modo de incógnito abertas}}</translation>
<translation id="7056526158851679338">&amp;Inspeccionar dispositivos</translation>
-<translation id="7057184853669165321">{NUM_MINS,plural, =1{A comprobación de seguranza executouse hai 1 minuto}other{A comprobación de seguranza executouse hai {NUM_MINS} minutos}}</translation>
+<translation id="7057184853669165321">{NUM_MINS,plural, =1{A Comprobación de seguranza executouse hai 1 minuto}other{A Comprobación de seguranza executouse hai {NUM_MINS} minutos}}</translation>
<translation id="7057767408836081338">Produciuse un erro ao obter os datos da aplicación, pero estase tentando executar a aplicación de todas formas…</translation>
<translation id="7058024590501568315">Rede oculta</translation>
<translation id="7059858479264779982">Establecer en inicio automático</translation>
@@ -7075,7 +7075,7 @@ Podes xestionar a configuración desde o menú da tarxeta ou ver máis opcións
<translation id="7401778920660465883">Ignorar esta mensaxe</translation>
<translation id="7403642243184989645">Descargando recursos</translation>
<translation id="7404065585741198296">O teu teléfono cun cable USB</translation>
-<translation id="7405938989981604410">{NUM_HOURS,plural, =1{A comprobación de seguranza executouse hai 1 hora}other{A comprobación de seguranza executouse hai {NUM_HOURS} horas}}</translation>
+<translation id="7405938989981604410">{NUM_HOURS,plural, =1{A Comprobación de seguranza executouse hai 1 hora}other{A Comprobación de seguranza executouse hai {NUM_HOURS} horas}}</translation>
<translation id="740624631517654988">Ventá emerxente bloqueada</translation>
<translation id="7406912950279255498">Modo de inversión da cor</translation>
<translation id="7407430846095439694">Importar e vincular</translation>
@@ -7413,7 +7413,7 @@ Podes xestionar a configuración desde o menú da tarxeta ou ver máis opcións
<translation id="7691698019618282776">Actualización de Crostini</translation>
<translation id="7694246789328885917">Ferramenta de marcador</translation>
<translation id="7696063401938172191">No teu teléfono <ph name="PHONE_NAME" />:</translation>
-<translation id="769824636077131955">Este documento é demasiado grande para realizar unha comprobación de seguranza. Podes imprimir documentos de ata 50 MB.</translation>
+<translation id="769824636077131955">Este documento é demasiado grande para realizar unha Comprobación de seguranza. Podes imprimir documentos de ata 50 MB.</translation>
<translation id="7698507637739331665">Algúns elementos están bloqueados</translation>
<translation id="7701040980221191251">Ningunha</translation>
<translation id="7701869757853594372">Controladores de USUARIO</translation>
@@ -7668,7 +7668,7 @@ Podes xestionar a configuración desta tarxeta desde o menú correspondente ou v
<translation id="7922935920104868876">Mostrar detalles sobre o bloqueo de cookies de terceiros no modo de incógnito</translation>
<translation id="7923564237306226146">Completouse a actualización de Linux</translation>
<translation id="7924358170328001543">Produciuse un erro co encamiñamento do porto</translation>
-<translation id="7925108652071887026">Autocompletar datos</translation>
+<translation id="7925108652071887026">Datos de Autocompletar</translation>
<translation id="792514962475806987">Nivel de zoom da lupa ancorada:</translation>
<translation id="7925285046818567682">Esperando por <ph name="HOST_NAME" />...</translation>
<translation id="7926423016278357561">Non era eu.</translation>
@@ -7792,7 +7792,7 @@ Mantén o ficheiro de clave nun lugar seguro, xa que o precisarás para crear no
<translation id="8030852056903932865">Aprobar</translation>
<translation id="8032244173881942855">Non se puido emitir a pestana.</translation>
<translation id="8032569120109842252">Seguindo</translation>
-<translation id="8033023935541439900">Abriuse o menú de acentos gráficos. Preme esquerda ou dereita para desprazarte e Introducir para escribir un.</translation>
+<translation id="8033023935541439900">Abriuse o menú de acentos. Preme esquerda ou dereita para desprazarte e Introducir para escribir un.</translation>
<translation id="8033827949643255796">seleccionados</translation>
<translation id="8033958968890501070">Tempo de espera esgotado</translation>
<translation id="8035059678007243127">Páxina de incógnito almacenada na memoria caché de páxinas anteriores e seguintes: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation>
@@ -8411,7 +8411,7 @@ Mantén o ficheiro de clave nun lugar seguro, xa que o precisarás para crear no
<translation id="8611682088849615761">Continuar permitindo que este sitio teña control total dos dispositivos MIDI</translation>
<translation id="8613164732773110792">Só caracteres en minúscula, díxitos, guións baixos ou trazos</translation>
<translation id="8613645710357126807">Sitios nos que non se permite o uso de extensións</translation>
-<translation id="8613786722548417558"><ph name="FILE_NAME" /> é demasiado grande para realizar unha comprobación de seguranza. Podes abrir ficheiros de ata 50 MB.</translation>
+<translation id="8613786722548417558"><ph name="FILE_NAME" /> é demasiado grande para realizar unha Comprobación de seguranza. Podes abrir ficheiros de ata 50 MB.</translation>
<translation id="8615618338313291042">Aplicación de incógnito: <ph name="APP_NAME" /></translation>
<translation id="8616441548384109662">Engadir <ph name="CONTACT_NAME" /> aos teus contactos</translation>
<translation id="8617748779076050570">Código de conexión segura: <ph name="CONNECTION_ID" /></translation>
@@ -8611,7 +8611,7 @@ Mantén o ficheiro de clave nun lugar seguro, xa que o precisarás para crear no
<translation id="8775653927968399786">{0,plural, =1{O teu dispositivo (<ph name="DEVICE_TYPE" />) bloquearase automaticamente en # segundo.
<ph name="DOMAIN" /> require que manteñas a tarxeta intelixente inserida.}other{O teu dispositivo (<ph name="DEVICE_TYPE" />) bloquearase automaticamente en # segundos.
<ph name="DOMAIN" /> require que manteñas a tarxeta intelixente inserida.}}</translation>
-<translation id="8776294611668764629">A túa organización bloqueou este ficheiro porque é demasiado grande para realizar unha comprobación de seguranza. Podes abrir ficheiros de ata 50 MB.</translation>
+<translation id="8776294611668764629">A túa organización bloqueou este ficheiro porque é demasiado grande para realizar unha Comprobación de seguranza. Podes abrir ficheiros de ata 50 MB.</translation>
<translation id="8777628254805677039">contrasinal raíz</translation>
<translation id="8778393144535275552">Borrar datos mostrados</translation>
<translation id="8779944680596936487">Os distintos sitios só poden utilizar as cookies para consultar a actividade de navegación que levaches a cabo no seu propio sitio</translation>
@@ -9111,7 +9111,7 @@ Consulta máis información sobre os datos que recompila Google e por que o fai
<translation id="93140074055951850">Detivéronse as aplicacións para Android</translation>
<translation id="932327136139879170">Inicio</translation>
<translation id="932508678520956232">Non se puido empezar a imprimir.</translation>
-<translation id="933427034780221291">{NUM_FILES,plural, =1{Este ficheiro é demasiado grande para realizar unha comprobación de seguranza. Podes cargar ficheiros de ata 50 MB.}other{Algúns destes ficheiros son demasiado grandes para realizar unha comprobación de seguranza. Podes cargar ficheiros de ata 50 MB.}}</translation>
+<translation id="933427034780221291">{NUM_FILES,plural, =1{Este ficheiro é demasiado grande para realizar unha Comprobación de seguranza. Podes cargar ficheiros de ata 50 MB.}other{Algúns destes ficheiros son demasiado grandes para realizar unha Comprobación de seguranza. Podes cargar ficheiros de ata 50 MB.}}</translation>
<translation id="93343527085570547">Accede á <ph name="BEGIN_LINK1" />páxina de axuda legal<ph name="END_LINK1" /> para solicitar cambios de contido por motivos legais. Enviarase a Google información da conta e do sistema. Utilizaremos os datos que nos indiques para axudarche a solucionar problemas técnicos e mellorar os nosos servizos, de conformidade coa nosa <ph name="BEGIN_LINK2" />Política de privacidade<ph name="END_LINK2" /> e coas <ph name="BEGIN_LINK3" />Condicións de servizo<ph name="END_LINK3" />.</translation>
<translation id="93393615658292258">Só contrasinal</translation>
<translation id="934244546219308557">Ponlle un nome a este grupo</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_hi.xtb b/chromium/chrome/app/resources/generated_resources_hi.xtb
index 77fb0acb4f0..23187dd0a26 100644
--- a/chromium/chrome/app/resources/generated_resources_hi.xtb
+++ b/chromium/chrome/app/resources/generated_resources_hi.xtb
@@ -220,7 +220,7 @@
<translation id="1188807932851744811">लॉग अपलोड नहीं किया गया.</translation>
<translation id="1190086046506744802">लाइनों के बीच बहुत ज़्यादा जगह खाली है</translation>
<translation id="11901918071949011">{NUM_FILES,plural, =1{अपने कंप्‍यूटर पर स्टोर की गई कोई फ़ाइल एक्सेस करें}one{अपने कंप्‍यूटर पर स्टोर की गई # फ़ाइलें एक्सेस करें}other{अपने कंप्‍यूटर पर स्टोर की गई # फ़ाइलें एक्सेस करें}}</translation>
-<translation id="119092896208640858">ब्राउजिंग डेटा को सिर्फ़ इस डिवाइस से साफ़ करने और अपने 'Google खाते' में रखने के लिए, <ph name="BEGIN_LINK" />साइन आउट करें<ph name="END_LINK" />.</translation>
+<translation id="119092896208640858">ब्राउज़िंग डेटा को सिर्फ़ इस डिवाइस से मिटाने और अपने Google खाते में रखने के लिए, <ph name="BEGIN_LINK" />साइन आउट करें<ph name="END_LINK" />.</translation>
<translation id="1191353342579061195">अपनी ज़रूरतों के मुताबिक थीम चुनें. अपनी थीम, वॉलपेपर, स्क्रीन सेवर वगैरह बदलने के लिए, बस डेस्कटॉप पर दायां क्लिक करें.</translation>
<translation id="1192706927100816598">{0,plural, =1{आप अगले # सेकंड में अपने-आप साइन आउट हो जाएंगे.
<ph name="DOMAIN" /> के लिए ज़रूरी है कि आप अपना स्मार्ट कार्ड डालकर रखें.}one{आप अगले # सेकंड में अपने-आप साइन आउट हो जाएंगे.
@@ -1855,7 +1855,7 @@
<translation id="2588636910004461974"><ph name="VENDOR_NAME" /> की ओर से डिवाइस</translation>
<translation id="25899519884572181">रीडर मोड से बाहर निकलें</translation>
<translation id="2593499352046705383">शुरू करने से पहले, पक्का करें कि आपने डेटा का बैक अप ले लिया हो. <ph name="DEVICE_OS" /> इंस्टॉल करने से, आपकी हार्ड ड्राइव पर मौजूद पूरा डेटा मिट जाएगा. ज़्यादा जानने के लिए, g.co/flex/InstallGuide पर जाएं.</translation>
-<translation id="2594999711683503743">Google पर खोजें या URL टाइप करें</translation>
+<translation id="2594999711683503743">Google पर खोजें या यूआरएल टाइप करें</translation>
<translation id="2599048253926156421">उपयोगकर्ता नाम को क्लिपबोर्ड पर कॉपी किया गया</translation>
<translation id="2602501489742255173">शुरू करने के लिए ऊपर की ओर स्वाइप करें</translation>
<translation id="2603115962224169880">कंप्यूटर साफ़ करें</translation>
@@ -2200,7 +2200,7 @@
<translation id="2891566119238851894">साइड पैनल में सर्च टूलबार चालू करें. साइड पैनल में सर्च टूलबार बंद है.</translation>
<translation id="2891922230654533301">क्या आप <ph name="APP_NAME" /> में साइन इन करने के लिए अपना डिवाइस इस्तेमाल करना चाहते हैं?</translation>
<translation id="2893013536106749396">आपके लिए जो चीज़ें अहम हैं उनके बारे में अपडेट देने वाले कार्ड चुनें</translation>
-<translation id="2893168226686371498">सामान्य ब्राउज़र</translation>
+<translation id="2893168226686371498">डिफ़ॉल्ट ब्राउज़र</translation>
<translation id="2893180576842394309">Search और अन्य Google सेवाओं को आपके हिसाब से बनाने के लिए, Google आपका ब्राउज़िंग इतिहास इस्तेमाल कर सकता है.</translation>
<translation id="2894757982205307093">ग्रुप में नया टैब जोड़ें</translation>
<translation id="289695669188700754">कुंजी ID: <ph name="KEY_ID" /></translation>
@@ -2805,7 +2805,7 @@
<translation id="3459697287128633276">Google Play Store एक्सेस करने को अपना खाता चालू करने के लिए, कृपया अपनी पहचान देने वाली सेवा के ज़रिए पुष्टि करें.</translation>
<translation id="3460458947710119567">{NUM_BOOKMARKS,plural, =1{1 बुकमार्क मिटाया गया}one{# बुकमार्क मिटाया गया}other{# बुकमार्क मिटाए गए}}</translation>
<translation id="3461766685318630278">अतिरिक्त कंटेनर बनाएं और मिटाएं.</translation>
-<translation id="3462311546193741693">आपको अधिकतर साइटों से साइन आउट कर देता है. आप अपने 'Google खाते' में साइन इन रहते हैं ताकि आपका सिंक किया हुआ डेटा साफ़ हो जाए.</translation>
+<translation id="3462311546193741693">आपको ज़्यादातर साइटों से साइन आउट कर देता है. हालांकि, आपको अपने Google खाते से साइन आउट नहीं करता.</translation>
<translation id="3462413494201477527">खाता सेटअप रहने दें?</translation>
<translation id="3462958980772249646">{COUNT,plural, =1{इस डिवाइस पर {COUNT} पासवर्ड सेव है}one{इस डिवाइस पर {COUNT} पासवर्ड सेव है}other{इस डिवाइस पर {COUNT} पासवर्ड सेव हैं}}</translation>
<translation id="346298925039590474">यह मोबाइल नेटवर्क, इस डिवाइस को इस्तेमाल करने वाले सभी उपयोगकर्ताओं के लिए उपलब्ध रहेगा</translation>
@@ -3374,7 +3374,7 @@
<translation id="3954354850384043518">जारी है</translation>
<translation id="3954469006674843813"><ph name="WIDTH" /> गुणा <ph name="HEIGHT" /> (<ph name="REFRESH_RATE" /> हर्ट्ज़)</translation>
<translation id="3954953195017194676">आपके पास हाल ही में कैप्चर किया गया कोई WebRTC इवेंट लॉग नहीं है.</translation>
-<translation id="3955193568934677022">साइटों को सुरक्षित सामग्री चलाने दें (हम इस सेटिंग को चालू रखने का सुझाव देते हैं)</translation>
+<translation id="3955193568934677022">साइटों को सुरक्षित कॉन्टेंट चलाने दें (हम इस सेटिंग को चालू रखने का सुझाव देते हैं)</translation>
<translation id="3955321697524543127">साइटों को यूएसबी डिवाइसों से कनेक्ट करने की अनुमति न दें</translation>
<translation id="3955896417885489542">सेटअप के बाद Google Play विकल्पों की समीक्षा करें</translation>
<translation id="3957079323242030166">बैक अप डेटा आपके डिस्क की मेमोरी को नहीं खर्च करेगा.</translation>
@@ -3940,7 +3940,7 @@
<translation id="4488257340342212116">कैमरा इस्तेमाल करने की अनुमति है</translation>
<translation id="4488502501195719518">क्या आप सारा डेटा मिटाना चाहते हैं?</translation>
<translation id="4490086832405043258">इस प्रोफ़ाइल के लिए, ChromeOS की प्रॉक्सी सेटिंग का इस्तेमाल करें.</translation>
-<translation id="449126573531210296">अपने Google खाते के क्रेडेंशियल का इस्तेमाल कर, सिंक किए गए पासवर्ड को सुरक्षित करें.</translation>
+<translation id="449126573531210296">अपने Google खाते के क्रेडेंशियल का इस्तेमाल करके, सिंक किए गए पासवर्ड को सुरक्षित करें.</translation>
<translation id="449232563137139956">आम तौर पर, साइटें उदाहरण देने के लिए इमेज दिखाती हैं. जैसे कि ऑनलाइन स्टोर या समाचार लेखों के लिए फ़ोटो</translation>
<translation id="4492698018379445570">देखें कि आपने शॉपिंग कार्ट में किन चीज़ों को जोड़ा है और सभी चीज़ें जांचने के बाद पैसे चुकाएं</translation>
<translation id="4493167769966437077"><ph name="LANGUAGE_NAME" /> के लिए अनुवाद करने की सुविधा कभी भी न दें</translation>
@@ -3976,7 +3976,7 @@
<translation id="4519935350946509010">कनेक्शन में गड़बड़ी.</translation>
<translation id="4520385623207007473">इस्तेमाल की जा रही कुकी</translation>
<translation id="452039078290142656"><ph name="VENDOR_NAME" /> के अज्ञात डिवाइस</translation>
-<translation id="4522570452068850558">विवरण</translation>
+<translation id="4522570452068850558">ब्यौरा</translation>
<translation id="4522600456902129422">इस साइट को क्लिपबोर्ड देखने देते रहें</translation>
<translation id="4522890784888918985">बच्चों के खातों से वीएम सॉफ़्टवेयर इस्तेमाल नहीं किया जा सकता</translation>
<translation id="4523876148417776526">साइटों की सूची वाली एक्सएमएल फ़ाइलें अभी फ़ेच नहीं हुई हैं.</translation>
@@ -4210,7 +4210,7 @@
ज़ूम आउट करने के लिए, Ctrl+Alt+ 'स्क्रीन की रोशनी कम करें' बटन का इस्तेमाल करें.</translation>
<translation id="4726710629007580002">इस एक्सटेंशन को इंस्टॉल करने का प्रयास करते समय चेतावनियां आई थीं:</translation>
<translation id="472738079453283624">प्रॉडक्ट</translation>
-<translation id="4727847987444062305">मेहमान के तौर पर ब्राउज़ करने का प्रबंधित सेशन</translation>
+<translation id="4727847987444062305">मेहमान के तौर पर ब्राउज़ करने का, मैनेज किया जा रहा सेशन</translation>
<translation id="4728558894243024398">प्लेटफ़ॉर्म</translation>
<translation id="4730492586225682674">स्टाइलस की मदद से नए नोट को लॉक स्क्रीन पर रखना</translation>
<translation id="4730888769809690665"><ph name="SITE" /> को सूचनाएं भेजने की अनुमति है</translation>
@@ -4536,7 +4536,7 @@
<translation id="5039696241953571917">अपने Google खाते में सेव किए गए पासवर्ड देखें और उन्हें प्रबंधित करें</translation>
<translation id="5039804452771397117">अनुमति दें</translation>
<translation id="5040262127954254034">निजता</translation>
-<translation id="5040823038948176460">कॉन्टेंट से जुड़ी दूसरी सेटिंग</translation>
+<translation id="5040823038948176460">कॉन्टेंट से जुड़ी अन्य सेटिंग</translation>
<translation id="5041509233170835229">Chrome ऐप</translation>
<translation id="5043440033854483429">नाम में अक्षर, संख्याएं, और हाइफ़न (-) इस्तेमाल किए जा सकते हैं. नाम 1 से 15 वर्णों के बीच का होना चाहिए.</translation>
<translation id="5045550434625856497">ग़लत पासवर्ड</translation>
@@ -4741,7 +4741,7 @@
<translation id="523862956770478816">साइट के लिए अनुमतियां</translation>
<translation id="5242724311594467048">"<ph name="EXTENSION_NAME" />" को चालू करें?</translation>
<translation id="5243522832766285132">कृपया कुछ देर बाद कोशिश करें</translation>
-<translation id="5244474230056479698"><ph name="EMAIL" /> से समन्वयित हो रहा है</translation>
+<translation id="5244474230056479698"><ph name="EMAIL" /> से कोऑर्डिनेट हो रहा है</translation>
<translation id="5245610266855777041">स्कूल वाले खाते से शुरू करें</translation>
<translation id="5246282308050205996"><ph name="APP_NAME" /> क्रैश हो गया है. ऐप्‍लिकेशन को रीस्टार्ट करने के लिए इस गुब्‍बारे पर क्‍लिक करें .</translation>
<translation id="5247051749037287028">दिखाई देने वाला नाम (वैकल्पिक)</translation>
@@ -5098,7 +5098,7 @@
<translation id="5561162485081632007">नुकसान पहुंचाने वाली घटनाएं होने पर उनकी पहचान करता है और उनके बारे में आपको चेतावनी देता है.</translation>
<translation id="5562781907504170924">यह टैब किसी ब्लूटूथ डिवाइस से कनेक्ट है.</translation>
<translation id="556321030400250233">स्थानीय या शेयर की गई फ़ाइल</translation>
-<translation id="5563234215388768762">Google पर खोज करें या कोई यूआरएल टाइप करें</translation>
+<translation id="5563234215388768762">Google पर खोजें या कोई यूआरएल टाइप करें</translation>
<translation id="5565735124758917034">सक्रिय</translation>
<translation id="5568069709869097550">साइन इन नहीं किया जा सकता</translation>
<translation id="5571066253365925590">ब्लूटूथ सक्षम किया गया</translation>
@@ -5409,7 +5409,7 @@
<translation id="5855643921295613558">0.6 सेकंड</translation>
<translation id="5856721540245522153">डीबग करने वाली सुविधाएं चालू करें</translation>
<translation id="5857090052475505287">नया फ़ोल्डर</translation>
-<translation id="5857171483910641802">आप जिन वेबसाइटों पर जाते हैं उनके आधार पर शॉर्टकट के सुझाव दिखाए जाते हैं</translation>
+<translation id="5857171483910641802">जिन वेबसाइटों को ब्राउज़ किया जाता है उनके आधार पर शॉर्टकट के सुझाव दिखाए जाते हैं</translation>
<translation id="5857675236236529683">जब आप तैयार हों, तो अपनी रीडिंग लिस्ट यहां पाएं</translation>
<translation id="5858490737742085133">टर्मिनल</translation>
<translation id="585979798156957858">बाहरी मेटा</translation>
@@ -5426,8 +5426,8 @@
<translation id="5864754048328252126">चार्ज करते समय डिवाइस पर काम नहीं हो रहा है</translation>
<translation id="5865508026715185451"><ph name="APP_NAME" /> जल्द ही रुक जाएगा</translation>
<translation id="586567932979200359">आप <ph name="PRODUCT_NAME" /> को उसकी डिस्क इमेज से चला रहे हैं. इसे अपने कंप्यूटर पर इंस्टॉल करने से यह आपको बिना डिस्क इमेज के चलाने देता है और पक्का करता है कि इससे यह 'अप टू डेट' रहेगा.</translation>
-<translation id="5865733239029070421">Google को इस्तेमाल के आंकड़े और खराबी रिपोर्ट अपने आप भेजती है</translation>
-<translation id="5867841422488265304">वेब पता खोजें या टाइप करें</translation>
+<translation id="5865733239029070421">Google को इस्तेमाल के आंकड़े और गड़बड़ी की रिपोर्ट अपने-आप भेजती है</translation>
+<translation id="5867841422488265304">कुछ खोजें या वेब पता टाइप करें</translation>
<translation id="5869029295770560994">ठीक है, समझ लिया</translation>
<translation id="5869522115854928033">सेव किए गए पासवर्ड</translation>
<translation id="5870086504539785141">सुलभता मेन्यू बंद करें</translation>
@@ -8980,7 +8980,7 @@
<translation id="9079267182985899251">कुछ समय बाद यह विकल्प काम करना बंद कर देगा. किसी टैब को प्रज़ेंट करने के लिए, <ph name="GOOGLE_MEET" /> का इस्तेमाल करें.</translation>
<translation id="9080175821499742274">मेमोरी सेवर, इस्तेमाल नहीं किए जा रहे टैब से मेमोरी खाली करता है, ताकि इस्तेमाल किए जा रहे टैब और दूसरे ऐप्लिकेशन इस मेमोरी का इस्तेमाल कर सकें.</translation>
<translation id="9080971985541434310">आपकी पसंद के विषयों का अनुमान लगाता है - Chrome आपकी पसंद के विषयों का अनुमान लगा सकता है</translation>
-<translation id="9081543426177426948">जिन साइटों पर आप जाते हैं उनकी जानकारी गुप्त मोड में सेव नहीं होती</translation>
+<translation id="9081543426177426948">जिन साइटों को ब्राउज़ किया जाता है उनकी जानकारी गुप्त मोड में सेव नहीं होती</translation>
<translation id="9084064520949870008">विंडो के रूप में खोलें</translation>
<translation id="9085256200913095638">चुना गया टैब डुप्लीकेट करें</translation>
<translation id="9085446486797400519">कैमरे का ऐक्सेस</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_hr.xtb b/chromium/chrome/app/resources/generated_resources_hr.xtb
index e0991b53ac8..019de07b39e 100644
--- a/chromium/chrome/app/resources/generated_resources_hr.xtb
+++ b/chromium/chrome/app/resources/generated_resources_hr.xtb
@@ -1577,7 +1577,7 @@ Postavkama računa možete upravljati tako da instalirate aplikaciju Family Link
<translation id="2349896577940037438">Ako je uključena dodatna aktivnost na webu i u aplikacijama, ti se podaci mogu spremati na vaš Google račun. Na stranici account.google.com možete pogledati svoje podatke, izbrisati ih ili promijeniti postavke računa.</translation>
<translation id="2350133097354918058">Ponovno učitano</translation>
<translation id="2350182423316644347">Inicijalizacija aplikacije...</translation>
-<translation id="235028206512346451">Ako se odmaknete od uređaja, zaslon će se automatski zaključati. Zaslon će dulje ostati aktivan dok ste ispred uređaja. Ako ne koristite zaključan zaslon, uređaj se neće zaključati, nego će prijeći u stanje mirovanja.</translation>
+<translation id="235028206512346451">Ako se odmaknete od uređaja, zaslon će se automatski zaključati. Zaslon će dulje ostati aktivan dok ste ispred uređaja. Ako ne koristite zaključani zaslon, uređaj se neće zaključati, nego će prijeći u stanje mirovanja.</translation>
<translation id="2352495879228166246">{NUM_ITEMS,plural, =1{Jedna stavka}one{{NUM_ITEMS} stavka}few{{NUM_ITEMS} stavke}other{{NUM_ITEMS} stavki}}</translation>
<translation id="2352662711729498748">&lt;1 MB</translation>
<translation id="2352810082280059586">Napomene za zaključani zaslon automatski se spremaju u aplikaciju <ph name="LOCK_SCREEN_APP_NAME" />. Najnovija napomena ostat će na zaključanom zaslonu.</translation>
@@ -2666,7 +2666,7 @@ Postavkama računa možete upravljati tako da instalirate aplikaciju Family Link
<translation id="3348038390189153836">Otkriven je uklonjivi uređaj</translation>
<translation id="3348131053948466246">Emoji je predložen. Pritisnite tipke za gore ili dolje za kretanje i tipku Enter za umetanje.</translation>
<translation id="3349933790966648062">Upotreba memorije</translation>
-<translation id="3353786022389205125">Uključite opciju Prikaži zaključan zaslon prilikom vraćanja iz mirovanja i pokušajte ponovo</translation>
+<translation id="3353786022389205125">Uključite opciju Prikaži zaključani zaslon prilikom vraćanja iz mirovanja i pokušajte ponovo</translation>
<translation id="3354768182971982851">Stare verzije Chromeovih aplikacija neće se otvoriti na Mac uređajima nakon prosinca 2022. Možete provjeriti je li dostupna nova verzija.</translation>
<translation id="3354972872297836698">Uparivanje s uređajem <ph name="DEVICE_NAME" /> nije uspjelo; odaberite uređaj da biste pokušali ponovo</translation>
<translation id="335581015389089642">Govor</translation>
@@ -3173,7 +3173,7 @@ Postavkama računa možete upravljati tako da instalirate aplikaciju Family Link
<translation id="3798449238516105146">Verzija</translation>
<translation id="3798632811625902122">Bluetooth uređaj <ph name="DEVICE" /> traži dopuštenje za uparivanje.</translation>
<translation id="3798670284305777884">Zvučnik (ugrađeni)</translation>
-<translation id="3799128412641261490">Postavke prekidača za pristup</translation>
+<translation id="3799128412641261490">Postavke navigacije prekidačima</translation>
<translation id="3800030395703848668">Pregledajte opcije popisa</translation>
<translation id="3800806661949714323">Prikaži sve (preporučeno)</translation>
<translation id="3800828618615365228">Dodatni uvjeti za Google Chrome i OS Chrome</translation>
@@ -4632,7 +4632,7 @@ Upotrijebite Ctrl + Alt + Smanjivanje svjetline za smanjivanje prikaza.</transla
<translation id="5143374789336132547">Proširenje "<ph name="EXTENSION_NAME" />" promijenilo je stranicu koja se prikazuje kada se klikne gumb Početna.</translation>
<translation id="5143612243342258355">Datoteka je opasna</translation>
<translation id="5143712164865402236">Otvori na cijelom zaslonu</translation>
-<translation id="5145464978649806571">Ako se odmaknete od uređaja, zaslon će se automatski zaključati. Zaslon će dulje ostati aktivan dok ste ispred uređaja. Ako je zaključan zaslon onemogućen, uređaj se neće zaključati, nego će prijeći u stanje mirovanja.</translation>
+<translation id="5145464978649806571">Ako se odmaknete od uređaja, zaslon će se automatski zaključati. Zaslon će dulje ostati aktivan dok ste ispred uređaja. Ako je zaključani zaslon onemogućen, uređaj se neće zaključati, nego će prijeći u stanje mirovanja.</translation>
<translation id="514575469079499857">Za određivanje lokacije upotrebljava se vaša IP adresa (zadano)</translation>
<translation id="5146896637028965135">Glas sustava</translation>
<translation id="5147103632304200977">Kada web-lokacija želi pristupiti HID uređajima, prikaži upit (preporučeno)</translation>
@@ -6719,7 +6719,7 @@ Imate još # ugroženih zaporki. Google upravitelj zaporki preporučuje da odmah
<translation id="7034692021407794547">Administrator s ovlašću upravljanja naplatom mora prvo prihvatiti uvjete pružanja usluge hardvera za Google Meet u odjeljku Hardver za Google Meet administratorske konzole.</translation>
<translation id="7036706669646341689">Za Linux se preporučuje <ph name="DISK_SIZE" /> prostora. Da biste oslobodili prostor, izbrišite datoteke s uređaja.</translation>
<translation id="7037509989619051237">Tekst za pregled</translation>
-<translation id="7038632520572155338">Prekidač za pristup</translation>
+<translation id="7038632520572155338">Navigacija prekidačima</translation>
<translation id="7038710352229712897">Dodavanje još jednog Google računa kojim će se koristiti <ph name="USER_NAME" /></translation>
<translation id="7039326228527141150">pristupiti USB uređajima dobavljača <ph name="VENDOR_NAME" /></translation>
<translation id="7039912931802252762">Prijava na Microsoftovu pametnu karticu</translation>
@@ -6772,7 +6772,7 @@ Imate još # ugroženih zaporki. Google upravitelj zaporki preporučuje da odmah
<translation id="7086672505018440886">Uključi Chromeove datoteke zapisnika u arhivu.</translation>
<translation id="7088434364990739311">Nije uspjelo pokretanje ažuriranja (kôd pogreške <ph name="ERROR" />).</translation>
<translation id="7088674813905715446">Administrator je postavio uređaj u stanje uklonjenog pristupa. Da biste omogućili njegovu prijavu, zamolite administratora da postavi uređaj u stanje na čekanju.</translation>
-<translation id="7088960765736518739">Prekidač za pristup</translation>
+<translation id="7088960765736518739">Navigacija prekidačima</translation>
<translation id="7089253021944603172">Kartica je ponovo aktivna</translation>
<translation id="7090160970140261931">Na svoj uređaj <ph name="DEVICE_TYPE" /> možete dodati dodatne račune da biste ih koristili s web-lokacijama i Android aplikacijama. Možete i upravljati time koji se računi koriste s Android aplikacijama.</translation>
<translation id="7090714929377281710">Automatski isključi žarišnu točku</translation>
@@ -7018,7 +7018,7 @@ Imate još # ugroženih zaporki. Google upravitelj zaporki preporučuje da odmah
<translation id="7346909386216857016">Dobro, shvaćam</translation>
<translation id="7347751611463936647">Da biste upotrijebili to proširenje, upišite "<ph name="EXTENSION_KEYWORD" />", zatim pritisnite TAB, a zatim svoju naredbu ili pretraživanje.</translation>
<translation id="7347943691222276892">Kliknite da biste napustili podstranicu <ph name="SUBPAGE_TITLE" />.</translation>
-<translation id="7348093485538360975">Tipkovnica na zaslonu</translation>
+<translation id="7348093485538360975">Zaslonska tipkovnica</translation>
<translation id="7349010927677336670">Ujednačenost videoreprodukcije</translation>
<translation id="7352651011704765696">Nešto nije u redu</translation>
<translation id="7353261921908507769">Vaši kontakti mogu dijeliti s vama kad su u blizini. Prijenosi neće početi prije nego što ih prihvatite.</translation>
@@ -7448,7 +7448,7 @@ Imate još # ugroženih zaporki. Google upravitelj zaporki preporučuje da odmah
<translation id="7717014941119698257">Preuzimanje: <ph name="STATUS" /></translation>
<translation id="771721654176725387">Time će se trajno izbrisati podaci o pregledavanju s ovog uređaja. Da biste vratili te podatke, uključite sinkroniziranje kao</translation>
<translation id="7717845620320228976">Provjeri ažuriranja</translation>
-<translation id="7718490543420739837">Tipkovnica na zaslonu, diktiranje, navigacija prekidačima i mnoge druge značajke</translation>
+<translation id="7718490543420739837">Zaslonska tipkovnica, diktiranje, navigacija prekidačima i mnoge druge značajke</translation>
<translation id="7719367874908701697">Zumiranje stranice</translation>
<translation id="7719588063158526969">Naziv uređaja predugačak je</translation>
<translation id="7721179060400456005">Dopusti da prozori obuhvaćaju više zaslona</translation>
@@ -7557,7 +7557,7 @@ Pritisnite dodijeljeni prekidač ili tipku da biste uklonili dodjelu.</translati
<translation id="7814458197256864873">&amp;Kopiraj</translation>
<translation id="7815583197273433531">Uredite prečac <ph name="SHORTCUT" /> za proširenje <ph name="EXTENSION_NAME" /></translation>
<translation id="7815680994978050279">Blokirano je opasno preuzimanje</translation>
-<translation id="7817361223956157679">Tipkovnica na zaslonu još uvijek ne funkcionira u Linux aplikacijama</translation>
+<translation id="7817361223956157679">Zaslonska tipkovnica još uvijek ne funkcionira u Linux aplikacijama</translation>
<translation id="7818135753970109980">Dodana je nova tema (<ph name="EXTENSION_NAME" />)</translation>
<translation id="7819605256207059717">Vaša je organizacija ovo blokirala</translation>
<translation id="7820561748632634942">Želite li dodijeliti dodatne prekidače?</translation>
@@ -7756,7 +7756,7 @@ Pritisnite dodijeljeni prekidač ili tipku da biste uklonili dodjelu.</translati
<translation id="7988355189918024273">Omogući značajke dostupnosti</translation>
<translation id="7988805580376093356">Zadržite svoj OS i pokrenite <ph name="DEVICE_OS" /> s USB-a.</translation>
<translation id="7990863024647916394"><ph name="DISPLAY_NAME" /> glas <ph name="COUNT" /></translation>
-<translation id="7991296728590311172">Postavke prekidača za pristup</translation>
+<translation id="7991296728590311172">Postavke navigacije prekidačima</translation>
<translation id="7992203134935383159">Sinteza govora</translation>
<translation id="7994515119120860317">Prevedite tekst na slici pomoću usluge <ph name="VISUAL_SEARCH_PROVIDER" /></translation>
<translation id="799570308305997052">Web-prikaz</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_hu.xtb b/chromium/chrome/app/resources/generated_resources_hu.xtb
index 0317351e47c..4f062bc19e8 100644
--- a/chromium/chrome/app/resources/generated_resources_hu.xtb
+++ b/chromium/chrome/app/resources/generated_resources_hu.xtb
@@ -1207,7 +1207,7 @@ Ha kezelni szeretné a fiók beállításait, telepítse eszközére a Family Li
<translation id="2048554637254265991">Hiba történt a tárolókezelő indításakor. Próbálja újra.</translation>
<translation id="2048653237708779538">A művelet nem végezhető el</translation>
<translation id="204914487372604757">Parancsikon létrehozása</translation>
-<translation id="2050339315714019657">Álló</translation>
+<translation id="2050339315714019657">Portré</translation>
<translation id="2051555741181591333">Hotspot automatikus letiltása</translation>
<translation id="2052572566310583903">Más eszközökön telepítve</translation>
<translation id="2053105195397337973">Olyan módszerek kidolgozásán fáradozunk, melyekkel korlátozható a nyomon követés úgy, hogy közben a webhelyek is gátat vethetnek a hirdetési spameknek és a csalásnak.</translation>
@@ -8813,7 +8813,7 @@ A(z) <ph name="DOMAIN" /> megköveteli, hogy ne távolítsa el az intelligens k
<translation id="894191600409472540">Hozzon létre erős jelszavakat</translation>
<translation id="894360074127026135">Netscape International Step-Up</translation>
<translation id="8943937581166190941">Az egyik bővítmény HID-eszközt használ</translation>
-<translation id="8944099748578356325">Megnövekedett akkumulátorhasználat (jelenleg <ph name="BATTERY_PERCENTAGE" />%)</translation>
+<translation id="8944099748578356325">Megnövekedett akkuhasználat (jelenleg <ph name="BATTERY_PERCENTAGE" />%)</translation>
<translation id="8945274638472141382">Ikon mérete</translation>
<translation id="8946359700442089734">A hibakereső szolgáltatásokat nem kapcsolták be teljes körűen ezen a(z) <ph name="IDS_SHORT_PRODUCT_NAME" /> eszközön.</translation>
<translation id="894763922177556086">Jó</translation>
@@ -9090,7 +9090,7 @@ A(z) <ph name="DOMAIN" /> megköveteli, hogy ne távolítsa el az intelligens k
<translation id="9180281769944411366">Ez a folyamat néhány percet is igénybe vehet. A Linux-tároló indítása folyamatban van.</translation>
<translation id="9180380851667544951">A webhely megoszthatja a képernyőjét</translation>
<translation id="9182556968660520230">A webhelyek nem játszhatnak le védett tartalmakat</translation>
-<translation id="9183331776983279456">A Chrome automatikusan törli a négy hétnél régebbi webhelyeket. Előfordulhat, hogy egy újra felkeresett webhely ismét megjelenik a listán. Emellett lehetősége van arra is, hogy letiltsa az egyes webhelyek számára, hogy hirdetéseket javasoljanak Önnek.</translation>
+<translation id="9183331776983279456">A Chrome automatikusan törli a négy hétnél régebbi webhelyeket. Előfordulhat, hogy egy újból felkeresett webhely ismét megjelenik a listán. Emellett lehetősége van arra is, hogy letiltsa az egyes webhelyek számára, hogy hirdetéseket javasoljanak Önnek.</translation>
<translation id="918352324374649435">{COUNT,plural, =1{Alkalmazás}other{# alkalmazás}}</translation>
<translation id="9186963452600581158">Bejelentkezés gyermek Google-fiókjával</translation>
<translation id="9187967020623675250">A billentyűk nem egyeznek. Nyomja le bármelyik billentyűt a következőhöz: <ph name="RESPONSE" />.</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_hy.xtb b/chromium/chrome/app/resources/generated_resources_hy.xtb
index 6cfcfadfec8..d4b3e209ee2 100644
--- a/chromium/chrome/app/resources/generated_resources_hy.xtb
+++ b/chromium/chrome/app/resources/generated_resources_hy.xtb
@@ -4387,7 +4387,7 @@
<translation id="4893522937062257019">Կողպէկրանին</translation>
<translation id="4898011734382862273">«<ph name="CERTIFICATE_NAME" />» հավաստագիրը ներկայացնում է հավաստագրման կենտրոնը</translation>
<translation id="4899052647152077033">Շրջել գույները</translation>
-<translation id="4899696330053002588">Պարունակում է գովազդ</translation>
+<translation id="4899696330053002588">Կա գովազդ</translation>
<translation id="489985760463306091">Վնասարար ծրագրի հեռացումն ավարտելու համար վերագործարկեք համակարգիչը</translation>
<translation id="4900392736118574277">Մեկնարկի էջը փոխվել է: Նոր էջն է՝ <ph name="URL" />:</translation>
<translation id="490051679772058907"><ph name="REFRESH_RATE" /> Հց, միահյուսված</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_id.xtb b/chromium/chrome/app/resources/generated_resources_id.xtb
index 25ef73f6e68..a2ae1596c62 100644
--- a/chromium/chrome/app/resources/generated_resources_id.xtb
+++ b/chromium/chrome/app/resources/generated_resources_id.xtb
@@ -2290,7 +2290,7 @@ Anda dapat mengelola setelan akun ini dengan menginstal aplikasi Family Link di
<translation id="2975628416524344939">Kelola perangkat HID</translation>
<translation id="2975761176769946178">URL wajib diisi</translation>
<translation id="2976557544729462544">Beberapa perangkat mengharuskan Anda menonaktifkan perlindungan akses data agar dapat berfungsi dengan benar atau dalam performa penuh.</translation>
-<translation id="2977480621796371840">Hapus dari grup</translation>
+<translation id="2977480621796371840">Keluarkan dari grup</translation>
<translation id="2979639724566107830">Buka di jendela baru</translation>
<translation id="2981113813906970160">Tampilkan kursor mouse besar</translation>
<translation id="2981293774053328982">File ini berisi malware yang dapat membahayakan akun jaringan sosial atau pribadi Anda</translation>
@@ -3263,7 +3263,7 @@ Anda dapat mengelola setelan akun ini dengan menginstal aplikasi Family Link di
<translation id="3855676282923585394">Impor Bookmark dan Setelan...</translation>
<translation id="3856096718352044181">Verifikasi bahwa ini adalah penyedia yang valid atau coba lagi nanti</translation>
<translation id="3856800405688283469">Pilih zona waktu</translation>
-<translation id="3857807444929313943">Angkat jari, lalu sentuh lagi</translation>
+<translation id="3857807444929313943">Angkat jari, lalu sentuhkan lagi</translation>
<translation id="3858860766373142691">Nama</translation>
<translation id="385939467708172187">Gunakan Sandi Kuat</translation>
<translation id="3861638017150647085">Nama pengguna "<ph name="USERNAME" />" tidak tersedia</translation>
@@ -6633,7 +6633,7 @@ Anda memiliki # sandi lainnya yang telah dibobol. Pengelola Sandi Google merekom
<translation id="6961327401577924850">Situs biasanya mencari perangkat Bluetooth untuk fitur seperti penyiapan atau sinkronisasi beacon hemat energi, pelacak kesehatan atau kebugaran, atau bohlam lampu smart</translation>
<translation id="6963872466817251924">Penanda kursor teks</translation>
<translation id="6964390816189577014">Hero</translation>
-<translation id="6964760285928603117">Hapus dari Grup</translation>
+<translation id="6964760285928603117">Keluarkan dari Grup</translation>
<translation id="6965382102122355670">Oke</translation>
<translation id="6965648386495488594">Port</translation>
<translation id="6965978654500191972">Perangkat</translation>
@@ -7810,7 +7810,7 @@ Simpan file kunci Anda di tempat yang aman. Anda akan membutuhkannya untuk membu
<translation id="8028993641010258682">Ukuran</translation>
<translation id="8029492516535178472"><ph name="WINDOW_TITLE" /> - Izin diminta, tekan ⌘ + Option + Panah atas untuk merespons</translation>
<translation id="8030169304546394654">Diputuskan</translation>
-<translation id="8030852056903932865">Setuju</translation>
+<translation id="8030852056903932865">Setujui</translation>
<translation id="8032244173881942855">Tidak dapat mentransmisikan tab.</translation>
<translation id="8032569120109842252">Mengikuti</translation>
<translation id="8033023935541439900">Menu tanda aksen dibuka. Tekan panah kiri atau kanan untuk memilih dan enter untuk menyisipkan.</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_is.xtb b/chromium/chrome/app/resources/generated_resources_is.xtb
index 8d5705cc68d..8c514686e6f 100644
--- a/chromium/chrome/app/resources/generated_resources_is.xtb
+++ b/chromium/chrome/app/resources/generated_resources_is.xtb
@@ -3485,7 +3485,7 @@ Annars skaltu skrá þig út núna svo breytingarnar á þessum reikningi taki g
<translation id="4047726037116394521">Fara á upphafssíðu</translation>
<translation id="4048384495227695211">Sýna <ph name="FILE_NAME" /> í möppu</translation>
<translation id="404894744863342743">Þegar þú lýkur við að nota sóttu skrána skaltu eyða henni svo aðrir sem nota þetta tæki geti ekki séð aðgangsorðin þín.</translation>
-<translation id="4049783682480068824">{COUNT,plural, =1{# tengiliður er ekki tiltækur. Til að nota nærdeilingu með þessum tengilið skaltu bæta netfanginu sem er tengt Google reikningi viðkomandi við tengiliðina þína.}one{# tengiliður er ekki tiltækur. Til að nota nærdeilingu með þessum tengiliðum skaltu bæta netföngunum sem eru tengd Google reikningum þeirra við tengiliðina þína.}other{# tengiliðir eru ekki tiltækir. Til að nota nærdeilingu með þessum tengiliðum skaltu bæta netföngunum sem eru tengd Google reikningum þeirra við tengiliðina þína.}}</translation>
+<translation id="4049783682480068824">{COUNT,plural, =1{# tengiliður er ekki tiltækur. Til að nota nærdeilingu með þessum tengilið skaltu bæta netfanginu sem er tengt Google-reikningi viðkomandi við tengiliðina þína.}one{# tengiliður er ekki tiltækur. Til að nota nærdeilingu með þessum tengiliðum skaltu bæta netföngunum sem eru tengd Google-reikningum þeirra við tengiliðina þína.}other{# tengiliðir eru ekki tiltækir. Til að nota nærdeilingu með þessum tengiliðum skaltu bæta netföngunum sem eru tengd Google-reikningum þeirra við tengiliðina þína.}}</translation>
<translation id="4050225813016893843">Auðkenningaraðferð</translation>
<translation id="4050534976465737778">Gakktu úr skugga um að hvorugt tækið sé læst, settu þau nálægt hvort öðru og hafðu kveikt á Bluetooth. Ef þú deilir með Chromebook sem er ekki í tengiliðunum þínum skaltu tryggja að kveikt sé á nærsýnileika í henni (opnaðu stöðusvæðið og kveiktu á nærsýnileika). <ph name="LINK_BEGIN" />Frekari upplýsingar<ph name="LINK_END" /></translation>
<translation id="4052120076834320548">Örsmátt</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_it.xtb b/chromium/chrome/app/resources/generated_resources_it.xtb
index c31255173ed..d1f4c71f0cb 100644
--- a/chromium/chrome/app/resources/generated_resources_it.xtb
+++ b/chromium/chrome/app/resources/generated_resources_it.xtb
@@ -1196,7 +1196,7 @@ Puoi gestire le impostazioni dell'account installando l'app Family Link su quest
<translation id="2048554637254265991">Errore durante l'avvio del gestore di container. Riprova.</translation>
<translation id="2048653237708779538">Azione non disponibile</translation>
<translation id="204914487372604757">Crea scorciatoia</translation>
-<translation id="2050339315714019657">Verticale</translation>
+<translation id="2050339315714019657">Ritratto</translation>
<translation id="2051555741181591333">Disabilita automaticamente l'hotspot</translation>
<translation id="2052572566310583903">Installata su altri dispositivi</translation>
<translation id="2053105195397337973">Stiamo esaminando dei metodi per limitare il monitoraggio e consentire ai siti di contrastare spam negli annunci e attività fraudolente.</translation>
@@ -1486,7 +1486,7 @@ Puoi gestire le impostazioni dell'account installando l'app Family Link su quest
<translation id="2296218178174497398">Rilevamento dispositivi</translation>
<translation id="2297705863329999812">Cerca stampanti</translation>
<translation id="2297822946037605517">Condividi questa pagina</translation>
-<translation id="2299734369537008228">Dispositivo di scorrimento: da <ph name="MIN_LABEL" /> a <ph name="MAX_LABEL" /></translation>
+<translation id="2299734369537008228">Cursore: da <ph name="MIN_LABEL" /> a <ph name="MAX_LABEL" /></translation>
<translation id="2299941608784654630">Includi tutti i file di log raccolti da debugd sotto forma di archivio separato.</translation>
<translation id="2300214399009193026">PCIe</translation>
<translation id="2300332192655962933">Il file non era disponibile sul sito</translation>
@@ -2479,7 +2479,7 @@ Puoi gestire le impostazioni dell'account installando l'app Family Link su quest
<translation id="3160928651883997588">Preferenze VPN</translation>
<translation id="3161522574479303604">Tutte le lingue</translation>
<translation id="3162853326462195145">Account della scuola</translation>
-<translation id="3162899666601560689">I siti possono utilizzare i cookie per migliorare la tua esperienza di navigazione, ad esempio per mantenere l'accesso o memorizzare gli articoli aggiunti al carrello</translation>
+<translation id="3162899666601560689">I siti possono utilizzare i cookie per migliorare la tua esperienza di navigazione, ad esempio per mantenere l'accesso o memorizzare gli articoli aggiunti al carrello.</translation>
<translation id="3163201441334626963">Prodotto sconosciuto <ph name="PRODUCT_ID" /> del fornitore <ph name="VENDOR_ID" /></translation>
<translation id="3163511056918491211">Ripristina i dati o cambia dispositivo facilmente in qualsiasi momento. Le copie di backup vengono caricate su Google e criptate usando la password del tuo Account Google.</translation>
<translation id="3164329792803560526">Condivisione di questa scheda con <ph name="APP_NAME" /></translation>
@@ -2878,7 +2878,7 @@ Puoi gestire le impostazioni dell'account installando l'app Family Link su quest
<translation id="3541823293333232175">Assegnato</translation>
<translation id="3543393733900874979">Aggiornamento non riuscito (errore: <ph name="ERROR_NUMBER" />)</translation>
<translation id="3543597750097719865">Firma X9.62 ECDSA con SHA-512</translation>
-<translation id="3544058026430919413">Una società può definire un gruppo di siti che possono utilizzare i cookie per condividere la tua attività nel gruppo. Questa opzione è disattivata in incognito.</translation>
+<translation id="3544058026430919413">Una società può definire un gruppo di siti che possono utilizzare i cookie per condividere la tua attività nel gruppo. Questa opzione è disattivata nella modalità di navigazione in incognito.</translation>
<translation id="3544879808695557954">Nome utente (facoltativo)</translation>
<translation id="354602065659584722">Software dannoso rimosso</translation>
<translation id="3547954654003013442">Impostazioni proxy</translation>
@@ -3612,7 +3612,7 @@ Puoi gestire le impostazioni dell'account installando l'app Family Link su quest
<translation id="4195378859392041564">Fai clic su un tasto qualsiasi con il mouse, quindi premi un tasto della tastiera per personalizzarlo</translation>
<translation id="4195421689821407315">Download non sicuro</translation>
<translation id="4195643157523330669">Apri in un'altra scheda</translation>
-<translation id="4195814663415092787">Continuare dal punto in cui avevi interrotto</translation>
+<translation id="4195814663415092787">Continua dal punto in cui avevi interrotto</translation>
<translation id="4198268995694216131">Altri siti</translation>
<translation id="4200689466366162458">Parole del dizionario personale</translation>
<translation id="4200983522494130825">Nuova &amp;scheda</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_iw.xtb b/chromium/chrome/app/resources/generated_resources_iw.xtb
index 371ca98cfdd..291d7df9a38 100644
--- a/chromium/chrome/app/resources/generated_resources_iw.xtb
+++ b/chromium/chrome/app/resources/generated_resources_iw.xtb
@@ -1207,7 +1207,7 @@
<translation id="2048554637254265991">שגיאה בהפעלת מנהל המאגר. יש לנסות שוב.</translation>
<translation id="2048653237708779538">הפעולה לא זמינה</translation>
<translation id="204914487372604757">יצירת קיצור דרך</translation>
-<translation id="2050339315714019657">לאורך</translation>
+<translation id="2050339315714019657">דיוקן</translation>
<translation id="2051555741181591333">השבתה אוטומטית של הנקודה לשיתוף אינטרנט</translation>
<translation id="2052572566310583903">מותקנת במכשירים אחרים שלך</translation>
<translation id="2053105195397337973">אנחנו בוחנים דרכים חדשות להגביל את יכולת המעקב ולעזור לאתרים למנוע ספאם פרסומי והונאות.</translation>
@@ -9097,7 +9097,7 @@
<translation id="9180281769944411366">‏הפעולה עשויה להימשך מספר דקות. מתבצעת הפעלה של הקונטיינר של Linux.</translation>
<translation id="9180380851667544951">האתר רשאי לשתף את המסך</translation>
<translation id="9182556968660520230">לא לאפשר לאתרים להפעיל תוכן מוגן</translation>
-<translation id="9183331776983279456">‏Chrome מוחק באופן אוטומטי אתרים שנוספו לפני יותר מ-4 שבועות. אתר שמבקרים בו פעם נוספת עשוי להופיע שוב ברשימה. אפשר גם לחסום את האפשרות של אתרים להציע מודעות.</translation>
+<translation id="9183331776983279456">‏אתרים שנוספו לפני יותר מ-4 שבועות נמחקים מ-Chrome באופן אוטומטי. אתר שמבקרים בו פעם נוספת עשוי להופיע שוב ברשימה. אפשר גם לחסום את האפשרות של אתרים להציע מודעות.</translation>
<translation id="918352324374649435">{COUNT,plural, =1{אפליקציה}one{# אפליקציות}two{# אפליקציות}other{# אפליקציות}}</translation>
<translation id="9186963452600581158">‏כניסה באמצעות חשבון Google של ילד או ילדה</translation>
<translation id="9187967020623675250">המקשים לא תואמים. צריך להקיש על מקש כלשהו כדי <ph name="RESPONSE" />.</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_ja.xtb b/chromium/chrome/app/resources/generated_resources_ja.xtb
index d94265e37fe..dfdff519b95 100644
--- a/chromium/chrome/app/resources/generated_resources_ja.xtb
+++ b/chromium/chrome/app/resources/generated_resources_ja.xtb
@@ -265,7 +265,7 @@
<translation id="1227660082540388410">パスキーの編集</translation>
<translation id="1227993798763400520">キャストできませんでした。もう一度お試しください。</translation>
<translation id="1230417814058465809">標準保護機能がオンになっています。セキュリティをさらに強化するには、保護強化機能を使用してください。</translation>
-<translation id="1231733316453485619">同期を有効にしますか?</translation>
+<translation id="1231733316453485619">同期を ON にしますか?</translation>
<translation id="1232569758102978740">無題</translation>
<translation id="1233497634904001272">リクエストを完了するには、セキュリティ キーをもう一度タップしてください。</translation>
<translation id="1233721473400465416">言語/地域</translation>
@@ -1943,7 +1943,7 @@
<translation id="2693176596243495071">不明なエラーが発生しました。後でもう一度お試しになるか、問題が解決しない場合は管理者にお問い合わせください。</translation>
<translation id="2698147581454716013">これはバンドルされたデバイスです。Kiosk &amp; Signage Upgrade に登録することはできません。</translation>
<translation id="2699911226086014512">PIN の操作に失敗しました。コード: <ph name="RETRIES" /></translation>
-<translation id="2701330563083355633"><ph name="DEVICE_NAME" /> から共有しました</translation>
+<translation id="2701330563083355633"><ph name="DEVICE_NAME" /> から共有されました</translation>
<translation id="2701737434167469065">ログイン(<ph name="EMAIL" />)</translation>
<translation id="2702801445560668637">リーディング リスト</translation>
<translation id="270414148003105978">モバイル ネットワーク</translation>
@@ -2471,7 +2471,7 @@
<translation id="3160928651883997588">VPN 設定</translation>
<translation id="3161522574479303604">すべての言語</translation>
<translation id="3162853326462195145">学校用アカウント</translation>
-<translation id="3162899666601560689">サイトは、Cookie を使用してブラウジングの利便性を改善できます(ログイン状態の維持、ショッピング カートの中身の保存などが行えます)</translation>
+<translation id="3162899666601560689">サイトは、Cookie を使用して閲覧の利便性を高めることができます(ログイン状態の維持、ショッピング カートの中身の保存など)</translation>
<translation id="3163201441334626963">不明な商品(<ph name="PRODUCT_ID" />、ベンダー: <ph name="VENDOR_ID" />)</translation>
<translation id="3163511056918491211">データの復元やデバイスの切り替えがいつでも簡単にできます。バックアップ データは Google にアップロードされ、Google アカウントのパスワードを使用して暗号化されます。</translation>
<translation id="3164329792803560526">このタブを <ph name="APP_NAME" /> に共有しています</translation>
@@ -2576,7 +2576,7 @@
<translation id="3277214528693754078">テキスト カーソルを使って移動する(カーソル ブラウジング)</translation>
<translation id="3277594800340743211">大きいシャドウ</translation>
<translation id="3278001907972365362">お使いの Google アカウントは対応が必要です</translation>
-<translation id="3279092821516760512">近くにいる選択した連絡先が共有できます。許可するまで転送は行われません。</translation>
+<translation id="3279092821516760512">近くにいる連絡先のうち、選択した人があなたと共有できます。許可するまで転送は行われません。</translation>
<translation id="3279230909244266691">この処理には数分かかることがあります。仮想マシンを起動します。</translation>
<translation id="3280237271814976245">名前を付けて保存(&amp;A)...</translation>
<translation id="3280243678470289153">Chrome に留まる</translation>
@@ -2584,7 +2584,7 @@
<translation id="3281892622610078515">隔離対象のファイルとプログラム:</translation>
<translation id="3282210178675490297">タブを <ph name="APP_NAME" /> と共有します</translation>
<translation id="3285322247471302225">新しいタブ(&amp;T)</translation>
-<translation id="3285500645985761267">関連サイトにグループでのアクティビティの確認を許可する</translation>
+<translation id="3285500645985761267">関連サイトにグループ内のアクティビティの確認を許可する</translation>
<translation id="328571385944182268">パスワードを保存しますか?</translation>
<translation id="3288047731229977326">デベロッパー モードで実行される拡張機能はパソコンにダメージを与える恐れがあります。デベロッパーでない場合は、安全のため、デベロッパー モードで実行されているこれらの拡張機能を無効にしてください。</translation>
<translation id="3289668031376215426">自動大文字変換</translation>
@@ -3120,7 +3120,7 @@
<translation id="3764753550716962406">カートの情報を使用した割引情報の検索を Google に許可しますか?</translation>
<translation id="3764974059056958214">{COUNT,plural, =1{<ph name="DEVICE_NAME" /> に <ph name="ATTACHMENTS" />を送信しています}other{<ph name="DEVICE_NAME" /> に <ph name="ATTACHMENTS" />を送信しています}}</translation>
<translation id="3765246971671567135">オフライン デモモード ポリシーを読み取ることができませんでした。</translation>
-<translation id="3765696567014520261">サイトは、Cookie を使用して別のサイトでのあなたの閲覧アクティビティを確認できず、広告のカスタマイズなどが行えなくなります。一部のサイトで機能を使用できなくなる可能性があります</translation>
+<translation id="3765696567014520261">サイトは、Cookie を使用して別のサイトでのあなたの閲覧アクティビティを確認できず、広告のパーソナライズなどが行えなくなります。一部のサイトで機能を使用できなくなる可能性があります</translation>
<translation id="3766687283066842296">スマートフォン ハブの詳細</translation>
<translation id="3766811143887729231"><ph name="REFRESH_RATE" /> Hz</translation>
<translation id="377050016711188788">アイスクリーム</translation>
@@ -3599,7 +3599,7 @@
<translation id="4193575319002689239">カードを表示</translation>
<translation id="4193836101014293726">このプロファイルを削除できません</translation>
<translation id="419427585139779713">音節単位で入力</translation>
-<translation id="4194570336751258953">タップによるクリックを有効にする</translation>
+<translation id="4194570336751258953">タップしてクリックを有効にする</translation>
<translation id="4195378859392041564">カスタマイズするには、マウスで任意のキーをクリックしてから、キーボードのキーを押してください</translation>
<translation id="4195421689821407315">安全でないダウンロード</translation>
<translation id="4195643157523330669">新しいタブで開く</translation>
@@ -5045,7 +5045,7 @@
<translation id="5544482392629385159">デバイス <ph name="DEVICE_INDEX" />/<ph name="DEVICE_COUNT" />、<ph name="DEVICE_NAME" /></translation>
<translation id="554517701842997186">レンダラ</translation>
<translation id="5545335608717746497">{NUM_TABS,plural, =1{タブをグループに追加}other{タブをグループに追加}}</translation>
-<translation id="5545693483061321551">サイトは、Cookie を使用して別のサイトでのあなたの閲覧アクティビティを確認できず、広告のカスタマイズなどが行えなくなります。一部のサイトで機能を使用できなくなる可能性があります。</translation>
+<translation id="5545693483061321551">サイトは、Cookie を使用して別のサイトでのあなたの閲覧アクティビティを確認できず、広告のパーソナライズなどが行えなくなります。一部のサイトで機能を使用できなくなる可能性があります。</translation>
<translation id="5546865291508181392">検索</translation>
<translation id="5548075230008247516">すべての項目の選択を解除し、選択モードを終了しました。</translation>
<translation id="5548159762883465903">{NUM_OTHER_TABS,plural, =0{「<ph name="TAB_TITLE" />」}=1{「<ph name="TAB_TITLE" />」と他 1 個のタブ}other{「<ph name="TAB_TITLE" />」と他 # 個のタブ}}</translation>
@@ -5385,7 +5385,7 @@
<translation id="5857675236236529683">準備ができたら、ここでリーディング リストを確認できます</translation>
<translation id="5858490737742085133">ターミナル</translation>
<translation id="585979798156957858">外部メタキー</translation>
-<translation id="5860033963881614850">オフ</translation>
+<translation id="5860033963881614850">OFF</translation>
<translation id="5860254591544742609">タイトルバーを表示</translation>
<translation id="5860491529813859533">オンにする</translation>
<translation id="5860494867054883682">デバイスを <ph name="CHANNEL_NAME" /> チャンネルに更新しています(<ph name="PROGRESS_PERCENT" />)</translation>
@@ -5454,7 +5454,7 @@
<ph name="EXPONENT_HEX_DUMP" /></translation>
<translation id="5915207966717429886">データの保存を許可する</translation>
<translation id="5916655001090539219">自動読み上げ</translation>
-<translation id="5916664084637901428">オン</translation>
+<translation id="5916664084637901428">ON</translation>
<translation id="59174027418879706">有効</translation>
<translation id="5920543303088087579">このネットワークへの接続は管理者によって無効にされています</translation>
<translation id="5921257443092182237">Google の位置情報サービスでは、このデバイスの現在地を推定するために、Wi-Fi、モバイル ネットワーク、センサーなどの情報源が使用されます。</translation>
@@ -5765,7 +5765,7 @@
<translation id="6201608810045805374">このアカウントを削除しますか?</translation>
<translation id="6202304368170870640">デバイスのログインやロック解除に PIN を使用できます。</translation>
<translation id="6205314730813004066">広告のプライバシー</translation>
-<translation id="6206199626856438589">開いているタブを含め、表示中のサイトからログアウトします</translation>
+<translation id="6206199626856438589">開いているタブを含め、表示されたサイトからログアウトします</translation>
<translation id="6206311232642889873">画像をコピー(&amp;Y)</translation>
<translation id="6206521455877863927">google.com、mail.google.com などの同じドメインのサイトを含みます。表示しているサイトでは、デバイスにデータが保存されることがあります。</translation>
<translation id="6207200176136643843">リセットしてデフォルトのズームレベルに戻す</translation>
@@ -6151,7 +6151,7 @@
<translation id="6556903358015358733">テーマと壁紙</translation>
<translation id="6557290421156335491">カスタム ショートカット</translation>
<translation id="6560151649238390891">候補を挿入しました</translation>
-<translation id="6561560012278703671">静かな方法で通知する(割り込み通知を行わない)</translation>
+<translation id="6561560012278703671">目立たない方法で通知する(割り込み通知を行わない)</translation>
<translation id="6561726789132298588">Enter</translation>
<translation id="6562117348069327379">システムログをダウンロード ディレクトリに保存します。</translation>
<translation id="656293578423618167">ファイルのパスまたは名前が長すぎます。名前を短くするか、別の場所に保存してください。</translation>
@@ -6340,7 +6340,7 @@
<translation id="6733620523445262364">「<ph name="BOOKMARK_TITLE" />」を作成しました。</translation>
<translation id="6735304988756581115">Cookie と他のサイトのデータを表示...</translation>
<translation id="6736243959894955139">アドレス</translation>
-<translation id="6737393581255281855">表示中のサイトのデータを削除しますか?</translation>
+<translation id="6737393581255281855">表示されたサイトのデータを削除しますか?</translation>
<translation id="6737663862851963468">Kerberos チケットの削除</translation>
<translation id="6738180164164974883">サードパーティ Cookie の設定を許可する</translation>
<translation id="6738430949033571771">アカウントを確認しています...</translation>
@@ -6442,7 +6442,7 @@
<translation id="6818802132960437751">組み込みのウィルス対策</translation>
<translation id="6818920801736417483">パスワードを保存しますか?</translation>
<translation id="6820079682647046800">Kerberos 認証に失敗しました</translation>
-<translation id="6823174134746916417">タッチパッドのタップによるクリック</translation>
+<translation id="6823174134746916417">タッチパッドのタップしてクリック</translation>
<translation id="6824564591481349393">メール アドレスをコピー(&amp;E)</translation>
<translation id="6824584962142919697">要素の検証(&amp;I)</translation>
<translation id="6825184156888454064">名前順</translation>
@@ -6540,7 +6540,7 @@
<translation id="6902837902700739466">デバイスをドメインに追加しましょう</translation>
<translation id="6903022061658753260">このアカウントで同期をオンにしたすべての Chrome ブラウザでデータが同期されます。Chrome OS の同期オプションについては、<ph name="LINK_BEGIN" />Chrome OS の設定<ph name="LINK_END" />をご覧ください。</translation>
<translation id="6903590427234129279">すべて開く(<ph name="URL_COUNT" /> 件の URL)</translation>
-<translation id="6903907808598579934">同期を有効にする</translation>
+<translation id="6903907808598579934">同期を ON にする</translation>
<translation id="6904344821472985372">ファイル アクセス権を取り消す</translation>
<translation id="6904655473976120856">終了するには [アプリ] ボタンを押します</translation>
<translation id="6906095067383230422">{NUM_MINS,plural, =1{パスワードの安全性を維持するため、1 分間操作がないと、Google パスワード マネージャーにより操作がロックされます}other{パスワードの安全性を維持するため、{NUM_MINS} 分間操作がないと、Google パスワード マネージャーにより操作がロックされます}}</translation>
@@ -6609,7 +6609,7 @@
<translation id="6965978654500191972">デバイス</translation>
<translation id="6966370001499648704">セキュリティ キーとして使用するスマートフォンを管理します</translation>
<translation id="6967430741871315905">デバイスが許可されているかどうか確認できません</translation>
-<translation id="696780070563539690">サイトは、Cookie を使用して別のサイトでのあなたの閲覧アクティビティを確認できません(広告のカスタマイズなどが行えません)</translation>
+<translation id="696780070563539690">サイトは、Cookie を使用して別のサイトでのあなたの閲覧アクティビティを確認できません(広告のパーソナライズなどが行えません)</translation>
<translation id="6968288415730398122">画面ロックを設定するにはパスワードを入力します</translation>
<translation id="6969047215179982698">ニアバイシェアをオフにする</translation>
<translation id="6969216690072714773">このデバイスに関連付ける新しい情報を入力するか、既存の情報を更新します。</translation>
@@ -7078,7 +7078,7 @@
<translation id="7410344089573941623"><ph name="HOST" /> がカメラやマイクへのアクセスを要求しているか確認する</translation>
<translation id="7410852728357935715">デバイスにキャスト</translation>
<translation id="7411614333737930931">デバイスを再起動して、もう一度お試しください</translation>
-<translation id="741204030948306876">有効にする</translation>
+<translation id="741204030948306876">ON にする</translation>
<translation id="7412226954991670867">GPU メモリ</translation>
<translation id="7414464185801331860">18 倍</translation>
<translation id="7415454883318062233">設定完了</translation>
@@ -7297,7 +7297,7 @@
<translation id="7615807797520072741">クラシック Chrome にリセット</translation>
<translation id="7616214729753637086">デバイスを登録しています...</translation>
<translation id="7617263010641145920">Play ストアをオンにする</translation>
-<translation id="7617648809369507487">静かな方法で通知する</translation>
+<translation id="7617648809369507487">目立たない方法で通知する</translation>
<translation id="7621382409404463535">デバイスの設定を保存できませんでした。</translation>
<translation id="7621595347123595643">パスワードや PIN を忘れた場合、ローカルデータを復元できなくなります。</translation>
<translation id="7622114377921274169">充電しています。</translation>
@@ -8134,7 +8134,7 @@
<translation id="8342861492835240085">コレクションを選択</translation>
<translation id="8345848587667658367">スマートフォンの最近の写真、メディア、通知、アプリを表示できるようになりました</translation>
<translation id="8347227221149377169">印刷ジョブ</translation>
-<translation id="834785183489258869">シークレット モードのとき、サイトは Cookie を使用して別のサイトでのあなたの閲覧アクティビティを確認できず、広告のカスタマイズなどを行えなくなります。一部のサイトで機能を使用できなくなる可能性があります。</translation>
+<translation id="834785183489258869">シークレット モードのとき、サイトは Cookie を使用して別のサイトでのあなたの閲覧アクティビティを確認できず、広告のパーソナライズなどを行えなくなります。一部のサイトで機能を使用できなくなる可能性があります。</translation>
<translation id="8350789879725387295">Dock のタッチペン ツール</translation>
<translation id="8351316842353540018">ユーザー補助設定オプションを常に表示する</translation>
<translation id="8351419472474436977">この拡張機能によってプロキシ設定が制御されています。オンラインで行う操作は、この拡張機能によって変更、遮断、傍受される可能性があります。この変更が行われた理由に心当たりがない場合、これは不正な変更と考えられます。</translation>
@@ -8156,7 +8156,7 @@
<translation id="8366396658833131068">ネットワーク接続が復元されました。キオスク アプリを起動するには、別のネットワークを選択するか、下の [続行] ボタンを押してください。</translation>
<translation id="8366694425498033255">選択キー</translation>
<translation id="8368859634510605990">すべてのブックマークを開く(&amp;O)</translation>
-<translation id="8369028061188107403">表示中のサイトにより保存された <ph name="TOTAL_USAGE" /> のデータとインストールされたアプリが削除されます</translation>
+<translation id="8369028061188107403">表示されたサイトとインストールされたアプリによって保存された <ph name="TOTAL_USAGE" /> のデータが削除されます</translation>
<translation id="8370294614544004647">ノートパソコンを閉じたときにスリープ状態にする</translation>
<translation id="8371695176452482769">お話しください</translation>
<translation id="8371925839118813971">{NUM_TABS,plural, =1{サイトをミュート}other{サイトをミュート}}</translation>
@@ -9058,7 +9058,7 @@
<translation id="9180281769944411366">この処理には数分かかることがあります。Linux コンテナを起動します。</translation>
<translation id="9180380851667544951">サイトに画面の共有が許可されています</translation>
<translation id="9182556968660520230">サイトに保護されたコンテンツの再生を許可しない</translation>
-<translation id="9183331776983279456">Chrome では、4 週間以上経過したサイトは自動削除されます。サイトにもう一度アクセスすると、リストに再度表示される場合があります。広告の提案を行わないようサイトをブロックすることもできます。</translation>
+<translation id="9183331776983279456">Chrome では、4 週間以上経過したサイトは自動削除されます。サイトにもう一度アクセスすると、リストに再度表示される場合もあります。広告の提案を行わないようサイトをブロックすることもできます。</translation>
<translation id="918352324374649435">{COUNT,plural, =1{アプリ}other{# 件のアプリ}}</translation>
<translation id="9186963452600581158">お子様の Google アカウントでログインする</translation>
<translation id="9187967020623675250">キーが一致しません。<ph name="RESPONSE" />には、いずれかのキーを押してください。</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_ka.xtb b/chromium/chrome/app/resources/generated_resources_ka.xtb
index 8500aeb85f7..8620304fc12 100644
--- a/chromium/chrome/app/resources/generated_resources_ka.xtb
+++ b/chromium/chrome/app/resources/generated_resources_ka.xtb
@@ -602,7 +602,7 @@
<translation id="1535753739390684432">მოისმინეთ კონკრეტული ტექსტი ხმამაღლა. პირველ რიგში, აირჩიეთ წარმოსათქმელად მონიშვნის ხატულა ეკრანის ქვედა ნაწილში, შემდეგ კი გამოყავით ტექსტი.</translation>
<translation id="1536754031901697553">მიმდინარეობს კავშირის გაწყვეტა…</translation>
<translation id="1537254971476575106">სრულეკრანიანი ლუპა</translation>
-<translation id="15373452373711364">დიდი მაუსის კურსორი</translation>
+<translation id="15373452373711364">დიდი მაუსის ისარი</translation>
<translation id="1540605929960647700">დემო-რეჟიმის ჩართვა</translation>
<translation id="1541346352678737112">ქსელი ვერ მოიძებნა</translation>
<translation id="1542137295869176367">თქვენი სისტემაში შესვლის მონაცემების განახლება ვერ მოხერხდა</translation>
@@ -2277,7 +2277,7 @@
<translation id="2976557544729462544">ზოგიერთი მოწყობილობის სათანადო ან სრული წარმადობით მუშაობისთვის აუცილებელია მონაცემებზე წვდომის დაცვის გათიშვა.</translation>
<translation id="2977480621796371840">ჯგუფიდან ამოშლა</translation>
<translation id="2979639724566107830">ახალ ფანჯარაში გახსნა</translation>
-<translation id="2981113813906970160">აჩვენეთ მაუსის დიდი კურსორი</translation>
+<translation id="2981113813906970160">მაუსის დიდი ისრის ჩვენება</translation>
<translation id="2981293774053328982">ეს ფაილი შეიცავს მავნე პროგრამას, რომელსაც შეუძლია თქვენი პირადი ან სოციალური ქსელების ანგარიშების გატეხა</translation>
<translation id="2983102365694924129">ეფუძნება თქვენს აქტივობას საიტზე. ეს პარამეტრი გამორთულია.</translation>
<translation id="2983373101216420412">სათავსოს ბატარეის დონეა <ph name="PERCENTAGE" />%.</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_kk.xtb b/chromium/chrome/app/resources/generated_resources_kk.xtb
index 71eaccbd867..144c88f07ad 100644
--- a/chromium/chrome/app/resources/generated_resources_kk.xtb
+++ b/chromium/chrome/app/resources/generated_resources_kk.xtb
@@ -296,7 +296,7 @@
<translation id="1254593899333212300">Тікелей интернет қосылысы</translation>
<translation id="1257336506558170607">Таңдалған сертификатты экспорттау</translation>
<translation id="1258491128795710625">Жаңалықтар</translation>
-<translation id="1259152067760398571">Қауіпсіздік шарасы кеше қолданылды.</translation>
+<translation id="1259152067760398571">Қауіпсіздік тексерісі кеше қолданылды.</translation>
<translation id="1260451001046713751">Қалқымалы терезелердің шығуына және <ph name="HOST" /> хостынан бағыттауға әрқашан рұқсат беру</translation>
<translation id="1260810365552581339">Linux жүйесінде диск жады аз болуы мүмкін. Linux диск жадын көбейтіңіз де, оны <ph name="LINK_START" />параметрлерде<ph name="LINK_END" /> қайтадан қалпына келтіріп көріңіз.</translation>
<translation id="1261380933454402672">Баяу</translation>
@@ -804,7 +804,7 @@
<translation id="1703666494654169921">Сайттардың виртуалдық шындық құрылғыларын немесе деректерді пайдалануына рұқсат бермеу</translation>
<translation id="1704097193565924901">Бас әріпке өзгерту</translation>
<translation id="1704230497453185209">Сайттардың дыбысты шығаруына рұқсат бермеу</translation>
-<translation id="1704970325597567340">Қауіпсіздік шарасы <ph name="DATE" /> күні қолданылды.</translation>
+<translation id="1704970325597567340">Қауіпсіздік тексерісі <ph name="DATE" /> күні қолданылды.</translation>
<translation id="1706586824377653884">Әкімші енгізген</translation>
<translation id="170658918174941828">Chrome нұсқасы, операциялық жүйе нұсқасы, Cast параметрлері, экран көшірмесін көрсету статистикалары және байланыс арнасының диагностикалық журналдары жоғарыда қоса берілетін кез келген ақпаратпен бірге жіберіледі. Бұл пікір ақауларды тексеріп, функцияны жақсарту үшін пайдаланылады. Қандай да бір әдейі не байқаусызда жіберілген жеке ақпарат құпиялық саясаттарына сай қорғалады. Осы пікірді жібере отырып, Google-дың қандай да бір өнімін не қызметін жақсарту үшін берген пікіріңізді пайдалануына келісім бересіз.</translation>
<translation id="1708291623166985230">Хотспот өшірулі</translation>
@@ -1062,7 +1062,7 @@
<translation id="192494336144674234">Ашу әдісі</translation>
<translation id="1925017091976104802">Қою үшін <ph name="MODIFIER_KEY_DESCRIPTION" /> пернелерін басыңыз.</translation>
<translation id="1925021887439448749">Арнаулы веб-мекенжайды енгізу</translation>
-<translation id="1925124445985510535">Қауіпсіздік шарасы сағат <ph name="TIME" /> қолданылды.</translation>
+<translation id="1925124445985510535">Қауіпсіздік тексерісі сағат <ph name="TIME" /> қолданылды.</translation>
<translation id="192564025059434655">Chrome қолданбаларының ескі нұсқалары 2022 жылдың желтоқсанынан кейін Windows жүйесіндегі құрылғыларда ашылмайды. Жаңа нұсқаның бар-жоғын тексеруіңізге болады.</translation>
<translation id="1926339101652878330">Бұл параметрлер кәсіпорын саясаты бойынша бақыланады. Қосымша ақпарат алу үшін әкімшіңізге хабарласыңыз.</translation>
<translation id="1927632033341042996"><ph name="NEW_FINGER_NUMBER" />-саусақ</translation>
@@ -1178,7 +1178,7 @@
Құрылғыңызға Family Link қолданбасын орнату арқылы аккаунтыңыздың параметрлерін басқара аласыз. Нұсқауларды электрондық пошта арқылы жібереміз.</translation>
<translation id="2039464276165755892">Әлдебіреу экранға қарағанда хабарландыруды жасыру</translation>
<translation id="2040460856718599782">Сізді аутентификациялау кезінде бірдеңе дұрыс болмады. Есептік деректеріңізді қайта тексеріп, әрекетті қайталап көріңіз.</translation>
-<translation id="2040894699575719559">Орын бөгелген</translation>
+<translation id="2040894699575719559">Орын блокталған</translation>
<translation id="2042279886444479655">Белсенді профильдер</translation>
<translation id="2044014337866019681">Сеанстың құлпын ашу үшін <ph name="ACCOUNT" /> аккаунтының расталғанын тексеріңіз.</translation>
<translation id="204497730941176055">Microsoft Certificate Template Name</translation>
@@ -1193,7 +1193,7 @@
<translation id="2048554637254265991">Контейнер басқарушысын іске қосу қатесі. Қайталап көріңіз.</translation>
<translation id="2048653237708779538">Әрекет қолжетімді емес</translation>
<translation id="204914487372604757">Таңбаша жасау</translation>
-<translation id="2050339315714019657">Портреттік</translation>
+<translation id="2050339315714019657">Портрет</translation>
<translation id="2051555741181591333">Хотспотты автоматты түрде өшіру</translation>
<translation id="2052572566310583903">Басқа құрылғыларға орнатылған.</translation>
<translation id="2053105195397337973">Сайттарға жарнама спамдарының шығуын және алаяқтықты тоқтатуға мүмкіндік бере отырып, бақылауды шектеу жолдарын зерттеудеміз.</translation>
@@ -2565,7 +2565,7 @@
<translation id="3264582393905923483">Мәнмәтін</translation>
<translation id="3265459715026181080">Терезені жабу</translation>
<translation id="3266022278425892773">Linux әзірлеуші ортасы</translation>
-<translation id="3266274118485960573">Қауіпсіздік шарасы қосулы.</translation>
+<translation id="3266274118485960573">Қауіпсіздік тексерісі қосулы.</translation>
<translation id="3267726687589094446">Бірнеше файлды автоматты жүктеуге берілген рұқсат күшін сақтау</translation>
<translation id="3268451620468152448">Ашық қойындылар</translation>
<translation id="3269093882174072735">Кескінді жүктеу</translation>
@@ -2654,7 +2654,7 @@
<translation id="3342361181740736773">"<ph name="TRIGGERING_EXTENSION_NAME" />" бұл кеңейтімді жоймақ.</translation>
<translation id="3343046414300263892">Қаріп өлшемін ұлғайту</translation>
<translation id="3343977377045378693">Реттеліп жатыр</translation>
-<translation id="3345634917232014253">Қауіпсіздік шарасы жаңа ғана қолданылды.</translation>
+<translation id="3345634917232014253">Қауіпсіздік тексерісі жаңа ғана қолданылды.</translation>
<translation id="3345886924813989455">Қолдау көрсетілетін браузер табылмады</translation>
<translation id="3347086966102161372">Кескін мекенжайын к&amp;өшіру</translation>
<translation id="3348038390189153836">Алынбалы құрылғы анықталды</translation>
@@ -3488,7 +3488,7 @@
<translation id="4072701974556190758">Құпия сөз Google аккаунтында (<ph name="ACCOUNT" />) сақталады. Оны еске сақтаудың қажеті жоқ.</translation>
<translation id="407520071244661467">Масштаб</translation>
<translation id="407543464472585404"><ph name="NAME" /> профилі <ph name="EMAIL" /> поштасына байланыстырылған.</translation>
-<translation id="4077917118009885966">Осы сайтта бөгелген жарнамалар</translation>
+<translation id="4077917118009885966">Осы сайтта блокталған жарнамалар</translation>
<translation id="4077919383365622693"><ph name="SITE" /> арқылы сақталған барлық деректер мен cookie файлдары өшіріледі.</translation>
<translation id="4078738236287221428">Мәжбүрлі</translation>
<translation id="4079140982534148664">Жетілдірілген емле тексеру құралын пайдалану</translation>
@@ -3886,7 +3886,7 @@
<translation id="4450974146388585462">Диагностикалау</translation>
<translation id="445099924538929605"><ph name="DEVICE_OS" /> белсенді TPM-ді анықтады, ол деректеріңізді мейлінше қауіпсіз сақтайды.</translation>
<translation id="4451479197788154834">Құпия сөз осы құрылғыда және Google аккаунтыңызда сақталған.</translation>
-<translation id="4451757071857432900">Мазалайтын немесе жалған ақпаратты жарнамалар көрсететін сайттарда бөгелген (ұсынылады)</translation>
+<translation id="4451757071857432900">Мазалайтын немесе жалған ақпаратты жарнамалар көрсететін сайттарда блокталған (ұсынылады)</translation>
<translation id="4452898361839215358">немесе PPD файлын таңдаңыз. <ph name="LINK_BEGIN" />Толығырақ<ph name="LINK_END" /></translation>
<translation id="4453430595102511050">Пернетақтаның жоғарғы оң жақ бұрышындағы саусақ ізін оқу сканерін түртіңіз. Саусағыңыздың ізі туралы деректер қауіпсіз сақталған және <ph name="DEVICE_TYPE" /> құрылғысынан басқа ешқайда жіберілмейді.</translation>
<translation id="4453946976636652378"><ph name="SEARCH_ENGINE_NAME" /> браузерінен іздеңіз не URL мекенжайын енгізіңіз</translation>
@@ -4504,7 +4504,7 @@
<translation id="5026874946691314267">Бұны қайта көрсетпеу</translation>
<translation id="5027550639139316293">Электрондық пошта сертификаты</translation>
<translation id="5027562294707732951">Кеңейтім қосу</translation>
-<translation id="5028445315206872221">Бұл сайтта кеңейтімдер бөгелген</translation>
+<translation id="5028445315206872221">Бұл сайтта кеңейтімдер блокталған</translation>
<translation id="5029568752722684782">Көшірмені өшіру</translation>
<translation id="5029873138381728058">Виртуалдық машиналар тексерілмеді.</translation>
<translation id="503155457707535043">Қолданбалар жүктеп алынуда</translation>
@@ -5011,7 +5011,7 @@
<translation id="5499476581866658341">Енді телефондағы соңғы фотосуреттер мен медиафайлдарды көре аласыз</translation>
<translation id="549957179819296104">Жаңа белгіше</translation>
<translation id="5500168250243071806">Аккаунтқа кірген кезде, <ph name="BEGIN_LINK_SEARCH" />Іздеу тарихы<ph name="END_LINK_SEARCH" /> мен <ph name="BEGIN_LINK_GOOGLE" />әрекеттің басқа үлгілері<ph name="END_LINK_GOOGLE" /> Google аккаунтыңызға сақталуы мүмкін. Оларды кез келген уақытта жоя аласыз.</translation>
-<translation id="5500709606820808700">Қауіпсіздік шарасы бүгін қолданылды.</translation>
+<translation id="5500709606820808700">Қауіпсіздік тексерісі бүгін қолданылды.</translation>
<translation id="5501322521654567960">Сол жақ бүйірлік панель</translation>
<translation id="5501809658163361512">{COUNT,plural, =1{<ph name="DEVICE_NAME" /> құрылғысынан <ph name="ATTACHMENTS" /> алынбады.}other{<ph name="DEVICE_NAME" /> құрылғысынан <ph name="ATTACHMENTS" /> алынбады.}}</translation>
<translation id="5502500733115278303">Firefox браузерінен импортталған</translation>
@@ -5058,7 +5058,7 @@
<translation id="5546865291508181392">Табу</translation>
<translation id="5548075230008247516">Барлық таңдалған элементтер алынып тасталды, таңдау режимі өшірілді.</translation>
<translation id="5548159762883465903">{NUM_OTHER_TABS,plural, =0{"<ph name="TAB_TITLE" />"}=1{"<ph name="TAB_TITLE" />" және тағы 1 қойынды}other{"<ph name="TAB_TITLE" />" және тағы # қойынды}}</translation>
-<translation id="5548606607480005320">Қауіпсіздік шарасы</translation>
+<translation id="5548606607480005320">Қауіпсіздік тексерісі</translation>
<translation id="5548644592758170183">Сол жақта көрсету</translation>
<translation id="554903022911579950">Kerberos</translation>
<translation id="5551573675707792127">Пернетақта және мәтін енгізу</translation>
@@ -5244,7 +5244,7 @@
<translation id="5722086096420375088">Жасыл және ақ</translation>
<translation id="572328651809341494">Соңғы қойындылар</translation>
<translation id="5723508132121499792">Фонда орындалып жатқан қолданбалар жоқ</translation>
-<translation id="5723967018671998714">Үшінші тараптың cookie файлдары инкогнито режимінде бөгелген.</translation>
+<translation id="5723967018671998714">Үшінші тараптың cookie файлдары инкогнито режимінде блокталған.</translation>
<translation id="5724642200346111167">Барлық терезені жапқан кезде, сайт деректері құрылғыңыздан өшіріледі.</translation>
<translation id="5727728807527375859">Кеңейтімдер, қолданбалар және тақырыптар компьютеріңізді зақымдауы мүмкін. Жалғастыру қажет пе?</translation>
<translation id="5728450728039149624">Smart Lock экран құлпының опциялары</translation>
@@ -5823,7 +5823,7 @@
<translation id="6243774244933267674">Сервер қолжетімсіз</translation>
<translation id="6244245036423700521">ONC файлын импорттау</translation>
<translation id="6246790815526961700">Құрылғыдан жүктеп салу</translation>
-<translation id="6247557882553405851">Google Құпия сөз менеджері</translation>
+<translation id="6247557882553405851">Google Password Manager</translation>
<translation id="6247620186971210352">Ешқандай қолданбалар табылмады.</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
<translation id="6247802389331535091">Жүйе: <ph name="ARC_PROCESS_NAME" /></translation>
@@ -6113,7 +6113,7 @@
<translation id="6520876759015997832"><ph name="LIST_POSITION" />/<ph name="LIST_SIZE" /> іздеу нәтижесі: <ph name="SEARCH_RESULT_TEXT" />. Бөлімге өту үшін Enter пернесін басыңыз.</translation>
<translation id="6521214596282732365">Сайттар әдетте сіздің қаріптеріңізді пайдаланады, сондықтан дизайн мен графикаға арналған онлайн құралдардың көмегімен жоғары сапалы контент құруыңызға болады.</translation>
<translation id="6523303810310758032">Барлық немесе белгілі бір сайттағы браузерді қолдану тарихын жойған кезде, оған қатысты өлшем ақпараты да жойылады. <ph name="BEGIN_LINK" />Браузерді қолдану тарихын<ph name="END_LINK" /> қараңыз.</translation>
-<translation id="6523574494641144162">Google Құпия сөз менеджері бұл құпия сөздерді Google аккаунтыңызға сақтай алмады. Оларды осы құрылғыға сақтай аласыз.</translation>
+<translation id="6523574494641144162">Google Password Manager бұл құпия сөздерді Google аккаунтыңызға сақтай алмады. Оларды осы құрылғыға сақтай аласыз.</translation>
<translation id="6524735478670290456">Бұл дерек қалай пайдаланылады:</translation>
<translation id="652492607360843641"><ph name="NETWORK_TYPE" /> желісіне жалғандыңыз.</translation>
<translation id="6527303717912515753">Бөлісу</translation>
@@ -6187,7 +6187,7 @@
<translation id="6587958707401001932">Әдепкі параметрді таңдау</translation>
<translation id="6588043302623806746">Қауіпсіз DNS пайдалану</translation>
<translation id="6588047202935130957">Интернетті шолу кезінде табылған қызығушылықтар тізімі осы жерге шығуы мүмкін.</translation>
-<translation id="659005207229852190">Қауіпсіздік шарасы аяқталды.</translation>
+<translation id="659005207229852190">Қауіпсіздік тексерісі аяқталды.</translation>
<translation id="6590458744723262880">Қалтаның атауын өзгерту</translation>
<translation id="6592267180249644460">WebRTC журналы жазып алынды <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation>
<translation id="6592808042417736307">Саусақ ізіңіз түсірілді.</translation>
@@ -6196,9 +6196,9 @@
<translation id="6595187330192059106"><ph name="HOST" /> сайтының MIDI құрылғыларын толық басқаруына әрқашан тыйым салу</translation>
<translation id="6595408197871512625">{COUNT,plural, =1{Ұрланған құпия сөз өзгертілді.
-Тағы # құпия сөзіңіз ұрланған. Google Құпия сөз менеджері бұл құпия сөзді дереу тексеруді ұсынады.}other{Ұрланған құпия сөз өзгертілді.
+Тағы # құпия сөзіңіз ұрланған. Google Password Manager бұл құпия сөзді дереу тексеруді ұсынады.}other{Ұрланған құпия сөз өзгертілді.
-Тағы # құпия сөзіңіз ұрланған. Google Құпия сөз менеджері бұл құпия сөздерді дереу тексеруді ұсынады.}}</translation>
+Тағы # құпия сөзіңіз ұрланған. Google Password Manager бұл құпия сөздерді дереу тексеруді ұсынады.}}</translation>
<translation id="6596325263575161958">Шифрлау опциялары</translation>
<translation id="6596816719288285829">IP мекенжайы</translation>
<translation id="6597017209724497268">Үлгілер</translation>
@@ -6551,7 +6551,7 @@
<translation id="6903907808598579934">Синхрондауды қосу</translation>
<translation id="6904344821472985372">Файлға кіру құқығын қайтарып алу</translation>
<translation id="6904655473976120856">Шығу үшін "Қолданба" түймесін басыңыз</translation>
-<translation id="6906095067383230422">{NUM_MINS,plural, =1{Құпия сөздерді қорғау үшін Google Құпия сөз менеджері 1 минут әрекетсіздіктен кейін экранды құлыптайды.}other{Құпия сөздерді қорғау үшін Google Құпия сөз менеджері {NUM_MINS} минут әрекетсіздіктен кейін экранды құлыптайды.}}</translation>
+<translation id="6906095067383230422">{NUM_MINS,plural, =1{Құпия сөздерді қорғау үшін Google Password Manager 1 минут әрекетсіздіктен кейін экранды құлыптайды.}other{Құпия сөздерді қорғау үшін Google Password Manager {NUM_MINS} минут әрекетсіздіктен кейін экранды құлыптайды.}}</translation>
<translation id="6909422577741440844">Осы құрылғыдан алу керек пе?</translation>
<translation id="6910211073230771657">Жойылды</translation>
<translation id="691106080621596509"><ph name="SITE_GROUP_NAME" /> сайттар тобында, қатысты сайттарда және орнатылған қолданбаларда сақталған деректер мен cookie файлдарының барлығы өшіріледі.</translation>
@@ -6899,7 +6899,7 @@
<translation id="7235737137505019098">Басқа аккаунттар үшін қауіпсіздік кілтіндегі орын жеткіліксіз.</translation>
<translation id="7235873936132740888">Белгілі бір сілтемелерге (мысалы, электрондық пошта клиентінде жаңа хабар жасау немесе онлайн күнтізбеге жаңа іс-шаралар қосу) басқан кезде, сайттар арнайы тапсырмаларды орындайды.</translation>
<translation id="7238609589076576185">Диакритикалық таңба енгізілді.</translation>
-<translation id="7238665222668706269">Google Құпия сөз менеджері <ph name="SEPARATOR" /> <ph name="ACCOUNT" /></translation>
+<translation id="7238665222668706269">Google Password Manager <ph name="SEPARATOR" /> <ph name="ACCOUNT" /></translation>
<translation id="7239108166256782787"><ph name="DEVICE_NAME" /> құрылғысы аударуды тоқтатты</translation>
<translation id="7240339475467890413">Жаңа хотспотқа қосылу керек пе?</translation>
<translation id="7241389281993241388">Клиент сертификатын импорттау үшін <ph name="TOKEN_NAME" /> жүйсіне кіріңіз.</translation>
@@ -8505,7 +8505,7 @@
<translation id="8678582529642151449">қойындылар кішіреймейді</translation>
<translation id="8678933587484842200">Бұл қолданбаны қалай іске қосқыңыз келеді?</translation>
<translation id="8680251145628383637">Барлық құрылғыларыңызда бетбелгілерді, журналды, құпия сөздерді және басқа параметрлерді алу үшін жүйеге кіріңіз. Сонымен қатар Google қызметтеріне автоматты түрде кіресіз.</translation>
-<translation id="8681886425883659911">Мазалайтын немесе жалған ақпаратты жарнамаларды көрсететіні белгілі сайттарда жарнамалар бөгелген</translation>
+<translation id="8681886425883659911">Мазалайтын немесе жалған ақпаратты жарнамаларды көрсететіні белгілі сайттарда жарнамалар блокталған</translation>
<translation id="8682730193597992579"><ph name="PRINTER_NAME" /> жалғанды және дайын.</translation>
<translation id="8687103160920393343"><ph name="FILE_NAME" /> файлынан бас тарту</translation>
<translation id="8688672835843460752">Қолжетімді</translation>
@@ -9079,7 +9079,7 @@
<translation id="9200339982498053969"><ph name="ORIGIN" /> домені <ph name="FOLDERNAME" /> қалтасындағы файлдарды өзгерте алады.</translation>
<translation id="920045321358709304"><ph name="SEARCH_ENGINE" /> арқылы іздеу</translation>
<translation id="9201023452444595544">Барлық офлайн деректер өшіріледі.</translation>
-<translation id="9201117361710210082">Алдында көрілген.</translation>
+<translation id="9201117361710210082">Бұрын көрген</translation>
<translation id="9201220332032049474">Экран құлпы опциялары</translation>
<translation id="9201842707396338580">Бірдеңе дұрыс болмады. Құрылғының иесіне немесе әкімшісіне хабарласыңыз. Қате коды: <ph name="ERROR_CODE" />.</translation>
<translation id="9203398526606335860">&amp;Профильдеу қосылған</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_kn.xtb b/chromium/chrome/app/resources/generated_resources_kn.xtb
index a18c417f3a2..2e41ffd02c3 100644
--- a/chromium/chrome/app/resources/generated_resources_kn.xtb
+++ b/chromium/chrome/app/resources/generated_resources_kn.xtb
@@ -5,7 +5,7 @@
<translation id="1002085272681738789">ಟ್ಯಾಬ್ ಮತ್ತೆ ಸಕ್ರಿಯವಾಗಿದೆ</translation>
<translation id="1003088604756913841">ಹೊಸ <ph name="APP" /> ವಿಂಡೋದಲ್ಲಿ ಲಿಂಕ್ ತೆರೆಯಿರಿ</translation>
<translation id="100323615638474026">USB ಸಾಧನ (<ph name="VENDOR_ID" />:<ph name="PRODUCT_ID" />)</translation>
-<translation id="1004218526896219317">ಸೈಟ್ ಪ್ರವೇಶ</translation>
+<translation id="1004218526896219317">ಸೈಟ್ ಆ್ಯಕ್ಸೆಸ್</translation>
<translation id="1005274289863221750">ನಿಮ್ಮ ಮೈಕ್ರೊಫೋನ್ ಮತ್ತು ಕ್ಯಾಮರಾವನ್ನು ಬಳಸಿ</translation>
<translation id="1005333234656240382">ADB ಡೀಬಗ್ ಮಾಡುವಿಕೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಬೇಕೇ?</translation>
<translation id="1006873397406093306">ಈ ವಿಸ್ತರಣೆಯು ಸೈಟ್‌ಗಳಲ್ಲಿರುವ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಓದಬಹುದು ಮತ್ತು ಬದಲಿಸಬಹುದು. ವಿಸ್ತರಣೆಯು ಯಾವ ಸೈಟ್‌ಗಳನ್ನು ಪ್ರವೇಶಿಸಬಹುದು ಎಂಬುದನ್ನು ನೀವು ನಿಯಂತ್ರಿಸಬಹುದು.</translation>
@@ -158,7 +158,7 @@
<translation id="1136712381129578788">ತಪ್ಪಾದ ಪಿನ್ ಸಂಖ್ಯೆಯನ್ನು ಹಲವಾರು ಬಾರಿ ನಮೂದಿಸಿರುವ ಕಾರಣದಿಂದಾಗಿ, ಭದ್ರತೆ ಕೀ ಅನ್ನು ಲಾಕ್ ಮಾಡಲಾಗಿದೆ. ಅನ್‌ಲಾಕ್ ಮಾಡಲು, ಅದನ್ನು ತೆಗೆದು ಮರುಸೇರ್ಪಡಿಸಿ.</translation>
<translation id="1137589305610962734">ತಾತ್ಕಾಲಿಕ ಡೇಟಾ</translation>
<translation id="1137673463384776352">ಲಿಂಕ್‌ ಅನ್ನು <ph name="APP" /> ನಲ್ಲಿ ತೆರೆಯಿರಿ</translation>
-<translation id="1138686548582345331">{MUTED_NOTIFICATIONS_COUNT,plural, =1{ಹೊಸ ಅಧಿಸೂಚನೆ}one{# ಹೊಸ ಅಧಿಸೂಚನೆಗಳು}other{# ಹೊಸ ಅಧಿಸೂಚನೆಗಳು}}</translation>
+<translation id="1138686548582345331">{MUTED_NOTIFICATIONS_COUNT,plural, =1{ಹೊಸ ನೋಟಿಫಿಕೇಶನ್}one{# ಹೊಸ ನೋಟಿಫಿಕೇಶನ್‌ಗಳು}other{# ಹೊಸ ನೋಟಿಫಿಕೇಶನ್‌ಗಳು}}</translation>
<translation id="1139923033416533844">ಮೆಮೊರಿ ಬಳಕೆ</translation>
<translation id="1140351953533677694">ನಿಮ್ಮ ಬ್ಲೂಟೂತ್‌ ಮತ್ತು ಸರಣಿ ಸಾಧನಗಳನ್ನು ಪ್ರವೇಶಿಸಿ</translation>
<translation id="114036956334641753">ಆಡಿಯೋ ಮತ್ತು ಶೀರ್ಷಿಕೆಗಳು</translation>
@@ -235,7 +235,7 @@
<translation id="1197199342062592414">ಪ್ರಾರಂಭಿಸೋಣ</translation>
<translation id="11978075283960463">ಆ್ಯಪ್‌ನಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾದ ಡೇಟಾ: <ph name="APP_SIZE" /></translation>
<translation id="1197935538609051549">ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ</translation>
-<translation id="1198066799963193307">ಕಡಿಮೆ ವಿಷನ್ ಧ್ವನಿ ಪರಿಕರಗಳು</translation>
+<translation id="1198066799963193307">ದುರ್ಬಲ ದೃಷ್ಟಿ ಹೊಂದಿರುವವರಿಗಾಗಿ ಧ್ವನಿ ಟೂಲ್‌ಗಳು</translation>
<translation id="119944043368869598">ಎಲ್ಲವನ್ನೂ ತೆಗೆದುಹಾಕಿ</translation>
<translation id="1199814941632954229">ಈ ಪ್ರಮಾಣಪತ್ರ ಪ್ರೊಫೈಲ್‌ಗಳಿಗಾಗಿ ಪ್ರಮಾಣಪತ್ರಗಳನ್ನು ಒದಗಿಸಲಾಗುತ್ತಿದೆ</translation>
<translation id="120069043972472860">ವೀಕ್ಷಿಸಲಾಗದ</translation>
@@ -268,7 +268,7 @@
<translation id="1227660082540388410">ಪಾಸ್‌ಕೀಯನ್ನು ಎಡಿಟ್ ಮಾಡಿ</translation>
<translation id="1227993798763400520">ಬಿತ್ತರಿಸುವಿಕೆ ವಿಫಲವಾಗಿದೆ. ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation>
<translation id="1230417814058465809">ಪ್ರಮಾಣಿತ ಸುರಕ್ಷತೆ ಆನ್ ಆಗಿದೆ. ಇನ್ನೂ ಹೆಚ್ಚಿನ ಸುರಕ್ಷತೆಗಾಗಿ, ವರ್ಧಿತ ರಕ್ಷಣೆಯನ್ನು ಬಳಸಿ.</translation>
-<translation id="1231733316453485619">ಸಿಂಕ್ ಆನ್ ಮಾಡುವುದೇ?</translation>
+<translation id="1231733316453485619">ಸಿಂಕ್ ಆನ್ ಮಾಡಬೇಕೆ?</translation>
<translation id="1232569758102978740">ಶೀರ್ಷಿಕೆರಹಿತ</translation>
<translation id="1233497634904001272">ವಿನಂತಿಯನ್ನು ಪೂರ್ತಿಗೊಳಿಸಲು, ನಿಮ್ಮ ಭದ್ರತೆ ಕೀ ಅನ್ನು ಮತ್ತೊಮ್ಮೆ ಸ್ಪರ್ಶಿಸಿ.</translation>
<translation id="1233721473400465416">ಸ್ಥಳೀಯ ಭಾಷೆ</translation>
@@ -350,7 +350,7 @@
<translation id="1306606229401759371">ಸೆಟ್ಟಿಂಗ್‌‌ಗಳನ್ನು ಬದಲಾಯಿಸಿ</translation>
<translation id="1307165550267142340">ನಿಮ್ಮ ಪಿನ್ ರಚಿಸಲಾಗಿದೆ</translation>
<translation id="1307431692088049276">ಪುನಃ ನನ್ನನ್ನು ಕೇಳಬೇಡಿ</translation>
-<translation id="1307559529304613120">ಓಹ್! ಈ ಸಾಧನಕ್ಕಾಗಿ ಒಂದು ಸುದೀರ್ಘ API ಪ್ರವೇಶ ಟೋಕನ್ ಪಡೆದುಕೊಳ್ಳಲು ಸಿಸ್ಟಂ ವಿಫಲಗೊಂಡಿದೆ.</translation>
+<translation id="1307559529304613120">ಓಹ್! ಈ ಸಾಧನಕ್ಕಾಗಿ ಒಂದು ಸುದೀರ್ಘ API ಆ್ಯಕ್ಸೆಸ್ ಟೋಕನ್ ಪಡೆದುಕೊಳ್ಳಲು ಸಿಸ್ಟಂ ವಿಫಲಗೊಂಡಿದೆ.</translation>
<translation id="131112695174432497">ಜಾಹೀರಾತು ವೈಯಕ್ತೀಕರಣದ ಮೇಲೆ ಪರಿಣಾಮ ಬೀರುವ ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗಿದೆ</translation>
<translation id="1312811472299082263">Ansible ಪ್ಲೇಬುಕ್ ಅಥವಾ Crostini ಬ್ಯಾಕಪ್ ಫೈಲ್‌ನಿಂದ ರಚಿಸಿ</translation>
<translation id="1313264149528821971"><ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, <ph name="PERMISSION_3" /> ತೆಗೆದುಹಾಕಲಾಗಿದೆ</translation>
@@ -384,7 +384,7 @@
<translation id="1340527397989195812">ಫೈಲ್‌ಗಳ ಅಪ್ಲಿಕೇಶನ್ ಬಳಸಿಕೊಂಡು ಸಾಧನದಿಂದ ಮಾಧ್ಯಮವನ್ನು ಬ್ಯಾಕಪ್ ಮಾಡಿ.</translation>
<translation id="1341701348342335220">ಚೆನ್ನಾಗಿ ನಿರ್ವಹಿಸಿದ್ದೀರಿ!</translation>
<translation id="1341871421050612057"><ph name="USERNAME" /> ಅವರೊಂದಿಗೆ ಸಿಂಕ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ</translation>
-<translation id="1343865611738742294">USB ಸಾಧನಗಳಿಗೆ ಪ್ರವೇಶ ಪಡೆಯಲು Linux ಗೆ ಆ್ಯಪ್‌ಗಳ ಅನುಮತಿ ನೀಡಿ. USB ಸಾಧನವನ್ನು ತೆಗೆದುಹಾಕಿದ ಬಳಿಕ, Linux ಗೆ ಅದರ ಮಾಹಿತಿ ನೆನಪಿನಲ್ಲಿ ಇರುವುದಿಲ್ಲ.</translation>
+<translation id="1343865611738742294">USB ಸಾಧನಗಳಿಗೆ ಆ್ಯಕ್ಸೆಸ್ ಪಡೆಯಲು Linux ಗೆ ಆ್ಯಪ್‌ಗಳ ಅನುಮತಿ ನೀಡಿ. USB ಸಾಧನವನ್ನು ತೆಗೆದುಹಾಕಿದ ಬಳಿಕ, Linux ಗೆ ಅದರ ಮಾಹಿತಿ ನೆನಪಿನಲ್ಲಿ ಇರುವುದಿಲ್ಲ.</translation>
<translation id="1343920184519992513">ನೀವು ಎಲ್ಲಿ ನಿಲ್ಲಿಸಿರುವಿರೊ, ಅಲ್ಲಿಂದ ಮುಂದುವರಿಸಿ ಮತ್ತು ನಿರ್ದಿಷ್ಟ ಪುಟಗಳನ್ನು ತೆರೆಯಿರಿ</translation>
<translation id="134589511016534552">ಮೀಡಿಯಾ ಟ್ಯಾಬ್‌ಗಳನ್ನು ತೆರೆದಿರುವ ಟ್ಯಾಬ್‌ಗಳ ವಿಭಾಗದಲ್ಲಿ ಕೂಡ ತೋರಿಸಲಾಗುತ್ತದೆ</translation>
<translation id="1346630054604077329">ಖಚಿತಪಡಿಸಿ ಅಥವಾ ಮರುಪ್ರಾರಂಭಿಸಿ</translation>
@@ -487,7 +487,7 @@
<translation id="1427269577154060167">ದೇಶ</translation>
<translation id="142765311413773645"><ph name="APP_NAME" /> ಪರವಾನಗಿಯ ಅವಧಿ ಮುಗಿದಿದೆ</translation>
<translation id="1428373049397869723">ಫೈಂಡರ್ ಅಥವಾ ಇತರ ಆ್ಯಪ್‌ಗಳಲ್ಲಿರುವ ಈ ಆ್ಯಪ್ ಬಳಸಿಕೊಂಡು ನೀವು ಬೆಂಬಲಿತ ಫೈಲ್‌ಗಳನ್ನು ತೆರೆಯಬಹುದು ಮತ್ತು ಎಡಿಟ್ ಮಾಡಬಹುದು. ಈ ಆ್ಯಪ್ ಡೀಫಾಲ್ಟ್ ಆಗಿ ಯಾವ ಫೈಲ್‌ಗಳನ್ನು ತೆರೆಯಬೇಕು ಎಂಬುದನ್ನು ನಿಯಂತ್ರಿಸಲು, <ph name="BEGIN_LINK" />ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಡೀಫಾಲ್ಟ್ ಆ್ಯಪ್‌ಗಳನ್ನು ಸೆಟ್ ಮಾಡುವುದು ಹೇಗೆ ಎಂಬುದರ ಕುರಿತು ತಿಳಿಯಿರಿ<ph name="END_LINK" />.</translation>
-<translation id="1428770807407000502">ಸಿಂಕ್‌ ಆಫ್‌ ಮಾಡುವುದೇ?</translation>
+<translation id="1428770807407000502">ಸಿಂಕ್‌ ಆಫ್‌ ಮಾಡಬೇಕೆ?</translation>
<translation id="1429300045468813835">ಎಲ್ಲವನ್ನೂ ತೆರವುಗೊಳಿಸಲಾಗಿದೆ</translation>
<translation id="1430915738399379752">ಮುದ್ರಿಸು</translation>
<translation id="1431188203598586230">ಅಂತಿಮ ಸಾಫ್ಟ್‌ವೇರ್ ಅಪ್‌ಡೇಟ್</translation>
@@ -1184,7 +1184,7 @@
ಇಲ್ಲದಿದ್ದರೆ, ಈ ಖಾತೆಯಲ್ಲಿ ಮಾಡಿರುವ ಬದಲಾವಣೆಗಳು ಈ ಸಾಧನದಲ್ಲಿ ಕಾಣಿಸುವುದಕ್ಕಾಗಿ ಇದೀಗ ಸೈನ್ ಔಟ್ ಮಾಡಿ.
ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ Family Link ಆ್ಯಪ್ ಅನ್ನು ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡುವ ಮೂಲಕ ಈ ಖಾತೆಯ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ನೀವು ನಿರ್ವಹಿಸಬಹುದು. ನಾವು ನಿಮಗೆ ಇಮೇಲ್ ಮೂಲಕ ಸೂಚನೆಗಳನ್ನು ಕಳುಹಿಸಿದ್ದೇವೆ.</translation>
-<translation id="2039464276165755892">ಬೇರೊಬ್ಬರು ಪತ್ತೆಯಾದಾಗ ಅಧಿಸೂಚನೆ ವಿಷಯವನ್ನು ಮರೆಮಾಡಿ</translation>
+<translation id="2039464276165755892">ಬೇರೊಬ್ಬರು ಪತ್ತೆಯಾದಾಗ ನೋಟಿಫಿಕೇಶನ್ ವಿಷಯವನ್ನು ಮರೆಮಾಡಿ</translation>
<translation id="2040460856718599782">ಓಹ್! ನೀವು ದೃಢೀಕರಿಸುವ ಪ್ರಯತ್ನದಲ್ಲಿರುವಾಗ ಏನೋ ತಪ್ಪು ನಡೆದಿದೆ. ದಯವಿಟ್ಟು ನಿಮ್ಮ ಸೈನ್‌-ಇನ್‌ ರುಜುವಾತುಗಳನ್ನು ಎರಡು ಬಾರಿ ಪರಿಶೀಲಿಸಿ ಹಾಗೂ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</translation>
<translation id="2040894699575719559">ಸ್ಥಳವನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ</translation>
<translation id="2042279886444479655">ಸಕ್ರಿಯ ಪ್ರೊಫೈಲ್‌ಗಳು</translation>
@@ -1282,7 +1282,7 @@
<translation id="2112554630428445878">ಸುಸ್ವಾಗತ, <ph name="USERNAME" /></translation>
<translation id="21133533946938348">ಪಿನ್ ಟ್ಯಾಬ್</translation>
<translation id="2113479184312716848">&amp;ಫೈಲ್ ತೆರೆಯಿರಿ...</translation>
-<translation id="2113921862428609753">ಅಧಿಕಾರ ಮಾಹಿತಿ ಪ್ರವೇಶ</translation>
+<translation id="2113921862428609753">ಅಧಿಕಾರ ಮಾಹಿತಿ ಆ್ಯಕ್ಸೆಸ್</translation>
<translation id="2114326799768592691">ರೀಲೋಡ್ &amp;ಫ್ರೇಮ್</translation>
<translation id="2114413269775311385">Android ಆ್ಯಪ್‌ಗಳ ಮೂಲಕ ಈ ಖಾತೆಯನ್ನು ಬಳಸಿ. ನೀವು <ph name="LINK_BEGIN" />ಆ್ಯಪ್‌ಗಳ ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ<ph name="LINK_END" /> Android ಅಪ್ಲಿಕೇಶನ್‌ಗಳ ಅನುಮತಿಗಳನ್ನು ನಿಯಂತ್ರಿಸಬಹುದು.</translation>
<translation id="2114820389966440614">"ಇತ್ತೀಚಿನ ಹೈಲೈಟ್‌ಗಳು" ಮತ್ತು ಇತರ ಸವಿನೆನಪುಗಳನ್ನು ಇಲ್ಲಿ ನೋಡಿ</translation>
@@ -1543,7 +1543,7 @@
<translation id="2319459402137712349">ಕೀಬೋರ್ಡ್ ತೆರೆಯಲು ಪಠ್ಯ ಕ್ಷೇತ್ರವನ್ನು ಆಯ್ಕೆಮಾಡಿ. ನಿಮ್ಮ ಸ್ಕ್ರೀನ್‌ನ ಕೆಳಭಾಗದಲ್ಲಿರುವ ಕೀಬೋರ್ಡ್ ಐಕಾನ್ ಅನ್ನು ಸಹ ನೀವು ಆಯ್ಕೆ ಮಾಡಬಹುದು.</translation>
<translation id="2319993584768066746">ಸೈನ್-ಇನ್ ಸ್ಕ್ರೀನ್ ಫೋಟೋಗಳು</translation>
<translation id="2322193970951063277">ಶೀರ್ಷಿಕೆಗಳು ಮತ್ತು ಅಡಿಟಿಪ್ಪಣಿಗಳು</translation>
-<translation id="2322318151094136999">ಯಾವುದೇ ಸೈಟ್, ಸೀರಿಯಲ್ ಪೋರ್ಟ್‌ಗಳಿಗೆ ಪ್ರವೇಶ ಪಡೆಯಲು ವಿನಂತಿಸಿದಾಗ, ಕೇಳಿ (ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ)</translation>
+<translation id="2322318151094136999">ಯಾವುದೇ ಸೈಟ್, ಸೀರಿಯಲ್ ಪೋರ್ಟ್‌ಗಳಿಗೆ ಆ್ಯಕ್ಸೆಸ್ ಪಡೆಯಲು ವಿನಂತಿಸಿದಾಗ, ಕೇಳಿ (ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ)</translation>
<translation id="2322622365472107569">ಮುಕ್ತಾಯದ ಸಮಯ <ph name="TIME" /></translation>
<translation id="2323018538045954000">ವೈ-ಫೈ ನೆಟ್‌ವರ್ಕ್‌ಗಳನ್ನು ಉಳಿಸಲಾಗಿದೆ</translation>
<translation id="2325444234681128157">ಪಾಸ್‌ವರ್ಡ್‌ ನೆನಪಿಟ್ಟುಕೊಳ್ಳಿ</translation>
@@ -1671,7 +1671,7 @@
<translation id="2435457462613246316">ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ತೋರಿಸಿ</translation>
<translation id="2439626940657133600"><ph name="WINDOW_TITLE" /> ಅನ್ನು ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ</translation>
<translation id="2440604414813129000">ಮೂ&amp;ಲವನ್ನು ವೀಕ್ಷಿಸಿ</translation>
-<translation id="2440823041667407902">ಸ್ಥಳ ಪ್ರವೇಶ</translation>
+<translation id="2440823041667407902">ಸ್ಥಳದ ಆ್ಯಕ್ಸೆಸ್</translation>
<translation id="2441719842399509963">ಡೀಫಾಲ್ಟ್‌ಗೆ ಮರುಹೊಂದಿಸಿ</translation>
<translation id="244231003699905658">ಅಮಾನ್ಯ ವಿಳಾಸ. ವಿಳಾಸವನ್ನು ಪರಿಶೀಲಿಸಿ ಹಾಗೂ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation>
<translation id="2442916515643169563">ಪಠ್ಯದ ನೆರಳು</translation>
@@ -1683,7 +1683,7 @@
<translation id="2445726032315793326">ಭಾಗಶಃ ಮ್ಯಾಗ್ನಿಫೈರ್</translation>
<translation id="244641233057214044">ನಿಮ್ಮ ಹುಡುಕಾಟಕ್ಕೆ ಸಂಬಂಧಿಸಿದೆ</translation>
<translation id="2448312741937722512">ಪ್ರಕಾರ</translation>
-<translation id="2448810255793562605">ಸ್ವಯಂ ಸ್ಕ್ಯಾನ್‌ನ‌ ಪ್ರವೇಶ ಬದಲಾಯಿಸಿ</translation>
+<translation id="2448810255793562605">ಸ್ವಯಂ ಸ್ಕ್ಯಾನ್‌ನ‌ ಆ್ಯಕ್ಸೆಸ್ ಬದಲಾಯಿಸಿ</translation>
<translation id="2450223707519584812">Google API ಕೀಗಳು ಕಾಣೆಯಾಗಿರುವ ಕಾರಣ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಲು ನಿಮಗೆ ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. ವಿವರಗಳಿಗೆ <ph name="DETAILS_URL" /> ನೋಡಿ.</translation>
<translation id="2450849356604136918">ಸಕ್ರಿಯ ವೀಕ್ಷಣೆಗಳಿಲ್ಲ</translation>
<translation id="2451298179137331965">2x</translation>
@@ -1753,7 +1753,7 @@
<translation id="2501797496290880632">ಶಾರ್ಟ್‌‌ಕಟ್‌ ಅನ್ನು ಟೈಪ್ ಮಾಡಿ</translation>
<translation id="2501920221385095727">ಸ್ಟಿಕಿ ಕೀಗಳು</translation>
<translation id="2502441965851148920">ಸ್ವಯಂಚಾಲಿತ ಅಪ್‌ಡೇಟ್‌ಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ. ಹಸ್ತಚಾಲಿತ ಅಪ್‌ಡೇಟ್‌ಗಳನ್ನು ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದಾರೆ.</translation>
-<translation id="2502719318159902502">ಪೂರ್ಣ ಪ್ರವೇಶ</translation>
+<translation id="2502719318159902502">ಪೂರ್ಣ ಆ್ಯಕ್ಸೆಸ್</translation>
<translation id="2505324914378689427">{SCREEN_INDEX,plural, =1{ಸ್ಕ್ರೀನ್ #}one{ಸ್ಕ್ರೀನ್ #}other{ಸ್ಕ್ರೀನ್ #}}</translation>
<translation id="2505402373176859469"><ph name="TOTAL_SIZE" /> ರಲ್ಲಿ <ph name="RECEIVED_AMOUNT" /></translation>
<translation id="2505669838803949807">ನಿಮ್ಮ ಸಾಧನದ EID ಯು <ph name="EID_NUMBER" /> ಆಗಿದೆ. ಸೇವೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ನಿಮಗೆ ಸಹಾಯ ಮಾಡುವುದಕ್ಕಾಗಿ ಗ್ರಾಹಕ ಸೇವೆ ಪ್ರತಿನಿಧಿಯೊಬ್ಬರು ನಿಮ್ಮ EID ಸಂಖ್ಯೆಯನ್ನು ಬಳಸಬಹುದು.</translation>
@@ -1794,7 +1794,7 @@
<translation id="2538361623464451692">ಸಿಂಕ್ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ</translation>
<translation id="2540449034743108469">ವಿಸ್ತರಣೆ ಚಟುವಟಿಕೆಗಳನ್ನು ಆಲಿಸಲು "ಪ್ರಾರಂಭಿಸಿ" ಒತ್ತಿರಿ</translation>
<translation id="2540651571961486573">ಏನೋ ಸಮಸ್ಯೆ ಕಂಡುಬಂದಿದೆ. ದೋಷ ಕೋಡ್: <ph name="ERROR_CODE" />.</translation>
-<translation id="2541002089857695151">ಫುಲ್‌ಸ್ಕ್ರೀನ್ ಬಿತ್ತರಿಸುವಿಕೆಯನ್ನು ಆಪ್ಟಿಮೈಸ್ ಮಾಡುವುದೇ?</translation>
+<translation id="2541002089857695151">ಫುಲ್‌ಸ್ಕ್ರೀನ್ ಬಿತ್ತರಿಸುವಿಕೆಯನ್ನು ಆಪ್ಟಿಮೈಸ್ ಮಾಡಬೇಕೆ?</translation>
<translation id="2541423446708352368">ಎಲ್ಲ ಡೌನ್‌ಲೋಡ್‌ಗಳನ್ನು ತೋರಿಸು</translation>
<translation id="2541706104884128042">ಹೊಸ ಮಲಗುವ ಸಮಯವನ್ನು ಹೊಂದಿಸಲಾಗಿದೆ</translation>
<translation id="2542050502251273923">Ff_debug ಬಳಸಿ ನೆಟ್‌ವರ್ಕ್ ಕನೆಕ್ಷನ್ ನಿರ್ವಾಹಕ ಮತ್ತು ಇತರ ಸೇವೆಗಳ ಡೀಬಗ್ ಮಾಡುವಿಕೆ ಹಂತವನ್ನು ಹೊಂದಿಸುತ್ತದೆ.</translation>
@@ -1809,7 +1809,7 @@
<translation id="2550596535588364872"><ph name="FILE_NAME" /> ಅನ್ನು ತೆರೆಯಲು <ph name="EXTENSION_NAME" /> ಗೆ ಅನುಮತಿಸಬೇಕೆ?</translation>
<translation id="2552230905527343195">ಪ್ರಸ್ತುತ ಟ್ಯಾಬ್ ಸೇರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ</translation>
<translation id="2552966063069741410">ಸಮಯವಲಯ</translation>
-<translation id="2553290675914258594">ದೃಢೀಕರಿಸಿದ ಪ್ರವೇಶ</translation>
+<translation id="2553290675914258594">ದೃಢೀಕರಿಸಿದ ಆ್ಯಕ್ಸೆಸ್</translation>
<translation id="2553340429761841190"><ph name="NETWORK_ID" /> ಅನ್ನು ಸಂಪರ್ಕಿಸಲು <ph name="PRODUCT_NAME" /> ಗೆ ಸಾಧ್ಯವಿಲ್ಲ. ದಯವಿಟ್ಟು ಇನ್ನೊಂದು ನೆಟ್‌ವರ್ಕ್ ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ ಅಥವಾ ಮತ್ತೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ.</translation>
<translation id="2553440850688409052">ಈ ಪ್ಲಗ್‌ ಇನ್ ಅನ್ನು ಮರೆಮಾಡು</translation>
<translation id="2554553592469060349">ಆಯ್ಕೆ ಮಾಡಿರುವ ಫೈಲ್ ತುಂಬಾ ದೊಡ್ಡದಾಗಿದೆ (ಗರಿಷ್ಠ ಗಾತ್ರ: 3mb).</translation>
@@ -2282,7 +2282,7 @@
<translation id="2973537811036309675">ಪಾರ್ಶ್ವ ಫಲಕ</translation>
<translation id="2975628416524344939">HID ಸಾಧನಗಳನ್ನು ನಿರ್ವಹಿಸಿ</translation>
<translation id="2975761176769946178">URL ಅಗತ್ಯವಿದೆ</translation>
-<translation id="2976557544729462544">ಕೆಲವು ಸಾಧನಗಳು ಸರಿಯಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸಲು ಅಥವಾ ಸಂಪೂರ್ಣ ಕಾರ್ಯಕ್ಷಮತೆ ನೀಡಲು, ನೀವು ಡೇಟಾ ಪ್ರವೇಶ ರಕ್ಷಣೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಬೇಕಾಗಿದೆ.</translation>
+<translation id="2976557544729462544">ಕೆಲವು ಸಾಧನಗಳು ಸರಿಯಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸಲು ಅಥವಾ ಸಂಪೂರ್ಣ ಕಾರ್ಯಕ್ಷಮತೆ ನೀಡಲು, ನೀವು ಡೇಟಾ ಆ್ಯಕ್ಸೆಸ್ ರಕ್ಷಣೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಬೇಕಾಗಿದೆ.</translation>
<translation id="2977480621796371840">ಗುಂಪಿನಿಂದ ತೆಗೆದುಹಾಕಿ</translation>
<translation id="2979639724566107830">ಹೊಸ ವಿಂಡೋದಲ್ಲಿ ತೆರೆಯಿರಿ</translation>
<translation id="2981113813906970160">ದೊಡ್ಡ ಮೌಸ್ ಕರ್ಸರ್ ತೋರಿಸು</translation>
@@ -2786,7 +2786,7 @@
<translation id="3449839693241009168"><ph name="EXTENSION_NAME" /> ಗೆ ಆದೇಶಗಳನ್ನು ಕಳುಹಿಸಲು <ph name="SEARCH_KEY" /> ಒತ್ತಿರಿ</translation>
<translation id="3450157232394774192">ತಟಸ್ಥ ಸ್ಥಿತಿಯ ನೆಲೆಸುವಿಕೆ ಪ್ರತಿಶತ</translation>
<translation id="3450180775417907283"><ph name="MANAGER" />, ನೀವು ಇದೀಗ ವೈ-ಫೈಗೆ ಕನೆಕ್ಟ್ ಆಗುವ ಮೂಲಕ ಅಪ್‌ಡೇಟ್ ಅನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಿಕೊಳ್ಳಬೇಕೆಂದು ಬಯಸುತ್ತದೆ.</translation>
-<translation id="3452999110156026232">ಪೋಷಕ ಪ್ರವೇಶ</translation>
+<translation id="3452999110156026232">ಪೋಷಕ ಆ್ಯಕ್ಸೆಸ್</translation>
<translation id="3453612417627951340">ದೃಢೀಕರಣದ ಅಗತ್ಯವಿದೆ</translation>
<translation id="3454213325559396544">ಈ <ph name="DEVICE_TYPE" /> ಗಾಗಿ, ಇದು ಕೊನೆಯ ಸಾಫ್ಟ್‌ವೇರ್ ಹಾಗೂ ಸುರಕ್ಷತಾ ಅಪ್‌ಡೇಟ್ ಆಗಿದೆ. ಭವಿಷ್ಯದ ಅಪ್‌ಡೇಟ್‌ಗಳನ್ನು ಪಡೆಯಲು, ಹೊಸ ಮಾಡೆಲ್‌ಗೆ ಅಪ್‌ಗ್ರೇಡ್ ಮಾಡಿ.</translation>
<translation id="3455436146814891176">ಎನ್‌ಕ್ರಿಪ್ಶನ್ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ಸಿಂಕ್ ಮಾಡಿ</translation>
@@ -2999,7 +2999,7 @@
<translation id="3642699533549879077">ಬೇರೆ ಯಾರೋ ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ ಅನ್ನು ನೋಡಿದಾಗ, ನಿಮಗೆ ಅಲರ್ಟ್ ದೊರೆಯುತ್ತದೆ ಮತ್ತು ಅಧಿಸೂಚನೆಯ ವಿಷಯವನ್ನು ಮರೆಮಾಡಲಾಗುತ್ತದೆ.</translation>
<translation id="3643962751030964445">ಈ ಸಾಧನವನ್ನು <ph name="DEVICE_MANAGER" /> ಮೂಲಕ ನಿರ್ವಹಿಸಲಾಗುತ್ತಿದೆ. <ph name="DEVICE_MANAGER" /> ಪ್ರಕಾರ, <ph name="USER_EMAIL_ADDRESS" /> ಖಾತೆಗಾಗಿ ಹೊಸ ಪ್ರೊಫೈಲ್‌ನ ಅಗತ್ಯವಿದೆ</translation>
<translation id="3645372836428131288">ಫಿಂಗರ್‌‌ಪ್ರಿಂಟ್‌‌ನ ಬೇರೊಂದು ಭಾಗವನ್ನು ಸೆರೆಹಿಡಿಯಲು ಬೆರಳನ್ನು ನಿಧಾನವಾಗಿ ಸರಿಸಿ.</translation>
-<translation id="3647051300407077858">ಅಧಿಸೂಚನೆ ಅನುಮತಿಗಳನ್ನು ಪರಿಶೀಲಿಸಿ</translation>
+<translation id="3647051300407077858">ನೋಟಿಫಿಕೇಶನ್ ಅನುಮತಿಗಳನ್ನು ಪರಿಶೀಲಿಸಿ</translation>
<translation id="3647654707956482440">ಈ ಲಿಂಕ್ ಅನ್ನು ಬಳಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಪುನಃ ಪ್ರಯತ್ನಿಸಲು, ಟೈಪಿಂಗ್ ದೋಷವಿದೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸಿ ಅಥವಾ ಬೇರೊಂದು ಲಿಂಕ್ ಅನ್ನು ಬಳಸಿ.</translation>
<translation id="3647998456578545569">{COUNT,plural, =1{<ph name="ATTACHMENTS" /> ಗಳನ್ನು <ph name="DEVICE_NAME" /> ನಿಂದ ಸ್ವೀಕರಿಸಲಾಗಿದೆ}one{<ph name="ATTACHMENTS" /> ಗಳನ್ನು <ph name="DEVICE_NAME" /> ನಿಂದ ಸ್ವೀಕರಿಸಲಾಗಿದೆ}other{<ph name="ATTACHMENTS" /> ಗಳನ್ನು <ph name="DEVICE_NAME" /> ನಿಂದ ಸ್ವೀಕರಿಸಲಾಗಿದೆ}}</translation>
<translation id="3648348069317717750"><ph name="USB_DEVICE_NAME" /> ಪತ್ತೆ ಮಾಡಲಾಗಿದೆ</translation>
@@ -3015,7 +3015,7 @@
<translation id="3655712721956801464">{NUM_FILES,plural, =1{ಇದು ಒಂದು ಫೈಲ್‌ಗೆ ಶಾಶ್ವತ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿದೆ.}one{ಇದು # ಫೈಲ್‌ಗಳಿಗೆ ಶಾಶ್ವತ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿದೆ.}other{ಇದು # ಫೈಲ್‌ಗಳಿಗೆ ಶಾಶ್ವತ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿದೆ.}}</translation>
<translation id="3658871634334445293">TrackPoint ವೇಗವರ್ಧಕ</translation>
<translation id="3659550105763988702"><ph name="APP_NAME" /> ಆ್ಯಪ್‌ಗಾಗಿ ನಿಮ್ಮ ಪಾಸ್‌ಕೀ ಅನ್ನು ಬಳಸಿ</translation>
-<translation id="3659929705630080526">ನೀವು ಹಲವಾರು ಬಾರಿ ತಪ್ಪಾದ ಪ್ರವೇಶ ಕೋಡ್ ಅನ್ನು ನಮೂದಿಸಿದ್ದೀರಿ. ನಂತರ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ</translation>
+<translation id="3659929705630080526">ನೀವು ಹಲವಾರು ಬಾರಿ ತಪ್ಪಾದ ಆ್ಯಕ್ಸೆಸ್ ಕೋಡ್ ಅನ್ನು ನಮೂದಿಸಿದ್ದೀರಿ. ನಂತರ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ</translation>
<translation id="3660234220361471169">ವಿಶ್ವಾಸಾರ್ಹವಿಲ್ಲದ</translation>
<translation id="3664511988987167893">ವಿಸ್ತರಣೆ ಐಕಾನ್</translation>
<translation id="3665589677786828986">ನಿಮ್ಮ ಕೆಲವು ಸೆಟ್ಟಿಂಗ್‌ಗಳು ಬೇರೊಂದು ಪ್ರೋಗ್ರಾಂನಿಂದಾಗಿ ಹಾನಿಗೊಳಗಾಗಿರುವುದು Chrome ಗಮನಕ್ಕೆ ಬಂದಿದೆ ಮತ್ತು ಅವುಗಳ ಮೂಲ ಡೀಫಾಲ್ಟ್‌ಗಳಿಗೆ ಅವುಗಳನ್ನು ಮರುಹೊಂದಿಸಿದೆ.</translation>
@@ -3055,7 +3055,7 @@
<translation id="369522892592566391">{NUM_FILES,plural, =0{ಭದ್ರತೆ ಪರಿಶೀಲನೆಗಳನ್ನು ಮಾಡಲಾಗಿದೆ. ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಅಪ್‌ಲೋಡ್ ಮಾಡಲಾಗುತ್ತದೆ.}=1{ಭದ್ರತೆ ಪರಿಶೀಲನೆಗಳನ್ನು ಮಾಡಲಾಗಿದೆ. ನಿಮ್ಮ ಫೈಲ್ ಅನ್ನು ಅಪ್‌ಲೋಡ್ ಮಾಡಲಾಗುತ್ತದೆ.}one{ಭದ್ರತೆ ಪರಿಶೀಲನೆಗಳನ್ನು ಮಾಡಲಾಗಿದೆ. ನಿಮ್ಮ ಫೈಲ್‌ಗಳನ್ನು ಅಪ್‌ಲೋಡ್ ಮಾಡಲಾಗುತ್ತದೆ.}other{ಭದ್ರತೆ ಪರಿಶೀಲನೆಗಳನ್ನು ಮಾಡಲಾಗಿದೆ. ನಿಮ್ಮ ಫೈಲ್‌ಗಳನ್ನು ಅಪ್‌ಲೋಡ್ ಮಾಡಲಾಗುತ್ತದೆ.}}</translation>
<translation id="3698471669415859717">ಪರಿಶೀಲನೆ ಪೂರ್ಣಗೊಂಡಿದೆ</translation>
<translation id="3699624789011381381">ಇಮೇಲ್ ವಿಳಾಸ</translation>
-<translation id="3699920817649120894">ಸಿಂಕ್ ಮತ್ತು ವೈಯಕ್ತೀಕರಣವನ್ನು ಆಫ್ ಮಾಡುವುದೇ?</translation>
+<translation id="3699920817649120894">ಸಿಂಕ್ ಮತ್ತು ವೈಯಕ್ತೀಕರಣವನ್ನು ಆಫ್ ಮಾಡಬೇಕೆ?</translation>
<translation id="3700888195348409686">(<ph name="PAGE_ORIGIN" />) ಪ್ರದರ್ಶಿಸಲಾಗುತ್ತಿದೆ</translation>
<translation id="3700993174159313525">ನಿಮ್ಮ ಕ್ಯಾಮರಾದ ಸ್ಥಾನವನ್ನು ಟ್ರ್ಯಾಕ್ ಮಾಡಲು ಸೈಟ್‌ಗಳಿಗೆ ಅನುಮತಿಸಬೇಡಿ</translation>
<translation id="3702500414347826004">ನಿಮ್ಮ ಆರಂಭಿಕ ಪುಟಗಳನ್ನು <ph name="URL" /> ಗೆ ಸೇರಿಸಲು ಬದಲಾಯಿಸಲಾಗಿದೆ.</translation>
@@ -3157,7 +3157,7 @@
<translation id="3778740492972734840">&amp;ಡೆವೆಲಪರ್ ಟೂಲ್‌ಗಳು</translation>
<translation id="3778868487658107119">ಇದಕ್ಕೆ ಪ್ರಶ್ನೆಗಳನ್ನು ಕೇಳಿ. ಕೆಲಸಗಳನ್ನು ಮಾಡಲು ತಿಳಿಸಿ. ಇದು ನಿಮ್ಮ ಸ್ವಂತ Google, ಸಹಾಯಕ್ಕೆ ಯಾವಾಗಲೂ ಸಿದ್ಧವಾಗಿರುತ್ತದೆ.</translation>
<translation id="3780542776224651912">ಡೇಟಾ ಉಲ್ಲಂಘನೆಗಳಲ್ಲಿ ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್‌ಗಳು ಬಹಿರಂಗಗೊಂಡಿವೆಯೇ ಎಂಬುದನ್ನು ಪರಿಶೀಲಿಸಲು <ph name="BRAND" /> ಗೆ ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ. ನಂತರ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation>
-<translation id="3781742599892759500">Linux ಮೈಕ್ರೋಫೋನ್ ಪ್ರವೇಶ</translation>
+<translation id="3781742599892759500">Linux ಮೈಕ್ರೋಫೋನ್ ಆ್ಯಕ್ಸೆಸ್</translation>
<translation id="3783889407390048282">Android ಗೆ ಪ್ರವೇಶವನ್ನು ಕಳೆದುಕೊಳ್ಳುವುದನ್ನು ತಪ್ಪಿಸಲು ಸ್ಥಳಾವಕಾಶವನ್ನು ಮುಕ್ತಗೊಳಿಸಿ.</translation>
<translation id="3784472333786002075">ಕುಕೀಗಳು ಎಂದರೆ ವೆಬ್‌ಸೈಟ್‌ಗಳು ರಚಿಸಿದ ಫೈಲ್‌ಗಳು. ಎರಡು ರೀತಿಯ ಕುಕೀಗಳಿವೆ: ನೀವು ಭೇಟಿ ನೀಡುವ ಸೈಟ್‌ ಬಳಸಿಕೊಂಡು ಫರ್ಸ್ಟ್-ಪಾರ್ಟಿ ಕುಕೀಗಳನ್ನು ರಚಿಸಲಾಗಿದೆ. ವಿಳಾಸ ಪಟ್ಟಿಯಲ್ಲಿ ಸೈಟ್ ಅನ್ನು ತೋರಿಸಲಾಗಿದೆ. ಥರ್ಡ್-ಪಾರ್ಟಿ ಕುಕೀಗಳನ್ನು ಇತರ ಸೈಟ್‌ಗಳಿಂದ ರಚಿಸಲಾಗಿದೆ. ನೀವು ಭೇಟಿ ನೀಡುವ ವೆಬ್‌ಸೈಟ್‌ನಲ್ಲಿ ನೀವು ನೋಡುವ ಜಾಹೀರಾತುಗಳು ಅಥವಾ ಚಿತ್ರಗಳಂತಹ ಕೆಲವು ರೀತಿಯ ವಿಷಯವನ್ನು, ಈ ಸೈಟ್‌ಗಳು ಮಾಲೀಕತ್ವವನ್ನು ಹೊಂದಿವೆ.</translation>
<translation id="3785308913036335955">ಅಪ್ಲಿಕೇಶನ್‌ಗಳ ಶಾರ್ಟ್‌ಕಟ್ ತೋರಿಸು</translation>
@@ -3211,7 +3211,7 @@
<ph name="BEGIN_PARAGRAPH2" />ನಿಮ್ಮ Chrome ಸಾಧನದ ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ಯಾವಾಗ ಬೇಕಾದರೂ, ನೀವು ಈ ವರದಿಗಳನ್ನು ಅನುಮತಿಸಲು ಪ್ರಾರಂಭಿಸಬಹುದು ಅಥವಾ ನಿಲ್ಲಿಸಬಹುದು. ನೀವು ಡೊಮೇನ್ ನಿರ್ವಾಹಕರಾಗಿದ್ದರೆ, ನಿರ್ವಾಹಕರ ಕನ್ಸೋಲ್‌ನಲ್ಲಿ ನೀವು ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಬದಲಾಯಿಸಬಹುದು.<ph name="END_PARAGRAPH2" /></translation>
<translation id="3819164369574292143">ಪರದೆಯ ಮೇಲಿನ ಐಟಂಗಳನ್ನು ದೊಡ್ಡದಾಗಿ ಮಾಡಲು ಝೂಮ್‌ ಇನ್‌ ಮಾಡಿ. ಮ್ಯಾಗ್ನಿಫೈಯರ್ ಅನ್ನು ಆನ್ ಮತ್ತು ಆಫ್ ಮಾಡಲು ಹುಡುಕಾಟ + Ctrl + M ಬಳಸಿ. ಝೂಮ್ ಇನ್ ಮಾಡಿದಾಗ ಸುತ್ತಲು Ctrl + Alt + ಆ್ಯರೋ ಕೀಗಳನ್ನು ಬಳಸಿ.</translation>
<translation id="3819257035322786455">ಬ್ಯಾಕಪ್‌</translation>
-<translation id="3819261658055281761">ಈ ಸಾಧನಕ್ಕಾಗಿ ದೀರ್ಘ-ಕಾಲದ API ಪ್ರವೇಶ ಟೋಕನ್ ಅನ್ನು ಸಂಗ್ರಹಣೆ ಮಾಡಲು ಸಿಸ್ಟಂ ವಿಫಲವಾಗಿದೆ.</translation>
+<translation id="3819261658055281761">ಈ ಸಾಧನಕ್ಕಾಗಿ ದೀರ್ಘ-ಕಾಲದ API ಆ್ಯಕ್ಸೆಸ್ ಟೋಕನ್ ಅನ್ನು ಸಂಗ್ರಹಣೆ ಮಾಡಲು ಸಿಸ್ಟಂ ವಿಫಲವಾಗಿದೆ.</translation>
<translation id="3819800052061700452">&amp;ಪೂರ್ಣ-ಪರದೆ</translation>
<translation id="3820638253182943944">{MUTED_NOTIFICATIONS_COUNT,plural, =1{ತೋರಿಸಿ}one{ಎಲ್ಲವನ್ನೂ ತೋರಿಸಿ}other{ಎಲ್ಲವನ್ನೂ ತೋರಿಸಿ}}</translation>
<translation id="3820749202859700794">SECG ಎಲಿಪ್ಟಿಕ್ ಕರ್ವ್ secp521r1 (aka NIST P-521)</translation>
@@ -3526,8 +3526,8 @@
<translation id="4097406557126260163">ಆ್ಯಪ್‌ಗಳು ಮತ್ತು ಎಕ್ಸ್‌ಟೆನ್ಷನ್‌‌ಗಳು</translation>
<translation id="409742781329613461">Chrome ಗಾಗಿ ಸಲಹೆಗಳು</translation>
<translation id="4097560579602855702">Google ನಲ್ಲಿ ಹುಡುಕಿ</translation>
-<translation id="4098667039111970300">ಪರಿಕರಪಟ್ಟಿಯಲ್ಲಿನ ಸ್ಟೈಲಸ್ ಪರಿಕರಗಳು</translation>
-<translation id="4099060993766194518">ಡೀಫಾಲ್ಟ್ ಹುಡುಕಾಟ ಇಂಜಿನ್ ಅನ್ನು ಮರುಇನ್‌ಸ್ಟಾಲ್ ಮಾಡುವುದೇ?</translation>
+<translation id="4098667039111970300">ಟೂಲ್‌ಬಾರ್‌ನಲ್ಲಿನ ಸ್ಟೈಲಸ್ ಟೂಲ್‌ಗಳು</translation>
+<translation id="4099060993766194518">ಡೀಫಾಲ್ಟ್ ಹುಡುಕಾಟ ಇಂಜಿನ್ ಅನ್ನು ಮರುಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಬೇಕೆ?</translation>
<translation id="4099874310852108874">ನೆಟ್‍ವರ್ಕ್ ದೋಷ ಸಂಭವಿಸಿದೆ.</translation>
<translation id="4100733287846229632">ಸಾಧನ ಸ್ಥಳಾವಕಾಶ ತೀರಾ ಕಡಿಮೆ ಇದೆ</translation>
<translation id="4100853287411968461">ಹೊಸ ವೀಕ್ಷಣಾ ಅವಧಿಯ ಮಿತಿ</translation>
@@ -4287,7 +4287,7 @@
<translation id="4809447465126035330">ಅಳಿಸಿ</translation>
<translation id="480990236307250886">ಹೋಮ್ ತೆರೆಯಿರಿ</translation>
<translation id="4809927044794281115">ಲೈಟ್ ಥೀಮ್‌</translation>
-<translation id="4811212958317149293">ಕೀಬೋರ್ಡ್ ಸ್ವಯಂ-ಸ್ಕ್ಯಾನ್‌ನ ಪ್ರವೇಶ ಬದಲಾಯಿಸಿ</translation>
+<translation id="4811212958317149293">ಕೀಬೋರ್ಡ್ ಸ್ವಯಂ-ಸ್ಕ್ಯಾನ್‌ನ ಆ್ಯಕ್ಸೆಸ್ ಬದಲಾಯಿಸಿ</translation>
<translation id="4811503964269049987">ಆಯ್ಕೆಮಾಡಿದ ಟ್ಯಾಬ್ ಅನ್ನು ಸಮೂಹಗೊಳಿಸಿ</translation>
<translation id="4813512666221746211">ನೆಟ್‌ವರ್ಕ್ ದೋಷ</translation>
<translation id="4814378367953456825">ಈ ಫಿಂಗರ್‌ಪ್ರಿಂಟ್‌ಗಾಗಿ ಹೆಸರೊಂದನ್ನು ನಮೂದಿಸಿ</translation>
@@ -4430,7 +4430,7 @@
<translation id="4930714375720679147">ಆನ್ ಮಾಡಿ</translation>
<translation id="4932733599132424254">ದಿನಾಂಕ</translation>
<translation id="4933484234309072027"><ph name="URL" /> ನಲ್ಲಿ ಎಂಬೆಡ್ ಮಾಡಲಾಗಿದೆ</translation>
-<translation id="4936042273057045735">ಕೆಲಸದ ಪ್ರೊಫೈಲ್‌ನಲ್ಲಿ ಫೋನ್‌ಗಳು ಅಧಿಸೂಚನೆ ಸಿಂಕ್ ಮಾಡುವಿಕೆಯನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ</translation>
+<translation id="4936042273057045735">ಕೆಲಸದ ಪ್ರೊಫೈಲ್‌ನಲ್ಲಿ ಫೋನ್‌ಗಳು ನೋಟಿಫಿಕೇಶನ್ ಸಿಂಕ್ ಮಾಡುವಿಕೆಯನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ</translation>
<translation id="4937676329899947885">ವೈ-ಫೈ ನೆಟ್‌ವರ್ಕ್ ಅನ್ನು ಸ್ವೀಕರಿಸಲಾಗುತ್ತಿದೆ</translation>
<translation id="4938788218358929252">ಈ ರೆಸಿಪಿ ಪರಿಕಲ್ಪನೆಗಳು</translation>
<translation id="4939805055470675027"><ph name="CARRIER_NAME" /> ಗೆ ಸಂಪರ್ಕಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ</translation>
@@ -4475,7 +4475,7 @@
<translation id="4975543297921324897">ಮೊನೋಸ್ಪೇಸ್ ಫಾಂಟ್</translation>
<translation id="4975771730019223894">ಆ್ಯಪ್ ಬ್ಯಾಡ್ಜಿಂಗ್</translation>
<translation id="4977882548591990850"><ph name="CHARACTER_COUNT" />/<ph name="CHARACTER_LIMIT" /></translation>
-<translation id="4977942889532008999">ಪ್ರವೇಶ ದೃಢೀಕರಿಸಿ</translation>
+<translation id="4977942889532008999">ಆ್ಯಕ್ಸೆಸ್ ದೃಢೀಕರಿಸಿ</translation>
<translation id="4980805016576257426">ಈ ವಿಸ್ತರಣೆಯು ಮಾಲ್‌‌ವೇರ್ ಅನ್ನು ಹೊಂದಿದೆ.</translation>
<translation id="4981449534399733132">ಸಿಂಕ್ ಮಾಡಿರುವ ನಿಮ್ಮ ಎಲ್ಲಾ ಸಾಧನಗಳು ಮತ್ತು ನಿಮ್ಮ Google ಖಾತೆಯಿಂದ ಬ್ರೌಸಿಂಗ್ ಡೇಟಾವನ್ನು ತೆರವುಗೊಳಿಸಲು, <ph name="BEGIN_LINK" />ಸೈನ್ ಇನ್<ph name="END_LINK" /> ಮಾಡಿ.</translation>
<translation id="4986706507552097681">ಏನನ್ನು ಸಿಂಕ್ ಮಾಡಬೇಕು ಎಂಬುದನ್ನು ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ನೀವು ಯಾವಾಗ ಬೇಕಾದರೂ ಆಯ್ಕೆಮಾಡಬಹುದು. Google, ನಿಮ್ಮ ಇತಿಹಾಸವನ್ನು ಆಧರಿಸಿ Search ಮತ್ತು ಇತರ ಸೇವೆಗಳನ್ನು ವೈಯಕ್ತಿಕಗೊಳಿಸಬಹುದು.</translation>
@@ -4671,7 +4671,7 @@
<translation id="5173668317844998239">ನಿಮ್ಮ ಸುರಕ್ಷತಾ ಕೀಯಲ್ಲಿ ಉಳಿಸಿರುವ ಫಿಂಗರ್‌ಪ್ರಿಂಟ್‌‍ಗಳನ್ನು ಸೇರಿಸಿ ಮತ್ತು ಅಳಿಸಿ</translation>
<translation id="5174169235862638850">ಕ್ಲಿಪ್‌ಬೋರ್ಡ್‌ಗೆ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ನಕಲಿಸಲಾಗಿದೆ</translation>
<translation id="5175379009094579629">ಸಾಧನದ ಹೆಸರು ಅಮಾನ್ಯವಾಗಿದೆ. ಪುನಃ ಪ್ರಯತ್ನಿಸಲು ಮಾನ್ಯವಾದ ಹೆಸರನ್ನು ನಮೂದಿಸಿ.</translation>
-<translation id="5177479852722101802">ಕ್ಯಾಮರಾ ಹಾಗೂ ಮೈಕ್ರೋಫೋನ್ ಪ್ರವೇಶ ನಿರ್ಬಂಧಿಸುವುದನ್ನು ಮುಂದುವರಿಸಿ</translation>
+<translation id="5177479852722101802">ಕ್ಯಾಮರಾ ಹಾಗೂ ಮೈಕ್ರೋಫೋನ್ ಆ್ಯಕ್ಸೆಸ್ ನಿರ್ಬಂಧಿಸುವುದನ್ನು ಮುಂದುವರಿಸಿ</translation>
<translation id="5177549709747445269">ನೀವು ಮೊಬೈಲ್ ಡೇಟಾವನ್ನು ಬಳಸುತ್ತಿರುವಿರಿ</translation>
<translation id="5178667623289523808">ಹಿಂದೆ ಕಂಡುಹಿಡಿಯಿರಿ</translation>
<translation id="5181140330217080051">ಡೌನ್‌ಲೋಡ್ ಆಗುತ್ತಿದೆ</translation>
@@ -4728,7 +4728,7 @@
<translation id="5233638681132016545">ಹೊಸ ಟ್ಯಾಬ್</translation>
<translation id="5233736638227740678">&amp;ಅಂಟಿಸಿ</translation>
<translation id="5234764350956374838">ವಜಾಗೊಳಿಸಿ</translation>
-<translation id="5235050375939235066">ಆ್ಯಪ್ ಅನ್‌ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡುವುದೇ?</translation>
+<translation id="5235050375939235066">ಆ್ಯಪ್ ಅನ್‌ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಬೇಕೆ?</translation>
<translation id="523505283826916779">ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳು</translation>
<translation id="5235750401727657667">ಹೊಸ ಟ್ಯಾಬ್ ತೆರೆದಿರುವಾಗ ಬದಲಾಯಿಸಿದ ಪುಟವನ್ನು ನೀವು ನೋಡಿ</translation>
<translation id="5236374273162681467">ನಿಮ್ಮ ಎಲ್ಲಾ ಸಾಧನಗಳಲ್ಲಿ ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ಸುಲಭವಾಗಿ ಬಳಸಲು, ನೀವು ಅವುಗಳನ್ನು ನಿಮ್ಮ Google ಖಾತೆಗೆ ಸರಿಸಬಹುದು</translation>
@@ -4870,7 +4870,7 @@
<translation id="5360150013186312835">ಪರಿಕರಪಟ್ಟಿಯಲ್ಲಿ ತೋರಿಸು</translation>
<translation id="5362741141255528695">ಖಾಸಗಿ ಕೀಲಿ ಫೈಲ್ ಆಯ್ಕೆಮಾಡಿ.</translation>
<translation id="5363109466694494651">ಪವರ್‌ವಾಶ್ ಮತ್ತು ಹಿಂದಿರುಗಿಸು</translation>
-<translation id="5365881113273618889">ನೀವು ಆಯ್ಕೆ ಮಾಡಿದ ಫೋಲ್ಡ‌ರ್‌ನಲ್ಲಿ ಸೂಕ್ಷ್ಮವಾದ ಫೈಲ್‌ಗಳಿವೆ. ಈ ಫೋಲ್ಡರ್‌ನಲ್ಲಿ ಬರೆಯಲು "<ph name="APP_NAME" />" ಗೆ ಶಾಶ್ವತ ಪ್ರವೇಶ ಒದಗಿಸಲು ನೀವು ಖಂಡಿತವಾಗಿಯೂ ಬಯಸುತ್ತೀರಾ?</translation>
+<translation id="5365881113273618889">ನೀವು ಆಯ್ಕೆ ಮಾಡಿದ ಫೋಲ್ಡ‌ರ್‌ನಲ್ಲಿ ಸೂಕ್ಷ್ಮವಾದ ಫೈಲ್‌ಗಳಿವೆ. ಈ ಫೋಲ್ಡರ್‌ನಲ್ಲಿ ಬರೆಯಲು "<ph name="APP_NAME" />" ಗೆ ಶಾಶ್ವತ ಆ್ಯಕ್ಸೆಸ್ ಒದಗಿಸಲು ನೀವು ಖಂಡಿತವಾಗಿಯೂ ಬಯಸುತ್ತೀರಾ?</translation>
<translation id="536638840841140142">ಯಾವುದೂ ಅಲ್ಲ</translation>
<translation id="5368246151595623328"><ph name="DEVICE_NAME" /> ನಿಂದ '<ph name="NETWORK_NAME" />' ಅನ್ನು ಉಳಿಸಲಾಗಿದೆ</translation>
<translation id="5368720394188453070">ನಿಮ್ಮ ಫೋನ್ ಲಾಕ್ ಮಾಡಲಾಗಿದೆ. ಪ್ರವೇಶಿಸಲು ಅದನ್ನು ಅನ್‌ಲಾಕ್ ಮಾಡಿ.</translation>
@@ -4886,7 +4886,7 @@
<translation id="5376094717770783089">ಆ್ಯಕ್ಸೆಸ್ ವಿನಂತಿಸಲಾಗಿದೆ</translation>
<translation id="5376169624176189338">ಹಿಂದಕ್ಕೆ ಹೋಗಲು ಕ್ಲಿಕ್‌ ಮಾಡಿ, ಇತಿಹಾಸ ನೋಡಲು ಒತ್ತಿಹಿಡಿಯಿರಿ</translation>
<translation id="5376931455988532197">ಫೈಲ್ ತುಂಬಾ ದೊಡ್ಡದಾಗಿದೆ</translation>
-<translation id="5379140238605961210">ಮೈಕ್ರೋಫೋನ್ ಪ್ರವೇಶ ನಿರ್ಬಂಧವನ್ನು ಮುಂದುವರಿಸಿ</translation>
+<translation id="5379140238605961210">ಮೈಕ್ರೋಫೋನ್ ಆ್ಯಕ್ಸೆಸ್ ನಿರ್ಬಂಧವನ್ನು ಮುಂದುವರಿಸಿ</translation>
<translation id="5380424552031517043"><ph name="PERMISSION" /> ತೆಗೆದುಹಾಕಲಾಗಿದೆ</translation>
<translation id="5382591305415226340">ಬೆಂಬಲಿತ ಲಿಂಕ್‌ಗಳನ್ನು ನಿರ್ವಹಿಸಿ</translation>
<translation id="5383377866517186886">Mac ಸಿಸ್ಟಂ ಆದ್ಯತೆಗಳಲ್ಲಿ ಕ್ಯಾಮರಾವನ್ನು ಆಫ್ ಮಾಡಲಾಗಿದೆ</translation>
@@ -5311,7 +5311,7 @@
<translation id="5776571780337000608">ನಿಮ್ಮ ಫೈಲ್ ಬ್ರೌಸರ್ ಅಥವಾ ಇತರ ಆ್ಯಪ್‌ಗಳಲ್ಲಿರುವ ಈ ಆ್ಯಪ್ ಬಳಸಿಕೊಂಡು ನೀವು ಬೆಂಬಲಿತ ಫೈಲ್‌ಗಳನ್ನು ತೆರೆಯಬಹುದು ಮತ್ತು ಎಡಿಟ್ ಮಾಡಬಹುದು. ಈ ಆ್ಯಪ್ ಡೀಫಾಲ್ಟ್ ಆಗಿ ಯಾವ ಫೈಲ್‌ಗಳನ್ನು ತೆರೆಯಬೇಕು ಎಂಬುದನ್ನು ನಿಯಂತ್ರಿಸಲು, <ph name="BEGIN_LINK" />ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಡೀಫಾಲ್ಟ್ ಆ್ಯಪ್‌ಗಳನ್ನು ಸೆಟ್ ಮಾಡುವುದು ಹೇಗೆ ಎಂಬುದರ ಕುರಿತು ತಿಳಿಯಿರಿ<ph name="END_LINK" />.</translation>
<translation id="5777468213129569553">Chrome ತೆರೆಯಿರಿ</translation>
<translation id="5778491106820461378">ನೀವು ಸೈನ್ ಇನ್ ಮಾಡಿದ ಎಲ್ಲಾ Google ಖಾತೆಗಳನ್ನು <ph name="LINK_BEGIN" />ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಂದ<ph name="LINK_END" /> ನಿರ್ವಹಿಸಬಹುದು. ವೆಬ್‌ಸೈಟ್‌ಗಳು ಮತ್ತು ಆ್ಯಪ್‌ಗಳಿಗೆ ನೀವು ನೀಡಿದ ಅನುಮತಿಗಳು ಎಲ್ಲಾ ಖಾತೆಗಳಿಗೆ ಅನ್ವಯಿಸಬಹುದು. ಸೈಟ್‌ಗಳು ಅಥವಾ ಆ್ಯಪ್‌ಗಳು ನಿಮ್ಮ ಖಾತೆಯ ಮಾಹಿತಿಯನ್ನು ಪ್ರವೇಶಿಸಲು ನೀವು ಬಯಸದಿದ್ದಲ್ಲಿ, ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ನಲ್ಲಿ ನೀವು ಅತಿಥಿಯಾಗಿ ಸೈನ್ ಇನ್ ಮಾಡಬಹುದು.</translation>
-<translation id="5780011244986845107">ನೀವು ಆಯ್ಕೆ ಮಾಡಿದ ಫೋಲ್ಡರ್‌ನಲ್ಲಿ ಸೂಕ್ಷ್ಮವಾದ ಫೈಲ್‌ಗಳಿವೆ. ಈ ಫೋಲ್ಡರ್ ಅನ್ನು ಓದಲು "<ph name="APP_NAME" />" ಗೆ ಶಾಶ್ವತ ಪ್ರವೇಶ ಒದಗಿಸಲು ನೀವು ಖಂಡಿತವಾಗಿಯೂ ಬಯಸುತ್ತೀರಾ?</translation>
+<translation id="5780011244986845107">ನೀವು ಆಯ್ಕೆ ಮಾಡಿದ ಫೋಲ್ಡರ್‌ನಲ್ಲಿ ಸೂಕ್ಷ್ಮವಾದ ಫೈಲ್‌ಗಳಿವೆ. ಈ ಫೋಲ್ಡರ್ ಅನ್ನು ಓದಲು "<ph name="APP_NAME" />" ಗೆ ಶಾಶ್ವತ ಆ್ಯಕ್ಸೆಸ್ ಒದಗಿಸಲು ನೀವು ಖಂಡಿತವಾಗಿಯೂ ಬಯಸುತ್ತೀರಾ?</translation>
<translation id="5780973441651030252">ಪ್ರಕ್ರಿಯೆಯ ಆದ್ಯತೆ</translation>
<translation id="5781092003150880845"><ph name="ACCOUNT_FULL_NAME" /> ಎಂಬುದಾಗಿ ಸಿಂಕ್ ಮಾಡಿ</translation>
<translation id="5781865261247219930"><ph name="EXTENSION_NAME" /> ಗೆ ಆದೇಶಗಳನ್ನು ಕಳುಹಿಸಿ</translation>
@@ -5620,7 +5620,7 @@
<translation id="6049797270917061226">ಈ ಫೈಲ್ ನಿಮ್ಮ ವೈಯಕ್ತಿಕ ಮಾಹಿತಿಯನ್ನು ಕದಿಯಲು ದಾಳಿಕೋರರಿಗೆ ಅವಕಾಶ ನೀಡಬಹುದು.</translation>
<translation id="6051354611314852653">ಓಹ್! ಈ ಸಾಧನಕ್ಕಾಗಿ API ಪ್ರವೇಶವನ್ನು ದೃಢೀಕರಿಸುವಾಗ ಸಿಸ್ಟಂ ವಿಫಲಗೊಂಡಿದೆ.</translation>
<translation id="6051811090255711417">ನಿಮ್ಮ ಸಂಸ್ಥೆಯು ಈ ಫೈಲ್ ಅನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ, ಏಕೆಂದರೆ ಇದು ಭದ್ರತೆ ನೀತಿಯನ್ನು ಪೂರೈಸಲಿಲ್ಲ</translation>
-<translation id="6052488962264772833">ಬಿತ್ತರಿಸುವಿಕೆಯನ್ನು ಪ್ರಾರಂಭಿಸಲು ಪ್ರವೇಶ ಕೋಡ್ ಟೈಪ್ ಮಾಡಿ</translation>
+<translation id="6052488962264772833">ಬಿತ್ತರಿಸುವಿಕೆಯನ್ನು ಪ್ರಾರಂಭಿಸಲು ಆ್ಯಕ್ಸೆಸ್ ಕೋಡ್ ಟೈಪ್ ಮಾಡಿ</translation>
<translation id="6052976518993719690">SSL ಪ್ರಮಾಣಪತ್ರ ಅಧಿಕಾರ</translation>
<translation id="6053401458108962351">&amp;ಬ್ರೌಸಿಂಗ್ &amp;ಡೇಟಾವನ್ನು ತೆರವುಗೊಳಿಸಿ...</translation>
<translation id="6054284857788651331">ಇತ್ತೀಚೆಗೆ ಮುಚ್ಚಿದ ಟ್ಯಾಬ್ ಗುಂಪು</translation>
@@ -5634,7 +5634,7 @@
<translation id="6059276912018042191">ಇತ್ತೀಚಿನ Chrome ಟ್ಯಾಬ್‌ಗಳು</translation>
<translation id="6059652578941944813">ಪ್ರಮಾಣಪತ್ರ ಶ್ರೇಣಿ ವ್ಯವಸ್ಥೆ</translation>
<translation id="6059925163896151826">USB ಸಾಧನಗಳು</translation>
-<translation id="6061408389284235459"><ph name="DEVICE_NAME" /> ಸಾಧನಕ್ಕೆ ಅಧಿಸೂಚನೆ ಕಳುಹಿಸಲಾಗಿದೆ</translation>
+<translation id="6061408389284235459"><ph name="DEVICE_NAME" /> ಸಾಧನಕ್ಕೆ ನೋಟಿಫಿಕೇಶನ್ ಕಳುಹಿಸಲಾಗಿದೆ</translation>
<translation id="6063284707309177505">QR ಕೋಡ್ ರಚಿಸಿ</translation>
<translation id="6063847492705284550"><ph name="BEGIN_BOLD" />ಗಮನಿಸಿ<ph name="END_BOLD" />: ಇದೇ ರೀತಿಯ ಧ್ವನಿ ಅಥವಾ ರೆಕಾರ್ಡಿಂಗ್ <ph name="SUPERVISED_USER_NAME" /> ಅವರ ವೈಯಕ್ತಿಕ ಫಲಿತಾಂಶಗಳನ್ನು ಪ್ರವೇಶಿಸಲು ಸಾಧ್ಯವಾಗಬಹುದು. ಬ್ಯಾಟರಿಯನ್ನು ಉಳಿಸಲು, ಈ ಸಾಧನವನ್ನು ವಿದ್ಯುತ್ ಮೂಲಕ್ಕೆ ಕನೆಕ್ಟ್ ಮಾಡಿದಾಗ ಮಾತ್ರ ನೀವು "Ok Google" ಅನ್ನು ಪತ್ತೆಮಾಡಲು ನೀವು <ph name="SUPERVISED_USER_NAME" /> ಅವರ Assistant ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ಆಯ್ಕೆಮಾಡಬಹುದು.</translation>
<translation id="6064217302520318294">ಸ್ಕ್ರೀನ್ ಲಾಕ್</translation>
@@ -5649,7 +5649,7 @@
<translation id="6073451960410192870">ರೆಕಾರ್ಡಿಂಗ್ ನಿಲ್ಲಿಸಿ</translation>
<translation id="6073903501322152803">ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಫಿಚರ್‌ಗಳನ್ನು ಸೇರಿಸಿ</translation>
<translation id="6075075631258766703">ಫೋನ್‌ ಅನ್ನು ಪರಿಶೀಲಿಸಿ</translation>
-<translation id="6075731018162044558">ಓಹ್! ಈ ಸಾಧನಕ್ಕಾಗಿ ಒಂದು ಸುದೀರ್ಘ API ಪ್ರವೇಶ ಟೋಕನ್ ಪಡೆದುಕೊಳ್ಳಲು ಸಿಸ್ಟಂ ವಿಫಲವಾಗಿದೆ.</translation>
+<translation id="6075731018162044558">ಓಹ್! ಈ ಸಾಧನಕ್ಕಾಗಿ ಒಂದು ಸುದೀರ್ಘ API ಆ್ಯಕ್ಸೆಸ್ ಟೋಕನ್ ಪಡೆದುಕೊಳ್ಳಲು ಸಿಸ್ಟಂ ವಿಫಲವಾಗಿದೆ.</translation>
<translation id="6075907793831890935"><ph name="HOSTNAME" /> ಹೆಸರಿನ ಸಾಧನದೊಂದಿಗೆ ಡೇಟಾ ವಿನಿಮಯ ಮಾಡಿ</translation>
<translation id="6076175485108489240">ಸ್ಥಳವನ್ನು ಬಳಸಿ. ಸ್ಥಳ ಅನುಮತಿಯನ್ನು ಹೊಂದಿರುವ ಆ್ಯಪ್‌ಗಳು ಮತ್ತು ಸೇವೆಗಳಿಗೆ ನಿಮ್ಮ ಸಾಧನದ ಸ್ಥಳವನ್ನು ಬಳಸಲು ಅವಕಾಶ ನೀಡಿ. ಸ್ಥಳ ಡೇಟಾವನ್ನು Google ನಿಯತಕಾಲಿಕವಾಗಿ ಸಂಗ್ರಹಿಸಬಹುದು ಮತ್ತು ಸ್ಥಳ ನಿಖರತೆ ಮತ್ತು ಸ್ಥಳ ಆಧಾರಿತ ಸೇವೆಗಳನ್ನು ಸುಧಾರಿಸಲು ಅನಾಮಧೇಯ ರೀತಿಯಲ್ಲಿ ಈ ಡೇಟಾವನ್ನು ಬಳಸಬಹುದು. <ph name="BEGIN_LINK1" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK1" /></translation>
<translation id="6076491747490570887">ಹಿತವಾದ ಬೂದು</translation>
@@ -5711,7 +5711,7 @@
<translation id="6122093587541546701">ಇಮೇಲ್ (ಐಚ್ಛಿಕ):</translation>
<translation id="6122095009389448667">ಕ್ಲಿಪ್‌ಬೋರ್ಡ್ ಅನ್ನು ನೋಡದಂತೆ ಈ ಸೈಟ್ ಅನ್ನು ನಿರ್ಬಂಧಿಸುವುದನ್ನು ಮುಂದುವರಿಸಿ</translation>
<translation id="6122600716821516697">ಈ ಸಾಧನದ ಜೊತೆಗೆ ಹಂಚಿಕೊಳ್ಳಬೇಕೆ?</translation>
-<translation id="6122831415929794347">ಸುರಕ್ಷಿತ ಬ್ರೌಸಿಂಗ್ ಅನ್ನು ಆಫ್ ಮಾಡುವುದೇ?</translation>
+<translation id="6122831415929794347">ಸುರಕ್ಷಿತ ಬ್ರೌಸಿಂಗ್ ಅನ್ನು ಆಫ್ ಮಾಡಬೇಕೆ?</translation>
<translation id="6124213551517593835"><ph name="SITE_GROUP_NAME" /> ಹಾಗೂ ಇದಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಯಾವುದೇ ಸೈಟ್‌ಗಳ ಮೂಲಕ ಸಂಗ್ರಹಿಸಲಾದ ಎಲ್ಲಾ ಡೇಟಾ ಮತ್ತು ಕುಕೀಗಳನ್ನು ಇದು ತೆರವುಗೊಳಿಸುತ್ತದೆ</translation>
<translation id="6124650939968185064">ಕೆಳಗಿನ ಎಕ್ಸ್‌ಟೆನ್ಷನ್‌‌ಗಳು ಈ ಎಕ್ಸ್‌ಟೆನ್ಷನ್‌‌ನ ಮೇಲೆ ಅವಲಂಬಿತವಾಗಿವೆ:</translation>
<translation id="6124698108608891449">ಈ ಸೈಟ್‌ಗೆ ಇನ್ನಷ್ಟು ಅನುಮತಿಗಳ ಅಗತ್ಯವಿದೆ.</translation>
@@ -6084,7 +6084,7 @@
<translation id="6474884162850599008">Google ಡ್ರೈವ್ ಖಾತೆಗೆ ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಿ</translation>
<translation id="6475294023568239942">ಡಿಸ್ಕ್ ಸ್ಥಳಾವಕಾಶವನ್ನು ತೆರವುಗೊಳಿಸಿ ಅಥವಾ ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ Linux ಡಿಸ್ಕ್ ಅನ್ನು ಮರುಗಾತ್ರಗೊಳಿಸಿ</translation>
<translation id="6476482583633999078">ಧ್ವನಿಯ ವೇಗ</translation>
-<translation id="6477822444490674459">ಕೆಲಸದ ಪ್ರೊಫೈಲ್‌ನಲ್ಲಿ ಫೋನ್‌ಗಳು ಅಧಿಸೂಚನೆ ಸಿಂಕ್ ಮಾಡುವಿಕೆಯನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ. <ph name="LINK_BEGIN" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="LINK_END" /></translation>
+<translation id="6477822444490674459">ಕೆಲಸದ ಪ್ರೊಫೈಲ್‌ನಲ್ಲಿ ಫೋನ್‌ಗಳು ನೋಟಿಫಿಕೇಶನ್ ಸಿಂಕ್ ಮಾಡುವಿಕೆಯನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ. <ph name="LINK_BEGIN" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="LINK_END" /></translation>
<translation id="6478248366783946499">ಅಪಾಯಕಾರಿ ಫೈಲ್ ಇರಿಸುವುದೇ?</translation>
<translation id="6480327114083866287"><ph name="MANAGER" /> ಮೂಲಕ ನಿರ್ವಹಿಸಲಾಗಿದೆ</translation>
<translation id="6482559668224714696">ಪೂರ್ಣಪರದೆ ವರ್ಧಕ</translation>
@@ -6141,7 +6141,7 @@
<translation id="6532101170117367231">Google ಡ್ರೈವ್‌ನಲ್ಲಿ ಉಳಿಸಿ</translation>
<translation id="6532106788206463496">ಬದಲಾವಣೆಗಳನ್ನು ಉಳಿಸಿ</translation>
<translation id="6532206849875187177">ಭದ್ರತೆ ಮತ್ತು ಸೈನ್-ಇನ್</translation>
-<translation id="6532527800157340614">ನಿಮ್ಮ ಪ್ರವೇಶ ಟೋಕನ್ ಅನ್ನು ಹಿಂಪಡೆಯಲು ಸಾಧ್ಯವಾಗದ ಕಾರಣ ಸೈನ್-ಇನ್ ವಿಫಲವಾಗಿದೆ. ನಿಮ್ಮ ನೆಟ್‌ವರ್ಕ್ ಸಂಪರ್ಕವನ್ನು ಪರಿಶೀಲಿಸಿ ಹಾಗೂ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation>
+<translation id="6532527800157340614">ನಿಮ್ಮ ಆ್ಯಕ್ಸೆಸ್ ಟೋಕನ್ ಅನ್ನು ಹಿಂಪಡೆಯಲು ಸಾಧ್ಯವಾಗದ ಕಾರಣ ಸೈನ್-ಇನ್ ವಿಫಲವಾಗಿದೆ. ನಿಮ್ಮ ನೆಟ್‌ವರ್ಕ್ ಸಂಪರ್ಕವನ್ನು ಪರಿಶೀಲಿಸಿ ಹಾಗೂ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation>
<translation id="6532663472409656417">ಎಂಟರ್‌ಪ್ರೈಸ್ ನೋಂದಣಿಯಾಗಿದೆ</translation>
<translation id="6533315466883598769">Google Translate ಬಳಸಿ</translation>
<translation id="6535331821390304775">ಸಂಬಂಧಿತ ಆ್ಯಪ್‌ನಲ್ಲಿ ಈ ಪ್ರಕಾರದ ಲಿಂಕ್‌ಗಳನ್ನು ತೆರೆಯಲು <ph name="ORIGIN" /> ಅನ್ನು ಯಾವಾಗಲೂ ಅನುಮತಿಸಿ</translation>
@@ -6383,7 +6383,7 @@
<translation id="6748980958975836188"><ph name="BEGIN_LINK1" />Google ಸೇವಾ ನಿಯಮಗಳು<ph name="END_LINK1" />, <ph name="BEGIN_LINK2" />Chrome ಮತ್ತು Chrome OS ಹೆಚ್ಚುವರಿ ಸೇವಾ ನಿಯಮಗಳನ್ನು<ph name="END_LINK2" /> ನಾನು ಓದಿದ್ದೇನೆ ಮತ್ತು ಒಪ್ಪುತ್ತೇನೆ.</translation>
<translation id="6750757184909117990">ಸೆಲ್ಯುಲರ್ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ</translation>
<translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (ಅದೃಶ್ಯ)</translation>
-<translation id="6756157672127672536">ನೀವು Google Drive, ಬಾಹ್ಯ ಸಂಗ್ರಹಣೆ ಅಥವಾ ನಿಮ್ಮ ChromeOS ಸಾಧನದಲ್ಲಿ ಉಳಿಸಿರುವ ಫೈಲ್‌ಗಳಿಗೆ Files ಆ್ಯಪ್ ತ್ವರಿತ ಪ್ರವೇಶ ಒದಗಿಸುತ್ತದೆ.</translation>
+<translation id="6756157672127672536">ನೀವು Google Drive, ಬಾಹ್ಯ ಸಂಗ್ರಹಣೆ ಅಥವಾ ನಿಮ್ಮ ChromeOS ಸಾಧನದಲ್ಲಿ ಉಳಿಸಿರುವ ಫೈಲ್‌ಗಳಿಗೆ Files ಆ್ಯಪ್ ತ್ವರಿತ ಆ್ಯಕ್ಸೆಸ್ ಒದಗಿಸುತ್ತದೆ.</translation>
<translation id="6756643207511618722">ಧ್ವನಿ ಎಂಜಿನ್‌ಗಳು</translation>
<translation id="6757431299485455321">ಈ ಹಾಟ್‌ಸ್ಪಾಟ್ ಹುಡುಕಲು ಇತರ ಸಾಧನಗಳಿಗೆ ಸಹಾಯ ಮಾಡಿ.</translation>
<translation id="6758056191028427665">ನಮ್ಮ ಕೆಲಸದ ಕುರಿತು ನಿಮ್ಮ ಅಭಿಪ್ರಾಯವನ್ನು ತಿಳಿಸಿ.</translation>
@@ -6583,7 +6583,7 @@
<translation id="6918677045355889289">ChromeOS ಅಪ್‌ಡೇಟ್ ಅಗತ್ಯವಿದೆ</translation>
<translation id="6919354101107095996">ಸೈಟ್‌ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸಿ. ನಂತರ, ಪುನಃ ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ</translation>
<translation id="6919868320029503575">ದುರ್ಬಲ ಪಾಸ್‌ವರ್ಡ್‌ಗಳು</translation>
-<translation id="6919952941889172531">ಈ Chrome ಪ್ರೊಫೈಲ್‌ಗಾಗಿ ವರ್ಧಿತ ಸುರಕ್ಷಿತ ಬ್ರೌಸಿಂಗ್ ಅನ್ನು ಸಹ ಆನ್ ಮಾಡುವುದೇ?</translation>
+<translation id="6919952941889172531">ಈ Chrome ಪ್ರೊಫೈಲ್‌ಗಾಗಿ ವರ್ಧಿತ ಸುರಕ್ಷಿತ ಬ್ರೌಸಿಂಗ್ ಅನ್ನು ಸಹ ಆನ್ ಮಾಡಬೇಕೆ?</translation>
<translation id="6920989436227028121">ದಿನನಿತ್ಯದ ಟ್ಯಾಬ್ ಅಂತೆ ತೆರೆಯಿರಿ</translation>
<translation id="6921104647315081813">ಚಟುವಟಿಕೆಗಳನ್ನು ತೆರವುಗೊಳಿಸಿ</translation>
<translation id="692114467174262153"><ph name="ALTERNATIVE_BROWSER_NAME" /> ಅನ್ನು ತೆರೆಯಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ</translation>
@@ -6729,7 +6729,7 @@
<translation id="7034692021407794547">ಬಿಲ್ಲಿಂಗ್ ನಿರ್ವಹಣಾ ಸವಲತ್ತುಗಳನ್ನು ಹೊಂದಿರುವ ನಿರ್ವಾಹಕರು ಮೊದಲು ನಿರ್ವಹಣೆ ಕನ್ಸೋಲ್‌ನಲ್ಲಿರುವ Google Meet ಹಾರ್ಡ್‌ವೇರ್ ವಿಭಾಗದಲ್ಲಿನ Google Meet ಹಾರ್ಡ್‌ವೇರ್ ಸೇವಾ ನಿಯಮಗಳಿಗೆ ಸಮ್ಮತಿಸಬೇಕು.</translation>
<translation id="7036706669646341689">Linux ಗಾಗಿ <ph name="DISK_SIZE" /> ಸ್ಥಳಾವಕಾಶವನ್ನು ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ. ಮುಕ್ತ ಸ್ಥಳಾವಕಾಶವನ್ನು ಹೆಚ್ಚಿಸಲು, ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿರುವ ಫೈಲ್‌ಗಳನ್ನು ಅಳಿಸಿ.</translation>
<translation id="7037509989619051237">ಪೂರ್ವವೀಕ್ಷಣೆಗಾಗಿ ಪಠ್ಯಕ್ಕೆ ಹೋಗಿ</translation>
-<translation id="7038632520572155338">ಪ್ರವೇಶ ಬದಲಾಯಿಸಿ</translation>
+<translation id="7038632520572155338">ಆ್ಯಕ್ಸೆಸ್ ಬದಲಾಯಿಸಿ</translation>
<translation id="7038710352229712897"><ph name="USER_NAME" /> ಗಾಗಿ ಮತ್ತೊಂದು Google ಖಾತೆಯನ್ನು ಸೇರಿಸಿ</translation>
<translation id="7039326228527141150"><ph name="VENDOR_NAME" /> ರಿಂದ USB ಸಾಧನಗಳನ್ನು ಪ್ರವೇಶಿಸಿ</translation>
<translation id="7039912931802252762">Microsoft Smart Card Logon</translation>
@@ -6826,7 +6826,7 @@
<translation id="7131040479572660648">ನಿಮ್ಮ ಡೇಟಾವನ್ನು <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, ಮತ್ತು <ph name="WEBSITE_3" /> ನಲ್ಲಿ ಓದಿ</translation>
<translation id="713122686776214250">&amp;ಪುಟ ಸೇರಿಸು...</translation>
<translation id="7134098520442464001">ಪಠ್ಯವನ್ನು ಚಿಕ್ಕದಾಗಿಸಿ</translation>
-<translation id="7135729336746831607">ಬ್ಲೂಟೂತ್ ಆನ್ ಮಾಡುವುದೇ?</translation>
+<translation id="7135729336746831607">ಬ್ಲೂಟೂತ್ ಆನ್ ಮಾಡಬೇಕೆ?</translation>
<translation id="7136694880210472378">ಡಿಫಾಲ್ಟ್ ಮಾಡಿ</translation>
<translation id="7138678301420049075">ಇತರೆ</translation>
<translation id="7139627972753429585"><ph name="APP_NAME" /> ನಿಮ್ಮ ಮೈಕ್ರೊಫೋನ್ ಅನ್ನು ಬಳಸುತ್ತಿದೆ</translation>
@@ -6973,7 +6973,7 @@
<translation id="7283555985781738399">ಅತಿಥಿ ಮೋಡ್</translation>
<translation id="7284307451964417957">{DAYS,plural, =1{ಈ ಸಾಧನವನ್ನು 1 ದಿನಕ್ಕಾಗಿ ಉಳಿಸಲಾಗುತ್ತದೆ ಹಾಗೂ ಮುಂದಿನ ಬಾರಿ ನೀವು ಕೋಡ್ ಇಲ್ಲದೆಯೇ ಕನೆಕ್ಟ್ ಮಾಡಬಹುದು. ಇದನ್ನು ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಸೆಟ್ ಮಾಡಿದ್ದಾರೆ.}one{ಈ ಸಾಧನವನ್ನು {DAYS} ದಿನಗಳಿಗಾಗಿ ಉಳಿಸಲಾಗುತ್ತದೆ ಹಾಗೂ ಮುಂದಿನ ಬಾರಿ ನೀವು ಕೋಡ್ ಇಲ್ಲದೆಯೇ ಕನೆಕ್ಟ್ ಮಾಡಬಹುದು. ಇದನ್ನು ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಸೆಟ್ ಮಾಡಿದ್ದಾರೆ.}other{ಈ ಸಾಧನವನ್ನು {DAYS} ದಿನಗಳಿಗಾಗಿ ಉಳಿಸಲಾಗುತ್ತದೆ ಹಾಗೂ ಮುಂದಿನ ಬಾರಿ ನೀವು ಕೋಡ್ ಇಲ್ಲದೆಯೇ ಕನೆಕ್ಟ್ ಮಾಡಬಹುದು. ಇದನ್ನು ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಸೆಟ್ ಮಾಡಿದ್ದಾರೆ.}}</translation>
<translation id="7284411326658527427">ಪ್ರತಿಯೊಬ್ಬ ವ್ಯಕ್ತಿಯು ತಮ್ಮ ಖಾತೆಯನ್ನು ವೈಯಕ್ತಿಕಗೊಳಿಸಬಹುದು ಮತ್ತು ಡೇಟಾವನ್ನು ಖಾಸಗಿಯಾಗಿರಿಸಬಹುದು.</translation>
-<translation id="7287143125007575591">ಪ್ರವೇಶ ನೀರಾಕರಿಸಲಾಗಿದೆ.</translation>
+<translation id="7287143125007575591">ಆ್ಯಕ್ಸೆಸ್ ನೀರಾಕರಿಸಲಾಗಿದೆ.</translation>
<translation id="7287411021188441799">ಡೀಫಾಲ್ಟ್ ಹಿನ್ನೆಲೆ ಮರುಸ್ಥಾಪಿಸಿ</translation>
<translation id="7288676996127329262"><ph name="HORIZONTAL_DPI" />x<ph name="VERTICAL_DPI" /> dpi</translation>
<translation id="7289386924227731009"><ph name="WINDOW_TITLE" /> - ಅನುಮತಿಯನ್ನು ವಿನಂತಿಸಲಾಗಿದೆ, ಪ್ರತಿಕ್ರಿಯಿಸಲು F6 ಒತ್ತಿರಿ</translation>
@@ -7020,7 +7020,7 @@
<translation id="7340650977506865820">ನಿಮ್ಮ ಪರದೆಯನ್ನು ಸೈಟ್‌ ಹಂಚಿಕೊಳ್ಳುತ್ತಿದೆ</translation>
<translation id="7340757554212515731">ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಕ್ರ್ಯಾಶ್ ವರದಿಗಳು ಹಾಗೂ ಡಯಾಗ್ನೋಸ್ಟಿಕ್ಸ್ ಮತ್ತು ಬಳಕೆಯ ಡೇಟಾವನ್ನು Google ಗೆ ಕಳುಹಿಸುತ್ತದೆ</translation>
<translation id="734088800888587319">ನೆಟ್‌ವರ್ಕ್ ಮೆಟ್ರಿಕ್‌ಗಳು</translation>
-<translation id="7341834142292923918">ಈ ಸೈಟ್‌ಗೆ ಪ್ರವೇಶ ಕೋರುತ್ತಿದೆ</translation>
+<translation id="7341834142292923918">ಈ ಸೈಟ್‌ಗೆ ಆ್ಯಕ್ಸೆಸ್ ಕೋರುತ್ತಿದೆ</translation>
<translation id="7343372807593926528">ಪ್ರತಿಕ್ರಿಯೆ ಕಳುಹಿಸುವ ಮೊದಲು ಸಮಸ್ಯೆಯನ್ನು ವಿವರಿಸಿ.</translation>
<translation id="7344585835349671209">ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ HTTPS/SSL ಪ್ರಮಾಣೀಕರಣಗಳನ್ನು ನಿರ್ವಹಿಸಿ</translation>
<translation id="7345706641791090287">ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್ ಖಚಿತಪಡಿಸಿ</translation>
@@ -7062,7 +7062,7 @@
<translation id="7376124766545122644">ಈ ಲಿಂಕ್ ಅನ್ನು ಬಳಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಪುನಃ ಪ್ರಯತ್ನಿಸಲು, ನಿಮ್ಮ ಲಿಂಕ್ 'http://' ಅಥವಾ 'https://' ನಿಂದ ಪ್ರಾರಂಭವಾಗುತ್ತದೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸಿ.</translation>
<translation id="7376553024552204454">ಮೌಸ್ ಕರ್ಸರ್ ಅನ್ನು ಸರಿಸುವಾಗ ಹೈಲೈಟ್ ಮಾಡಿ</translation>
<translation id="737728204345822099">ನೀವು ಈ ಸೈಟ್‌ಗೆ ಭೇಟಿ ನೀಡಿರುವ ಕುರಿತಾದ ದಾಖಲೆಗಳನ್ನು ನಿಮ್ಮ ಭದ್ರತೆ ಕೀಯಲ್ಲಿ ಉಳಿಸಲಾಗಿರುತ್ತದೆ.</translation>
-<translation id="7377451353532943397">ಸೆನ್ಸರ್‌ ಪ್ರವೇಶ ನಿರ್ಬಂಧಿಸುವುದನ್ನು ಮುಂದುವರಿಸಿ</translation>
+<translation id="7377451353532943397">ಸೆನ್ಸರ್‌ ಆ್ಯಕ್ಸೆಸ್ ನಿರ್ಬಂಧಿಸುವುದನ್ನು ಮುಂದುವರಿಸಿ</translation>
<translation id="7377481913241237033">ಕೋಡ್ ಮೂಲಕ ಕನೆಕ್ಟ್ ಮಾಡಿ</translation>
<translation id="7378611153938412599">ದುರ್ಬಲ ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ಸುಲಭವಾಗಿ ಊಹಿಸಬಹುದು. ನೀವು ಸದೃಢ ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ರಚಿಸುತ್ತಿದ್ದೀರಿ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ. <ph name="BEGIN_LINK" />ಇನ್ನಷ್ಟು ಭದ್ರತಾ ಸಲಹೆಗಳನ್ನು ನೋಡಿ.<ph name="END_LINK" /></translation>
<translation id="73786666777299047">Chrome ವೆಬ್‌ ಸ್ಟೋರ್ ತೆರೆಯಿರಿ</translation>
@@ -7143,7 +7143,7 @@
<translation id="7441830548568730290">ಇತರ ಬಳಕೆದಾರರು</translation>
<translation id="744341768939279100">ಹೊಸ ಪ್ರೊಫೈಲ್ ರಚಿಸಿ</translation>
<translation id="744366959743242014">ಡೇಟಾ ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ, ಇದು ಕೆಲವು ಸೆಕೆಂಡ್‌ಗಳ ಕಾಲಾವಕಾಶವನ್ನು ತೆಗೆದುಕೊಳ್ಳಬಹುದು.</translation>
-<translation id="7443806024147773267">ನಿಮ್ಮ Google ಖಾತೆಗೆ ನೀವು ಸೈನ್ ಇನ್ ಮಾಡಿದಾಗಲೆಲ್ಲಾ ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್‌ಗಳಿಗೆ ಪ್ರವೇಶ ಪಡೆಯಿರಿ</translation>
+<translation id="7443806024147773267">ನಿಮ್ಮ Google ಖಾತೆಗೆ ನೀವು ಸೈನ್ ಇನ್ ಮಾಡಿದಾಗಲೆಲ್ಲಾ ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್‌ಗಳಿಗೆ ಆ್ಯಕ್ಸೆಸ್ ಪಡೆಯಿರಿ</translation>
<translation id="7444970023873202833">Google Photos ನಲ್ಲಿ ನಿಮ್ಮ ಇನ್ನಷ್ಟು ಸವಿನೆನಪುಗಳನ್ನು ಎಕ್ಸ್‌ಪ್ಲೋರ್ ಮಾಡಿ</translation>
<translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ</translation>
<translation id="7448430327655618736">ಆ್ಯಪ್‌ಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಿ</translation>
@@ -7413,7 +7413,7 @@
<translation id="7681095912841365527">ಸೈಟ್‌ ಬ್ಲೂಟೂತ್ ಅನ್ನು ಬಳಸಬಹುದು</translation>
<translation id="7681597159868843240">ಸೈಟ್‌ಗಳು ಸಾಮಾನ್ಯವಾಗಿ, ವರ್ಚುವಲ್ ರಿಯಾಲಿಟಿ ಅಥವಾ ಫಿಟ್‌ನೆಸ್ ಟ್ರ್ಯಾಕಿಂಗ್ ಫೀಚರ್‌ಗಳಿಗಾಗಿ ನಿಮ್ಮ ಸಾಧನದ ಮೋಷನ್ ಸೆನ್ಸರ್‌ಗಳನ್ನು ಬಳಸುತ್ತವೆ</translation>
<translation id="7683373461016844951">ಮುಂದುವರಿಸಲು, ಸರಿ ಎಂಬುದನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿ. ಆಮೇಲೆ, ನಿಮ್ಮ <ph name="DOMAIN" /> ಇಮೇಲ್ ವಿಳಾಸಕ್ಕಾಗಿ ಹೊಸ ಪ್ರೊಫೈಲ್ ಅನ್ನು ರಚಿಸಲು, ವ್ಯಕ್ತಿಯನ್ನು ಸೇರಿಸಿ ಎಂಬುದನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿ.</translation>
-<translation id="7683834360226457448">ಕಡಿಮೆ ವಿಷನ್ ಹೊಂದಿರುವ ಡಿಸ್‌ಪ್ಲೇ ಪರಿಕರಗಳು</translation>
+<translation id="7683834360226457448">ದುರ್ಬಲ ದೃಷ್ಟಿ ಹೊಂದಿರುವವರಿಗಾಗಿ ಡಿಸ್‌ಪ್ಲೇ ಟೂಲ್‌ಗಳು</translation>
<translation id="7684212569183643648">ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಸ್ಥಾಪಿಸಿದ್ದಾರೆ</translation>
<translation id="7684559058815332124">ಕ್ಯಾಪ್ಟಿವ್ ಪೋರ್ಟಲ್ ಲಾಗಿನ್ ಪುಟಕ್ಕೆ ಭೇಟಿ ನೀಡಿ</translation>
<translation id="7684718995427157417">ನಿಮ್ಮ ಆ್ಯಪ್‌ಗಳನ್ನು ರಚಿಸಲು ಮತ್ತು ಪರೀಕ್ಷಿಸಲು, Android ಡೀಬಗ್ ಬ್ರಿಡ್ಜ್ (ADB) ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ. ಇದು Google ನಿಂದ ದೃಢೀಕರಿಸದ Android ಆ್ಯಪ್‌ಗಳನ್ನು ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಲು ಅನುಮತಿಸುತ್ತದೆ ಎಂಬುದನ್ನು ಗಮನಿಸಿ ಹಾಗೂ ಇದನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ಫ್ಯಾಕ್ಟರಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಗೆ ಮರುಹೊಂದಿಸುವ ಅಗತ್ಯವಿದೆ.</translation>
@@ -7458,7 +7458,7 @@
<translation id="7717014941119698257">ಡೌನ್‌ಲೋಡ್ ಆಗುತ್ತಿರುವ: <ph name="STATUS" /></translation>
<translation id="771721654176725387">ಇದರಿಂದಾಗಿ ಈ ಸಾಧನದಲ್ಲಿರುವ ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಡೇಟಾ ಶಾಶ್ವತವಾಗಿ ಅಳಿಸಿ ಹೋಗುತ್ತದೆ. ಡೇಟಾ ಮರಳಿ ಪಡೆದುಕೊಳ್ಳಲು, ಹೀಗೆ ಸಿಂಕ್ ಮಾಡಿ ಅನ್ನು ಆನ್ ಮಾಡಿ</translation>
<translation id="7717845620320228976">ಅಪ್‌ಡೇಟ್‌ಗಳನ್ನು ಪರಿಶೀಲಿಸು</translation>
-<translation id="7718490543420739837">ಆನ್-ಸ್ಕ್ರೀನ್ ಕೀಬೋರ್ಡ್, ಡಿಕ್ಟೇಶನ್, ಪ್ರವೇಶ ಬದಲಾಯಿಸಿ ಮತ್ತು ಇನ್ನಷ್ಟು</translation>
+<translation id="7718490543420739837">ಆನ್-ಸ್ಕ್ರೀನ್ ಕೀಬೋರ್ಡ್, ಡಿಕ್ಟೇಶನ್, ಆ್ಯಕ್ಸೆಸ್ ಬದಲಾಯಿಸಿ ಮತ್ತು ಇನ್ನಷ್ಟು</translation>
<translation id="7719367874908701697">ಪುಟ ಝೂಮ್</translation>
<translation id="7719588063158526969">ಸಾಧನದ ಹೆಸರು ತುಂಬಾ ಉದ್ದವಾಗಿದೆ</translation>
<translation id="7721179060400456005">ಪ್ರದರ್ಶನಗಳಾದ್ಯಂತ ವ್ಯಾಪಿಸಲು ವಿಂಡೋಗಳಿಗೆ ಅನುಮತಿ ನೀಡಿ</translation>
@@ -7987,7 +7987,7 @@
<translation id="8184472985242519288">ಏಕರೂಪ</translation>
<translation id="8186609076106987817">ಸರ್ವರ್‌ಗೆ ಫೈಲ್ ಅನ್ನು ಕಂಡುಹಿಡಿಯಲಾಗಲಿಲ್ಲ.</translation>
<translation id="8188389033983459049">ನಿಮ್ಮ ಸಾಧನದ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಪರಿಶೀಲಿಸಿ ಮತ್ತು ಮುಂದುವರಿಸಲು ಬ್ಲೂಟೂತ್ ಆನ್ ಮಾಡಿ</translation>
-<translation id="8188742492803591566">ನಿಮ್ಮ ಸ್ಕ್ರೀನ್‌ ಅನ್ನು ಬಿತ್ತರಿಸುವುದನ್ನು ಪ್ರಾರಂಭಿಸಲು Chromecast ಅಥವಾ ಟಿವಿಯಲ್ಲಿ ತೋರಿಸಿರುವ ಪ್ರವೇಶ ಕೋಡ್ ಅನ್ನು ನಮೂದಿಸಿ.</translation>
+<translation id="8188742492803591566">ನಿಮ್ಮ ಸ್ಕ್ರೀನ್‌ ಅನ್ನು ಬಿತ್ತರಿಸುವುದನ್ನು ಪ್ರಾರಂಭಿಸಲು Chromecast ಅಥವಾ ಟಿವಿಯಲ್ಲಿ ತೋರಿಸಿರುವ ಆ್ಯಕ್ಸೆಸ್ ಕೋಡ್ ಅನ್ನು ನಮೂದಿಸಿ.</translation>
<translation id="8189306097519446565">ಶಾಲಾ ಖಾತೆಗಳು</translation>
<translation id="8189750580333936930">ಪ್ರೈವೆಸಿ ಸ್ಯಾಂಡ್‌ಬಾಕ್ಸ್</translation>
<translation id="8191230140820435481">ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು, ಎಕ್ಸ್‌ಟೆನ್ಷನ್‌‌ಗಳು, ಮತ್ತು ಥೀಮ್‌ಗಳನ್ನು ನಿರ್ವಹಿಸಿ</translation>
@@ -8008,10 +8008,10 @@
<translation id="8206745257863499010">ಬ್ಲೂಸಿ</translation>
<translation id="8206859287963243715">ಸೆಲ್ಯುಲಾರ್</translation>
<translation id="8207404892907560325">ಪಾಸ್‌ಕೀ ಒಂದನ್ನು ಆರಿಸಿ</translation>
-<translation id="8207794858944505786">VM "<ph name="DEFAULT_VM_NAME" />" ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ, ಆದರೆ ಮಾನ್ಯ <ph name="VM_TYPE" /> VM ಎಂಬಂತೆ ತೋರುತ್ತಿಲ್ಲ. ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ.</translation>
+<translation id="8207794858944505786">VM "<ph name="DEFAULT_VM_NAME" />" ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ, ಆದರೆ ಮಾನ್ಯ <ph name="VM_TYPE" /> VM ಎಂದು ತೋರುತ್ತಿಲ್ಲ. ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ.</translation>
<translation id="8208188204689616705">ಈ ಸೈಟ್‌ಗಳು, <ph name="FPS_OWNER" /> ಮೂಲಕ ವ್ಯಾಖ್ಯಾನಿಸಲಾದ ಗುಂಪಿನಲ್ಲಿವೆ. ಗುಂಪಿನಲ್ಲಿರುವ ಸೈಟ್‌ಗಳು, ಗುಂಪಿನಲ್ಲಿ ನಿಮ್ಮ ಚಟುವಟಿಕೆಯನ್ನು ನೋಡಬಹುದು.</translation>
<translation id="8208216423136871611">ಉಳಿಸಬೇಡಿ</translation>
-<translation id="8210398899759134986">{MUTED_NOTIFICATIONS_COUNT,plural, =1{ಹೊಸ ಅಧಿಸೂಚನೆ}one{# ಹೊಸ ಅಧಿಸೂಚನೆಗಳು}other{# ಹೊಸ ಅಧಿಸೂಚನೆಗಳು}}</translation>
+<translation id="8210398899759134986">{MUTED_NOTIFICATIONS_COUNT,plural, =1{ಹೊಸ ನೋಟಿಫಿಕೇಶನ್}one{# ಹೊಸ ನೋಟಿಫಿಕೇಶನ್‌ಗಳು}other{# ಹೊಸ ನೋಟಿಫಿಕೇಶನ್‌ಗಳು}}</translation>
<translation id="821119981794423735"><ph name="USER_EMAIL" /> ಗಾಗಿ ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು Google Password Manager ಗೆ ಆಮದು ಮಾಡಿಕೊಳ್ಳಲು, CSV ಫೈಲ್ ಆಯ್ಕೆಮಾಡಿ</translation>
<translation id="8212008074015601248">{NUM_DOWNLOAD,plural, =1{ಡೌನ್‌ಲೋಡ್ ಪ್ರಗತಿಯಲ್ಲಿದೆ}one{ಡೌನ್‌ಲೋಡ್‌ಗಳು ಪ್ರಗತಿಯಲ್ಲಿವೆ}other{ಡೌನ್‌ಲೋಡ್‌ಗಳು ಪ್ರಗತಿಯಲ್ಲಿವೆ}}</translation>
<translation id="8212601853154459483">ಈ ಪ್ರೊಫೈಲ್ ಅನ್ನು <ph name="PROFILE_MANAGER" /> ಮೂಲಕ ನಿರ್ವಹಿಸಲಾಗುತ್ತಿದೆ. ಹಾಗೂ <ph name="USER_EMAIL_ADDRESS" /> ಖಾತೆಗಾಗಿ ನೀವು ಪ್ರತ್ಯೇಕ ಪ್ರೊಫೈಲ್ ಅನ್ನು ರಚಿಸುವ ಅಗತ್ಯವಿದೆ</translation>
@@ -8062,7 +8062,7 @@
<translation id="8253198102038551905">ನೆಟ್‌ವರ್ಕ್ ಗುಣಲಕ್ಷಣಗಳನ್ನು ಪಡೆಯಲು '+' ಕ್ಲಿಕ್ ಮಾಡಿ</translation>
<translation id="8255212965098517578">ಇತ್ತೀಚಿನ ಫೋಟೋಗಳು, ಅಧಿಸೂಚನೆಗಳು ಮತ್ತು ಆ್ಯಪ್‌ಗಳು</translation>
<translation id="8256319818471787266">ಸ್ಪಾರ್ಕಿ</translation>
-<translation id="8257950718085972371">ಕ್ಯಾಮರಾ ಪ್ರವೇಶ ನಿರ್ಬಂಧಿಸುವುದನ್ನು ಮುಂದುವರಿಸಿ</translation>
+<translation id="8257950718085972371">ಕ್ಯಾಮರಾ ಆ್ಯಕ್ಸೆಸ್ ನಿರ್ಬಂಧಿಸುವುದನ್ನು ಮುಂದುವರಿಸಿ</translation>
<translation id="8260864402787962391">ಮೌಸ್</translation>
<translation id="8261378640211443080">ಈ ವಿಸ್ತರಣೆಯನ್ನು <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> ನಲ್ಲಿ ಪಟ್ಟಿ ಮಾಡಲಾಗಿಲ್ಲ ಮತ್ತು ಇದು ನಿಮಗೆ ಅರಿವಿಲ್ಲದಂತೆ ಸೇರಿಸಿರಬಹುದು.</translation>
<translation id="8261506727792406068">ಅಳಿಸಿ</translation>
@@ -8085,7 +8085,7 @@
<translation id="8271268254812352141">ನೀವು ಬಲ-ಕ್ಲಿಕ್ ಮಾಡಿದಾಗ ಅಥವಾ ಪಠ್ಯವನ್ನು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹೋಲ್ಡ್‌ ಮಾಡಿದಾಗ ವಿವರಣೆಗಳು, ಅನುವಾದಗಳು ಅಥವಾ ಯೂನಿಟ್ ಪರಿವರ್ತನೆಗಳನ್ನು ಪಡೆಯಿರಿ. <ph name="LINK_BEGIN" />ವೆಬ್‌ಸೈಟ್ ಭಾಷೆಗಳಲ್ಲಿ<ph name="LINK_END" /> ಅನುವಾದದ ಭಾಷೆಗಳನ್ನು ಕಸ್ಟಮೈಸ್ ಮಾಡಿ.</translation>
<translation id="8271379370373330993">ಪೋಷಕರೇ, ನಿಮಗಾಗಿ ಮುಂದಿನ ಕೆಲವು ಹಂತಗಳು ಇಲ್ಲಿವೆ. ಖಾತೆ ಸೆಟಪ್ ಮಾಡಿದ ನಂತರ ನೀವು ಮಗುವಿಗೆ <ph name="DEVICE_TYPE" /> ಅನ್ನು ಹಿಂತಿರುಗಿಸಬಹುದು.</translation>
<translation id="8272194309885535896">ಚಿತ್ರ ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ</translation>
-<translation id="8272443605911821513">"ಹೆಚ್ಚಿನ ಪರಿಕರಗಳು" ಮೆನುನಲ್ಲಿರುವ ‘ಎಕ್ಸ್‌ಟೆನ್ಷನ್‌‌ಗಳು’ಕ್ಲಿಕ್ ಮಾಡುವ ಮೂಲಕ ನಿಮ್ಮ ಎಕ್ಸ್‌ಟೆನ್ಷನ್‌‌ಗಳನ್ನು ನಿರ್ವಹಿಸಿ.</translation>
+<translation id="8272443605911821513">"ಹೆಚ್ಚಿನ ಟೂಲ್‌ಗಳು" ಮೆನುನಲ್ಲಿರುವ "ಎಕ್ಸ್‌ಟೆನ್ಷನ್‌‌ಗಳು" ಎಂಬುದನ್ನು ಕ್ಲಿಕ್ ಮಾಡುವ ಮೂಲಕ ನಿಮ್ಮ ಎಕ್ಸ್‌ಟೆನ್ಷನ್‌‌ಗಳನ್ನು ನಿರ್ವಹಿಸಿ.</translation>
<translation id="8272786333453048167">ಪುನಃ ಅನುಮತಿಸಿ</translation>
<translation id="8273905181216423293">ಈಗಲೇ ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ</translation>
<translation id="827488840488530039">ನೀವು ಭೇಟಿ ನೀಡಲು ಪ್ರಯತ್ನಿಸುತ್ತಿರುವ ಪುಟವು ನಿಮ್ಮ Kerberos ಟಿಕೆಟ್‌ಗಳನ್ನು ದೃಢೀಕರಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ</translation>
@@ -8095,7 +8095,7 @@
<translation id="8275080796245127762">ನಿಮ್ಮ ಸಾಧನದಿಂದ ಕರೆ ಮಾಡಿ</translation>
<translation id="8275339871947079271">ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ನಿಮ್ಮ Google ಖಾತೆಗೆ ಸರಿಸಿ, ಇದರಿಂದ ನೀವು ಸೈನ್ ಇನ್ ಮಾಡಿದಲ್ಲೆಲ್ಲಾ ನಿಮ್ಮ Google ಖಾತೆಯನ್ನು ಸುರಕ್ಷಿತವಾಗಿ ಪ್ರವೇಶಿಸಬಹುದು</translation>
<translation id="8276560076771292512">ಖಾಲಿ ಕ್ಯಾಷ್ ಮತ್ತು ಹಾರ್ಡ್ ಮರುಲೋಡ್</translation>
-<translation id="8281721647184388851">Chrome ಬ್ರೌಸರ್ ಸಿಂಕ್ ಅನ್ನು ಆನ್ ಮಾಡುವುದೇ?</translation>
+<translation id="8281721647184388851">Chrome ಬ್ರೌಸರ್ ಸಿಂಕ್ ಅನ್ನು ಆನ್ ಮಾಡಬೇಕೆ?</translation>
<translation id="8281886186245836920">ಸ್ಕಿಪ್‌</translation>
<translation id="8284279544186306258">ಎಲ್ಲಾ <ph name="WEBSITE_1" /> ಸೈಟ್‌ಗಳು</translation>
<translation id="8284326494547611709">ಶೀರ್ಷಿಕೆಗಳು</translation>
@@ -8127,7 +8127,7 @@
<translation id="8314089908545021657">ಹೊಸ ಫೋನ್ ಜೊತೆಗೆ ಜೋಡಿಸಿ</translation>
<translation id="8314381333424235892">ವಿಸ್ತರಣೆ ಕಾಣೆಯಾಗಿದೆ ಅಥವಾ ಅದನ್ನು ಅನ್‍‍ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಲಾಗಿದೆ</translation>
<translation id="831440797644402910">ಈ ಫೋಲ್ಡರ್ ತೆರೆಯಲು ಸಾಧ್ಯವಿಲ್ಲ</translation>
-<translation id="8314835274931377415">ಪ್ರವೇಶ ಬದಲಾಯಿಸಿ ಸೆಟಪ್ ಅನ್ನು ಪ್ರಾರಂಭಿಸುವುದೇ?</translation>
+<translation id="8314835274931377415">ಆ್ಯಕ್ಸೆಸ್ ಬದಲಾಯಿಸಿ ಸೆಟಪ್ ಅನ್ನು ಪ್ರಾರಂಭಿಸುವುದೇ?</translation>
<translation id="8317671367883557781">ನೆಟ್‌ವರ್ಕ್ ಸಂಪರ್ಕವನ್ನು ಸೇರಿಸಿ</translation>
<translation id="8317965619823678157">ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ನಕಲಿಸಿ</translation>
<translation id="8318266828739827371">ನಿಮ್ಮ ಸ್ಕ್ರೀನ್‌ನ ವರ್ಧಿತ ಪ್ರದೇಶವನ್ನು ನೋಡಲು ಪರದೆ ಬೇರ್ಪಡಿಸಿ ವೀಕ್ಷಣೆಯನ್ನು ಬಳಸಿ. ಡಾಕ್ ಮಾಡಿದ ಮ್ಯಾಗ್ನಿಫೈಯರ್ ಅನ್ನು ಆನ್ ಮತ್ತು ಆಫ್ ಮಾಡಲು ಹುಡುಕಾಟ + Ctrl + D ಬಳಸಿ.</translation>
@@ -8161,7 +8161,7 @@
<translation id="8345848587667658367">ನೀವು ಈಗ ನಿಮ್ಮ ಫೋನ್‌ನ ಇತ್ತೀಚಿನ ಫೋಟೋಗಳು, ಮೀಡಿಯಾ, ಅಧಿಸೂಚನೆಗಳು ಮತ್ತು ಆ್ಯಪ್‌ಗಳನ್ನು ವೀಕ್ಷಿಸಬಹುದು</translation>
<translation id="8347227221149377169">ಮುದ್ರಣ ಕಾರ್ಯಗಳು</translation>
<translation id="834785183489258869">ಅಜ್ಞಾತ ಮೋಡ್‌ನಲ್ಲಿ ಇರುವಾಗ, ವಿವಿಧ ಸೈಟ್‌ಗಳಾದ್ಯಂತ ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಚಟುವಟಿಕೆಯನ್ನು ನೋಡಲು, ಉದಾಹರಣೆಗೆ, ಜಾಹೀರಾತುಗಳನ್ನು ವೈಯಕ್ತೀಕರಿಸುವುದಕ್ಕಾಗಿ ನಿಮ್ಮ ಕುಕೀಗಳನ್ನು ಬಳಸಲು ಸೈಟ್‌ಗಳಿಗೆ ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. ಫೀಚರ್‌ಗಳು ಕೆಲವು ಸೈಟ್‌ಗಳಲ್ಲಿ ಕಾರ್ಯನಿರ್ವಹಿಸದೇ ಇರಬಹುದು.</translation>
-<translation id="8350789879725387295">ಡಾಕ್‌ನಲ್ಲಿರುವ ಸ್ಟೈಲಸ್ ಪರಿಕರಗಳು</translation>
+<translation id="8350789879725387295">ಡಾಕ್‌ನಲ್ಲಿರುವ ಸ್ಟೈಲಸ್ ಟೂಲ್‌ಗಳು</translation>
<translation id="8351316842353540018">ಯಾವಾಗಲೂ a11y ಆಯ್ಕೆಗಳನ್ನು ತೋರಿಸಿ</translation>
<translation id="8351419472474436977">ನಿಮ್ಮ ಪ್ರಾಕ್ಸಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಈ ವಿಸ್ತರಣೆಯು ನಿಯಂತ್ರಣಕ್ಕೆ ತೆಗೆದುಕೊಂಡಿದೆ. ಅಂದರೆ, ನೀವು ಆನ್‌ಲೈನ್‌ನಲ್ಲಿ ಮಾಡುವ ಯಾವುದೇ ಕಾರ್ಯವನ್ನು ಇದು ಬದಲಾಯಿಸಬಹುದು, ಒಳನುಸುಳಬಹುದು ಅಥವಾ ಕದ್ದಾಲಿಸಬಹುದು ಎಂದರ್ಥ. ಇದು ಹೇಗೆ ಸಂಭವಿಸಿದೆ ಎಂಬುದೇ ನಿಮಗೆ ಖಚಿತವಿಲ್ಲದಿದ್ದರೆ, ನಿಮಗೆ ಬಹುಶಃ ಇದು ಬೇಕಾಗಿಲ್ಲ.</translation>
<translation id="8351630282875799764">ಬ್ಯಾಟರಿ ಚಾರ್ಜ್ ಆಗುತ್ತಿಲ್ಲ</translation>
@@ -8495,7 +8495,7 @@
<translation id="8662978096466608964">Chrome ಗೆ ವಾಲ್‌ಪೇಪರ್ ಅನ್ನು ಹೊಂದಿಸಲಾಗುವುದಿಲ್ಲ.</translation>
<translation id="8663099077749055505"><ph name="HOST" /> ರಲ್ಲಿ ಯಾವಾಗಲೂ ಬಹು ಸ್ವಯಂಚಾಲಿತ ಡೌನ್‌ಲೋಡ್‌ಗಳನ್ನು ನಿರ್ಬಂಧಿಸು</translation>
<translation id="8664389313780386848">ಫ್ರೇಮ್ ಮೂಲವನ್ನು &amp;ವೀಕ್ಷಿಸಿ</translation>
-<translation id="8665110742939124773">ನೀವು ತಪ್ಪಾದ ಪ್ರವೇಶ ಕೋಡ್ ಅನ್ನು ನಮೂದಿಸಿದ್ದೀರಿ. ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation>
+<translation id="8665110742939124773">ನೀವು ತಪ್ಪಾದ ಆ್ಯಕ್ಸೆಸ್ ಕೋಡ್ ಅನ್ನು ನಮೂದಿಸಿದ್ದೀರಿ. ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation>
<translation id="8665180165765946056">ಬ್ಯಾಕಪ್ ಪೂರ್ಣಗೊಂಡಿದೆ</translation>
<translation id="866611985033792019">ಇಮೇಲ್ ಬಳಕೆದಾರರನ್ನು ಗುರುತಿಸುವುದಕ್ಕಾಗಿ ಈ ಪ್ರಮಾಣಪತ್ರದ ಮೇಲೆ ವಿಶ್ವಾಸವಿಡಿ</translation>
<translation id="8666321716757704924"><ph name="WEBSITE" /> ಗಾಗಿ ಪುನಃ ಅನುಮತಿಗಳನ್ನು ನೀಡಲಾಗಿದೆ</translation>
@@ -8585,7 +8585,7 @@
<translation id="8737914367566358838">ಪುಟವನ್ನು ಯಾವ ಭಾಷೆಗೆ ಅನುವಾದಿಸಬೇಕೆಂಬುದನ್ನು ಆಯ್ಕೆಮಾಡಿ</translation>
<translation id="8740247629089392745">ಈ Chromebook ಅನ್ನು <ph name="SUPERVISED_USER_NAME" /> ಅವರಿಗೆ ಹಸ್ತಾಂತರಿಸಬಹುದು. ಸೆಟಪ್ ಬಹುತೇಕ ಪೂರ್ಣಗೊಂಡಿದೆ, ಇದು ಎಕ್ಸ್‌ಪ್ಲೋರ್ ಮಾಡುವ ಸಮಯ.</translation>
<translation id="8740672167979365981">ChromeOS Flex ಅನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡುವ ಅಗತ್ಯವಿದೆ</translation>
-<translation id="8741944563400125534">ಪ್ರವೇಶ ಬದಲಾಯಿಸಿ ಸೆಟಪ್ ಗೈಡ್</translation>
+<translation id="8741944563400125534">ಆ್ಯಕ್ಸೆಸ್ ಬದಲಾಯಿಸಿ ಸೆಟಪ್ ಗೈಡ್</translation>
<translation id="8742998548129056176">ನಿಮ್ಮ ಸಾಧನದ ಕುರಿತು ಮತ್ತು ಅದನ್ನು ನೀವು ಹೇಗೆ ಬಳಸುತ್ತೀರಿ ಎಂಬುದರ ಕುರಿತು ಇದು ಸಾಮಾನ್ಯ ಮಾಹಿತಿಯಾಗಿದೆ (ಉದಾಹರಣೆಗೆ, ಬ್ಯಾಟರಿಯ ಮಟ್ಟ, ಸಿಸ್ಟಂ ಹಾಗೂ ಆ್ಯಪ್ ಚಟುವಟಿಕೆ ಮತ್ತು ದೋಷಗಳು). Android ಅನ್ನು ಸುಧಾರಿಸಲು ಈ ಡೇಟಾವನ್ನು ಬಳಸಲಾಗುತ್ತದೆ ಮತ್ತು ಒಟ್ಟುಗೂಡಿಸಲಾದ ಕೆಲವೊಂದು ಮಾಹಿತಿಯು Google ಆ್ಯಪ್‌ಗಳಿಗೆ ಮತ್ತು Android ಡೆವಲಪರ್‌ಗಳಂತಹ ಪಾಲುದಾರರಿಗೆ, ಅವರ ಆ್ಯಪ್‌ಗಳು ಹಾಗೂ ಉತ್ಪನ್ನಗಳನ್ನು ಉತ್ತಮಗೊಳಿಸಲು ಸಹಾಯ ಮಾಡುತ್ತದೆ.</translation>
<translation id="8744641000906923997">ರೊಮಾಜಿ</translation>
<translation id="8745034592125932220">ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಡೇಟಾವನ್ನು ಉಳಿಸಲು ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ</translation>
@@ -8599,14 +8599,14 @@
<translation id="8751419011949619279">ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಲಾದ ಆ್ಯಪ್‌ಗಳಲ್ಲಿ ವೆಬ್‌ಸೈಟ್‌ಗಳನ್ನು ತೆರೆಯಿರಿ</translation>
<translation id="8752451679755290210">ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಐಟಂಗಳ ನಡುವೆ ಸರಿಸಿ</translation>
<translation id="8753868764580670305">ಈ ಸಾಧನದಲ್ಲಿ ಉಳಿಸಲಾಗಿರುವ ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ನೋಡಿ ಮತ್ತು ನಿರ್ವಹಿಸಿ</translation>
-<translation id="8753948258138515839">ನೀವು Google Drive, ಬಾಹ್ಯ ಸಂಗ್ರಹಣೆ ಅಥವಾ ನಿಮ್ಮ ChromeOS Flex ಸಾಧನದಲ್ಲಿ ಉಳಿಸಿರುವ ಫೈಲ್‌ಗಳಿಗೆ Files ಆ್ಯಪ್ ತ್ವರಿತ ಪ್ರವೇಶ ಒದಗಿಸುತ್ತದೆ.</translation>
+<translation id="8753948258138515839">ನೀವು Google Drive, ಬಾಹ್ಯ ಸಂಗ್ರಹಣೆ ಅಥವಾ ನಿಮ್ಮ ChromeOS Flex ಸಾಧನದಲ್ಲಿ ಉಳಿಸಿರುವ ಫೈಲ್‌ಗಳಿಗೆ Files ಆ್ಯಪ್ ತ್ವರಿತ ಆ್ಯಕ್ಸೆಸ್ ಒದಗಿಸುತ್ತದೆ.</translation>
<translation id="8754200782896249056">&lt;p&gt;ಬೆಂಬಲಿತ ಡೆಸ್ಕ್‌ಟಾಪ್‌ ಪರಿಸರದ ಅಡಿಯಲ್ಲಿ <ph name="PRODUCT_NAME" /> ಅನ್ನು ರನ್‌ ಮಾಡುವಾಗ, ಸಿಸ್ಟಂನ ಪ್ರಾಕ್ಸಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಬಳಸಲಾಗುತ್ತದೆ. ಆದಾಗ್ಯೂ ನಿಮ್ಮ ಸಿಸ್ಟಂಗೆ ಬೆಂಬಲ ಸಿಗುತ್ತಿಲ್ಲ ಇಲ್ಲವೇ ನಿಮ್ಮ ಸಿಸ್ಟಂ ಕಾನ್ಫಿಗರೇಶನ್‌ ಪ್ರಾರಂಭಿಸುವಲ್ಲಿ ಸಮಸ್ಯೆ ಇದೆ.&lt;/p&gt;
&lt;p&gt;ಆದರೆ ಕಮಾಂಡ್ ಸಾಲಿನ ಮೂಲಕ ನೀವು ಇನ್ನೂ ಕಾನ್ಫಿಗರ್ ಮಾಡಬಹುದಾಗಿದೆ. ಫ್ಲ್ಯಾಗ್‌ಗಳು ಮತ್ತು ಪರಿಸರ ವೇರಿಯಬಲ್‌ಗಳ ಕುರಿತ ಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ ದಯವಿಟ್ಟು &lt;code&gt;ಕೈಪಿಡಿ <ph name="PRODUCT_BINARY_NAME" />&lt;/code&gt; ಅನ್ನು ವೀಕ್ಷಿಸಿ.&lt;/p&gt;</translation>
<translation id="8755175579224030324">ನಿಮ್ಮ ಸಂಸ್ಥೆಗಾಗಿ ಸುರಕ್ಷತೆಗೆ-ಸಂಬಂಧಿಸಿದ ಕಾರ್ಯಗಳನ್ನು ನಿರ್ವಹಿಸಿ, ಉದಾಹರಣೆಗೆ ಸಾಧನದಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ ಪ್ರಮಾಣಪತ್ರಗಳನ್ನು ಮತ್ತು ಕೀಲಿಗಳನ್ನು ನಿರ್ವಹಿಸುವುದು</translation>
<translation id="8755376271068075440">&amp;ದೊಡ್ಡದು</translation>
<translation id="875604634276263540">ಚಿತ್ರದ URL ಅಮಾನ್ಯವಾಗಿದೆ</translation>
-<translation id="8756969031206844760">ಪಾಸ್‌ವರ್ಡ್ ಅಪ್‌ಡೇಟ್ ಮಾಡುವುದೇ?</translation>
+<translation id="8756969031206844760">ಪಾಸ್‌ವರ್ಡ್ ಅಪ್‌ಡೇಟ್ ಮಾಡಬೇಕೆ?</translation>
<translation id="8757203080302669031">ಬ್ಲೂಟೂತ್ ಸಾಧನಗಳಿಗಾಗಿ ಈ ಟ್ಯಾಬ್ ಸಕ್ರಿಯವಾಗಿ ಸ್ಕ್ಯಾನ್ ಮಾಡುತ್ತಿದೆ.</translation>
<translation id="8757368836647541092"><ph name="USER_NAME_OR_EMAIL" /> ಅವರನ್ನು ತೆಗೆದುಹಾಕಲಾಗಿದೆ</translation>
<translation id="8759753423332885148">ಮತ್ತಷ್ಟು ತಿಳಿಯಿರಿ.</translation>
@@ -8659,7 +8659,7 @@
<translation id="8808478386290700967">ವೆಬ್‌ ಸ್ಟೋರ್‌</translation>
<translation id="8808686172382650546">ಬೆಕ್ಕು</translation>
<translation id="8809147117840417135">ತಿಳಿ ಕೆನ್ನೀಲಿ</translation>
-<translation id="8811862054141704416">Crostini ಮೈಕ್ರೋಫೋನ್ ಪ್ರವೇಶ</translation>
+<translation id="8811862054141704416">Crostini ಮೈಕ್ರೋಫೋನ್ ಆ್ಯಕ್ಸೆಸ್</translation>
<translation id="8812593354822910461">ನಿಮ್ಮನ್ನು <ph name="DOMAIN" /> ನಿಂದ ಸೈನ್ ಔಟ್ ಮಾಡಬಹುದಾದ ಬ್ರೌಸಿಂಗ್ ಡೇಟಾವನ್ನು (<ph name="URL" />) ಸಹ ತೆರವುಗೊಳಿಸಿ. <ph name="LEARN_MORE" /></translation>
<translation id="8813698869395535039"><ph name="USERNAME" /> ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ</translation>
<translation id="8813872945700551674">"<ph name="EXTENSION_NAME" />" ಅನ್ನು ಅನುಮೋದಿಸಲು ಪೋಷಕರ ಬಳಿ ವಿನಂತಿಸಿ</translation>
@@ -8763,7 +8763,7 @@
<translation id="8892168913673237979">ಎಲ್ಲ ಹೊಂದಿಸಿ!</translation>
<translation id="8893801527741465188">ಅನ್‌ಇನ್‌ಸ್ಟಾಲ್ ಪ್ರಕ್ರಿಯೆ ಪೂರ್ಣಗೊಂಡಿದೆ</translation>
<translation id="8893928184421379330">ಕ್ಷಮಿಸಿ, <ph name="DEVICE_LABEL" />ಸಾಧನವನ್ನು ಗುರುತಿಸಲಾಗಲಿಲ್ಲ.</translation>
-<translation id="8894761918470382415">ಬಾಹ್ಯ ಸಾಧನಗಳ ಡೇಟಾ ಪ್ರವೇಶ ರಕ್ಷಣೆ</translation>
+<translation id="8894761918470382415">ಬಾಹ್ಯ ಸಾಧನಗಳ ಡೇಟಾ ಆ್ಯಕ್ಸೆಸ್ ರಕ್ಷಣೆ</translation>
<translation id="8895454554629927345">ಬುಕ್‌ಮಾರ್ಕ್ ಪಟ್ಟಿ</translation>
<translation id="8898786835233784856">ಮುಂದೆ ಟ್ಯಾಬ್ ಆಯ್ಕೆಮಾಡಿ</translation>
<translation id="8898822736010347272">ಹೊಸ ಅಪಾಯಗಳನ್ನು ಕಂಡುಹಿಡಿಯಲು ಮತ್ತು ವೆಬ್‌ನಲ್ಲಿರುವ ಪ್ರತಿಯೊಬ್ಬರನ್ನು ರಕ್ಷಿಸುವುದಕ್ಕೆ ಸಹಾಯ ಮಾಡಲು, ನೀವು ಭೇಟಿ ನೀಡುವ ಕೆಲವು ಪುಟಗಳ URL ಗಳು, ಸೀಮಿತ ಸಿಸ್ಟಂ ಮಾಹಿತಿ ಮತ್ತು ಪುಟಗಳಲ್ಲಿನ ಕೆಲವು ಕಂಟೆಂಟ್ ಅನ್ನು Google ಗೆ ಕಳುಹಿಸುತ್ತದೆ.</translation>
@@ -8925,7 +8925,7 @@
<translation id="9038489124413477075">ಹೆಸರಿಸದ ಫೋಲ್ಡರ್</translation>
<translation id="9039014462651733343">{NUM_ATTEMPTS,plural, =1{ನೀವು ಇನ್ನೂ ಒಂದು ಬಾರಿ ಪ್ರಯತ್ನಿಸಬಹುದು.}one{ನೀವು ಇನ್ನೂ # ಬಾರಿ ಪ್ರಯತ್ನಿಸಬಹುದು.}other{ನೀವು ಇನ್ನೂ # ಬಾರಿ ಪ್ರಯತ್ನಿಸಬಹುದು.}}</translation>
<translation id="9040473193163777637">ChromeVox, ChromeOS ಗಾಗಿ ಅಂತರ್ನಿರ್ಮಿತ ಸ್ಕ್ರೀನ್ ರೀಡರ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ನೀವು ಬಯಸುವಿರಾ? ಹಾಗಿದ್ದರೆ, ಐದು ಸೆಕೆಂಡ್‌ಗಳ ಕಾಲ ಎರಡೂ ವಾಲ್ಯೂಮ್ ಕೀಗಳನ್ನು ಒತ್ತಿ ಹಿಡಿದುಕೊಳ್ಳಿ.</translation>
-<translation id="9040661932550800571"><ph name="ORIGIN" /> ಗಾಗಿ ಪಾಸ್‌ವರ್ಡ್ ಅಪ್‌ಡೇಟ್‌ ಮಾಡುವುದೇ?</translation>
+<translation id="9040661932550800571"><ph name="ORIGIN" /> ಗಾಗಿ ಪಾಸ್‌ವರ್ಡ್ ಅಪ್‌ಡೇಟ್‌ ಮಾಡಬೇಕೆ?</translation>
<translation id="9041692268811217999">ನಿಮ್ಮ ಯಂತ್ರದಲ್ಲಿ ಸ್ಥಳೀಯ ಫೈಲ್‌ಗಳಿಗೆ ಪ್ರವೇಶಿಸುವುದನ್ನು ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದಾರೆ</translation>
<translation id="904224458472510106">ಈ ಕಾರ್ಯಚರಣೆಯನ್ನು ರದ್ದು ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ</translation>
<translation id="9042827002460091668">ನಿಮ್ಮ ಇಂಟರ್ನೆಟ್ ಕನೆಕ್ಷನ್ ಅನ್ನು ಪರಿಶೀಲಿಸಿ ಹಾಗೂ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ</translation>
@@ -8943,7 +8943,7 @@
<translation id="9056810968620647706">ಯಾವುದೇ ಹೊಂದಾಣಿಕೆಗಳು ಕಂಡುಬಂದಿಲ್ಲ.</translation>
<translation id="9057007989365783744"><ph name="SUPERVISED_USER_NAME" /> ಅವರು ಈ ಕೆಳಗಿನ ವಿಷಯವನ್ನು ಪ್ರವೇಶಿಸಲು ಬಯಸುತ್ತಿದ್ದಾರೆ:</translation>
<translation id="9057354806206861646">ಅಪ್‌ಡೇಟ್ ವೇಳಾಪಟ್ಟಿ</translation>
-<translation id="9058070466596314168">{NUM_NOTIFICATION,plural, =1{ದಿನಕ್ಕೆ ಸುಮಾರು 1 ಅಧಿಸೂಚನೆ}one{ದಿನಕ್ಕೆ ಸುಮಾರು {NUM_NOTIFICATION} ಅಧಿಸೂಚನೆಗಳು}other{ದಿನಕ್ಕೆ ಸುಮಾರು {NUM_NOTIFICATION} ಅಧಿಸೂಚನೆಗಳು}}</translation>
+<translation id="9058070466596314168">{NUM_NOTIFICATION,plural, =1{ದಿನಕ್ಕೆ ಸುಮಾರು 1 ನೋಟಿಫಿಕೇಶನ್}one{ದಿನಕ್ಕೆ ಸುಮಾರು {NUM_NOTIFICATION} ನೋಟಿಫಿಕೇಶನ್‌ಗಳು}other{ದಿನಕ್ಕೆ ಸುಮಾರು {NUM_NOTIFICATION} ನೋಟಿಫಿಕೇಶನ್‌ಗಳು}}</translation>
<translation id="9058760336383947367">ಪ್ರಿಂಟರ್ PPD ಅನ್ನು ವೀಕ್ಷಿಸಿ</translation>
<translation id="9061383912634843744">ಉಳಿಸಲಾದ ರುಜುವಾತುಗಳನ್ನು ಬಳಸಿಕೊಂಡು ಸೈಟ್‌ಗಳು ಮತ್ತು ಆ್ಯಪ್‌ಗಳಿಗೆ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸೈನ್ ಇನ್ ಮಾಡಿ. ಆಫ್ ಮಾಡಿದರೆ, ಸೈಟ್ ಅಥವಾ ಆ್ಯಪ್‌ಗೆ ಸೈನ್ ಇನ್ ಮಾಡುವ ಮೊದಲು ಪ್ರತಿ ಬಾರಿ ದೃಢೀಕರಣಕ್ಕಾಗಿ ನಿಮ್ಮನ್ನು ಕೇಳಲಾಗುತ್ತದೆ.</translation>
<translation id="9062468308252555888">14x</translation>
@@ -9163,7 +9163,7 @@
<translation id="964790508619473209">ಸ್ಕ್ರೀನ್ ಜೋಡಣೆ</translation>
<translation id="965211523698323809">ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ನಿಂದ ಪಠ್ಯ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಿ ಮತ್ತು ಸ್ವೀಕರಿಸಿ. <ph name="LINK_BEGIN" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="LINK_END" /></translation>
<translation id="96535553604365597">Google Cast ನಲ್ಲಿನ ಸಮಸ್ಯೆಯನ್ನು ವರದಿ ಮಾಡಿ</translation>
-<translation id="967398046773905967">HID ಸಾಧನಗಳಿಗೆ ಪ್ರವೇಶ ಪಡೆಯಲು ಯಾವುದೇ ಸೈಟ್‌ಗಳಿಗೆ ಅನುಮತಿಸಬೇಡಿ</translation>
+<translation id="967398046773905967">HID ಸಾಧನಗಳಿಗೆ ಆ್ಯಕ್ಸೆಸ್ ಪಡೆಯಲು ಯಾವುದೇ ಸೈಟ್‌ಗಳಿಗೆ ಅನುಮತಿಸಬೇಡಿ</translation>
<translation id="967624055006145463">ಸಂಗ್ರಹಣೆ ಮಾಡಿರುವ ಡೇಟಾ</translation>
<translation id="96774243435178359">ನಿರ್ವಹಿಸಲಾದ ಪ್ರಿಂಟರ್‌ಗಳು</translation>
<translation id="968000525894980488">Google Play ಸೇವೆಗಳನ್ನು ಆನ್ ಮಾಡಿ.</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_ko.xtb b/chromium/chrome/app/resources/generated_resources_ko.xtb
index 4fac401f720..a1e5b4dd731 100644
--- a/chromium/chrome/app/resources/generated_resources_ko.xtb
+++ b/chromium/chrome/app/resources/generated_resources_ko.xtb
@@ -1209,7 +1209,7 @@
<translation id="2048554637254265991">컨테이너 관리자 시작 중에 오류가 발생했습니다. 다시 시도해 주세요.</translation>
<translation id="2048653237708779538">실행할 수 없는 작업</translation>
<translation id="204914487372604757">바로가기 만들기</translation>
-<translation id="2050339315714019657">세로 방향</translation>
+<translation id="2050339315714019657">인물 사진</translation>
<translation id="2051555741181591333">핫스팟 자동 사용 중지</translation>
<translation id="2052572566310583903">다른 기기에서 설치됨</translation>
<translation id="2053105195397337973">Google은 추적을 제한하고 사이트에서 광고 스팸과 사기를 방지하도록 돕는 방안을 모색하고 있습니다.</translation>
@@ -1892,7 +1892,7 @@
<translation id="2628770867680720336">ADB 디버깅을 사용 설정하려면 이 Chromebook을 초기화해야 합니다. <ph name="BEGIN_LINK_LEARN_MORE" />자세히 알아보기<ph name="END_LINK_LEARN_MORE" /></translation>
<translation id="2629227353894235473">Android 앱 개발</translation>
<translation id="2629437048544561682">캔버스 지우기</translation>
-<translation id="2631498379019108537">실행기에 입력 옵션 표시</translation>
+<translation id="2631498379019108537">앱 표시줄에 입력 옵션 표시</translation>
<translation id="2633212996805280240">'<ph name="EXTENSION_NAME" />'을(를) 삭제하시겠습니까?</translation>
<translation id="263325223718984101"><ph name="PRODUCT_NAME" />에서 설치를 완료하지 못했지만 디스크 이미지에서 계속 실행됩니다.</translation>
<translation id="2633764681656412085">FIDO</translation>
@@ -1981,7 +1981,7 @@
<translation id="2709516037105925701">자동 완성</translation>
<translation id="2710101514844343743">사용 및 진단 데이터</translation>
<translation id="271033894570825754">New</translation>
-<translation id="2711073837061989559">무료 체험</translation>
+<translation id="2711073837061989559">체험판</translation>
<translation id="2712207122921938368">다른 기기에 패스키 생성</translation>
<translation id="2713106313042589954">카메라 끄기</translation>
<translation id="2713444072780614174">흰색</translation>
@@ -2361,7 +2361,7 @@
<translation id="3027296729579831126">Nearby Share 사용 설정</translation>
<translation id="3027644380269727216">사이트 내 활동을 기반으로 추천됩니다. 설정이 사용 설정되어 있습니다.</translation>
<translation id="3029276696788198026">미리 로드 안함</translation>
-<translation id="3029466929721441205">실행기에 스타일러스 도구 표시</translation>
+<translation id="3029466929721441205">앱 표시줄에 스타일러스 도구 표시</translation>
<translation id="3029808567601324798">잠금 시간</translation>
<translation id="3030311804857586740">{NUM_DAYS,plural, =1{<ph name="MANAGER" />에서 오늘 업데이트를 다운로드할 것을 요청합니다. 인터넷에 연결되면 업데이트가 자동으로 다운로드됩니다.}other{<ph name="MANAGER" />에서 기한 전에 업데이트를 다운로드할 것을 요청합니다. 인터넷에 연결되면 업데이트가 자동으로 다운로드됩니다.}}</translation>
<translation id="3030967311408872958">화면 밝기 자동 설정</translation>
@@ -2616,7 +2616,7 @@
<translation id="3289856944988573801">업데이트를 확인하려면 이더넷 또는 Wi-Fi를 사용하세요.</translation>
<translation id="3289886661311231677">사이트와 공유하고 싶지 않은 주제를 차단할 수 있습니다. 또한 Chrome에서는 4주 이상된 주제를 자동으로 삭제합니다.</translation>
<translation id="3290249595466894471">또한 페이지, 다운로드 항목, 확장 프로그램 활동, 시스템 정보의 표본을 일부 전송하여 새로운 위협을 발견하는 데 도움을 줍니다.</translation>
-<translation id="3293181007446299124">방문 기록은 기기에서 비공개로 유지되며 신고는 사용자의 신원을 보호하기 위해 보고서 전송이 지연됩니다.</translation>
+<translation id="3293181007446299124">방문 기록은 기기에서 비공개로 유지되며 사용자의 신원을 보호하기 위해 보고서 전송이 지연됩니다.</translation>
<translation id="3293644607209440645">이 페이지 전송</translation>
<translation id="32939749466444286">Linux 컨테이너가 시작되지 않았습니다. 다시 시도해 주세요.</translation>
<translation id="3294437725009624529">게스트</translation>
@@ -2895,7 +2895,7 @@
<translation id="3541823293333232175">할당됨</translation>
<translation id="3543393733900874979">업데이트 실패(오류: <ph name="ERROR_NUMBER" />)</translation>
<translation id="3543597750097719865">SHA-512를 포함한 X9.62 ECDSA 서명</translation>
-<translation id="3544058026430919413">회사는 쿠키를 사용하여 내 그룹 활동을 공유하는 사이트 그룹을 정의할 수 있습니다. 시크릿 모드에서는 이 기능이 사용 중지되어 있습니다.</translation>
+<translation id="3544058026430919413">쿠키를 사용하여 내 그룹 활동을 공유할 수 있는 사이트 그룹을 회사가 정의할 수 있습니다. 시크릿 모드에서는 이 기능이 사용 중지되어 있습니다.</translation>
<translation id="3544879808695557954">사용자 이름(선택사항)</translation>
<translation id="354602065659584722">유해한 소프트웨어가 삭제됨</translation>
<translation id="3547954654003013442">프록시 설정</translation>
@@ -2949,7 +2949,7 @@
<translation id="3593152357631900254">퍼지 병음 모드 사용</translation>
<translation id="3593965109698325041">인증서 이름 제약조건</translation>
<translation id="3596012367874587041">앱 설정</translation>
-<translation id="3596414637720633074">시크릿 모드에서 타사 쿠키 차단</translation>
+<translation id="3596414637720633074">시크릿 모드에서 서드 파티 쿠키 차단</translation>
<translation id="3598010454707842106">'Chrome 맞춤설정'을 클릭합니다.</translation>
<translation id="3599221874935822507">양각</translation>
<translation id="3600051066689725006">웹 요청 정보</translation>
@@ -2991,7 +2991,7 @@
<translation id="3629631988386925734">비밀번호를 입력하여 Smart Lock을 사용 설정하세요. 다음번에는 휴대전화를 통해 <ph name="DEVICE_TYPE" />이(가) 잠금 해제됩니다. 설정에서 Smart Lock을 사용 중지할 수 있습니다.</translation>
<translation id="3629664892718440872">이 선택사항 저장</translation>
<translation id="3630132874740063857">휴대전화</translation>
-<translation id="3630995161997703415">이 사이트를 언제든지 사용할 수 있도록 실행기에 추가합니다</translation>
+<translation id="3630995161997703415">이 사이트를 언제든지 사용할 수 있도록 앱 표시줄에 추가합니다</translation>
<translation id="3634652306074934350">권한 요청 만료됨</translation>
<translation id="3635199270495525546">신뢰할 수 있는 플랫폼 모듈(TPM) 감지됨</translation>
<translation id="3635353578505343390">Google에 의견 보내기</translation>
@@ -3857,7 +3857,7 @@
<translation id="4411719918614785832">이 패스키는 이 컴퓨터의 Windows Hello에 저장됩니다. Google 계정에는 저장되지 않습니다.</translation>
<translation id="4412632005703201014">Chrome 앱이 프로그레시브 웹 앱으로 이전 중입니다. 조직에서 이 Chrome 앱을 브라우저에 설치했습니다. 앱 목록에서 프로그레시브 웹 앱을 열려면 먼저 관리자에게 문의하여 Chrome 앱을 제거해 달라고 요청하세요. 그동안 <ph name="EXTENSION_LAUNCH_URL" /> 페이지를 방문하여 웹에서 <ph name="EXTENSION_NAME" /> 페이지를 열 수 있습니다.</translation>
<translation id="4412698727486357573">고객센터</translation>
-<translation id="4412992751769744546">타사 쿠키 허용</translation>
+<translation id="4412992751769744546">서드 파티 쿠키 허용</translation>
<translation id="44141919652824029">'<ph name="APP_NAME" />'이(가) 연결된 USB 기기의 목록을 읽도록 허용하시겠습니까?</translation>
<translation id="4414232939543644979">새 시크릿 창(&amp;I)</translation>
<translation id="4414648713167199100">Chromebook의 모바일 데이터를 사용하며 이동통신사에서 추가 요금을 부과할 수 있습니다. 배터리 사용량이 증가할 수 있습니다. <ph name="BEGIN_LINK_LEARN_MORE" />자세히 알아보기<ph name="END_LINK_LEARN_MORE" /></translation>
@@ -5417,7 +5417,7 @@ https://support.google.com/chromebook/?p=tpm</translation>
<translation id="5860254591544742609">제목 표시줄 표시</translation>
<translation id="5860491529813859533">사용</translation>
<translation id="5860494867054883682">기기를 <ph name="CHANNEL_NAME" /> 채널로 업데이트 중(<ph name="PROGRESS_PERCENT" />)</translation>
-<translation id="5862109781435984885">실행기에 스타일러스 도구 표시</translation>
+<translation id="5862109781435984885">앱 표시줄에 스타일러스 도구 표시</translation>
<translation id="5862319196656206789">연결된 기기 설정</translation>
<translation id="5862731021271217234">다른 기기에서 탭을 가져오려면 동기화를 사용 설정하세요.</translation>
<translation id="5863445608433396414">디버깅 기능 사용</translation>
@@ -5784,7 +5784,7 @@ https://support.google.com/chromebook/?p=tpm</translation>
<translation id="6195005504600220730">브라우저, OS, 기기에 관한 정보를 확인합니다.</translation>
<translation id="6195155925303302899">가운데 정렬</translation>
<translation id="6195693561221576702">이 기기는 오프라인 데모 모드에서 설정할 수 없습니다.</translation>
-<translation id="6196640612572343990">타사 쿠키 차단</translation>
+<translation id="6196640612572343990">서드 파티 쿠키 차단</translation>
<translation id="6196854373336333322">'<ph name="EXTENSION_NAME" />' 확장 프로그램이 프록시 설정을 제어할 수 있게 되었으며, 따라서 사용자가 온라인에서 수행하는 모든 작업을 변경, 중단하거나 엿볼 수 있게 되었습니다. 이와 같이 변경된 이유를 잘 모른다면 이 설정을 사용하지 않는 것이 좋습니다.</translation>
<translation id="6197128521826316819">이 페이지의 QR 코드 생성</translation>
<translation id="6198252989419008588">PIN 변경</translation>
@@ -6821,7 +6821,7 @@ https://support.google.com/chromebook/?p=tpm</translation>
<translation id="7123302939607518173">특정 항목과 관련된 광고가 유용하다고 생각한다면 관심분야나 사이트를 추가하세요.</translation>
<translation id="7124013154139278147">'이전'에 스위치 할당</translation>
<translation id="7124712201233930202">조직의 정책을 준수하지 않습니다.</translation>
-<translation id="7125029162161377569">개인 정보 보호 샌드박스 무료 체험 기간에는 사이트에서 내 정보를 더 적게 사용하면서도 동일한 인터넷 사용 환경을 제공할 수 있습니다. 즉, 개인 정보 보호는 강화되고 크로스 사이트 추적은 줄어듭니다. 테스트 준비가 완료되는 대로 새로운 무료 체험 프로그램이 추가될 예정입니다.</translation>
+<translation id="7125029162161377569">개인 정보 보호 샌드박스 체험판을 사용하면 사이트에서 내 정보를 더 적게 사용하면서도 동일한 인터넷 사용 환경을 제공할 수 있습니다. 즉, 개인 정보 보호는 강화되고 크로스 사이트 추적은 줄어듭니다. 테스트 준비가 완료되는 대로 새로운 체험 프로그램이 추가될 예정입니다.</translation>
<translation id="7125148293026877011">Crostini 삭제</translation>
<translation id="7127980134843952133">다운로드 기록</translation>
<translation id="7128151990937044829">알림이 차단되면 주소 표시줄에 표시 아이콘 나타내기</translation>
@@ -7259,7 +7259,7 @@ https://support.google.com/chromebook/?p=tpm</translation>
<translation id="7549434883223124329">기기 언어를 전환하시겠습니까?</translation>
<translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation>
<translation id="7551059576287086432"><ph name="FILE_NAME" />을(를) 다운로드하지 못함</translation>
-<translation id="7551643184018910560">실행기에 고정</translation>
+<translation id="7551643184018910560">앱 표시줄에 고정</translation>
<translation id="7552846755917812628">다음 도움말을 확인해 보세요.</translation>
<translation id="7553012839257224005">Linux 컨테이너 확인 중</translation>
<translation id="7553242001898162573">비밀번호를 입력해 주세요.</translation>
@@ -8154,7 +8154,7 @@ https://support.google.com/chromebook/?p=sm</translation>
<translation id="8331822764922665615">그룹 이름을 지정하고 색상을 선택한 후 Esc 키를 누르세요.</translation>
<translation id="833256022891467078">Crostini 공유 폴더</translation>
<translation id="833262891116910667">강조표시</translation>
-<translation id="8335587457941836791">실행기에서 고정 해제</translation>
+<translation id="8335587457941836791">앱 표시줄에서 고정 해제</translation>
<translation id="8336407002559723354"><ph name="MONTH_AND_YEAR" />에 업데이트 종료</translation>
<translation id="8336463659890584292">사이트에서 페이지에 있는 링크를 비공개로 미리 로드해 달라고 요청하면 Chrome은 Google 서버를 사용합니다. 이렇게 하면 미리 로드된 사이트에서 사용자의 신원을 숨길 수 있지만 Google은 어떤 사이트가 미리 로드되는지 학습합니다.</translation>
<translation id="8336739000755212683">기기 계정 이미지 변경</translation>
@@ -8196,7 +8196,7 @@ https://support.google.com/chromebook/?p=sm</translation>
<translation id="8373652277231415614">Crostini 공유 디렉터리</translation>
<translation id="8374243500935816406">사이트에서 모든 디스플레이의 창을 관리하도록 허용 안함</translation>
<translation id="8376137163494131156">Google Cast에 대한 의견을 들려주세요</translation>
-<translation id="8376384591331888629">이 사이트의 타사 쿠키 포함</translation>
+<translation id="8376384591331888629">이 사이트의 서드 파티 쿠키 포함</translation>
<translation id="8376451933628734023">웹 앱이 다른 앱인 것처럼 사용자를 속이려 한다면 앱을 제거하시기 바랍니다.</translation>
<translation id="8377625247046155446">이 패스키는 이 기기에만 저장되며 시크릿 창을 모두 닫은 후에도 이 기기에 남아 있습니다.</translation>
<translation id="8378714024927312812">조직에서 관리</translation>
@@ -8241,7 +8241,7 @@ https://support.google.com/chromebook/?p=sm</translation>
<translation id="8413385045638830869">우선 확인(권장)</translation>
<translation id="8413956290606243087">ChromeOS 내장 스크린 리더인 ChromeVox를 활성화하시겠습니까?</translation>
<translation id="8414249071344507766">이틀 동안 추억 숨김</translation>
-<translation id="8414396119627470038"><ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" />을(를) 통해 <ph name="SITE_ETLD_PLUS_ONE" />에 로그인하세요</translation>
+<translation id="8414396119627470038"><ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" />의 계정으로 <ph name="SITE_ETLD_PLUS_ONE" />에 로그인하세요</translation>
<translation id="8414685983518053656">참고</translation>
<translation id="8416730306157376817"><ph name="BATTERY_PERCENTAGE" />%(케이스)</translation>
<translation id="8417548266957501132">부모 비밀번호</translation>
@@ -8635,7 +8635,7 @@ https://support.google.com/chromebook/?p=sm</translation>
<ph name="DOMAIN" />에서 스마트 카드를 삽입해 둔 상태로 둘 것을 요청합니다.}}</translation>
<translation id="8776294611668764629">파일이 너무 커서 보안 확인이 불가능하기 때문에 조직에서 파일을 차단했습니다. 최대 50MB 크기의 파일을 열 수 있습니다.</translation>
<translation id="8777628254805677039">루트 비밀번호</translation>
-<translation id="8778393144535275552">표시된 데이터 지우기</translation>
+<translation id="8778393144535275552">표시된 데이터 삭제</translation>
<translation id="8779944680596936487">사이트는 사용자의 사이트 내 탐색 활동을 보기 위해서만 쿠키를 사용할 수 있습니다.</translation>
<translation id="8780123805589053431">Google에서 이미지 설명 가져오기</translation>
<translation id="8780443667474968681">음성 검색이 사용 중지되었습니다.</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_ky.xtb b/chromium/chrome/app/resources/generated_resources_ky.xtb
index af05ea2fdf6..03c73a340ae 100644
--- a/chromium/chrome/app/resources/generated_resources_ky.xtb
+++ b/chromium/chrome/app/resources/generated_resources_ky.xtb
@@ -76,7 +76,7 @@
<translation id="1067048845568873861">Түзүлгөн</translation>
<translation id="1067661089446014701">Кошумча коопсуздук үчүн, Google аккаунтуңузга сакталганга чейин сырсөздөрдү түзмөгүңүздө шифрлеңиз</translation>
<translation id="1067922213147265141">Башка Google кызматтары</translation>
-<translation id="106814709658156573">Манжа изин тууралоо үчүн балаңыз баскычтоптун төмөнкү сол жагындагы манжа изинин сенсоруна тийип коюшу керек. Балаңыздын манжасынын изи <ph name="DEVICE_TYPE" /> түзмөгүндө коопсуз сакталат.</translation>
+<translation id="106814709658156573">Манжа изин коюу үчүн балаңыз баскычтоптун төмөнкү сол жагындагы манжа изинин сенсоруна тийип коюшу керек. Балаңыздын манжасынын изи <ph name="DEVICE_TYPE" /> түзмөгүндө коопсуз сакталат.</translation>
<translation id="1069104208554708737">Бул киргизүүчү ачкыч ушул түзмөктө гана сакталат</translation>
<translation id="1069355737714877171"><ph name="PROFILE_NAME" /> деп аталган eSIM-картанын профилин өчүрүү</translation>
<translation id="1069814191880976658">Башка экранды тандоо</translation>
@@ -97,7 +97,7 @@
<translation id="1079766198702302550">Камераны колдонуу мүмкүнчүлүгү ар дайым бөгөттөлсүн</translation>
<translation id="1081956462909987459">{NUM_TABS,plural, =1{<ph name="GROUP_TITLE" /> – 1 өтмөк}other{<ph name="GROUP_TITLE" /> – # өтмөк}}</translation>
<translation id="1082214733466244292">Администраторуңуз бул түзмөктөгү айрым функцияларды бөгөттөп койду</translation>
-<translation id="1082398631555931481"><ph name="THIRD_PARTY_TOOL_NAME" /> Chrome параметрлериңизди демейки жөндөөлөргө кайтарайын деп жатат. Ушуну менен башкы барагыңыз, жаңы өтмөк барагыңыз жана издөө каражатыңыз кайра коюлуп, кеңейтүүлөрүңүз өчүрүлөт жана өтмөктөрдүн баары бошотулат. Мындан тышкары, кукилер, мазмун жана сайт дайындары сыяктуу убактылуу жана кештелген дайындардын баары тазаланат.</translation>
+<translation id="1082398631555931481"><ph name="THIRD_PARTY_TOOL_NAME" /> Chrome параметрлериңизди демейки параметрлерге кайтарайын деп жатат. Ушуну менен башкы барагыңыз, жаңы өтмөк барагыңыз жана издөө каражатыңыз кайра коюлуп, кеңейтүүлөрүңүз өчүрүлөт жана өтмөктөрдүн баары бошотулат. Мындан тышкары, кукилер, мазмун жана сайт дайындары сыяктуу убактылуу жана кештелген дайындардын баары тазаланат.</translation>
<translation id="1082725763867769612">Оффлайн файлдар</translation>
<translation id="1084096383128641877">Бул сырсөздү өзгөртүү менен <ph name="DOMAIN" /> аккаунтуңуз өчпөйт. <ph name="DOMAIN_LINK" /> аккаунтуңузду башкалардан коргоо үчүн сырсөздү өзгөртүңүз же аккаунтуңузду жок кылыңыз.</translation>
<translation id="1084288067399862432">Уурдалган сырсөз ийгиликтүү өзгөртүлдү.
@@ -136,7 +136,7 @@
<translation id="1116639326869298217">Өздүгүңүз ырасталган жок</translation>
<translation id="1116694919640316211">Программа жөнүндө</translation>
<translation id="1116779635164066733">Бул жөндөөнү "<ph name="NAME" />" кеңейтүүсү иштеткен.</translation>
-<translation id="1118738876271697201">Тутум бул түзмөктүн моделин же сериясынын номерин аныктай албай койду.</translation>
+<translation id="1118738876271697201">Система бул түзмөктүн моделин же сериясынын номерин аныктай албай койду.</translation>
<translation id="1119447706177454957">Ички ката</translation>
<translation id="1122068467107743258">Жумуш</translation>
<translation id="1122198203221319518">&amp;Куралдар</translation>
@@ -251,7 +251,7 @@
<translation id="1215411991991485844">Жаңы фондук колдонмо кошулду</translation>
<translation id="1216542092748365687">Манжа изин алып салуу</translation>
<translation id="1216891999012841486">Жаңыртуудагы каталарды оңдоо жөнүндө кеңири маалымат</translation>
-<translation id="1217114730239853757">ChromeOS Flex тутумуна кыстарылган экрандагы нерсени окуп берүүчү ChromeVox куралын иштетесизби? Иштетүү үчүн боштук баскычын басыңыз.</translation>
+<translation id="1217114730239853757">ChromeOS Flex системасына кыстарылган экрандагы нерсени окуп берүүчү ChromeVox куралын иштетесизби? Иштетүү үчүн боштук баскычын басыңыз.</translation>
<translation id="1217483152325416304">Дайындар жакында өчүрүлөт</translation>
<translation id="1217668622537098248">Аракет аткарылгандан кийин сол баскычты чыкылдатууга кайтарылсын</translation>
<translation id="121783623783282548">Сырсөздөр дал келген жок.</translation>
@@ -281,7 +281,7 @@
<translation id="1240903469550363138">Улантуу үчүн <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> аты-жөнүңүздү, электрондук почтаңызды жана профилиңиздин сүрөтүн ушул сайт менен бөлүшөт. Бул сайттын <ph name="BEGIN_LINK1" />купуялык саясатын<ph name="END_LINK1" /> жана <ph name="BEGIN_LINK2" />тейлөө шарттарын<ph name="END_LINK2" /> карап чыгыңыз.</translation>
<translation id="1241066500170667906"><ph name="EXPERIMENT_NAME" /> үчүн сынамык абалды тандаңыз</translation>
<translation id="124116460088058876">Дагы тилдер</translation>
-<translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> жөндөөлөрдү баштапкы абалга келтиргени жатат.</translation>
+<translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> параметрлерди баштапкы абалга келтиргени жатат.</translation>
<translation id="1243314992276662751">Жүктөп берүү</translation>
<translation id="1243436884219965846">Сырсөздөрдү карап чыгуу</translation>
<translation id="1244265436519979884">Учурда Linux калыбына келтирилүүдө</translation>
@@ -300,7 +300,7 @@
<translation id="1258491128795710625">Эмне жаңылык</translation>
<translation id="1259152067760398571">Коопсуздук кечээ текшерилди</translation>
<translation id="1260451001046713751">Калкыма терезелерди көрсөтүү жана <ph name="HOST" /> сайтынан багыттоолорго ар дайым уруксат берилсин</translation>
-<translation id="1260810365552581339">Linux дискинде орун жетишсиз болушу мүмкүн. Linux дискинде орун бошотуп, <ph name="LINK_START" />Жөндөөлөрдөн<ph name="LINK_END" /> кайра калыбына келтирип көрсөңүз болот.</translation>
+<translation id="1260810365552581339">Linux дискинде орун жетишсиз болушу мүмкүн. Linux дискинде орун бошотуп, <ph name="LINK_START" />Параметрлерден<ph name="LINK_END" /> кайра калыбына келтирип көрсөңүз болот.</translation>
<translation id="1261380933454402672">Жөнөкөй</translation>
<translation id="126156426083987769">Түзмөктүн демо режиминин уруксаттамасында маселе келип чыкты.</translation>
<translation id="1263231323834454256">Окуу тизмеси</translation>
@@ -349,7 +349,7 @@
<translation id="1306606229401759371">Параметрлерди өзгөртүү</translation>
<translation id="1307165550267142340">PIN кодуңуз түзүлдү</translation>
<translation id="1307431692088049276">Экинчи суралбасын</translation>
-<translation id="1307559529304613120">Ой! Тутум бул түзмөктүн узак мөөнөттүү API энбелгисин сактап калган жок.</translation>
+<translation id="1307559529304613120">Ой! Система бул түзмөктүн узак мөөнөттүү API энбелгисин сактап калган жок.</translation>
<translation id="131112695174432497">Жарнамаларды жекелештирүүгө таасирин тийгизе турган маалымат өчүрүлдү</translation>
<translation id="1312811472299082263">Камдык көчүрмөсү сакталган Ansible Playbook же Crostini файлынан түзүү</translation>
<translation id="1313264149528821971"><ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, <ph name="PERMISSION_3" /> өчүрүлдү</translation>
@@ -366,7 +366,7 @@
<translation id="1324106254079708331">Жеке Google аккаунттарын максаттуу чабуулдардан коргойт</translation>
<translation id="1327272175893960498">Kerberos билеттери</translation>
<translation id="1327495825214193325">ADB аркылуу мүчүлүштүктөрдү оңдоону иштетүү үчүн бул <ph name="DEVICE_TYPE" /> түзмөгүн өчүрүп, кайра күйгүзүү талап кылынат. Аны өчүрүү үчүн түзмөктү баштапкы абалга кайтаруу керек.</translation>
-<translation id="1327527584824210101">Мүмкүндүк алуу ачкычын колдонуңуз</translation>
+<translation id="1327527584824210101">Киргизүүчү ачкычты колдонуңуз</translation>
<translation id="1327794256477341646">Жайгашкан жериңизди колдонгон функциялар иштебейт</translation>
<translation id="1329466763986822896">Бул байланыш түйүнүнүн купуялыгын арттыруу</translation>
<translation id="1331977651797684645">Ал мен болчумун.</translation>
@@ -409,7 +409,7 @@
<translation id="1373176046406139583">Түзмөктүн көрүнүү параметрлери экраныңыздын кулпусу ачылып турганда сиз менен файлдарды ким бөлүшө аларын көзөмөлдөйт. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation>
<translation id="1374844444528092021">"<ph name="NETWORK_NAME" />" тармагы талап кылган тастыктама же орнотулган эмес, же жарактан чыккан. Жаңы тастыктама алып, кайра туташып көрүңүз.</translation>
<translation id="1375321115329958930">Сакталган сырсөздөр</translation>
-<translation id="1375557162880614858">ChromeOS Flex тутумуна кыстарылган экрандагы нерсени окуп берүүчү ChromeVox куралын иштетесизби?</translation>
+<translation id="1375557162880614858">ChromeOS Flex системасына кыстарылган экрандагы нерсени окуп берүүчү ChromeVox куралын иштетесизби?</translation>
<translation id="1375938286942050085">Орнотулду! Түзмөгүңүздү ойногонго даярдап алыңыз</translation>
<translation id="137651782282853227">Сакталган даректер бул жерде көрүнөт</translation>
<translation id="1376771218494401509">&amp;Терезенин аталышын коюңуз...</translation>
@@ -524,7 +524,7 @@
<translation id="1463112138205428654"><ph name="FILE_NAME" /> Өркүндөтүлгөн коргоо тарабынан бөгөттөлдү.</translation>
<translation id="1464044141348608623">Сайттарга түзмөктү активдүү колдонуп жатканыңыз тууралуу маалыматты алууга тыюу салуу</translation>
<translation id="1464258312790801189">Каттоо эсептериңиз</translation>
-<translation id="1464781208867302907">Түзмөктөгү жеке жөндөөлөрдү өзгөртүү үчүн жөндөөлөргө өтүңүз.</translation>
+<translation id="1464781208867302907">Түзмөктөгү жеке параметрлерди өзгөртүү үчүн параметрлерге өтүңүз.</translation>
<translation id="1465176863081977902">А&amp;удио дарегин көчүрүү</translation>
<translation id="1465827627707997754">Бир кесим пицца</translation>
<translation id="1467432559032391204">Сол</translation>
@@ -544,7 +544,7 @@
<translation id="1478340334823509079">Чоо-жайы: <ph name="FILE_NAME" /></translation>
<translation id="1478607704480248626">Орнотуу иштетилген эмес</translation>
<translation id="1480571698637441426">Суроо бергенде ылайыктуу жоопторду алуу үчүн Жардамчыңызга экраныңыздагы нерсенин скриншотуна мүмкүнчүлүк бериңиз. Буга учурда ойноп жаткан ырлар же видеолор жөнүндө маалымат да кириши мүмкүн.</translation>
-<translation id="1480663089572535854">Артка кайтып, “Тандоо” аракети үчүн дайындоону өзгөртүп койсоңуз болот. Жөндөөлөргө өтүп, автоматтык түрдө скандоону каалаган убакта өчүрө аласыз.</translation>
+<translation id="1480663089572535854">Артка кайтып, “Тандоо” аракети үчүн дайындоону өзгөртүп койсоңуз болот. Параметрлерге өтүп, автоматтык түрдө скандоону каалаган убакта өчүрө аласыз.</translation>
<translation id="1481537595330271162">Дисктин өлчөмүн өзгөртүүдө ката кетти</translation>
<translation id="1482626744466814421">Бул өтмөктү кыстарып коюу…</translation>
<translation id="1482772681918035149">сырсөздөрдү түзөтүү</translation>
@@ -966,14 +966,14 @@
<translation id="1827504459960247692">Байланыш түйүнүнүн аталышы</translation>
<translation id="1828378091493947763">Бул плагин бул түзмөктө колдоого алынбайт</translation>
<translation id="1828879788654007962">{COUNT,plural, =0{&amp;Баарын ачуу}=1{&amp;Кыстарманы ачуу}other{&amp;Баарын ачуу ({COUNT})}}</translation>
-<translation id="1828901632669367785">Тутум диалогу аркылуу басып чыгаруу…</translation>
+<translation id="1828901632669367785">Система диалогу аркылуу басып чыгаруу…</translation>
<translation id="1829129547161959350">Пингвин</translation>
<translation id="1829192082282182671">Ки&amp;чирейтүү</translation>
<translation id="1830550083491357902">Кирген жоксуз</translation>
<translation id="1831848493690504725">Туташкан тармак аркылуу Google'га кире албай жатабыз. Башка тармакты тандап, тармактын же проксинин параметрлерин (эгер проксини колдонуп жатсаңыз) текшерип көрүңүз.</translation>
<translation id="1832459821645506983">Макул</translation>
<translation id="1832511806131704864">Телефонду өзгөртүү жаңырды</translation>
-<translation id="1832848789136765277">Шайкештирилген маалыматыңызга каалаган убакта кирүү үчүн бул сиз экениңизди ырастаңыз</translation>
+<translation id="1832848789136765277">Шайкештирилген маалыматыңызга каалаган убакта кирүү үчүн өзүңүздү ырастаңыз</translation>
<translation id="1834503245783133039">Жүктөлүп алынбай калды: <ph name="FILE_NAME" /></translation>
<translation id="1835261175655098052">Linux'ту жаңыртуу</translation>
<translation id="1835612721186505600">Колдонмолорго жана вебсайттарга камераны пайдаланууга уруксат берүү</translation>
@@ -998,7 +998,7 @@
<ph name="BEGIN_PARAGRAPH3" />TPM параметрлериңизди өзгөртүү үчүн түзмөктү өчүрүп-күйгүзүп, системанын BIOS/UEFI параметрлерине кириңиз. Кадамдар түзмөктүн үлгүсүнө жараша айырмаланат. Кеңири маалымат алуу үчүн өчүрүп-күйгүзүүдөн мурун <ph name="DEVICE_OS" /> документтерин өзүнчө түзмөктө ачыңыз: g.co/flex/TPMHelp.<ph name="END_PARAGRAPH3" /></translation>
<translation id="1852141627593563189">Кооптуу программаны табыңыз</translation>
<translation id="1852799913675865625">Файлды окуюн дегенде ката кетти: <ph name="ERROR_TEXT" />.</translation>
-<translation id="1854049213067042715">Токтогон жериңизден улантасыз. Жөндөөлөрдөн колдонмолорду иштеп баштаганда калыбына келтире тургандай кылып жөндөп же аларды калыбына келтирүүнү өчүрө аласыз.</translation>
+<translation id="1854049213067042715">Токтогон жериңизден улантасыз. Параметрлерден колдонмолорду иштеп баштаганда калыбына келтире тургандай кылып жөндөп же аларды калыбына келтирүүнү өчүрө аласыз.</translation>
<translation id="1854180393107901205">Тышкы экранга чыгарууну токтотуу</translation>
<translation id="1856715684130786728">Жайгашкан жерди кошуу…</translation>
<translation id="1858585891038687145">Программаларды иштеп чыгуучулардын аныктыгын текшерүүдө ушул тастыктаманы ишенимдүү деп белгилеңиз</translation>
@@ -1048,9 +1048,9 @@
<translation id="1892341345406963517">Салам <ph name="PARENT_NAME" />!</translation>
<translation id="189358972401248634">Башка тилдер</translation>
<translation id="1895658205118569222">Ишти бүтүрүү</translation>
-<translation id="1896043844785689584">Манжа изин тууралоо үчүн балаңыз баскычтоптун төмөнкү оң жагындагы манжа изинин сенсоруна тийип коюшу керек. Балаңыздын манжасынын изи <ph name="DEVICE_TYPE" /> түзмөгүндө коопсуз сакталат.</translation>
+<translation id="1896043844785689584">Манжа изин коюу үчүн балаңыз баскычтоптун төмөнкү оң жагындагы манжа изинин сенсоруна тийип коюшу керек. Балаңыздын манжасынын изи <ph name="DEVICE_TYPE" /> түзмөгүндө коопсуз сакталат.</translation>
<translation id="1897120393475391208">Татаал сырсөздү колдонуу</translation>
-<translation id="1900305421498694955">Google Play'деги колдонмолор файлдарды тышкы сактагыч түзмөктөрүндө окуп, жазуу үчүн файл тутумуна толук мүмкүнчүлүк берүүнү талап кылышы мүмкүн. Түзмөктө түзүлгөн файлдар жана папкалар тышкы драйверди колдонгон ар бир кишиге көрүнүктүү болот. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation>
+<translation id="1900305421498694955">Google Play'деги колдонмолор файлдарды тышкы сактагыч түзмөктөрүндө окуп, жазуу үчүн файл системасына толук мүмкүнчүлүк берүүнү талап кылышы мүмкүн. Түзмөктө түзүлгөн файлдар жана папкалар тышкы драйверди колдонгон ар бир кишиге көрүнүктүү болот. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation>
<translation id="1901213235765457754">Администратордон бул колдонмону жаңыртууну сураныңыз</translation>
<translation id="1901303067676059328">&amp;Баарын тандоо</translation>
<translation id="1903995858055162096">Түзмөк сиздики эмеспи? <ph name="BEGIN_LINK" />Конок режимин<ph name="END_LINK" /> колдонуңуз.</translation>
@@ -1068,7 +1068,7 @@
<translation id="1915734383465415025">Дүкөндүн номери</translation>
<translation id="1916502483199172559">Демейки кызыл аватар</translation>
<translation id="1918141783557917887">&amp;Кичирээк</translation>
-<translation id="1919872106782726755">Манжа изин тууралоо үчүн балаңыз баскычтоптун жогорку оң жагындагы, Кубат баскычынын тушундагы манжа изинин сенсоруна тийип коюушу керек. Балаңыздын манжасынын изи<ph name="DEVICE_TYPE" /> түзмөгүңүздө коопсуз сакталат.</translation>
+<translation id="1919872106782726755">Манжа изин коюу үчүн балаңыз баскычтоптун жогорку оң жагындагы, Кубат баскычынын тушундагы манжа изинин сенсоруна тийип коюушу керек. Балаңыздын манжасынын изи<ph name="DEVICE_TYPE" /> түзмөгүңүздө коопсуз сакталат.</translation>
<translation id="1920390473494685033">Байланыштар</translation>
<translation id="1921544956190977703">Кооптуу вебсайттардан, жүктөлүп алынган файлдардан жана кеңейтүүлөрдөн Chrome'дун эң күчтүү коопсуздук тутуму коргойт</translation>
<translation id="1921584744613111023"><ph name="DPI" /> dpi</translation>
@@ -1079,7 +1079,7 @@
<translation id="1925021887439448749">Жеке веб дарегин киргизиңиз</translation>
<translation id="1925124445985510535">Коопсуздук саат <ph name="TIME" /> текшерилди</translation>
<translation id="192564025059434655">Chrome колдонмолорунун эски версиялары 2022-жылдын декабрь айынан кийин Windows түзмөктөрүндө ачылбай калышат. Жаңы версиясы жеткиликтүү экенин текшерсеңиз болот.</translation>
-<translation id="1926339101652878330">Бул жөндөөлөрдү ишкана саясаты көзөмөлдөйт. Көбүрөөк маалымат алуу үчүн администраторуңузга кайрылыңыз.</translation>
+<translation id="1926339101652878330">Бул параметрлерди ишкана саясаты көзөмөлдөйт. Көбүрөөк маалымат алуу үчүн администраторуңузга кайрылыңыз.</translation>
<translation id="1927632033341042996"><ph name="NEW_FINGER_NUMBER" />-манжа изи</translation>
<translation id="192817607445937251">Экранды кулпулоо PIN коду</translation>
<translation id="1928696683969751773">Жаңыртуулар</translation>
@@ -1208,7 +1208,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="2048554637254265991">Контейнерди башкаруучуну иштетүүдө ката кетти. Кайталап көрүңүз.</translation>
<translation id="2048653237708779538">Аракет жеткиликсиз</translation>
<translation id="204914487372604757">Кыска жол түзүү</translation>
-<translation id="2050339315714019657">Тигинен</translation>
+<translation id="2050339315714019657">Портрет</translation>
<translation id="2051555741181591333">Байланыш түйүнүн автоматтык түрдө өчүрүү</translation>
<translation id="2052572566310583903">Башка түзмөктөрүңүздө орнотулган</translation>
<translation id="2053105195397337973">Сайттарга жарнама спамын жана шылуундукту токтотуу мүмкүнчүлүгүн берүү менен көз салууну чектөө жолдорун изилдеп жатабыз.</translation>
@@ -1243,7 +1243,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="208586643495776849">Кайталап көрүңүз</translation>
<translation id="208634871997892083">Ар дайым күйүк VPN</translation>
<translation id="2087822576218954668">Басып чыгаруу: <ph name="PRINT_NAME" /></translation>
-<translation id="2088092308059522196"><ph name="DEVICE_OS" /> тутумун орноткондон кийин гана катталууга болот.</translation>
+<translation id="2088092308059522196"><ph name="DEVICE_OS" /> системасын орноткондон кийин гана катталууга болот.</translation>
<translation id="2089090684895656482">Азыраак</translation>
<translation id="208928984520943006">Башкы экранга каалаган убакта өтүү үчүн экранды ылдыйдан өйдө сүрүңүз.</translation>
<translation id="2089566709556890888">Google Chrome менен коопсуз серептөө</translation>
@@ -1256,13 +1256,13 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<ph name="BR" />
Түзмөгүңүзгө колдонуучуга ыңгайлаштырылган кодду орнотуп, сыноо үчүн ChromeOS түзмөгүңүздөн мүчүлүштүктөрдү оңдоо функцияларын иштетсеңиз болот. Ал төмөнкүлөргө жол ачат:<ph name="BR" />
<ph name="BEGIN_LIST" />
- <ph name="LIST_ITEM" />OS файлдарын өзгөртүү үчүн тамырдык файлдар тутумун текшерүүнү алып салыңыз;
+ <ph name="LIST_ITEM" />OS файлдарын өзгөртүү үчүн тамырдык файлдар системасын текшерүүнү алып салыңыз;
<ph name="LIST_ITEM" />Түзмөккө кирүү үчүн <ph name="BEGIN_CODE" />"'cros flash"<ph name="END_CODE" /> сыяктуу куралдарды колдонуп, стандарттык сыноо ачкычтары менен түзмөктө SSH пайдалануу мүмкүнчүлүгүн иштетиңиз;
<ph name="LIST_ITEM" />OS сүрөтүн USB дисктен орнотуу үчүн USB аркылуу жүктөөнү иштетиңиз;
<ph name="LIST_ITEM" />Түзмөккө кол менен SSH орнотуу үчүн иштеп чыгуучулар жана тутум үчүн башкы колдонуучунун сырсөзүн өзгөртүңүз.
<ph name="END_LIST" />
<ph name="BR" />
- Иштетилгенден кийин, мүчүлүштүктөрдү оңдоо функциясы дайындар ишканага караштуу түзмөктөн жуулганда же тазаланганда да иштеген бойдон кала берет. Мүчүлүштүктөрдү оңдоо функцияларын толук өчүрүү үчүн ChromeOS тутумун калыбына келтирүү процессин аткарыңыз (https://support.google.com/chromebook/answer/1080595).
+ Иштетилгенден кийин, мүчүлүштүктөрдү оңдоо функциясы дайындар ишканага караштуу түзмөктөн жуулганда же тазаланганда да иштеген бойдон кала берет. Мүчүлүштүктөрдү оңдоо функцияларын толук өчүрүү үчүн ChromeOS системасын калыбына келтирүү процессин аткарыңыз (https://support.google.com/chromebook/answer/1080595).
<ph name="BR" />
<ph name="BR" />
Мүчүлүштүктөрдү оңдоо функциялары боюнча көбүрөөк маалымат үчүн төмөнкүнү караңыз:<ph name="BR" />
@@ -1470,7 +1470,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="2266957463645820432">USB аркылуу IPP (IPPUSB)</translation>
<translation id="2268130516524549846">Bluetooth өчүрүлдү</translation>
<translation id="2270450558902169558"><ph name="DOMAIN" /> домениндеги каалаган түзмөк менен дайындарды алмашуу</translation>
-<translation id="2270612886833477697"><ph name="BEGIN_PARAGRAPH1" />Тутумду орнотсоңуз, <ph name="BEGIN_BOLD" />катуу дискиңиз толугу менен тазаланат<ph name="END_BOLD" />. Дайын-даректериңиздин камдык көчүрмөсү сакталганын текшериңиз.<ph name="END_PARAGRAPH1" />
+<translation id="2270612886833477697"><ph name="BEGIN_PARAGRAPH1" />Системаны орнотсоңуз, <ph name="BEGIN_BOLD" />катуу дискиңиз толугу менен тазаланат<ph name="END_BOLD" />. Дайын-даректериңиздин камдык көчүрмөсү сакталганын текшериңиз.<ph name="END_PARAGRAPH1" />
<ph name="BEGIN_PARAGRAPH2" />Орнотулуп баштагандан кийин аны жокко чыгарууга болбойт.<ph name="END_PARAGRAPH2" /></translation>
<translation id="2270627217422354837">Домендердеги каалаган түзмөк менен дайындарды алмашуу: <ph name="DOMAINS" /></translation>
<translation id="2270666014403455717">“Тандоо” үчүн которгучту дайындоо</translation>
@@ -1495,7 +1495,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="2292848386125228270"><ph name="PRODUCT_NAME" /> кызматын кадимки колдонуучу катары жандырыңыз. Эгер ага суперколдонуучу катары киргиңиз келсе, браузердин параметрин "--no-sandbox" деп белгилеп, кайра жандырыңыз.</translation>
<translation id="2294081976975808113">Экрандын купуялыгы</translation>
<translation id="2294358108254308676"><ph name="PRODUCT_NAME" /> орнотосузбу?</translation>
-<translation id="229477815107578534">Жөндөөлөрдү карап чыгыңыз</translation>
+<translation id="229477815107578534">Параметрлерди карап чыгыңыз</translation>
<translation id="2295864384543949385"><ph name="NUM_RESULTS" /> нерсе табылды</translation>
<translation id="2296022312651137376"><ph name="DOMAIN_NAME" /> саясаты боюнча, <ph name="EMAIL" /> аккаунтуна кирүү үчүн түзмөк Интернетке туташып турушу керек</translation>
<translation id="2296218178174497398">Түзмөктү табуу</translation>
@@ -1512,13 +1512,13 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<ph name="BR" />
Түзмөгүңүзгө колдонуучуга ыңгайлаштырылган кодду орнотуп, сыноо үчүн ChromeOS Flex түзмөгүңүздөн мүчүлүштүктөрдү оңдоо функцияларын иштетсеңиз болот. Ал төмөнкүлөргө жол ачат:<ph name="BR" />
<ph name="BEGIN_LIST" />
- <ph name="LIST_ITEM" />OS файлдарын өзгөртүү үчүн тамырдык файлдар тутумун текшерүүнү алып салыңыз;
+ <ph name="LIST_ITEM" />OS файлдарын өзгөртүү үчүн тамырдык файлдар системасын текшерүүнү алып салыңыз;
<ph name="LIST_ITEM" />Түзмөккө кирүү үчүн <ph name="BEGIN_CODE" />"'cros flash"<ph name="END_CODE" /> сыяктуу куралдарды колдонуп, стандарттык сыноо ачкычтары менен түзмөктө SSH пайдалануу мүмкүнчүлүгүн иштетиңиз;
<ph name="LIST_ITEM" />OS сүрөтүн USB дисктен орнотуу үчүн USB аркылуу жүктөөнү иштетиңиз;
<ph name="LIST_ITEM" />Түзмөккө кол менен SSH орнотуу үчүн иштеп чыгуучулар жана тутум үчүн башкы колдонуучунун сырсөзүн өзгөртүңүз.
<ph name="END_LIST" />
<ph name="BR" />
- Иштетилгенден кийин, мүчүлүштүктөрдү оңдоо функциясы дайындар ишканага караштуу түзмөктөн жуулганда же тазаланганда да иштеген бойдон кала берет. Мүчүлүштүктөрдү оңдоо функцияларын толук өчүрүү үчүн ChromeOS тутумун калыбына келтирүү процессин аткарыңыз (https://support.google.com/chromebook/answer/1080595).
+ Иштетилгенден кийин, мүчүлүштүктөрдү оңдоо функциясы дайындар ишканага караштуу түзмөктөн жуулганда же тазаланганда да иштеген бойдон кала берет. Мүчүлүштүктөрдү оңдоо функцияларын толук өчүрүү үчүн ChromeOS системасын калыбына келтирүү процессин аткарыңыз (https://support.google.com/chromebook/answer/1080595).
<ph name="BR" />
<ph name="BR" />
Мүчүлүштүктөрдү оңдоо функциялары боюнча көбүрөөк маалымат үчүн төмөнкүнү караңыз:<ph name="BR" />
@@ -1574,7 +1574,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="2336381494582898602">Жууп салуу</translation>
<translation id="2337236196941929873">Chrome сизди баш багат деп болжолдогон барактарды алдын ала жүктөйт. Ал үчүн Chrome cookie файлдарын (эгер уруксат берсеңиз) колдонуп, өздүгүңүздү сайттардан жашыруу үчүн барактарды шифрлеп, Google аркылуу жөнөтүшү мүмкүн.</translation>
<translation id="2340239562261172947"><ph name="FILE_NAME" /> файлын коопсуз жүктөп алууга болбойт</translation>
-<translation id="2342180549977909852">Бул түзмөктү ачуу үчүн балаңыз сырсөздүн ордуна номерди (PIN кодду) колдоно алат. PIN кодду кийинчерээк Жөндөөлөргө өтүп, жөндөңүз.</translation>
+<translation id="2342180549977909852">Бул түзмөктү ачуу үчүн балаңыз сырсөздүн ордуна номерди (PIN кодду) колдоно алат. PIN кодду кийинчерээк Параметрлерге өтүп, жөндөңүз.</translation>
<translation id="2342740338116612727">Кыстармалар кошулду</translation>
<translation id="2343747224442182863">Бул өтмөктү фокустоо</translation>
<translation id="2344032937402519675">Серверге туташпай калды. Тармакка туташууңузду текшерип, дагы бир жолу аракет кылыңыз. Эгер маселе чечилбесе, Chromebook'ту өчүрүп күйгүзүп көрүңүз.</translation>
@@ -1624,7 +1624,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="2377667304966270281">Татаал бузулуулар</translation>
<translation id="237828693408258535">Бул баракча которулсунбу?</translation>
<translation id="2378982052244864789">Кеңейтүү каталогун тандаңыз.</translation>
-<translation id="2379281330731083556">Тутум диалогу аркылуу басып чыгаруу… <ph name="SHORTCUT_KEY" /></translation>
+<translation id="2379281330731083556">Система диалогу аркылуу басып чыгаруу… <ph name="SHORTCUT_KEY" /></translation>
<translation id="2381499968174336913">Бөлүшүлгөн өтмөктөрдү алдын ала көрүү</translation>
<translation id="2381756643783702095">Жөнөтүүдөн мурун суроо (сунушталат)</translation>
<translation id="2383825469508278924">Баскычтоптогу дайындалган баскычтарды, функциялык баскычтарды жана башкаларды өзгөртүү</translation>
@@ -1679,7 +1679,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="2439626940657133600"><ph name="WINDOW_TITLE" /> жүктөлүүдө</translation>
<translation id="2440604414813129000">&amp;Булакты карап көрүү</translation>
<translation id="2440823041667407902">Жайгашкн жерд көрп туруу</translation>
-<translation id="2441719842399509963">Жөндөөлөрдү кайра коюу</translation>
+<translation id="2441719842399509963">Параметрлерди кайра коюу</translation>
<translation id="244231003699905658">Дарек жараксыз. Даректи текшерип, кайталап көрүңүз.</translation>
<translation id="2442916515643169563">Текстти көлөкөлөтүү</translation>
<translation id="2443487764245141020">Сайттар идентификаторду колдонуп жаткан түзмөгүңүздү да таанышы керек</translation>
@@ -1741,7 +1741,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="2487067538648443797">Жаңы кыстарма кошуу</translation>
<translation id="2487268545026948104">Маалыматты калыбына келтирүү үчүн Интернетке туташыңыз</translation>
<translation id="2489686758589235262">Дагы 2 которгучту дайындоо</translation>
-<translation id="2489829450872380594">Эми <ph name="DEVICE_TYPE" /> түзмөгүнүн кулпусун жаңы телефон менен ача аласыз. Жөндөөлөргө өтүп, Smart Lock'ту өчүрүп койсоңуз болот.</translation>
+<translation id="2489829450872380594">Эми <ph name="DEVICE_TYPE" /> түзмөгүнүн кулпусун жаңы телефон менен ача аласыз. Параметрлерге өтүп, Smart Lock'ту өчүрүп койсоңуз болот.</translation>
<translation id="2489918096470125693">&amp;Куржун кошуу…</translation>
<translation id="2489931062851778802">Бул ачкычтарды <ph name="DEVICE_NAME" /> түзмөгүндө киргизиңиз</translation>
<translation id="2490481887078769936">"<ph name="FILE_NAME" />" тизмеден өчүрүлдү</translation>
@@ -1780,7 +1780,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="2520644704042891903">Мүмкүн болгон чанак күтүлүүдө…</translation>
<translation id="2521854691574443804"><ph name="FILE_NAME" /> файлы уюмуңуздун коопсуздук саясаттарын бузгандыгы текшерилүүдө...</translation>
<translation id="2523184218357549926">Баш баккан барактарыңыздын URL'дерин Google'га жөнөтөт</translation>
-<translation id="252418934079508528"><ph name="DEVICE_OS" /> тутумун орнотуп алыңыз</translation>
+<translation id="252418934079508528"><ph name="DEVICE_OS" /> системасын орнотуп алыңыз</translation>
<translation id="2526590354069164005">Иштакта</translation>
<translation id="2526619973349913024">Жаңыртууларды карап көрүү</translation>
<translation id="2527167509808613699">Туташуунун бардык түрү</translation>
@@ -1853,7 +1853,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="2587922766792651800">Күтүү убакыты аяктады</translation>
<translation id="2588636910004461974">Камсыздоочунун (<ph name="VENDOR_NAME" />) түзмөктөрү</translation>
<translation id="25899519884572181">Окугуч режиминен чыгуу</translation>
-<translation id="2593499352046705383">Баштоодон мурун дайын-даректериңиздин камдык көчүрмөсүн сактап койгонуңузду текшериңиз. <ph name="DEVICE_OS" /> тутумун орнотсоңуз, катуу дискиңиз кайрадан жазылат. Кеңири маалымат: g.co/flex/InstallGuide.</translation>
+<translation id="2593499352046705383">Баштоодон мурун дайын-даректериңиздин камдык көчүрмөсүн сактап койгонуңузду текшериңиз. <ph name="DEVICE_OS" /> системасын орнотсоңуз, катуу дискиңиз кайрадан жазылат. Кеңири маалымат: g.co/flex/InstallGuide.</translation>
<translation id="2594999711683503743">Google'дан издеңиз же URL'ди териңиз</translation>
<translation id="2599048253926156421">Колдонуучунун аты алмашуу буферине көчүрүлдү</translation>
<translation id="2602501489742255173">Баштоо үчүн, өйдө сүрүп коюңуз</translation>
@@ -1862,7 +1862,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="2604129989323098489">Адатта сайттар документтерди же толук экрандагы контентти жанаша көрсөтүү сыяктуу терезелерди ачып, аракеттерди акылуу жолдор менен аткаруу үчүн экрандарыңыз жөнүндө маалыматты сурашат</translation>
<translation id="2604255671529671813">Тармакка туташуу катасы</translation>
<translation id="2604805099836652105"><ph name="ADDRESS_LABEL" /> дареги толтурулду.</translation>
-<translation id="2605668923777146443">Better Together функциясынын параметрлерин көрүү үчүн <ph name="LINK_BEGIN" />Жөндөөлөргө<ph name="LINK_END" /> өтүңүз.</translation>
+<translation id="2605668923777146443">Better Together функциясынын параметрлерин көрүү үчүн <ph name="LINK_BEGIN" />Параметрлерге<ph name="LINK_END" /> өтүңүз.</translation>
<translation id="2606246518223360146">Дайындарды байланыштыруу</translation>
<translation id="2606454609872547359">Жок, ChromeVox жок эле улантам</translation>
<translation id="2606568927909309675">Англис тилиндеги аудио жана видеолор үчүн коштомо жазууларды автоматтык түрдө түзөт. Аудио менен коштомо жазуулар түзмөгүңүздө гана сакталат.</translation>
@@ -1880,7 +1880,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="2618797463720777311">Nearby Share функциясын тууралоо</translation>
<translation id="2620215283731032047"><ph name="FILE_NAME" /> файлын коопсуз жүктөп алууга болбойт.</translation>
<translation id="2620245777360407679">Учурда хотспотко туташып турган түзмөктөр</translation>
-<translation id="2620436844016719705">Тутум</translation>
+<translation id="2620436844016719705">Система</translation>
<translation id="262154978979441594">Google Жардамчыга үнүңүздүн үлгүсүн үйрөтүңүз</translation>
<translation id="26224892172169984">Бир да сайт протокол жүргүзбөсүн</translation>
<translation id="262373406453641243">Colemak</translation>
@@ -2027,7 +2027,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="2740876196999178364">Бул киргизүүчү ачкычтар ушул түзмөктө гана сакталат. Алар Google аккаунтуңузда сакталбайт.</translation>
<translation id="2741713322780029189">Калыбына келтирүү терминалын ачуу</translation>
<translation id="2741912629735277980">Колдонуучу интерфейсин кирүү экранында чагылдыруу</translation>
-<translation id="2742448780373473567"><ph name="DEVICE_OS" /> тутумун орнотсоңуз, түзмөгүңүздөгү бардык дайын-даректер кайрадан жазылат.</translation>
+<translation id="2742448780373473567"><ph name="DEVICE_OS" /> системасын орнотсоңуз, түзмөгүңүздөгү бардык дайын-даректер кайрадан жазылат.</translation>
<translation id="274290345632688601">Linux колдонмолору менен файлдарын калыбына келтирүү...</translation>
<translation id="274318651891194348">Баскычтоп изделүүдө</translation>
<translation id="2743301740238894839">Баштоо</translation>
@@ -2162,7 +2162,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="2852385257476173980">Интернетти карап чыккан сайын сиз баш баккан сайттардын тизмеси ушул жерде көрсөтүлүшү мүмкүн</translation>
<translation id="285241945869362924">Аудио жана видеолор үчүн коштомо жазууларды автоматтык түрдө түзөт. Аудио менен коштомо жазуулар түзмөгүңүздө гана сакталат.</translation>
<translation id="2856776373509145513">Жаңы контейнер түзүү</translation>
-<translation id="2861301611394761800">Тутум жаңырды. Тутумду өчүрүп күйгүзүңүз.</translation>
+<translation id="2861301611394761800">Система жаңырды. Системаны өчүрүп күйгүзүңүз.</translation>
<translation id="2861941300086904918">Түпнуска Кардардын коопсуздугун башкаргыч</translation>
<translation id="2862815659905780618">Linux'ту өнүктүрүү чөйрөсүн өчүрүү</translation>
<translation id="2864601841139725659">Профилиңиздин сүрөтүн коюп алыңыз</translation>
@@ -2389,7 +2389,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="3054766768827382232">Өчүрсөңүз, перифериялык жөндөөлөр жакшыраак иштейт, бирок уруксатсыз колдонуудан улам, жеке маалыматыңыз көрүнүп калышы мүмкүн.</translation>
<translation id="3055113921564083271">Өчүрүп койгон кызыккан нерселериңиз</translation>
<translation id="3055590424724986000">Сиз каалаган кызмат көрсөтүүчү менен</translation>
-<translation id="3058498974290601450">Шайкештирүүнү каалаган убакта жөндөөлөргө өтүп, күйгүзүп койсоңуз болот</translation>
+<translation id="3058498974290601450">Шайкештирүүнү каалаган убакта параметрлерге өтүп, күйгүзүп койсоңуз болот</translation>
<translation id="3058517085907878899">Түзмөктүн аталышын коюу</translation>
<translation id="3059195548603439580">Системанын компонеттерин издеп жатасызбы? Төмөнкүгө өтүңүз:</translation>
<translation id="3060952009917586498">Түзмөктүн тилин өзгөртүү. Учурдагы тил: <ph name="LANGUAGE" />.</translation>
@@ -2459,7 +2459,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="3126026824346185272">Ctrl</translation>
<translation id="3127860049873093642">Батареяны кубаттоо жана майнаптуулук маселелеринин алдын алуу үчүн шайкеш келген Dell же С тибиндеги USB кубаттагыч адаптерин колдонуңуз.</translation>
<translation id="3127862849166875294">Linux дискинин өлчөмүн өзгөртүү</translation>
-<translation id="3127882968243210659">Google Play'ди иштетүү үчүн <ph name="MANAGER" /> дайын-даректериңиздин камдык көчүрмөсүн сактап, Chromebook'ту демейки жөндөөлөргө кайтарууну талап кылууда.</translation>
+<translation id="3127882968243210659">Google Play'ди иштетүү үчүн <ph name="MANAGER" /> дайын-даректериңиздин камдык көчүрмөсүн сактап, Chromebook'ту демейки параметрлерге кайтарууну талап кылууда.</translation>
<translation id="3129173833825111527">Сол жак чети</translation>
<translation id="3129215702932019810">Колдонмону иштетүү катасы</translation>
<translation id="3130528281680948470">Түзмөгүңүз баштапкы абалга келтирилип, колдонуучу аккаунттарынын жана жергиликтүү дайындандын баары өчөт. Бул аракетти артка кайтаруу мүмкүн эмес.</translation>
@@ -2521,7 +2521,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="3190558889382726167">Сырсөз сакталды</translation>
<translation id="3192589799003798742">Chromebook'тагы Steam'ди тууралоо</translation>
<translation id="3192947282887913208">Аудио файлдар</translation>
-<translation id="3193695589337931419">Тутум сигналдарынын кызматтык программалары</translation>
+<translation id="3193695589337931419">Система сигналдарынын кызматтык программалары</translation>
<translation id="3194786596445804250">Үчүнчү тараптын cookie файлдарын бөгөттөө жөнүндө маалыматты көрсөтүү</translation>
<translation id="3197453258332670132">Чычкандын оң баскычын чыкылдатып же коё бербей басып турсаңыз, текстти тандоо үчүн тийиштүү маалымат көрүнөт</translation>
<translation id="3199127022143353223">Серверлер</translation>
@@ -2652,9 +2652,9 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="3319306431415395200">Сүрөттөгү текстти <ph name="VISUAL_SEARCH_PROVIDER" /> менен которуу</translation>
<translation id="3320630259304269485">Коопсуз серептөө (кооптуу сайттардан коргоо) жана башка коопсуздук параметрлери</translation>
<translation id="3323521181261657960">Бонус! Түзмөктү колдонуу убакыты узарды</translation>
-<translation id="3323577066981719144">Бул жерде киргизген өзгөртүүлөрүңүз Chrome серепчисине карата гана колдонулат. Lacros Chrome серепчисинин параметрлерине өзгөрүүлөрдү киргизүү үчүн Lacros Chrome серепчисин ачып, жөндөөлөргө өтүңүз.</translation>
+<translation id="3323577066981719144">Бул жерде киргизген өзгөртүүлөрүңүз Chrome серепчисине карата гана колдонулат. Lacros Chrome серепчисинин параметрлерине өзгөрүүлөрдү киргизүү үчүн Lacros Chrome серепчисин ачып, параметрлерге өтүңүз.</translation>
<translation id="3325804108816646710">Жеткиликтүү профилдер изделүүдө…</translation>
-<translation id="3325910708063135066">Камера менен микрофон Mac'тын Тутум параметрлеринен өчүрүлдү</translation>
+<translation id="3325910708063135066">Камера менен микрофон Mac'тын Система параметрлеринен өчүрүлдү</translation>
<translation id="3327050066667856415">Chromebook'тар коопсуздукту коргоо үчүн жасалган. Түзмөгүңүз кесепеттүү программалардан автоматтык түрдө корголот – кошумча программаны орнотуунун кереги жок.</translation>
<translation id="3328489342742826322">Камдык көчүрмөнү калыбына келтирүү менен, учурдагы Linux колдонмолору менен Linux файлдар папкасындагы бардык маалыматтар өчүрүлөт.</translation>
<translation id="3329013043687509092">Каныктыруу</translation>
@@ -2706,7 +2706,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="3378627645871606983">Steam'ге берилген уруксаттар бардык Steam оюндарына жана колдонмолоруна карата колдонулат.</translation>
<translation id="337920581046691015"><ph name="PRODUCT_NAME" /> орнотулат.</translation>
<translation id="3380365263193509176">Белгисиз ката</translation>
-<translation id="3382073616108123819">Ой! Тутум бул түзмөктүн далдаштырма дайындарын аныктай албай койду.</translation>
+<translation id="3382073616108123819">Ой! Система бул түзмөктүн далдаштырма дайындарын аныктай албай койду.</translation>
<translation id="3382200254148930874">Көзөмөл токтотулууда…</translation>
<translation id="338323348408199233">VPN'сиз трафик бөгөттөлсүн</translation>
<translation id="3384362484379805487">Дисктеги орунду үнөмдөө үчүн тил файлдары бир нече колдонуучунун ортосунда бөлүшүлөт.</translation>
@@ -2738,7 +2738,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="3406396172897554194">Тил же киргизүү ыкмасынын аталышы боюнча издеңиз</translation>
<translation id="3406605057700382950">Кыстармалар тилкесин &amp;көрсөтүү</translation>
<translation id="3407392651057365886">Дагы башка барактар алдын ала жүктөлдү. Башка сайттар сурам жөнөтсө, барактар Google серверлери аркылуу алдын ала жүктөлүшү мүмкүн.</translation>
-<translation id="3407967630066378878">Манжа изин тууралоо үчүн балаңыз <ph name="DEVICE_TYPE" /> баскычтобунун сол жагындагы манжа изинин сенсоруна тийип коюшу керек. Балаңыздын манжасынын изи <ph name="DEVICE_TYPE" /> түзмөгүндө коопсуз сакталат.</translation>
+<translation id="3407967630066378878">Манжа изин коюу үчүн балаңыз <ph name="DEVICE_TYPE" /> баскычтобунун сол жагындагы манжа изинин сенсоруна тийип коюшу керек. Балаңыздын манжасынын изи <ph name="DEVICE_TYPE" /> түзмөгүндө коопсуз сакталат.</translation>
<translation id="3408849592677950451">{NUM_PASSWORDS,plural, =1{Google Сырсөздөрдү башкаргычка <ph name="USER_EMAIL" /> аккаунтунун 1 сырсөзү өткөрүлүп алынды}other{Google Сырсөздөрдү башкаргычка <ph name="USER_EMAIL" /> аккаунтунун {NUM_PASSWORDS} сырсөзү өткөрүлүп алынды}}</translation>
<translation id="3409785640040772790">Карталар</translation>
<translation id="3412265149091626468">Тандоого секириңиз</translation>
@@ -2763,7 +2763,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="3429275422858276529">Бул баракчаны кыстармаларга кошуп, кийинчерээк оңой эле таап алыңыз</translation>
<translation id="3432762828853624962">Shared Workers</translation>
<translation id="3433507769937235446">Жанында болбогондо кулпулоо</translation>
-<translation id="3433621910545056227">Ой! Тутум түзмөктү орнотуу убакытынын аттрибуттарынын кулпусу негизделбей калды.</translation>
+<translation id="3433621910545056227">Ой! Система түзмөктү орнотуу убакытынын аттрибуттарынын кулпусу негизделбей калды.</translation>
<translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation>
<translation id="3434272557872943250">Эгер кошумча Колдонмолор жана Интернеттеги аракеттер таржымалы балаңыз үчүн күйгүзүлгөн болсо, бул маалымат анын Google аккаунтуна сакталышы мүмкүн. Төмөнкү шилтеме менен өтүп, бул жөндөөлөр жана аларды кантип тууралоо керек экендиги жөнүндө кеңири маалымат алыңыз: families.google.com.</translation>
<translation id="3434475275396485144">Бул параметрди телефонуңуздун администратору башкарат</translation>
@@ -2778,7 +2778,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="3440663250074896476"><ph name="BOOKMARK_NAME" /> боюнча башка аракеттер</translation>
<translation id="3441653493275994384">Экран</translation>
<translation id="3441663102605358937">Бул аккаунтту ырастоо үчүн <ph name="ACCOUNT" /> аккаунтуңузга кайра кириңиз</translation>
-<translation id="3442674350323953953"><ph name="DEVICE_OS" /> тутумун жакшыртууга жардам берүү үчүн Google'га аппараттык камсыздоо маалыматыңызды колдонууга уруксат бериңиз. Баш тартсаңыз, керектүү жаңыртууларды аныктоо үчүн мындай маалымат Google'га жөнөтүлө берет, бирок сакталып же башка максатта колдонулбайт.</translation>
+<translation id="3442674350323953953"><ph name="DEVICE_OS" /> системасын жакшыртууга жардам берүү үчүн Google'га аппараттык камсыздоо маалыматыңызды колдонууга уруксат бериңиз. Баш тартсаңыз, керектүү жаңыртууларды аныктоо үчүн мындай маалымат Google'га жөнөтүлө берет, бирок сакталып же башка максатта колдонулбайт.</translation>
<translation id="3444726579402183581"><ph name="ORIGIN" /> <ph name="FILENAME" /> файлын көрө алат</translation>
<translation id="3445047461171030979">Google Жардамчынын ыкчам жооптору</translation>
<translation id="3445288400492335833"><ph name="MINUTES" /> мүн.</translation>
@@ -2823,7 +2823,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="3474624961160222204"><ph name="NAME" /> катары улантуу</translation>
<translation id="3475843873335999118">Кечиресиз, манжа изиңиз дагы эле тааныла элек. Сырсөзүңүздү киргизиңиз.</translation>
<translation id="3476303763173086583">Түзмөктүн иштеши тууралуу маалыматтарды жөнөтүү. Балаңыздын Android'ди колдонуу тажрыйбасын жакшыртууга көмөктөшүп, мүчүлүштүктөрдү издөө жана түзмөк менен колдонмолорду пайдалануу дайындарын автоматтык түрдө Google'га жөнөтүүгө уруксат бериңиз. Бул маалымат балаңыздын өздүгүн аныктоо үчүн колдонулбайт жана тутум менен колдонмонун кыйла туруктуу иштешин камсыз кылууга жана башка нерселерди жакшыртууга көмөктөшөт. Айрым нерселердин Google'дун өнөктөштөрүнө, мисалы, Android'ди иштеп чыгуучуларга да кереги тийиши мүмкүн. Бул <ph name="BEGIN_LINK1" />жөндөөнү<ph name="END_LINK1" /> түзмөктүн ээси иштетет. Түзмөктүн ээси бул түзмөктөн мүчүлүштүктөрдү аныктоо жана колдонуу дайындарын Google'га жөнөтүү мүмкүнчүлүгүн иштетиши мүмкүн. Эгер кошумча Колдонмолор жана Интернеттеги аракеттер таржымалы балаңыз үчүн күйгүзүлгөн болсо, бул нерселер анын Google аккаунтуна сакталышы мүмкүн. <ph name="BEGIN_LINK2" />Кеңири маалымат<ph name="END_LINK2" /></translation>
-<translation id="347670947055184738">Ой! Тутум бул түзмөк үчүн саясатты ала албай калды.</translation>
+<translation id="347670947055184738">Ой! Система бул түзмөк үчүн саясатты ала албай калды.</translation>
<translation id="347785443197175480"><ph name="HOST" /> камераңыз менен микрофонуңузду колдоно берсин</translation>
<translation id="3479552764303398839">Азыр эмес</translation>
<translation id="3479685872808224578">Басып чыгаруу сервери аныкталган жок. Даректи текшерип, кайталап көрүңүз.</translation>
@@ -2844,7 +2844,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="3494769164076977169">Сайт биринчи файлдан кийин калган файлдарды автоматтык түрдө жүктөп алууга аракет кылганда суроо (сунушталат)</translation>
<translation id="3495496470825196617">Телефон колдонулбаганда кубатты сарптоо</translation>
<translation id="3495660573538963482">Google Жардамчынын параметрлери</translation>
-<translation id="3495675993466884458">Тутум администраторуңуз <ph name="APP_ORIGIN" /> колдонмосуна экранды жаздырууга уруксат берди</translation>
+<translation id="3495675993466884458">Система администраторуңуз <ph name="APP_ORIGIN" /> колдонмосуна экранды жаздырууга уруксат берди</translation>
<translation id="3496213124478423963">Кичирейтүү</translation>
<translation id="3496238553815913323"><ph name="LANGUAGE" /> (тандалган жок)</translation>
<translation id="3496689104192986836">Батарея деңгээли: <ph name="PERCENTAGE" />%</translation>
@@ -2886,7 +2886,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="3532521178906420528">Тармакка туташтырылууда...</translation>
<translation id="353316712352074340"><ph name="WINDOW_TITLE" /> – Аудионун үнү өчүрүлгөн</translation>
<translation id="3536492240554502321">Кошумча түстү буруу</translation>
-<translation id="3537881477201137177">Аны кийинчерээк Жөндөөлөрдөн өзгөртүп алсаңыз болот</translation>
+<translation id="3537881477201137177">Аны кийинчерээк Параметрлерден өзгөртүп алсаңыз болот</translation>
<translation id="3538066758857505094">Linux'ту чыгарып салуу учурундагы ката. Кайталап көрүңүз.</translation>
<translation id="354060433403403521">Дүрмөттөөчү түзмөк</translation>
<translation id="354068948465830244">Бул кеңейтүү сайттын дайындарын окуп, өзгөртө алат</translation>
@@ -2986,7 +2986,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="3627671146180677314">Netscape тастыктамасын жаңылоо убакыты</translation>
<translation id="3627879631695760395"><ph name="APP" /> колдонмосун орнотуу...</translation>
<translation id="3628275722731025472">Bluetooth'ду өчүрүү</translation>
-<translation id="3629631988386925734">Smart Lock'ту күйгүзүү үчүн сырсөзүңүздү киргизиңиз. Эми <ph name="DEVICE_TYPE" /> түзмөгүнүн кулпусун телефонуңуз менен ача аласыз. Жөндөөлөргө өтүп, Smart Lock'ту өчүрүп коюңуз.</translation>
+<translation id="3629631988386925734">Smart Lock'ту күйгүзүү үчүн сырсөзүңүздү киргизиңиз. Эми <ph name="DEVICE_TYPE" /> түзмөгүнүн кулпусун телефонуңуз менен ача аласыз. Параметрлерге өтүп, Smart Lock'ту өчүрүп коюңуз.</translation>
<translation id="3629664892718440872">Бул тандоону эстеп калуу</translation>
<translation id="3630132874740063857">Телефонуңуз</translation>
<translation id="3630995161997703415">Каалаган убакта колдонуу үчүн бул сайтты текчеңизге кошуңуз</translation>
@@ -3164,7 +3164,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="3778868487658107119">Ага суроолорду, ар кандай буйруктарды берсеңиз болот. Ал сизден жардамын аябаган жеке жардамчыңыз болот.</translation>
<translation id="3780542776224651912"><ph name="BRAND" /> сырсөздөрүңүздүн уурдалышын текшере албайт. Кийинчерээк кайталап көрүңүз.</translation>
<translation id="3781742599892759500">Linux'ка микрофонду колдонууга уруксат берүү</translation>
-<translation id="3783889407390048282">Android тутумуна кирүү мүмкүнчүлүгүнөн ажырап калбоо үчүн орун бошотуңуз.</translation>
+<translation id="3783889407390048282">Android системасына кирүү мүмкүнчүлүгүнөн ажырап калбоо үчүн орун бошотуңуз.</translation>
<translation id="3784472333786002075">Cookie файлдары вебсайттарда түзүлөт. Алардын эки түрү болот: Жеке cookie файлдарын сиз баш баккан сайт өзү түзөт. Сайт дарек тилкесинде көрүнүп турат. Ал эми үчүнчү тараптардын cookie файлдарын сиз баш баккан сайтка жарнамалар же сүрөттөр сыяктуу материалдарын жайгаштырган башка сайттар түзүшөт.</translation>
<translation id="3785308913036335955">Колдонмолор кыска жолун көрсөтүү</translation>
<translation id="3785727820640310185">Бул сайт үчүн сакталган сырсөздөр</translation>
@@ -3193,7 +3193,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="380329542618494757">Ата-жөнү</translation>
<translation id="3803345858388753269">Видеонун сапаты</translation>
<translation id="3803367742635802571">Сиз баш баккан сайттар ойдогудай иштебей калышы мүмкүн</translation>
-<translation id="380408572480438692">Иштин майнаптуулугу тууралуу дайындарды топтоо мүмкүнчүлүгү иштетилгенде, Google иш тутумун мезгил-мезгили жакшыртып турат. Пикир билдирүү кабары түзүлүп (Alt-Shift-I), ага иштин майнаптуулугу жөнүндө дайындар камтылмайынча бир дагы дайын жөнөтүлбөйт. Бул экранга кайтып келип, дайындарды топтоо аракетин каалаган учурда токтотуп койсоңор болот.</translation>
+<translation id="380408572480438692">Иштин майнаптуулугу тууралуу дайындарды топтоо мүмкүнчүлүгү иштетилгенде, Google иш системасын мезгил-мезгили жакшыртып турат. Пикир билдирүү кабары түзүлүп (Alt-Shift-I), ага иштин майнаптуулугу жөнүндө дайындар камтылмайынча бир дагы дайын жөнөтүлбөйт. Бул экранга кайтып келип, дайындарды топтоо аракетин каалаган учурда токтотуп койсоңор болот.</translation>
<translation id="3807249107536149332">"<ph name="EXTENSION_NAME" />" кеңейтүүсүн (идентификатору: "<ph name="EXTENSION_ID" />") кирүү экранында колдонууга уруксат берилбейт.</translation>
<translation id="3807747707162121253">&amp;Жокко чыгаруу</translation>
<translation id="3808202562160426447">Фондогу контентти күңүрттөө</translation>
@@ -3217,7 +3217,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<ph name="BEGIN_PARAGRAPH2" />Каалаган убакта Chrome түзмөгүңүздүн параметрлерине өтүп, бул кабарларга уруксат берип же тыюу сала аласыз. Эгер сиз домен администратору болсоңуз, бул параметрди администратордун консолунан өзгөртө аласыз.<ph name="END_PARAGRAPH2" /></translation>
<translation id="3819164369574292143">Экрандагы элементтерди чоңойтуңуз. Лупаны күйгүзүп жана өчүрүү үчүн Издөө + Ctrl + M баскычтарын басыңыз. Жакындатылганда элементтерге өтүү үчүн Ctrl + Alt + Жебе баскычтарын колдонуңуз.</translation>
<translation id="3819257035322786455">Камдык көчүрмөнү сактоо</translation>
-<translation id="3819261658055281761">Тутум бул түзмөктө API'ге кирүү үчүн узак мөөнөттүү уруксат токенин сактап кала алган жок.</translation>
+<translation id="3819261658055281761">Система бул түзмөктө API'ге кирүү үчүн узак мөөнөттүү уруксат токенин сактап кала алган жок.</translation>
<translation id="3819800052061700452">&amp;Толук экран</translation>
<translation id="3820638253182943944">{MUTED_NOTIFICATIONS_COUNT,plural, =1{Көрсөтүү}other{Баарын көрсөтүү}}</translation>
<translation id="3820749202859700794">SECG эллиптикалык ийри сызыгы secp521r1 (aka NIST P-521)</translation>
@@ -3260,7 +3260,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="3854967233147778866">Башка тилдердеги вебсайттарды которуу сунушталсын</translation>
<translation id="3854976556788175030">Басылып чыгарылган барактар тактасы толуп калды</translation>
<translation id="3855441664322950881">Кеңейтүүнү топтомдоштуруу</translation>
-<translation id="3855676282923585394">Кыстармалар менен жөндөөлөрдү импорттоо…</translation>
+<translation id="3855676282923585394">Кыстармалар менен параметрлерди импорттоо…</translation>
<translation id="3856096718352044181">Бул жарамдуу кызмат көрсөтүүчү экенин текшерип, кайра аракет кылыңыз</translation>
<translation id="3856800405688283469">Убакыт алкагын тандоо</translation>
<translation id="3857807444929313943">Көтөрүп, кайра тийип коюңуз</translation>
@@ -3378,8 +3378,8 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="3955321697524543127">Сайттар USB түзмөктөрүнө туташа албасын</translation>
<translation id="3955896417885489542">Google Play параметрлерин карап чыгуу</translation>
<translation id="3957079323242030166">Камдык көчүрмөнүн маалыматы Drive сактагычынан орун ээлебейт.</translation>
-<translation id="3957844511978444971">Google кызматтарында ушул жөндөөлөрдү тандаганыңызды ырастоо үчүн "Кабыл алууну" басып коюңуз.</translation>
-<translation id="3958088479270651626">Кыстармалар менен жөндөөлөрдү импорттоо</translation>
+<translation id="3957844511978444971">Google кызматтарында ушул параметрлерди тандаганыңызды ырастоо үчүн "Кабыл алууну" басып коюңуз.</translation>
+<translation id="3958088479270651626">Кыстармалар менен параметрлерди импорттоо</translation>
<translation id="3960566196862329469">ONC</translation>
<translation id="3961005895395968120"><ph name="IBAN_DESCRIPTION" /> боюнча башка аракеттер</translation>
<translation id="3962119236270174787">Кооптуу деп таанылган вебсайттардан, жүктөлүп алынган файлдардан жана кеңейтүүлөрдөн стандарттуу түрдө коргоо</translation>
@@ -3468,7 +3468,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="4036778507053569103">Серверден жүктөлүп алынган саясат жараксыз.</translation>
<translation id="4037084878352560732">Жылкы</translation>
<translation id="403725336528835653">Байкап көрүү</translation>
-<translation id="4040041015953651705">Төмөнкү тилден которуу</translation>
+<translation id="4040041015953651705">Кайсы тилден</translation>
<translation id="4040105702484676956"><ph name="SITE_NAME" /> сайтындагы жана анын орнотулган колдонмосундагы маалыматтар жана уруксаттар тазалансынбы?</translation>
<translation id="4042863763121826131">{NUM_PAGES,plural, =1{Барактан чыгуу}other{Барактардан чыгуу}}</translation>
<translation id="4042941173059740150"><ph name="SITE_ETLD_PLUS_ONE" /> сайтына <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> аккаунту менен өтүңүз</translation>
@@ -3497,7 +3497,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="4058793769387728514">Документти азыр текшерүү</translation>
<translation id="4061374428807229313">Бөлүшүү үчүн, Файлдар колдонмосундагы папканы чычкандын оң баскычы менен чыкылдатып, андан соң "Parallels Desktop аркылуу бөлүшүү" дегенди тандаңыз.</translation>
<translation id="406213378265872299">Ыңгайлаштырылган аракеттер</translation>
-<translation id="4062561150282203854"><ph name="DEVICE_TYPE" /> түзмөгүңүздөгү колдонмолорду, жөндөөлөрдү жана башкаларды шайкештириңиз</translation>
+<translation id="4062561150282203854"><ph name="DEVICE_TYPE" /> түзмөгүңүздөгү колдонмолорду, параметрлерди жана башкаларды шайкештириңиз</translation>
<translation id="4065876735068446555">Сиз колдонуп жаткан тармак (<ph name="NETWORK_ID" />) кирүү бетине өтүүңүздү талап кылышы мүмкүн.</translation>
<translation id="4066207411788646768">Тармагыңыздагы жеткиликтүү принтерлерди көрүү үчүн туташууңузду текшериңиз</translation>
<translation id="4067839975993712852">Учурдагы өтмөктү окулду деп белгилөө</translation>
@@ -3551,7 +3551,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="4114524937989710624">Google Drive'дагы акыркы аракеттериңизге кайтууну жеңилдетүү үчүн сунушталган файлдарды көрүп турасыз.
<ph name="BREAK" />
<ph name="BREAK" />
- Картанын менюсунан жөндөөлөрдү башкарсаңыз болот же көбүрөөк параметрлерди көрүү үчүн Chrome'ду ыңгайлаштыруу бөлүмүнө өтүңүз.</translation>
+ Картанын менюсунан параметрлерди башкарсаңыз болот же көбүрөөк параметрлерди көрүү үчүн Chrome'ду ыңгайлаштыруу бөлүмүнө өтүңүз.</translation>
<translation id="4115002065223188701">Тармак көрүнбөй калды</translation>
<translation id="4115378294792113321">Маджента</translation>
<translation id="4116704186509653070">Кайра ачуу</translation>
@@ -3603,7 +3603,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="4167212649627589331"><ph name="APP_NAME" /> <ph name="DEVICE_NAME" /> камерасын колдонууга аракет кылып жатат. Уруксат берүү үчүн <ph name="DEVICE_NAME" /> камерасынын купуялык которгучун өчүрүңүз.</translation>
<translation id="4167393659000039775">Google дайын-даректердин жоголушуна жоопкерчиликтүү эмес, ошондой эле <ph name="DEVICE_OS" /> тастыкталбаган түзмөктөрдө иштебеши мүмкүн. Кеңири маалымат: g.co/flex/InstallGuide.</translation>
<translation id="4167686856635546851">Сайттар адатта видео оюндары же веб формалар сыяктуу интерактивдик функцияларды чагылдыруу үчүн, Javascript'ти колдонот</translation>
-<translation id="4168015872538332605"><ph name="PRIMARY_EMAIL" /> дегенге таандык жөндөөлөрдүн айрымдары сиз менен бөлүшүлүүдө. Бул жөндөөлөр бир нече профиль менен кирүү мүмкүнчүлүгү колдонулуп жатканда гана аккаунтуңузга таасирин тийгизет.</translation>
+<translation id="4168015872538332605"><ph name="PRIMARY_EMAIL" /> дегенге таандык параметрлердин айрымдары сиз менен бөлүшүлүүдө. Бул жөндөөлөр бир нече профиль менен кирүү мүмкүнчүлүгү колдонулуп жатканда гана аккаунтуңузга таасирин тийгизет.</translation>
<translation id="4168651806173792090"><ph name="LAST_FOUR_DIGITS" /> менен бүткөн <ph name="NETWORK_NAME" /></translation>
<translation id="4169535189173047238">Жок</translation>
<translation id="4170314459383239649">Чыгууда тазалансын</translation>
@@ -3665,7 +3665,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="4237282663517880406">Google Drive сунуштарын көрсөтүү</translation>
<translation id="4241182343707213132">Уюмдун колдонмолорун жаңыртуу үчүн өчүрүп күйгүзүңүз</translation>
<translation id="4242145785130247982">Бир нече кардарлардын сертификаттарын пайдалануу колдоого алынбайт</translation>
-<translation id="4242533952199664413">Жөндөөлөрдү ачуу</translation>
+<translation id="4242533952199664413">Параметрлерди ачуу</translation>
<translation id="4242577469625748426">Түзмөккө саясат параметрлери орнотулбай койду: <ph name="VALIDATION_ERROR" />.</translation>
<translation id="4243504193894350135">Принтер тындырылды</translation>
<translation id="4244238649050961491">Стилус үчүн көбүрөөк колдонмолорду табыңыз</translation>
@@ -3743,7 +3743,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="4306119971288449206">Колдонмолор "<ph name="CONTENT_TYPE" />" мазмун түрү менен тейлениши керек</translation>
<translation id="4307992518367153382">Негизги параметрлер</translation>
<translation id="4309165024397827958">Android колдонмолору менен кызматтарга түзмөгүңүздүн жайгашкан жерин аныктоого уруксат бериңиз. Google компаниясы колдонуучулардын жүргөн жери тууралуу маалыматты маал-маалы менен чогултуп, алардын тактыгын жогорулатуу жана айрым кызматтарды жакшыртуу максатында жашыруун пайдаланат.</translation>
-<translation id="4309183709806093061">Тутумдун аудиосун да бөлүшүңүз. Бул түзмөктүн үнү басылат.</translation>
+<translation id="4309183709806093061">Системанын аудиосун да бөлүшүңүз. Бул түзмөктүн үнү басылат.</translation>
<translation id="4309420042698375243"><ph name="NUM_KILOBYTES" />К (<ph name="NUM_KILOBYTES_LIVE" />К жандуу)</translation>
<translation id="4310132194679586591">Түзмөгүңүздө бул шилтемени ача турган колдонмону тандаңыз</translation>
<translation id="4310139701823742692">Файлдын форматы туура эмес. PPD файлын текшерип, кайталап көрүңүз.</translation>
@@ -3870,7 +3870,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="4416582610654027550">Жарактуу URL'ди териңиз</translation>
<translation id="4419409365248380979"><ph name="HOST" /> кукилерди ар дайым коё берсин</translation>
<translation id="4421932782753506458">Телчигип жаткан</translation>
-<translation id="4423376891418188461">Жөндөөлөрдү калыбына келтирүү</translation>
+<translation id="4423376891418188461">Параметрлерди калыбына келтирүү</translation>
<translation id="442397852638519243"><ph name="USER_NAME" />, администраторуңуз сырсөздү өзгөртүүнү талап кылууда.</translation>
<translation id="4424867131226116718"><ph name="BEGIN_PARAGRAPH1" />ChromeOS түзмөктөрүнө кабарларды автоматтык түрдө жөнөтүүгө уруксат берсеңиз, ChromeOS'то кайсы нерселерди оңдоп жана жакшыртуу маанилүү экенин биле алабыз. Бул кабарларда ChromeOS'тун бузулуусу, колдонулган функциялар жана канча эстутум колдонулгандыгы сыяктуу маалымат камтылышы мүмкүн.<ph name="END_PARAGRAPH1" />
<ph name="BEGIN_PARAGRAPH2" />Каалаган убакта Chrome түзмөгүңүздүн параметрлерине өтүп, бул кабарларга уруксат берип же тыюу сала аласыз. Эгер сиз домен администратору болсоңуз, бул параметрди администратордун консолунан өзгөртө аласыз.<ph name="END_PARAGRAPH2" /></translation>
@@ -4054,9 +4054,9 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="4580596421317071374">Сырсөздөр ушул түзмөктөгү <ph name="GOOGLE_PASSWORD_MANAGER" /> бөлүмүнө сакталат.</translation>
<translation id="4581774856936278355">Linux'ту калыбына келтирүүдө ката кетти</translation>
<translation id="4582297591746054421">Сайттар адатта көчүрүлгөн тексттин форматын сактоо сыяктуу функциялар үчүн алмашуу буфериңизди окуйт</translation>
-<translation id="4582563038311694664">Бардык жөндөөлөрдү кайра коюу</translation>
+<translation id="4582563038311694664">Бардык параметрлерди кайра коюу</translation>
<translation id="4585793705637313973">Баракты түзөтүү</translation>
-<translation id="4586275095964870617"><ph name="URL" /> шилтемеси кошумча серепчиде ачылган жок. Тутум администраторуңузга кайрылыңыз.</translation>
+<translation id="4586275095964870617"><ph name="URL" /> шилтемеси кошумча серепчиде ачылган жок. Система администраторуңузга кайрылыңыз.</translation>
<translation id="4587589328781138893">Сайттар</translation>
<translation id="4589713469967853491">Таржымалдар "Жүктөлүп алынгандар" каталогуна ийгиликтүү жазылды.</translation>
<translation id="4590324241397107707">Дайындар базасынын сактагычы</translation>
@@ -4068,7 +4068,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="4594577641390224176">Барак жөнүндө тутум маалыматын издеп жатасызбы? Төмөнкүгө өтүңүз:</translation>
<translation id="4595560905247879544">Колдонмолор менен кеңейтүүлөрдү башкаруучу гана өзгөртө алат (<ph name="CUSTODIAN_NAME" />).</translation>
<translation id="4596295440756783523">Сизде ушул серверлерди аныктаган файл тастыктамалары бар</translation>
-<translation id="4598345735110653698">Мүмкүндүк алуу ачкычтарын тескөө</translation>
+<translation id="4598345735110653698">Киргизүүчү ачкычтарды тескөө</translation>
<translation id="4598549027014564149">Жашыруун режиминде сайттар cookie файлдары аркылуу түрдүү сайттардагы, ошондой эле байланышкан сайттардагы аракеттериңизди көрө албайт. Аракеттериңиз жарнамаларды жекелештирүү сыяктуу нерселер үчүн колдонулбайт. Функциялар айрым сайттарда иштебеши мүмкүн.</translation>
<translation id="4598556348158889687">Сактагычты башкаруу</translation>
<translation id="4598776695426288251">Wi-Fi'га бир нече түзмөк аркылуу туташса болот</translation>
@@ -4096,7 +4096,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="4620809267248568679">Бул жөндөөнү кеңейтүү күчүнө киргизген.</translation>
<translation id="4622051949285931942">Автоматтык жаңыртууларды өчүрөсүзбү?</translation>
<translation id="4623167406982293031">Аккаунтту ырастоо</translation>
-<translation id="4623189117674524348">Тутум бул түзмөктө API'ге кирүүгө уруксат бере алган жок.</translation>
+<translation id="4623189117674524348">Система бул түзмөктө API'ге кирүүгө уруксат бере алган жок.</translation>
<translation id="4625078469366263107">Колдонмону иштетүү</translation>
<translation id="4627427111733173920">Кукилер бөгөттөлдү</translation>
<translation id="4627442949885028695">Башка түзмөктөн улантуу</translation>
@@ -4132,7 +4132,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="465406513924180949">Интернеттеги себеттерде калган нерселерге кайтууну жеңилдетүү үчүн себеттерди көрүп турасыз.
<ph name="BREAK" />
<ph name="BREAK" />
- Картанын менюсунан жөндөөлөрдү башкарсаңыз болот же көбүрөөк параметрлерди көрүү үчүн Chrome'ду ыңгайлаштыруу бөлүмүнө өтүңүз.</translation>
+ Картанын менюсунан параметрлерди башкарсаңыз болот же көбүрөөк параметрлерди көрүү үчүн Chrome'ду ыңгайлаштыруу бөлүмүнө өтүңүз.</translation>
<translation id="4654236001025007561">Файлдарды айланаңыздагы Chromebook жана Android түзмөктөрү менен бөлүшүңүз</translation>
<translation id="4657914796247705218">TrackPoint ылдамдыгы</translation>
<translation id="4658285806588491142">Экраныңызды өзүңүз гана көрүңүз</translation>
@@ -4195,7 +4195,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="470644585772471629">Түстөрдү инверсиялоо</translation>
<translation id="4707337002099455863">Бардык сайттарда ар дайым күйүк</translation>
<translation id="4708849949179781599"><ph name="PRODUCT_NAME" /> чыгуу</translation>
-<translation id="4711638718396952945">Жөндөөлөрдү калыбына келтирүү</translation>
+<translation id="4711638718396952945">Параметрлерди калыбына келтирүү</translation>
<translation id="4713409221649555176">Бардык терезелер жабылганда жок кылынсын</translation>
<translation id="47158868804223727">Топту жайып көрсөтүү же жыйыштыруу үчүн анын аталышын басыңыз</translation>
<translation id="4716483597559580346">Кошумча коопсуздук максатында, жууп салуу</translation>
@@ -4220,7 +4220,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="473546211690256853">Бул аккаунтту <ph name="DOMAIN" /> башкарат</translation>
<translation id="4735506354605317060">Тегерек курсор</translation>
<translation id="4735793370946506039">Өркүндөтүлгөн коопсуз серептөө жөнүндө кеңири маалымат алыңыз.</translation>
-<translation id="4735803855089279419">Тутум бул түзмөктүн далдаштырма дайындарын аныктай албай койду.</translation>
+<translation id="4735803855089279419">Система бул түзмөктүн далдаштырма дайындарын аныктай албай койду.</translation>
<translation id="4736292055110123391">Бардык түзмөктөрүңүздөгү кыстармаларды, сырсөздөрдү, таржымалыңызды жана башкаларды шайкештириңиз</translation>
<translation id="473775607612524610">Жаңыртуу</translation>
<translation id="473936925429402449">Тандалды, <ph name="TOTAL_ELEMENTS" /> ичинен <ph name="CURRENT_ELEMENT" />-кошумча мазмун</translation>
@@ -4370,7 +4370,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="4876273079589074638">Бул бузулууну изилдеп, аны оңдоо үчүн биздин инженерлерге жардам бериңиз. Эгер мүмкүн болсо, кадамдарды так тизмелеп бериңиз. Бардык маалымат маанилүү!</translation>
<translation id="4876895919560854374">Экранды кулпулоо жана кулпусун ачуу</translation>
<translation id="4877276003880815204">Элементтерди иликтөө</translation>
-<translation id="4877652723592270843">ChromeOS Flex тутумуна кыстарылган экрандагы нерсени окуп берүүчү ChromeVox куралын иштетесизби? Иштетсеңиз, үн баскычтарын беш секунд коё бербей басып туруңуз.</translation>
+<translation id="4877652723592270843">ChromeOS Flex системасына кыстарылган экрандагы нерсени окуп берүүчү ChromeVox куралын иштетесизби? Иштетсеңиз, үн баскычтарын беш секунд коё бербей басып туруңуз.</translation>
<translation id="4878634973244289103">Пикир жөнөтүлбөй жатат. Бир аздан кийин кайталап көрүңүз.</translation>
<translation id="4878653975845355462">Жеке фондорду администраторуңуз өчүрүп койгон</translation>
<translation id="4878718769565915065">Бул коопсуздук ачкычына манжа изи кошулган жок</translation>
@@ -4789,7 +4789,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="5281013262333731149">Төмөнкүдө ачылат: <ph name="OPEN_BROWSER" /></translation>
<translation id="528208740344463258">Android колдонмолорун жүктөп алып, колдонуу үчүн адегенде бул жаңыртууну милдеттүү түрдө орнотуп алышыңыз керек. <ph name="DEVICE_TYPE" /> түзмөгүңүзгө жаңыртуу орнотулуп жатканда, аны колдоно албайсыз. Жаңыртылып бүткөндөн кийин <ph name="DEVICE_TYPE" /> түзмөгүңүз өчүрүлүп, кайра күйгүзүлөт.</translation>
<translation id="5282733140964383898">"Байкоо салынбасын" функциясы иштетилгенде, серепчи сайттарга сиздин дайын-даректериңизди топтоого болбойт деген билдирүү берет. Бул аракет вебсайттын сурамды эске ала тургандыгына же албай тургандыгына жана сурамдын чечмеленишине түздөн-түз байланыштуу болот. Мисалы, айрым веб-сайттар бул сурамды эске алып, сиз көрүп чыккан вебсайттарга негизделбеген каалаган жарнамаларды көрсөтө берет. Ал эми көпчүлүк вебсайттар коопсуздукту бекемдөө, керектүү мазмундар, жарнамалар жана сунуштар менен камсыз кылуу жана статистикалык маалыматтар жөнүндө кабар берүү максатында серептөө дайын-даректериңизди топтоп, колдонгонун уланта берет. <ph name="BEGIN_LINK" />Көбүрөөк маалымат<ph name="END_LINK" /></translation>
-<translation id="5283677936944177147">Ой! Тутум бул түзмөктүн моделин же сериясынын номерин аныктай албай койду.</translation>
+<translation id="5283677936944177147">Ой! Система бул түзмөктүн моделин же сериясынын номерин аныктай албай койду.</translation>
<translation id="5284445933715251131">Жүктөп алууну улантуу</translation>
<translation id="5285635972691565180"><ph name="DISPLAY_ID" /> көрсөтүү</translation>
<translation id="5286194356314741248">Текшерилүүдө</translation>
@@ -4801,7 +4801,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="5291739252352359682">Медианын коштомо жазууларын Chrome серепчисинде автоматтык түрдө түзөт (учурда англис тилинде жеткиликтүү). Аудио жана коштомо жазуулар түзмөгүңүздө гана иштелип, сакталат.</translation>
<translation id="529175790091471945">Бул түзмөктү форматтоо</translation>
<translation id="529296195492126134">Көз ирмемдик режим колдоого алынбайт. Администраторуңузга кайрылыңыз</translation>
-<translation id="5293170712604732402">Жөндөөлөрдү эң биринчи коюлган демейки маанилерине кайтаруу</translation>
+<translation id="5293170712604732402">Параметрлерди эң биринчи коюлган демейки маанилерине кайтаруу</translation>
<translation id="5294097441441645251">Кичинекей тамгалар же ылдыйкы сызык менен башталышы керек</translation>
<translation id="5294618183559481278"><ph name="DEVICE_TYPE" /> түзмөгүңүз алдын ала орнотулган сенсор аркылуу маңдай жагындагы адамдарды аныктап турат. Бардык нерселер түзмөгүңүздө дароо иштетилип, андан соң өчүрүлөт. Сенсордун дайындары эч качан Google'га жөнөтүлбөйт. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation>
<translation id="5296350763804564124">Экрандагы текст окулуп берилгендиктен, түзмөгүңүздү экранын карабай колдоносуз. Туташкан түзмөктөрдө Брайль тили жеткиликтүү.</translation>
@@ -4895,7 +4895,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="5379140238605961210">Микрофонду колдонуу мүмкүнчүлүгү бөгөттөлө берсин</translation>
<translation id="5380424552031517043"><ph name="PERMISSION" /> өчүрүлдү</translation>
<translation id="5382591305415226340">Колдоого алынган шилтемелерди башкаруу</translation>
-<translation id="5383377866517186886">Камера Mac'тын Тутум параметрлеринен өчүрүлдү</translation>
+<translation id="5383377866517186886">Камера Mac'тын Система параметрлеринен өчүрүлдү</translation>
<translation id="5383740867328871413">Аталышы жок топ – <ph name="GROUP_CONTENTS" /> – <ph name="COLLAPSED_STATE" /></translation>
<translation id="5385612634631487511"><ph name="EXTENSION_NAME" /> (идентификатор: <ph name="EXTENSION_ID" />)</translation>
<translation id="538822246583124912">Ишкананын саясаты өзгөрдү. Куралдар тилкесине "Тажрыйбалар" баскычы кошулду. Тажрыйбаларды иштетүү үчүн баскычты басып, диалогду ачыңыз.</translation>
@@ -4918,7 +4918,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="5404740137318486384">Которгучту же баскычтоптогу баскычты “<ph name="ACTION" />” аракетине дайындоо үчүн аны таптаңыз.
Бул аракет үчүн бир нече которгучту дайындай аласыз.</translation>
<translation id="540495485885201800">Мурунку менен алмаштыруу</translation>
-<translation id="5405146885510277940">Жөндөөлөрдү кайра коюу</translation>
+<translation id="5405146885510277940">Параметрлерди кайра коюу</translation>
<translation id="5407167491482639988">Түшүнүксүз</translation>
<translation id="5408750356094797285">Чен-өлчөмүн өзгөртүү: <ph name="PERCENT" /></translation>
<translation id="5409044712155737325">Google аккаунтуңуздан</translation>
@@ -4955,7 +4955,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="5439680044267106777">Өткөрүп жиберип, жаңы профилди жөндөө</translation>
<translation id="544083962418256601">Кыска жолдорду түзүү…</translation>
<translation id="5441133529460183413">Chrome cерепчисинен орнотулган веб колдонмо</translation>
-<translation id="5441466871879044658">Төмөнкү тилге которуу</translation>
+<translation id="5441466871879044658">Кайсы тилге</translation>
<translation id="5442228125690314719">Дисктин сүрөтүн түзүүдөгү ката. Кайталап көрүңүз.</translation>
<translation id="5442550868130618860">Автожаңыртууну күйгүзүү</translation>
<translation id="5445400788035474247">10x</translation>
@@ -5187,7 +5187,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="5638309510554459422"><ph name="BEGIN_LINK" />Chrome Интернет дүкөнүнөн<ph name="END_LINK" /> кеңейтүүлөрдү жана темаларды таап алыңыз</translation>
<translation id="5639549361331209298">Бул баракты кайра жүктөп, көбүрөөк параметр көрүү үчүн коё бербей кармап туруңуз</translation>
<translation id="5640133431808313291">Коопсуздук ачкычтарын башкаруу</translation>
-<translation id="5641608986289282154"><ph name="DEVICE_OS" /> тутумун колдонуп баштоо</translation>
+<translation id="5641608986289282154"><ph name="DEVICE_OS" /> системасын колдонуп баштоо</translation>
<translation id="5641648607875312660">Скриншот сүрөтүн түзөткүч</translation>
<translation id="5642508497713047">CRL кол койгуч</translation>
<translation id="5643321261065707929">Тарифтелген тармак</translation>
@@ -5315,7 +5315,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="5776450228446082914">Вебсайттардын тизмеси эки серепчиде тең ачылат.</translation>
<translation id="5776571780337000608">Бул колдонмодо колдоого алынган файлдарды файл серепчисинде же башка колдонмолордо ачып, түзөтө аласыз. Бул колдонмодо демейки шартта кайсы файлдар ачыларын көзөмөлдөө үчүн <ph name="BEGIN_LINK" />түзмөктө демейки колдонмолорду жөндөө жөнүндө билип алыңыз<ph name="END_LINK" />.</translation>
<translation id="5777468213129569553">Chrome'ду ачуу</translation>
-<translation id="5778491106820461378">Кирип турган Google аккаунттарын <ph name="LINK_BEGIN" />Жөндөөлөрдөн<ph name="LINK_END" /> башкара аласыз. Вебсайттарга жана колдонмолорго берилген уруксаттар бардык аккаунттарга карата колдонулушу мүмкүн. Эгер сайттар менен колдонмолордун аккаунтуңуздагы маалыматты колдонушун каалабасаңыз, <ph name="DEVICE_TYPE" /> түзмөгүңүзгө конок режиминде кирсеңиз болот.</translation>
+<translation id="5778491106820461378">Кирип турган Google аккаунттарын <ph name="LINK_BEGIN" />Параметрлерден<ph name="LINK_END" /> башкара аласыз. Вебсайттарга жана колдонмолорго берилген уруксаттар бардык аккаунттарга карата колдонулушу мүмкүн. Эгер сайттар менен колдонмолордун аккаунтуңуздагы маалыматты колдонушун каалабасаңыз, <ph name="DEVICE_TYPE" /> түзмөгүңүзгө конок режиминде кирсеңиз болот.</translation>
<translation id="5780011244986845107">Тандалган папкада купуя файлдар бар. "<ph name="APP_NAME" />" колдонмосуна бул папканы тоскоолдуксуз ачып, ичиндегилерин окуу мүмкүнчүлүгүн бергиңиз келеби?</translation>
<translation id="5780973441651030252">Процесстин артыкчылыгы</translation>
<translation id="5781092003150880845"><ph name="ACCOUNT_FULL_NAME" /> катары шайкештирүү</translation>
@@ -5349,7 +5349,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="5800020978570554460">Дайындалган файл акыркы жолу жүктөлүп алынганда бузулган же чыгарылып салынган.</translation>
<translation id="5800351251499368110">Капталдагы тилкеде издөө барагын жабуу. Капталдагы тилкеде издөө барагы ачык.</translation>
<translation id="5801051031414037185">Телефонду тууралоо</translation>
-<translation id="5801568494490449797">Жеке жөндөөлөр</translation>
+<translation id="5801568494490449797">Жеке параметрлер</translation>
<translation id="5804241973901381774">Уруксаттар</translation>
<translation id="5804259315582798390">Түзмөктөгү маалыматты калыбына келтирүү параметри иштетилген жок</translation>
<translation id="5805268472388605531">Басым белгилерин жана атайын символдорду көрүү үчүн баскычтоптогу баскычтарды коё бербей басып туруңуз</translation>
@@ -5381,13 +5381,13 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="583281660410589416">Белгисиз</translation>
<translation id="5832970156002835240">Бардык сайттарда уруксат берүү</translation>
<translation id="5833397272224757657">Жекелештирүү үчүн сиз баш баккан сайттардагы мазмунду жана башка серептөө таржымалын пайдаланат</translation>
-<translation id="5833726373896279253">Бул жөндөөлөрдү ээси гана өзгөртө алат:</translation>
+<translation id="5833726373896279253">Бул параметрлерди ээси гана өзгөртө алат:</translation>
<translation id="583431638776747">Сайт жеткиликсиз</translation>
<translation id="5834581999798853053">Болжол менен <ph name="TIME" /> мүнөт калды</translation>
<translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> – Видео же аудио жаздырылууда</translation>
<translation id="5835625581856809102"><ph name="APP_NAME" /> үчүн киргизүүчү ачкычты түзгүңүз келген түзмөк менен бул QR кодун скандаңыз</translation>
<translation id="583673505367439042">Сайттар сиздин уруксатыңыз менен түзмөгүңүздөгү файлдарды жана папкаларды түзөтө алат</translation>
-<translation id="5836999627049108525">Төмөнкү тилден которуу</translation>
+<translation id="5836999627049108525">Кайсы тилден</translation>
<translation id="583756221537636748">Кутуча</translation>
<translation id="5839524803417937122"><ph name="SEARCH_ENGINE" /> аркылуу сүрөттүн ичинен издөө</translation>
<translation id="5840318881868981258">Google аккаунтуңузда, <ph name="ACCOUNT" /></translation>
@@ -5623,7 +5623,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="6047632800149092791">Шайкештирүү иштебей жатат. Чыгып, кайра кирип көрүңүз.</translation>
<translation id="6048747414605857443">ChromeVox жана "Басып туруп угуңуз" функциясы үчүн кеп синтезаторундагы үндөрдү тандоо жана ыңгайлаштыруу</translation>
<translation id="6049797270917061226">Бул файл чабуулчуларга жеке маалыматыңызды уурдаганда уруксат бериши мүмкүн.</translation>
-<translation id="6051354611314852653">Ой! Тутум бул түзмөктүн API'не кирүүгө уруксат бере алган жок.</translation>
+<translation id="6051354611314852653">Ой! Система бул түзмөктүн API'не кирүүгө уруксат бере алган жок.</translation>
<translation id="6051811090255711417">Бул файл коопсуздук саясатына туура келбегендиктен, уюмуңуз аны бөгөттөп койду</translation>
<translation id="6052488962264772833">Тышкы экранга чыгарып баштоо үчүн кирүү кодун териңиз</translation>
<translation id="6052976518993719690">SSL тастыктама борбору</translation>
@@ -5649,12 +5649,12 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="6069464830445383022">Chromebook'ка Google аккаунтуңуз менен киресиз</translation>
<translation id="6070311415473175157">Издөө үчүн сүрөт аймагын тандаңыз</translation>
<translation id="6071181508177083058">сырсөздү ырастоо</translation>
-<translation id="6071576563962215370">Тутум түзмөктү орнотуу убагында анын атрибуттарын кулпулай албай койду.</translation>
+<translation id="6071576563962215370">Система түзмөктү орнотуу убагында анын атрибуттарын кулпулай албай койду.</translation>
<translation id="6072442788591997866"><ph name="APP_NAME" /> колдонмосун бул түзмөктө пайдаланууга болбойт. Администраторуңуз менен байланышыңыз. Ката коду: <ph name="ERROR_CODE" />.</translation>
<translation id="6073451960410192870">Жаздырууну токтотуу</translation>
<translation id="6073903501322152803">Атайын мүмкүнчүлүктөрдү кошуу</translation>
<translation id="6075075631258766703">Телефон номерин ырастоо</translation>
-<translation id="6075731018162044558">Ой! Тутум бул түзмөктүн узак мөөнөттүү API колдонуу энбелгисин ала албай калды.</translation>
+<translation id="6075731018162044558">Ой! Система бул түзмөктүн узак мөөнөттүү API колдонуу энбелгисин ала албай калды.</translation>
<translation id="6075907793831890935"><ph name="HOSTNAME" /> деген түзмөк менен дайындарды алмашуу</translation>
<translation id="6076175485108489240">Жайгашкан жер тууралуу маалыматты колдонуу. Колдонмолорго түзмөгүңүздүн жайгашкан жерин табууга жардам бериңиз. Google жайгашкан жердин дайындарын маал-маалы менен чогултуп, алардын тактыгын жакшыртууга жана дайындардын негизинде көрсөтүлүүчү кызматтарга жашыруун түрдө пайдаланышы мүмкүн. <ph name="BEGIN_LINK1" />Кеңири маалымат<ph name="END_LINK1" /></translation>
<translation id="6076491747490570887">Салкын боз</translation>
@@ -5710,7 +5710,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="6120707837086723438">Акыркы жолу изделген рецепттердин негизинде сунушталган рецепттерди көрүп турасыз.
<ph name="BREAK" />
<ph name="BREAK" />
- Картанын менюсунан жөндөөлөрдү башкарсаңыз болот же көбүрөөк параметрлерди көрүү үчүн Chrome'ду ыңгайлаштыруу бөлүмүнө өтүңүз.</translation>
+ Картанын менюсунан параметрлерди башкарсаңыз болот же көбүрөөк параметрлерди көрүү үчүн Chrome'ду ыңгайлаштыруу бөлүмүнө өтүңүз.</translation>
<translation id="6121773125605585883"><ph name="WEBSITE" /> үчүн <ph name="USERNAME" /> колдонуучу аты менен сырсөзүн көрүү</translation>
<translation id="6122081475643980456">Интернет байланышыңыз көзөмөлдөнүүдө</translation>
<translation id="6122093587541546701">Электрондук почта (милдеттүү эмес):</translation>
@@ -5765,7 +5765,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="6169040057125497443">Микрофонуңузду текшериңиз.</translation>
<translation id="6169967265765719844">Steam аркылуу орнотулган оюндар менен колдонмолорго берилген урксаттарды <ph name="LINK_BEGIN" />Steam колдонмосунун параметрлеринен<ph name="LINK_END" /> башкарууга болот.</translation>
<translation id="6170470584681422115">Сэндвич</translation>
-<translation id="6170498031581934115">ADB аркылуу мүчүлүштүктөрдү аныктоо иштетилген жок. Жөндөөлөргө өтүп, кайталап көрүңүз.</translation>
+<translation id="6170498031581934115">ADB аркылуу мүчүлүштүктөрдү аныктоо иштетилген жок. Параметрлерге өтүп, кайталап көрүңүз.</translation>
<translation id="6171779718418683144">Сайтка кирген сайын суралсын</translation>
<translation id="617213288191670920">Тилдер кошулган жок</translation>
<translation id="6173623053897475761">PIN кодуңузду кайра териңиз</translation>
@@ -5837,7 +5837,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="6238923052227198598">Кулпуланган экранда эң акыркы эскертүү көрүнсүн</translation>
<translation id="6239558157302047471">Алкакты кайра жүктөө</translation>
<translation id="6240821072888636753">Ар дайым суралсын</translation>
-<translation id="6241530762627360640">Тутумуңуз менен жупташкан Bluetooth түзмөктөрү жөнүндө маалыматты пайдалануу жана жакын арадагы Bluetooth түзмөктөрүн табуу мүмкүнчүлүгү.</translation>
+<translation id="6241530762627360640">Системаңыз менен жупташкан Bluetooth түзмөктөрү жөнүндө маалыматты пайдалануу жана жакын арадагы Bluetooth түзмөктөрүн табуу мүмкүнчүлүгү.</translation>
<translation id="6241844896329831164">Уруксаттын кереги жок</translation>
<translation id="6242574558232861452">Уюмуңуздун коопсуздук саясаттарын бузгандыгы текшерилүүдө.</translation>
<translation id="6242589501614145408">Коопсуздук ачкычын баштапкы абалга келтирүү</translation>
@@ -5848,7 +5848,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="6247557882553405851">Google Сырсөздөрдү башкаргыч</translation>
<translation id="6247620186971210352">Колдонмолор табылган жок</translation>
<translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
-<translation id="6247802389331535091">Тутум: <ph name="ARC_PROCESS_NAME" /></translation>
+<translation id="6247802389331535091">Система: <ph name="ARC_PROCESS_NAME" /></translation>
<translation id="624789221780392884">Жаңыртуу даяр</translation>
<translation id="6248988683584659830">Издөө параметрлери</translation>
<translation id="6249200942125593849">Атайын мүмкүнчүлүктөрдү башкаруу</translation>
@@ -5869,7 +5869,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="6267166720438879315">Бул жерде <ph name="HOST_NAME" /> аныктыгыңызды текшерүү үчүн тастыктама тандаңыз</translation>
<translation id="6268252012308737255"><ph name="APP" /> менен ачуу</translation>
<translation id="6270391203985052864">Сайттар билдирмелерди жөнөтүүнү сурана алышат</translation>
-<translation id="6270770586500173387"><ph name="BEGIN_LINK1" />Тутум менен колдонмо жөнүндө маалымат<ph name="END_LINK1" /> жана <ph name="BEGIN_LINK2" />чендер<ph name="END_LINK2" /> жөнөтүлсүн</translation>
+<translation id="6270770586500173387"><ph name="BEGIN_LINK1" />Система менен колдонмо жөнүндө маалымат<ph name="END_LINK1" /> жана <ph name="BEGIN_LINK2" />чендер<ph name="END_LINK2" /> жөнөтүлсүн</translation>
<translation id="6271348838875430303">оңдоо аракети кайтарылды</translation>
<translation id="6273677812470008672">Сапат</translation>
<translation id="6274202259872570803">Скринкаст</translation>
@@ -5901,12 +5901,12 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="6300177430812514606">Маалымат жөнөтүүнү же алууну аягына чыгара албайт</translation>
<translation id="630065524203833229">Ч&amp;ыгуу</translation>
<translation id="6300718114348072351"><ph name="PRINTER_NAME" /> автоматтык түрдө конфигурацияланган жок. Өркүндөтүлгөн принтердин чоо-жайын көрсөтүңүз. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation>
-<translation id="6301300352769835063"><ph name="DEVICE_OS" /> тутумун жакшыртууга жардам берүү үчүн Google'га аппараттык камсыздоо маалыматыңызды колдонууга уруксат бериңиз. Баш тартсаңыз, керектүү жаңыртууларды аныктоо үчүн мындай маалымат Google'га жөнөтүлө берет, бирок сакталып же башка максатта колдонулбайт. Кеңири маалымат: g.co/flex/HWDataCollection.</translation>
+<translation id="6301300352769835063"><ph name="DEVICE_OS" /> системасын жакшыртууга жардам берүү үчүн Google'га аппараттык камсыздоо маалыматыңызды колдонууга уруксат бериңиз. Баш тартсаңыз, керектүү жаңыртууларды аныктоо үчүн мындай маалымат Google'га жөнөтүлө берет, бирок сакталып же башка максатта колдонулбайт. Кеңири маалымат: g.co/flex/HWDataCollection.</translation>
<translation id="630292539633944562">Жеке маалыматты сунуштоо</translation>
<translation id="6305607932814307878">Глобалдык саясат:</translation>
<translation id="6305909198255586420">Негизги профилиңиз аркылуу орнотуңуз</translation>
<translation id="630750887748244481">Ата-энең Chrome үчүн "Сайттарга, колдонмолорго жана кеңейтүүлөргө уруксаттарды" өчүрүп койгон. Бул кеңейтүүнү кошууга тыюу салынган.</translation>
-<translation id="6307990684951724544">Тутум бош эмес</translation>
+<translation id="6307990684951724544">Система бош эмес</translation>
<translation id="6308493641021088955"><ph name="EXTENSION_NAME" /> менен кирдиңиз</translation>
<translation id="6308937455967653460">Шилт&amp;емени төмөнкүдөй сактоо…</translation>
<translation id="6309443618838462258">Администраторуңуз бул киргизүү ыкмасын колдонууга тыюу салган</translation>
@@ -5937,7 +5937,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="6331818708794917058">Сайттар MIDI түзмөктөрүнө сиздин уруксатыңыз менен туташа алат</translation>
<translation id="6333064448949140209">Файл мүчүлүштүктөрдү оңдоо үчүн Google'га жөнөтүлөт</translation>
<translation id="6333170995003625229">Электрондук почта дарегиңиз же сырсөзүңүз ырасталган жок. Кайра кирип көрүңүз.</translation>
-<translation id="6335920438823100346">Linux'ту иштетүү үчүн <ph name="MANAGER" /> дайын-даректериңиздин камдык көчүрмөсүн сактап, Chromebook'ту демейки жөндөөлөргө кайтарууну талап кылууда.</translation>
+<translation id="6335920438823100346">Linux'ту иштетүү үчүн <ph name="MANAGER" /> дайын-даректериңиздин камдык көчүрмөсүн сактап, Chromebook'ту демейки параметрлерге кайтарууну талап кылууда.</translation>
<translation id="6336038146639916978"><ph name="MANAGER" /> ADB аркылуу мүчүлүштүктөрдү оңдоону өчүрдү. Ушуну менен <ph name="DEVICE_TYPE" /> түзмөгүңүз 24 сааттын ичинде баштапкы абалга келтирилет. Колдонгуңуз келген файлдардын камдык көчүрмөсүн сактаңыз.</translation>
<translation id="6338968693068997776">USB түзмөгүн кошуу</translation>
<translation id="6339668969738228384"><ph name="USER_EMAIL_ADDRESS" /> үчүн жаңы профиль түзүү</translation>
@@ -5965,7 +5965,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="6363990818884053551">Шайкештирүүнү баштоо үчүн өзүңүз экениңизди ырастаңыз</translation>
<translation id="6365069501305898914">Facebook</translation>
<translation id="6365411474437319296">Үй-бүлө жана досторду кошуу</translation>
-<translation id="6367097275976877956">ChromeOS тутумуна кыстарылган экрандагы нерсени окуп берүүчү ChromeVox куралын иштетесизби? Иштетүү үчүн боштук баскычын басыңыз.</translation>
+<translation id="6367097275976877956">ChromeOS системасына кыстарылган экрандагы нерсени окуп берүүчү ChromeVox куралын иштетесизби? Иштетүү үчүн боштук баскычын басыңыз.</translation>
<translation id="6367985768157257101">Nearby Share аркылуу аласызбы?</translation>
<translation id="6368276408895187373">Иштетилди – <ph name="VARIATION_NAME" /></translation>
<translation id="636850387210749493">Корпоративдик каттоо</translation>
@@ -5992,8 +5992,8 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="6390020764191254941">Өтмөктү жаңы терезеге жылдыруу</translation>
<translation id="6393156038355142111">Татаал сырсөз сунушталсын</translation>
<translation id="6393550101331051049">Кооптуу мазмунду көрсөтө алат</translation>
-<translation id="6395423953133416962"><ph name="BEGIN_LINK1" />Тутум маалыматын<ph name="END_LINK1" /> жана <ph name="BEGIN_LINK2" />чендерди<ph name="END_LINK2" /> жөнөтүү</translation>
-<translation id="6396175271241405634">Тутум колдонмосу</translation>
+<translation id="6395423953133416962"><ph name="BEGIN_LINK1" />Система маалыматын<ph name="END_LINK1" /> жана <ph name="BEGIN_LINK2" />чендерди<ph name="END_LINK2" /> жөнөтүү</translation>
+<translation id="6396175271241405634">Система колдонмосу</translation>
<translation id="6398715114293939307">Google Play Дүкөндү алып салуу</translation>
<translation id="6398765197997659313">Толук экран режиминен чыгуу</translation>
<translation id="6399774419735315745">Тыңчы айым</translation>
@@ -6040,7 +6040,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="6436164536244065364">Желе дүкөнүнөн карап көрүү</translation>
<translation id="6436610005579237680">Ылайыктуу жоопторду алуу үчүн, суроо бергенде Google Жардамчыга экрандагы контексттин скриншотуна мүмкүнчүлүк бериңиз. Жардамчы учурда ойноп жаткан ырлар же видеолор жөнүндө маалыматты да колдоно алат.</translation>
<translation id="6436778875248895551">"<ph name="EXTENSION_NAME" />" кеңейтүүсүн администраторуңуз бөгөттөп койду</translation>
-<translation id="6438234780621650381">Жөндөөлөрдү кайра коюу</translation>
+<translation id="6438234780621650381">Параметрлерди кайра коюу</translation>
<translation id="6438475350605608554">Сырсөздөрдү башка өтмөктө импорттоп жатасыз</translation>
<translation id="6438992844451964465"><ph name="WINDOW_TITLE" /> – Аудио файл ойнотулууда</translation>
<translation id="6442187272350399447">Укмуш</translation>
@@ -6052,7 +6052,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="6445450263907939268">Эгер бул өзгөртүүлөрдү каалаган эмес болсоңуз, мурунку параметрлериңизди калыбына келтире аласыз.</translation>
<translation id="6446213738085045933">Иш тактада кыска жол түзүү</translation>
<translation id="6447842834002726250">Кукилер</translation>
-<translation id="6450876761651513209">Купуялуулугуңуз боюнча жөндөөлөрдү өзгөртүңүз</translation>
+<translation id="6450876761651513209">Купуялуулугуңуз боюнча параметрлерди өзгөртүңүз</translation>
<translation id="6451344358166983408">Сайт же барак</translation>
<translation id="6451591602925140504">{NUM_PAGES,plural, =0{<ph name="PAGE_TITLE" />}=1{<ph name="PAGE_TITLE" /> жана дагы башка 1 өтмөк}other{<ph name="PAGE_TITLE" /> жана дагы башка # өтмөк}}</translation>
<translation id="6451689256222386810">Эгер купуя сөз айкашыңызды унутуп калган болсоңуз же бул жөндөөнү өзгөрткүңүз келсе, <ph name="BEGIN_LINK" />шайкештирүүнү баштапкы абалга келтириңиз<ph name="END_LINK" /></translation>
@@ -6087,7 +6087,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="6472893788822429178">Башкы бет баскычын көрсөтүү</translation>
<translation id="6474498546677193336">Бөлүшүү токтотулган жок, анткени колдонмо ушул папканы иштетип жатат. Linux эмки жолу өчүрүлгөндө бул папканы бөлүшүү токтотулат.</translation>
<translation id="6474884162850599008">Google Drive каттоо эсебин ажыратуу</translation>
-<translation id="6475294023568239942">Жөндөөлөргө өтүп, Linux дисктеги орунду бошотуп же өлчөмүн өзгөртүңүз</translation>
+<translation id="6475294023568239942">Параметрлерге өтүп, Linux дисктеги орунду бошотуп же өлчөмүн өзгөртүңүз</translation>
<translation id="6476482583633999078">Кептин ылдамдыгы</translation>
<translation id="6477822444490674459">Жумуш профилиндеги телефондордо билдирмелер шайкештирилбейт. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation>
<translation id="6478248366783946499">Бул коркунучтуу файл сакталсынбы?</translation>
@@ -6095,7 +6095,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="6482559668224714696">Толук экран режиминдеги лупа</translation>
<translation id="6483485061007832714">Жүктөлүп алынган файлды ачуу</translation>
<translation id="6483805311199035658"><ph name="FILE" /> ачылууда…</translation>
-<translation id="6486301003991593638">Мүмкүндүк алуу ачкычтарын тескөө үчүн Windows'тун жаңы версиясын колдонуңуз</translation>
+<translation id="6486301003991593638">Киргизүүчү ачкычтарды тескөө үчүн Windows'тун жаңы версиясын колдонуңуз</translation>
<translation id="6488266788670893993"><ph name="BRAND" /> сырсөздөрүңүздүн уурдалышын текшере албайт. Интернет байланышын текшерип көрүңүз.</translation>
<translation id="6488384360522318064">Тил тандоо</translation>
<translation id="648927581764831596">Эч бири жеткиликтүү эмес</translation>
@@ -6141,7 +6141,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="6527303717912515753">Бөлүшүү</translation>
<translation id="6528179044667508675">Тынчымды алба</translation>
<translation id="652948702951888897">Chrome таржымалы</translation>
-<translation id="6530186581263215931">Бул жөндөөлөрдү администраторуңуз күчүнө киргизген</translation>
+<translation id="6530186581263215931">Бул параметрлерди администраторуңуз күчүнө киргизген</translation>
<translation id="6531282281159901044">Бул коркунучтуу файл сакталсын</translation>
<translation id="6532101170117367231">Google Drive'да сактоо</translation>
<translation id="6532106788206463496">Өзгөрүүлөрдү сактоо</translation>
@@ -6158,7 +6158,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="654039047105555694"><ph name="BEGIN_BOLD" />Эскертүү:<ph name="END_BOLD" /> Дайындар топтолгондо иш тутуму бир кыйла жай иштеп калат, эмне кылыш керек экендигин так билсеңиз же сизден ошондой аракет суралганда гана иштетиңиз.</translation>
<translation id="6541638731489116978">Бул сайттын кыймыл сенсорлорун колдонуу мүмкүнчүлүгү бөгөттөлгөн.</translation>
<translation id="6545665334409411530">Кайталоо ылдамдыгы</translation>
-<translation id="6545867563032584178">Микрофон Mac'тын Тутум параметрлеринен өчүрүлдү</translation>
+<translation id="6545867563032584178">Микрофон Mac'тын Система параметрлеринен өчүрүлдү</translation>
<translation id="6546856949879953071">Жаңыртуу тууралуу толук маалымат Файлдар &gt; Менин файлдарым &gt; <ph name="LOG_FILE" /> файлына сакталды</translation>
<translation id="6547354035488017500">Кеминде 512 Мб орун бошотпосоңуз, түзмөгүңүз жооп бербей калат. Орун бошотуу үчүн түзмөктүн сактагычынан файлдарды жок кылыңыз.</translation>
<translation id="6547854317475115430"><ph name="BEGIN_PARAGRAPH1" />Google'дун жайгашкан жерди аныктоо кызматы түзмөктүн жайгашкан жерин болжолдоп билүү үчүн, Wi‑Fi, мобилдик тармактар жана сенсорлор сыяктуу булактарды колдонот.<ph name="END_PARAGRAPH1" />
@@ -6236,7 +6236,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="6607831829715835317">Көбүрөөк кура&amp;л</translation>
<translation id="6607890859198268021"><ph name="USER_EMAIL" /> мурунтан эле <ph name="DOMAIN" /> тарабынан башкарылып жатат. Ата-эненин көзөмөлүн башка Google аккаунту менен колдонуу үчүн жөндөп бүткөндөн кийин аккаунттан чыгып, андан соң аккаунтка кирүү экранында "Адам кошуу" баскычын басыңыз.</translation>
<translation id="6608166463665411119">eSIM картаны баштапкы абалга келтирүү</translation>
-<translation id="6608773371844092260">Манжа изин тууралоо үчүн балаңыз <ph name="DEVICE_TYPE" /> баскычтобунун оң жагындагы манжа изинин сенсоруна тийип коюшу керек. Балаңыздын манжасынын изи <ph name="DEVICE_TYPE" /> түзмөгүндө коопсуз сакталат.</translation>
+<translation id="6608773371844092260">Манжа изин коюу үчүн балаңыз <ph name="DEVICE_TYPE" /> баскычтобунун оң жагындагы манжа изинин сенсоруна тийип коюшу керек. Балаңыздын манжасынын изи <ph name="DEVICE_TYPE" /> түзмөгүндө коопсуз сакталат.</translation>
<translation id="6609478180749378879">Жашыруун режимден чыккандан кийин, аккаунтка кирүү дайындары бул түзмөктө сакталат. Кийинчерээк бул вебсайтка түзмөгүңүздөн кайра кире аласыз.</translation>
<translation id="6610002944194042868">Которуу параметрлери</translation>
<translation id="6611907964265870728">Түзмөгүңүз Интернетке туташканын текшериңиз</translation>
@@ -6262,8 +6262,8 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="6633126565486451781">Бул файл окулган же түзөтүлгөн болушу мүмкүн, анткени бул сайт коопсуз туташууну колдонгон жок</translation>
<translation id="6635362468090274700">Түзмөгүңүздү көрүү мүмкүнчүлүгүн бербесеңиз, эч ким сиз менен бөлүшө албайт.<ph name="BR" /><ph name="BR" />Убактылуу көрсөтүү үчүн статус аймагын ачып, Nearby функциясын күйгүзүңүз.</translation>
<translation id="6635674640674343739">Тармакка туташпай жатат. Тармакка туташууңузду текшерип, дагы бир жолу аракет кылыңыз.</translation>
-<translation id="6635944431854494329">Ээси бул функцияны Жөндөөлөргө &gt; Өркүндөтүлгөн коргоого &gt; Мүчүлүштүктөрдү аныктоо жана колдонуу маалыматын автоматтык түрдө Google'га жөнөтүү бөлүмүнөн көзөмөлдөй алат.</translation>
-<translation id="6636623428211296678">Төмөндө көбүрөөк жөндөөлөрдү изилдеңиз же азыр бүтүрүңүз</translation>
+<translation id="6635944431854494329">Ээси бул функцияны Параметрлерге &gt; Өркүндөтүлгөн коргоого &gt; Мүчүлүштүктөрдү аныктоо жана колдонуу маалыматын автоматтык түрдө Google'га жөнөтүү бөлүмүнөн көзөмөлдөй алат.</translation>
+<translation id="6636623428211296678">Төмөндө көбүрөөк параметрлерди изилдеңиз же азыр бүтүрүңүз</translation>
<translation id="6639554308659482635">SQLite эстутуму</translation>
<translation id="6640268266988685324">Ачык өтмөк</translation>
<translation id="6642720633335369752">Бардык ачылып турган колдонмолордун терезелерин көрүү үчүн экранды өйдө сүрүп, коё бербей кармап туруңуз.</translation>
@@ -6355,7 +6355,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="6721972322305477112">&amp;Файл</translation>
<translation id="672208878794563299">Бул сайт кайда турганыңызды кийинки жолу дагы сурайт.</translation>
<translation id="6722744767592605627"><ph name="EMAIL" /> аккаунтун калыбына келтире аласыз, бирок жергиликтүү маалымат өчүрүлөт.</translation>
-<translation id="6723661294526996303">Кыстармалар менен жөндөөлөрдү импорттоо…</translation>
+<translation id="6723661294526996303">Кыстармалар менен параметрлерди импорттоо…</translation>
<translation id="6723839827191551955">Тышкы экранга чыгарып жаткан медиа файлды башкарыңыз</translation>
<translation id="6723839937902243910">Кубат</translation>
<translation id="6725073593266469338">Интерфейс кызматы</translation>
@@ -6390,7 +6390,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="6756643207511618722">Кеп синтезаторлору</translation>
<translation id="6757431299485455321">Башка түзмөктөргө бул байланыш түйүнүн табууга жардам бериңиз.</translation>
<translation id="6758056191028427665">Биздин ишибиз тууралуу билдирип коюңуз.</translation>
-<translation id="6759193508432371551">Демейки жөндөөлөргө кайтаруу</translation>
+<translation id="6759193508432371551">Демейки параметрлерге кайтаруу</translation>
<translation id="6761431452438552910">Bluetooth түзмөгүңүз жупташтыруу режиминде жана жакын турганын текшериңиз. Ишенимдүү түзмөктөр менен гана жупташтырыңыз.</translation>
<translation id="676158322851696513">"<ph name="EXTENSION_NAME" />"</translation>
<translation id="6762833852331690540">Күйүк</translation>
@@ -6545,9 +6545,9 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="6878422606530379992">Сенсорлорду колдонууга уруксат берилген</translation>
<translation id="6880587130513028875">Бул баракта сүрөттөр бөгөттөлгөн.</translation>
<translation id="688312408602122936">Steam аркылуу орнотулган бардык оюндар жана колдонмолор да бул түзмөктөн өчүрүлөт</translation>
-<translation id="6883319974225028188">Ой! Тутум түзмөктүн конфигурациясын сактай албай койду.</translation>
+<translation id="6883319974225028188">Ой! Система түзмөктүн конфигурациясын сактай албай койду.</translation>
<translation id="6884474387073389421">Тандалган аккаунтка кирүү дайындарын чын эле өчүрөсүзбү?</translation>
-<translation id="6885771755599377173">Тутум боюнча маалыматты алдын ала көрүү</translation>
+<translation id="6885771755599377173">Система боюнча маалыматты алдын ала көрүү</translation>
<translation id="6886380424988777998">Linux жаңыртылган жок</translation>
<translation id="6886871292305414135">Шилтемени жаңы &amp;өтмөктө ачуу</translation>
<translation id="6889957081990109136">Которгуч дайындала элек</translation>
@@ -6699,7 +6699,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="7005812687360380971">Бузулуу</translation>
<translation id="7005848115657603926">Беттер аралыгы жараксыз, <ph name="EXAMPLE_PAGE_RANGE" /> колдонуңуз</translation>
<translation id="7006438259896942210"><ph name="USER_EMAIL_ADDRESS" /> аккаунтун <ph name="PROFILE_NAME" /> башкарат</translation>
-<translation id="700651317925502808">Жөндөөлөрдү баштапкы абалга келтиресизби?</translation>
+<translation id="700651317925502808">Параметрлерди баштапкы абалга келтиресизби?</translation>
<translation id="7006634003215061422">Төмөнкү кыры</translation>
<translation id="7007648447224463482">Баарын жаңы терезеде ачуу</translation>
<translation id="7008815993384338777">Учурда роумингде эмес</translation>
@@ -6764,7 +6764,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="706342288220489463">Жардам алуу үчүн Жардамчыңызга экрандагы маалыматты колдонууга уруксат бериңиз</translation>
<translation id="7064734931812204395">Linux контейнери конфигурацияланууда. Бул 30 мүнөткө созулушу мүмкүн.</translation>
<translation id="7065223852455347715">Бул түзмөк мекеме каттоосунан коргой турган режимде кулпуланган. Эгер түзмөктү каттагыңыз келсе, адегенде түзмөктү калыбына келтирип алышыңыз керек.</translation>
-<translation id="7065534935986314333">Тутум тууралуу</translation>
+<translation id="7065534935986314333">Система тууралуу</translation>
<translation id="706626672220389329">Түзмөктү кошууда ката кетти. Белгиленген бөлүшүү мурунтан эле кошулган.</translation>
<translation id="7067396782363924830">Көшүү режиминдеги түстөр</translation>
<translation id="7067725467529581407">Бул нерсе башка көрүнбөсүн.</translation>
@@ -6773,7 +6773,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="7072010813301522126">Кыска жол аталышы</translation>
<translation id="7074066049407662839">Сырсөздөрдү сактоо үчүн аккаунтка кириңиз</translation>
<translation id="7075513071073410194">PKCS #1 MD5 RSA шифрлөөсү менен</translation>
-<translation id="7075625805486468288">HTTPS/SSL тастыктамаларды жана жөндөөлөрдү башкарыңыз</translation>
+<translation id="7075625805486468288">HTTPS/SSL тастыктамаларды жана параметрлерди башкарыңыз</translation>
<translation id="7076875098323397992">Жаңыртылып башталган жок</translation>
<translation id="7077829361966535409">Кирүү бети учурдагы прокси параметрлери аркылуу жүктөлбөй койду. <ph name="GAIA_RELOAD_LINK_START" />Кайра кирип көрүңүз<ph name="GAIA_RELOAD_LINK_END" /> же башка <ph name="PROXY_SETTINGS_LINK_START" />прокси параметрлерин<ph name="PROXY_SETTINGS_LINK_END" /> пайдаланыңыз.</translation>
<translation id="7078120482318506217">Бардык тармактар</translation>
@@ -6813,7 +6813,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="7115361495406486998">Жеткиликтүү байланыштар жок</translation>
<translation id="7117228822971127758">Бир аздан кийин кайталап көрүңүз</translation>
<translation id="711840821796638741">Башкарылган кыстармаларды көрсөтүү</translation>
-<translation id="711985611146095797">Бул барак тутумга кирген Google аккаунттарыңызды башкаруу мүмкүнчүлүгүн берет. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation>
+<translation id="711985611146095797">Бул барак системага кирген Google аккаунттарыңызды башкаруу мүмкүнчүлүгүн берет. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation>
<translation id="7120762240626567834">VPN туташтырылбаса, Chrome серепчиси жана Android трафиги бөгөттөлөт</translation>
<translation id="7121438501124788993">Иштеп чыгуучу режими</translation>
<translation id="7121728544325372695">Акылдуу тирелер</translation>
@@ -6857,7 +6857,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="7171000599584840888">Профиль кошуу...</translation>
<translation id="7171259390164035663">Катталбасын</translation>
<translation id="7172470549472604877">{NUM_TABS,plural, =1{Өтмөктү жаңы топко кошуу}other{Өтмөктөрдү жаңы топко кошуу}}</translation>
-<translation id="7173114856073700355">Жөндөөлөрдү ачуу</translation>
+<translation id="7173114856073700355">Параметрлерди ачуу</translation>
<translation id="7174199383876220879">Жаңы! Музыканы, видеолорду жана башкаларды көзөмөлдөңүз.</translation>
<translation id="7175037578838465313"><ph name="NAME" /> конфигурациялоо</translation>
<translation id="7175353351958621980">Төмөнкүдөн жүктөлдү:</translation>
@@ -6909,7 +6909,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="7225082563376899794">Сырсөздөрдү толтурууда Windows Hello функциясын колдонуу</translation>
<translation id="7225179976675429563">Тармактын түрү жок</translation>
<translation id="7227458944009118910">Төмөндөгү колдонмолор протоколдун шилтемелерин да иштете алышат. Башка колдонмолор уруксат сурашат.</translation>
-<translation id="7228056665272655255">Манжа изин тууралоо үчүн балаңыз баскычтоптун жогорку оң жагындагы манжа изинин сенсоруна тийип коюшу керек. Балаңыздын манжасынын изи <ph name="DEVICE_TYPE" /> түзмөгүндө коопсуз сакталат.</translation>
+<translation id="7228056665272655255">Манжа изин коюу үчүн балаңыз баскычтоптун жогорку оң жагындагы манжа изинин сенсоруна тийип коюшу керек. Балаңыздын манжасынын изи <ph name="DEVICE_TYPE" /> түзмөгүндө коопсуз сакталат.</translation>
<translation id="7228523857728654909">Экранды кулпулоо жана аккаунтка кирүү</translation>
<translation id="7228854227189381547">Которулбасын</translation>
<translation id="7230222852462421043">&amp;Терезени калыбына келтирүү</translation>
@@ -6994,7 +6994,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="7304030187361489308">Бийик</translation>
<translation id="7305123176580523628">USB принтери туташтырылды</translation>
<translation id="730515362922783851">Жергиликтүү тармактагы же интернеттеги дайындарды түзмөктөр ортосунда алмашуу</translation>
-<translation id="7306521477691455105">Жөндөөлөрдү ачып, <ph name="USB_DEVICE_NAME" /> түзмөгүн <ph name="USB_VM_NAME" /> менен байланыштырыңыз</translation>
+<translation id="7306521477691455105">Параметрлерди ачып, <ph name="USB_DEVICE_NAME" /> түзмөгүн <ph name="USB_VM_NAME" /> менен байланыштырыңыз</translation>
<translation id="7307129035224081534">Тындырылды</translation>
<translation id="7308643132139167865">Вебсайттын тилдери</translation>
<translation id="7310598146671372464">Аккаунтка кирбей калды. Сервер Kerberos шифрлөөсүнүн мындай түрлөрүн колдоого албайт. Администраторуңузга кайрылыңыз.</translation>
@@ -7121,7 +7121,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="7419565702166471774">Ар дайым коопсуз туташуулар колдонулсун</translation>
<translation id="742130257665691897">Кыстармалар өчүрүлдү</translation>
<translation id="7421925624202799674">Барак булагын карап &amp;көрүү</translation>
-<translation id="7422192691352527311">Жеке жөндөөлөр…</translation>
+<translation id="7422192691352527311">Жеке параметрлер…</translation>
<translation id="7423098979219808738">Адегенде сура</translation>
<translation id="7423425410216218516">Түзмөк <ph name="MINUTES" /> мүнөткө чейин көрүнөт</translation>
<translation id="7423513079490750513">Өчүрүү: <ph name="INPUT_METHOD_NAME" /></translation>
@@ -7167,7 +7167,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="7458715171471938198">Колдонмолор калыбына келтирилсинби?</translation>
<translation id="7460045493116006516">Сиз орнотуп алган учурдагы тема</translation>
<translation id="7461924472993315131">Кадап коюу</translation>
-<translation id="746216226901520237">Эми <ph name="DEVICE_TYPE" /> түзмөгүнүн кулпусун телефонуңуз менен ачасыз. Жөндөөлөргө өтүп, Smart Lock'ту өчүрүп койсоңуз болот.</translation>
+<translation id="746216226901520237">Эми <ph name="DEVICE_TYPE" /> түзмөгүнүн кулпусун телефонуңуз менен ачасыз. Параметрлерге өтүп, Smart Lock'ту өчүрүп койсоңуз болот.</translation>
<translation id="7464153996453281700">Компонент жаңыртылган</translation>
<translation id="7464637891177137294">Аны <ph name="ACCOUNT" /> Google аккаунтуңузга сактаңыз</translation>
<translation id="7465522323587461835">{NUM_OPEN_TABS,plural, =1{# өтмөк ачык, өтмөк тасмасын өчүрүү же күйгүзүү үчүн басыңыз}other{# өтмөк ачык, өтмөк тасмасын өчүрүү же күйгүзүү үчүн басыңыз}}</translation>
@@ -7241,7 +7241,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="7529411698175791732">Интернет туташууңузду текшериңиз. Эгер көйгөй чечилбесе, каттоо эсебинен чыгып, кайра кирип көрүңүз.</translation>
<translation id="7529876053219658589">{0,plural, =1{Конок режиминдеги терезелерди жабуу}other{Конок режиминдеги терезелерди жабуу}}</translation>
<translation id="7530016656428373557">Кубаттын түгөнүү ылдамдыгы Ватт менен</translation>
-<translation id="7531310913436731628">Жайгашкан жер Mac'тын Тутум параметрлеринен өчүрүлдү</translation>
+<translation id="7531310913436731628">Жайгашкан жер Mac'тын Система параметрлеринен өчүрүлдү</translation>
<translation id="7531771599742723865">Түзмөк колдонулууда</translation>
<translation id="7531779363494549572">Параметрлер &gt; Колдонмолор жана билдирмелер &gt; Билдирмелер бөлүмүнө өтүңүз.</translation>
<translation id="7532009420053991888"><ph name="LINUX_APP_NAME" /> жооп бербей жатат. Аны жабуу үчүн "Мажбурлап токтотуу" баскычын басыңыз.</translation>
@@ -7275,7 +7275,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="7561982940498449837">Менюну жабуу</translation>
<translation id="756445078718366910">Серепчи терезесин ачуу</translation>
<translation id="7564847347806291057">Процессти бүтүрүү</translation>
-<translation id="756503097602602175">Кирип турган Google аккаунттарын <ph name="LINK_BEGIN" />Жөндөөлөрдөн<ph name="LINK_END" /> башкара аласыз. Вебсайттарга жана колдонмолорго берилген уруксаттар бардык аккаунттарга карата колдонулушу мүмкүн. Эгер сайттар менен колдонмолордун аккаунтуңуздагы маалыматты колдонушун каалабасаңыз, <ph name="DEVICE_TYPE" /> түзмөгүңүзгө конок режиминде же <ph name="LINK_2_BEGIN" />жашыруун терезеден<ph name="LINK_2_END" /> кирсеңиз болот.</translation>
+<translation id="756503097602602175">Кирип турган Google аккаунттарын <ph name="LINK_BEGIN" />Параметрлерден<ph name="LINK_END" /> башкара аласыз. Вебсайттарга жана колдонмолорго берилген уруксаттар бардык аккаунттарга карата колдонулушу мүмкүн. Эгер сайттар менен колдонмолордун аккаунтуңуздагы маалыматты колдонушун каалабасаңыз, <ph name="DEVICE_TYPE" /> түзмөгүңүзгө конок режиминде же <ph name="LINK_2_BEGIN" />жашыруун терезеден<ph name="LINK_2_END" /> кирсеңиз болот.</translation>
<translation id="7566118625369982896">Play колдонмосундагы шилтемелерди башкаруу</translation>
<translation id="756809126120519699">Chrome дайындары тазаланды</translation>
<translation id="756876171895853918">Аватарды ыңгайлаштыруу</translation>
@@ -7329,7 +7329,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="7616214729753637086">Түзмөк катталууда...</translation>
<translation id="7617263010641145920">Play Store'ду күйгүзүү</translation>
<translation id="7617648809369507487">Билдирүүлөрдүн үнүн басыңыз</translation>
-<translation id="7621382409404463535">Тутум түзмөктүн конфигурациясын сактай албай койду.</translation>
+<translation id="7621382409404463535">Система түзмөктүн конфигурациясын сактай албай койду.</translation>
<translation id="7621595347123595643">Сырсөзүңүздү же PIN кодуңузду унутуп калсаңыз, түзмөктөгү маалыматты калыбына келтире албай каласыз.</translation>
<translation id="7622114377921274169">Кубатталууда.</translation>
<translation id="7622768823216805500">Сайттар адатта төлөмдү жеңилдетүү сыяктуу сатып алуу функциялары үчүн төлөм иштеткичтерин орнотот</translation>
@@ -7558,7 +7558,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="7798504574384119986">Тармактын уруксаттарын көрүү</translation>
<translation id="7798844538707273832"><ph name="PERMISSION" /> – автоматтык түрдө бөгөттөлдү</translation>
<translation id="7800518121066352902">С&amp;аат жебесине каршы айлантуу</translation>
-<translation id="7801679634091975683">Бул жерде киргизген өзгөртүүлөрүңүз Lacros Chrome серепчисине карата гана колдонулат. Chrome серепчисинин параметрлерине өзгөрүүлөрдү киргизүү үчүн Chrome серепчисин ачып, жөндөөлөргө өтүңүз.</translation>
+<translation id="7801679634091975683">Бул жерде киргизген өзгөртүүлөрүңүз Lacros Chrome серепчисине карата гана колдонулат. Chrome серепчисинин параметрлерине өзгөрүүлөрдү киргизүү үчүн Chrome серепчисин ачып, параметрлерге өтүңүз.</translation>
<translation id="780301667611848630">Жок, рахмат</translation>
<translation id="7804072833593604762">Өтмөк жабылды</translation>
<translation id="7805768142964895445">Статусу</translation>
@@ -7643,7 +7643,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="788453346724465748">Аккаунттун маалыматы жүктөлүүдө...</translation>
<translation id="7886279613512920452">{COUNT,plural, =1{нерсе}other{# нерсе}}</translation>
<translation id="7886605625338676841">eSIM-карта</translation>
-<translation id="7887174313503389866">Негизги купуялык жана коопсуздукту көзөмөлдөө каражаттары тууралуу коштомо. Кошумча параметрлерди көрүү үчүн жеке жөндөөлөргө өтүңүз.</translation>
+<translation id="7887174313503389866">Негизги купуялык жана коопсуздукту көзөмөлдөө каражаттары тууралуу коштомо. Кошумча параметрлерди көрүү үчүн жеке параметрлерге өтүңүз.</translation>
<translation id="7887334752153342268">Көчүрмөлөө</translation>
<translation id="7887864092952184874">Bluetooth чычканы жупташты</translation>
<translation id="7889371445710865055">Текстти айтып киргизүү тилин өзгөртүү</translation>
@@ -7712,7 +7712,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="7942349550061667556">Кызыл</translation>
<translation id="7943368935008348579">PDF файлдарын жүктөп алуу</translation>
<translation id="7943837619101191061">Жайгашкан жерди кошуу…</translation>
-<translation id="7944772052836377867">Шайкештирүү бул сиз экениңизди ырасташы керек</translation>
+<translation id="7944772052836377867">Шайкештирүү өзүңүздү ырасташы керек</translation>
<translation id="7945031593909029181">"<ph name="CHROME_EXTENSION_NAME" />" туташканы жатат</translation>
<translation id="7945703887991230167">Тандалган үн</translation>
<translation id="7946586320617670168">Түпнуска шилтемени жазыңыз</translation>
@@ -7766,7 +7766,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="7986295104073916105">Сакталган сырсөз параметрлерин окуу жана өзгөртүү</translation>
<translation id="7987814697832569482">Ар дайым ушул VPN аркылуу туташуу</translation>
<translation id="7988355189918024273">Атайын мүмкүнчүлүктөр иштетилсин</translation>
-<translation id="7988805580376093356">OS тутумуңузду өчүрбөй туруп, <ph name="DEVICE_OS" /> тутумун USB түзмөгүнөн иштетиңиз.</translation>
+<translation id="7988805580376093356">OS тутумуңузду өчүрбөй туруп, <ph name="DEVICE_OS" /> системасын USB түзмөгүнөн иштетиңиз.</translation>
<translation id="7990863024647916394"><ph name="DISPLAY_NAME" /> <ph name="COUNT" />-үн</translation>
<translation id="7991296728590311172">Switch Access параметрлери</translation>
<translation id="7992203134935383159">Кепти синтездөө</translation>
@@ -7960,7 +7960,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="8158117992543756526">Бул түзмөк <ph name="MONTH_AND_YEAR" /> программа менен коопсуздук жаңыртууларын автоматтык түрдө албай калды. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation>
<translation id="8159652640256729753">Экранды бөлүү жана иш такталарды которуу сыяктуу аракеттер ырасталганда, дирилдейт. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation>
<translation id="816055135686411707">Тастыктама ишенимин жөндөө катасы</translation>
-<translation id="8160775796528709999">Жөндөөлөрдөн Ыкчам коштомо жазууларды иштетүү менен, аудио жана видеоңуз үчүн коштомо жазууларды алып туруңуз</translation>
+<translation id="8160775796528709999">Параметрлерден Ыкчам коштомо жазууларды иштетүү менен, аудио жана видеоңуз үчүн коштомо жазууларды алып туруңуз</translation>
<translation id="816095449251911490"><ph name="SPEED" /> – <ph name="RECEIVED_AMOUNT" />, <ph name="TIME_REMAINING" /></translation>
<translation id="8161293209665121583">Веб барактарды Окугуч режими</translation>
<translation id="8161604891089629425">Контурдук арип</translation>
@@ -8105,7 +8105,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="8284279544186306258">бардык <ph name="WEBSITE_1" /> сайттар</translation>
<translation id="8284326494547611709">Коштомо жазуулар</translation>
<translation id="8286036467436129157">Кириңиз</translation>
-<translation id="8286227656784970313">Тутум сөздүгүн пайдалануу</translation>
+<translation id="8286227656784970313">Система сөздүгүн пайдалануу</translation>
<translation id="828642162569365647">Бул сырсөз же PIN код ушул <ph name="DEVICE_TYPE" /> түзмөгүндөгү жана телефонуңуздан кире турган бардык маалыматты коргойт. <ph name="DEVICE_TYPE" /> сизди ойготкон сайын кулпусун ачышыңыз керек болот.</translation>
<translation id="8287902281644548111">API чалуу/URL боюнча издөө</translation>
<translation id="8288032458496410887"><ph name="APP" /> колдонмосун чыгарып салуу…</translation>
@@ -8232,12 +8232,12 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="8403807918453631441">Сырсөздөрүңүздү сактаганда <ph name="BRAND" /> аларды текшере алат</translation>
<translation id="8405046151008197676">Акыркы жаңыртуу жөнүндө маалымат алыңыз</translation>
<translation id="8407199357649073301">Таржымалдын деңгээли:</translation>
-<translation id="8408270600235826886">Google'га кайсы маалыматты жөнөтүүнү көзөмөлдөй аласыз. Каалаган убакта жөндөөлөргө өтүп, бул функциянын параметрлерин өзгөртө аласыз. Дайындар Google'дун <ph name="BEGIN_LINK" />Купуялык саясатына<ph name="END_LINK" /> ылайык колдонулат.</translation>
+<translation id="8408270600235826886">Google'га кайсы маалыматты жөнөтүүнү көзөмөлдөй аласыз. Каалаган убакта параметрлерге өтүп, бул функциянын параметрлерин өзгөртө аласыз. Дайындар Google'дун <ph name="BEGIN_LINK" />Купуялык саясатына<ph name="END_LINK" /> ылайык колдонулат.</translation>
<translation id="84098433273647700">Сиз орнотуп алган учурдагы тема.</translation>
<translation id="8410775397654368139">Google Play</translation>
<translation id="8412136526970428322">Төмөнкүлөргө уруксат берилди: <ph name="PERMISSION" /> жана дагы <ph name="COUNT" /></translation>
<translation id="8413385045638830869">Адегенде суралсын (сунушталат)</translation>
-<translation id="8413956290606243087">ChromeOS тутумуна кыстарылган экрандагы нерсени окуп берүүчү ChromeVox куралын иштетесизби?</translation>
+<translation id="8413956290606243087">ChromeOS системасына кыстарылган экрандагы нерсени окуп берүүчү ChromeVox куралын иштетесизби?</translation>
<translation id="8414249071344507766">Эскерүүлөр эки күнгө жашырылды</translation>
<translation id="8414396119627470038"><ph name="SITE_ETLD_PLUS_ONE" /> сайтына <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> менен кириңиз</translation>
<translation id="8414685983518053656">Эскертүүлөр</translation>
@@ -8437,7 +8437,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="8617748779076050570">Коопсуз байланыш идентификатору: <ph name="CONNECTION_ID" /></translation>
<translation id="8619803522055190423">Көлөкөнү азайтуу</translation>
<translation id="8619892228487928601"><ph name="CERTIFICATE_NAME" />: <ph name="ERROR" /></translation>
-<translation id="8621866727807194849">Компьютериңизде кооптуу программа бар. Chrome аны алып салып, жөндөөлөрдү калыбына келтирип, кеңейтүүлөрдү өчүрүүдө. Эми серепчиңиз ойдогудай иштеп калат.</translation>
+<translation id="8621866727807194849">Компьютериңизде кооптуу программа бар. Chrome аны алып салып, параметрлерди калыбына келтирип, кеңейтүүлөрдү өчүрүүдө. Эми серепчиңиз ойдогудай иштеп калат.</translation>
<translation id="8621979332865976405">Экраныңызды толугу менен бөлүшүңүз</translation>
<translation id="8624315169751085215">Алмашуу буферине көчүрүү</translation>
<translation id="8624354461147303341">Арзандатууларга ээ болуу</translation>
@@ -8511,7 +8511,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="8669284339312441707">Жылуураак</translation>
<translation id="8670537393737592796">Бул жерге тезирээк кайтуу үчүн <ph name="APP_NAME" /> колдонмосун орнотуңуз</translation>
<translation id="867085395664725367">Серверде убактылуу ката кетти.</translation>
-<translation id="8673026256276578048">Желеден издөө…</translation>
+<translation id="8673026256276578048">Интернеттен издөө…</translation>
<translation id="867329473311423817">Бардык экрандардагы терезелерди тескей алат</translation>
<translation id="8673383193459449849">Сервер көйгөйү</translation>
<translation id="8674903726754070732">Тилекке каршы, компьютериңиз туура эмес форматтагы аппараттык камсыздоонун идентификатору менен конфигурацияланган. Ушундан улам, ChromeOS эң акыркы коопсуздук чаралары менен жаңыртылбагандыктан, компьютериңиз <ph name="BEGIN_BOLD" />зыянкеч чабуулдардан коргоно албай калышы мүмкүн<ph name="END_BOLD" />.</translation>
@@ -8526,7 +8526,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="8678538439778360739">Дайын-даректер сырсүйлөм менен <ph name="TIME" /> күнү шифрленген. Бул Google Pay'деги төлөм ыкмалары менен даректерге карата колдонулбайт.</translation>
<translation id="8678582529642151449">Өтмөктөр кичирейбейт</translation>
<translation id="8678933587484842200">Бул колдонмону кандай жол менен ачкыңыз келет?</translation>
-<translation id="8680251145628383637">Бардык түзмөктөрүңүздө кыстармаларыңызды, таржымалды, сырсөздөрдү жана башка жөндөөлөрдү алуу үчүн киришиңиз керек. Мындан тышкары Google кызматтарына да автоматтык түрдө киресиз.</translation>
+<translation id="8680251145628383637">Бардык түзмөктөрүңүздө кыстармаларыңызды, таржымалды, сырсөздөрдү жана башка параметрлерди алуу үчүн киришиңиз керек. Мындан тышкары Google кызматтарына да автоматтык түрдө киресиз.</translation>
<translation id="8681886425883659911">Тажатма же адаштыруучу жарнамаларды көрсөткөнү менен билинген сайттарда жарнамалар бөгөттөлөт</translation>
<translation id="8682730193597992579"><ph name="PRINTER_NAME" /> туташтырылды жана даяр</translation>
<translation id="8687103160920393343"><ph name="FILE_NAME" /> файлын жүктөп алууну токтотуу</translation>
@@ -8555,7 +8555,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="8711402221661888347">Туздалган бадыраң</translation>
<translation id="8712637175834984815">Түшүндүм</translation>
<translation id="8713110120305151436">Атайын мүмкүнчүлүктөрдү Ыкчам параметрлерде көрсөтүү</translation>
-<translation id="8713570323158206935"><ph name="BEGIN_LINK1" />Тутум маалыматын<ph name="END_LINK1" /> жөнөтүү</translation>
+<translation id="8713570323158206935"><ph name="BEGIN_LINK1" />Система маалыматын<ph name="END_LINK1" /> жөнөтүү</translation>
<translation id="8714838604780058252">Фондук графикалар</translation>
<translation id="871515167518607670">Түзмөк тандаңыз. Андан кийин баракты көрүү үчүн ал түзмөктө Chrome'ду ачыңыз.</translation>
<translation id="8715480913140015283">Фондогу өтмөк камераңызды колдонуп жатат</translation>
@@ -8605,7 +8605,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="8752451679755290210">Элементтерге автоматтык түрдө өтүү</translation>
<translation id="8753868764580670305">Ушул түзмөктө сакталган сырсөздөрдү көрүү жана башкаруу</translation>
<translation id="8753948258138515839">Файлдар колдонмосу Google Drive'да, тышкы сактагычта же ChromeOS Flex түзмөгүңүздө сакталган файлдарды ыкчам колдонуу мүмкүнчүлүгүн берет.</translation>
-<translation id="8754200782896249056">&lt;p&gt;<ph name="PRODUCT_NAME" /> колдоого алынган иштакта чөйрөсүндө иштеп жатканда, системанын прокси параметрлери колдонулат. Бирок тутумуңуз колдоого алынбайт же тутум конфигурациясын ишке киргизүүдө көйгөй келип чыгышы мүмкүн.&lt;/p&gt;
+<translation id="8754200782896249056">&lt;p&gt;<ph name="PRODUCT_NAME" /> колдоого алынган иштакта чөйрөсүндө иштеп жатканда, системанын прокси параметрлери колдонулат. Бирок системаңыз колдоого алынбайт же тутум конфигурациясын ишке киргизүүдө көйгөй келип чыгышы мүмкүн.&lt;/p&gt;
&lt;p&gt;Бирок буйрук сабы аркылуу баары бир конфигурациялай берсеңиз болот. Желек жана чөйрө өзгөрмөлөрү тууралуу көбүрөөк маалымат алуу үчүн &lt;code&gt;man <ph name="PRODUCT_BINARY_NAME" />&lt;/code&gt; дегенди караңыз.&lt;/p&gt;</translation>
<translation id="8755175579224030324">Уюмуңуз үчүн коопсуздукка байланышкан тапшырмаларды аткаруу, мисалы, түзмөктө сакталган тастыктамаларды жана ачкычтарды башкаруу</translation>
@@ -8779,7 +8779,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="8907701755790961703">Өлкө тандаңыз</translation>
<translation id="8909298138148012791"><ph name="APP_NAME" /> чыгарылып салынды</translation>
<translation id="8909833622202089127">Сайт кайда жүргөнүңүзгө көз салууда</translation>
-<translation id="8910222113987937043">Кыстармаларыңызга, таржымалыңызга, сырсөздөрүңүзгө жана башка жөндөөлөргө киргизилген өзгөрүүлөр Google Аккаунтуңуз менен шайкештирилбейт. Ал эми учурдагы дайын-даректериңиз Google Аккаунтуңузде сакталып кала берет жана аларды <ph name="BEGIN_LINK" />Google Жеке кеңсесинен<ph name="END_LINK" /> башкарса болот.</translation>
+<translation id="8910222113987937043">Кыстармаларыңызга, таржымалыңызга, сырсөздөрүңүзгө жана башка параметрлерге киргизилген өзгөрүүлөр Google Аккаунтуңуз менен шайкештирилбейт. Ал эми учурдагы дайын-даректериңиз Google Аккаунтуңузде сакталып кала берет жана аларды <ph name="BEGIN_LINK" />Google Жеке кеңсесинен<ph name="END_LINK" /> башкарса болот.</translation>
<translation id="8910987510378294980">Түзмөктөрдүн тизмесин жашыруу</translation>
<translation id="8912362522468806198">Google аккаунту</translation>
<translation id="8912810933860534797">Авто-скандоону иштетүү</translation>
@@ -8842,7 +8842,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="8972513834460200407">Google серверлеринен жүктөп алуу аракеттери файрвол тарабынан бөгөттөлбөгөндүгүн тармактык администраторуңуздан тактаңыз.</translation>
<translation id="8973263196882835828">&amp;Ыкчам коштомо жазууларды иштетүү</translation>
<translation id="8973557916016709913">Чоңойтуп/кичирейтүү деңгээлин алып салуу</translation>
-<translation id="8973596347849323817">Түзмөктү өзүңүзгө ыңгайлаштырып алыңыз. Бул атайын мүмкүнчүлүктөрдүн параметрлерин кийинчерээк Жөндөөлөрдөн өзгөртсөңүз болот.</translation>
+<translation id="8973596347849323817">Түзмөктү өзүңүзгө ыңгайлаштырып алыңыз. Бул атайын мүмкүнчүлүктөрдүн параметрлерин кийинчерээк Параметрлерден өзгөртсөңүз болот.</translation>
<translation id="897414447285476047">Начар байланыштан улам файл толук жүктөлүп алынбай калды.</translation>
<translation id="897525204902889653">Карантин кызматы</translation>
<translation id="8975396729541388937">Сизге жөнөтүлгөн электрондук каттардагы шилтемени басып, жазылууну каалаган убакта токтото аласыз.</translation>
@@ -8928,7 +8928,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="9037965129289936994">Түпкү бетин көрсөтүү</translation>
<translation id="9038489124413477075">Аты жок куржун</translation>
<translation id="9039014462651733343">{NUM_ATTEMPTS,plural, =1{Дагы бир жолу аракет кыла аласыз.}other{# жолу аракет кыла аласыз.}}</translation>
-<translation id="9040473193163777637">ChromeOS тутумуна кыстарылган экрандагы нерсени окуп берүүчү ChromeVox куралын иштетесизби? Иштетсеңиз, үн баскычтарын 5 секунд коё бербей басып туруңуз.</translation>
+<translation id="9040473193163777637">ChromeOS системасына кыстарылган экрандагы нерсени окуп берүүчү ChromeVox куралын иштетесизби? Иштетсеңиз, үн баскычтарын 5 секунд коё бербей басып туруңуз.</translation>
<translation id="9040661932550800571"><ph name="ORIGIN" /> үчүн сырсөз жаңыртылсынбы?</translation>
<translation id="9041692268811217999">Компьютериңиздеги файлдарды колдонуу мүмкүнчүлүгү администраторуңуз тарабынан өчүрүлдү</translation>
<translation id="904224458472510106">Бул операцияны артка кайтаруу мүмкүн эмес</translation>
@@ -9008,7 +9008,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="9108674852930645435"><ph name="DEVICE_TYPE" /> түзмөгүңүздөгү жаңылыктарды көрүңүз</translation>
<translation id="9108808586816295166">Коопсуз DNS ар дайым жеткиликтүү болбошу мүмкүн</translation>
<translation id="9109122242323516435">Орун бошотуу үчүн түзмөктүн сактагычынан файлдарды жок кылыңыз.</translation>
-<translation id="9109283579179481106">Мобилдик тармакка туташуу</translation>
+<translation id="9109283579179481106">Мобилдик Интернетке туташуу</translation>
<translation id="9111102763498581341">Кулпуну ачуу</translation>
<translation id="9111305600911828693">Уруксаттама жөндөлгөн жок</translation>
<translation id="9111395131601239814"><ph name="NETWORKDEVICE" />: <ph name="STATUS" /></translation>
@@ -9025,7 +9025,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="9116799625073598554">Эскертме жазуучу колдонмо</translation>
<translation id="9117030152748022724">Колдонмолоруңузду башкарыңыз</translation>
<translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />Майнаптуу иштеши үчүн <ph name="DEVICE_OS" /> түзмөгүн ички дискиңизге орнотуп алыңыз. Аны кийинчерээк кирүү экранынан да орното аласыз.<ph name="END_PARAGRAPH1" />
- <ph name="BEGIN_PARAGRAPH2" />Орнотууга даяр эмес болсоңуз, аны байкап көрүү үчүн USB түзмөгүнөн иштете аласыз. Учурдагы OS тутумуңуз жана дайын-даректериңиз өчпөйт, бирок сактагыч жана иштин майнаптуулугу чектелиши мүмкүн.<ph name="END_PARAGRAPH2" /></translation>
+ <ph name="BEGIN_PARAGRAPH2" />Орнотууга даяр эмес болсоңуз, аны байкап көрүү үчүн USB түзмөгүнөн иштете аласыз. Учурдагы OS системаңыз жана дайын-даректериңиз өчпөйт, бирок сактагыч жана иштин майнаптуулугу чектелиши мүмкүн.<ph name="END_PARAGRAPH2" /></translation>
<translation id="9121814364785106365">Кадалган өтмөк катары ачуу</translation>
<translation id="9123287046453017203">Түзмөгүңүз жаңыртылган эмес</translation>
<translation id="9124003689441359348">Сакталган сырсөздөр бул жерде көрүнөт</translation>
@@ -9089,7 +9089,7 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="9180281769944411366">Бир нече мүнөткө созулушу мүмкүн. Linux контейнери иштетилип баштады.</translation>
<translation id="9180380851667544951">Сайт экраныңызды бөлүшө алат</translation>
<translation id="9182556968660520230">Сайттар корголгон мазмунду ойното албасын</translation>
-<translation id="9183331776983279456">Chrome тизмеде 4 апта мурун пайда болгон сайттарды автоматтык түрдө өчүрөт. Сиз кайра кирген сайт тизмеде кайрадан пайда болушу мүмкүн. Же сайттын жарнамаларын бөгөттөп койсоңуз болот.</translation>
+<translation id="9183331776983279456">Chrome тизмеде 4 апта мурун пайда болгон сайттарды автоматтык түрдө өчүрөт. Сиз кайрадан баш баккан сайт тизмеге кайра кошулушу мүмкүн. Же сайттын жарнамаларын бөгөттөп койсоңуз болот.</translation>
<translation id="918352324374649435">{COUNT,plural, =1{Колдонмо}other{# колдонмо}}</translation>
<translation id="9186963452600581158">Баланын Google аккаунту менен кирүү</translation>
<translation id="9187967020623675250">Ачкычтар дал келген жок. <ph name="RESPONSE" /> үчүн каалаган баскычты басыңыз.</translation>
@@ -9132,12 +9132,12 @@ Family Link колдонмосун түзмөгүңүзгө орнотуп, бу
<translation id="932327136139879170">Башкы</translation>
<translation id="932508678520956232">Басып чыгаруу аракети башталбай калды.</translation>
<translation id="933427034780221291">{NUM_FILES,plural, =1{Коопсуздукту текшерүү үчүн бул файлдын көлөмү өтө чоң. Көлөмү 50 Мб чейинки файлдарды жүктөп бере аласыз.}other{Коопсуздукту текшерүү үчүн бул файлдын айрымдарынын көлөмү өтө чоң. Көлөмү 50 Мб чейинки файлдарды жүктөп бере аласыз.}}</translation>
-<translation id="93343527085570547">Юридикалык себептерден улам, материалды өчүрүү же өзгөртүү керек деп ойлосоңуз, <ph name="BEGIN_LINK1" />Юридикалык жардам бөлүмүнө<ph name="END_LINK1" /> өтүңүз. Аккаунтка жана тутумга байланыштуу айрым маалымат Google´га жөнөтүлүшү мүмкүн. Бизге берген маалыматыңыз <ph name="BEGIN_LINK2" />Купуялык саясатына<ph name="END_LINK2" /> жана <ph name="BEGIN_LINK3" />Тейлөө шарттарына<ph name="END_LINK3" /> ылайык, техникалык көйгөйлөрдү чечүүгө жана кызматтарыбыздын сапатын жакшыртууга колдонулат.</translation>
+<translation id="93343527085570547">Юридикалык себептерден улам, материалды өчүрүү же өзгөртүү керек деп ойлосоңуз, <ph name="BEGIN_LINK1" />Юридикалык жардам бөлүмүнө<ph name="END_LINK1" /> өтүңүз. Аккаунтка жана системага байланыштуу айрым маалымат Google´га жөнөтүлүшү мүмкүн. Бизге берген маалыматыңыз <ph name="BEGIN_LINK2" />Купуялык саясатына<ph name="END_LINK2" /> жана <ph name="BEGIN_LINK3" />Тейлөө шарттарына<ph name="END_LINK3" /> ылайык, техникалык көйгөйлөрдү чечүүгө жана кызматтарыбыздын сапатын жакшыртууга колдонулат.</translation>
<translation id="93393615658292258">Сырсөз гана</translation>
<translation id="934244546219308557">Бул топко ат коюңуз</translation>
<translation id="934503638756687833">Эгер зарыл болсо, бул тизмеде жок нерселерди да алып салууга болот. &lt;a href="<ph name="URL" />"&gt;Зыяндуу программалардан коргоо&lt;/a&gt; тууралуу кененирээк маалымат алуу үчүн Chrome'дун Купуялык саясатынын артыкчылыктарын карап чыгыңыз.</translation>
<translation id="93480724622239549">Мүчүлүштүк же ката</translation>
-<translation id="935854577147268200">Smart Lock үчүн телефон өзгөрдү. Smart Lock'ту жаңыртуу үчүн, сырсөзүңүздү киргизиңиз. Эми <ph name="DEVICE_TYPE" /> түзмөгүңүздүн кулпусун телефонуңуз менен ачсаңыз болот. Жөндөөлөргө өтүп, Smart Lock'ту өчүрүп койсоңуз болот.</translation>
+<translation id="935854577147268200">Smart Lock үчүн телефон өзгөрдү. Smart Lock'ту жаңыртуу үчүн, сырсөзүңүздү киргизиңиз. Эми <ph name="DEVICE_TYPE" /> түзмөгүңүздүн кулпусун телефонуңуз менен ачсаңыз болот. Параметрлерге өтүп, Smart Lock'ту өчүрүп койсоңуз болот.</translation>
<translation id="936646668635477464">Камера жана микрофон</translation>
<translation id="936801553271523408">Системанын диагностика дайындары</translation>
<translation id="93766956588638423">Кеңейтүүнү оңдоо</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_lo.xtb b/chromium/chrome/app/resources/generated_resources_lo.xtb
index 4f46c2370ea..6cc2c65b0d7 100644
--- a/chromium/chrome/app/resources/generated_resources_lo.xtb
+++ b/chromium/chrome/app/resources/generated_resources_lo.xtb
@@ -1205,7 +1205,7 @@
<translation id="2048554637254265991">ເກີດຜິດພາດໃນການເລີ່ມຕົວຈັດການກ່ອງບັນຈຸ. ກະລຸນາລອງໃໝ່.</translation>
<translation id="2048653237708779538">ຄຳສັ່ງບໍ່ສາມາດໃຊ້ໄດ້</translation>
<translation id="204914487372604757">ສ້າງ​ທາງ​ລັດ</translation>
-<translation id="2050339315714019657">ລວງຕັ້ງ</translation>
+<translation id="2050339315714019657">ແນວຕັ້ງ</translation>
<translation id="2051555741181591333">ປິດການນຳໃຊ້ຮັອດສະປອດໂດຍອັດຕະໂນມັດ</translation>
<translation id="2052572566310583903">ຕິດຕັ້ງແລ້ວໃນອຸປະກອນອື່ນຂອງທ່ານ</translation>
<translation id="2053105195397337973">ພວກເຮົາກຳລັງສຳຫຼວດວິທີຕ່າງໆໃນການຈຳກັດການຕິດຕາມໃນຂະນະທີ່ເປີດການນຳໃຊ້ເວັບໄຊເພື່ອຢຸດສະແປມໂຄສະນາ ແລະ ການສໍ້ໂກງ.</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_lt.xtb b/chromium/chrome/app/resources/generated_resources_lt.xtb
index 6a7b372913a..a4c0e7185fa 100644
--- a/chromium/chrome/app/resources/generated_resources_lt.xtb
+++ b/chromium/chrome/app/resources/generated_resources_lt.xtb
@@ -1211,7 +1211,7 @@ Jei nenorite, dabar atsijunkite, kad šios paskyros pakeitimai būtų matomi ši
<translation id="2048554637254265991">Paleidžiant sudėtinių rodinių tvarkytuvę įvyko klaida. Bandykite dar kartą.</translation>
<translation id="2048653237708779538">Negalima atlikti veiksmo</translation>
<translation id="204914487372604757">Kurti spartųjį klavišą</translation>
-<translation id="2050339315714019657">Stačias</translation>
+<translation id="2050339315714019657">Portreto režimas</translation>
<translation id="2051555741181591333">Automatiškai išjungti viešosios interneto prieigos tašką</translation>
<translation id="2052572566310583903">Įdiegta kituose jūsų įrenginiuose</translation>
<translation id="2053105195397337973">Ieškome būdų apriboti stebėjimą, padėdami svetainėms išvengti skelbimų šlamšto ir apgaulių.</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_mk.xtb b/chromium/chrome/app/resources/generated_resources_mk.xtb
index 77a09f0c3ad..f78b3a36416 100644
--- a/chromium/chrome/app/resources/generated_resources_mk.xtb
+++ b/chromium/chrome/app/resources/generated_resources_mk.xtb
@@ -187,7 +187,7 @@
<translation id="1160842321113409343">Заради заштита на вашата приватност, автоматски ги бришеме сајтовите од списокот што се постари од 4 седмици. Сајт што ќе го посетите повторно може да се појави на списокот повторно. Можете и да отстраните сајт ако не сакате тој сајт да ги дефинира вашите интереси.</translation>
<translation id="1161575384898972166">Најави се на <ph name="TOKEN_NAME" /> за да извезеш сертификат на клиент.</translation>
<translation id="116173250649946226">Вашиот администратор поставил стандардна тема што не може да се менува.</translation>
-<translation id="1162213688509394031">Сокриј ја лентата за наслов</translation>
+<translation id="1162213688509394031">Скриј ја лентата за наслов</translation>
<translation id="1162479191445552288">Отвори при стартување</translation>
<translation id="1163931534039071049">&amp;Прикажи извор на рамка</translation>
<translation id="1164891049599601209">Внесена на измамнички сајт</translation>
@@ -1231,7 +1231,7 @@
<translation id="2073496667646280609">Можеби немате доволно слободен капацитет на уредот или на избраната локација за бекап. Ослободете простор или изберете друга локација.</translation>
<translation id="2073505299004274893">Употребете <ph name="CHARACTER_LIMIT" /> знаци или помалку</translation>
<translation id="2075474481720804517"><ph name="BATTERY_PERCENTAGE" />% батерија</translation>
-<translation id="2076269580855484719">Сокриј го приклучокот</translation>
+<translation id="2076269580855484719">Скриј го приклучокот</translation>
<translation id="2076672359661571384">Среден (препорачано)</translation>
<translation id="2077129598763517140">Употребете забрзување на хардвер кога е достапно</translation>
<translation id="2078019350989722914">Предупреди пред напуштање (<ph name="KEY_EQUIVALENT" />)</translation>
@@ -1331,7 +1331,7 @@
<translation id="2144557304298909478">Развој на апликации на Android за Linux</translation>
<translation id="2146263598007866206">Сајтовите може автоматски да преземаат слични датотеки одеднаш за да ви штедат време</translation>
<translation id="2147151613919729065">За да ја избришете историјата на „Режим на гостин“, затворете ги сите гостински прозорци.</translation>
-<translation id="2147218225094845757">Сокриј ја страничната табла</translation>
+<translation id="2147218225094845757">Скриј ја страничната табла</translation>
<translation id="2148219725039824548">Грешка при монтирање на споделувањето. Наведеното споделување не е најдено на мрежата.</translation>
<translation id="2148756636027685713">Форматирањето заврши</translation>
<translation id="2148892889047469596">Картичка за емитување</translation>
@@ -1819,7 +1819,7 @@
<translation id="2552966063069741410">Временска зона</translation>
<translation id="2553290675914258594">Потврден пристап</translation>
<translation id="2553340429761841190"><ph name="PRODUCT_NAME" /> не може да се поврзе на <ph name="NETWORK_ID" />. Изберете друга мрежа или обидете се повторно.</translation>
-<translation id="2553440850688409052">Сокриј го приклучокот</translation>
+<translation id="2553440850688409052">Скриј го приклучокот</translation>
<translation id="2554553592469060349">Избраната датотека е преголема (максимална големина: 3 MB).</translation>
<translation id="25568951186001797">Изолирана рамка: <ph name="FENCEDFRAME_SITE" /></translation>
<translation id="2558569818338050235">Вашата историја на прелистувањето влијае на рекламите што ги гледате</translation>
@@ -2638,7 +2638,7 @@
<translation id="3305661444342691068">Отвори PDF во Преглед</translation>
<translation id="3307176291962384345">Добијте попусти за <ph name="MERCHANT_NAME" /></translation>
<translation id="3308116878371095290">Ја спречивме страницата да поставува колачиња.</translation>
-<translation id="3308134619352333507">Сокриј копче</translation>
+<translation id="3308134619352333507">Скриј копче</translation>
<translation id="3308852433423051161">Се вчитува „Помошникот на Google“…</translation>
<translation id="3309330461362844500">ID за профилот на сертификатот</translation>
<translation id="3311445899360743395">Податоците поврзани со апликацијава можеби ќе се отстранат од уредов.</translation>
@@ -2646,7 +2646,7 @@
<translation id="3312883087018430408">За да пребарувате одреден сајт или дел од Chrome, напишете ја кратенката во лентата за адреси, а потоа претпочитаната кратенка од тастатура. На пример, за да пребарувате само обележувачи, напишете „@bookmarks“, а потоа притиснете го копчето Tab или копчето за празно место.</translation>
<translation id="3313622045786997898">Вредност на потпис на сертификат</translation>
<translation id="3313950410573257029">Проверете ја врската</translation>
-<translation id="3315158641124845231">Сокриј <ph name="PRODUCT_NAME" /></translation>
+<translation id="3315158641124845231">Скриј <ph name="PRODUCT_NAME" /></translation>
<translation id="3315442055907669208">Влезете во режим на читач</translation>
<translation id="3317459757438853210">Двострано</translation>
<translation id="3317678681329786349">Камерата и микрофонот се блокирани</translation>
@@ -3249,7 +3249,7 @@
<translation id="3841319830220785495">Стандарден природен глас</translation>
<translation id="3841964634449506551">Погрешна лозинка</translation>
<translation id="3842552989725514455">Фонт Serif</translation>
-<translation id="3843464315703645664">Внатрешно ставена на списокот на дозволен пристап</translation>
+<translation id="3843464315703645664">Интерно додадена во списокот со дозволени</translation>
<translation id="3844888638014364087">Внесено е емоџи</translation>
<translation id="3846116211488856547">Добијте алатки за програмирање веб-сајтови, апликации за Android и друго. Ако инсталирате Linux, ќе се преземат <ph name="DOWNLOAD_SIZE" /> податоци.</translation>
<translation id="3847319713229060696">Помогнете да се подобри безбедноста на интернет за сите</translation>
@@ -3438,7 +3438,7 @@
<translation id="4002329649066944389">Управувајте со исклучоците за конкретни сајтови</translation>
<translation id="4002440992267487163">Закачи го поставувањето</translation>
<translation id="4005817994523282006">Метод за откривање на временската зона</translation>
-<translation id="4007856537951125667">Сокриј ги кратенките</translation>
+<translation id="4007856537951125667">Скриј ги кратенките</translation>
<translation id="4008291085758151621">Информациите за сајтот не се достапни во VR</translation>
<translation id="4010917659463429001">За да ги добиете обележувачите на мобилниот уред, <ph name="GET_IOS_APP_LINK" />.</translation>
<translation id="4014432863917027322">Поправи „<ph name="EXTENSION_NAME" />“?</translation>
@@ -3899,7 +3899,7 @@
<translation id="4444512841222467874">Ако не се ослободи простор, автоматски може да се отстранат корисници и податоци.</translation>
<translation id="4445446646109808714">Договор за лиценца со краен корисник: <ph name="EULA_LINK" /></translation>
<translation id="4446933390699670756">Отсликано</translation>
-<translation id="4448914100439890108">Сокриј ја лозинката за <ph name="USERNAME" /> на <ph name="DOMAIN" /></translation>
+<translation id="4448914100439890108">Скриј ја лозинката за <ph name="USERNAME" /> на <ph name="DOMAIN" /></translation>
<translation id="4449948729197510913">Вашето корисничко име е сопственост на работната сметка на вашата организација. За регистрирање на уредите во сметката, прво треба да ја потврдите сопственоста на доменот во администрациската конзола. За таа цел, ќе ви требаат административни привилегии на сметката.</translation>
<translation id="4449996769074858870">Оваа картичка репродуцира аудио.</translation>
<translation id="4450974146388585462">Дијагностицирај</translation>
@@ -4031,7 +4031,7 @@
<translation id="4563382028841851106">Отстрани од сметката</translation>
<translation id="4563880231729913339">Прст 3</translation>
<translation id="4564245002465020751">Завршете го поставувањето на вашиот телефон</translation>
-<translation id="4565377596337484307">Сокриј ја лозинката</translation>
+<translation id="4565377596337484307">Скриј ја лозинката</translation>
<translation id="4565917129334815774">Складирај ја системската евиденција</translation>
<translation id="4566170377336116390">Ако сакате да се префрлите по регистрацијата, ќе треба да извршите ресетирање на фабричките поставки (фабричко ресетирање) на уредот.</translation>
<translation id="4566417217121906555">Исклучете звук на микрофонот</translation>
@@ -4283,7 +4283,7 @@
<translation id="4798236378408895261">Прикачи <ph name="BEGIN_LINK" />евиденција за Bluetooth<ph name="END_LINK" /> (интерно во Google)</translation>
<translation id="479863874072008121">Управувајте со уредите</translation>
<translation id="4800839971935185386">Прегледајте ги ажурирањата на имињата и иконите</translation>
-<translation id="4801448226354548035">Сокриј сметки</translation>
+<translation id="4801448226354548035">Скриј сметки</translation>
<translation id="4801512016965057443">Дозволи роаминг на мобилен интернет</translation>
<translation id="4804311503028830356">Кликнете ја стрелката наназад за да истражите други опции</translation>
<translation id="4804818685124855865">Прекини врска</translation>
@@ -4400,7 +4400,7 @@
<translation id="4893454800196085005">Добро - DVD</translation>
<translation id="4893522937062257019">На заклучен екран</translation>
<translation id="4898011734382862273">Сертификатот „<ph name="CERTIFICATE_NAME" />“ претставува Орган за сертификати</translation>
-<translation id="4899052647152077033">Инверзија на бои</translation>
+<translation id="4899052647152077033">Инверзија на боите</translation>
<translation id="4899696330053002588">Содржи реклами</translation>
<translation id="489985760463306091">За да завршите со отстранувањето на штетниот софтвер, рестартирајте го компјутерот</translation>
<translation id="4900392736118574277">Вашата страница на стартување е променета во <ph name="URL" />.</translation>
@@ -6089,7 +6089,7 @@
<translation id="6474498546677193336">Не може да се откаже споделувањето бидејќи некоја апликација ја користи папкава. Споделувањето на папкава ќе се откаже кога Linux ќе се исклучи нареден пат.</translation>
<translation id="6474884162850599008">Исклучете ја сметката на Дискот на Google</translation>
<translation id="6475294023568239942">Ослободете простор на дискот или променете ја големината на дискот на Linux во „Поставки“</translation>
-<translation id="6476482583633999078">Брзина на говор</translation>
+<translation id="6476482583633999078">Брзина на говорот</translation>
<translation id="6477822444490674459">Синхронизацијата на известувањата не е поддржана за телефоните во работен профил. <ph name="LINK_BEGIN" />Дознајте повеќе<ph name="LINK_END" /></translation>
<translation id="6478248366783946499">Да се задржи опасната датотека?</translation>
<translation id="6480327114083866287">Управува: <ph name="MANAGER" /></translation>
@@ -6287,7 +6287,7 @@
<translation id="665355505818177700">Интеграцијата на Chrome <ph name="MS_AD_NAME" /> е поддржана само на платформи x86_64. Оваа функционалност не е поддржана на уреди Chromebook изградени на платформи ARM или x86.</translation>
<translation id="6654509035557065241">Се претпочита мрежа</translation>
<translation id="6655190889273724601">Режим на програмер</translation>
-<translation id="6655458902729017087">Сокриј сметки</translation>
+<translation id="6655458902729017087">Скриј сметки</translation>
<translation id="6657585470893396449">Лозинка</translation>
<translation id="6659213950629089752">Страницата ја зумираше наставката „<ph name="NAME" />“</translation>
<translation id="6659594942844771486">Картичка</translation>
@@ -6320,7 +6320,7 @@
<translation id="6686490380836145850">Затвори картички на десно</translation>
<translation id="6686665106869989887">Картичката е преместена надесно</translation>
<translation id="6686817083349815241">Зачувајте ја лозинката</translation>
-<translation id="6687079240787935001">Сокриј <ph name="MODULE_TITLE" /></translation>
+<translation id="6687079240787935001">Скриј <ph name="MODULE_TITLE" /></translation>
<translation id="6689714331348768690">Побарајте од <ph name="SUPERVISED_USER_NAME" /> да дојде до компјутерот. Вашето дете ќе прочита неколку фрази од екранов за да создаде свој гласовен модел.
<ph name="BR" />
Ако <ph name="SUPERVISED_USER_NAME" /> има потреба од помош при читањето, тогаш нека повторува после вас. Шепотете подалеку од микрофонот за да може „Помошникот“ да го научи гласот на вашето дете, а не вашиот.</translation>
@@ -6750,7 +6750,7 @@
<translation id="7049293980323620022">Да се задржи датотеката?</translation>
<translation id="7050037487872780845">Погрешна конфигурација на точка на пристап</translation>
<translation id="7050519587566342213">Прелистувањето е полесно затоа што е поголема веројатноста да ви се верува од еден сајт до друг.</translation>
-<translation id="7051551856857948729">Сокриј ја вредноста за IBAN</translation>
+<translation id="7051551856857948729">Скриј ја вредноста за IBAN</translation>
<translation id="7052237160939977163">Испрати податоци во траги за учинок</translation>
<translation id="7053983685419859001">Блокирај</translation>
<translation id="7055152154916055070">Пренасочувањето е блокирано:</translation>
@@ -6802,7 +6802,7 @@
<translation id="7102832101143475489">Барањето истече</translation>
<translation id="710640343305609397">Отвори ги мрежните поставки</translation>
<translation id="7107609441453408294">Пуштајте го истото аудио на сите звучници</translation>
-<translation id="7108338896283013870">Сокриј</translation>
+<translation id="7108338896283013870">Скриј</translation>
<translation id="7108668606237948702">enter</translation>
<translation id="7108933416628942903">Заклучи сега</translation>
<translation id="7109543803214225826">Кратенката е отстранета</translation>
@@ -6840,7 +6840,7 @@
<translation id="7144878232160441200">Обиди се повторно</translation>
<translation id="7148426638542880639">Сајтовите може да не функционираат според вашите очекувања. Изберете ја опцијава ако не сакате да оставате податоци на вашиот уред за сајтовите што ги посетувате.</translation>
<translation id="7149839598364933473">Конвертирајте го уредов во уред со <ph name="DEVICE_OS" />.</translation>
-<translation id="7149893636342594995">Изминатите 24 часа</translation>
+<translation id="7149893636342594995">Минатите 24 часа</translation>
<translation id="7152478047064750137">Екстензијава не бара специјални дозволи</translation>
<translation id="7153309176431047193">Конвертирајте слики во текст</translation>
<translation id="7154130902455071009">Променете ја почетната страница во: <ph name="START_PAGE" /></translation>
@@ -7217,7 +7217,7 @@
<translation id="7503191893372251637">Тип сертификат за Netscape</translation>
<translation id="7503985202154027481">Запис за вашата посета на сајтов ќе се чува на вашиот безбедносен клуч.</translation>
<translation id="750509436279396091">Отвори папка на преземања</translation>
-<translation id="7505717542095249632">Сокриј го <ph name="MERCHANT" /></translation>
+<translation id="7505717542095249632">Скриј го <ph name="MERCHANT" /></translation>
<translation id="7506093026325926984">Лозинкава ќе се зачува на уредов</translation>
<translation id="7506130076368211615">Поставете нова мрежа</translation>
<translation id="7506242536428928412">За да го користите новиот безбедносен клуч, поставете нов PIN</translation>
@@ -7973,7 +7973,7 @@
<translation id="8168071266284693455">Обележувачите, лозинките, историјата и другите работи се синхронизирани на сите ваши уреди</translation>
<translation id="8168435359814927499">Содржина</translation>
<translation id="8169165065843881617">{NUM_TABS,plural, =1{Додај ја картичката во списокот за читање}one{Додај ги картичките во списокот за читање}other{Додај ги картичките во списокот за читање}}</translation>
-<translation id="8171334254070436367">Сокриј ги сите картички</translation>
+<translation id="8171334254070436367">Скриј ги сите картички</translation>
<translation id="8172192489606308982">Од други сајтови</translation>
<translation id="8174047975335711832">Информации за уредот</translation>
<translation id="8174876712881364124">Направете бекап на Google Drive. Лесно враќајте ги податоците или менувајте ги уредите во секое време. Бекапов опфаќа податоци за апликациите. Бекапот се прикачува во Google и се шифрира со помош на лозинката за сметката на Google на вашето дете. <ph name="BEGIN_LINK1" />Дознајте повеќе<ph name="END_LINK1" /></translation>
@@ -8678,7 +8678,7 @@
<translation id="8814319344131658221">Јазиците за проверка на правописот зависат од вашите поставки за јазици</translation>
<translation id="8814644416678422095">Хард диск</translation>
<translation id="881782782501875829">Додајте број на порта</translation>
-<translation id="881799181680267069">Сокриј други</translation>
+<translation id="881799181680267069">Скриј други</translation>
<translation id="8818152010000655963">Тапет</translation>
<translation id="8818958672113348984">Потврдете преку телефонот</translation>
<translation id="8820817407110198400">Обележувачи</translation>
@@ -8709,7 +8709,7 @@
<translation id="8838770651474809439">Хамбургер</translation>
<translation id="8838778928843281408">Управувајте со телефоните</translation>
<translation id="883924185304953854">Пребарување со слика</translation>
-<translation id="8841843049738266382">Читај и менувај ги корисниците од списокот на дозволен пристап</translation>
+<translation id="8841843049738266382">да ги чита и менува корисниците во списокот со дозволени</translation>
<translation id="8842594465773264717">Избришете го отпечатоков</translation>
<translation id="8845001906332463065">Побарајте помош</translation>
<translation id="8846132060409673887">Прочитај ги производителот и моделот на овој компјутер</translation>
@@ -8835,7 +8835,7 @@
<translation id="8960208913905765425">Конверзија на валути на „Брзи одговори“</translation>
<translation id="8960638196855923532">Сега можете да ги прегледувате неодамнешните известувања и апликации од телефонот</translation>
<translation id="8962051932294470566">Може да споделувате само по една датотека. Обидете се повторно кога ќе заврши тековниот пренос.</translation>
-<translation id="8962083179518285172">Сокриј детали</translation>
+<translation id="8962083179518285172">Скриј детали</translation>
<translation id="8962863356073277855">Форматот на URL треба да биде https://www.example.com</translation>
<translation id="8962918469425892674">Сајтов користи сензори за движење или светлина.</translation>
<translation id="8965037249707889821">Внеси стара лозинка</translation>
@@ -9096,7 +9096,7 @@
<translation id="9180281769944411366">Овој процес можеби ќе потрае неколку минути. Се стартува контејнерот за Linux.</translation>
<translation id="9180380851667544951">Сајтот може да го споделува вашиот екран</translation>
<translation id="9182556968660520230">Не им дозволувај на сајтовите да пуштаат заштитени содржини</translation>
-<translation id="9183331776983279456">Chrome автоматски ги брише сајтовите што се постари од 4 седмици. Сајт што ќе го посетите повторно може одново да се појави на списокот. Или може да блокирате сајт да ви прикажува реклами.</translation>
+<translation id="9183331776983279456">Chrome автоматски ги брише сајтовите што се постари од 4 седмици. Сајт што ќе го отворите повторно може одново да се појави на списокот. Или може да блокирате сајт да ви прикажува реклами.</translation>
<translation id="918352324374649435">{COUNT,plural, =1{Апликација}one{# апликација}other{# апликации}}</translation>
<translation id="9186963452600581158">Најавете се со сметка на Google на дете</translation>
<translation id="9187967020623675250">Клучевите не се совпаѓаат. Притиснете на кое било копче за да <ph name="RESPONSE" />.</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_ml.xtb b/chromium/chrome/app/resources/generated_resources_ml.xtb
index a26969eb94a..20cc8b62268 100644
--- a/chromium/chrome/app/resources/generated_resources_ml.xtb
+++ b/chromium/chrome/app/resources/generated_resources_ml.xtb
@@ -328,7 +328,7 @@
<translation id="1285484354230578868">നിങ്ങളുടെ Google ഡ്രൈവ് അക്കൗണ്ടിൽ ഡാറ്റ സംഭരിക്കുക</translation>
<translation id="1285625592773741684">നിലവിലെ ഡാറ്റാ ഉപയോഗ ക്രമീകരണം "മൊബൈൽ ഡാറ്റ" ആണ്</translation>
<translation id="1285815028662278915">നിങ്ങളുടെ മൊബൈൽ ഡാറ്റ ഹോട്ട്‌സ്‌പോട്ട് പിന്തുണയ്‌ക്കാതിരുന്നേക്കാം. <ph name="BEGIN_LINK_LEARN_MORE" />കൂടുതലറിയുക<ph name="END_LINK_LEARN_MORE" /></translation>
-<translation id="1288037062697528143">സൂര്യാസ്തമയ സമയത്ത് നൈറ്റ് ലൈറ്റ് സ്വമേധയാ ഓണാകും</translation>
+<translation id="1288037062697528143">സൂര്യാസ്തമയ സമയത്ത് നൈറ്റ് ലൈറ്റ് സ്വയമേവ ഓണാകും</translation>
<translation id="1288300545283011870">സംഭാഷണ പ്രോപ്പർട്ടികൾ</translation>
<translation id="1289619947962767206">ഈ ഓപ്ഷന് ഇനി പിന്തുണയില്ല. ഒരു ടാബ് ദൃശ്യമാക്കാൻ, <ph name="GOOGLE_MEET" /> ഉപയോഗിക്കുക.</translation>
<translation id="1291119821938122630"><ph name="MANAGER" /> സേവന നിബന്ധനകൾ</translation>
@@ -388,7 +388,7 @@
<translation id="134589511016534552">തുറന്നിരിക്കുന്ന ടാബുകൾ വിഭാഗത്തിലും മീഡിയ ടാബുകൾ കാണിക്കുന്നു</translation>
<translation id="1346630054604077329">സ്ഥിരീകരിച്ച് റീസ്‌റ്റാർട്ട് ചെയ്യുക</translation>
<translation id="1346748346194534595">ശരി</translation>
-<translation id="1347256498747320987">അപ്‌ഡേറ്റുകളും ആപ്പുകളും ഇൻസ്റ്റാൾ ചെയ്യുക. തുടരുന്നതിലൂടെ, ഈ ഉപകരണം Google-ൽ നിന്നും നിങ്ങളുടെ സേവനദാതാവിൽ നിന്നും ഉപകരണ നിർമ്മാതാവിൽ നിന്നും, ഒരുപക്ഷേ സെല്ലുലാർ ഡാറ്റ ഉപയോഗിച്ച്, അപ്‌ഡേറ്റുകളും ആപ്പുകളും സ്വമേധയാ ഡൗൺലോഡ് ചെയ്‌ത് ഇൻസ്‌റ്റാൾ ചെയ്യുന്നത് നിങ്ങൾ അംഗീകരിക്കുന്നു. ഈ ആപ്പുകളിൽ ചിലത് 'ആപ്പ് വഴി വാങ്ങൽ' സൗകര്യം നൽകിയേക്കാം. <ph name="BEGIN_LINK1" />കൂടുതലറിയുക<ph name="END_LINK1" /></translation>
+<translation id="1347256498747320987">അപ്‌ഡേറ്റുകളും ആപ്പുകളും ഇൻസ്റ്റാൾ ചെയ്യുക. തുടരുന്നതിലൂടെ, ഈ ഉപകരണം Google-ൽ നിന്നും നിങ്ങളുടെ സേവനദാതാവിൽ നിന്നും ഉപകരണ നിർമ്മാതാവിൽ നിന്നും, ഒരുപക്ഷേ സെല്ലുലാർ ഡാറ്റ ഉപയോഗിച്ച്, അപ്‌ഡേറ്റുകളും ആപ്പുകളും സ്വയമേവ ഡൗൺലോഡ് ചെയ്‌ത് ഇൻസ്‌റ്റാൾ ചെയ്യുന്നത് നിങ്ങൾ അംഗീകരിക്കുന്നു. ഈ ആപ്പുകളിൽ ചിലത് 'ആപ്പ് വഴി വാങ്ങൽ' സൗകര്യം നൽകിയേക്കാം. <ph name="BEGIN_LINK1" />കൂടുതലറിയുക<ph name="END_LINK1" /></translation>
<translation id="1347512539447549782">Linux സ്‌റ്റോറേജ്</translation>
<translation id="1347975661240122359">ബാറ്ററി ചാർജ് <ph name="BATTERY_LEVEL" /> ശതമാനമാകുമ്പോൾ അപ്‌ഡേറ്റ് ആരംഭിക്കും.</translation>
<translation id="1348966090521113558">കൂടുതൽ ഉപയോഗസഹായി ക്രമീകരണം</translation>
@@ -1576,7 +1576,7 @@
<translation id="235028206512346451">നിങ്ങൾ ഉപകരണത്തിനടുത്ത് നിന്ന് പോകുമ്പോൾ നിങ്ങളുടെ സ്ക്രീൻ സ്വയമേവ ലോക്ക് ചെയ്യും. നിങ്ങൾ ഉപകരണത്തിന് മുന്നിലായിരിക്കുമ്പോൾ ദീർഘനേരം സ്ക്രീൻ സജീവമായി തുടരും. നിങ്ങൾ ഒരു ലോക്ക് സ്‌ക്രീൻ ഉപയോഗിക്കുന്നില്ലെങ്കിൽ, ലോക്കിന് പകരം നിങ്ങളുടെ ഉപകരണം ഉറക്ക മോഡിലാകും.</translation>
<translation id="2352495879228166246">{NUM_ITEMS,plural, =1{ഒരു ഇനം}other{{NUM_ITEMS} ഇനങ്ങൾ}}</translation>
<translation id="2352662711729498748">&lt; 1 MB</translation>
-<translation id="2352810082280059586">ലോക്ക് സ്‌ക്രീൻ കുറിപ്പുകൾ <ph name="LOCK_SCREEN_APP_NAME" /> എന്നതിലേക്ക് സ്വമേധയാ സംരക്ഷിക്കപ്പെടുന്നു. നിങ്ങൾ ഏറ്റവും സമീപകാലത്ത് എഴുതിയ കുറിപ്പ് ലോക്ക് സ്‌ക്രീനിൽ നിലനിൽക്കും.</translation>
+<translation id="2352810082280059586">ലോക്ക് സ്‌ക്രീൻ കുറിപ്പുകൾ <ph name="LOCK_SCREEN_APP_NAME" /> എന്നതിലേക്ക് സ്വയമേവ സംരക്ഷിക്കപ്പെടുന്നു. നിങ്ങൾ ഏറ്റവും സമീപകാലത്ത് എഴുതിയ കുറിപ്പ് ലോക്ക് സ്‌ക്രീനിൽ നിലനിൽക്കും.</translation>
<translation id="2353297238722298836">ക്യാമറയും മൈക്രോഫോണും അനുവദനീയം</translation>
<translation id="2353910600995338714">എക്‌സ്‌പോർട്ട് ചെയ്യൽ പൂർത്തിയായി</translation>
<translation id="2355314311311231464">നിങ്ങളുടെ അക്കൗണ്ട് വിശദാംശങ്ങൾ വീണ്ടെടുക്കാനാകാത്തതിനാൽ സജ്ജീകരിക്കാനായില്ല. വീണ്ടും ശ്രമിക്കുക. പിശക് കോഡ്: <ph name="ERROR_CODE" />.</translation>
@@ -1685,7 +1685,7 @@
<translation id="2454247629720664989">കീവേഡ്</translation>
<translation id="2454524890947537054">വെബ് അഭ്യർത്ഥന അംഗീകരിക്കണോ?</translation>
<translation id="245650153866130664">ഒരു ടിക്കറ്റ് സ്വയമേവ റീഫ്രഷ് ചെയ്യാൻ “പാസ്‌വേഡ് ഓർക്കുക” പരിശോധിക്കുക. നിങ്ങളുടെ പാസ്‌വേഡ് നിങ്ങളുടെ ഉപകരണത്തിൽ മാത്രമേ സംരക്ഷിക്കുകയുള്ളൂ.</translation>
-<translation id="2456827790665612305">സൈറ്റ് പിന്തുടരുന്നത് ഒഴിവാക്കുക</translation>
+<translation id="2456827790665612305">സൈറ്റ് അൺഫോളോ ചെയ്യൂ</translation>
<translation id="2457246892030921239"><ph name="APP_NAME" />, <ph name="VOLUME_NAME" />-ൽ നിന്ന് ഫയലുകൾ പകർത്താൻ താൽപ്പര്യപ്പെടുന്നു</translation>
<translation id="2457842160081795172">നിലവിൽ <ph name="CHANNEL_NAME" /> ചാനലിൽ</translation>
<translation id="2458379781610688953">അക്കൗണ്ട് അപ്‌ഡേറ്റ് ചെയ്യുക, <ph name="EMAIL" /></translation>
@@ -1743,7 +1743,7 @@
<translation id="2501278716633472235">പിന്നോട്ട് പോകുക</translation>
<translation id="2501797496290880632">ഒരു കുറുക്കുവഴി ടൈപ്പ് ചെയ്യുക</translation>
<translation id="2501920221385095727">സ്‌റ്റിക്കി കീകൾ</translation>
-<translation id="2502441965851148920">സ്വയമേവയുള്ള അപ്‌ഡേറ്റുകൾ പ്രവർത്തനക്ഷമമാക്കി. സ്വമേധയാ ഉള്ള അപ്‌ഡേറ്റുകൾ നിങ്ങളുടെ അഡ്‌മിനി‌സ്‌ട്രേറ്റർ പ്രവർത്തനരഹിതമാക്കി.</translation>
+<translation id="2502441965851148920">സ്വയമേവയുള്ള അപ്‌ഡേറ്റുകൾ പ്രവർത്തനക്ഷമമാക്കി. സ്വയമേവ ഉള്ള അപ്‌ഡേറ്റുകൾ നിങ്ങളുടെ അഡ്‌മിനി‌സ്‌ട്രേറ്റർ പ്രവർത്തനരഹിതമാക്കി.</translation>
<translation id="2502719318159902502">പൂർണ്ണമായ ആക്സസ്</translation>
<translation id="2505324914378689427">{SCREEN_INDEX,plural, =1{സ്‌ക്രീൻ #}other{സ്‌ക്രീൻ #}}</translation>
<translation id="2505402373176859469"><ph name="TOTAL_SIZE" /> ന്റെ <ph name="RECEIVED_AMOUNT" /></translation>
@@ -2798,7 +2798,7 @@
<translation id="3468298837301810372">ലേബല്‍‌</translation>
<translation id="3468999815377931311">Android ഫോൺ</translation>
<translation id="3469583217479686109">സെലക്ഷൻ ടൂൾ</translation>
-<translation id="3470392222765168737">സൈറ്റ് പിന്തുടരുക</translation>
+<translation id="3470392222765168737">സൈറ്റ് ഫോളോ ചെയ്യുക</translation>
<translation id="3471876058939596279">വീഡിയോയ്‌ക്കായി HDMI, USB ടൈപ്പ്-C പോർട്ടുകൾ ഒരേ സമയം ഉപയോഗിക്കാനാവില്ല. മറ്റൊരു വീഡിയോ പോർട്ട് ഉപയോഗിക്കുക.</translation>
<translation id="3472469028191701821">പുതിയ ടാബിൽ തുറക്കും</translation>
<translation id="3473241910002674503">ടാബ്‌ലെറ്റ് മോഡിൽ ബട്ടണുകൾ ഉപയോഗിച്ച് ഹോമിലേക്ക് നാവിഗേറ്റ് ചെയ്യുക, മടങ്ങുക, ആപ്പുകൾ മാറുക.</translation>
@@ -3526,7 +3526,7 @@
<translation id="4104163789986725820">കയ&amp;റ്റുമതി ചെയ്യുക...</translation>
<translation id="4104944259562794668">ക്രമീകരണം &gt; സുരക്ഷയും സ്വകാര്യതയും &gt; ലോക്ക് സ്ക്രീനും സൈൻ ഇൻ ചെയ്യൽ എന്നതിൽ നിങ്ങൾക്കിത് പിന്നീട് പ്രവർത്തനക്ഷമമാക്കാം</translation>
<translation id="4107048419833779140">സ്‌റ്റോറേജ് ​​ഉപകരണം തിരിച്ചറിഞ്ഞ് ഒഴിവാക്കുക</translation>
-<translation id="4108314971463891922">പിന്തുടരുക</translation>
+<translation id="4108314971463891922">ഫോളോ ചെയ്യുക</translation>
<translation id="4109135793348361820">വിൻഡോ <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />) എന്നതിലേക്ക് നീക്കുക</translation>
<translation id="4110485659976215879">മുന്നറിയിപ്പ് പുനഃസ്ഥാപിക്കുക</translation>
<translation id="4110490973560452005">ഡൗൺലോഡ് പൂർത്തിയായി: <ph name="FILE_NAME" />. ഡൗണ്‍ലോഡ് വിവരങ്ങളുടെ ബാര്‍ ഏരിയയിലേക്ക് പോകാൻ, Shift+F6 അമർത്തുക.</translation>
@@ -3558,7 +3558,7 @@
<translation id="4133076602192971179">നിങ്ങളുടെ പാസ്‌വേഡ് മാറ്റാൻ ആപ്പ് തുറക്കുക</translation>
<translation id="4134818201340504801">സജ്ജീകരണം പൂർത്തിയാക്കാൻ വേണ്ടത്ര സ്റ്റോറേജ് ലഭ്യമല്ല. സ്റ്റോറേജ് സൃഷ്ടിച്ച ശേഷം വീണ്ടും ശ്രമിക്കുക</translation>
<translation id="4135746311382563554">Google Chrome, ChromeOS അധിക സേവന നിബന്ധനകൾ</translation>
-<translation id="4136203100490971508">സൂര്യോദയ സമയത്ത് നൈറ്റ് ലൈറ്റ് സ്വമേധയാ ഓഫാകും</translation>
+<translation id="4136203100490971508">സൂര്യോദയ സമയത്ത് നൈറ്റ് ലൈറ്റ് സ്വയമേവ ഓഫാകും</translation>
<translation id="41365691917097717">തുടരുന്നത്, Android ആപ്പുകൾ സൃഷ്‌ടിക്കാനും പരിശോധിക്കാനും ADB ഡീബഗ് ചെയ്യലിനെ പ്രവർത്തനക്ഷമമാക്കും. Google പരിശോധിച്ചുറപ്പിച്ചിട്ടില്ലാത്ത Android ആപ്പുകൾ ഇൻസ്റ്റാൾ ചെയ്യാൻ ഈ പ്രവൃത്തി അനുവദിക്കുമെന്നതും ഇത് പ്രവർത്തനരഹിതമാക്കാൻ ഫാക്ടറി റീസെറ്റ് ചെയ്യേണ്ടി വരുമെന്നതും ശ്രദ്ധിക്കുക.</translation>
<translation id="4138267921960073861">പ്രവേശന സ്ക്രീനില്‍ ഫോട്ടോകളും ഉപയോക്തൃനാമങ്ങളും കാണിക്കുക</translation>
<translation id="4138598238327913711">വ്യാകരണ പരിശോധന നിലവിൽ ഇംഗ്ലീഷിന് മാത്രമേ ലഭ്യമാകൂ</translation>
@@ -3995,7 +3995,7 @@
<translation id="4546345569117159016">വലതുവശത്തെ ബട്ടൺ</translation>
<translation id="4546692474302123343">Google Assistant വോയ്‌സ് ഇൻപുട്ട്</translation>
<translation id="4547659257713117923">മറ്റുപകരണങ്ങളിൽ നിന്നുള്ള ടാബുകളൊന്നും ഇല്ല</translation>
-<translation id="4547672827276975204">സ്വമേധയാ സജ്ജമാക്കുക</translation>
+<translation id="4547672827276975204">സ്വയമേവ സജ്ജമാക്കുക</translation>
<translation id="4549791035683739768">നിങ്ങളുടെ സുരക്ഷാ കീയിൽ സംരക്ഷിച്ച ഫിംഗർപ്രിന്റുകളൊന്നുമില്ല</translation>
<translation id="4550926046134589611"><ph name="APP_NAME" /> ആപ്പിൽ ചില പിന്തുണാ ലിങ്കുകൾ തുടർന്നും തുറക്കാനാകും.</translation>
<translation id="4551763574344810652">പഴയപടിയാക്കാൻ <ph name="MODIFIER_KEY_DESCRIPTION" /> അമർത്തുക</translation>
@@ -4356,12 +4356,12 @@
<translation id="4878634973244289103">ഫീഡ്‌ബാക്ക് അയയ്‌ക്കാനായില്ല. പിന്നീട് വീണ്ടും ശ്രമിക്കുക.</translation>
<translation id="4878653975845355462">ഇഷ്‍ടാനുസൃത പശ്ചാത്തലങ്ങൾ നിങ്ങളുടെ അഡ്‍മിൻ ഓഫാക്കിയിരിക്കുന്നു</translation>
<translation id="4878718769565915065">ഈ സുരക്ഷാ കീയിലേക്ക് ഒരു ഫിംഗർപ്രിന്റ് ചേർക്കാനായില്ല</translation>
-<translation id="4879491255372875719">സ്വമേധയാ (ഡിഫോൾട്ട്)</translation>
+<translation id="4879491255372875719">സ്വയമേവ (ഡിഫോൾട്ട്)</translation>
<translation id="4880827082731008257">തിരയൽ ചരിത്രം</translation>
<translation id="4881062916686771679"><ph name="USER_EMAIL" /> ഉൾപ്പെടെയുള്ള നിങ്ങളുടെ വ്യക്തിപരമായ അല്ലെങ്കിൽ സോഷ്യൽ നെറ്റ്‌വർക്ക് അക്കൗണ്ടുകളുടെ സുരക്ഷ അപഹരിക്കാൻ കഴിയുന്ന മാൽവെയർ ഈ ഫയലിൽ അടങ്ങിയിരിക്കുന്നു</translation>
<translation id="4881685975363383806">അടുത്ത തവണ എന്നെ ഓർമ്മിപ്പിക്കരുത്</translation>
<translation id="4881695831933465202">തുറക്കുക</translation>
-<translation id="488211015466188466">സൈറ്റ് പിന്തുടരുക</translation>
+<translation id="488211015466188466">സൈറ്റ് ഫോളോ ചെയ്യുക</translation>
<translation id="4882312758060467256">ഈ സൈറ്റിലേക്ക് ആക്‌സസ് ഉണ്ട്</translation>
<translation id="4882919381756638075">വീഡിയോ ചാറ്റിംഗ് പോലുള്ള ആശയവിനിമയ ഫീച്ചറുകൾക്ക്, സൈറ്റുകൾ സാധാരണയായി നിങ്ങളുടെ മൈക്രോഫോൺ ഉപയോഗിക്കാറുണ്ട്</translation>
<translation id="4883436287898674711">എല്ലാ <ph name="WEBSITE_1" /> സൈറ്റുകളും</translation>
@@ -4892,7 +4892,7 @@
<translation id="5397794290049113714">നിങ്ങള്‍</translation>
<translation id="5398497406011404839">മറച്ചിരിക്കുന്ന ബുക്ക്‌മാർക്കുകൾ</translation>
<translation id="5398572795982417028">പേജ് റഫറൻസ് പരിധി കവിഞ്ഞു, <ph name="MAXIMUM_PAGE" /> പേജാണ് വേണ്ട പരിധി</translation>
-<translation id="5401426944298678474">സൈറ്റ് പിന്തുടരുന്നത് ഒഴിവാക്കുക</translation>
+<translation id="5401426944298678474">സൈറ്റ് അൺഫോളോ ചെയ്യൂ</translation>
<translation id="5401851137404501592">തുടരാൻ, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> നിങ്ങളുടെ പേരും ഇമെയിൽ വിലാസവും പ്രൊഫൈൽ ചിത്രവും ഈ സൈറ്റുമായി പങ്കിടും.</translation>
<translation id="5402367795255837559">ബ്രെയ്‌ലി</translation>
<translation id="5402815541704507626">മൊബൈല്‍ ഡാറ്റ ഉപയോഗിച്ച് അപ്‌ഡേറ്റ് ഡൗൺലോഡ് ചെയ്യുക</translation>
@@ -4939,7 +4939,7 @@
<translation id="5441133529460183413">Chrome ബ്രൗസറിൽ നിന്നാണ് വെബ്‌ ആപ്പ് ഇൻസ്റ്റാൾ ചെയ്തിരിക്കുന്നത്</translation>
<translation id="5441466871879044658">ഈ ഭാഷയിലേക്ക് വിവർത്തനം ചെയ്യുക</translation>
<translation id="5442228125690314719">ഡിസ്‌ക് ഇമേജ് സൃഷ്‌ടിക്കുന്നതിൽ പിശക്. വീണ്ടും ശ്രമിക്കുക.</translation>
-<translation id="5442550868130618860">സ്വമേധയാ ഉള്ള അപ്‌ഡേറ്റ് ഓണാക്കുക</translation>
+<translation id="5442550868130618860">സ്വയമേവ ഉള്ള അപ്‌ഡേറ്റ് ഓണാക്കുക</translation>
<translation id="5445400788035474247">10x</translation>
<translation id="5446983216438178612">ഓർഗനൈസേഷന്റെ സർട്ടിഫിക്കറ്റുകൾ കാണിക്കുക</translation>
<translation id="5447384712203291074"><ph name="ITEM_COUNT_MULTIPLE" /> ഇനങ്ങൾ</translation>
@@ -5187,7 +5187,7 @@
<translation id="5658415415603568799">അധിക സുരക്ഷയ്‌ക്കായി, 20 മണിക്കൂറിന് ശേഷം നിങ്ങളുടെ പാസ്‌വേഡ് നൽകാൻ Smart Lock ആവശ്യപ്പെടും.</translation>
<translation id="5659593005791499971">ഇമെയില്‍</translation>
<translation id="5662513737565158057">Linux ആപ്പുകളുടെ പ്രവർത്തനരീതി മാറ്റുക.</translation>
-<translation id="5663459693447872156">പകുതിവീതിയിലേക്ക് സ്വപ്രേരിതമായി സ്വിച്ചുചെയ്യുക</translation>
+<translation id="5663459693447872156">പകുതിവീതിയിലേക്ക് സ്വയമേവ സ്വിച്ചുചെയ്യുക</translation>
<translation id="5667293444945855280">ക്ഷുദ്രവെയര്‍‌</translation>
<translation id="5667546120811588575">Google Play സജ്ജമാക്കുന്നു...</translation>
<translation id="5668351004957198136">പരാജയപ്പെട്ടു</translation>
@@ -7616,7 +7616,7 @@
<translation id="7874257161694977650">Chrome പശ്ചാത്തലങ്ങൾ</translation>
<translation id="7876027585589532670">കുറുക്കുവഴി എഡിറ്റ് ചെയ്യാനാകില്ല</translation>
<translation id="7877451762676714207">അജ്ഞാതമായ സെർവർ പിശക്. വീണ്ടും ശ്രമിക്കുകയോ സെർവർ അഡ്‌മിനിസ്‌ട്രേറ്ററെ ബന്ധപ്പെടുകയോ ചെയ്യുക.</translation>
-<translation id="7879478708475862060">ഇൻപുട്ട് മോഡ് പിന്തുടരുക</translation>
+<translation id="7879478708475862060">ഇൻപുട്ട് മോഡ് ഫോളോ ചെയ്യുക</translation>
<translation id="7879631849810108578">കുറുക്കുവഴി സജ്ജീകരിച്ചു: <ph name="IDS_SHORT_SET_COMMAND" /></translation>
<translation id="7880823633812189969">നിങ്ങൾ റീസ്‌റ്റാർട്ട് ചെയ്യുമ്പോൾ ലോക്കൽ ഡാറ്റ ഇല്ലാതാക്കപ്പെടും</translation>
<translation id="7881066108824108340">DNS</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_mr.xtb b/chromium/chrome/app/resources/generated_resources_mr.xtb
index f0134fd2d18..4c757f458d0 100644
--- a/chromium/chrome/app/resources/generated_resources_mr.xtb
+++ b/chromium/chrome/app/resources/generated_resources_mr.xtb
@@ -15,7 +15,7 @@
<translation id="1009454959501038262">{NUM_SITES,plural, =1{तुमच्या डेटाचे संरक्षण करण्यासाठी, तुम्ही दोन महिन्यांमध्ये भेट न दिलेल्या साइटवरील परवानग्या काढून टाकल्या आहेत}other{तुमच्या डेटाचे संरक्षण करण्यासाठी, तुम्ही दोन महिन्यांमध्ये भेट न दिलेल्या साइटवरील परवानग्या काढून टाकल्या आहेत}}</translation>
<translation id="1009663062402466586">गेम नियंत्रणे आता उपलब्ध आहेत</translation>
<translation id="1010498023906173788">हा टॅब सिरीअल पोर्टशी कनेक्ट केलेला आहे.</translation>
-<translation id="1010833424573920260">{NUM_PAGES,plural, =1{अप्रतिसादात्मक पृष्‍ठ}other{अप्रतिसादात्मक पृष्‍ठे}}</translation>
+<translation id="1010833424573920260">{NUM_PAGES,plural, =1{प्रतिसाद देत नसलेले पेज}other{प्रतिसाद देत नसलेली पेज}}</translation>
<translation id="1011003645819296594">सेव्ह केलेली डिव्हाइस</translation>
<translation id="1011355516189274711">टेक्‍स्‍ट टू स्‍पीच व्‍हॉल्‍यूम</translation>
<translation id="1012794136286421601">तुमचे दस्तऐवज, पत्रके, स्लाइड्स आणि रेखाचित्र फाइल सिंक केल्या जात आहेत. त्यावर ऑनलाइन किंवा ऑफलाइन ॲक्सेस करण्यासाठी Google ड्राइव्ह अ‍ॅप उघडा.</translation>
@@ -759,7 +759,7 @@
<translation id="1656528038316521561">बॅकग्राउंडची अपारदर्शकता</translation>
<translation id="1657406563541664238">वापरविषयक आकडेवारी आणि क्रॅश अहवाल आपोआप Google कडे पाठवून <ph name="PRODUCT_NAME" /> ला अधिक चांगले करण्यास मदत करा</translation>
<translation id="1657937299377480641">शैक्षणिक स्रोतांच्या अ‍ॅक्सेससाठी पुन्हा साइन इन करण्याकरिता, तुम्हाला परवानगी देण्याबाबत पालकाला सांगा</translation>
-<translation id="1658424621194652532">हे पृष्ठ आपल्या मायक्रोफोनवर प्रवेश करत आहे.</translation>
+<translation id="1658424621194652532">हे पेज तुमचा मायक्रोफोन अ‍ॅक्सेस करत आहे.</translation>
<translation id="1660204651932907780">साइटना ध्वनी प्ले करण्याची परवानगी द्या (शिफारस केलेले)</translation>
<translation id="1660763353352708040">पॉवर अडॉप्टर समस्या</translation>
<translation id="1661156625580498328">AES एंक्रिप्शन लागू करा (शिफारस केलेले).</translation>
@@ -839,7 +839,7 @@
<translation id="1724801751621173132">इनपुट मोड</translation>
<translation id="1725562816265788801">टॅब स्क्रोल करणे</translation>
<translation id="1726503915437308071">आयटॅलिक फॉंट</translation>
-<translation id="1729533290416704613">तुम्ही ओम्निबॉक्समधून शोध घेता तेव्हा कोणते पृष्ठ दर्शविले जाते हेदेखील हे नियंत्रित करते.</translation>
+<translation id="1729533290416704613">तुम्ही ओम्निबॉक्समधून शोध घेता तेव्हा कोणते पेज दाखवावे हेदेखील ते नियंत्रित करते.</translation>
<translation id="1730666151302379551">जुना पासवर्ड लक्षात नाही</translation>
<translation id="1730917990259790240"><ph name="BEGIN_PARAGRAPH1" />ॲप्स काढून टाकण्यासाठी, सेटिंग्ज &gt; Google Play स्टोअर &gt; Androआयडी प्राधान्ये व्यवस्थापित करा &gt; ॲप्स किंवा अ‍ॅप्लिकेशन व्यवस्थापक यावर जा. नंतर तुम्हाला जे ॲप अनइंस्टॉल करायचे आहे त्यावर टॅप करा (ॲप शोधण्‍यासाठी तुम्हाला कदाचित उजवीकडे किंवा डावीकडे स्वाइप करावे लागेल). यानंतर अनइंस्टॉल करा किंवा बंद करा यावर टॅप करा.<ph name="END_PARAGRAPH1" /></translation>
<translation id="1730989807608739928">शेवटच्या टॅबवर स्क्रोल करा</translation>
@@ -856,14 +856,14 @@
<translation id="1741314857973421784">सुरू ठेवा</translation>
<translation id="1743970419083351269">डाउनलोड बार बंद करा</translation>
<translation id="1744060673522309905">डिव्हाइस डोमेनशी जोडू शकत नाही. तुम्हाला जोडता येऊ शकणाऱ्या डिव्हाइसची संख्या तुम्ही ओलांडलेली नाही याची खात्री करा.</translation>
-<translation id="1744108098763830590">पार्श्वभूमी पृष्ठ</translation>
+<translation id="1744108098763830590">बॅकग्राउंड पेज</translation>
<translation id="1745732479023874451">संपर्क व्यवस्थापित करा</translation>
<translation id="1748283190377208783">{0,plural, =1{unused plural form}other{या वेब अ‍ॅपमध्ये # फाइल उघडून संपादित करायच्या आहेत का?}}</translation>
<translation id="1748563609363301860">तुम्ही हा पासवर्ड तुमच्या Google खाते मध्ये किंवा फक्त या डिव्हाइसवर सेव्ह करू शकता</translation>
<translation id="1749733017156547309">पासवर्ड आवश्यक आहे</translation>
<translation id="1750172676754093297">तुमची सिक्युरिटी की फिंगरप्रिंट स्टोअर करू शकत नाही</translation>
<translation id="1751262127955453661">तुम्ही या साइटसाठी सर्व टॅब बंद करेपर्यंत <ph name="ORIGIN" /> ला <ph name="FOLDERNAME" /> मधील फाइल संपादित करता येतील</translation>
-<translation id="17513872634828108">खुले टॅब</translation>
+<translation id="17513872634828108">उघडे टॅब</translation>
<translation id="175196451752279553">पु&amp;न्हा बंद टॅब उघडा</translation>
<translation id="1753067873202720523">तुमचे Chromebook सुरू असताना ते शुल्क आकारु शकत नाही.</translation>
<translation id="1753905327828125965">सर्वाधिक भेट दिलेले</translation>
@@ -1344,7 +1344,7 @@
<translation id="2156877321344104010">सुरक्षा तपासणी पुन्हा रन करा</translation>
<translation id="2157474325782140681">अतिरिक्त वैशिष्‍ट्ये मिळवण्यासाठी, या Chromebook सोबत काम करणारे Dell डॉक स्टेशन वापरा.</translation>
<translation id="215753907730220065">पूर्ण स्क्रीनमधून निर्गमन करा</translation>
-<translation id="2157875535253991059">हे पृष्ठ आता फुल स्‍क्रीन असेल.</translation>
+<translation id="2157875535253991059">हे पेज आता फुल स्‍क्रीन असेल.</translation>
<translation id="2158475082070321257">हायलाइट करण्यासाठी लिंक कॉपी करा</translation>
<translation id="2159488579268505102">USB-C</translation>
<translation id="2161058806218011758"><ph name="EXTENSION_NAME" /> साठी <ph name="SHORTCUT" /> ची व्याप्ती</translation>
@@ -1499,7 +1499,7 @@
<translation id="2296022312651137376"><ph name="DOMAIN_NAME" /> च्या <ph name="EMAIL" /> मध्ये साइन इन करताना डिव्हाइस ऑनलाइन असणे आवश्यक आहे</translation>
<translation id="2296218178174497398">डिव्हाइस शोध</translation>
<translation id="2297705863329999812">प्रिंटर शोधा</translation>
-<translation id="2297822946037605517">हे पृष्ठ शेअर करा</translation>
+<translation id="2297822946037605517">हे पेज शेअर करा</translation>
<translation id="2299734369537008228">स्लायडर: <ph name="MIN_LABEL" /> ते <ph name="MAX_LABEL" /></translation>
<translation id="2299941608784654630">debugd ने गोळा केलेल्या सर्व लॉग फाइलचा स्वतंत्र संग्रहण म्हणून समावेश करा.</translation>
<translation id="2300214399009193026">PCIe</translation>
@@ -1567,7 +1567,7 @@
<translation id="2332948465534020594">व्यत्यय आणू नका सुरू केले</translation>
<translation id="233471714539944337">संवेदनशील आशय</translation>
<translation id="2335111415680198280">{0,plural, =1{# विंडो बंद करा}other{# विंडो बंद करा}}</translation>
-<translation id="2335122562899522968">हे पृष्ठ कुकीज सेट करते.</translation>
+<translation id="2335122562899522968">हे पेज कुकीज सेट करते.</translation>
<translation id="2336228925368920074">सर्व टॅब बुकमार्क करा...</translation>
<translation id="2336376423977300504">विंडो बंद असताना नेहमी कुकी साफ करा</translation>
<translation id="2336381494582898602">Powerwash</translation>
@@ -1666,7 +1666,7 @@
<translation id="2428978615149723410">ही कार्ट</translation>
<translation id="2431027948063157455">Google Assistant लोड होऊ शकले नाही, कृपया तुमचे नेटवर्क कनेक्शन तपासा आणि पुन्हा प्रयत्न करा.</translation>
<translation id="243179355394256322">तुमची संस्था डिव्हाइसची नोंदणी फक्त अधिकृत वापरकर्त्यांपुरती मर्यादित करते. डिव्हाइसची नोंदणी करण्यासाठी हा वापरकर्ता अधिकृत नाही. कृपया ॲडमिन कन्सोलमधील वापरकर्ते विभागामध्ये वापरकर्त्याकडे "Google Meet हार्डवेअरमध्ये नोंदणी करा" हा अ‍ॅडमिनिस्ट्रेटर विशेषाधिकार असल्याची खात्री करा.</translation>
-<translation id="2433452467737464329">पृष्ठ स्वयं-रिफ्रेश करण्यासाठी URL मध्ये क्वेरी परम जोडा: chrome://network/?refresh=&lt;sec&gt;</translation>
+<translation id="2433452467737464329">पेज ऑटो-रिफ्रेश करण्यासाठी URL मध्ये क्वेरी पॅरामीटर जोडा: chrome://network/?refresh=&lt;sec&gt;</translation>
<translation id="2433507940547922241">स्वरूप</translation>
<translation id="2433836460518180625">फक्त डिव्हाइस अनलॉक करा</translation>
<translation id="2434449159125086437">प्रिंटर सेट करू शकलो नाही. कृपया कॉंफिगरेशन तपासा आणि पुन्हा प्रयत्न करा.</translation>
@@ -1883,7 +1883,7 @@
<translation id="262154978979441594">Google Assistant व्हॉइस मॉडेलला प्रशिक्षण द्या</translation>
<translation id="26224892172169984">कोणत्याही साइटला प्रोटोकॉल हाताळण्याची परवानगी देऊ नका</translation>
<translation id="262373406453641243">कोलमॅक</translation>
-<translation id="2624142942574147739">हे पृष्‍ठ आपल्या कॅमेरा आणि मायक्रोफोनवर प्रवेश करत आहे.</translation>
+<translation id="2624142942574147739">हे पेज तुमचा कॅमेरा आणि मायक्रोफोन अ‍ॅक्सेस करत आहे.</translation>
<translation id="2626799779920242286">कृपया नंतर पुन्हा प्रयत्न करा.</translation>
<translation id="2627424346328942291">शेअर करू शकत नाही</translation>
<translation id="2628770867680720336">ADB डीबगिंग सुरू करण्यासाठी हे Chromebook फॅक्टरी रीसेट करणे आवश्यक आहे. <ph name="BEGIN_LINK_LEARN_MORE" />अधिक जाणून घ्या<ph name="END_LINK_LEARN_MORE" /></translation>
@@ -2006,7 +2006,7 @@
<translation id="2729327310379176711">ट्रॅकिंग कमी करण्यासाठी आणि तुम्ही ब्राउझ करत असताना तुम्हाला आणखी सुरक्षित ठेवण्यासाठी Chrome नवीन मार्ग शोधत आहे. Chrome <ph name="ESTIMATE_INTERESTS_LINK" /> हेदेखील करते आणि तुम्हाला ते व्यवस्थापित करू देते. त्यानंतर, तुम्ही भेट देता त्या साइट तुम्हाला जाहिराती दाखवण्यासाठी Chrome ला तुमच्या स्वारस्यांबद्दल विचारू शकतात.</translation>
<translation id="2730029791981212295">Linux अ‍ॅप्स आणि फाइलचा बॅकअप घेत आहे</translation>
<translation id="2730901670247399077">इमोजी सूचना</translation>
-<translation id="273093730430620027">हे पृष्ठ आपल्या कॅमेर्‍यावर प्रवेश करत आहे.</translation>
+<translation id="273093730430620027">हे पेज तुमचा कॅमेरा अ‍ॅक्सेस करत आहे.</translation>
<translation id="2731392572903530958">बंद केलेली विंडो पु&amp;न्हा उघडा</translation>
<translation id="2731700343119398978">कृपया प्रतीक्षा करा...</translation>
<translation id="2731971182069536520">पुढील वेळी तुम्ही तुमचे डिव्हाइस रीस्टार्ट कराल तेव्हा तुमचा अ‍ॅडमिनिस्ट्रेटर एक वेळ अपडेट करेल जो तुमचा स्थानिक डेटा हटवेल.</translation>
@@ -2118,7 +2118,7 @@
<translation id="2812049959647166806">थंडरबोल्टला सपोर्ट करत नाही</translation>
<translation id="2813094189969465044">पालक नियंत्रणे</translation>
<translation id="281390819046738856">विनंतीवर साइन करता आले नाही.</translation>
-<translation id="2814489978934728345">हे पृष्ठ लोड करणे थांबवा</translation>
+<translation id="2814489978934728345">हे पेज लोड करणे थांबवा</translation>
<translation id="2815693974042551705">बुकमार्क फोल्डर</translation>
<translation id="2816319641769218778">तुमच्या Google खाते मध्ये पासवर्ड सेव्ह करण्यासाठी सिंक सुरू करा.</translation>
<translation id="2816628817680324566">या साइटला तुमची सिक्युरिटी की ओळखण्याची अनुमती द्यायची का?</translation>
@@ -2501,7 +2501,7 @@
<translation id="3169930038976362151">तुमच्या आवश्यकतांची पूर्तता करणारी थीम निवडा. तुमची थीम, वॉलपेपर, स्क्रीन सेव्हर आणि आणखी बरेच काही बदलण्यासाठी, डेस्कटॉपवर फक्त स्पर्श करून धरून ठेवा.</translation>
<translation id="3170072451822350649">तुम्ही साइन इन वगळुन <ph name="LINK_START" />अतिथी म्हणून ब्राउझ<ph name="LINK_END" /> देखील करू शकता.</translation>
<translation id="31774765611822736">डावीकडील नवीन टॅब</translation>
-<translation id="3177909033752230686">पृष्ठ भाषा:</translation>
+<translation id="3177909033752230686">पेज भाषा:</translation>
<translation id="3177914167275935955">तुमच्या डिव्हाइसमध्ये Chrome Education अपग्रेड याचा समावेश आहे, पण तुमचे वापरकर्ता नाव हे Google for Education खात्याशी संबंधित नाही. कृपया दुय्यम डिव्हाइसवर g.co/workspace/edusignup ला भेट देऊन Google for Education खाते तयार करा.</translation>
<translation id="3179982752812949580">मजकुराचा फाँट</translation>
<translation id="3180284704187420717">सिंक वापरून तुमचे बुकमार्क, पासवर्ड आणि बरेच काही सेव्ह करा</translation>
@@ -2635,7 +2635,7 @@
<translation id="3305389145870741612">स्वरूपन प्रक्रियेस दोन सेकंद लागू शकतात. कृपया प्रतीक्षा करा.</translation>
<translation id="3305661444342691068">पूर्वावलोकनात पीडीएफ उघडा</translation>
<translation id="3307176291962384345"><ph name="MERCHANT_NAME" /> साठीच्या सवलती मिळवा</translation>
-<translation id="3308116878371095290">हे पृष्ठ कुकीज सेट करण्यापासून प्रतिबंधित केलेले होते.</translation>
+<translation id="3308116878371095290">हे पेज कुकीज सेट करण्यापासून प्रतिबंधित केलेले होते.</translation>
<translation id="3308134619352333507">बटण लपवा</translation>
<translation id="3308852433423051161">Google Assistant लोड करत आहे...</translation>
<translation id="3309330461362844500">सर्टिफिकेट प्रोफाइल आयडी</translation>
@@ -3319,7 +3319,7 @@
<translation id="3909701002594999354">सर्व नियंत्रणे दाखवा</translation>
<translation id="3909791450649380159">क&amp;ट करा</translation>
<translation id="39103738135459590">अ‍ॅक्टिव्हेशन कोड</translation>
-<translation id="3911824782900911339">नवीन टॅब पृष्‍ठ</translation>
+<translation id="3911824782900911339">नवीन टॅब पेज</translation>
<translation id="3914173277599553213">आवश्यक</translation>
<translation id="3915280005470252504">व्हॉइसनुसार शोधा</translation>
<translation id="3916233823027929090">सुरक्षा तपासण्या पूर्ण झाल्या</translation>
@@ -4009,7 +4009,7 @@
<translation id="4546308221697447294">Google Chrome सह जलदगतीने ब्राउझ करा</translation>
<translation id="4546345569117159016">उजवीकडील बटण</translation>
<translation id="4546692474302123343">Google Assistant व्हॉइस इनपुट</translation>
-<translation id="4547659257713117923">अन्य डिव्हाइसेसवरील कोणतेही टॅब नाहीत</translation>
+<translation id="4547659257713117923">अन्य डिव्हाइसवरील कोणतेही टॅब नाहीत</translation>
<translation id="4547672827276975204">आपोआप सेट करा</translation>
<translation id="4549791035683739768">तुमच्या सिक्युरिटी कीवर कोणतीही फिंगरप्रिंट स्टोअर केलेली नाहीत</translation>
<translation id="4550926046134589611">सपोर्ट असलेल्या काही लिंक तरीही <ph name="APP_NAME" /> मध्ये उघडतील.</translation>
@@ -4052,7 +4052,7 @@
<translation id="4581774856936278355">Linux रिस्टोअर करताना एरर आली</translation>
<translation id="4582297591746054421">तुम्ही कॉपी केलेल्या मजकुराचे फॉरमॅटिंग कायम ठेवणे यासारख्या वैशिष्ट्यांसाठी साइट सामान्यपणे तुमचा क्लिपबोर्ड वाचतात</translation>
<translation id="4582563038311694664">सर्व सेटिंग्ज रीसेट करा</translation>
-<translation id="4585793705637313973">पृष्ठ संपादित करा</translation>
+<translation id="4585793705637313973">पेज संपादित करा</translation>
<translation id="4586275095964870617"><ph name="URL" /> पर्यायी ब्राउझरमध्ये उघडता आले नाही. कृपया तुमच्या सिस्टम अ‍ॅडमिनिस्ट्रेटरशी संपर्क साधा.</translation>
<translation id="4587589328781138893">Sites</translation>
<translation id="4589713469967853491">डाउनलोड डिरेक्टरीमध्ये लॉग यशस्वीरीत्या राइट केले गेले.</translation>
@@ -4089,7 +4089,7 @@
<translation id="4617880081511131945">कनेक्शन स्थापित करू शकत नाही</translation>
<translation id="4618195822946934889">URL मध्ये फक्त ASCII वर्ण असू शकतात</translation>
<translation id="4619564267100705184">हे तुम्हीच असल्याची पडताळणी करा</translation>
-<translation id="4619615317237390068">अन्य डिव्हाइसेसमधील टॅब</translation>
+<translation id="4619615317237390068">अन्य डिव्हाइसमधील टॅब</translation>
<translation id="4620809267248568679">या सेटिंगची एक्स्टेंशनद्वारे अंमलबजावणी कली जाते.</translation>
<translation id="4622051949285931942">ऑटोमॅटिक अपडेट बंद करायची आहेत का?</translation>
<translation id="4623167406982293031">खात्याची पडताळणी करा</translation>
@@ -4166,7 +4166,7 @@
<translation id="4682830185876172415">अलीकडील डाउनलोड</translation>
<translation id="4683629100208651599">लोअरकेस करा</translation>
<translation id="4683947955326903992"><ph name="PERCENTAGE" />% (डीफॉल्ट)</translation>
-<translation id="4684427112815847243">सर्वकाही संंकालित करा</translation>
+<translation id="4684427112815847243">सर्व सिंक करा</translation>
<translation id="4687613760714619596">अज्ञात डिव्हाइस (<ph name="DEVICE_ID" />)</translation>
<translation id="4687718960473379118">साइटने सुचवलेल्या जाहिराती</translation>
<translation id="4688036121858134881">स्थानिक लॉग आयडी: <ph name="WEBRTC_EVENT_LOG_LOCAL_ID" />.</translation>
@@ -4328,7 +4328,7 @@
<translation id="4839910546484524995">तुमचे डिव्हाइस तपासा</translation>
<translation id="4840096453115567876">गुप्त मोड तरीही बंद करायचा आहे का?</translation>
<translation id="4841741146571978176">आवश्यक असलेली व्हर्च्युअल मशीन अस्तित्वात नाही. कृपया पुढे सुरू ठेवण्यासाठी, <ph name="VM_TYPE" /> सेट करण्याचा प्रयत्न करा</translation>
-<translation id="4842976633412754305">हे पृष्ठ अप्रमाणिकृत स्त्रोतांवरून स्क्रिप्ट लोड करण्याचा प्रयत्न करत आहे.</translation>
+<translation id="4842976633412754305">हे पेज ऑथेंटिकेट न केलेल्या स्रोतांवरून स्क्रिप्ट लोड करण्याचा प्रयत्न करत आहे.</translation>
<translation id="4844333629810439236">अन्य कीबोर्ड</translation>
<translation id="484462545196658690">ऑटो</translation>
<translation id="4844633725025837809">अतिरिक्त सुरक्षिततेसाठी, पासवर्ड हे Google पासवर्ड व्यवस्थापक यामध्ये सेव्ह केले जाण्यापूर्वी तुमच्या डिव्हाइसवर एंक्रिप्ट करा</translation>
@@ -4372,7 +4372,7 @@
<translation id="4878653975845355462">तुमच्या अ‍ॅडमिनिस्ट्रेटरने कस्टम बॅकग्राउंड बंद केले आहेत</translation>
<translation id="4878718769565915065">या सिक्युरिटी कीवर फिंगरप्रिंट जोडता आली नाही</translation>
<translation id="4879491255372875719">आपोआप (डीफॉल्ट)</translation>
-<translation id="4880827082731008257">इतिहास शोध</translation>
+<translation id="4880827082731008257">शोध इतिहास</translation>
<translation id="4881062916686771679">या फाइलमध्ये मालवेअर आहे, ज्यामुळे तुमची वैयक्तिक किंवा सोशल नेटवर्क खाती धोक्यात येऊ शकतात<ph name="USER_EMAIL" /></translation>
<translation id="4881685975363383806">मला पुढील वेळी आठवण करून देऊ नका</translation>
<translation id="4881695831933465202">उघडा</translation>
@@ -4655,7 +4655,7 @@
<translation id="5154702632169343078">विषय</translation>
<translation id="5155327081870541046">तुम्हाला शोधायच्या असलेल्या साइटचा शॉर्टकट अ‍ॅड्रेस बारमध्ये एंटर करा जसे की, "@bookmarks". त्यानंतर, तुमचा प्राधान्य दिलेला कीबोर्ड शॉर्टकट प्रेस करा आणि तुमची शोध संज्ञा एंटर करा.</translation>
<translation id="5156638757840305347">तो दिसतो किंवा हलतो तेव्हा कर्सर हायलाइट केला जातो</translation>
-<translation id="5157635116769074044">हे पृष्ठ सुरू स्क्रीनवर पिन करा...</translation>
+<translation id="5157635116769074044">स्टार्ट स्क्रीनवर हे पेज पिन करा...</translation>
<translation id="5158206172605340248">अ‍ॅक्सेंटच्या खुणांचा मेनू डिसमिस केला आहे.</translation>
<translation id="5159094275429367735">Crostini सेट करा</translation>
<translation id="5159419673777902220">तुमच्या पालकाने एक्स्टेंशन परवानग्या बंद केल्या आहेत</translation>
@@ -4738,7 +4738,7 @@
<translation id="523862956770478816">साइट परवानग्या</translation>
<translation id="5242724311594467048">"<ph name="EXTENSION_NAME" />" सुरू करायचे?</translation>
<translation id="5243522832766285132">कृपया थोड्या वेळानंतर पुन्हा प्रयत्न करा</translation>
-<translation id="5244474230056479698"><ph name="EMAIL" /> वर संकालित करीत आहे</translation>
+<translation id="5244474230056479698"><ph name="EMAIL" /> शी सिंक करत आहे</translation>
<translation id="5245610266855777041">शाळा खात्यासोबत सुरुवात करा</translation>
<translation id="5246282308050205996"><ph name="APP_NAME" /> क्रॅश झाला आहे. ॲप्लिकेशन रीस्टार्ट करण्यासाठी या फुग्यावर क्लिक करा.</translation>
<translation id="5247051749037287028">डिस्प्ले नाव (पर्यायी)</translation>
@@ -4906,7 +4906,7 @@
<translation id="5397378439569041789">कियोस्क किंवा सायनेज डिव्हाइसची नोंदणी करा</translation>
<translation id="5397794290049113714">तुम्ही</translation>
<translation id="5398497406011404839">लपवलेले बुकमार्क</translation>
-<translation id="5398572795982417028">निषिद्ध पृष्ठ संदर्भ, मर्यादा <ph name="MAXIMUM_PAGE" /> आहे</translation>
+<translation id="5398572795982417028">निषिद्ध पेज संदर्भ, मर्यादा <ph name="MAXIMUM_PAGE" /> आहे</translation>
<translation id="5401426944298678474">साइट अनफॉलो करा</translation>
<translation id="5401851137404501592">पुढे सुरू ठेवण्यासाठी, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> तुमचे नाव, ईमेल अ‍ॅड्रेस आणि प्रोफाइल फोटो या साइटसह शेअर करेल.</translation>
<translation id="5402367795255837559">ब्रेल</translation>
@@ -5182,7 +5182,7 @@
<translation id="5636996382092289526"><ph name="NETWORK_ID" /> वापरण्यासाठी तुमच्या प्रथम <ph name="LINK_START" />नेटवर्कच्या साइन-इन पेजला भेट देणे<ph name="LINK_END" /> आवश्यक आहे, जे काही सेकंदांमध्ये आपोआप उघडेल. तसे न झाल्यास, नेटवर्क वापरणे शक्य नाही.</translation>
<translation id="5637476008227280525">मोबाइल डेटा सुरू आहे</translation>
<translation id="5638309510554459422">विस्तार आणि थीम <ph name="BEGIN_LINK" />Chrome वेब स्टोअर<ph name="END_LINK" /> मध्ये शोधा</translation>
-<translation id="5639549361331209298">हे पृष्ठ रीलोड करा, अधिक पर्याय पहाण्यासाठी होल्ड करा</translation>
+<translation id="5639549361331209298">हे पेज रीलोड करा, अधिक पर्याय पहाण्यासाठी होल्ड करा</translation>
<translation id="5640133431808313291">सिक्युरिटी की व्यवस्थापित करा</translation>
<translation id="5641608986289282154"><ph name="DEVICE_OS" /> वापरणे सुरू करा</translation>
<translation id="5641648607875312660">स्क्रीनशॉट इमेज संपादक</translation>
@@ -5212,7 +5212,7 @@
<translation id="567587836466137939"><ph name="MONTH_AND_YEAR" /> पर्यंत या डिव्हाइसवर ऑटोमॅटिक सॉफ्टवेअर आणि सुरक्षा अपडेट मिळतील. <ph name="LINK_BEGIN" />अधिक जाणून घ्या<ph name="LINK_END" /></translation>
<translation id="567643736130151854">सर्व डिव्हाइसवर तुमचे बुकमार्क, पासवर्ड आणि बरेच काही मिळविण्यासाठी साइन इन करा आणि सिंक सुरू करा</translation>
<translation id="567740581294087470">तुम्ही कोणत्या प्रकारचा फीडबॅक देत आहात?</translation>
-<translation id="5677503058916217575">पृष्ठ भाषा:</translation>
+<translation id="5677503058916217575">पेज भाषा:</translation>
<translation id="5677928146339483299">ब्लॉक केले</translation>
<translation id="5678550637669481956"><ph name="VOLUME_NAME" /> ला रीड आणि राइट ॲक्सेस मंजूर केला आहे.</translation>
<translation id="5678821117681811450"><ph name="WEB_DRIVE" /> ला पाठवत आहे</translation>
@@ -5447,7 +5447,7 @@
<translation id="5886384907280980632">आता बंद करा</translation>
<translation id="5888889603768021126">यासह साइन इन केले</translation>
<translation id="5889282057229379085">कमाल इंटरमिजिएट CA संख्या: <ph name="NUM_INTERMEDIATE_CA" /></translation>
-<translation id="5889629805140803638">तुमच्या स्वतःच्या <ph name="BEGIN_LINK" />सिंक पासफ्रेझ<ph name="END_LINK" /> सह सिंक केलेला डेटा एंक्रिप्ट करा. Google Pay वरील पेमेंट पद्धती आणि पत्ते एंक्रिप्ट केले जाणार नाहीत. Chrome वरील ब्राउझिंग इतिहास सिंक होणार नाही.</translation>
+<translation id="5889629805140803638">तुमच्या स्वतःच्या <ph name="BEGIN_LINK" />सिंक पासफ्रेझ<ph name="END_LINK" /> सह सिंक केलेला डेटा एंक्रिप्ट करा. Google Pay वरील पेमेंट पद्धती आणि अ‍ॅड्रेस एंक्रिप्ट केले जाणार नाहीत. Chrome वरील ब्राउझिंग इतिहास सिंक होणार नाही.</translation>
<translation id="5891688036610113830">प्राधान्य दिलेली वाय-फाय नेटवर्क</translation>
<translation id="5895138241574237353">रीस्टार्ट करा</translation>
<translation id="5895335062901455404">तुमचे Google खाते वापरून तुम्ही साइन इन कराल, तेव्हा कोणत्याही ChromeOS Flex डिव्हाइसवर तुमची सेव्ह केलेली प्राधान्ये आणि अ‍ॅक्टिव्हिटी तयार असतील. काय सिंक करायचे हे तुम्ही सेटिंग्ज मध्ये निवडू शकता.</translation>
@@ -5527,7 +5527,7 @@
<translation id="5955304353782037793">अ‍ॅप</translation>
<translation id="5955721306465922729">वेबसाइटला हे ॲप्लिकेशन उघडायचे आहे.</translation>
<translation id="5955809630138889698">हे डिव्हाइस फक्त ऑनलाइन डेमो मोडसाठी पात्र असू शकते. अधिक तपशिलांसाठी कृपया तुमच्या साहाय्य प्रतिनिधीशी संपर्क साधा.</translation>
-<translation id="5956585768868398362">तुम्ही अपेक्षा करत होता हे तेच शोध पृष्ठ आहे?</translation>
+<translation id="5956585768868398362">तुम्हाला हवे होते तेच हे शोध पेज आहे का?</translation>
<translation id="5957918771633727933">कोणत्याही eSIM प्रोफाइल उपलब्ध नाहीत. नवीन <ph name="BEGIN_LINK" />प्रोफाइल<ph name="END_LINK" /> डाउनलोड करा.</translation>
<translation id="5957987129450536192">तुमच्या प्रोफाइल इमेज जवळच्या बोलण्यासाठी निवडा आयकनवर टॅप करा, त्यानंतर तुम्हाला जे ऐकायचे आहे ते निवडा.</translation>
<translation id="5959471481388474538">नेटवर्क उपलब्ध नाही</translation>
@@ -5822,7 +5822,7 @@
<translation id="6229849828796482487">वाय-फाय नेटवर्क डिस्‍कनेक्‍ट करा</translation>
<translation id="6230165830166519105">दुसरी पद्धत वापरून पहा</translation>
<translation id="6231782223312638214">सूचित</translation>
-<translation id="6231881193380278751">पृष्ठ स्वयं-रिफ्रेश करण्यासाठी एक क्वेरी परम जोडा: chrome://device-log/?refresh=&lt;sec&gt;</translation>
+<translation id="6231881193380278751">पेज ऑटो-रिफ्रेश करण्यासाठी एक क्वेरी पॅरामीटर जोडा: chrome://device-log/?refresh=&lt;sec&gt;</translation>
<translation id="6232017090690406397">बॅटरी</translation>
<translation id="6232116551750539448"><ph name="NAME" /> वरील कनेक्शन गमावले गेले आहे</translation>
<translation id="6233154960150021497">कीबोर्डऐवजी व्हॉइस वापरण्यासाठी डीफॉल्ट</translation>
@@ -5848,7 +5848,7 @@
<translation id="6247708409970142803"><ph name="PERCENTAGE" />%</translation>
<translation id="6247802389331535091">सिस्टम: <ph name="ARC_PROCESS_NAME" /></translation>
<translation id="624789221780392884">अपडेट तयार</translation>
-<translation id="6248988683584659830">शोध सेटिंग</translation>
+<translation id="6248988683584659830">शोध सेटिंग्ज</translation>
<translation id="6249200942125593849">a11y व्यवस्थापित करा</translation>
<translation id="6250186368828697007">तुम्ही तुमची स्क्रीन शेअर करत असताना तपशील लपवले जातात</translation>
<translation id="6251870443722440887">GDI हँडल</translation>
@@ -6002,7 +6002,7 @@
<translation id="6404187344102273690">Chromebook गेमिंग</translation>
<translation id="6404511346730675251">बुकमार्क संपादित करा</translation>
<translation id="6406303162637086258">ब्राउझर रीस्टार्ट प्रतिकृती करा</translation>
-<translation id="6406506848690869874">Sync</translation>
+<translation id="6406506848690869874">सिंक करा</translation>
<translation id="6406708970972405507">सेटिंग्ज - <ph name="SECTION_TITLE" /></translation>
<translation id="6407398811519202484">तुमच्या डिव्हाइसवर डेटा सेव्ह करण्याची अनुमती आहे</translation>
<translation id="6408118934673775994"><ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, आणि <ph name="WEBSITE_3" /> वर तुमचा डेटा वाचा आणि बदला</translation>
@@ -6190,7 +6190,7 @@
<translation id="657229725818377235">धोकादायक वेबसाइट आणि डाउनलोडपासून अधिक संरक्षण मिळवा</translation>
<translation id="6573096386450695060">नेहमी अनुमती द्या</translation>
<translation id="6573497332121198392">शॉर्टकट काढून टाकू शकत नाही</translation>
-<translation id="657402800789773160">हे पृष्ठ &amp;रीलोड करा</translation>
+<translation id="657402800789773160">हे पेज &amp;रीलोड करा</translation>
<translation id="6577284282025554716">डाउनलोड रद्द केले: <ph name="FILE_NAME" /></translation>
<translation id="657866106756413002">नेटवर्क हेल्थ स्नॅपशॉट</translation>
<translation id="6579369886355986318">सर्व नियंत्रणे दाखवा</translation>
@@ -6358,7 +6358,7 @@
<translation id="6723839937902243910">सामर्थ्य</translation>
<translation id="6725073593266469338">UI सेवा</translation>
<translation id="6725206449694821596">इंटरनेट प्रिंट प्रोटोकॉल (IPP)</translation>
-<translation id="6725970970008349185">प्रति पृष्ठ प्रदर्शित करण्यासाठी उमेदवारांची संख्या</translation>
+<translation id="6725970970008349185">प्रति पेज दाखवल्या जाणार्‍या उमेदवारांची संख्या</translation>
<translation id="672609503628871915">नवीन काय ते पहा</translation>
<translation id="67269783048918309">वापर आणि निदान डेटा पाठवा. हे डिव्हाइस सध्या Google ला आपोआप निदान, डिव्हाइस आणि अ‍ॅप वापर डेटा पाठवत आहे. हे तुमच्या लहान मुलाला ओळखण्यासाठी वापरले जाणार नाही आणि सिस्ट्म आणि अ‍ॅप स्थिरता आणि इतर सुधारण्यात मदत करेल. काही एकत्रित डेटा Google अ‍ॅप्स आणि Android डेव्हलपर सारख्या भागीदारांनादेखील मदत करेल. या <ph name="BEGIN_LINK1" />सेटिंगची<ph name="END_LINK1" /> मालकाद्वारे अंमलबजावणी केली जाते. तुमच्या लहान मुलासाठी अतिरिक्त वेब आणि अ‍ॅप अ‍ॅक्टिव्हिटी सुरू केलेली असल्यास, ही माहिती त्याच्या Google खात्यामध्ये स्टोअर केली जाऊ शकते. <ph name="BEGIN_LINK2" />अधिक जाणून घ्या<ph name="END_LINK2" /></translation>
<translation id="6728528977475057549"><ph name="LAST_FOUR_DIGITS" /> ने संपणारा IBAN</translation>
@@ -6710,7 +6710,7 @@
<translation id="7014961128696979283">Steam लाँच करा</translation>
<translation id="7015088858756332848">Steam ही Chromebook वर लाँच करता आली नाही. कृपया पुन्हा प्रयत्न करा</translation>
<translation id="7017004637493394352">पुन्हा "Ok Google" म्हणा</translation>
-<translation id="7017219178341817193">एक नवीन पृष्ठ जोडा</translation>
+<translation id="7017219178341817193">एक नवीन पेज जोडा</translation>
<translation id="7017354871202642555">विंडो सेट केल्यानंतर मोड सेट करणे शक्य नाही.</translation>
<translation id="7018275672629230621">तुमचा ब्राउझिंग इतिहास वाचा आणि बदला</translation>
<translation id="7019546817926942979">तुमचे डिव्हाइस प्लग-इन केलेले असणे आवश्यक आहे. Linux अपग्रेड करणे तुमची बॅटरी मोठ्या प्रमाणात संपवू शकते. कृपया तुमचे डिव्हाइस चार्जरशी कनेक्ट करा आणि पुन्हा प्रयत्न करा.</translation>
@@ -6773,7 +6773,7 @@
<translation id="7075513071073410194">PKCS #1 MD5 With RSA एंक्रिप्शन</translation>
<translation id="7075625805486468288">तुमची HTTPS/SSL प्रमाणपत्रे आणि सेटिंग्ज व्यवस्थापित करा</translation>
<translation id="7076875098323397992">अपग्रेड सुरू करू शकत नाही</translation>
-<translation id="7077829361966535409">वर्तमान प्रॉक्सी सेटिंग्ज वापरून साइन-इन पृष्ठ लोड करण्यास अयशस्वी झाले. कृपया <ph name="GAIA_RELOAD_LINK_START" />पुन्हा साइन इन करण्याचा प्रयत्न करा<ph name="GAIA_RELOAD_LINK_END" />, किंवा भिन्न <ph name="PROXY_SETTINGS_LINK_START" />प्रॉक्सी सेटिंग्ज<ph name="PROXY_SETTINGS_LINK_END" /> वापरा.</translation>
+<translation id="7077829361966535409">वर्तमान प्रॉक्सी सेटिंग्ज वापरून साइन-इन पेज लोड करण्यास अयशस्वी झाले. कृपया <ph name="GAIA_RELOAD_LINK_START" />पुन्हा साइन इन करण्याचा प्रयत्न करा<ph name="GAIA_RELOAD_LINK_END" />, किंवा भिन्न <ph name="PROXY_SETTINGS_LINK_START" />प्रॉक्सी सेटिंग्ज<ph name="PROXY_SETTINGS_LINK_END" /> वापरा.</translation>
<translation id="7078120482318506217">सर्व नेटवर्क</translation>
<translation id="708060913198414444">ऑडिओ पत्ता कॉपी करा</translation>
<translation id="7082568314107259011"><ph name="NETWORK_NAME" /> हे तुमच्या अ‍ॅडमिनिस्ट्रेटरद्वारे व्यवस्थापित केले जाते</translation>
@@ -6838,7 +6838,7 @@
<translation id="7149893636342594995">शेवटच्या 72 तासांमधील</translation>
<translation id="7152478047064750137">या एक्स्टेंशनला कोणत्याही विशिष्ट परवानग्यांची आवश्यकता नाही</translation>
<translation id="7153309176431047193">इमेज मजकुरात रूपांतरित करा</translation>
-<translation id="7154130902455071009">तुमचे सुरू पृष्ठ यावर बदला: <ph name="START_PAGE" /></translation>
+<translation id="7154130902455071009">तुमचे स्टार्ट पेज यावर बदला: <ph name="START_PAGE" /></translation>
<translation id="7156231244155528270">इमेज ही मजकूरामध्ये रूपांतरित करा</translation>
<translation id="7159953856712257647">बाय डीफॉल्ट इंस्टॉल केले</translation>
<translation id="7160182524506337403">तुम्ही आता तुमच्या फोनमधील सूचना पाहू शकता</translation>
@@ -6899,7 +6899,7 @@
<translation id="7219762788664143869">{NUM_WEAK,plural, =0{एकही कमकुवत पासवर्ड नाही}=1{एक कमकुवत पासवर्ड}other{{NUM_WEAK} कमकुवत पासवर्ड}}</translation>
<translation id="7220019174139618249">पासवर्ड "<ph name="FOLDER" />" वर एक्सपोर्ट करू शकत नाही</translation>
<translation id="722099540765702221">चार्जिंग स्रोत</translation>
-<translation id="7221869452894271364">हे पृष्ठ रीलोड करा</translation>
+<translation id="7221869452894271364">हे पेज रीलोड करा</translation>
<translation id="7222204278952406003">तुमचे डीफॉल्ट ब्राउझर Chrome आहे</translation>
<translation id="7222232353993864120">ईमेल ॲड्रेस</translation>
<translation id="7222235798733126207">साइटदरम्यान मर्यादित शेअरिंग</translation>
@@ -7118,7 +7118,7 @@
<translation id="741906494724992817">हा ॲप ला कोणत्याही विशेष परवानग्यांची आवश्यकता नाही.</translation>
<translation id="7419565702166471774">नेहमी सुरक्षित कनेक्शन वापरा</translation>
<translation id="742130257665691897">बुकमार्क काढून टाकले</translation>
-<translation id="7421925624202799674">पृष्ठ स्रोत &amp;पहा</translation>
+<translation id="7421925624202799674">पेज स्रोत &amp;पहा</translation>
<translation id="7422192691352527311">प्राधान्ये...</translation>
<translation id="7423098979219808738">प्रथम विचारा</translation>
<translation id="7423425410216218516"><ph name="MINUTES" /> मिनिटांसाठी दृश्यमानता सुरू आहे</translation>
@@ -7127,7 +7127,7 @@
<translation id="7424153922653300265">एनर्जी सेव्हर सुरू केला</translation>
<translation id="7424818322350938336">नेटवर्क जोडले</translation>
<translation id="7427315069950454694">तुमची आजची मेमरी</translation>
-<translation id="7427348830195639090">पार्श्वभूमी पृष्ठ: <ph name="BACKGROUND_PAGE_URL" /></translation>
+<translation id="7427348830195639090">बॅकग्राउंड पेज: <ph name="BACKGROUND_PAGE_URL" /></translation>
<translation id="7427798576651127129"><ph name="DEVICE_NAME" /> चा कॉल</translation>
<translation id="7431719494109538750">HID डिव्हाइस आढळली नाहीत</translation>
<translation id="7431991332293347422">शोध पर्सनलाइझ करण्यासाठी तुमचा ब्राउझिंग इतिहास कसा वापरला जातो ते आणि बरेच काही नियंत्रित करा</translation>
@@ -7609,7 +7609,7 @@
<translation id="7855678561139483478">टॅब नवीन विंडोवर हलवा</translation>
<translation id="7857004848504343806">तुमच्या कॉंप्युटरमध्ये सुरक्षित मॉड्युल आहे, जे ChromeOS Flex मध्ये अनेक महत्त्वाची सुरक्षा वैशिष्ट्ये लागू करण्यासाठी वापरले जाते. अधिक जाणून घेण्यासाठी Chromebook मदत केंद्र ला भेट द्या: https://support.google.com/chromebook/?p=sm</translation>
<translation id="7857093393627376423">मजकुराबाबत सूचना</translation>
-<translation id="7857949311770343000">तुम्ही अपेक्षा करत होता ते हे नवीन पृष्ठ आहे?</translation>
+<translation id="7857949311770343000">तुम्हाला हवे असलेले हे नवीन टॅब पेज आहे का?</translation>
<translation id="7858328180167661092"><ph name="APP_NAME" /> (Windows)</translation>
<translation id="786073089922909430">सेवा: <ph name="ARC_PROCESS_NAME" /></translation>
<translation id="7861215335140947162">&amp;डाउनलोड</translation>
@@ -7839,7 +7839,7 @@
<translation id="8051193500142930381">कॅमेर्‍याची आवश्यकता असलेली वैशिष्ट्ये काम करणार नाहीत</translation>
<translation id="8051390370038326517"><ph name="HOST" /> ला MIDI डिव्हाइसचे पूर्ण नियंत्रण असण्याची नेहमी अनुमती द्या</translation>
<translation id="8053278772142718589">PKCS #12 फाइल</translation>
-<translation id="8053390638574070785">हे पृष्ठ रीलोड करा</translation>
+<translation id="8053390638574070785">हे पेज रीलोड करा</translation>
<translation id="8054517699425078995">या प्रकारची फाईल आपल्‍या डिव्‍हाइसला हानी पोहचवू शकते. तुम्ही <ph name="FILE_NAME" /> तरीही ठेवू इच्‍छिता?</translation>
<translation id="8054563304616131773">कृपया एक वैध ईमेल ॲड्रेस एंटर करा</translation>
<translation id="8054883179223321715">विशिष्ट व्हिडिओ साइटसाठी उपलब्ध</translation>
@@ -8029,7 +8029,7 @@
<translation id="8225265270453771718">ॲप्लिकेशन विंडो शेअर करा</translation>
<translation id="8226222018808695353">निषिद्ध केलेले</translation>
<translation id="8226619461731305576">रांग</translation>
-<translation id="8227119283605456246">फाईल संलग्न करा</translation>
+<translation id="8227119283605456246">फाइल अटॅच करा</translation>
<translation id="8228783756378591900">हा दस्तऐवज तुमच्या संस्थेच्या सुरक्षितता धोरणांनुसार तपासत आहे…</translation>
<translation id="8230134520748321204"><ph name="ORIGIN" /> साठी पासवर्ड सेव्ह करायचा आहे का?</translation>
<translation id="8230446983261649357">साइटला इमेज दाखवण्याची अनुमती देऊ नका</translation>
@@ -8298,7 +8298,7 @@
<translation id="8471959340398751476">सवलती बंद आहेत. तुम्ही कस्टमाइझ करा मेनूमधून त्या सुरू करू शकता</translation>
<translation id="8472563193954285009">{COUNT,plural, =0{Your passwords are unique}=1{{COUNT} पुन्हा वापरलेला पासवर्ड}other{{COUNT} पुन्हा वापरलेले पासवर्ड}}</translation>
<translation id="8472623782143987204">हार्डवेअर-बॅक्ड</translation>
-<translation id="8473863474539038330">पत्ते आणि बरेच काही</translation>
+<translation id="8473863474539038330">अ‍ॅड्रेस आणि बरेच काही</translation>
<translation id="8475313423285172237">तुमच्या कॉंप्युटरवरील दुसऱ्या प्रोग्रामने Chrome च्या काम करण्याचा मार्ग बदलू शकणारा एक्स्टेंशन जोडला.</translation>
<translation id="8476491056950015181"><ph name="BEGIN_PARAGRAPH1" />ChromeOS डिव्‍हाइसना आपोआप अहवाल पाठवण्‍याची अनुमती देण्‍याने आम्‍हाला ChromeOS मध्‍ये कोणती सुधारणा करायची आणि कशाचे निराकरण करायचे याला प्राधान्य देण्‍यात मदत होते. या अहवालांमध्ये ChromeOS कधी क्रॅश होते, कोणती वैशिष्ट्ये वापरली गेली, सामान्यतः किती मेमरी वापरली गेली आणि Android अ‍ॅप निदान व वापर डेटा यांसारख्या गोष्टींचा समावेश असू शकतो. काही एकत्रित डेटा Google अ‍ॅप्स आणि Android डेव्हलपर यांसारख्या भागीदारांनादेखील मदत करेल.<ph name="END_PARAGRAPH1" />
<ph name="BEGIN_PARAGRAPH2" />तुम्ही तुमच्या लहान मुलाच्या ChromeOS डिव्‍हाइस सेटिंग्‍जमध्‍ये कधीही या अहवालांना अनुमती देणे सुरू करू शकता किंवा थांबवू शकता. तुम्ही डोमेन अ‍ॅडमिनिस्ट्रेटर असल्यास, तुम्ही हे सेटिंग ॲडमिन कन्सोलमध्ये बदलू शकता.<ph name="END_PARAGRAPH2" />
@@ -8482,7 +8482,7 @@
<translation id="864892689521194669">ChromeOS Flex ची वैशिष्‍ट्ये आणि परफॉर्मन्स सुधारण्यात मदत करा</translation>
<translation id="8649026945479135076">सर्वसाधारणपणे, तुम्ही भेट देता त्या साइट तुमचा अनुभव पर्सनलाइझ करण्यासाठी, तुम्हाला स्वारस्य असलेल्या गोष्टी लक्षात ठेवतात. साइट तुमच्या स्वारस्यांबद्दलची माहिती Chrome वापरून स्टोअरदेखील करू शकतात.</translation>
<translation id="8650543407998814195">जरी तुम्ही आता तुमची जुनी प्रोफाइल अ‍ॅक्सेस करू शकत नसलात, तरीही तुम्ही ती काढून टाकू शकता.</translation>
-<translation id="8651585100578802546">सक्तीने हे पृष्ठ रीलोड करा</translation>
+<translation id="8651585100578802546">सक्तीने हे पेज रीलोड करा</translation>
<translation id="8652400352452647993">पॅक एक्स्टेंशन एरर</translation>
<translation id="8654151524613148204">तुमच्या कॉंप्युटरला हाताळण्‍यासाठी ही फाइल खूप मोठी आहे. क्षमस्व.</translation>
<translation id="8655295600908251630">खाडी</translation>
@@ -8496,7 +8496,7 @@
<translation id="8662911384982557515">तुमचे होम पेज यावर बदला: <ph name="HOME_PAGE" /></translation>
<translation id="8662978096466608964">Chrome वॉलपेपर सेट करू शकत नाही.</translation>
<translation id="8663099077749055505"><ph name="HOST" /> वरील एकाधिक ऑटोमॅटिक डाउनलोड नेहमी ब्लॉक करा</translation>
-<translation id="8664389313780386848">पृष्ठ स्रोत &amp;पहा</translation>
+<translation id="8664389313780386848">पेज स्रोत &amp;पहा</translation>
<translation id="8665110742939124773">तुम्ही चुकीचा अ‍ॅक्सेस कोड एंटर केला आहे. पुन्हा प्रयत्न करा.</translation>
<translation id="8665180165765946056">बॅकअप पूर्ण झाला</translation>
<translation id="866611985033792019">ईमेल वापरकर्त्यांना ओळखण्यासाठी या सर्टिफिकेटवर विश्वास ठेवा</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_my.xtb b/chromium/chrome/app/resources/generated_resources_my.xtb
index cb57451d42e..cd5323efdd5 100644
--- a/chromium/chrome/app/resources/generated_resources_my.xtb
+++ b/chromium/chrome/app/resources/generated_resources_my.xtb
@@ -1382,7 +1382,7 @@
<translation id="2190069059097339078">WiFi Credentials Getter</translation>
<translation id="219008588003277019">ဇာတိဖောက်သည် သင်ရိုး: <ph name="NEXE_NAME" /></translation>
<translation id="2190355936436201913">(ဗလာ)</translation>
-<translation id="2191754378957563929">ဖွင့်ထားသည်</translation>
+<translation id="2191754378957563929">ဖွင့်</translation>
<translation id="2192505247865591433">မှ:</translation>
<translation id="2193365732679659387">ယုံကြည်မှု ဆက်တင်များ</translation>
<translation id="2194856509914051091">စဉ်းစားရန် အချက်များ</translation>
@@ -2033,7 +2033,7 @@
<translation id="274362947316498129">အက်ပ်တစ်ခုက <ph name="DEVICE_NAME" /> ကို သုံးရန် ကြိုးစားနေသည်။ သုံးခွင့်ပြုရန် <ph name="DEVICE_NAME" /> ကိုယ်ရေးအချက်အလက်လုံခြုံမှု ခလုတ်ကို ပိတ်ပါ။</translation>
<translation id="2745080116229976798">Microsoft အရည်သွေးမှီ အမိန့်လိုက်နာမှု</translation>
<translation id="2749756011735116528"><ph name="PRODUCT_NAME" />သို့ လက်မှတ်ထိုး ဝင်ရန်</translation>
-<translation id="2749836841884031656">ဆင်းမ်</translation>
+<translation id="2749836841884031656">ဆင်းမ်ကတ်</translation>
<translation id="2749881179542288782">သဒ္ဒါကို စာလုံးပေါင်းနှင့်အတူ စစ်ကြည့်ရန်</translation>
<translation id="2754226775788136540"><ph name="PRIMARY_EMAIL" /> တွင် သိမ်းထားသော ‘အမြန်တွဲချိတ်ခြင်း’ စက်များကို ရှာနေသည်</translation>
<translation id="2754825024506485820">အလုပ်ပြီးမြောက်မှုမှ ဖျော်ဖြေရေးအထိ လိုအပ်သောအက်ပ်များကို Google Play Store တွင် ရှာနိုင်သည်။ အက်ပ်များကို အချိန်မရွေး ထည့်သွင်းနိုင်သည်။</translation>
@@ -3175,7 +3175,7 @@
<translation id="379082410132524484">သင်၏ကတ်သည် သက်တမ်းကုန်ဆုံးသွားပါပြီ</translation>
<translation id="3792973596468118484">နောက်ဆက်တွဲ <ph name="NUM_EXTENSIONS" /> ခု</translation>
<translation id="379500251094592809">'အနီးတစ်ဝိုက် မျှဝေခြင်း' အသုံးပြုရန် စက်နှစ်ခုလုံးပွင့်နေပြီး အတူကပ်ထားကာ ဘလူးတုသ်ဖွင့်ထားကြောင်း သေချာပါစေ။ သင်၏အဆက်အသွယ်များတွင် မပါဝင်သော Chromebook အား မျှဝေနေပါက ၎င်းတွင် 'အနီးတစ်ဝိုက် မြင်နိုင်မှု' ဖွင့်ထားကြောင်း သေချာပါစေ (အချိန်ရွေးချယ်ပြီး အခြေအနေပြနေရာကို ဖွင့်ပါ၊ ထို့နောက် 'အနီးတစ်ဝိုက် မြင်နိုင်မှု' ကိုဖွင့်ပါ) <ph name="LINK_BEGIN" />ပိုမိုလေ့လာရန်<ph name="LINK_END" /></translation>
-<translation id="379509625511193653">ပိတ်ထားသည်</translation>
+<translation id="379509625511193653">ပိတ်</translation>
<translation id="3795766489237825963">လှုပ်ရှားသက်ဝင်ပုံများ ဖွင့်ရန်</translation>
<translation id="3796648294839530037">စိတ်ကြိုက်ကွန်ယက်များ</translation>
<translation id="3797739167230984533">သင့်အဖွဲ့အစည်းက သင်၏ <ph name="BEGIN_LINK" /><ph name="DEVICE_TYPE" /> ကို စီမံခန့်ခွဲထားပါသည်<ph name="END_LINK" /></translation>
@@ -4493,7 +4493,7 @@
<translation id="4995293419989417004">ကြော်ငြာအကြောင်းအရာများအကြောင်း ပိုမိုလေ့လာရန်</translation>
<translation id="4996851818599058005">{NUM_VMS,plural, =0{<ph name="VM_TYPE" /> VM မရှိပါ}=1{<ph name="VM_TYPE" /> VM 1 ခု တွေ့သည်-<ph name="VM_NAME_LIST" />}other{<ph name="VM_TYPE" /> VM {NUM_VMS} ခု တွေ့သည်- <ph name="VM_NAME_LIST" />}}</translation>
<translation id="4997086284911172121">အင်တာနက် ချိတ်ဆက်မှု မရှိပါ။</translation>
-<translation id="4998430619171209993">ဖွင့်ထားသည်</translation>
+<translation id="4998430619171209993">ဖွင့်</translation>
<translation id="4999804342505941663">'မနှောင့်ယှက်ရ' ကို ဖွင့်ရန်</translation>
<translation id="5000922062037820727">ပိတ်ဆို့ထား၏ (အကြံပြုထား)</translation>
<translation id="5001526427543320409">ပြင်ပကုမ္ပဏီ၏ကွတ်ကီး</translation>
@@ -6388,7 +6388,7 @@
<translation id="6759193508432371551">စက်ရုံဆက်တင် ပြန်လည်သပ်မှတ်</translation>
<translation id="6761431452438552910">သင့်ဘလူးတုသ်သုံးစက်သည် တွဲချိတ်ခြင်းမုဒ်တွင် ရှိပြီး အနီးအနားတွင် ရှိနေကြောင်း သေချာပါစေ။ သင်ယုံကြည်ရသော စက်များနှင့်သာ တွဲချိတ်ပါ။</translation>
<translation id="676158322851696513">“<ph name="EXTENSION_NAME" />”</translation>
-<translation id="6762833852331690540">ဖွင့်ထားသည်</translation>
+<translation id="6762833852331690540">ဖွင့်</translation>
<translation id="676560328519657314">Google Pay ရှိ သင်၏ငွေပေးချေနည်းလမ်းများ</translation>
<translation id="6767566652486411142">အခြားဘာသာစကားတစ်ခု ရွေးရန်...</translation>
<translation id="6767639283522617719">ဒိုမိန်းသို့ ချိတ်ဆက်၍မရပါ။ အဖွဲ့အစည်းဌာနအတွက် ဆက်တင်များ မှန်ကန်ခြင်းရှိမရှိ သေချာစစ်ဆေးပါ။</translation>
@@ -7549,7 +7549,7 @@
<translation id="7792388396321542707">မျှဝေမှု ရပ်ရန်</translation>
<translation id="779308894558717334">အစိမ်းဖျော့</translation>
<translation id="7793098747275782155">အပြာရင့်</translation>
-<translation id="7797571222998226653">ပိတ်ထားသည်</translation>
+<translation id="7797571222998226653">ပိတ်</translation>
<translation id="7798504574384119986">ဝဘ်ခွင့်ပြုချက်များ ကြည့်ရန်</translation>
<translation id="7798844538707273832"><ph name="PERMISSION" /> ကို အလိုအလျောက် ပိတ်ထားသည်</translation>
<translation id="7800518121066352902">ရေတွက်စက်ကို လက်ဝဲ&amp;ရစ် လှည့်ပေးရန်</translation>
@@ -7622,7 +7622,7 @@
<translation id="7870790288828963061">ပိုသစ်သည့် ဗားရှင်းဖြင့် Kiosk အက်ပ် တစ်ခုကိုမှ မတွေ့ခဲ့ပါ။ ကျေးဇူးပြုပြီး USB အချောင်းကို ဖယ်ရှားလိုက်ပါ။</translation>
<translation id="7871049986386271121">‘ဤဝဘ်ဆိုက်’ တွင် အမြဲဖွင့်ထားရန်</translation>
<translation id="7871109039747854576">လျှောက်ထားသူစာရင်း စာမျက်နှာဖွဲ့ရန် <ph name="COMMA" /> နှင့် <ph name="PERIOD" /> ကီးများကို အသုံးပြုပါ</translation>
-<translation id="787268756490971083">ပိတ်ထားသည်</translation>
+<translation id="787268756490971083">ပိတ်</translation>
<translation id="7872758299142009420">ထည့်သွင်းထားသော အုပ်စုများ အလွန်များနေသည်- <ph name="ERROR_LINE" /></translation>
<translation id="7874257161694977650">Chrome နောက်ခံပုံများ</translation>
<translation id="7876027585589532670">ဖြတ်လမ်းလင့်ခ်ကို တည်းဖြတ်၍မရပါ</translation>
@@ -9084,7 +9084,7 @@
<translation id="9180281769944411366">ဤလုပ်ဆောင်ချက်သည် မိနစ်အနည်းငယ်ကြာနိုင်ပါသည်။ Linux ကွန်တိန်နာကို စတင်နေသည်။</translation>
<translation id="9180380851667544951">ဝဘ်ဆိုက်က သင့်မျက်နှာပြင်ကို မျှဝေနိုင်သည်</translation>
<translation id="9182556968660520230">ကာကွယ်ထားသော အကြောင်းအရာကိုဖွင့်ရန် ဝဘ်ဆိုက်များကို ခွင့်မပြုပါနှင့်</translation>
-<translation id="9183331776983279456">၄ ပတ်ကျော်ပြီဖြစ်သော ဝဘ်ဆိုက်များကို Chrome က အလိုအလျောက်ဖျက်သည်။ သင်ထပ်မံဝင်ကြည့်သည့် ဝဘ်ဆိုက်က စာရင်းတွင် ထပ်ပေါ်လာနိုင်သည်။ သို့မဟုတ် ဝဘ်ဆိုက်ကို သင့်အတွက် ကြော်ငြာများအကြံပြုခြင်းမှ ပိတ်ထားနိုင်သည်။</translation>
+<translation id="9183331776983279456">၄ ပတ်ကျော်ပြီဖြစ်သော ဝဘ်ဆိုက်များကို Chrome က အလိုအလျောက်ဖျက်သည်။ သင်ထပ်ဝင်ကြည့်သည့် ဝဘ်ဆိုက်က စာရင်းတွင် ထပ်ပေါ်လာနိုင်သည်။ သို့မဟုတ် ဝဘ်ဆိုက်ကို သင့်အတွက် ကြော်ငြာများအကြံပြုခြင်းမှ ပိတ်ထားနိုင်သည်။</translation>
<translation id="918352324374649435">{COUNT,plural, =1{အက်ပ်}other{အက်ပ် # ခု}}</translation>
<translation id="9186963452600581158">ကလေး၏ Google Account ဖြင့် လက်မှတ်ထိုးဝင်ရန်</translation>
<translation id="9187967020623675250">ကီးများ မတူပါ။ <ph name="RESPONSE" /> အတွက် ကီးတစ်ခုခုကို နှိပ်ပါ။</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_ne.xtb b/chromium/chrome/app/resources/generated_resources_ne.xtb
index 2415708bb5e..0ac0cf27796 100644
--- a/chromium/chrome/app/resources/generated_resources_ne.xtb
+++ b/chromium/chrome/app/resources/generated_resources_ne.xtb
@@ -39,7 +39,7 @@
<translation id="1033780634303702874">आफ्नो धारावाहिक यन्त्रहरू पहुँच गर्नुहोस्</translation>
<translation id="1034484273907870301">ट्याब्लेट मोडमा उपलब्ध थम्बनेल ट्याब स्ट्रिप</translation>
<translation id="1035875743511577452">तपाईं कलाकार, प्रकृति र अन्य कुराबाट प्रेरित थिमहरू हेर्न चाहनुहुन्छ भने "थिम परिवर्तन गर्नुहोस्" बटनमा क्लिक गर्नुहोस्</translation>
-<translation id="1036348656032585052">निस्कृय पार्नुहोस्</translation>
+<translation id="1036348656032585052">अफ गर्नुहोस्</translation>
<translation id="1036511912703768636">यी कुनै USB उपकरणहरूको पहुँच गर्नुहोस्</translation>
<translation id="1038168778161626396">एन्साइफर मात्रै</translation>
<translation id="1038462104119736705">Linux प्रयोग गर्न कम्तीमा पनि <ph name="INSTALL_SIZE" /> ठाउँ खाली राख्न सिफारिस गरिन्छ। थप ठाउँ खाली गर्न आफ्नो यन्त्रमा भएका फाइलहरू मेटाउनुहोस्।</translation>
@@ -48,7 +48,7 @@
<translation id="1041263367839475438">उपलब्ध डिभाइस</translation>
<translation id="1042174272890264476">तपाइँको कम्प्युटर <ph name="SHORT_PRODUCT_NAME" /> को RLZ अन्तरनिर्मित पुस्तकालयसँग पनि आउँछ। एक विशेष वृद्धि जनक अभियानद्वारा चालू भएको खोजीहरू र <ph name="SHORT_PRODUCT_NAME" /> प्रयोगहरू नाप्नको लागि RLZ ले एउटा अद्वितीय नभएको, व्यक्तिगत नभएको ठम्याउन सकिने ट्याग तोक्छ। यी लेबुलहरू कहिलेकाही <ph name="PRODUCT_NAME" /> मा Google खोजी क्वेरीहरूमका देखा पर्छन्।</translation>
<translation id="1042248468362992359">हटस्पट प्रयोग गर्न मोबाइल डेटामा कनेक्ट गर्नुहोस्। <ph name="BEGIN_LINK_LEARN_MORE" />थप जान्नुहोस्<ph name="END_LINK_LEARN_MORE" /></translation>
-<translation id="1043505821207197890">केही चिज गडबड भयो। Linux आंशिक रूपमा मात्र अपग्रेड गरिएको हुन सक्छ। तपाईं यस सम्बन्धमा थप जानकारी प्राप्त गर्न चाहनुहुन्छ भने लगहरू हेर्नुहोस्। लगहरू "फाइलहरू &gt; मेरा फाइलहरू &gt; <ph name="LOG_FILE" />" मा सेभ गरिएको छ</translation>
+<translation id="1043505821207197890">कुनै समस्या आयो। Linux आंशिक रूपमा मात्र अपग्रेड गरिएको हुन सक्छ। तपाईं यस सम्बन्धमा थप जानकारी प्राप्त गर्न चाहनुहुन्छ भने लगहरू हेर्नुहोस्। लगहरू "फाइलहरू &gt; मेरा फाइलहरू &gt; <ph name="LOG_FILE" />" मा सेभ गरिएको छ</translation>
<translation id="104419033123549300">किम्यापको शैली</translation>
<translation id="104710386808485638">Linux पुनः सुरु गर्ने हो?</translation>
<translation id="1047431265488717055">लिंक पाठ प्रतिलिपि गर्नुहोस्</translation>
@@ -370,7 +370,7 @@
<translation id="1333965224356556482">साइटहरूलाई मेरो स्थानसम्बन्धी जानकारी हेर्ने अनुमति नदिइयोस्</translation>
<translation id="133535873114485416">रुचाइएको इनपुट</translation>
<translation id="1335929031622236846">आफ्नो यन्त्र दर्ता गर्नुहोस्</translation>
-<translation id="1336902454946927954">तपाईंको फिंगरप्रिन्ट पहिचान गर्न नसकिएकाले तपाईंको सुरक्षा साँचो लक गरिएको छ। यसलाई अनलक गर्न आफ्नो PIN प्रविष्टि गर्नुहोस्।</translation>
+<translation id="1336902454946927954">तपाईंको फिंगरप्रिन्ट पहिचान गर्न नसकिएकाले तपाईंको सुरक्षा साँचो लक गरिएको छ। यसलाई अनलक गर्न आफ्नो PIN हाल्नुहोस्।</translation>
<translation id="1338631221631423366">कनेक्ट गरिँदै छ...</translation>
<translation id="1338802252451106843"><ph name="ORIGIN" /> ले यो एप खोल्न चाहन्छ।</translation>
<translation id="1338950911836659113">मेट्दै...</translation>
@@ -1080,7 +1080,7 @@
<translation id="1936157145127842922">फोल्डरमा देखाउनुहोस्</translation>
<translation id="1936931585862840749">प्रिन्ट गर्नु पर्ने प्रतिको सङ्ख्या तोक्न (१ देखि <ph name="MAX_COPIES" /> सम्मको) कुनै सङ्ख्या प्रयोग गर्नुहोस्।</translation>
<translation id="1937774647013465102">यस यन्त्रमार्फत <ph name="ARCHITECTURE_DEVICE" />प्रकारको कन्टेनरसम्बन्धी वास्तुकला <ph name="ARCHITECTURE_CONTAINER" /> आयात गर्न सकिएन। तपाईं यो कन्टेनरलाई फरक यन्त्रमा पुनर्स्थापना गरी हेर्न सक्नुहुन्छ अथवा तपाईं Files एपमार्फत खोलेर यस कन्टेनरसम्बन्धी छविभित्रका फाइलहरूमाथि पहुँच राख्न सक्नुहुन्छ।</translation>
-<translation id="1938320257168860255">केही चिज गडबड भयो। तपाईंको फोन नजिकै छ, अनलक गरिएको छ र उक्त फोनमा ब्लुटुथ तथा Wi-Fi अन गरिएको छ भन्ने कुरा सुनिश्चित गर्नुहोस्।</translation>
+<translation id="1938320257168860255">कुनै समस्या आयो। तपाईंको फोन नजिकै छ, अनलक गरिएको छ र उक्त फोनमा ब्लुटुथ तथा Wi-Fi अन गरिएको छ भन्ने कुरा सुनिश्चित गर्नुहोस्।</translation>
<translation id="1938351510777341717">बाह्य आदेश</translation>
<translation id="1940546824932169984">कनेक्ट गरिएका डिभाइस</translation>
<translation id="1941410638996203291">सुरु हुने समय: <ph name="TIME" /></translation>
@@ -1268,7 +1268,7 @@
<translation id="2105809836724866556"><ph name="MODULE_TITLE" /> वटा कन्सोल म्यासेज लुकाइएका छन्</translation>
<translation id="2108349519800154983">{COUNT,plural, =1{फोन नम्बर}other{# वटा फोन नम्बर}}</translation>
<translation id="2110941575868943054">ब्लुटुथ डिभाइसहरू खोज्ने अनुमति दिइएका साइटहरू</translation>
-<translation id="2111158890826137380">माफ गर्नुहोला, केही चिज गडबड भयो। कृपया वर्णनमा #bruschetta समावेश गरी प्रतिक्रिया पठाउनुहोस्। त्रुटिको कोड <ph name="ERROR" /> हो</translation>
+<translation id="2111158890826137380">माफ गर्नुहोला, कुनै समस्या आयो। कृपया वर्णनमा #bruschetta समावेश गरी प्रतिक्रिया पठाउनुहोस्। त्रुटिको कोड <ph name="ERROR" /> हो</translation>
<translation id="211144231511833662">प्रकारहरू हटाउनुहोस्</translation>
<translation id="2111670510994270194">दायाँपट्टि नयाँ ट्याब</translation>
<translation id="2112554630428445878">स्वागत छ, <ph name="USERNAME" /></translation>
@@ -1626,7 +1626,7 @@
<translation id="2400664245143453337">तत्काल अद्यावधिक गर्न आवश्यक छ</translation>
<translation id="2406153734066939945">यो प्रोफाइल र यसका डेटा मेटाउने हो?</translation>
<translation id="2408018932941436077">कार्ड सुरक्षित गर्दै</translation>
-<translation id="2408955596600435184">आफ्नो PIN प्रविष्टि गर्नुहोस्</translation>
+<translation id="2408955596600435184">आफ्नो PIN हाल्नुहोस्</translation>
<translation id="2409268599591722235">जाऔँ</translation>
<translation id="2409709393952490731">कुनै फोन वा ट्याब्लेट प्रयोग गर्नुहोस्</translation>
<translation id="2410079346590497630">बिल्डसम्बन्धी विवरण</translation>
@@ -1782,7 +1782,7 @@
<translation id="2538084450874617176">यो <ph name="DEVICE_TYPE" /> कसले चलाउँदै हुनुहुन्छ?</translation>
<translation id="2538361623464451692">सिंक असक्षम पारियो</translation>
<translation id="2540449034743108469">विस्तारसम्बन्धी गतिविधि सुन्न सुरु गर्न "सुरु गर्नुहोस्" मा थिच्नुहोस्</translation>
-<translation id="2540651571961486573">केही चिज गडबड भयो। त्रुटिसम्बन्धी कोड: <ph name="ERROR_CODE" />।</translation>
+<translation id="2540651571961486573">कुनै समस्या आयो। त्रुटिसम्बन्धी कोड: <ph name="ERROR_CODE" />।</translation>
<translation id="2541002089857695151">पूर्ण स्क्रिनमा cast गर्ने सुविधा अप्टिमाइज गर्ने हो?</translation>
<translation id="2541423446708352368">सबै डाउनलोडहरू देखाउनुहोस्</translation>
<translation id="2541706104884128042">सुत्ने समयको सीमा अद्यावधिक गरियो</translation>
@@ -2204,7 +2204,7 @@
<translation id="2908358077082926882">तोकिएको की हटाएर <ph name="RESPONSE" /> "<ph name="CURRENTKEY" />" की फेरि थिच्नुहोस्</translation>
<translation id="2909506265808101667">Google का सेवाहरूमा कनेक्ट गर्न सकिएन। इन्टरनेट जाँच्नुहोस् र फेरि प्रयास गर्नुहोस्। त्रुटिको कोड: <ph name="ERROR_CODE" />।</translation>
<translation id="2910318910161511225">नेटवर्कमा जडान गरेर फेरि प्रयास गर्नुहोस्</translation>
-<translation id="2910718431259223434">केही चिज गडबड भयो। कृपया फेरि प्रयास गर्नुहोस् वा आफ्नो डिभाइसका मालिक वा एड्मिनसँग सम्पर्क गर्नुहोस्। त्रुटिको कोड: <ph name="ERROR_CODE" />।</translation>
+<translation id="2910718431259223434">कुनै समस्या आयो। कृपया फेरि प्रयास गर्नुहोस् वा आफ्नो डिभाइसका मालिक वा एड्मिनसँग सम्पर्क गर्नुहोस्। त्रुटिको कोड: <ph name="ERROR_CODE" />।</translation>
<translation id="2912247081180973411">विन्डोहरू बन्द गर्नुहोस्</translation>
<translation id="2913331724188855103">साइटहरूलाई कुकी डेटा सुरक्षित गर्ने र पढ्ने अनुमति दिनुहोस् (सिफारिस गरिएको)</translation>
<translation id="2915102088417824677">क्रियाकलापसम्बन्धी लग हेर्नुहोस्</translation>
@@ -2255,7 +2255,7 @@
<translation id="2953218713108551165"><ph name="SITE" /> का हकमा सूचना पठाउने अनुमति दिइएको छैन। तपाईंले अर्को पटक यो वेबसाइट खोल्दा तपाईंलाई फेरि सोधिने छ।</translation>
<translation id="2956070239128776395">समूहभित्र खण्ड छ: <ph name="ERROR_LINE" /></translation>
<translation id="2958721676848865875">प्याक विस्तारसम्बन्धी चेतावनी</translation>
-<translation id="2959127025785722291">केही चिज गडबड भयो। स्क्यान गर्ने कार्य पूरा गर्न सकिएन। कृपया फेरि प्रयास गर्नुहोस्</translation>
+<translation id="2959127025785722291">कुनै समस्या आयो। स्क्यान गर्ने कार्य पूरा गर्न सकिएन। कृपया फेरि प्रयास गर्नुहोस्</translation>
<translation id="2959842337402130152">पर्याप्त भण्डारण स्थान नभएका कारण पुनर्स्थापना गर्न सकिएन। यन्त्रबाट <ph name="SPACE_REQUIRED" /> ठाउँ खाली गरी फेरि प्रयास गर्नुहोस्।</translation>
<translation id="2960208947600937804">Linux कन्फिगर गर्ने क्रममा कुनै त्रुटि भयो। आफ्ना प्रशासकसँग सम्पर्क गर्नुहोस्।</translation>
<translation id="296026337010986570">सम्पन्न भयो! हानिकारक सफ्टवेयर हटाइयो। विस्तारहरू फेरि सक्रिय गर्न &lt;a href="chrome://extensions"&gt;विस्तारहरू&lt;/a&gt; मा जानुहोस्।</translation>
@@ -3156,7 +3156,7 @@
<translation id="3788331399335602504">यी फाइलहरू</translation>
<translation id="3788401245189148511">यसले सक्छ:</translation>
<translation id="3789841737615482174">स्थापना गर्नुहोस्</translation>
-<translation id="3790417903123637354">केही चिज गडबड भयो। पछि फेरि प्रयास गर्नुहोस्</translation>
+<translation id="3790417903123637354">कुनै समस्या आयो। पछि फेरि प्रयास गर्नुहोस्</translation>
<translation id="379082410132524484">तपाईंको कार्डको म्याद सकियो</translation>
<translation id="3792973596468118484"><ph name="NUM_EXTENSIONS" /> वटा एक्स्टेन्सन</translation>
<translation id="379500251094592809">नजिकैका डिभाइससँग सेयर गर्ने सुविधा प्रयोग गर्न दुइटै डिभाइस अनलक गरिएका छन्, एकअर्काको नजिकै छन् र दुवैको ब्लुटुथ अन गरिएको छ भन्ने कुरा सुनिश्चित गर्नुहोस्। तपाईं आफ्ना सम्पर्क ठेगानाहरूको सूचीमा नभएको कुनै Chromebook सँग सेयर गर्दै हुनुहुन्छ भने त्यसमा 'नजिकैका यन्त्रमा फेला पर्ने' सुविधा अन गरिएको छ भन्ने कुरा सुनिश्चित गर्नुहोस् (समय चयन गरेर वस्तुस्थिति क्षेत्र खोल्नुहोस् र त्यसपछि 'नजिकैका यन्त्रमा फेला पर्ने' सुविधा अन गर्नुहोस्) <ph name="LINK_BEGIN" />थप जान्नुहोस्<ph name="LINK_END" /></translation>
@@ -4023,7 +4023,7 @@
<translation id="4568213207643490790">माफ गर्नुहोस्, यस यन्त्रमा Google खाताहरूलाई अनुमति छैन।</translation>
<translation id="4569747168316751899">निष्क्रिय भएको बेला</translation>
<translation id="4570201855944865395">यो एक्स्टेन्सन अनुरोध गर्नुको कारण:</translation>
-<translation id="4572779512957829735">तपाईंको सुरक्षा साँचो प्रयोग गर्नका लागि उक्त PIN प्रविष्टि गर्नुहोस्</translation>
+<translation id="4572779512957829735">तपाईंको सुरक्षा साँचो प्रयोग गर्नका लागि उक्त PIN हाल्नुहोस्</translation>
<translation id="457386861538956877">थप...</translation>
<translation id="4574741712540401491">• <ph name="LIST_ITEM_TEXT" /></translation>
<translation id="4576541033847873020">ब्लुटुथ यन्त्रको जोडा बनाउनुहोस्</translation>
@@ -4619,7 +4619,7 @@
<translation id="5136343472380336530">दुइटै डिभाइस अनलक गरिएका छन्, एकअर्काको नजिकै छन् र दुवैको ब्लुटुथ अन गरिएको छ भन्ने कुरा सुनिश्चित गर्नुहोस्। <ph name="LINK_BEGIN" />थप जान्नुहोस्<ph name="LINK_END" /></translation>
<translation id="5137501176474113045">यस वस्तुलाई हटाउनुहोस्</translation>
<translation id="5139112070765735680"><ph name="QUERY_NAME" />, <ph name="DEFAULT_SEARCH_ENGINE_NAME" /> खोज</translation>
-<translation id="5139823398361067371">आफ्नो सुरक्षा साँचोको PIN प्रविष्टि गर्नुहोस् तपाईंलाई PIN थाहा छैन भने तपाईंले आफ्नो सुरक्षा साँचो रिसेट गर्नु पर्ने छ।</translation>
+<translation id="5139823398361067371">आफ्नो सुरक्षा साँचोको PIN हाल्नुहोस् तपाईंलाई PIN थाहा छैन भने तपाईंले आफ्नो सुरक्षा साँचो रिसेट गर्नु पर्ने छ।</translation>
<translation id="5139955368427980650">&amp;खोल्नुहोस्</translation>
<translation id="5141421572306659464">प्राथमिक खाता</translation>
<translation id="5142793792982256885">टचप्याड स्क्रोल हुने गति</translation>
@@ -5116,7 +5116,7 @@
<translation id="5592595402373377407">अझै पर्याप्त डाटा उपलब्ध छैन।</translation>
<translation id="5594899180331219722">फाइल चयन गर्नुहोस्</translation>
<translation id="5595307023264033512">साइटहरूले प्रयोग गरेको कुल भण्डारण: <ph name="TOTAL_USAGE" /></translation>
-<translation id="5595485650161345191">ठेगाना सम्पादन गर्नुहोस्</translation>
+<translation id="5595485650161345191">ठेगाना बदल्नुहोस्</translation>
<translation id="5596627076506792578">अन्य विकल्पहरू</translation>
<translation id="5600348067066185292">इन्स्टल गर्न केही चरणहरू पूरा गर्नु पर्ने हुन्छ। तपाईंको कम्प्युटरमा परिवर्तनहरू गर्नुअघि तपाईंलाई पुष्टि गर्ने थप एउटा मौका दिइने छ।</translation>
<translation id="5600706100022181951"><ph name="UPDATE_SIZE_MB" /> एम. बि. मोबाइल डेटा प्रयोग गरेर अद्यावधिक डाउनलोड गरिने छ। तपाईं जारी राख्न चाहनुहुन्छ?</translation>
@@ -5420,7 +5420,7 @@
<translation id="5877584842898320529">चयन गरिएको प्रिन्टर उपलब्ध छैन वा त्यसलाई राम्ररी स्थापना गरिएको छैन। <ph name="BR" /> आफ्नो प्रिन्टर जाँच्नुहोस् वा अर्को प्रिन्टर चयन गरी हेर्नुहोस्।</translation>
<translation id="5878945009165002849">पहिचान सेवा प्रदायकहरूबाट प्राप्त साइन इन प्रम्प्टहरू ब्लक गरियोस्</translation>
<translation id="5881710783061958569">तपाईंले पासवर्ड परिवर्तन गरिसक्नुभयो भने कृपया <ph name="BRAND" /> मा सेभ गरिएको पासवर्ड सम्पादन गरी नयाँ पासवर्डसँग मिल्दो बनाउनुहोस्।</translation>
-<translation id="5882449899683447569">केही चिज गडबड भयो र तपाईंका पासवर्ड इम्पोर्ट गर्न सकिएन</translation>
+<translation id="5882449899683447569">कुनै समस्या आयो र तपाईंका पासवर्ड इम्पोर्ट गर्न सकिएन</translation>
<translation id="5882919346125742463">ज्ञात नेटवर्कहरू</translation>
<translation id="5883356647197510494"><ph name="PERMISSION_1" /> र <ph name="PERMISSION_2" /> सम्बन्धी अनुमति स्वतः ब्लक गरिएका छन्</translation>
<translation id="5884447826201752041">हरेक एक्स्टेन्सनका हकमा साइट हेर्ने अनुमतिसम्बन्धी सेटिङ कस्टमाइज गर्नुहोस्</translation>
@@ -6330,7 +6330,7 @@
<translation id="6715803357256707211">तपाईंको Linux एप स्थापना गर्ने क्रममा कुनै त्रुटि भयो। विस्तृत विवरणका लागि सूचनामा क्लिक गर्नुहोस्।</translation>
<translation id="671619610707606484">यस कार्यले साइटहरूले भण्डारण गरेको <ph name="TOTAL_USAGE" /> डेटा मेटाउने छ</translation>
<translation id="6716798148881908873">इन्टरनेट चलिरहेको छैन। आफ्नो इन्टरनेट कनेक्सन जाँच्नुहोस् वा कुनै अर्को Wi-Fi नेटवर्कमा कनेक्ट गरी हेर्नुहोस्।</translation>
-<translation id="671928215901716392">स्क्रिन लक गर्नुहोस्</translation>
+<translation id="671928215901716392">लक स्क्रिन</translation>
<translation id="6721744718589119342">हामी तपाईंलाई इमेल पठाएर थप जानकारी वा अद्यावधिक सूचना माग्न सक्छौँ</translation>
<translation id="6721972322305477112">&amp;फाइल</translation>
<translation id="672208878794563299">यो साइटले फेरि अर्को पटक पनि अनुमति माग्ने छ।</translation>
@@ -6874,7 +6874,7 @@
<translation id="7210471695184432500">तपाईं यो डिभाइसको Google पासवर्ड म्यानेजरमा पासवर्डहरू इम्पोर्ट गर्न चाहनुहुन्छ भने कुनै CSV फाइल छनौट गर्नुहोस्</translation>
<translation id="7210499381659830293">विस्तारसम्बन्धी प्रिन्टरहरू</translation>
<translation id="7211783048245131419">अहिलेसम्म कुनै पनि स्विच तोकिएको छैन</translation>
-<translation id="7212097698621322584">यसलाई बदल्न आफ्नो हालको PIN प्रविष्टि गर्नुहोस्। तपाईंलाई आफ्नो PIN थाहा छैन भने तपाईंले सुरक्षा साँचो रिसेट गर्नु पर्छ र त्यसपछि नयाँ PIN सिर्जना गर्नु पर्छ।</translation>
+<translation id="7212097698621322584">यसलाई बदल्न आफ्नो हालको PIN हाल्नुहोस्। तपाईंलाई आफ्नो PIN थाहा छैन भने तपाईंले सुरक्षा साँचो रिसेट गर्नु पर्छ र त्यसपछि नयाँ PIN सिर्जना गर्नु पर्छ।</translation>
<translation id="721490496276866468">पासवर्डहरू इम्पोर्ट गर्नुहोस्</translation>
<translation id="7218514093816577632">आफ्नो <ph name="DEVICE_NAME" /> मा सूचना प्राप्त गर्ने सुविधा अन गरिएको छ भन्ने कुरा सुनिश्चित गर्नुहोस्।</translation>
<translation id="7219473482981809164">हामीले डाउनलोड गर्न मिल्ने एकभन्दा बढी प्रोफाइलहरू भेट्टाएका छौँ। अगाडि बढ्नुअघि आफूले डाउनलोड गर्न चाहेका प्रोफाइलहरू चयन गर्नुहोस्।</translation>
@@ -6969,7 +6969,7 @@
<translation id="7299588179200441056"><ph name="URL" /> - <ph name="FOLDER" /></translation>
<translation id="7301470816294041580">तपाईं “Ok Google, यो कुन गीत हो?” वा “Ok Google, मेरो स्क्रिनमा के छ?” भनेर सोध्न सक्नुहुन्छ।</translation>
<translation id="730289542559375723">{NUM_APPLICATIONS,plural, =1{यो एपले Chrome लाई राम्ररी काम गर्नबाट रोक्न सक्छ।}other{यी अनुप्रयोगले Chrome लाई राम्ररी काम गर्नबाट रोक्न सक्छन्‌।}}</translation>
-<translation id="7303281435234579599">हत्तेरिका! डेमो मोड सेटअप गर्ने क्रममा केही चिज गडबड भयो।</translation>
+<translation id="7303281435234579599">हत्तेरिका! डेमो मोड सेटअप गर्ने क्रममा कुनै समस्या आयो।</translation>
<translation id="7303900363563182677">यो साइटलाई क्लिपबोर्डमा प्रतिलिपि गरिएका पाठ र फोटो हेर्न रोक लगाइएको छ</translation>
<translation id="7304030187361489308">उच्च</translation>
<translation id="7305123176580523628">USB प्रिन्टर जोडियो</translation>
@@ -7151,7 +7151,7 @@
<translation id="7464153996453281700">यो कम्पोनेन्ट अपडेट नै छ</translation>
<translation id="7464637891177137294">यो पासवर्ड आफ्नो Google खाता <ph name="ACCOUNT" /> मा सेभ गर्नुहोस्</translation>
<translation id="7465522323587461835">{NUM_OPEN_TABS,plural, =1{# खुला ट्याब, ट्याब स्ट्रिप टगल गर्न थिच्नुहोस्}other{# खुला ट्याबहरू, ट्याब स्ट्रिप टगल गर्न थिच्नुहोस्}}</translation>
-<translation id="7465635034594602553">केही चिज गडबड भयो। कृपया केही बेर प्रतीक्षा गरी <ph name="APP_NAME" /> फेरि चलाउनुहोस्।</translation>
+<translation id="7465635034594602553">कुनै समस्या आयो। कृपया केही बेर प्रतीक्षा गरी <ph name="APP_NAME" /> फेरि चलाउनुहोस्।</translation>
<translation id="7465778193084373987">नेटस्केप प्रमाणपत्र रिभोकेसन युआरएल</translation>
<translation id="7466431077154602932">कम्प्याक्ट भ्यू</translation>
<translation id="7466556884531675354">कुनै पनि नोट सेभ गरिएको छैन</translation>
@@ -7627,7 +7627,7 @@
<translation id="7887334752153342268">नक्कल बनाउनुहोस्</translation>
<translation id="7887864092952184874">ब्लुटुथ माउस जोडा मिलाइएको</translation>
<translation id="7889371445710865055">स्पिच-टु-टेक्स्ट सुविधाको भाषा बदल्नुहोस्</translation>
-<translation id="7890147169288018054">आफ्नो IP वा MAC एड्रेस जस्ता नेटवर्कसम्बन्धी जानकारी हेर्नुहोस्</translation>
+<translation id="7890147169288018054">आफ्नो IP वा म्याक एड्रेस जस्ता नेटवर्कसम्बन्धी जानकारी हेर्नुहोस्</translation>
<translation id="7892384782944609022">कनेक्ट गर्न सकिएन। फेरि प्रयास गर्न डिभाइस चयन गर्नुहोस्।</translation>
<translation id="7893008570150657497">तपाइँको कम्प्युटरबाट तस्बिरहरू, सङ्गीत, र हन्य मिडिया पहुँच गर्नुहोस्</translation>
<translation id="7893153962594818789">यस <ph name="DEVICE_TYPE" /> मा ब्लुटुथ निष्क्रिय छ। आफ्नो पासवर्ड प्रविष्टि गर्नुहोस् र ब्लुटुथ अन गर्नुहोस्।</translation>
@@ -8203,7 +8203,7 @@
<translation id="8392726714909453725">सेलेक्ट टु स्पिकसम्बन्धी सेटिङ</translation>
<translation id="8393511274964623038">प्लगइनलाई रोक्नुहोस्</translation>
<translation id="839363317075970734">ब्लुटुथ डिभाइससम्बन्धी विवरण</translation>
-<translation id="8393700583063109961">सन्देश पठाउनुहोस्</translation>
+<translation id="8393700583063109961">म्यासेज पठाउनुहोस्</translation>
<translation id="8394212467245680403">अक्षराङ्कीय</translation>
<translation id="8397825320644530257">कनेक्ट गरिएको फोन डिस्कनेक्ट गर्नुहोस्</translation>
<translation id="8398877366907290961">जे भए पनि अघि बढ्नुहोस्</translation>
@@ -8334,7 +8334,7 @@
<translation id="8528962588711550376">साइन इन गर्दै।</translation>
<translation id="8529925957403338845">तात्कालिक टेदरिङको जडान असफल भयो</translation>
<translation id="8531701051932785007">परिष्कृत Safe Browsing अफ छ</translation>
-<translation id="8534656636775144800">हत्तेरिका! डोमेनमा सामेल हुने प्रयास गर्दा केही चिज गडबड भयो। कृपया फेरि प्रयास गर्नुहोस्।</translation>
+<translation id="8534656636775144800">हत्तेरिका! डोमेनमा सामेल हुने प्रयास गर्दा कुनै समस्या आयो। कृपया फेरि प्रयास गर्नुहोस्।</translation>
<translation id="8535005006684281994">नेटस्केप प्रमाणपत्र नविकरण URL</translation>
<translation id="8536713137312218707">द्रुत कमान्डहरू</translation>
<translation id="8536956381488731905">कुञ्जी थिच्दा आवाज आउने पारियोस्</translation>
@@ -8866,7 +8866,7 @@
<translation id="9009708085379296446">तपाईंले यो पृष्ठ परिवर्तन गर्न खोज्नुभएको हो?</translation>
<translation id="9011163749350026987">सधैँ आइकन देखाउनुहोस्</translation>
<translation id="9011262023858991985">यो ट्याब कास्ट गरिँदै छ</translation>
-<translation id="9011393886518328654">विमोचन टिप्पणी</translation>
+<translation id="9011393886518328654">रिलिज नोटहरू</translation>
<translation id="9012122671773859802">माउसको कर्सर सरेसँगै स्क्रिन पनि निरन्तर सारियोस्</translation>
<translation id="9013037634206938463">Linux प्रयोग गर्न कम्तीमा पनि <ph name="INSTALL_SIZE" /> खाली ठाउँ आवश्यक पर्छ। थप ठाउँ खाली गर्न आफ्नो यन्त्रमा भएका फाइलहरू मेटाउनुहोस्।</translation>
<translation id="9014206344398081366">ChromeVox को ट्युटोरियल</translation>
@@ -9016,7 +9016,7 @@
<translation id="9128870381267983090">नेटवर्कमा कनेक्ट गर्नुहोस्</translation>
<translation id="9130015405878219958">अवैध मोड प्रविष्ट गरियो।</translation>
<translation id="9131209053278896908">ब्लक गरिएका साइटहरू यहाँ देखिन्छन्</translation>
-<translation id="9131487537093447019">ब्लूटुथ यन्त्रहरूबाट सन्देश पठाउनुहोस् र प्राप्त गर्नुहोस्।</translation>
+<translation id="9131487537093447019">ब्लूटुथ यन्त्रहरूबाट म्यासेज पठाउनुहोस् र प्राप्त गर्नुहोस्।</translation>
<translation id="913383674572270194">{NUM_BOOKMARKS,plural, =1{एउटा बुकमार्क}other{# वटा बुकमार्क}}</translation>
<translation id="9134066738478820307">साइटहरू संरक्षित सामग्री प्ले गर्न आइडेन्टिफायर प्रयोग गर्न सक्छन्</translation>
<translation id="913411432238655354">डिभाइस अन गर्दा एपहरू रिस्टोर गरिऊन्</translation>
@@ -9083,7 +9083,7 @@
<translation id="9201023452444595544">सबै अफलाइन डेटा हटाइने छ</translation>
<translation id="9201117361710210082">यसअघि हेरिएको</translation>
<translation id="9201220332032049474">स्क्रिन लकका विकल्पहरू</translation>
-<translation id="9201842707396338580">केही चिज गडबड भयो। कृपया आफ्नो डिभाइसका मालिक वा एड्मिनसँग सम्पर्क गर्नुहोस्। त्रुटिको कोड: <ph name="ERROR_CODE" />।</translation>
+<translation id="9201842707396338580">कुनै समस्या आयो। कृपया आफ्नो डिभाइसका मालिक वा एड्मिनसँग सम्पर्क गर्नुहोस्। त्रुटिको कोड: <ph name="ERROR_CODE" />।</translation>
<translation id="9203398526606335860">&amp;प्रोफाइलिङ सक्षम भयो</translation>
<translation id="9203904171912129171">कुनै यन्त्र चयन गर्नुहोस्</translation>
<translation id="920410963177453528">अर्को प्यानल छनौट गर्न ड्रप डाउन मेनुमा क्लिक गर्नुहोस्</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_nl.xtb b/chromium/chrome/app/resources/generated_resources_nl.xtb
index 0ed01ecbaf8..d273c5b5fd4 100644
--- a/chromium/chrome/app/resources/generated_resources_nl.xtb
+++ b/chromium/chrome/app/resources/generated_resources_nl.xtb
@@ -532,7 +532,7 @@ Rechten die je al hebt gegeven aan apps, kunnen van toepassing zijn op dit accou
<translation id="1472675084647422956">Meer bekijken</translation>
<translation id="1473223074251193484">Tethering-configuratie instellen</translation>
<translation id="1474785664565228650">Parallels Desktop moet worden herstart om de microfooninstelling te wijzigen. Herstart Parallels Desktop om door te gaan.</translation>
-<translation id="1474893630593443211">Meer controle over de advertenties die je te zien krijgt</translation>
+<translation id="1474893630593443211">Meer controle over de advertenties die je ziet</translation>
<translation id="1475502736924165259">Je hebt certificaten die niet in een van de andere categorieën vallen</translation>
<translation id="1476088332184200792">Kopiëren naar je apparaat</translation>
<translation id="1476607407192946488">&amp;Taalinstellingen</translation>
@@ -1196,7 +1196,7 @@ Je kunt de instellingen van dit account beheren door de Family Link-app op je ap
<translation id="2048554637254265991">Fout bij starten van containerbeheer. Probeer het opnieuw.</translation>
<translation id="2048653237708779538">Actie niet beschikbaar</translation>
<translation id="204914487372604757">Snelle link maken</translation>
-<translation id="2050339315714019657">Staand</translation>
+<translation id="2050339315714019657">Portret</translation>
<translation id="2051555741181591333">Hotspot automatisch uitzetten</translation>
<translation id="2052572566310583903">Geïnstalleerd op je andere apparaten</translation>
<translation id="2053105195397337973">We testen nieuwe manieren om tracking te beperken en tegelijkertijd te zorgen dat sites advertentiespam en fraude kunnen bestrijden.</translation>
@@ -1307,7 +1307,7 @@ https://www.chromium.org/chromium-os/how-tos-and-troubleshooting/debugging-featu
<translation id="2136476978468204130">De opgegeven wachtwoordzin is onjuist</translation>
<translation id="2137128126782078222">Meldingen van <ph name="WEBSITE" /> niet toestaan</translation>
<translation id="2139919072249842737">Knop Instellen</translation>
-<translation id="2140788884185208305">Batterijprestaties</translation>
+<translation id="2140788884185208305">Batterijconditie</translation>
<translation id="2140902257485550046">Selecteer dit om alle extensies op deze site te blokkeren</translation>
<translation id="2142328300403846845">Link openen als</translation>
<translation id="2142582065325732898">Zet <ph name="LINK1_BEGIN" />Chrome-synchronisatie<ph name="LINK1_END" /> aan om recente Chrome-tabbladen te bekijken. <ph name="LINK2_BEGIN" />Meer informatie<ph name="LINK2_END" /></translation>
@@ -2134,7 +2134,7 @@ Als je later besluit dat je niet wilt dat je kind Voice Match gebruikt, verwijde
<translation id="2844169650293029770">USB-C-apparaat (poort links aan de voorkant)</translation>
<translation id="2844809857160214557">Afdruktaken bekijken en beheren</translation>
<translation id="2845382757467349449">Bookmarkbalk altijd tonen</translation>
-<translation id="2845751331501453107">Of een advertentie wordt gepersonaliseerd terwijl je browset, is afhankelijk van deze instelling, <ph name="BEGIN_LINK1" />door sites voorgestelde advertenties<ph name="LINK_END1" />, je <ph name="BEGIN_LINK2" />cookie-instellingen<ph name="LINK_END2" /> en of de site die je bekijkt advertenties personaliseert</translation>
+<translation id="2845751331501453107">Of een advertentie wordt gepersonaliseerd terwijl je browst, is afhankelijk van deze instelling, <ph name="BEGIN_LINK1" />door sites voorgestelde advertenties<ph name="LINK_END1" />, je <ph name="BEGIN_LINK2" />cookie-instellingen<ph name="LINK_END2" /> en of de site die je bekijkt advertenties personaliseert</translation>
<translation id="284581348330507117">Maak unieke wachtwoorden</translation>
<translation id="284805635805850872">Schadelijke software verwijderen?</translation>
<translation id="2849035674501872372">Omhoog kijken</translation>
@@ -3604,7 +3604,7 @@ Je kunt instellingen beheren via het kaartmenu of meer opties bekijken in het ge
<translation id="4186749321808907788"><ph name="QUERY_NAME" /> - <ph name="DEFAULT_SEARCH_ENGINE_NAME" /> zoeken</translation>
<translation id="4187424053537113647"><ph name="APP_NAME" /> instellen…</translation>
<translation id="4190828427319282529">Toetsenbordfocus uitlichten</translation>
-<translation id="4193575319002689239">Kaarten bekijken</translation>
+<translation id="4193575319002689239">Kaarten tonen</translation>
<translation id="4193836101014293726">Kan dit profiel niet verwijderen</translation>
<translation id="419427585139779713">Eén lettergreep per keer invoeren</translation>
<translation id="4194570336751258953">Tikken-om-te-klikken aanzetten</translation>
@@ -3786,7 +3786,7 @@ Je kunt instellingen beheren via het kaartmenu of meer opties bekijken in het ge
<translation id="4366138410738374926">Afdrukken gestart</translation>
<translation id="4367513928820380646">Verwijderde rechten bekijken</translation>
<translation id="4369215744064167350">Websiteverzoek goedgekeurd</translation>
-<translation id="4369735607080757018">Er worden beperkte typen gegevens gedeeld tussen sites om de prestaties van hun advertenties te meten (bijvoorbeeld het tijdstip waarop je een advertentie te zien kreeg)</translation>
+<translation id="4369735607080757018">Er worden beperkte typen gegevens gedeeld tussen sites om de prestaties van hun advertenties te meten (bijvoorbeeld het tijdstip waarop je een advertentie werd getoond)</translation>
<translation id="4370975561335139969">Het opgegeven e-mailadres en wachtwoord komen niet overeen</translation>
<translation id="4374805630006466253">Een andere telefoon of tablet gebruiken</translation>
<translation id="4374831787438678295">Linux-installatieprogramma</translation>
@@ -4579,7 +4579,7 @@ Gebruik Ctrl + Alt + Helderheid omlaag om uit te zoomen.</translation>
<translation id="5094721898978802975">Communiceren met samenwerkende legitieme apps</translation>
<translation id="5097002363526479830">Kan geen verbinding maken met het netwerk '<ph name="NAME" />': <ph name="DETAILS" /></translation>
<translation id="5097306410549350357">Meer informatie over het gebruik van locatie</translation>
-<translation id="5097349930204431044">Sites die je bezoekt, kunnen vaststellen wat je leuk vindt en daarna advertenties voorstellen terwijl je verder browset</translation>
+<translation id="5097349930204431044">Sites die je bezoekt, kunnen vaststellen wat je leuk vindt en daarna advertenties voorstellen terwijl je verder browst</translation>
<translation id="5097649414558628673">Tool: <ph name="PRINT_NAME" /></translation>
<translation id="5097874180538493929">Automatisch klikken als de cursor stopt</translation>
<translation id="5101839224773798795">Automatisch klikken wanneer de muisaanwijzer stopt</translation>
@@ -5134,7 +5134,7 @@ Je kunt meerdere schakelaars toewijzen aan deze actie.</translation>
<translation id="5612734644261457353">Je wachtwoord kan nog steeds niet worden geverifieerd. Opmerking: als je je wachtwoord onlangs hebt gewijzigd, wordt je nieuwe wachtwoord doorgevoerd zodra je uitlogt. Gebruik hier het oude wachtwoord.</translation>
<translation id="5614190747811328134">Gebruikerskennisgeving</translation>
<translation id="5614553682702429503">Wachtwoord opslaan?</translation>
-<translation id="561552177910095306">Lijst met recent bezochte sites die advertenties op andere sites mogen voorstellen terwijl je browset</translation>
+<translation id="561552177910095306">Lijst met recent bezochte sites die advertenties op andere sites mogen voorstellen terwijl je browst</translation>
<translation id="5616571005307953937">Oudste</translation>
<translation id="5616726534702877126">Schijfgrootte reserveren</translation>
<translation id="561698261642843490">Firefox sluiten</translation>
@@ -6798,7 +6798,7 @@ Je kunt instellingen beheren via het kaartmenu of meer opties bekijken in het ge
<translation id="7123302939607518173">Voeg een interesse of site toe als je denkt dat advertenties gerelateerd aan dit item nuttig zouden zijn voor jou.</translation>
<translation id="7124013154139278147">Schakelaar toewijzen voor Vorige</translation>
<translation id="7124712201233930202">Er wordt niet voldaan aan het beleid van je organisatie</translation>
-<translation id="7125029162161377569">Met een Privacy Sandbox-proef kunnen sites dezelfde browsefunctionaliteit leveren terwijl er minder van je gegevens worden gebruikt. Dit betekent meer privacy voor jou en minder tracking op meerdere sites. Als andere proeven klaar zijn om te worden getest, voegen we deze toe.</translation>
+<translation id="7125029162161377569">Met een Privacy Sandbox-proef kunnen sites dezelfde browsefunctionaliteit leveren terwijl er minder van je gegevens worden gebruikt. Dit betekent meer privacy voor jou en minder tracking tussen sites. Als andere proeven klaar zijn om te worden getest, voegen we deze toe.</translation>
<translation id="7125148293026877011">Crostini verwijderen</translation>
<translation id="7127980134843952133">Downloadgeschiedenis</translation>
<translation id="7128151990937044829">Een indicator bekijken in de adresbalk als meldingen worden geblokkeerd</translation>
@@ -7327,7 +7327,7 @@ Je kunt instellingen beheren via het kaartmenu of meer opties bekijken in het ge
<translation id="7634280112532283638">Spam- en fraudebeperking</translation>
<translation id="7634566076839829401">Er is iets misgegaan. Probeer het opnieuw.</translation>
<translation id="7635048370253485243">Vastgezet door je beheerder</translation>
-<translation id="7635711411613274199">Of een advertentie wordt gepersonaliseerd terwijl je browset, is afhankelijk van deze instelling, <ph name="BEGIN_LINK1" />advertentieonderwerpen<ph name="LINK_END1" />, je <ph name="BEGIN_LINK2" />cookie-instellingen<ph name="LINK_END2" /> en of de site die je bekijkt advertenties personaliseert</translation>
+<translation id="7635711411613274199">Of een advertentie wordt gepersonaliseerd terwijl je browst, is afhankelijk van deze instelling, <ph name="BEGIN_LINK1" />advertentieonderwerpen<ph name="LINK_END1" />, je <ph name="BEGIN_LINK2" />cookie-instellingen<ph name="LINK_END2" /> en of de site die je bekijkt advertenties personaliseert</translation>
<translation id="7636919061354591437">Installeren op dit apparaat</translation>
<translation id="7637253234491814483">Raak de vingerafdruksensor rechtsboven op je toetsenbord aan, naast de aan/uit-knop. Je vingerafdrukgegevens worden beveiligd opgeslagen en blijven uitsluitend op je <ph name="DEVICE_TYPE" /> staan.</translation>
<translation id="7637272932128132922">Terwijl dit tabblad inactief was, heeft Geheugenbesparing geheugen vrijgemaakt voor andere taken. Je kunt dit altijd wijzigen via <ph name="SETTINGS_LINK" />.</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_no.xtb b/chromium/chrome/app/resources/generated_resources_no.xtb
index 03fe5e91d7a..8475b00f52c 100644
--- a/chromium/chrome/app/resources/generated_resources_no.xtb
+++ b/chromium/chrome/app/resources/generated_resources_no.xtb
@@ -366,7 +366,7 @@ Du kan når som helst sjekke passordene dine i <ph name="GOOGLE_PASSWORD_MANAGER
<translation id="1324106254079708331">Verner de personlige Google-kontoene til personer som er utsatt for målrettede angrep</translation>
<translation id="1327272175893960498">Kerberos-saker</translation>
<translation id="1327495825214193325">For å slå på ADB-feilsøking må denne <ph name="DEVICE_TYPE" />-enheten startes på nytt. Den må tilbakestilles til fabrikkstandard hvis du vil slå ADB-feilsøking av igjen.</translation>
-<translation id="1327527584824210101">Bruk tilgangsnøkkelen din</translation>
+<translation id="1327527584824210101">Bruk passnøkkelen din</translation>
<translation id="1327794256477341646">Funksjoner som krever posisjonen din, kommer ikke til å virke</translation>
<translation id="1329466763986822896">Styrk personvernet for denne wifi-sonen</translation>
<translation id="1331977651797684645">Dette var meg.</translation>
@@ -3645,7 +3645,7 @@ Du kan administrere innstillingene for denne kontoen ved å installere Family Li
<translation id="4217571870635786043">Diktering</translation>
<translation id="4218081191298393750">Klikk på høyttalerikonet for å kutte lyden for denne fanen</translation>
<translation id="4220648711404560261">Det oppsto en feil under aktiveringen.</translation>
-<translation id="4223845867739585293">Opprett en tilgangsnøkkel</translation>
+<translation id="4223845867739585293">Lag en passnøkkel</translation>
<translation id="4225397296022057997">På alle nettsteder</translation>
<translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{Denne utvidelsen er ikke tillatt}other{Noen utvidelser er ikke tillatt}}</translation>
<translation id="4231095370974836764">Installer apper og spill fra Google Play på <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation>
@@ -5555,7 +5555,7 @@ Bruk Ctrl + Alt + lysstyrke ned for å zoome ut.</translation>
<translation id="5984222099446776634">Nylig besøkte</translation>
<translation id="5985458664595100876">Ugyldig nettadresseformat. Støttede formater er \\tjener\delt og smb://tjener/delt.</translation>
<translation id="598810097218913399">Fjern tilordningen</translation>
-<translation id="5990266201903445068">Bare Wifi</translation>
+<translation id="5990266201903445068">Bare wifi</translation>
<translation id="5990386583461751448">Oversatt</translation>
<translation id="599131315899248751">{NUM_APPLICATIONS,plural, =1{For å sikre at du fortsatt kan surfe på nettet, be administratoren din om å fjerne dette programmet.}other{For å sikre at du fortsatt kan surfe på nettet, be administratoren din om å fjerne disse programmene.}}</translation>
<translation id="5993508466487156420">{NUM_SITES,plural, =1{Gjennomgangen er fullført for 1 nettsted}other{Gjennomgangen er fullført for {NUM_SITES} nettsteder}}</translation>
@@ -6798,7 +6798,7 @@ Du har # passord til som er utsatt for sikkerhetsbrudd. Google Passordlagring an
<translation id="7113102733263608554"><ph name="ITEM_COUNT_ONE" /> vare</translation>
<translation id="7113502843173351041">se e-postadressen din</translation>
<translation id="7113974454301513811">Legg til den aktive fanen på listen din</translation>
-<translation id="7114054701490058191">Passordene samsvarer ikke</translation>
+<translation id="7114054701490058191">Passordene er ikke like</translation>
<translation id="7114648273807173152">For å bruke Smart Lock til å logge på Google-kontoen din, gå til Innstillinger &gt; Tilkoblede enheter &gt; Telefonen din &gt; Smart Lock.</translation>
<translation id="7115361495406486998">Ingen kontakter kan nås</translation>
<translation id="7117228822971127758">Prøv på nytt senere</translation>
@@ -8812,7 +8812,7 @@ Jeg tror ikke det er nødvendig å blokkere dette nettstedet.</translation>
<translation id="8951256747718668828">Kunne ikke fullføre gjenopprettingen på grunn av en feil</translation>
<translation id="8951465597020890363">Vil du avslutte gjestemodus likevel?</translation>
<translation id="8952831374766033534">Konfigurasjonsalternativet støttes ikke: <ph name="ERROR_LINE" /></translation>
-<translation id="8953476467359856141">Når enheten lades</translation>
+<translation id="8953476467359856141">Når enheten lader</translation>
<translation id="895347679606913382">Starter...</translation>
<translation id="8957757410289731985">Tilpass profil</translation>
<translation id="895944840846194039">JavaScript-minne</translation>
@@ -9080,7 +9080,7 @@ Jeg tror ikke det er nødvendig å blokkere dette nettstedet.</translation>
<translation id="9180281769944411366">Denne prosessen kan ta noen minutter. Starter Linux-beholderen.</translation>
<translation id="9180380851667544951">Nettstedet kan dele skjermen din</translation>
<translation id="9182556968660520230">Ikke la nettsteder spille av beskyttet innhold</translation>
-<translation id="9183331776983279456">Chrome sletter automatisk nettsteder som er eldre enn fire uker. Et nettsted som du besøker på nytt, kan havne på listen igjen. Du kan også blokkere et nettsted fra å foreslå annonser for deg.</translation>
+<translation id="9183331776983279456">Chrome sletter automatisk nettsteder som er eldre enn 4 uker. Hvis du besøker et nettsted på nytt, kan det havne på listen igjen. Du kan også blokkere et nettsted fra å foreslå annonser for deg.</translation>
<translation id="918352324374649435">{COUNT,plural, =1{App}other{# apper}}</translation>
<translation id="9186963452600581158">Logg på med Google-kontoen til et barn</translation>
<translation id="9187967020623675250">Tastene stemmer ikke overens. Trykk på en tast for å <ph name="RESPONSE" />.</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_or.xtb b/chromium/chrome/app/resources/generated_resources_or.xtb
index 12044b57494..91eb2ccf2bf 100644
--- a/chromium/chrome/app/resources/generated_resources_or.xtb
+++ b/chromium/chrome/app/resources/generated_resources_or.xtb
@@ -4812,7 +4812,7 @@
<translation id="5315738755890845852">ଅତିରିକ୍ତ କୁଟିଳ ବନ୍ଧନୀ: <ph name="ERROR_LINE" /></translation>
<translation id="5317780077021120954">ସଞ୍ଚୟ</translation>
<translation id="5319359161174645648">Google Chromeକୁ ସୁପାରିଶ କରୁଛି</translation>
-<translation id="5319712128756744240">ନୂଆ ଡିଭାଇସକୁ ପେୟାର୍ କରନ୍ତୁ</translation>
+<translation id="5319712128756744240">ନୂଆ ଡିଭାଇସକୁ ପେୟାର କରନ୍ତୁ</translation>
<translation id="5320135788267874712">ନୂଆ ଡିଭାଇସର ନାମ</translation>
<translation id="532247166573571973">ସର୍ଭର୍ ହୁଏତ ପହଞ୍ଚଯୋଗ୍ୟ ନୁହେଁ। ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation>
<translation id="5324300749339591280">ଆପଗୁଡ଼ିକର ତାଲିକା</translation>
@@ -9069,7 +9069,7 @@ Voice Match ଆପଣଙ୍କ Assistantକୁ ଆପଣଙ୍କୁ ଚିହ
<translation id="9180281769944411366">ଏହି ପ୍ରକ୍ରିୟା ପାଇଁ କିଛି ସମୟ ଲାଗିପାରେ। Linux କଣ୍ଟେନର୍ ଆରମ୍ଭ ହେଉଛି।</translation>
<translation id="9180380851667544951">ସାଇଟ୍ ଆପଣଙ୍କର ସ୍କ୍ରିନ୍‍କୁ ସେୟାର୍ କରିପାରିବ</translation>
<translation id="9182556968660520230">ସୁରକ୍ଷିତ ବିଷୟବସ୍ତୁକୁ ଚଲାଇବା ପାଇଁ ସାଇଟଗୁଡ଼ିକୁ ଅନୁମତି ଦିଅନ୍ତୁ ନାହିଁ</translation>
-<translation id="9183331776983279456">4 ସପ୍ତାହରୁ ଅଧିକ ପୁରୁଣା ସାଇଟଗୁଡ଼ିକୁ Chrome ଅଟୋ-ଡିଲିଟ କରେ। ଆପଣ ଭିଜିଟ କରୁଥିବା ଏକ ସାଇଟ ତାଲିକାରେ ପୁଣି ଦେଖାଯାଇପାରେ କିମ୍ବା ଆପଣ ଆପଣଙ୍କ ପାଇଁ ବିଜ୍ଞାପନ ପରାମର୍ଶ ଦେବାରୁ ଏକ ସାଇଟକୁ ବ୍ଲକ କରିପାରିବେ।</translation>
+<translation id="9183331776983279456">4 ସପ୍ତାହରୁ ଅଧିକ ପୁରୁଣା ସାଇଟଗୁଡ଼ିକୁ Chrome ଅଟୋ-ଡିଲିଟ କରେ। ଆପଣ ପୁଣି ଭିଜିଟ କରୁଥିବା ଏକ ସାଇଟ ତାଲିକାରେ ପୁନର୍ବାର ଦେଖାଯାଇପାରେ। କିମ୍ବା ଆପଣ ଆପଣଙ୍କ ପାଇଁ ବିଜ୍ଞାପନ ପରାମର୍ଶ ଦେବାରୁ ଏକ ସାଇଟକୁ ବ୍ଲକ କରିପାରିବେ।</translation>
<translation id="918352324374649435">{COUNT,plural, =1{ଆପ୍}other{#ଟି ଆପ୍}}</translation>
<translation id="9186963452600581158">ଗୋଟିଏ ପିଲାର Google ଆକାଉଣ୍ଟ ସହିତ ସାଇନ୍ ଇନ୍ କରନ୍ତୁ</translation>
<translation id="9187967020623675250">କୀଗୁଡ଼ିକ ମେଳ ହେଉନାହିଁ। <ph name="RESPONSE" /> ପାଇଁ ଯେ କୌଣସି କୀକୁ ଦବାନ୍ତୁ।</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_pl.xtb b/chromium/chrome/app/resources/generated_resources_pl.xtb
index baef04be955..0d4e8752b0f 100644
--- a/chromium/chrome/app/resources/generated_resources_pl.xtb
+++ b/chromium/chrome/app/resources/generated_resources_pl.xtb
@@ -69,7 +69,7 @@
<translation id="1059944192885972544">Znaleziono karty (<ph name="NUM" />) dla zapytania „<ph name="SEARCH_TEXT" />”</translation>
<translation id="1060292118287751956">Określa częstotliwość aktualizacji ekranu</translation>
<translation id="1060570945511946595">Zarządzaj biletami</translation>
-<translation id="1061130374843955397"><ph name="DEVICE_TYPE" /> – witamy!</translation>
+<translation id="1061130374843955397"><ph name="DEVICE_TYPE" /> Cię wita!</translation>
<translation id="1061373870045429865">Utwórz kod QR powiązany z tym linkiem</translation>
<translation id="1061904396131502319">Wielkimi krokami nadchodzi przerwa</translation>
<translation id="1062628064301375934">Pomóż nam zadbać o większą prywatność w sieci</translation>
@@ -684,7 +684,7 @@ Na tym koncie mogą obowiązywać uprawnienia przyznane wcześniej aplikacjom. U
<translation id="1603914832182249871">(Incognito)</translation>
<translation id="1604432177629086300">Nie udało się wydrukować. Sprawdź drukarkę i spróbuj jeszcze raz.</translation>
<translation id="1604774728851271529">Aby zaktualizować Linuksa, musisz mieć połączenie sieciowe. Połącz się z internetem i spróbuj ponownie.</translation>
-<translation id="1605744057217831567">Zobacz wszystkie dane witryn i uprawnienia</translation>
+<translation id="1605744057217831567">Zobacz wszystkie dane witryn i ich uprawnienia</translation>
<translation id="1606077700029460857">Zmień ustawienia myszy</translation>
<translation id="1606566847233779212">Usunąć wybrane witryny?</translation>
<translation id="1607139524282324606">Wyczyść wpis</translation>
@@ -1089,7 +1089,7 @@ Na tym koncie mogą obowiązywać uprawnienia przyznane wcześniej aplikacjom. U
<translation id="1941995177877935582">Pokaż mapowanie klawiszy</translation>
<translation id="1942128823046546853">Odczytywanie i zmienianie wszystkich Twoich danych we wszystkich witrynach</translation>
<translation id="1944528062465413897">Kod parowania Bluetooth:</translation>
-<translation id="1944535645109964458">Brak dostępnych kluczy</translation>
+<translation id="1944535645109964458">Brak dostępnych kluczy dostępu</translation>
<translation id="1944921356641260203">Znaleziono aktualizację</translation>
<translation id="1947136734041527201">Umożliwia logowanie się w witrynach za pomocą Twojego konta u dostawcy tożsamości.</translation>
<translation id="1949584741547056205">Szybkie odpowiedzi</translation>
@@ -1194,7 +1194,7 @@ Możesz zarządzać ustawieniami konta, korzystając z aplikacji Family Link na
<translation id="2048554637254265991">Błąd uruchamiania menedżera kontenerów. Spróbuj ponownie.</translation>
<translation id="2048653237708779538">Czynność niedostępna</translation>
<translation id="204914487372604757">Utwórz skrót</translation>
-<translation id="2050339315714019657">Pionowo</translation>
+<translation id="2050339315714019657">Portret</translation>
<translation id="2051555741181591333">Automatyczne wyłączanie hotspota</translation>
<translation id="2052572566310583903">Zainstalowano na innych urządzeniach</translation>
<translation id="2053105195397337973">Pracujemy nad tym, jak ograniczyć śledzenie w witrynach, a jednocześnie umożliwić im zapobieganie oszustwom i spamowi reklamowemu.</translation>
@@ -1778,7 +1778,7 @@ Możesz zarządzać ustawieniami konta, korzystając z aplikacji Family Link na
<translation id="2541706104884128042">Ustawiono nową porę snu</translation>
<translation id="2542050502251273923">Korzysta z ff_debug do ustawiania poziomu debugowania menedżera połączenia sieciowego i innych usług.</translation>
<translation id="2544352060595557290">Ta karta</translation>
-<translation id="2546283357679194313">Pliki cookie i dane stron</translation>
+<translation id="2546283357679194313">Pliki cookie i dane witryn</translation>
<translation id="2546302722632337735">Nie zezwalaj stronom na używanie identyfikatorów do odtwarzania treści chronionych</translation>
<translation id="2546991196809436099">Powiększa elementy na ekranie. Aby włączyć lub wyłączyć lupę, użyj klawisza wyszukiwania + Ctrl + M.</translation>
<translation id="2548347166720081527">Przyznano uprawnienie: <ph name="PERMISSION" /></translation>
@@ -1797,7 +1797,7 @@ Możesz zarządzać ustawieniami konta, korzystając z aplikacji Family Link na
<translation id="2559889124253841528">Zapisz na urządzeniu</translation>
<translation id="2564520396658920462">Wykonywanie kodu JavaScript przy użyciu AppleScript jest wyłączone. Aby włączyć tę funkcję, na pasku menu kliknij Widok &gt; Deweloper &gt; Zezwól na kod JavaScript z Apple Events. Więcej informacji: https://support.google.com/chrome/?p=applescript</translation>
<translation id="2564653188463346023">Ulepszone sprawdzanie pisowni</translation>
-<translation id="2568694057933302218">W trybie incognito witryny nie mogą używać plików cookie do śledzenia Twojej aktywności związanej z przeglądaniem w różnych witrynach. Twoja aktywność związana z przeglądaniem nie służy do personalizowania reklam. W niektórych witrynach mogą nie działać funkcje.</translation>
+<translation id="2568694057933302218">W trybie incognito witryny nie mogą używać plików cookie do śledzenia Twojej aktywności związanej z przeglądaniem w różnych witrynach. Twoja aktywność związana z przeglądaniem nie służy do personalizowania reklam. Funkcje w niektórych witrynach mogą nie działać.</translation>
<translation id="2568774940984945469">Kontener paska informacji</translation>
<translation id="2569972178052279830">Nazwa sprzedawcy</translation>
<translation id="257088987046510401">Motywy</translation>
@@ -1996,7 +1996,7 @@ Możesz zarządzać ustawieniami konta, korzystając z aplikacji Family Link na
<translation id="274029851662193272">Obniżony</translation>
<translation id="2740363334137520315">Dodaj nową sekcję w opcji „Wyszukaj karty”, żeby móc łatwo znaleźć karty związane z odtwarzaniem plików audio lub filmów. Aby otworzyć tę opcję, użyj przycisku znajdującego się w górnym rogu przeglądarki.</translation>
<translation id="2740531572673183784">OK</translation>
-<translation id="2740876196999178364">Te klucze są zapisywane tylko na tym urządzeniu. Nie są one zapisywane na Twoim koncie Google.</translation>
+<translation id="2740876196999178364">Te klucze dostępu są zapisywane tylko na tym urządzeniu. Nie są one zapisywane na Twoim koncie Google.</translation>
<translation id="2741713322780029189">Otwórz terminal odzyskiwania</translation>
<translation id="2741912629735277980">Wyświetlanie UI na ekranie logowania</translation>
<translation id="2742448780373473567">Instalacja systemu operacyjnego <ph name="DEVICE_OS" /> spowoduje zastąpienie wszystkich danych na urządzeniu.</translation>
@@ -2073,7 +2073,7 @@ Możesz zarządzać ustawieniami konta, korzystając z aplikacji Family Link na
<translation id="2801954693771979815">Rozmiar elementów na ekranie</translation>
<translation id="2802557211515765772">Nie ma zarządzanych drukarek.</translation>
<translation id="2803313416453193357">Otwórz folder</translation>
-<translation id="2803719750464280163">Potwierdź, że <ph name="PASSKEY" /> jest kluczem wyświetlanym na urządzeniu Bluetooth <ph name="DEVICE" />.</translation>
+<translation id="2803719750464280163">Potwierdź, że <ph name="PASSKEY" /> jest kluczem dostępu wyświetlanym na urządzeniu Bluetooth <ph name="DEVICE" />.</translation>
<translation id="2804043232879091219">Nie udało się otworzyć alternatywnej przeglądarki</translation>
<translation id="2804667941345577550">Wylogujemy Cię z tej strony, także na otwartych kartach</translation>
<translation id="2804680522274557040">Kamera wyłączona</translation>
@@ -2466,7 +2466,7 @@ Domena <ph name="DOMAIN" /> wymaga, by karta inteligentna pozostała w gnieźdz
<translation id="3160928651883997588">Ustawienia VPN</translation>
<translation id="3161522574479303604">Wszystkie języki</translation>
<translation id="3162853326462195145">Konto szkolne</translation>
-<translation id="3162899666601560689">Strony mogą używać plików cookie dla Twojej wygody, by na przykład zapamiętać Twoje logowanie lub zawartość koszyka</translation>
+<translation id="3162899666601560689">Witryny mogą używać plików cookie dla Twojej wygody, by na przykład zapamiętać Twoje logowanie lub zawartość koszyka</translation>
<translation id="3163201441334626963">Nieznany produkt <ph name="PRODUCT_ID" />, którego producent to <ph name="VENDOR_ID" /></translation>
<translation id="3163511056918491211">Łatwo przywróć dane lub zmień urządzenie, gdy tylko chcesz. Kopie zapasowe są szyfrowane z użyciem hasła do Twojego konta Google i przesyłane do Google.</translation>
<translation id="3164329792803560526">Udostępniam tę kartę aplikacji <ph name="APP_NAME" /></translation>
@@ -2891,7 +2891,7 @@ Domena <ph name="DOMAIN" /> wymaga, by karta inteligentna pozostała w gnieźdz
<translation id="3564334271939054422">Sieć Wi-Fi (<ph name="NETWORK_ID" />), której używasz, może wymagać wejścia na stronę logowania.</translation>
<translation id="3564848315152754834">Klucz bezpieczeństwa USB</translation>
<translation id="3566325075220776093">Z tego urządzenia</translation>
-<translation id="3566721612727112615">Nie dodano żadnych stron</translation>
+<translation id="3566721612727112615">Nie dodano żadnych witryn</translation>
<translation id="3567284462585300767">Aby móc odbierać i akceptować pliki od osób w pobliżu, włącz swoją widoczność</translation>
<translation id="3569382839528428029">Czy chcesz, aby aplikacja <ph name="APP_NAME" /> miała dostęp do Twojego ekranu?</translation>
<translation id="3569682580018832495">Strona <ph name="ORIGIN" /> może wyświetlać te pliki i foldery:</translation>
@@ -3116,7 +3116,7 @@ Domena <ph name="DOMAIN" /> wymaga, by karta inteligentna pozostała w gnieźdz
<translation id="3764753550716962406">Czy Google może korzystać z Twojego koszyka, aby znajdować dostępne rabaty?</translation>
<translation id="3764974059056958214">{COUNT,plural, =1{Wysyłam <ph name="ATTACHMENTS" /> na: <ph name="DEVICE_NAME" />}few{Wysyłam <ph name="ATTACHMENTS" /> na: <ph name="DEVICE_NAME" />}many{Wysyłam <ph name="ATTACHMENTS" /> na: <ph name="DEVICE_NAME" />}other{Wysyłam <ph name="ATTACHMENTS" /> na: <ph name="DEVICE_NAME" />}}</translation>
<translation id="3765246971671567135">Nie udało się odczytać zasad trybu demonstracyjnego offline.</translation>
-<translation id="3765696567014520261">Strony nie mogą używać plików cookie do śledzenia Twojej aktywności związanej z przeglądaniem różnych stron, na przykład w celu personalizowania reklam. W niektórych witrynach mogą nie działać funkcje</translation>
+<translation id="3765696567014520261">Witryny nie mogą używać plików cookie do śledzenia Twojej aktywności związanej z przeglądaniem różnych stron, na przykład w celu personalizowania reklam. W niektórych witrynach mogą nie działać funkcje</translation>
<translation id="3766687283066842296">Więcej informacji o funkcji sterowania telefonem</translation>
<translation id="3766811143887729231"><ph name="REFRESH_RATE" /> Hz</translation>
<translation id="377050016711188788">Lody</translation>
@@ -3421,7 +3421,7 @@ Domena <ph name="DOMAIN" /> wymaga, by karta inteligentna pozostała w gnieźdz
<translation id="402184264550408568">(TCP)</translation>
<translation id="4021909830315618592">Kopiuj szczegóły kompilacji</translation>
<translation id="4021941025609472374">Zamknij karty po lewej</translation>
-<translation id="402211067068791756">Spowoduje to usunięcie <ph name="TOTAL_USAGE" /> danych zapisanych przez wyświetlone strony</translation>
+<translation id="402211067068791756">Spowoduje to usunięcie <ph name="TOTAL_USAGE" /> danych zapisanych przez wyświetlone witryny</translation>
<translation id="4022426551683927403">&amp;Dodaj do słownika</translation>
<translation id="4025039777635956441">Wycisz wybraną stronę</translation>
<translation id="402707738228916911">Otrzymano instrukcję <ph name="AUTHORIZE_INSTRUCTION_NAME" /></translation>
@@ -3826,7 +3826,7 @@ Domena <ph name="DOMAIN" /> wymaga, by karta inteligentna pozostała w gnieźdz
<translation id="4409697491990005945">Marginesy</translation>
<translation id="4410545552906060960">Do odblokowywania urządzenia możesz używać numeru PIN zamiast hasła. Możesz podać PIN później w Ustawieniach.</translation>
<translation id="4411578466613447185">Certyfikat do podpisywania kodu</translation>
-<translation id="4411719918614785832">Te klucze są zapisywane w systemie Windows Hello na tym komputerze. Nie są one zapisywane na Twoim koncie Google.</translation>
+<translation id="4411719918614785832">Te klucze dostępu są zapisywane w systemie Windows Hello na tym komputerze. Nie są one zapisywane na Twoim koncie Google.</translation>
<translation id="4412632005703201014">Aplikacje Chrome zmieniamy w progresywne aplikacje internetowe. Tę aplikację Chrome zainstalowała w przeglądarce Twoja organizacja. Aby otworzyć progresywną aplikację internetową z listy aplikacji, najpierw skontaktuj się z administratorem i poproś o odinstalowanie aplikacji Chrome. Tymczasem możesz wejść na <ph name="EXTENSION_LAUNCH_URL" />, aby otworzyć rozszerzenie <ph name="EXTENSION_NAME" /> w przeglądarce.</translation>
<translation id="4412698727486357573">Centrum pomocy</translation>
<translation id="4412992751769744546">Zezwalaj na pliki cookie innych firm</translation>
@@ -4039,8 +4039,8 @@ Domena <ph name="DOMAIN" /> wymaga, by karta inteligentna pozostała w gnieźdz
<translation id="4594577641390224176">Szukasz strony z informacjami o systemie? Wejdź na</translation>
<translation id="4595560905247879544">Aplikacje i rozszerzenia może zmieniać tylko menedżer (<ph name="CUSTODIAN_NAME" />).</translation>
<translation id="4596295440756783523">Masz zapisane certyfikaty, które potwierdzają tożsamość tych serwerów</translation>
-<translation id="4598345735110653698">Zarządzaj kluczami</translation>
-<translation id="4598549027014564149">W trybie incognito witryny nie mogą używać plików cookie do śledzenia Twojej aktywności związanej z przeglądaniem innych witryn, nawet powiązanych. Twoja aktywność związana z przeglądaniem nie służy do personalizowania reklam. W niektórych witrynach mogą nie działać funkcje.</translation>
+<translation id="4598345735110653698">Zarządzaj kluczami dostępu</translation>
+<translation id="4598549027014564149">W trybie incognito witryny nie mogą używać plików cookie do śledzenia Twojej aktywności związanej z przeglądaniem innych witryn, nawet powiązanych. Twoja aktywność związana z przeglądaniem nie służy do personalizowania reklam. Funkcje w niektórych witrynach mogą nie działać.</translation>
<translation id="4598556348158889687">Zarządzanie pamięcią</translation>
<translation id="4598776695426288251">Sieć Wi-Fi jest dostępna przez wiele urządzeń</translation>
<translation id="4600071396330666617">Liczba sugestii</translation>
@@ -4580,7 +4580,7 @@ Aby pomniejszyć, naciśnij Ctrl + Alt + zmniejsz jasność.</translation>
<translation id="5109816792918100764">Usuń: <ph name="LANGUAGE_NAME" /></translation>
<translation id="5111646998522066203">Zamknij tryb incognito</translation>
<translation id="5111692334209731439">&amp;Menedżer zakładek</translation>
-<translation id="5111794652433847656">Brak kluczy na tym urządzeniu dla witryny <ph name="APP_NAME" /></translation>
+<translation id="5111794652433847656">Brak kluczy dostępu na tym urządzeniu dla witryny <ph name="APP_NAME" /></translation>
<translation id="5112577000029535889">&amp;Narzędzia dla deweloperów</translation>
<translation id="511313294362309725">Włącz Szybkie parowanie</translation>
<translation id="5113739826273394829">Jeśli klikniesz tę ikonę, <ph name="DEVICE_TYPE" /> zostanie zablokowany ręcznie. Następnym razem trzeba będzie wpisać hasło, by go odblokować.</translation>
@@ -5022,7 +5022,7 @@ Aby pomniejszyć, naciśnij Ctrl + Alt + zmniejsz jasność.</translation>
<translation id="5519195206574732858">LTE</translation>
<translation id="5521078259930077036">Czy to oczekiwana strona główna?</translation>
<translation id="5522156646677899028">To rozszerzenie zawiera poważną lukę w zabezpieczeniach.</translation>
-<translation id="5522403133543437426">Wyszukiwarka używana w pasku adresu</translation>
+<translation id="5522403133543437426">Wyszukiwarka używana w pasku adresu.</translation>
<translation id="5523149538118225875">{NUM_EXTENSIONS,plural, =1{Administrator zainstalował rozszerzenie}few{Administrator zainstalował # rozszerzenia}many{Administrator zainstalował # rozszerzeń}other{Administrator zainstalował # rozszerzenia}}</translation>
<translation id="5523558474028191231">Nazwa może zawierać litery, cyfry i znaki specjalne, a liczba znaków nie może przekraczać <ph name="MAX_CHARACTER_COUNT" /></translation>
<translation id="5526701598901867718">Wszystkie (niebezpieczne)</translation>
@@ -5043,7 +5043,7 @@ Aby pomniejszyć, naciśnij Ctrl + Alt + zmniejsz jasność.</translation>
<translation id="5544482392629385159">Urządzenie <ph name="DEVICE_INDEX" /> z <ph name="DEVICE_COUNT" />, <ph name="DEVICE_NAME" /></translation>
<translation id="554517701842997186">Mechanizm renderowania</translation>
<translation id="5545335608717746497">{NUM_TABS,plural, =1{Dodaj kartę do grupy}few{Dodaj karty do grupy}many{Dodaj karty do grupy}other{Dodaj karty do grupy}}</translation>
-<translation id="5545693483061321551">Strony nie mogą używać plików cookie do śledzenia Twojej aktywność związanej z przeglądaniem różnych stron, na przykład w celu personalizowania reklam. W niektórych witrynach mogą nie działać funkcje.</translation>
+<translation id="5545693483061321551">Witryny nie mogą używać plików cookie do śledzenia Twojej aktywności związanej z przeglądaniem różnych witryn, na przykład w celu personalizowania reklam. W niektórych witrynach mogą nie działać funkcje.</translation>
<translation id="5546865291508181392">Znajdź</translation>
<translation id="5548075230008247516">Wszystkie elementy zostały odznaczone. Opuszczono tryb wyboru.</translation>
<translation id="5548159762883465903">{NUM_OTHER_TABS,plural, =0{„<ph name="TAB_TITLE" />”}=1{„<ph name="TAB_TITLE" />” i jeszcze jedna karta}few{„<ph name="TAB_TITLE" />” i # inne karty}many{„<ph name="TAB_TITLE" />” i # innych kart}other{„<ph name="TAB_TITLE" />” i # innej karty}}</translation>
@@ -5170,7 +5170,7 @@ Aby pomniejszyć, naciśnij Ctrl + Alt + zmniejsz jasność.</translation>
<translation id="5653154844073528838">Zapisane drukarki: <ph name="PRINTER_COUNT" />.</translation>
<translation id="5655296450510165335">Rejestracja urządzeń</translation>
<translation id="5656845498778518563">Prześlij opinię do Google</translation>
-<translation id="5657156137487675418">Zezwól na wszystkie pliki cookie</translation>
+<translation id="5657156137487675418">Zezwalaj na wszystkie pliki cookie</translation>
<translation id="5657667036353380798">Rozszerzenie zewnętrzne wymaga zainstalowania Chrome w wersji <ph name="MINIMUM_CHROME_VERSION" /> lub nowszej.</translation>
<translation id="5658415415603568799">Ze względów bezpieczeństwa Smart Lock poprosi Cię o podanie hasła po upływie 20 godzin.</translation>
<translation id="5659593005791499971">E-mail</translation>
@@ -5763,7 +5763,7 @@ Aby pomniejszyć, naciśnij Ctrl + Alt + zmniejsz jasność.</translation>
<translation id="6201608810045805374">Usunąć to konto?</translation>
<translation id="6202304368170870640">Kodu PIN możesz używać do logowania się lub do odblokowywania urządzenia.</translation>
<translation id="6205314730813004066">Prywatność w reklamach</translation>
-<translation id="6206199626856438589">Wylogujemy Cię z wyświetlonych stron, także na otwartych kartach</translation>
+<translation id="6206199626856438589">Wylogujemy Cię z wyświetlonych witryn, także na otwartych kartach</translation>
<translation id="6206311232642889873">Kop&amp;iuj grafikę</translation>
<translation id="6206521455877863927">Strony, które przeglądasz, w tym strony z tej samej domeny, np. google.com i mail.google.com, mogą zapisywać dane na Twoim urządzeniu.</translation>
<translation id="6207200176136643843">Przywróć domyślny poziom powiększenia</translation>
@@ -6065,7 +6065,7 @@ Domena <ph name="DOMAIN" /> wymaga, by karta inteligentna pozostała w gnieźdz
<translation id="6482559668224714696">Lupa pełnoekranowa</translation>
<translation id="6483485061007832714">Otwieranie pobranego pliku</translation>
<translation id="6483805311199035658">Otwieram <ph name="FILE" />...</translation>
-<translation id="6486301003991593638">Aby zarządzać kluczami, użyj nowszej wersji systemu Windows</translation>
+<translation id="6486301003991593638">Aby zarządzać kluczami dostępu, użyj nowszej wersji systemu Windows</translation>
<translation id="6488266788670893993"><ph name="BRAND" /> nie może sprawdzić Twoich haseł pod kątem naruszenia bezpieczeństwa danych. Sprawdź połączenie z internetem.</translation>
<translation id="6488384360522318064">Wybierz język</translation>
<translation id="648927581764831596">Brak dostępnych</translation>
@@ -6611,7 +6611,7 @@ Masz jeszcze # przejętego hasła. Menedżer haseł Google zaleca, aby jak najs
<translation id="6965978654500191972">Urządzenie</translation>
<translation id="6966370001499648704">Określ, których telefonów będziesz używać jako kluczy bezpieczeństwa</translation>
<translation id="6967430741871315905">Nie można sprawdzić, czy urządzenie zostało dopuszczone</translation>
-<translation id="696780070563539690">Strony nie mogą używać plików cookie do śledzenia Twojej aktywność związanej z przeglądaniem różnych stron, na przykład w celu personalizowania reklam</translation>
+<translation id="696780070563539690">Witryny nie mogą używać plików cookie do śledzenia Twojej aktywności związanej z przeglądaniem różnych witryn, na przykład w celu personalizowania reklam</translation>
<translation id="6968288415730398122">Wpisz hasło, by skonfigurować blokadę ekranu</translation>
<translation id="6969047215179982698">Wyłącz Udostępnianie w pobliżu</translation>
<translation id="6969216690072714773">Dodaj lub popraw informacje, które mają być powiązane z tym urządzeniem.</translation>
@@ -6626,7 +6626,7 @@ Masz jeszcze # przejętego hasła. Menedżer haseł Google zaleca, aby jak najs
<translation id="697508444536771064">Wyłącz Linuksa</translation>
<translation id="6975361011348772931">Rozszerzenie prosi o zgodę na odczytywanie i zmienianie danych</translation>
<translation id="6978121630131642226">Wyszukiwarki</translation>
-<translation id="6978717888677691380">Witryny zablokowane</translation>
+<translation id="6978717888677691380">Zablokowane witryny</translation>
<translation id="6979041727349121225">Oszczędzanie energii</translation>
<translation id="6979044105893951891">Rozpoczynanie i kończenie zarządzanych sesji gościa</translation>
<translation id="6979440798594660689">Wycisz (domyślnie)</translation>
@@ -6924,7 +6924,7 @@ Masz jeszcze # przejętego hasła. Menedżer haseł Google zaleca, aby jak najs
<translation id="7258192266780953209">Transformacje</translation>
<translation id="7258225044283673131">Aplikacja nie odpowiada. Aby ją zamknąć, wybierz „Wymuś zamknięcie”.</translation>
<translation id="7260186537988033909">Rejestrowanie urządzenia w trybie kiosku i tablicy informacyjnej zostało zakończone</translation>
-<translation id="7260367682327802201">Twoje urządzenie z Androidem może mieć podobne ustawienie. Jeśli w Chrome i na Twoim urządzeniu z Androidem jest włączony pomiar skuteczności reklam, firma może mierzyć skuteczność reklam w odwiedzanych przez Ciebie witrynach i w aplikacjach, z których korzystasz.</translation>
+<translation id="7260367682327802201">Twoje urządzenie z Androidem może mieć podobne ustawienie. Jeśli w Chrome i na Twoim urządzeniu z Androidem jest włączony pomiar skuteczności reklam, firma może mierzyć skuteczność reklam w odwiedzanych przez Ciebie witrynach i w aplikacjach, z których korzystasz</translation>
<translation id="7262004276116528033">Ta usługa logowania pochodzi z domeny <ph name="SAML_DOMAIN" /></translation>
<translation id="7263162347647986485">{NUM_SITES,plural, =1{Usunięto uprawnienia 1 witryny}few{Usunięto uprawnienia {NUM_SITES} witryn}many{Usunięto uprawnienia {NUM_SITES} witryn}other{Usunięto uprawnienia {NUM_SITES} witryny}}</translation>
<translation id="7264695323040866038">Czy chcesz zawsze używać aplikacji <ph name="APP" /> do otwierania obsługiwanych linków internetowych?</translation>
@@ -7218,7 +7218,7 @@ Masz jeszcze # przejętego hasła. Menedżer haseł Google zaleca, aby jak najs
<translation id="7531779363494549572">Otwórz Ustawienia &gt; Aplikacje i powiadomienia &gt; Powiadomienia.</translation>
<translation id="7532009420053991888">Aplikacja <ph name="LINUX_APP_NAME" /> nie odpowiada. Aby ją zamknąć, wybierz „Wymuś zamknięcie”.</translation>
<translation id="7535730537657706072">Aby usunąć z urządzenia historię przeglądania w trybie incognito, zamknij wszystkie karty incognito</translation>
-<translation id="7537451260744431038">Strony nie mogą używać plików cookie dla Twojej wygody, by na przykład zapamiętać Twoje logowanie lub zawartość koszyka</translation>
+<translation id="7537451260744431038">Witryny nie mogą używać plików cookie dla Twojej wygody, by na przykład zapamiętać Twoje logowanie lub zawartość koszyka</translation>
<translation id="7538088324298143359">Wyszukaj na obrazie za pomocą narzędzia <ph name="SEARCH_ENGINE" /></translation>
<translation id="7540972813190816353">Podczas sprawdzania dostępności aktualizacji wystąpił błąd: <ph name="ERROR" /></translation>
<translation id="7541076351905098232">Na tym urządzeniu została przywrócona przez <ph name="MANAGER" /> wcześniejsza wersja systemu operacyjnego. Zapisz ważne pliki, a następnie uruchom urządzenie jeszcze raz. Wszystkie dane zostaną usunięte.</translation>
@@ -7876,7 +7876,7 @@ Przechowuj plik klucza w bezpiecznym miejscu. Będzie on potrzebny do utworzenia
<translation id="810185532889603849">Kolor niestandardowy</translation>
<translation id="8101987792947961127">Przy następnym uruchomieniu trzeba wykonać Powerwash</translation>
<translation id="8102139037507939978">Usuń informacje umożliwiające identyfikację z pliku system_logs.txt.</translation>
-<translation id="810362914482827094">Wyszukaj klucze</translation>
+<translation id="810362914482827094">Wyszukaj klucze dostępu</translation>
<translation id="8104088837833760645">Pobierz profil eSIM</translation>
<translation id="8105368624971345109">Wyłącz</translation>
<translation id="8107015733319732394">Instaluję Sklep Google Play na urządzeniu <ph name="DEVICE_TYPE" />. Może to potrwać kilka minut.</translation>
@@ -7925,7 +7925,7 @@ Przechowuj plik klucza w bezpiecznym miejscu. Będzie on potrzebny do utworzenia
<translation id="815114315010033526">Zamiast tego użyj kodu QR</translation>
<translation id="8151638057146502721">Konfiguruj</translation>
<translation id="8154790740888707867">Brak pliku</translation>
-<translation id="8154912474061769055">W wielu witrynach mogą nie działać funkcje</translation>
+<translation id="8154912474061769055">Funkcje w wielu witrynach mogą nie działać</translation>
<translation id="815491593104042026">Ups, uwierzytelnianie nie powiodło się, bo zostało skonfigurowane do używania niezabezpieczonego URL-a (<ph name="BLOCKED_URL" />). Skontaktuj się z administratorem.</translation>
<translation id="8155676038687609779">{COUNT,plural, =0{Nie znaleziono przejętych haseł}=1{{COUNT} przejęte hasło}few{{COUNT} przejęte hasła}many{{COUNT} przejętych haseł}other{{COUNT} przejętego hasła}}</translation>
<translation id="8157248655669507702">Aby zainstalować profil eSIM, włącz mobilną transmisję danych</translation>
@@ -8138,7 +8138,7 @@ Przechowuj plik klucza w bezpiecznym miejscu. Będzie on potrzebny do utworzenia
<translation id="8342861492835240085">Wybierz kolekcję</translation>
<translation id="8345848587667658367">Możesz teraz wyświetlać najnowsze zdjęcia, pliki multimedialne, powiadomienia i aplikacje z telefonu</translation>
<translation id="8347227221149377169">Zadania drukowania</translation>
-<translation id="834785183489258869">W trybie incognito strony nie mogą używać plików cookie do śledzenia Twojej aktywności związanej z przeglądaniem różnych stron, na przykład w celu personalizowania reklam. W niektórych witrynach mogą nie działać funkcje.</translation>
+<translation id="834785183489258869">W trybie incognito witryny nie mogą używać plików cookie do śledzenia Twojej aktywności związanej z przeglądaniem różnych stron, na przykład w celu personalizowania reklam. W niektórych witrynach mogą nie działać funkcje.</translation>
<translation id="8350789879725387295">Narzędzia rysika w docku</translation>
<translation id="8351316842353540018">Zawsze pokazuj opcje ułatwień dostępu</translation>
<translation id="8351419472474436977">To rozszerzenie przejęło kontrolę nad ustawieniami Twojego serwera proxy, co oznacza, że może zmieniać, przerywać lub podsłuchiwać wszystko, co robisz online. Jeśli nie masz pewności, skąd się wzięła ta zmiana, prawdopodobnie jej nie chcesz.</translation>
@@ -8160,7 +8160,7 @@ Przechowuj plik klucza w bezpiecznym miejscu. Będzie on potrzebny do utworzenia
<translation id="8366396658833131068">Łączność z siecią została przywrócona. Wybierz inną sieć lub naciśnij przycisk „Dalej” poniżej, by uruchomić aplikację w trybie kiosku.</translation>
<translation id="8366694425498033255">Klawisze wyboru</translation>
<translation id="8368859634510605990">&amp;Otwórz wszystkie zakładki</translation>
-<translation id="8369028061188107403">Spowoduje to usunięcie <ph name="TOTAL_USAGE" /> danych zapisanych przez wyświetlone strony i zainstalowane aplikacje</translation>
+<translation id="8369028061188107403">Spowoduje to usunięcie <ph name="TOTAL_USAGE" /> danych zapisanych przez wyświetlone witryny i zainstalowane aplikacje</translation>
<translation id="8370294614544004647">Uśpienie po zamknięciu laptopa</translation>
<translation id="8371695176452482769">Mów teraz</translation>
<translation id="8371925839118813971">{NUM_TABS,plural, =1{Wycisz stronę}few{Wycisz strony}many{Wycisz strony}other{Wycisz strony}}</translation>
@@ -8213,7 +8213,7 @@ Przechowuj plik klucza w bezpiecznym miejscu. Będzie on potrzebny do utworzenia
<translation id="8413956290606243087">Czy chcesz włączyć ChromeVoksa, czyli wbudowany czytnik ekranu w Chrome OS?</translation>
<translation id="8414249071344507766">Wspomnienia zostały ukryte na 2 dni</translation>
<translation id="8414396119627470038">Zaloguj się w <ph name="SITE_ETLD_PLUS_ONE" /> za pomocą <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /></translation>
-<translation id="8414685983518053656">Uwagi</translation>
+<translation id="8414685983518053656">Notatki</translation>
<translation id="8416730306157376817"><ph name="BATTERY_PERCENTAGE" />% (obudowa)</translation>
<translation id="8417548266957501132">Hasło rodzica</translation>
<translation id="8418445294933751433">&amp;Pokaż jako kartę</translation>
@@ -8356,7 +8356,7 @@ Przechowuj plik klucza w bezpiecznym miejscu. Będzie on potrzebny do utworzenia
<translation id="8557022314818157177">Dotykaj klucza bezpieczeństwa, dopóki Twój odcisk nie zostanie zarejestrowany</translation>
<translation id="8557180006508471423">Włącz „Google Chrome” w usługach lokalizacyjnych na Macu</translation>
<translation id="8557856025359704738">Następne pobieranie: <ph name="NEXT_DATE_DOWNLOAD" />.</translation>
-<translation id="8559858985063901027">Klucze</translation>
+<translation id="8559858985063901027">Klucze dostępu</translation>
<translation id="8559961053328923750">Chrome ogranicza łączną ilość danych, które witryny mogą udostępniać za pomocą przeglądarki, aby mierzyć skuteczność reklam</translation>
<translation id="8560327176991673955">{COUNT,plural, =0{Otwórz wszystkie w &amp;nowym oknie}=1{Otwórz w &amp;nowym oknie}few{Otwórz wszystkie ({COUNT}) w &amp;nowym oknie}many{Otwórz wszystkie ({COUNT}) w &amp;nowym oknie}other{Otwórz wszystkie ({COUNT}) w &amp;nowym oknie}}</translation>
<translation id="8561206103590473338">Słoń</translation>
@@ -8908,7 +8908,7 @@ Domena <ph name="DOMAIN" /> wymaga, by karta inteligentna pozostała w gnieźdz
<translation id="9041692268811217999">Dostęp do plików lokalnych na tym komputerze został wyłączony przez administratora</translation>
<translation id="904224458472510106">Tej operacji nie można cofnąć</translation>
<translation id="9042827002460091668">Sprawdź połączenie z internetem i spróbuj ponownie</translation>
-<translation id="9042893549633094279">Prywatność i bezpieczeństwo</translation>
+<translation id="9042893549633094279">Prywatność i bezpieczeństwo</translation>
<translation id="9044646465488564462">Nie udało się połączyć z siecią: <ph name="DETAILS" /></translation>
<translation id="9045160989383249058">Twoja lista Do przeczytania została przeniesiona do nowego panelu bocznego. Aby ją zobaczyć, kliknij tutaj.</translation>
<translation id="9045430190527754450">Wysyła do Google adres internetowy strony, którą próbujesz otworzyć</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_pt-BR.xtb b/chromium/chrome/app/resources/generated_resources_pt-BR.xtb
index 4cc0bb8b12c..b265d549654 100644
--- a/chromium/chrome/app/resources/generated_resources_pt-BR.xtb
+++ b/chromium/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -236,7 +236,7 @@ Verifique suas senhas a qualquer momento no <ph name="GOOGLE_PASSWORD_MANAGER" /
<translation id="11978075283960463">Dados armazenados no app: <ph name="APP_SIZE" /></translation>
<translation id="1197935538609051549">Desativar</translation>
<translation id="1198066799963193307">Ferramentas de fala para pessoas com baixa visão</translation>
-<translation id="119944043368869598">Limpar tudo</translation>
+<translation id="119944043368869598">Remover tudo</translation>
<translation id="1199814941632954229">Certificados estão sendo provisionados para esses perfis certificados</translation>
<translation id="120069043972472860">Não é possível assistir</translation>
<translation id="1201402288615127009">Próxima</translation>
@@ -3743,7 +3743,7 @@ Para gerenciar as configurações dessa conta, instale o app Family Link no seu
<translation id="4305402730127028764">Copiar para <ph name="DEVICE_NAME" /></translation>
<translation id="4305817255990598646">Alternar</translation>
<translation id="4306119971288449206">Os apps precisam ser veiculados com o tipo de conteúdo "<ph name="CONTENT_TYPE" />"</translation>
-<translation id="4307992518367153382">Básico</translation>
+<translation id="4307992518367153382">Básicas</translation>
<translation id="4309165024397827958">Permitir que apps e serviços do Android com permissão de localização usem o local do dispositivo. O Google pode coletar dados de local periodicamente e os usar de forma anônima para melhorar a precisão de local e os serviços com base em localização.</translation>
<translation id="4309183709806093061">Compartilhar também o áudio do sistema. Este dispositivo vai ser silenciado para evitar feedback.</translation>
<translation id="4309420042698375243"><ph name="NUM_KILOBYTES" /> K (<ph name="NUM_KILOBYTES_LIVE" /> K ativos)</translation>
@@ -4683,7 +4683,7 @@ Use Ctrl + Alt + Diminuir brilho para diminuir o zoom.</translation>
<translation id="5177549709747445269">Você está usando dados móveis</translation>
<translation id="5178667623289523808">Localizar anterior</translation>
<translation id="5181140330217080051">Fazendo download</translation>
-<translation id="5181172023548002891">Para o Gerenciador de senhas do Google da conta <ph name="ACCOUNT" /></translation>
+<translation id="5181172023548002891">No Gerenciador de senhas do Google da conta <ph name="ACCOUNT" /></translation>
<translation id="5184063094292164363">&amp;Console JavaScript</translation>
<translation id="5184209580557088469">Já existe um tíquete com esse nome de usuário</translation>
<translation id="5184662919967270437">Atualizando o dispositivo</translation>
@@ -5203,7 +5203,7 @@ Não exponha nenhuma informação confidencial.</translation>
<translation id="5653154844073528838">Você tem <ph name="PRINTER_COUNT" /> impressoras salvas.</translation>
<translation id="5655296450510165335">Registro do dispositivo</translation>
<translation id="5656845498778518563">Enviar feedback para o Google</translation>
-<translation id="5657156137487675418">Mostrar todos os cookies</translation>
+<translation id="5657156137487675418">Permitir todos os cookies</translation>
<translation id="5657667036353380798">A extensão externa requer que a versão <ph name="MINIMUM_CHROME_VERSION" /> do Google Chrome, ou mais recente, esteja instalada.</translation>
<translation id="5658415415603568799">Para maior segurança, o Smart Lock solicitará que você digite sua senha após 20 horas.</translation>
<translation id="5659593005791499971">E-mail</translation>
@@ -5416,7 +5416,7 @@ Não exponha nenhuma informação confidencial.</translation>
<translation id="5857675236236529683">Quando estiver tudo pronto, consulte sua lista de leitura aqui</translation>
<translation id="5858490737742085133">Terminal</translation>
<translation id="585979798156957858">Meta externa</translation>
-<translation id="5860033963881614850">Desativado</translation>
+<translation id="5860033963881614850">Desativada</translation>
<translation id="5860254591544742609">Mostrar barra de título</translation>
<translation id="5860491529813859533">Ativar</translation>
<translation id="5860494867054883682">Atualizando seu dispositivo para o canal <ph name="CHANNEL_NAME" /> (<ph name="PROGRESS_PERCENT" />)</translation>
@@ -6007,7 +6007,7 @@ Não exponha nenhuma informação confidencial.</translation>
<translation id="6404187344102273690">Jogos no Chromebook</translation>
<translation id="6404511346730675251">Editar favorito</translation>
<translation id="6406303162637086258">Simular reinicialização do navegador</translation>
-<translation id="6406506848690869874">Sincronizar</translation>
+<translation id="6406506848690869874">Sincronização</translation>
<translation id="6406708970972405507">Configurações: <ph name="SECTION_TITLE" /></translation>
<translation id="6407398811519202484">Com permissão para salvar dados no dispositivo</translation>
<translation id="6408118934673775994">Ler e alterar seus dados em <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> e <ph name="WEBSITE_3" /></translation>
@@ -7045,7 +7045,7 @@ Há # outras senhas comprometidas. O Gerenciador de senhas do Google recomenda q
<translation id="735745346212279324">VPN desconectada</translation>
<translation id="7358324924540718595">As recordações estão ocultas por hoje</translation>
<translation id="7358338787722390626">Fechar a pesquisa no painel lateral</translation>
-<translation id="735994578317267253">Tenha seus apps, configurações e muito mais em qualquer dispositivo Chrome OS</translation>
+<translation id="735994578317267253">Tenha seus apps, configurações e muito mais em qualquer dispositivo ChromeOS</translation>
<translation id="7360233684753165754"><ph name="PAGE_NUMBER" /> páginas para <ph name="PRINTER_NAME" /></translation>
<translation id="7360257054721917104">Mostrando os espaços de trabalho e modelos salvos. Pressione Tab para navegar.</translation>
<translation id="7361297102842600584">Clique com o botão direito do mouse para executar o plug-in <ph name="PLUGIN_NAME" /></translation>
@@ -8843,7 +8843,7 @@ Mantenha a sua chave de arquivo em um local seguro. Você precisará dela para c
<translation id="8966809848145604011">Outros perfis</translation>
<translation id="8966870118594285808">Reabra uma guia se você a fechou acidentalmente</translation>
<translation id="8967427617812342790">Adicionar à lista de leitura</translation>
-<translation id="8968527460726243404">Gravador de imagem do sistema Chrome OS</translation>
+<translation id="8968527460726243404">Gravador de imagem do sistema ChromeOS</translation>
<translation id="8968766641738584599">Salvar cartão</translation>
<translation id="89720367119469899">Escape</translation>
<translation id="8972513834460200407">Verifique com seu administrador de rede se o firewall não está bloqueando downloads dos servidores do Google.</translation>
@@ -9096,7 +9096,7 @@ Mantenha a sua chave de arquivo em um local seguro. Você precisará dela para c
<translation id="9180281769944411366">O processo pode levar alguns minutos. Iniciando o contêiner Linux.</translation>
<translation id="9180380851667544951">O site pode compartilhar sua tela</translation>
<translation id="9182556968660520230">Não permitir que os sites reproduzam conteúdo protegido</translation>
-<translation id="9183331776983279456">O Chrome exclui automaticamente sites que estão há mais de quatro semanas na lista. Um site que você visitar novamente poderá reaparecer. Você também pode bloquear um site para que ele não sugira anúncios.</translation>
+<translation id="9183331776983279456">O Chrome exclui automaticamente sites que estão há mais de quatro semanas na lista. Se você visitar um site novamente, ele poderá reaparecer na lista. Você também pode bloquear um site para que ele não sugira anúncios.</translation>
<translation id="918352324374649435">{COUNT,plural, =1{App}one{# app}other{# apps}}</translation>
<translation id="9186963452600581158">Fazer login com a Conta do Google de uma criança</translation>
<translation id="9187967020623675250">As teclas não correspondem. Pressione qualquer tecla para <ph name="RESPONSE" />.</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_pt-PT.xtb b/chromium/chrome/app/resources/generated_resources_pt-PT.xtb
index 8f193834f15..f7aa7b54caa 100644
--- a/chromium/chrome/app/resources/generated_resources_pt-PT.xtb
+++ b/chromium/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -364,7 +364,7 @@ Verifique as suas palavras-passe em qualquer altura no <ph name="GOOGLE_PASSWORD
<translation id="1324106254079708331">Salvaguarda as Contas Google pessoais de qualquer pessoa em risco de ataques direcionados.</translation>
<translation id="1327272175893960498">Permissões Kerberos</translation>
<translation id="1327495825214193325">Para ativar a depuração do adb, tem de reiniciar este <ph name="DEVICE_TYPE" />. A desativação requer a reposição das definições de fábrica.</translation>
-<translation id="1327527584824210101">Use a sua token de acesso</translation>
+<translation id="1327527584824210101">Use a sua chave de acesso</translation>
<translation id="1327794256477341646">As funcionalidades que precisam da sua localização não funcionam</translation>
<translation id="1329466763986822896">Melhorar a privacidade desta zona Wi-Fi</translation>
<translation id="1331977651797684645">Fui eu.</translation>
@@ -1196,7 +1196,7 @@ Pode gerir as definições desta conta ao instalar a aplicação Family Link no
<translation id="2048554637254265991">Erro ao iniciar o gestor de contentores. Tente novamente.</translation>
<translation id="2048653237708779538">Ação não disponível</translation>
<translation id="204914487372604757">Criar atalho</translation>
-<translation id="2050339315714019657">Vertical</translation>
+<translation id="2050339315714019657">Retrato</translation>
<translation id="2051555741181591333">Desativar zona Wi-Fi automaticamente</translation>
<translation id="2052572566310583903">Instalada nos seus outros dispositivos</translation>
<translation id="2053105195397337973">Estamos a explorar formas de restringir a monitorização enquanto permitimos que os sites acabem com as fraudes e o spam de anúncios.</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_ro.xtb b/chromium/chrome/app/resources/generated_resources_ro.xtb
index 2f9f210612d..18fccef75e7 100644
--- a/chromium/chrome/app/resources/generated_resources_ro.xtb
+++ b/chromium/chrome/app/resources/generated_resources_ro.xtb
@@ -2289,7 +2289,7 @@ Mesaj de la server: <ph name="SERVER_MSG" /></translation>
<translation id="2989123969927553766">Accelerarea derulării cu mouse-ul</translation>
<translation id="2989474696604907455">neconectat</translation>
<translation id="2989786307324390836">Certificat unic, sub formă de fișier binar cu codificarea DER</translation>
-<translation id="2989805286512600854">Deschideți într-o filă nouă</translation>
+<translation id="2989805286512600854">Deschide într-o filă nouă</translation>
<translation id="2990313168615879645">Adaugă Contul Google</translation>
<translation id="2990583317361835189">Nu permite site-urilor să folosească senzori de mișcare</translation>
<translation id="2992931425024192067">Afișează integral conținutul notificărilor</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_ru.xtb b/chromium/chrome/app/resources/generated_resources_ru.xtb
index f82e67b8b21..7885e0c35e8 100644
--- a/chromium/chrome/app/resources/generated_resources_ru.xtb
+++ b/chromium/chrome/app/resources/generated_resources_ru.xtb
@@ -296,7 +296,7 @@
<translation id="1251578593170406502">Поиск мобильных сетей…</translation>
<translation id="125220115284141797">По умолчанию</translation>
<translation id="1252987234827889034">Ошибка в профиле</translation>
-<translation id="1254593899333212300">Прямое подключение к Интернету</translation>
+<translation id="1254593899333212300">Прямое подключение к интернету</translation>
<translation id="1257336506558170607">Экспортировать выбранный сертификат</translation>
<translation id="1258491128795710625">Что нового</translation>
<translation id="1259152067760398571">Проверка безопасности выполнена вчера.</translation>
@@ -1198,7 +1198,7 @@
<translation id="2048554637254265991">Не удалось запустить менеджер контейнеров. Повторите попытку.</translation>
<translation id="2048653237708779538">Действие недоступно</translation>
<translation id="204914487372604757">Создать ярлык</translation>
-<translation id="2050339315714019657">Вертикальное расположение</translation>
+<translation id="2050339315714019657">Портрет</translation>
<translation id="2051555741181591333">Автоматически выключать точку доступа</translation>
<translation id="2052572566310583903">Установлено на другом вашем устройстве</translation>
<translation id="2053105195397337973">Chromium стремится найти способы ограничить отслеживание, предоставляя сайтам возможность бороться со спамом и мошенничеством.</translation>
@@ -2481,7 +2481,7 @@
<translation id="3160928651883997588">Настройки сети VPN</translation>
<translation id="3161522574479303604">Все языки</translation>
<translation id="3162853326462195145">Учебный аккаунт</translation>
-<translation id="3162899666601560689">Сайты могут использовать файлы cookie для вашего удобства, например, чтобы сохранять информацию о товарах в корзине или о том, что вы вошли в аккаунт.</translation>
+<translation id="3162899666601560689">Сайты могут использовать файлы cookie для вашего удобства, например, чтобы вам не приходилось вновь входить в аккаунт или повторно добавлять товары в корзину.</translation>
<translation id="3163201441334626963">Неизвестный продукт <ph name="PRODUCT_ID" /> от поставщика <ph name="VENDOR_ID" /></translation>
<translation id="3163511056918491211">Вы можете легко восстановить свои данные или в любой момент перенести их на новое устройство. Резервные копии загружаются в Google и шифруются с помощью пароля вашего аккаунта Google.</translation>
<translation id="3164329792803560526">Отправка вкладки в приложение "<ph name="APP_NAME" />"…</translation>
@@ -3238,7 +3238,7 @@
<translation id="3843464315703645664">Разрешение дано браузером Chrome</translation>
<translation id="3844888638014364087">Вставлен символ эмодзи</translation>
<translation id="3846116211488856547">Разрабатывайте сайты, приложения для Android и другие программы с помощью удобных инструментов. При установке Linux будут скачаны данные объемом <ph name="DOWNLOAD_SIZE" />.</translation>
-<translation id="3847319713229060696">Помочь сделать Интернет безопасным для всех</translation>
+<translation id="3847319713229060696">Помочь сделать интернет безопасным для всех</translation>
<translation id="3848547754896969219">Открыть в режиме &amp;инкогнито</translation>
<translation id="385051799172605136">Назад</translation>
<translation id="3851428669031642514">Загрузить небезопасные скрипты</translation>
@@ -3607,7 +3607,7 @@
<translation id="4186749321808907788"><ph name="QUERY_NAME" /> – <ph name="DEFAULT_SEARCH_ENGINE_NAME" /> Поиск</translation>
<translation id="4187424053537113647">Настройка <ph name="APP_NAME" />…</translation>
<translation id="4190828427319282529">Выделение объектов, выбранных с помощью клавиатуры</translation>
-<translation id="4193575319002689239">Показать подсказки</translation>
+<translation id="4193575319002689239">Показывать карточки</translation>
<translation id="4193836101014293726">Невозможно удалить профиль</translation>
<translation id="419427585139779713">Вводить по слогам</translation>
<translation id="4194570336751258953">Включить нажатие от прикосновения</translation>
@@ -4583,7 +4583,7 @@
<translation id="5094721898978802975">Установка соединения со смежными нативными приложениями</translation>
<translation id="5097002363526479830">Не удалось подключиться к сети <ph name="NAME" />: <ph name="DETAILS" /></translation>
<translation id="5097306410549350357">Подробнее об использовании данных о местоположении…</translation>
-<translation id="5097349930204431044">Сайты, которые вы посещаете, могут определять, что вам нравится, и в дальнейшем предлагать другим сайтам рекламу для вас</translation>
+<translation id="5097349930204431044">Сайты, которые вы посещаете, могут определять, что вам нравится, и в дальнейшем предлагать другим сайтам рекламу для вас.</translation>
<translation id="5097649414558628673">Инструмент: <ph name="PRINT_NAME" /></translation>
<translation id="5097874180538493929">Автоматически регистрировать нажатие кнопки мыши, когда курсор останавливается</translation>
<translation id="5101839224773798795">Автоматически регистрировать нажатие кнопки мыши, когда указатель останавливается</translation>
@@ -5938,7 +5938,7 @@
<translation id="6345878117466430440">Отметить как прочитанное</translation>
<translation id="6347010704471250799">Показывать уведомление</translation>
<translation id="634887995541211148">Запустите Bruschetta на своем устройстве</translation>
-<translation id="6349101878882523185">Установить приложение "<ph name="APP_NAME" />"</translation>
+<translation id="6349101878882523185">Установите приложение "<ph name="APP_NAME" />"</translation>
<translation id="6354918092619878358">Эллиптическая кривая SECG secp256r1 (она же ANSI X9.62 prime256v1, NIST P-256)</translation>
<translation id="635609604405270300">Не выключайте устройство.</translation>
<translation id="63566973648609420">Ваши зашифрованные данные может прочитать только тот, кто знает кодовую фразу. Она не пересылается и не хранится в Google. Если вы забудете фразу или решите изменить эту настройку, вам придется <ph name="BEGIN_LINK" />сбросить параметры синхронизации<ph name="END_LINK" />.</translation>
@@ -7238,7 +7238,7 @@
<translation id="7531779363494549572">Откройте настройки устройства и выберите "Приложения и уведомления &gt; Уведомления".</translation>
<translation id="7532009420053991888">Приложение "<ph name="LINUX_APP_NAME" />" не отвечает. Чтобы выйти из него, нажмите "Закрыть принудительно".</translation>
<translation id="7535730537657706072">Чтобы удалить с устройства историю браузера в режиме инкогнито, закройте все вкладки инкогнито.</translation>
-<translation id="7537451260744431038">Сайты не могут использовать файлы cookie для вашего удобства, например, чтобы сохранять информацию о товарах в корзине или о том, что вы вошли в аккаунт.</translation>
+<translation id="7537451260744431038">Сайты могут использовать файлы cookie для вашего удобства, например, чтобы вам не приходилось вновь входить в аккаунт или повторно добавлять товары в корзину.</translation>
<translation id="7538088324298143359">Искать на изображении с помощью <ph name="SEARCH_ENGINE" /></translation>
<translation id="7540972813190816353">При проверке обновлений произошла ошибка: <ph name="ERROR" /></translation>
<translation id="7541076351905098232">По требованию <ph name="MANAGER" /> на устройстве была восстановлена предыдущая версия ОС. Сохраните важные файлы и перезапустите устройство. Все данные при этом будут удалены.</translation>
@@ -7802,7 +7802,7 @@
<translation id="8028993641010258682">Размер</translation>
<translation id="8029492516535178472"><ph name="WINDOW_TITLE" /> – требуется разрешение. Нажмите ⌘ + Option + Стрелка вверх, чтобы ответить.</translation>
<translation id="8030169304546394654">Отключено</translation>
-<translation id="8030852056903932865">Одобрить</translation>
+<translation id="8030852056903932865">Разрешить</translation>
<translation id="8032244173881942855">Невозможно транслировать вкладку</translation>
<translation id="8032569120109842252">Вы подписаны</translation>
<translation id="8033023935541439900">Меню диакритических знаков открыто. С помощью клавиш со стрелками влево и вправо выберите символ, а потом нажмите Ввод, чтобы вставить его.</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_sk.xtb b/chromium/chrome/app/resources/generated_resources_sk.xtb
index 040a16ef6dd..fd2c2a690e6 100644
--- a/chromium/chrome/app/resources/generated_resources_sk.xtb
+++ b/chromium/chrome/app/resources/generated_resources_sk.xtb
@@ -1634,7 +1634,7 @@ Ak chcete spravovať nastavenia tohto účtu, nainštalujte si do zariadenia apl
<translation id="2408955596600435184">Zadajte kód PIN</translation>
<translation id="2409268599591722235">Poďme na to</translation>
<translation id="2409709393952490731">Použiť telefón alebo tablet</translation>
-<translation id="2410079346590497630">podrobnosti o zostave</translation>
+<translation id="2410079346590497630">Podrobnosti o zostave</translation>
<translation id="2410298923485357543">Keď je zariadenie online, používajte prirodzený hlas</translation>
<translation id="2410754283952462441">Výber účtu</translation>
<translation id="241082044617551207">Neznámy doplnok</translation>
@@ -5941,7 +5941,7 @@ Tejto akcii môžete prideliť viacero prepínačov.</translation>
<translation id="6349101878882523185">Inštalovať aplikáciu <ph name="APP_NAME" /></translation>
<translation id="6354918092619878358">Eliptická krivka SECG secp256r1 (známa tiež ako ANSI X9.62 prime256v1, NIST P-256)</translation>
<translation id="635609604405270300">Ponechajte zariadenie zapnuté</translation>
-<translation id="63566973648609420">Šifrované údaje môže čítať iba používateľ s prístupovou frázou. Prístupová fráza sa do Googlu neodosiela a Google ju ani neukladá. Ak zabudnete prístupovú frázu alebo budete chcieť zmeniť toto nastavenie zmeniť, musíte <ph name="BEGIN_LINK" />resetovať synchronizáciu<ph name="END_LINK" />.</translation>
+<translation id="63566973648609420">Šifrované údaje môže čítať iba používateľ s prístupovou frázou. Prístupová fráza sa do Googlu neodosiela a Google ju ani neukladá. Ak zabudnete prístupovú frázu alebo budete chcieť toto nastavenie zmeniť, musíte <ph name="BEGIN_LINK" />resetovať synchronizáciu<ph name="END_LINK" />.</translation>
<translation id="6357305427698525450">Niektoré podporované odkazy sa budú stále otvárať v aplikácii <ph name="APP_NAME" /> alebo <ph name="APP_NAME_2" />.</translation>
<translation id="6357794994761110294">Web <ph name="SITE_NAME" /> nemajú povolené čítať ani meniť žiadne rozšírenia</translation>
<translation id="6358884629796491903">Drak</translation>
@@ -8483,7 +8483,7 @@ Súbor kľúča uložte na bezpečné miesto. Budete ho potrebovať na vytvoreni
<translation id="8655972064210167941">Prihlásenie zlyhalo, pretože sa heslo nepodarilo overiť. Kontaktujte svojho správcu alebo to skúste znova.</translation>
<translation id="8657393004602556571">Chcete spätnú väzbu zahodiť?</translation>
<translation id="8661290697478713397">Otvoriť odkaz v okne inko&amp;gnito</translation>
-<translation id="8662671328352114214">Pridanie sa k sieti <ph name="TYPE" /></translation>
+<translation id="8662671328352114214">Pripojenie k sieti <ph name="TYPE" /></translation>
<translation id="8662733268723715832">Trvá to dlhšie, ako sa očakávalo. Môžete preskočiť alebo čakať na dokončenie.</translation>
<translation id="8662795692588422978">Osoby</translation>
<translation id="8662811608048051533">Odhlási vás z väčšiny webov.</translation>
@@ -8514,7 +8514,7 @@ Súbor kľúča uložte na bezpečné miesto. Budete ho potrebovať na vytvoreni
<translation id="8676770494376880701">Pripojila sa nabíjačka s nízkym výkonom</translation>
<translation id="8677212948402625567">Zbaliť všetky...</translation>
<translation id="8678378565142776698">Reštartovať a dostávať automatické aktualizácie</translation>
-<translation id="8678538439778360739">Údaje boli o <ph name="TIME" /> šifrované pomocou vašej prístupovej frázy synchronizácie. Nezahŕňa to spôsoby platby ani adresy zo služby Google Pay.</translation>
+<translation id="8678538439778360739">Údaje boli <ph name="TIME" /> šifrované pomocou vašej prístupovej frázy synchronizácie. Nezahŕňa to spôsoby platby ani adresy zo služby Google Pay.</translation>
<translation id="8678582529642151449">Karty sa nezmenšia</translation>
<translation id="8678933587484842200">Ako sa má táto aplikácia spúšťať?</translation>
<translation id="8680251145628383637">Prihláste sa a používajte svoje záložky, históriu, heslá a ďalšie nastavenia vo všetkých svojich zariadeniach. Navyše sa tak automaticky prihlásite do služieb Googlu.</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_sl.xtb b/chromium/chrome/app/resources/generated_resources_sl.xtb
index 6c88e8f94f5..5eb536b24c3 100644
--- a/chromium/chrome/app/resources/generated_resources_sl.xtb
+++ b/chromium/chrome/app/resources/generated_resources_sl.xtb
@@ -4344,7 +4344,7 @@ Za pomanjšavo pritisnite Ctrl + Alt + tipko za zmanjšanje svetlosti.</translat
<translation id="4849286518551984791">Usklajen univerzalni čas (UTC/GMT)</translation>
<translation id="4849517651082200438">Ne namesti</translation>
<translation id="485053257961878904">Sinhroniziranja obvestil ni bilo mogoče nastaviti</translation>
-<translation id="4850886885716139402">Pogled</translation>
+<translation id="4850886885716139402">Prikaži</translation>
<translation id="485088796993065002">Spletna mesta lahko predvajajo zvok, da zagotovijo zvočni ton za glasbo, videoposnetke in drugo predstavnost.</translation>
<translation id="4852916668365817106">Barva kazalca</translation>
<translation id="4853020600495124913">Odpri v &amp;novem oknu</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_sq.xtb b/chromium/chrome/app/resources/generated_resources_sq.xtb
index 0c8caa613d2..f3445bc8065 100644
--- a/chromium/chrome/app/resources/generated_resources_sq.xtb
+++ b/chromium/chrome/app/resources/generated_resources_sq.xtb
@@ -74,7 +74,7 @@
<translation id="1061904396131502319">Pothuajse koha për një pushim</translation>
<translation id="1062628064301375934">Na ndihmo të krijojmë një ueb më privat</translation>
<translation id="1067048845568873861">U krijua</translation>
-<translation id="1067661089446014701">Për siguri shtesë, mund t'i enkriptosh fjalëkalimet në pajisjen tënde para se të ruhen në "Llogarinë tënde të Google".</translation>
+<translation id="1067661089446014701">Për më shumë siguri, mund t'i enkriptosh fjalëkalimet në pajisjen tënde para se të ruhen në "Llogarinë tënde të Google".</translation>
<translation id="1067922213147265141">Shërbime e tjera të Google</translation>
<translation id="106814709658156573">Për të konfiguruar gjurmën e gishtit, vëre fëmijën tënd të prekë sensorin e gjurmës së gishtit në këndin poshtë majtas të tastierës. Të dhënat e gjurmës së gishtit të fëmijës tënd ruhen në mënyrë të sigurt dhe nuk largohen kurrë nga kjo pajisje <ph name="DEVICE_TYPE" />.</translation>
<translation id="1069104208554708737">Ky çelës kalimi do të ruhet vetëm në këtë pajisje</translation>
@@ -4316,7 +4316,7 @@ Përdor Ctrl + Alt + "Ul ndriçimin" për ta zvogëluar.</translation>
<translation id="4842976633412754305">Kjo faqe po përpiqet të ngarkojë skripte nga burime të paverifikuara.</translation>
<translation id="4844333629810439236">Tastiera të tjera</translation>
<translation id="484462545196658690">Automatike</translation>
-<translation id="4844633725025837809">Për siguri shtesë, enkripto fjalëkalimet në pajisjen tënde para se të ruhen në "Menaxherin e fjalëkalimeve të Google"</translation>
+<translation id="4844633725025837809">Për më shumë siguri, enkripto fjalëkalimet në pajisjen tënde para se të ruhen në "Menaxherin e fjalëkalimeve të Google"</translation>
<translation id="4846628405149428620">Zgjidh se ku mund t'i ruajë ndryshimet ky sajt</translation>
<translation id="4846680374085650406">Po ndjek rekomandimin e administratorit për këtë cilësim.</translation>
<translation id="4848191975108266266">"Ok Google" e "Asistentit të Google"</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_sr-Latn.xtb b/chromium/chrome/app/resources/generated_resources_sr-Latn.xtb
index 4481752789f..0fcccc8f871 100644
--- a/chromium/chrome/app/resources/generated_resources_sr-Latn.xtb
+++ b/chromium/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -1195,7 +1195,7 @@ Možete da upravljate podešavanjima ovog naloga ako instalirate aplikaciju Fami
<translation id="2048554637254265991">Greška pri pokretanju menadžera kontejnera. Probajte ponovo.</translation>
<translation id="2048653237708779538">Radnja nije dostupna</translation>
<translation id="204914487372604757">Napravi prečicu</translation>
-<translation id="2050339315714019657">Vertikalno</translation>
+<translation id="2050339315714019657">Portret</translation>
<translation id="2051555741181591333">Automatski onemogući hotspot</translation>
<translation id="2052572566310583903">Instalirano na drugim uređajima</translation>
<translation id="2053105195397337973">Istražujemo načine da ograničimo praćenje i istovremeno omogućimo sajtovima da zaustave nepoželjne oglase i prevare.</translation>
@@ -3765,7 +3765,7 @@ Možete da upravljate podešavanjima ovog naloga ako instalirate aplikaciju Fami
<translation id="4348766275249686434">Prikupljaj greške</translation>
<translation id="4349828822184870497">Korisno</translation>
<translation id="4350230709416545141">Uvek blokiraj pristup lokaciji za <ph name="HOST" /></translation>
-<translation id="4350782034419308508">Ok Google</translation>
+<translation id="4350782034419308508">Hej Google</translation>
<translation id="4351770750390404505"><ph name="BEGIN_PARAGRAPH1" />Da bi pružio najbolji doživljaj, <ph name="DEVICE_OS" /> prikuplja podatke o hardveru sa uređaja i deli ih sa Google-om da bi utvrdio koja ažuriranja treba da pruži. Možete opcionalno da dozvolite Google-u da koristi te podatke u dodatne svrhe poput podrške i poboljšanja za <ph name="DEVICE_OS" /> doživljaj i uslugu.<ph name="END_PARAGRAPH1" />
<ph name="BEGIN_PARAGRAPH2" />Možete da se prijavite na ovom uređaju i posetite odeljak CHROMEOSFLEX_HARDWARE_INFO na chrome://system da biste videli podatke koji se šalju Google-u radi filtriranja ažuriranja, kao i sve druge slučajeve u kojima odlučujete da delite podatke sa Google-om.<ph name="END_PARAGRAPH2" />
<ph name="BEGIN_PARAGRAPH3" />Više detalja o podacima koje <ph name="DEVICE_OS" /> može da deli sa Google-om, kao i o tome kako se oni koriste, potražite na g.co/flex/HWDataCollection.<ph name="END_PARAGRAPH3" /></translation>
@@ -6491,7 +6491,7 @@ Imate još # ugroženih lozinki. Google menadžer lozinki preporučuje da odmah
<translation id="6842749380892715807">XML liste sajtova su poslednji put preuzete: <ph name="LAST_DATE_DOWNLOAD" />.</translation>
<translation id="6842868554183332230">Sajtovi obično otkrivaju kada aktivno koristite uređaj radi podešavanja dostupnosti u aplikacijama za ćaskanje</translation>
<translation id="6843264316370513305">Otklanjanje grešaka na mreži</translation>
-<translation id="6843423766595476978">Opcija Ok Google je spremna</translation>
+<translation id="6843423766595476978">Opcija Hej Google je spremna</translation>
<translation id="6845038076637626672">Otvori uvećano</translation>
<translation id="6845231585063669905">Od A do Z</translation>
<translation id="6846178040388691741"><ph name="EXTENSION_NAME" /> želi da štampa <ph name="FILE_NAME" /> pomoću štampača <ph name="PRINTER_NAME" />.</translation>
@@ -6584,7 +6584,7 @@ Imate još # ugroženih lozinki. Google menadžer lozinki preporučuje da odmah
<translation id="6923633482430812883">Greška pri učitavanju deljene datoteke. Proverite da li server datoteka sa kojim se povezujete podržava SMBv2 ili noviju verziju.</translation>
<translation id="6925127338315966709">Dodajete profil kojim se upravlja u ovaj pregledač. Administrator ima kontrolu nad profilom i može da pristupa njegovim podacima. Obeleživači, istorija, lozinke i druga podešavanja mogu da se sinhronizuju sa nalogom i administrator može da upravlja njima.</translation>
<translation id="6929126689972602640">Roditeljski nadzor nije podržan za naloge za školu. Da biste dodali nalog za školu koji omogućava pristup Google učionici i drugim veb-sajtovima za školske zadatke kod kuće, prvo se prijavite pomoću detetovog ličnog naloga. Nalog za školu možete da dodate kasnije tokom podešavanja.</translation>
-<translation id="6929760895658557216">Ok Google</translation>
+<translation id="6929760895658557216">Hej Google</translation>
<translation id="6930036377490597025">Eksterni bezbednosni ključ ili ugrađeni senzor</translation>
<translation id="6930161297841867798">{NUM_EXTENSIONS,plural, =1{Dodatak je odbijen}one{# dodatak je odbijen}few{# dodatka su odbijena}other{# dodataka je odbijeno}}</translation>
<translation id="6931690462168617033">Jačina klika</translation>
@@ -7019,7 +7019,7 @@ Imate još # ugroženih lozinki. Google menadžer lozinki preporučuje da odmah
<translation id="7347943691222276892">Kliknite da biste napustili podstranicu <ph name="SUBPAGE_TITLE" />.</translation>
<translation id="7348093485538360975">Tastatura na ekranu</translation>
<translation id="7349010927677336670">Kvalitet reprodukcije video snimka</translation>
-<translation id="7352651011704765696">Nešto nije u redu</translation>
+<translation id="7352651011704765696">Došlo je do greške</translation>
<translation id="7353261921908507769">Kontakti mogu da dele sa vama kada su u blizini. Prenosi neće započeti dok ne prihvatite.</translation>
<translation id="735361434055555355">Instalira se Linux...</translation>
<translation id="7354120289251608189">Sada možete da pređete na nov izgledu u bilo kom trenutku.</translation>
@@ -7179,7 +7179,7 @@ Imate još # ugroženih lozinki. Google menadžer lozinki preporučuje da odmah
<translation id="7478658909253570368">Ne dozvoljavaj sajtovima da se povezuju sa serijskim portovima</translation>
<translation id="7479221278376295180">Pregled korišćenja memorijskog prostora</translation>
<translation id="747981547666531654">Povezani ste sa Bluetooth uređajima pod nazivom <ph name="FIRST_DEVICE" /> i <ph name="SECOND_DEVICE" /></translation>
-<translation id="7481312909269577407">Prosledi</translation>
+<translation id="7481312909269577407">Napred</translation>
<translation id="7481358317100446445">Spremno</translation>
<translation id="748138892655239008">Osnovna ograničenja sertifikata</translation>
<translation id="7484645889979462775">Nikad za ovaj sajt</translation>
@@ -7537,7 +7537,7 @@ Pritisnite dodeljeni prekidač ili taster da biste uklonili dodelu.</translation
<ph name="EXTENSION_NAME" /></translation>
<translation id="7789963078219276159">Pozadina početne stranice je promenjena u: <ph name="CATEGORY" />.</translation>
<translation id="7791543448312431591">Dodaj</translation>
-<translation id="7792012425874949788">Nešto nije u redu sa prijavljivanjem</translation>
+<translation id="7792012425874949788">Došlo je do greške sa prijavljivanjem</translation>
<translation id="7792388396321542707">Zaustavi deljenje</translation>
<translation id="779308894558717334">Svetlozelena</translation>
<translation id="7793098747275782155">Tamnoplava</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_sr.xtb b/chromium/chrome/app/resources/generated_resources_sr.xtb
index f38e6a6cd23..60d5536b05c 100644
--- a/chromium/chrome/app/resources/generated_resources_sr.xtb
+++ b/chromium/chrome/app/resources/generated_resources_sr.xtb
@@ -1195,7 +1195,7 @@
<translation id="2048554637254265991">Грешка при покретању менаџера контејнера. Пробајте поново.</translation>
<translation id="2048653237708779538">Радња није доступна</translation>
<translation id="204914487372604757">Направи пречицу</translation>
-<translation id="2050339315714019657">Вертикално</translation>
+<translation id="2050339315714019657">Портрет</translation>
<translation id="2051555741181591333">Аутоматски онемогући хотспот</translation>
<translation id="2052572566310583903">Инсталирано на другим уређајима</translation>
<translation id="2053105195397337973">Истражујемо начине да ограничимо праћење и истовремено омогућимо сајтовима да зауставе непожељне огласе и преваре.</translation>
@@ -3765,7 +3765,7 @@
<translation id="4348766275249686434">Прикупљај грешке</translation>
<translation id="4349828822184870497">Корисно</translation>
<translation id="4350230709416545141">Увек блокирај приступ локацији за <ph name="HOST" /></translation>
-<translation id="4350782034419308508">Ок Google</translation>
+<translation id="4350782034419308508">Хеј Google</translation>
<translation id="4351770750390404505"><ph name="BEGIN_PARAGRAPH1" />Да би пружио најбољи доживљај, <ph name="DEVICE_OS" /> прикупља податке о хардверу са уређаја и дели их са Google-ом да би утврдио која ажурирања треба да пружи. Можете опционално да дозволите Google-у да користи те податке у додатне сврхе попут подршке и побољшања за <ph name="DEVICE_OS" /> доживљај и услугу.<ph name="END_PARAGRAPH1" />
<ph name="BEGIN_PARAGRAPH2" />Можете да се пријавите на овом уређају и посетите одељак CHROMEOSFLEX_HARDWARE_INFO на chrome://system да бисте видели податке који се шаљу Google-у ради филтрирања ажурирања, као и све друге случајеве у којима одлучујете да делите податке са Google-ом.<ph name="END_PARAGRAPH2" />
<ph name="BEGIN_PARAGRAPH3" />Више детаља о подацима које <ph name="DEVICE_OS" /> може да дели са Google-ом, као и о томе како се они користе, потражите на g.co/flex/HWDataCollection.<ph name="END_PARAGRAPH3" /></translation>
@@ -6491,7 +6491,7 @@
<translation id="6842749380892715807">XML листе сајтова су последњи пут преузете: <ph name="LAST_DATE_DOWNLOAD" />.</translation>
<translation id="6842868554183332230">Сајтови обично откривају када активно користите уређај ради подешавања доступности у апликацијама за ћаскање</translation>
<translation id="6843264316370513305">Отклањање грешака на мрежи</translation>
-<translation id="6843423766595476978">Опција Ок Google је спремна</translation>
+<translation id="6843423766595476978">Опција Хеј Google је спремна</translation>
<translation id="6845038076637626672">Отвори увећано</translation>
<translation id="6845231585063669905">Од А до Z</translation>
<translation id="6846178040388691741"><ph name="EXTENSION_NAME" /> жели да штампа <ph name="FILE_NAME" /> помоћу штампача <ph name="PRINTER_NAME" />.</translation>
@@ -6584,7 +6584,7 @@
<translation id="6923633482430812883">Грешка при учитавању дељене датотеке. Проверите да ли сервер датотека са којим се повезујете подржава SMBv2 или новију верзију.</translation>
<translation id="6925127338315966709">Додајете профил којим се управља у овај прегледач. Администратор има контролу над профилом и може да приступа његовим подацима. Обележивачи, историја, лозинке и друга подешавања могу да се синхронизују са налогом и администратор може да управља њима.</translation>
<translation id="6929126689972602640">Родитељски надзор није подржан за налоге за школу. Да бисте додали налог за школу који омогућава приступ Google учионици и другим веб-сајтовима за школске задатке код куће, прво се пријавите помоћу дететовог личног налога. Налог за школу можете да додате касније током подешавања.</translation>
-<translation id="6929760895658557216">Ок Google</translation>
+<translation id="6929760895658557216">Хеј Google</translation>
<translation id="6930036377490597025">Екстерни безбедносни кључ или уграђени сензор</translation>
<translation id="6930161297841867798">{NUM_EXTENSIONS,plural, =1{Додатак је одбијен}one{# додатак је одбијен}few{# додатка су одбијена}other{# додатака је одбијено}}</translation>
<translation id="6931690462168617033">Јачина клика</translation>
@@ -7019,7 +7019,7 @@
<translation id="7347943691222276892">Кликните да бисте напустили подстраницу <ph name="SUBPAGE_TITLE" />.</translation>
<translation id="7348093485538360975">Тастатура на екрану</translation>
<translation id="7349010927677336670">Квалитет репродукције видео снимка</translation>
-<translation id="7352651011704765696">Нешто није у реду</translation>
+<translation id="7352651011704765696">Дошло је до грешке</translation>
<translation id="7353261921908507769">Контакти могу да деле са вама када су у близини. Преноси неће започети док не прихватите.</translation>
<translation id="735361434055555355">Инсталира се Linux...</translation>
<translation id="7354120289251608189">Сада можете да пређете на нов изгледу у било ком тренутку.</translation>
@@ -7179,7 +7179,7 @@
<translation id="7478658909253570368">Не дозвољавај сајтовима да се повезују са серијским портовима</translation>
<translation id="7479221278376295180">Преглед коришћења меморијског простора</translation>
<translation id="747981547666531654">Повезани сте са Bluetooth уређајима под називом <ph name="FIRST_DEVICE" /> и <ph name="SECOND_DEVICE" /></translation>
-<translation id="7481312909269577407">Проследи</translation>
+<translation id="7481312909269577407">Напред</translation>
<translation id="7481358317100446445">Спремно</translation>
<translation id="748138892655239008">Основна ограничења сертификата</translation>
<translation id="7484645889979462775">Никад за овај сајт</translation>
@@ -7537,7 +7537,7 @@
<ph name="EXTENSION_NAME" /></translation>
<translation id="7789963078219276159">Позадина почетне странице је промењена у: <ph name="CATEGORY" />.</translation>
<translation id="7791543448312431591">Додај</translation>
-<translation id="7792012425874949788">Нешто није у реду са пријављивањем</translation>
+<translation id="7792012425874949788">Дошло је до грешке са пријављивањем</translation>
<translation id="7792388396321542707">Заустави дељење</translation>
<translation id="779308894558717334">Светлозелена</translation>
<translation id="7793098747275782155">Тамноплава</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_sv.xtb b/chromium/chrome/app/resources/generated_resources_sv.xtb
index 13544488e4f..a85f2348a3d 100644
--- a/chromium/chrome/app/resources/generated_resources_sv.xtb
+++ b/chromium/chrome/app/resources/generated_resources_sv.xtb
@@ -1208,7 +1208,7 @@ Du kan hantera inställningarna för det här kontot genom att installera Family
<translation id="2048554637254265991">Ett fel uppstod när hanteraren av behållare skulle startas. Försök igen.</translation>
<translation id="2048653237708779538">Åtgärden är inte tillgänglig</translation>
<translation id="204914487372604757">Skapa genväg</translation>
-<translation id="2050339315714019657">Stående</translation>
+<translation id="2050339315714019657">Porträtt</translation>
<translation id="2051555741181591333">Inaktivera surfzon automatiskt</translation>
<translation id="2052572566310583903">Installerade på dina andra enheter</translation>
<translation id="2053105195397337973">Vi utforskar nya sätt att begränsa spårning samtidigt som webbplatser kan motverka spam och bedrägeri.</translation>
@@ -1319,7 +1319,7 @@ Du kan hantera inställningarna för det här kontot genom att installera Family
<translation id="2136476978468204130">Den angivna lösenfrasen är felaktig</translation>
<translation id="2137128126782078222">Tillåt inte aviseringar från <ph name="WEBSITE" /></translation>
<translation id="2139919072249842737">Konfigureringsknapp</translation>
-<translation id="2140788884185208305">Batterinivå</translation>
+<translation id="2140788884185208305">Batterihälsa</translation>
<translation id="2140902257485550046">Välj att blockera alla tillägg på webbplatsen</translation>
<translation id="2142328300403846845">Öppna länk som</translation>
<translation id="2142582065325732898">Aktivera <ph name="LINK1_BEGIN" />Chrome Sync<ph name="LINK1_END" /> för att se de senaste flikarna i Chrome. <ph name="LINK2_BEGIN" />Läs mer<ph name="LINK2_END" /></translation>
@@ -3263,7 +3263,7 @@ Du kan hantera inställningarna för det här kontot genom att installera Family
<translation id="3855676282923585394">Importera bokmärken och inställningar...</translation>
<translation id="3856096718352044181">Verifiera att detta är en giltig leverantör eller försök igen senare</translation>
<translation id="3856800405688283469">Välj tidszon</translation>
-<translation id="3857807444929313943">Lyft och tryck sedan igen</translation>
+<translation id="3857807444929313943">Lyft och nudda sedan igen</translation>
<translation id="3858860766373142691">Namn</translation>
<translation id="385939467708172187">Använd ett starkt lösenord</translation>
<translation id="3861638017150647085">Användarnamnet <ph name="USERNAME" /> är inte tillgängligt</translation>
@@ -3510,7 +3510,7 @@ Du kan hantera inställningarna för det här kontot genom att installera Family
<translation id="4077919383365622693">All data och alla cookies som sparats av <ph name="SITE" /> raderas.</translation>
<translation id="4078738236287221428">Alltid</translation>
<translation id="4079140982534148664">Använd förbättrad stavningskontroll</translation>
-<translation id="4084682180776658562">Infoga bokmärke</translation>
+<translation id="4084682180776658562">Lägg till bokmärke</translation>
<translation id="4084835346725913160">Stäng <ph name="TAB_NAME" /></translation>
<translation id="4085298594534903246">JavaScript är blockerat på den här sidan.</translation>
<translation id="4087089424473531098">Skapade tillägget:
diff --git a/chromium/chrome/app/resources/generated_resources_sw.xtb b/chromium/chrome/app/resources/generated_resources_sw.xtb
index 7c5cdf56d23..bd6617f753a 100644
--- a/chromium/chrome/app/resources/generated_resources_sw.xtb
+++ b/chromium/chrome/app/resources/generated_resources_sw.xtb
@@ -3797,7 +3797,7 @@ Ungependa kuanza <ph name="CONTROL_PANEL_APPLET_NAME" />?</translation>
<translation id="4366138410738374926">Imeanza kuchapisha</translation>
<translation id="4367513928820380646">Kagua ruhusa zilizoondolewa</translation>
<translation id="4369215744064167350">Ombi la tovuti limeidhinishwa</translation>
-<translation id="4369735607080757018">Baadhi ya data zinashirikiwa kati ya tovuti ili kupima ufanisi wa matangazo yao, kama vile wakati wa siku ambapo ulionyeshwa tangazo</translation>
+<translation id="4369735607080757018">Baadhi ya data hushirikiwa kati ya tovuti ili kupima ufanisi wa matangazo, kama vile wakati wa siku ambapo ulionyeshwa tangazo</translation>
<translation id="4370975561335139969">Anwani ya barua pepe na nenosiri uliloweka havilingani</translation>
<translation id="4374805630006466253">Tumia simu au kompyuta kibao nyingine</translation>
<translation id="4374831787438678295">Kisakinishaji cha Linux</translation>
@@ -5447,7 +5447,7 @@ Unaweza kukabidhi kitendo hiki swichi nyingi.</translation>
<translation id="5889282057229379085">Upeo wa idadi ya mamlaka ya kati ya cheti: <ph name="NUM_INTERMEDIATE_CA" /></translation>
<translation id="5889629805140803638">Simba data iliyosawazishwa kwa njia fiche ukitumia <ph name="BEGIN_LINK" />kauli yako ya siri ya usawazishaji<ph name="END_LINK" />. Njia za kulipa na anwani kutoka Google Pay hazitasimbwa kwa njia fiche. Historia ya kuvinjari kutoka Chrome haitasawazishwa.</translation>
<translation id="5891688036610113830">Mitandao ya Wi-Fi inayopendelewa</translation>
-<translation id="5895138241574237353">Zzima na uwashe</translation>
+<translation id="5895138241574237353">Zima na uwashe</translation>
<translation id="5895335062901455404">Mapendeleo na shughuli ulizohifadhi zitakuwa tayari kwenye kifaa chochote kinachotumia ChromeOS Flex ukiingia kwa kutumia Akaunti yako ya Google. Unaweza kuchagua unachotaka kusawazisha katika Mipangilio.</translation>
<translation id="589541317545606110">Tafuta Ukurasa ukitumia <ph name="VISUAL_SEARCH_PROVIDER" /></translation>
<translation id="5896436821193322561">Usiruhusu</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_ta.xtb b/chromium/chrome/app/resources/generated_resources_ta.xtb
index cef42e2772b..0bcec2a030a 100644
--- a/chromium/chrome/app/resources/generated_resources_ta.xtb
+++ b/chromium/chrome/app/resources/generated_resources_ta.xtb
@@ -5823,7 +5823,7 @@
<translation id="6227002569366039565">இந்தக் குமிழை ஃபோகஸ் செய்ய, |<ph name="ACCELERATOR" />| அழுத்தவும். குமிழ் சுட்டிக்காட்டுவதை ஃபோகஸ் செய்ய அதை மீண்டும் அழுத்தவும்.</translation>
<translation id="6227280783235722609">நீட்டிப்பு</translation>
<translation id="6229849828796482487">வைஃபை நெட்வொர்க்கைத் துண்டி</translation>
-<translation id="6230165830166519105">வேறு வழியில் முயல்க</translation>
+<translation id="6230165830166519105">வேறு வழியில் முயற்சிக்கவும்</translation>
<translation id="6231782223312638214">பரிந்துரைக்கப்படுவது</translation>
<translation id="6231881193380278751">பக்கத்தைத் தானாகப் புதுப்பிக்க, URL இல் வினவல் அளவுருவைச் சேர்க்கவும்: chrome://device-log/?refresh=&lt;sec&gt;</translation>
<translation id="6232017090690406397">பேட்டரி</translation>
@@ -5932,7 +5932,7 @@
<translation id="6322559670748154781">பொதுவாக இந்த ஃபைல் பதிவிறக்கப்படுவதில்லை மற்றும் 'மேம்பட்ட பாதுகாப்பு' அம்சத்தின் மூலம் இது தடுக்கப்பட்டுள்ளது</translation>
<translation id="6324916366299863871">ஷார்ட்கட்டைத் திருத்து</translation>
<translation id="6325191661371220117">தானியங்கு துவக்கியை முடக்கு</translation>
-<translation id="6326175484149238433">Chrome இலிருந்து அகற்று</translation>
+<translation id="6326175484149238433">Chromeமிலிருந்து அகற்று</translation>
<translation id="6326855256003666642">கீப்அலைவ் கவுண்ட்</translation>
<translation id="6327785803543103246">இணைய ப்ராக்ஸியைத் தானாகக் கண்டறி</translation>
<translation id="6331818708794917058">MIDI சாதனங்களுடன் தளங்கள் இணைய முயலும்போது அனுமதி கேள்</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_te.xtb b/chromium/chrome/app/resources/generated_resources_te.xtb
index 99ab9167404..ac439eaa756 100644
--- a/chromium/chrome/app/resources/generated_resources_te.xtb
+++ b/chromium/chrome/app/resources/generated_resources_te.xtb
@@ -105,7 +105,7 @@
<ph name="GOOGLE_PASSWORD_MANAGER" />‌లో మీ పాస్‌వర్డ్‌లను ఎప్పుడైనా చెక్ చేసుకోండి.</translation>
<translation id="1084824384139382525">లింక్ చిరు&amp;నామాను కాపీ చేయి</translation>
<translation id="1085064499066015002">ఎల్లప్పుడూ అన్ని సైట్‌లలో అనుమతించండి</translation>
-<translation id="1085697365578766383">వర్చువల్ మెషిన్‌ను ప్రారంభించడంలో ఎర్రర్ ఏర్పడింది. దయచేసి మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="1085697365578766383">వర్చువల్ మెషిన్‌ను ప్రారంభించడంలో ఎర్రర్ ఏర్పడింది. దయచేసి మళ్లీ ట్రై చేయండి.</translation>
<translation id="1087965115100412394">MIDI పరికరాలను కనెక్ట్ చేయడానికి సైట్‌లను అనుమతించకండి</translation>
<translation id="1088659085457112967">రీడర్ మోడ్‌లోకి ఎంటర్ అవ్వండి</translation>
<translation id="1090126737595388931">నేపథ్య యాప్‌లు ఏవి అమలులో లేవు</translation>
@@ -238,7 +238,7 @@
<translation id="119944043368869598">అన్ని క్లియర్ చేయండి</translation>
<translation id="1199814941632954229">ఈ సర్టిఫికెట్ ప్రొఫైల్‌లకు సర్టిఫికెట్‌లు అందించబడుతాయి</translation>
<translation id="120069043972472860">చూడదగినది కాదు</translation>
-<translation id="1201402288615127009">తరువాత</translation>
+<translation id="1201402288615127009">తర్వాత</translation>
<translation id="1201564082781748151">మీరు మీ పాస్‌వర్డ్‌ను మర్చిపోతే స్థానిక డేటాను రీస్టోర్ చేసుకోవచ్చు</translation>
<translation id="1202116106683864634">మీరు ఈ పాస్-కీని ఖచ్చితంగా తొలగించాలనుకుంటున్నారా?</translation>
<translation id="1202596434010270079">కియోస్క్ యాప్ అప్‌డేట్ చేయ‌బ‌డింది. దయచేసి USB స్టిక్‌ను తీసివేయండి.</translation>
@@ -364,7 +364,7 @@
<translation id="1319983966058170660"><ph name="SUBPAGE_TITLE" /> సబ్‌పేజీ 'వెనుకకు' బటన్</translation>
<translation id="1322046419516468189">మీ <ph name="SAVED_PASSWORDS_STORE" />లో సేవ్ చేసిన పాస్‌వర్డ్‌లను చూడండి మరియు నిర్వహించండి</translation>
<translation id="1324106254079708331">లక్షిత ఇంటర్నెట్ దాడులకు గురయ్యే అవకాశం ఉన్న ఎవరి వ్యక్తిగత Google ఖాతాలనైనా రక్షిస్తుంది</translation>
-<translation id="1327272175893960498">Kerberos టిక్కెట్‌లు</translation>
+<translation id="1327272175893960498">Kerberos టికెట్‌లు</translation>
<translation id="1327495825214193325">ADB డీబగ్గింగ్‌ను ఎనేబుల్ చేయడానికి, ఈ <ph name="DEVICE_TYPE" />ను తప్పనిసరిగా రీస్టార్ట్ చేయాలి. దీనిని డిజేబుల్ చేయాలంటే, ఫ్యాక్టరీ సెట్టింగ్‌లకు రీసెట్ చేయడం అవసరం అవుతుంది.</translation>
<translation id="1327527584824210101">మీ పాస్-కీని ఉపయోగించండి</translation>
<translation id="1327794256477341646">ఏ ఫీచర్‌లకు మీ లొకేషన్ అవసరం అవుతుందో అవి పని చేయవు</translation>
@@ -394,7 +394,7 @@
<translation id="1348966090521113558">మౌస్ యాక్సెసిబిలిటీ సెట్టింగ్‌లు</translation>
<translation id="1353275871123211385">యాప్ ఆమోదం, పరికర వినియోగ వ్యవధిపై పరిమితుల వంటి తల్లిదండ్రుల కంట్రోల్స్‌ను ఉపయోగించడానికి, చిన్నారి వద్ద తల్లి/తండ్రి ద్వారా మేనేజ్ చేయబడే Google ఖాతా ఉండాలి. Google Classroom వంటి టూల్స్‌కు స్కూల్ ఖాతాను తర్వాత జోడించవచ్చు.</translation>
<translation id="135389172849514421">ఆఫ్‌లైన్‌లో పని చేస్తుంది</translation>
-<translation id="1353980523955420967">PPDని కనుగొనడం సాధ్యం కాదు. మీ Chromebook ఇంటర్నెట్‌కు కనెక్ట్ అయ్యి ఉందని నిర్ధారించుకుని, ఆపై మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="1353980523955420967">PPDని కనుగొనడం సాధ్యం కాదు. మీ Chromebook ఇంటర్నెట్‌కు కనెక్ట్ అయ్యి ఉందని నిర్ధారించుకుని, ఆపై మళ్లీ ట్రై చేయండి.</translation>
<translation id="1354045473509304750">మీ కెమెరాను ఉపయోగించడానికి, తరలించడానికి <ph name="HOST" />ను అనుమతించడాన్ని కొనసాగించండి</translation>
<translation id="1355088139103479645">మొత్తం డేటాను తొలగించాలా?</translation>
<translation id="1358741672408003399">అక్షరక్రమం మరియు వ్యాకరణం</translation>
@@ -519,7 +519,7 @@
<translation id="1461041542809785877">పనితీరు</translation>
<translation id="1461177659295855031">బుక్‌మార్క్ బార్ ఫోల్డర్‌కు తరలించండి</translation>
<translation id="146219525117638703">ONC స్థితి</translation>
-<translation id="146220085323579959">ఇంటర్నెట్ డిస్‌కనెక్ట్ చేయబడింది. దయచేసి మీ ఇంటర్నెట్ కనెక్షన్‌ని చెక్ చేసి, మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="146220085323579959">ఇంటర్నెట్ డిస్‌కనెక్ట్ చేయబడింది. దయచేసి మీ ఇంటర్నెట్ కనెక్షన్‌ని చెక్ చేసి, మళ్లీ ట్రై చేయండి.</translation>
<translation id="1462850958694534228">చిహ్నానికి సంబంధించిన అప్‌డేట్‌ను రివ్యూ చేయండి</translation>
<translation id="1463112138205428654">అధునాతన రక్షణ ప్రోగ్రామ్ ద్వారా <ph name="FILE_NAME" /> బ్లాక్ చేయబడింది.</translation>
<translation id="1464044141348608623">మీరు మీ పరికరాన్ని యాక్టివ్‌గా ఉపయోగించే సమయాలను తెలుసుకోవడానికి సైట్‌లను అనుమతించకండి</translation>
@@ -707,7 +707,7 @@
<translation id="1618102204889321535"><ph name="CURRENT_CHARACTER_COUNT" />/<ph name="MAX_CHARACTER_COUNT" /></translation>
<translation id="1618268899808219593">స&amp;హాయ కేంద్రం</translation>
<translation id="1619879934359211038">Google Playకు కనెక్ట్ చేయడం సాధ్యపడలేదు. మీ నెట్‌వర్క్ కనెక్షన్‌ను చెక్ చేసి, మళ్లీ ట్రై చేయండి. ఎర్రర్ కోడ్: <ph name="ERROR_CODE" />.</translation>
-<translation id="1620307519959413822">పాస్‌వర్డ్ తప్పు. మళ్లీ ప్రయత్నించండి లేదా రీసెట్ చేయడానికి 'పాస్‌వర్డ్‌ను మర్చిపోయాను' క్లిక్ చేయండి.</translation>
+<translation id="1620307519959413822">పాస్‌వర్డ్ తప్పు. మళ్లీ ట్రై చేయండి లేదా రీసెట్ చేయడానికి 'పాస్‌వర్డ్‌ను మర్చిపోయాను' క్లిక్ చేయండి.</translation>
<translation id="1620510694547887537">కెమెరా</translation>
<translation id="1621382140075772850">టెక్స్ట్ టూల్</translation>
<translation id="1621485112342885423">మీ కార్ట్‌లు</translation>
@@ -882,7 +882,7 @@
<translation id="1766957085594317166">పాస్‌వర్డ్‌లను మీ Google ఖాతాలో సురక్షితంగా సేవ్ చేయండి, మీరు ఇంకెప్పుడూ మళ్లీ టైప్ చేయవలసిన అవసరం ఉండదు</translation>
<translation id="1767043563165955993">Android యాప్‌లతో ఉపయోగించండి</translation>
<translation id="1768212860412467516"><ph name="EXPERIMENT_NAME" /> కోసం ఫీడ్‌బ్యాక్‌ను పంపండి.</translation>
-<translation id="1768278914020124551">అయ్యో! లాగాన్ సర్వర్‌ను సంప్రదించడంలో సమస్య ఉంది. దయచేసి మీ నెట్‌వర్క్ కనెక్షన్‌ను మరియు డొమైన్ పేరును చెక్ చేసి, మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="1768278914020124551">అయ్యో! లాగాన్ సర్వర్‌ను సంప్రదించడంలో సమస్య ఉంది. దయచేసి మీ నెట్‌వర్క్ కనెక్షన్‌ను మరియు డొమైన్ పేరును చెక్ చేసి, మళ్లీ ట్రై చేయండి.</translation>
<translation id="1769104665586091481">లింక్‌ను కొత్త &amp;విండోలో తెరువు</translation>
<translation id="1770407692401984718">ఇమేజ్‌ను ఇక్కడకు లాగండి లేదా</translation>
<translation id="177053719077591686">Google Driveకు Android యాప్‌లను బ్యాకప్ చేయండి.</translation>
@@ -1024,7 +1024,7 @@
<translation id="1875386316419689002">HID పరికరానికి ఈ ట్యాబ్ కనెక్ట్ చేయబడింది.</translation>
<translation id="1875387611427697908">దీనిని <ph name="CHROME_WEB_STORE" /> నుండి మాత్రమే జోడించవచ్చు</translation>
<translation id="1877377290348678128">లేబుల్ (ఆప్షనల్)</translation>
-<translation id="1877520246462554164">ప్రమాణీకరణ టోకెన్‌ను పొందడం విఫలమైంది. దయచేసి సైన్ అవుట్ చేసి, సైన్ ఇన్ చేసిన తర్వాత మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="1877520246462554164">ప్రమాణీకరణ టోకెన్‌ను పొందడం విఫలమైంది. దయచేసి సైన్ అవుట్ చేసి, సైన్ ఇన్ చేసిన తర్వాత మళ్లీ ట్రై చేయండి.</translation>
<translation id="1877860345998737529">స్విచ్ చర్య కేటాయింపు</translation>
<translation id="1878155070920054810">అప్‌డేట్ పూర్తయ్యే లోపు మీ Chromebook పవర్ అయిపోయేటట్లు కనిపిస్తోంది. అంతరాయాన్ని నివారించడానికి ఇది సరిగ్గా ఛార్జింగ్ అవుతోందని నిర్ధారించుకోండి.</translation>
<translation id="1878885068166344708">మీరు ఐటెమ్‌పై ఫోకస్ చేసినప్పుడు, ఐటెమ్ హైలైట్ అవుతుంది. ఫోకస్‌ను మార్చడానికి ట్యాబ్‌ను నొక్కండి లేదా ఐటెమ్‌ను ఎంచుకోండి.</translation>
@@ -1108,7 +1108,7 @@
<translation id="1949849604471335579">వాల్‌పేపర్, స్క్రీన్ సేవర్, యాక్సెంట్ రంగులు, మరిన్నింటిని వ్యక్తిగతీకరించండి</translation>
<translation id="1951012854035635156">Assistant</translation>
<translation id="1954597385941141174">USB పరికరాలకు కనెక్ట్ అవ్వడం కోసం సైట్‌లు అడగగలవు</translation>
-<translation id="1954813140452229842">షేర్‌ను మౌంట్ చేయడంలో ఎర్రర్ ఏర్పడింది. దయచేసి మీ ఆధారాలను సరిచూసుకుని, మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="1954813140452229842">షేర్‌ను మౌంట్ చేయడంలో ఎర్రర్ ఏర్పడింది. దయచేసి మీ ఆధారాలను సరిచూసుకుని, మళ్లీ ట్రై చేయండి.</translation>
<translation id="1956050014111002555">ఫైల్ బహుళ ప్రమాణపత్రాలను కలిగి ఉంది, వీటిలో ఏది దిగుమతి చేయబడింది:</translation>
<translation id="1956167375087861299">సురక్షితమైన కంటెంట్‌ను ప్లే చేయడానికి, ఐడెంటిఫయర్‌‌లను ఉపయోగించడానికి అనుమతి లేదు</translation>
<translation id="1956390763342388273">ఇది "<ph name="FOLDER_PATH" />" నుండి అన్ని ఫైళ్లను అప్‌లోడ్ చేస్తుంది. మీరు సైట్‌ను విశ్వసిస్తే మాత్రమే దీనిని చేయండి.</translation>
@@ -1151,7 +1151,7 @@
<translation id="1995916364271252349">సైట్‌లు ఉపయోగించగల సమాచారాన్ని, అవి చూపగల కంటెంట్‌ను (లొకేషన్, కెమెరా, పాప్-అప్‌లు, మరిన్ని) నియంత్రిస్తుంది</translation>
<translation id="1997433994358798851">మీ పరికరానికి కనెక్ట్ చేయడానికి, బ్లూటూత్‌ను ఉపయోగించడానికి Chromeకు అనుమతి కావాలి</translation>
<translation id="1997616988432401742">మీ ప్రమాణపత్రాలు</translation>
-<translation id="1999115740519098545">ప్రారంభించిన తరువాత</translation>
+<translation id="1999115740519098545">ప్రారంభించిన తర్వాత</translation>
<translation id="2002109485265116295">నిజ-సమయం</translation>
<translation id="2003130567827682533">'<ph name="NAME" />' డేటాను యాక్టివేట్ చేయడానికి, ముందుగా ఒక Wi-Fi నెట్‌వర్క్‌కు కనెక్ట్ చేయండి</translation>
<translation id="2004697686368036666">కొన్ని సైట్‌లలోని ఫీచర్‌లు పని చేయకపోవచ్చు</translation>
@@ -1190,7 +1190,7 @@
మీ పరికరంలో Family Link యాప్ ఇన్‌స్టాల్ చేయడం ద్వారా మీరు ఈ ఖాతా సెట్టింగ్‌లను నిర్వహించవచ్చు. మీకు ఈమెయిల్‌లో సూచనలను పంపాము.</translation>
<translation id="2039464276165755892">వేరొకరిని గుర్తించినప్పుడు, నోటిఫికేషన్ కంటెంట్‌ను దాచండి</translation>
-<translation id="2040460856718599782">అయ్యో! మిమ్మల్ని ప్రామాణీకరించడానికి ప్రయత్నిస్తున్నప్పుడు ఏదో తప్పు జరిగింది. దయచేసి మీ సైన్-ఇన్ ప్రమాణాలను ఒకటికి రెండుసార్లు చెక్ చేసుకుని మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="2040460856718599782">అయ్యో! మిమ్మల్ని ప్రామాణీకరించడానికి ప్రయత్నిస్తున్నప్పుడు ఏదో తప్పు జరిగింది. దయచేసి మీ సైన్-ఇన్ ప్రమాణాలను ఒకటికి రెండుసార్లు చెక్ చేసుకుని మళ్లీ ట్రై చేయండి.</translation>
<translation id="2040894699575719559">లొకేషన్ బ్లాక్ చేయబడింది</translation>
<translation id="2042279886444479655">యాక్టివ్ ప్రొఫైళ్లు</translation>
<translation id="2044014337866019681">సెషన్‌ను అన్‌లాక్ చేయడానికి, మీరు <ph name="ACCOUNT" />ను వెరిఫై చేస్తున్నారని దయచేసి నిర్ధారించుకోండి.</translation>
@@ -1238,7 +1238,7 @@
<translation id="2081816110395725788">బ్యాటరీలో ఉన్నప్పుడు ఇన్‌యాక్టివ్ పవర్</translation>
<translation id="2082187087049518845">గ్రూప్ ట్యాబ్</translation>
<translation id="2082510809738716738">రూపం రంగును ఎంచుకోండి</translation>
-<translation id="208586643495776849">దయచేసి మళ్లీ ప్రయత్నించండి</translation>
+<translation id="208586643495776849">దయచేసి మళ్లీ ట్రై చేయండి</translation>
<translation id="208634871997892083">ఎల్లప్పుడూ ఆన్‌లో ఉండే VPN</translation>
<translation id="2087822576218954668">ముద్రణ: <ph name="PRINT_NAME" /></translation>
<translation id="2088092308059522196">మీరు <ph name="DEVICE_OS" />‌ను ఇన్‌స్టాల్ చేసిన తర్వాత మాత్రమే ఎన్‌రోల్‌మెంట్ సపోర్ట్ చేస్తుంది.</translation>
@@ -1362,7 +1362,7 @@
<translation id="2173302385160625112">మీ ఇంటర్నెట్ కనెక్షన్‌ను చెక్ చేయండి</translation>
<translation id="2173801458090845390">ఈ పరికరానికి రిక్వెస్ట్‌ IDని జోడించండి</translation>
<translation id="2175384018164129879">సెర్చ్ ఇంజిన్‌లను, సైట్ సెర్చ్‌ను &amp;మేనేజ్ చేయండి</translation>
-<translation id="217576141146192373">ప్రింటర్‌ను జోడించడం సాధ్యపడలేదు. దయచేసి మీ ప్రింటర్ కాన్ఫిగరేషన్ చెక్ చేసుకుని, ఆపై మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="217576141146192373">ప్రింటర్‌ను జోడించడం సాధ్యపడలేదు. దయచేసి మీ ప్రింటర్ కాన్ఫిగరేషన్ చెక్ చేసుకుని, ఆపై మళ్లీ ట్రై చేయండి.</translation>
<translation id="2175927920773552910">QR కోడ్</translation>
<translation id="2177950615300672361">అజ్ఞాత ట్యాబ్: <ph name="TAB_NAME" /></translation>
<translation id="2178585470774851578">మీరు ChromeOS Flex డీబగ్గింగ్ ఫీచర్‌లను ఎనేబుల్ చేస్తున్నారు, ఇది sshd daemonను సెటప్ చేస్తుంది అలాగే USB డిస్క్‌ల నుండి బూట్ చేయడాన్ని ఎనేబుల్ చేస్తుంది.</translation>
@@ -1402,7 +1402,7 @@
<translation id="2210462644007531147">ఇన్‌స్టాలేషన్‌ను పూర్తి చేయడం సాధ్యపడలేదు</translation>
<translation id="2212565012507486665">కుక్కీలను అనుమతించండి</translation>
<translation id="2214018885812055163">షేర్ చేసిన ఫోల్డర్‌లు</translation>
-<translation id="2214884991347062907">పాస్‌వర్డ్ తప్పు, మళ్లీ ప్రయత్నించండి</translation>
+<translation id="2214884991347062907">పాస్‌వర్డ్ తప్పు, మళ్లీ ట్రై చేయండి</translation>
<translation id="2214893006758804920">{LINE_COUNT,plural, =1{&lt;1 పంక్తి చూపబడలేదు&gt;}other{&lt;<ph name="NUMBER_OF_LINES" /> పంక్తులు చూపబడలేదు&gt;}}</translation>
<translation id="2218019600945559112">మౌస్ మరియు టచ్‌ప్యాడ్</translation>
<translation id="2218320521449013367">Chrome హానికరమైన సాఫ్ట్‌వేర్‌ను తీసివేస్తున్నప్పుడు ఎర్రర్ ఏర్పడింది</translation>
@@ -1562,7 +1562,7 @@
<translation id="2332115969598251205"><ph name="PRIMARY_EMAIL" />‌కు సేవ్ చేసిన పరికరాలను లోడ్ చేయడం సాధ్యం కాదు. మీ ఇంటర్నెట్ కనెక్షన్‌ను చెక్ చేసి, మళ్లీ ట్రై చేయండి.</translation>
<translation id="2332131598580221120">స్టోర్‌లో చూడండి</translation>
<translation id="2332515770639153015">మెరుగైన సురక్షిత బ్రౌజింగ్ ఆన్‌లో ఉంది</translation>
-<translation id="2332742915001411729">ఆటోమేటిక్ సెట్టింగ్‌కు రీసెట్ చేయి</translation>
+<translation id="2332742915001411729">ఆటోమేటిక్ సెట్టింగ్‌కు రీసెట్ చేయండి</translation>
<translation id="2332948465534020594">అంతరాయం కలిగించవద్దు ఎనేబుల్ చేయబడింది</translation>
<translation id="233471714539944337">గోప్యమైన కంటెంట్</translation>
<translation id="2335111415680198280">{0,plural, =1{# విండోను మూసివేయి}other{# విండోలను మూసివేయి}}</translation>
@@ -1663,12 +1663,12 @@
<translation id="2428510569851653187">ట్యాబ్ క్రాష్ అయిన సమయంలో మీరు ఏం చేస్తున్నారో వివరించండి</translation>
<translation id="2428939361789119025">Wi-Fiను ఆఫ్ చేయండి</translation>
<translation id="2428978615149723410">ఈ కార్ట్‌లు</translation>
-<translation id="2431027948063157455">Google Assistantను లోడ్ చేయడం సాధ్యపడలేదు, దయచేసి మీ నెట్‌వర్క్ కనెక్షన్‌ను చెక్ చేసుకుని మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="2431027948063157455">Google Assistantను లోడ్ చేయడం సాధ్యపడలేదు, దయచేసి మీ నెట్‌వర్క్ కనెక్షన్‌ను చెక్ చేసుకుని మళ్లీ ట్రై చేయండి.</translation>
<translation id="243179355394256322">మీ సంస్థ అధికారిక యూజర్‌లకు మాత్రమే పరికర నమోదును పరిమితం చేస్తుంది. ఈ యూజర్‌కు పరికరాలను ఎన్‌రోల్ చేసే అధికారం లేదు. దయచేసి అడ్మిన్ కన్సోల్ యూజర్‌ల విభాగంలోని యూజర్ "Google Meet హార్డ్‌వేర్‌ను ఎన్‌రోల్ చేయి" అడ్మినిస్ట్రేటర్ ప్రత్యేక హక్కును కలిగి ఉన్నారని నిర్ధారించుకోండి.</translation>
<translation id="2433452467737464329">పేజీని స్వీయ రీఫ్రెష్ చేయడానికి URLలో ప్రశ్న పరామితిని జోడించండి: chrome://network/?refresh=&lt;sec&gt;</translation>
<translation id="2433507940547922241">కనిపించే తీరు</translation>
<translation id="2433836460518180625">పరికరాన్ని మాత్రం అన్‌లాక్ చేయండి</translation>
-<translation id="2434449159125086437">ప్రింటర్‌ను సెటప్ చేయలేకపోయింది. దయచేసి కాన్ఫిగరేషన్‌ను సరిచూసుకుని, ఆపై మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="2434449159125086437">ప్రింటర్‌ను సెటప్ చేయలేకపోయింది. దయచేసి కాన్ఫిగరేషన్‌ను సరిచూసుకుని, ఆపై మళ్లీ ట్రై చేయండి.</translation>
<translation id="2434758125294431199">మీతో ఎవరు షేర్ చేయవచ్చో ఎంచుకోండి</translation>
<translation id="2434915728183570229">మీరు ఇప్పుడు మీ ఫోన్ యాప్‌లను చూడవచ్చు</translation>
<translation id="2435137177546457207">Google Chrome, ChromeOS Flexల అదనపు నియమాలు</translation>
@@ -1677,8 +1677,8 @@
<translation id="2439626940657133600"><ph name="WINDOW_TITLE" /> లోడ్ అవుతోంది</translation>
<translation id="2440604414813129000">&amp;సోర్స్‌ను చూడండి</translation>
<translation id="2440823041667407902">స్థాన యాక్సెస్</translation>
-<translation id="2441719842399509963">డిఫాల్ట్‌లకు రీసెట్ చేయి</translation>
-<translation id="244231003699905658">అడ్రస్‌ చెల్లదు. దయచేసి అడ్రస్‌ను చెక్ చేసి, ఆపై మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="2441719842399509963">డిఫాల్ట్‌లకు రీసెట్ చేయండి</translation>
+<translation id="244231003699905658">అడ్రస్‌ చెల్లదు. దయచేసి అడ్రస్‌ను చెక్ చేసి, ఆపై మళ్లీ ట్రై చేయండి.</translation>
<translation id="2442916515643169563">వచన నీడ</translation>
<translation id="2443487764245141020">ఐడెంటిఫయర్‌‌ను ఉపయోగించి సైట్‌లు మీ పరికరాన్ని గుర్తించాల్సిన అవసరం కూడా ఉంది</translation>
<translation id="244475495405467108">ఎడమ వైపునకు ట్యాబ్‌లను మూసివేయండి</translation>
@@ -1763,7 +1763,7 @@
<translation id="2505402373176859469"><ph name="TOTAL_SIZE" />లో <ph name="RECEIVED_AMOUNT" /></translation>
<translation id="2505669838803949807">మీ పరికర EID <ph name="EID_NUMBER" />. మీకు సర్వీస్‌ను యాక్టివేట్ చేయడంలో సహాయం చేయడానికి, కస్టమర్ సర్వీస్ ప్రతినిధి EID నంబర్‌ను ఉపయోగించవచ్చు.</translation>
<translation id="250704661983564564">డిస్‌ప్లే అమరిక</translation>
-<translation id="2507253002925770350">టిక్కెట్ తీసివేయబడింది</translation>
+<translation id="2507253002925770350">టికెట్ తీసివేయబడింది</translation>
<translation id="2508428939232952663">Google Play Store ఖాతా</translation>
<translation id="2509495747794740764">స్కేల్ ప్రమాణం తప్పనిసరిగా 10 మరియు 200 మధ్య ఉండే సంఖ్య అయ్యి ఉండాలి.</translation>
<translation id="2509566264613697683">8x</translation>
@@ -1843,7 +1843,7 @@
<translation id="258095186877893873">ఎక్కువ</translation>
<translation id="2581455244799175627">థర్డ్-పార్టీ కుక్కీలను అనుమతించడం గురించి మరింత సమాచారం</translation>
<translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (ప్లాట్‌ఫారమ్ <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
-<translation id="2584109212074498965">Kerberos టిక్కెట్‌ను పొందడం సాధ్యపడలేదు. మళ్లీ ప్రయత్నించండి లేదా మీ సంస్థ పరికర నిర్వాహకులను సంప్రదించండి. (ఎర్రర్ కోడ్ <ph name="ERROR_CODE" />).</translation>
+<translation id="2584109212074498965">Kerberos టిక్కెట్‌ను పొందడం సాధ్యపడలేదు. మళ్లీ ట్రై చేయండి లేదా మీ సంస్థ పరికర నిర్వాహకులను సంప్రదించండి. (ఎర్రర్ కోడ్ <ph name="ERROR_CODE" />).</translation>
<translation id="2585724835339714757">ఈ ట్యాబ్‌ మీ స్క్రీన్‌ను షేర్ చేస్తోంది.</translation>
<translation id="2586561813241011046"><ph name="APP_NAME" />ను ఇన్‌స్టాల్ చేయడం సాధ్యపడలేదు. దయచేసి మళ్ళీ ప్రయత్నించండి లేదా మీ నిర్వాహకుడిని సంప్రదించండి. ఎర్రర్ కోడ్: <ph name="ERROR_CODE" />.</translation>
<translation id="2586657967955657006">క్లిప్‌బోర్డ్</translation>
@@ -1883,7 +1883,7 @@
<translation id="26224892172169984">ప్రోటోకాల్స్ మేనేజ్ చేయడానికి ఏ సైట్‌నూ అనుమతించవద్దు</translation>
<translation id="262373406453641243">కోల్‌మాక్</translation>
<translation id="2624142942574147739">ఈ పేజీ మీ కెమెరా మరియు మైక్రోఫోన్‌ను యాక్సెస్‌ చేస్తోంది.</translation>
-<translation id="2626799779920242286">దయచేసి తర్వాత మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="2626799779920242286">దయచేసి తర్వాత మళ్లీ ట్రై చేయండి.</translation>
<translation id="2627424346328942291">షేర్ చేయడం సాధ్యపడలేదు</translation>
<translation id="2628770867680720336">ADB డీబగ్గింగ్‌ను ఎనేబుల్ చేయడానికి ఈ Chromebookను ఫ్యాక్టరీ రీసెట్ చేయాల్సి ఉంటుంది. <ph name="BEGIN_LINK_LEARN_MORE" />మరింత తెలుసుకోండి<ph name="END_LINK_LEARN_MORE" /></translation>
<translation id="2629227353894235473">Android యాప్‌లను డెవలప్ చేయండి</translation>
@@ -1961,7 +1961,7 @@
<translation id="2690024944919328218">భాష ఎంపికలను చూపు</translation>
<translation id="2691385045260836588">మోడల్</translation>
<translation id="2691440343905273290">ఇన్‌పుట్ సెట్టింగ్‌లను మార్చండి</translation>
-<translation id="2693176596243495071">అయ్యో! తెలియని ఎర్రర్ ఏర్పడింది. దయచేసి తర్వాత మళ్లీ ప్రయత్నించండి లేదా సమస్య కొనసాగినట్లయితే మీ నిర్వాహకులను సంప్రదించండి.</translation>
+<translation id="2693176596243495071">అయ్యో! తెలియని ఎర్రర్ ఏర్పడింది. దయచేసి తర్వాత మళ్లీ ట్రై చేయండి లేదా సమస్య కొనసాగినట్లయితే మీ నిర్వాహకులను సంప్రదించండి.</translation>
<translation id="2698147581454716013">ఇది బండిల్ చేయబడిన పరికరం, కియోస్క్ &amp; సంకేత చిహ్నాల అప్‌గ్రేడ్‌తో దీనిని ఎన్‌రోల్ చేయడం సాధ్యం కాదు.</translation>
<translation id="2699911226086014512"><ph name="RETRIES" /> కోడ్‌తో పిన్ ఆపరేషన్ విఫలమైంది.</translation>
<translation id="2701330563083355633"><ph name="DEVICE_NAME" /> నుండి షేర్ చేయబడింది</translation>
@@ -2016,7 +2016,7 @@
<translation id="2737363922397526254">కుదించు...</translation>
<translation id="2737916598897808047"><ph name="APP_NAME" /> మీ స్క్రీన్ కంటెంట్‌లను <ph name="TARGET_NAME" />తో షేర్ చేయాలనుకుంటుంది.</translation>
<translation id="2738030019664645674">మీ పరికరంలో ఇన్‌స్టాల్ చేయబడిన ఫాంట్‌లను ఉపయోగించడానికి సైట్‌లను అనుమతించకండి</translation>
-<translation id="2738771556149464852">తరువాత కాదు</translation>
+<translation id="2738771556149464852">తర్వాత కాదు</translation>
<translation id="2739191690716947896">డీబగ్</translation>
<translation id="2739240477418971307">మీ యాక్సెస్‌ సెట్టింగ్‌లను మార్చడం</translation>
<translation id="274029851662193272">కిందికి ఉన్నట్లుగా</translation>
@@ -2205,7 +2205,7 @@
<translation id="2897878306272793870">మీరు <ph name="TAB_COUNT" /> ట్యాబ్‌లను తెరవాలనుకుంటున్నారా?</translation>
<translation id="290105521672621980">ఫైల్ మద్దతు లేని లక్షణాలను ఉపయోగిస్తోంది</translation>
<translation id="2901348420151309559">తాజా ఫోటోలు, యాప్‌లు</translation>
-<translation id="2902127500170292085"><ph name="EXTENSION_NAME" /> ఈ ప్రింటర్‌తో కమ్యూనికేట్ చేయలేకపోయింది. ప్రింటర్ ప్లగిన్ చేయబడిందని నిర్ధారించుకొని, ఆపై మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="2902127500170292085"><ph name="EXTENSION_NAME" /> ఈ ప్రింటర్‌తో కమ్యూనికేట్ చేయలేకపోయింది. ప్రింటర్ ప్లగిన్ చేయబడిందని నిర్ధారించుకొని, ఆపై మళ్లీ ట్రై చేయండి.</translation>
<translation id="2902265136119311513">గెస్ట్‌లాగా బ్రౌజ్ చేయండి</translation>
<translation id="2902312830803030883">మరిన్ని చర్యలు</translation>
<translation id="2903457445916429186">ఎంచుకున్న అంశాలను తెరవండి</translation>
@@ -2218,7 +2218,7 @@
<translation id="2908162660801918428">డైరెక్టరీ ద్వారా మీడియా గ్యాలరీని జోడించండి</translation>
<translation id="2908358077082926882">కేటాయింపును తీసివేసి, <ph name="RESPONSE" /> కోసం "<ph name="CURRENTKEY" />"ని మళ్లీ నొక్కండి</translation>
<translation id="2909506265808101667">Google సర్వీస్‌లతో కనెక్ట్ చేయడం సాధ్యం కాలేదు. మీ నెట్‌వర్క్ కనెక్షన్‌ను చెక్ చేసి, మళ్లీ ట్రై చేయండి. ఎర్రర్ కోడ్: <ph name="ERROR_CODE" />.</translation>
-<translation id="2910318910161511225">నెట్‌వర్క్‌కి కనెక్ట్ చేసి మళ్లీ ప్రయత్నించండి</translation>
+<translation id="2910318910161511225">నెట్‌వర్క్‌కి కనెక్ట్ చేసి మళ్లీ ట్రై చేయండి</translation>
<translation id="2910718431259223434">ఏదో తప్పు జరిగింది. దయచేసి మళ్లీ ట్రై చేయండి లేదా మీ పరికర ఓనర్‌ను లేదా అడ్మినిస్ట్రేట‌ర్‌ను సంప్రదించండి. ఎర్రర్ కోడ్: <ph name="ERROR_CODE" />.</translation>
<translation id="2912247081180973411">విండోలను మూసివేయి</translation>
<translation id="2913331724188855103">కుక్కీ డేటాను సేవ్ చేయడానికి, చదవడానికి సైట్‌లను అనుమతిస్తుంది (సిఫార్సు చేయబడింది)</translation>
@@ -2270,8 +2270,8 @@
<translation id="2953218713108551165"><ph name="SITE" /> కోసం నోటిఫికేషన్‌లకు అనుమతి లేదు. మీరు తదుపరి సారి సందర్శించినప్పుడు సిస్టమ్ మిమ్మల్ని మళ్లీ అడుగుతుంది.</translation>
<translation id="2956070239128776395">విభాగం గ్రూప్‌లో ఉంది: <ph name="ERROR_LINE" /></translation>
<translation id="2958721676848865875">ప్యాక్ ఎక్స్‌టెన్షన్‌ హెచ్చరిక</translation>
-<translation id="2959127025785722291">ఏదో తప్పు జరిగింది. స్కానింగ్ పూర్తి కాలేకపోయింది. దయచేసి మళ్లీ ప్రయత్నించండి.</translation>
-<translation id="2959842337402130152">స్టోరేజ్‌ స్థలం లేని కారణంగా పునరుద్ధరించడం సాధ్యపడలేదు. పరికరంలో <ph name="SPACE_REQUIRED" /> స్థలం ఖాళీ చేసి, ఆపై మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="2959127025785722291">ఏదో తప్పు జరిగింది. స్కానింగ్ పూర్తి కాలేకపోయింది. దయచేసి మళ్లీ ట్రై చేయండి.</translation>
+<translation id="2959842337402130152">స్టోరేజ్‌ స్థలం లేని కారణంగా పునరుద్ధరించడం సాధ్యపడలేదు. పరికరంలో <ph name="SPACE_REQUIRED" /> స్థలం ఖాళీ చేసి, ఆపై మళ్లీ ట్రై చేయండి.</translation>
<translation id="2960208947600937804">Linuxను కాన్ఫిగర్ చేస్తున్నప్పుడు ఎర్రర్ ఏర్పడింది. మీ అడ్మినిస్ట్రేటర్‌ను కాంటాక్ట్ చేయండి.</translation>
<translation id="296026337010986570">పూర్తయింది! హానికరమైన సాఫ్ట్‌వేర్ తీసివేయబడింది. ఎక్స్‌టెన్షన్‌లను తిరిగి ఆన్ చేయడానికి, &lt;a href="chrome://extensions"&gt;ఎక్స్‌టెన్షన్‌లు&lt;/a&gt; సందర్శించండి.</translation>
<translation id="2961090598421146107"><ph name="CERTIFICATE_NAME" /> (ఎక్స్‌టెన్షన్‌ అందించినది)</translation>
@@ -2322,7 +2322,7 @@
<translation id="3006881078666935414">వినియోగ డేటా లేదు</translation>
<translation id="3007771295016901659">ట్యాబ్ యొక్క నకిలీని రూపొందించు</translation>
<translation id="3008232374986381779">మీ <ph name="DEVICE_TYPE" />లో Linux టూల్‌లు, ఎడిటర్‌లు, IDEలను రన్ చేయండి. <ph name="LINK_BEGIN" />మరింత తెలుసుకోండి<ph name="LINK_END" /></translation>
-<translation id="3008272652534848354">అనుమతులను రీసెట్ చేయి</translation>
+<translation id="3008272652534848354">అనుమతులను రీసెట్ చేయండి</translation>
<translation id="3008694618228964140">{NUM_DAYS,plural, =1{<ph name="MANAGER" /> కోసం అప్‌డేట్‌ను డౌన్‌లోడ్ చేయడానికి మీరు ఈరోజే Wi-Fiకి కనెక్ట్ కావలసి ఉంటుంది. లేదా డేటా నియంత్రణ ఉన్న కనెక్షన్ నుండి డౌన్‌లోడ్ చేయండి (ఛార్జీలు వర్తించవచ్చు).}other{<ph name="MANAGER" /> కోసం అప్‌డేట్‌ను డౌన్‌లోడ్ చేయడానికి మీరు గడువు తేదీలోపు Wi-Fiకి కనెక్ట్ కావలసి ఉంటుంది. లేదా డేటా నియంత్రణ ఉన్న కనెక్షన్ నుండి డౌన్‌లోడ్ చేయండి (ఛార్జీలు వర్తించవచ్చు).}}</translation>
<translation id="3009178788565917040">అవుట్‌పుట్</translation>
<translation id="3009300415590184725">మొబైల్ డేటా సేవ సెటప్ ప్రాసెస్‌ను మీరు ఖచ్చితంగా రద్దు చేయాలనుకుంటున్నారా?</translation>
@@ -2572,7 +2572,7 @@
<translation id="3254715652085014625">మీ Android ఫోన్‌లో Chromeను తెరిచి, "సెట్టింగ్‌లు&gt; పాస్‌వర్డ్‌లు&gt; ఫోన్‌ను సెక్యూరిటీ కీగా ఉపయోగించండి"కి వెళ్లి, అక్కడ ఉన్న సూచనలను అనుసరించండి.</translation>
<translation id="3255355328033513170"><ph name="SITE_GROUP_NAME" /> ద్వారా స్టోరేజ్‌ చేయబడిన మొత్తం డేటాతో పాటు, దానికి అనుసంధానమై ఉండే సైట్‌లు అన్ని తొలగించబడతాయి. ఒక్కమాటలో చెప్పాలంటే, కుక్కీలతో సహా అన్ని తొలగించబడతాయి. అలాగే మీరు తెరిచిన ట్యాబ్‌లతో సహా, ఆయా సైట్‌ల నుండి పూర్తిగా సైన్ అవుట్ చేయబడతారు.</translation>
<translation id="3257733480216378006"><ph name="EXTENSIONS_REQUESTING_ACCESS_COUNT" />ను అనుమతించాలా?</translation>
-<translation id="3259723213051400722">దయచేసి మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="3259723213051400722">దయచేసి మళ్లీ ట్రై చేయండి.</translation>
<translation id="3261090393424563833">రేటు పెంచండి</translation>
<translation id="3261268979727295785">ఎదిగిన పిల్లల కోసం, మీరు సెటప్‌ను పూర్తి చేశాక తల్లిదండ్రుల నియంత్రణలను జోడించవచ్చు. తల్లిదండ్రుల నియంత్రణలకు సంబంధించిన సమాచారాన్ని Explore యాప్‌లో చూడగలరు.</translation>
<translation id="3262336253311870293">ఈ ఖాతాను <ph name="DOMAIN" /> మేనేజ్ చేస్తున్నందున మీరు Google ఖాతా నుండి సైన్ అవుట్ అవ్వరు. మీ బుక్‌మార్క్‌లు, హిస్టరీ, పాస్‌వర్డ్‌లు, ఇతర సెట్టింగ్‌లు ఇకపై సింక్ చేయబడవు. అయితే, గతంలో సింక్ చేయబడిన మీ డేటా Google ఖాతాలో స్టోర్ అయ్యే ఉంటుంది, దానిని <ph name="BEGIN_LINK" />Google Dashboard<ph name="END_LINK" />లో మేనేజ్ చేయవచ్చు.</translation>
@@ -2614,7 +2614,7 @@
<translation id="3290249595466894471">కొత్త రకం ప్రమాదాలను గుర్తించడంలో సహాయపడటానికి కొన్ని నమూనా పేజీలు, డౌన్‌లోడ్‌లు, ఎక్స్‌టెన్షన్ యాక్టివిటీ, సిస్టమ్ సమాచారాన్ని కూడా పంపుతుంది</translation>
<translation id="3293181007446299124">మీ బ్రౌజింగ్ హిస్టరీ మీ పరికరంలో ప్రైవేట్‌గా ఉంచబడుతుంది, అలాగే మీ గుర్తింపును సురక్షితంగా ఉంచడానికి రిపోర్ట్‌లు ఆలస్యంగా పంపబడతాయి</translation>
<translation id="3293644607209440645">ఈ పేజీని పంపండి</translation>
-<translation id="32939749466444286">Linux కంటైనర్ ప్రారంభించబడలేదు. దయచేసి మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="32939749466444286">Linux కంటైనర్ ప్రారంభించబడలేదు. దయచేసి మళ్లీ ట్రై చేయండి.</translation>
<translation id="3294437725009624529">అతిథి</translation>
<translation id="3294686910656423119">వినియోగ గణాంకాలు, క్రాష్ రిపోర్ట్‌లు</translation>
<translation id="3295241308788901889">ఒక ట్యాబ్ ప్రసారం చేయబడుతోంది</translation>
@@ -2685,7 +2685,7 @@
<translation id="3356469410714175391">(వర్చువల్ కార్డ్ ఎనేబుల్ చేయబడింది)</translation>
<translation id="3356580349448036450">పూర్తయింది</translation>
<translation id="3359256513598016054">సర్టిఫికెట్ విధాన పరిమితులు</translation>
-<translation id="3360297538363969800">ముద్రణ విఫలమైంది. దయచేసి మీ ప్రింటర్‌ను చెక్ చేసి మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="3360297538363969800">ముద్రణ విఫలమైంది. దయచేసి మీ ప్రింటర్‌ను చెక్ చేసి మళ్లీ ట్రై చేయండి.</translation>
<translation id="3361421571228286637">{COUNT,plural, =1{<ph name="DEVICE_NAME" /> మీతో <ph name="ATTACHMENTS" />ని షేర్ చేస్తోంది.}other{<ph name="DEVICE_NAME" /> మీతో <ph name="ATTACHMENTS" />ని షేర్ చేస్తోంది.}}</translation>
<translation id="3361954577771524115">యాప్ నుండి</translation>
<translation id="3363202073972776113">ఈ కొత్త ప్రొఫైల్‌ను మీ సంస్థ మేనేజ్ చేస్తుంది. <ph name="BEGIN_LINK" />మరింత తెలుసుకోండి<ph name="END_LINK" /></translation>
@@ -2824,7 +2824,7 @@
<translation id="347670947055184738">అయ్యో! మీ పరికరానికి సంబంధించిన విధానాన్ని పొందడంలో సిస్టమ్ విఫలమైంది.</translation>
<translation id="347785443197175480">మీ కెమెరా మరియు మైక్రోఫోన్‌ను యాక్సెస్ చేయడానికి <ph name="HOST" />ను అనుమతించడాన్ని కొనసాగించండి</translation>
<translation id="3479552764303398839">ఇప్పుడు కాదు</translation>
-<translation id="3479685872808224578">ప్రింట్ సర్వర్‌ని కనుగొనలేకపోయింది. దయచేసి అడ్రస్‌ను చెక్ చేసి, ఆపై మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="3479685872808224578">ప్రింట్ సర్వర్‌ని కనుగొనలేకపోయింది. దయచేసి అడ్రస్‌ను చెక్ చేసి, ఆపై మళ్లీ ట్రై చేయండి.</translation>
<translation id="3480612136143976912">లైవ్ క్యాప్షన్ కోసం క్యాప్షన్ సైజ్‌ను, స్టయిల్‌ను అనుకూలంగా మార్చండి. ఈ సెట్టింగ్‌ను కొన్ని యాప్‌లు, సైట్‌లు కూడా ఉపయోగిస్తాయి.</translation>
<translation id="3480827850068960424"><ph name="NUM" /> ట్యాబ్‌లు కనుగొనబడ్డాయి</translation>
<translation id="3481268647794498892"><ph name="COUNTDOWN_SECONDS" /> క్షణాలలో <ph name="ALTERNATIVE_BROWSER_NAME" />లో తెరవబోతోంది</translation>
@@ -2885,7 +2885,7 @@
<translation id="353316712352074340"><ph name="WINDOW_TITLE" /> - ఆడియో మ్యూట్ చేయబడింది</translation>
<translation id="3536492240554502321">Hue రొటేషన్</translation>
<translation id="3537881477201137177">దీన్ని తర్వాత సెట్టింగ్‌లలో ఎడిట్ చేయవచ్చు</translation>
-<translation id="3538066758857505094">Linuxని అన్‌ఇన్‌స్టాల్ చేయడంలో ఎర్రర్ ఏర్పడింది. దయచేసి మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="3538066758857505094">Linuxని అన్‌ఇన్‌స్టాల్ చేయడంలో ఎర్రర్ ఏర్పడింది. దయచేసి మళ్లీ ట్రై చేయండి.</translation>
<translation id="354060433403403521">AC అడాప్టర్</translation>
<translation id="354068948465830244">ఇది సైట్ డేటాను చదవగలదు మరియు మార్చగలదు</translation>
<translation id="3541823293333232175">కేటాయించబడింది</translation>
@@ -2968,7 +2968,7 @@
<translation id="3615596877979647433">కీ ఏదీ నొక్కబడలేదు. అనుకూలంగా మార్చడానికి కీబోర్డ్ కీని నొక్కండి</translation>
<translation id="3616113530831147358">ఆడియో</translation>
<translation id="3616741288025931835">బ్రౌజింగ్ డేటాను &amp;క్లియర్ చేయి...</translation>
-<translation id="3617891479562106823">నేపథ్యాలు అందుబాటులో లేవు. తర్వాత మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="3617891479562106823">నేపథ్యాలు అందుబాటులో లేవు. తర్వాత మళ్లీ ట్రై చేయండి.</translation>
<translation id="3618286417582819036">క్షమించండి, ఒక ఎర్రర్ ఏర్పడింది</translation>
<translation id="3619115746895587757">కాపుచినో</translation>
<translation id="3620136223548713675">భౌగోళిక స్థానం</translation>
@@ -2977,7 +2977,7 @@
<translation id="362333465072914957">CA, సర్టిఫికెట్‌ను జారీ చేయడం కోసం వేచి ఉంది</translation>
<translation id="3624567683873126087">పరికరాన్ని అన్‌లాక్ చేసి, Google ఖాతాలోకి సైన్-ఇన్ చేయండి</translation>
<translation id="3624583033347146597">మీ థర్డ్-పార్టీ కుక్కీ ప్రాధాన్యతలను ఎంచుకోండి</translation>
-<translation id="3625481642044239431">చెల్లని ఫైల్ ఎంచుకోబడింది. మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="3625481642044239431">చెల్లని ఫైల్ ఎంచుకోబడింది. మళ్లీ ట్రై చేయండి.</translation>
<translation id="3626296069957678981">ఈ Chromebookకు ఛార్జ్ చేయడానికి, అనుకూలమైన డెల్ బ్యాటరీని ఉపయోగించండి.</translation>
<translation id="3627320433825461852">1 నిమిషం కంటే తక్కువ సమయం మిగిలి ఉంది</translation>
<translation id="3627588569887975815">అ&amp;జ్ఞాత విండోలో లింక్‌ను తెరువు</translation>
@@ -3091,7 +3091,7 @@
<translation id="3719826155360621982">హోమ్‌పేజీ</translation>
<translation id="372062398998492895">CUPS</translation>
<translation id="3721119614952978349">మీరు మరియు Google</translation>
-<translation id="3722108462506185496">వర్చువల్ మెషిన్ సేవను ప్రారంభించడంలో ఎర్రర్ ఏర్పడింది. దయచేసి మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="3722108462506185496">వర్చువల్ మెషిన్ సేవను ప్రారంభించడంలో ఎర్రర్ ఏర్పడింది. దయచేసి మళ్లీ ట్రై చేయండి.</translation>
<translation id="3722624153992426516"><ph name="IMPORT_CERTIFICATE__INSTRUCTION_NAME" /> సూచన అందింది</translation>
<translation id="3726965532284929944">QT</translation>
<translation id="3727144509609414201">అందుబాటులో ఉన్న Wi-Fi నెట్‌వర్క్‌లు</translation>
@@ -3113,7 +3113,7 @@
<translation id="3739254215541673094"><ph name="APPLICATION" />ని తెరవాలా?</translation>
<translation id="3741056951918180319">ఏ సైట్‌లోనైనా ఉపయోగించడానికి, ఎల్లప్పుడూ మీరు ఎక్స్‌టెన్షన్‌ను క్లిక్ చేయవచ్చు</translation>
<translation id="3742235229730461951">కొరియన్ కీబోర్డ్ లేఅవుట్</translation>
-<translation id="3742666961763734085">ఈ పేరుతో సంస్థాగత యూనిట్ కనుగొనబడలేదు. దయచేసి మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="3742666961763734085">ఈ పేరుతో సంస్థాగత యూనిట్ కనుగొనబడలేదు. దయచేసి మళ్లీ ట్రై చేయండి.</translation>
<translation id="3743842571276656710"><ph name="DEVICE_NAME" />తో పెయిర్ చేయడానికి PINను ఎంటర్ చేయండి</translation>
<translation id="3747077776423672805">యాప్‌లను తీసివేయడం కోసం, సెట్టింగ్‌లు &gt; Google Play Store &gt; Android ప్రాధాన్యతలను మేనేజ్ చేయండి &gt; యాప్‌లు లేదా అప్లికేషన్ మేనేజర్‌లోకి వెళ్లండి. ఆపై, మీరు అన్ఇన్‌స్టాల్ చేయాలనుకుంటున్న యాప్‌ని నొక్కండి (మీరు యాప్‌ని కనుగొనడం కోసం ఎడమ లేదా కుడి వైపునకు స్వైప్ చేయాల్సి రావచ్చు). ఆపై, అన్ఇన్‌స్టాల్ చేయి లేదా నిలిపివేయిని ఎంచుకోండి.</translation>
<translation id="3747603683749989726">మెరుగుపరచబడిన సెక్యూరిటీని ఆన్ చేయాలా?</translation>
@@ -3171,7 +3171,7 @@
<translation id="3788331399335602504">ఈ ఫైల్స్</translation>
<translation id="3788401245189148511">ఇది వీటిని చేయాలనుకుంటోంది:</translation>
<translation id="3789841737615482174">ఇన్‌స్టాల్ చేయి</translation>
-<translation id="3790417903123637354">ఏదో తప్పు జరిగింది. తర్వాత మళ్లీ ప్రయత్నించండి</translation>
+<translation id="3790417903123637354">ఏదో తప్పు జరిగింది. తర్వాత మళ్లీ ట్రై చేయండి</translation>
<translation id="379082410132524484">మీ కార్డ్ గడువు ముగిసింది</translation>
<translation id="3792973596468118484"><ph name="NUM_EXTENSIONS" /> ఎక్స్‌టెన్షన్‌లు</translation>
<translation id="379500251094592809">సమీప షేరింగ్‌ను ఉపయోగించడానికి, రెండు పరికరాలూ అన్‌లాక్ అయి, దగ్గరగా ఉన్నాయని, వాటిలో బ్లూటూత్ ఆన్ చేసి ఉందని నిర్ధారించుకోండి. మీరు మీ కాంటాక్ట్‌లలో లేని Chromebookతో షేర్ చేస్తుంటే, దానిలో సమీప విజిబిలిటీ ఫీచర్ ఆన్‌లో ఉందని నిర్ధారించుకోండి (సమయాన్ని ఎంచుకోవడం ద్వారా స్టేటస్ ప్రాంతాన్ని తెరిచి, ఆపై సమీప విజిబిలిటీని ఆన్ చేయండి) <ph name="LINK_BEGIN" />మరింత తెలుసుకోండి<ph name="LINK_END" /></translation>
@@ -3476,7 +3476,7 @@
<translation id="404493185430269859">డిఫాల్ట్ శోధన ఇంజిన్</translation>
<translation id="4045180775310929593">గమనికను జోడించండి...</translation>
<translation id="4046013316139505482">ఈ సైట్‌లో సమాచారాన్ని ఈ ఎక్స్‌టెన్షన్‌లు చూడవలసిన, మార్చవలసిన అవసరం లేదు.</translation>
-<translation id="4046123991198612571">తరువాత ట్రాక్</translation>
+<translation id="4046123991198612571">తర్వాత ట్రాక్</translation>
<translation id="4047345532928475040">N/A</translation>
<translation id="4047581153955375979">USB4</translation>
<translation id="4047726037116394521">హోమ్‌కు వెళ్లు</translation>
@@ -3554,7 +3554,7 @@
<translation id="4115378294792113321">మెజెంటా</translation>
<translation id="4116704186509653070">మళ్లీ తెరవండి</translation>
<translation id="4117714603282104018">టచ్‌ప్యాడ్ స్పర్శ ప్రతిస్పందన</translation>
-<translation id="4118579674665737931">దయచేసి పరికరాన్ని రీబూట్ చేసి, మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="4118579674665737931">దయచేసి పరికరాన్ని రీబూట్ చేసి, మళ్లీ ట్రై చేయండి.</translation>
<translation id="412022815379960229">మీరు ఎప్పుడు సైన్ ఇన్ చేస్తే అప్పుడు, Google Photos నుండి మీ జ్ఞాపకాల గురించి మరింత స్మరించుకోవడం ప్రారంభించండి.</translation>
<translation id="4120388883569225797">ఈ సెక్యూరిటీ కీని రీసెట్ చేయడం సాధ్యపడదు</translation>
<translation id="4120817667028078560">పాథ్‌ చాలా పొడవుగా ఉంది</translation>
@@ -3585,7 +3585,7 @@
<translation id="4144468798716165316">క్విక్ కమాండ్స్</translation>
<translation id="4146026355784316281">ఎల్లప్పుడూ సిస్టమ్ వ్యూయర్‌తో తెరువు</translation>
<translation id="4146785383423576110">రీసెట్ చేసి హానికరమైన వాటిని తీసివేయండి</translation>
-<translation id="4147911968024186208">దయచేసి మళ్లీ ప్రయత్నించండి. మీకు ఈ ఎర్రర్ మళ్లీ కనిపిస్తే, దయచేసి మీ మద్దతు ప్రతినిధిని సంప్రదించండి.</translation>
+<translation id="4147911968024186208">దయచేసి మళ్లీ ట్రై చేయండి. మీకు ఈ ఎర్రర్ మళ్లీ కనిపిస్తే, దయచేసి మీ మద్దతు ప్రతినిధిని సంప్రదించండి.</translation>
<translation id="4150201353443180367">డిస్‌ప్లే</translation>
<translation id="4150569944729499860">స్క్రీన్ కాంటెక్ట్స్</translation>
<translation id="4152011295694446843">మీరు మీ బుక్‌మార్క్‌లను ఇక్కడ చూడవచ్చు</translation>
@@ -3690,7 +3690,7 @@
<translation id="4260699894265914672">అనుకూలంగా మార్చడానికి కీబోర్డ్ కీని నొక్కండి</translation>
<translation id="4261429981378979799">ఎక్స్‌టెన్షన్ అనుమతులు</translation>
<translation id="4262004481148703251">హెచ్చరికను విస్మరించండి</translation>
-<translation id="4263223596040212967">మీ కీబోర్డ్ లేఅవుట్‌ను చెక్ చేసి, మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="4263223596040212967">మీ కీబోర్డ్ లేఅవుట్‌ను చెక్ చేసి, మళ్లీ ట్రై చేయండి.</translation>
<translation id="426564820080660648">అప్‌డేట్‌ల కోసం చెక్ చేయడానికి, దయచేసి ఈథర్‌నెట్, Wi-Fi లేదా మొబైల్ డేటాను ఉపయోగించండి.</translation>
<translation id="426652736638196239">ఈ IBAN ఈ పరికరంలో మాత్రమే సేవ్ అవుతుంది</translation>
<translation id="4266679478228765574">ఫోల్డర్‌లను తీసివేయడం వలన షేరింగ్ ఆపివేయబడుతుంది, కానీ ఫైళ్లు తొలగించబడవు.</translation>
@@ -3744,7 +3744,7 @@
<translation id="4309183709806093061">సిస్టమ్ ఆడియోను కూడా షేర్ చేయండి. ఫీడ్‌బ్యాక్‌ను నిరోధించడానికి ఈ పరికరం మ్యూట్ చేయబడుతుంది.</translation>
<translation id="4309420042698375243"><ph name="NUM_KILOBYTES" />K (<ph name="NUM_KILOBYTES_LIVE" />K ప్రత్యక్షంగా)</translation>
<translation id="4310132194679586591">ఈ లింక్‌ను తెరవడానికి మీ పరికరంలో యాప్‌ను ఎంచుకోండి</translation>
-<translation id="4310139701823742692">ఫైల్ తప్పు ఫార్మాట్‌లో ఉంది. PPD ఫైల్‌ని చెక్ చేసి, మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="4310139701823742692">ఫైల్ తప్పు ఫార్మాట్‌లో ఉంది. PPD ఫైల్‌ని చెక్ చేసి, మళ్లీ ట్రై చేయండి.</translation>
<translation id="431076611119798497">&amp;వివరాలు</translation>
<translation id="4311284648179069796">చదవడానికి, మార్చడానికి అనుమతి లేదు</translation>
<translation id="4312701113286993760">{COUNT,plural, =1{1 Google ఖాతా}other{<ph name="EXTRA_ACCOUNTS" /> Google ఖాతాలు}}</translation>
@@ -3992,7 +3992,7 @@
<translation id="4532646538815530781">ఈ సైట్ మోషన్ సెన్సార్‌లను ఉపయోగిస్తోంది.</translation>
<translation id="4533846798469727141">ఇప్పుడు "Hey Google" అని చెప్పండి</translation>
<translation id="4533985347672295764">CPU సమయం</translation>
-<translation id="4534661889221639075">మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="4534661889221639075">మళ్లీ ట్రై చేయండి.</translation>
<translation id="4535127706710932914">డిఫాల్ట్ ప్రొఫైల్</translation>
<translation id="4536140153723794651">కుక్కీలను ఉపయోగించే అనుమతి ఎల్లప్పుడూ ఉన్న సైట్‌లు</translation>
<translation id="4536769240747010177">టెథరింగ్ సామర్థ్యాలు:</translation>
@@ -4011,7 +4011,7 @@
<translation id="4546345569117159016">కుడివైపు బటన్</translation>
<translation id="4546692474302123343">Google Assistant వాయిస్ ఇన్‌పుట్</translation>
<translation id="4547659257713117923">ఇతర పరికరాల నుండి ట్యాబ్‌లు లేవు</translation>
-<translation id="4547672827276975204">ఆటోమేటిక్‌గా సెట్ చేయి</translation>
+<translation id="4547672827276975204">ఆటోమేటిక్‌గా సెట్ చేయండి</translation>
<translation id="4549791035683739768">మీ సెక్యూరిటీ కీలో వేలిముద్రలు సేవ్ చేయబడలేదు</translation>
<translation id="4550926046134589611">కొన్ని సపోర్ట్ లింక్‌లు ఇప్పటికీ <ph name="APP_NAME" />లో తెరవబడతాయి.</translation>
<translation id="4551763574344810652">చర్యరద్దు చేయడానికి <ph name="MODIFIER_KEY_DESCRIPTION" />ను నొక్కండి</translation>
@@ -4052,7 +4052,7 @@
<translation id="4580596421317071374">ఈ పరికరంలోని <ph name="GOOGLE_PASSWORD_MANAGER" />‌లో పాస్‌వర్డ్‌లు సేవ్ చేయబడ్డాయి.</translation>
<translation id="4581774856936278355">Linuxని పునరుద్ధరిస్తున్నప్పుడు ఎర్రర్ ఏర్పడింది</translation>
<translation id="4582297591746054421">మీరు కాపీ చేసిన టెక్స్ట్ యొక్క ఫార్మాటింగ్‌ను అలాగే ఉంచడం వంటి ఫీచర్‌ల కోసం సాధారణంగా సైట్‌లు మీ క్లిప్‌బోర్డ్‌ను చదువుతాయి</translation>
-<translation id="4582563038311694664">అన్ని సెట్టింగ్‌లను రీసెట్ చేయి</translation>
+<translation id="4582563038311694664">అన్ని సెట్టింగ్‌లను రీసెట్ చేయండి</translation>
<translation id="4585793705637313973">పేజీని ఎడిట్ చేయండి</translation>
<translation id="4586275095964870617"><ph name="URL" />ని ప్రత్యామ్నాయ బ్రౌజర్‌లో తెరవడం సాధ్యపడదు. దయచేసి మీ సిస్టమ్ నిర్వాహకుడిని సంప్రదించండి.</translation>
<translation id="4587589328781138893">సైట్‌లు</translation>
@@ -4098,7 +4098,7 @@
<translation id="4625078469366263107">యాప్‌ను ప్రారంభించండి</translation>
<translation id="4627427111733173920">కుక్కీలు బ్లాక్ చేయబడ్డాయి</translation>
<translation id="4627442949885028695">మరో పరికరం నుండి కొనసాగించండి</translation>
-<translation id="4628762811416793313">Linux కంటెయినర్ సెటప్ పూర్తి కాలేదు. దయచేసి మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="4628762811416793313">Linux కంటెయినర్ సెటప్ పూర్తి కాలేదు. దయచేసి మళ్లీ ట్రై చేయండి.</translation>
<translation id="4629521233550547305"><ph name="PROFILE_NAME" /> ప్రొఫైల్‌ను తెరవు</translation>
<translation id="4632655012900268062">కార్డ్‌లను అనుకూలంగా మార్చండి</translation>
<translation id="4633003931260532286">"<ph name="IMPORT_NAME" />" యొక్క వెర్షన్ కనీసం "<ph name="IMPORT_VERSION" />" ఉండాలని ఎక్స్‌టెన్షన్ కోరుతోంది, కానీ "<ph name="INSTALLED_VERSION" />" వెర్షన్ మాత్రమే ఇన్‌స్టాల్ చేయబడి ఉంది</translation>
@@ -4222,7 +4222,7 @@
<translation id="4736292055110123391">మీ బుక్‌మార్క్‌లు, పాస్‌వర్డ్‌‌లు, హిస్టరీ మరియు మరిన్నింటిని మీ అన్ని పరికరాల్లోనూ సింక్ చేయండి</translation>
<translation id="473775607612524610">అప్‌డేట్‌</translation>
<translation id="473936925429402449"><ph name="TOTAL_ELEMENTS" />లో <ph name="CURRENT_ELEMENT" />వ అదనపు కంటెంట్ ఎంచుకోబడింది</translation>
-<translation id="4739639199548674512">టిక్కెట్‌లు</translation>
+<translation id="4739639199548674512">టికెట్‌లు</translation>
<translation id="4742334355511750246">ఇమేజ్‌లను చూపడానికి అనుమతించబడలేదు</translation>
<translation id="4742970037960872810">హైలైట్‌ను తీసివేయండి</translation>
<translation id="4743260470722568160"><ph name="BEGIN_LINK" />అప్లికేషన్‌లను ఎలా అప్‌డేట్ చేయాలో తెలుసుకోండి<ph name="END_LINK" /></translation>
@@ -4267,7 +4267,7 @@
<translation id="4781584184731045253">డేటాను, అనుమతులను క్లియర్ చేయండి</translation>
<translation id="4785719467058219317">మీరు ఈ వెబ్‌సైట్‌తో నమోదు కాని సెక్యూరిటీ కీని ఉపయోగిస్తున్నారు</translation>
<translation id="4785914069240823137">కత్తిరింపును రద్దు చేయండి</translation>
-<translation id="4788092183367008521">దయచేసి మీ నెట్‌వర్క్ కనెక్షన్‌ను చెక్ చేసి, మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="4788092183367008521">దయచేసి మీ నెట్‌వర్క్ కనెక్షన్‌ను చెక్ చేసి, మళ్లీ ట్రై చేయండి.</translation>
<translation id="4789348252524569426">స్పీచ్ ఫైల్స్‌ను ఇన్‌స్టాల్ చేయడం సాధ్యం కాదు. మీ పరికరాన్ని అప్‌డేట్ చేయాలి. మీ పరికరాన్ని రీస్టార్ట్ చేసి, ఆపై మళ్లీ ట్రై చేయండి.</translation>
<translation id="4789550509729954245">పరికరాలు సమీపంలోని షేర్ చేస్తున్నప్పుడు నోటిఫికేషన్‌ను చూడండి</translation>
<translation id="4791037424585594169">(UDP)</translation>
@@ -4347,7 +4347,7 @@
<translation id="485480310608090163">మరిన్ని సెట్టింగ్‌లు మరియు అనుమతులు</translation>
<translation id="4858913220355269194">ఫ్రిట్జ్</translation>
<translation id="4862642413395066333">OCSP ప్రతిస్పందనలను సైన్ చేస్తోంది</translation>
-<translation id="4863702650881330715">అనుకూలతను పెంచండి</translation>
+<translation id="4863702650881330715">అనుకూలతను మెరుగుపరచండి</translation>
<translation id="4863769717153320198"><ph name="WIDTH" /> x <ph name="HEIGHT" /> ఉన్నట్టుంది (డిఫాల్ట్)</translation>
<translation id="4864805589453749318">పాఠశాల ఖాతాను జోడించడానికి అనుమతిని ఇస్తున్న తల్లి/తండ్రిని ఎంచుకోండి.</translation>
<translation id="486635084936119914">డౌన్‌లోడ్ చేసిన తర్వాత ఆటోమేటిక్‌గా నిర్దిష్ట ఫైల్ రకాలను తెరువు</translation>
@@ -4551,7 +4551,7 @@
<translation id="5059526285558225588">ఏమి షేర్ చేయాలో ఎంచుకోండి</translation>
<translation id="5060332552815861872">సేవ్ చేయాల్సిన 1 ప్రింటర్ అందుబాటులో ఉంది.</translation>
<translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{ఈ ఫోల్డర్‌లో ఒక బుక్‌మార్క్ ఉంది. మీరు దీనిని ఖచ్చితంగా తొలగించాలనుకుంటున్నారా?}other{ఈ ఫోల్డర్‌లో # బుక్‌మార్క్‌లు ఉన్నాయి. మీరు దీనిని ఖచ్చితంగా తొలగించాలనుకుంటున్నారా?}}</translation>
-<translation id="5062930723426326933">సైన్-ఇన్ విఫలమైంది, దయచేసి ఇంటర్నెట్‌కు కనెక్ట్ చేసి మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="5062930723426326933">సైన్-ఇన్ విఫలమైంది, దయచేసి ఇంటర్నెట్‌కు కనెక్ట్ చేసి మళ్లీ ట్రై చేయండి.</translation>
<translation id="5063480226653192405">స్టోరేజ్‌ వినియోగం</translation>
<translation id="5065775832226780415">Smart Lock</translation>
<translation id="5066100345385738837">ChromeOS సెట్టింగ్‌లలో సురక్షిత DNSను మేనేజ్ చేయండి</translation>
@@ -4681,7 +4681,7 @@
<translation id="5181140330217080051">డౌన్‌లోడ్ చేస్తోంది</translation>
<translation id="5181172023548002891"><ph name="ACCOUNT" /> కోసం Google Password Managerకు</translation>
<translation id="5184063094292164363">&amp;JavaScript కన్సోల్</translation>
-<translation id="5184209580557088469">ఈ వినియోగదారు పేరుతో ఇప్పటికే ఒక టిక్కెట్ ఉంది</translation>
+<translation id="5184209580557088469">ఈ వినియోగదారు పేరుతో ఇప్పటికే ఒక టికెట్ ఉంది</translation>
<translation id="5184662919967270437">మీ పరికరాన్ని అప్‌డేట్ చేస్తోంది</translation>
<translation id="5185359571430619712">ఎక్స్‌టెన్షన్‌లను రివ్యూ చేయండి</translation>
<translation id="5185386675596372454">"<ph name="EXTENSION_NAME" />" కొత్త వెర్షన్ నిలిపివేయబడింది ఎందుకంటే దానికి మరిన్ని అనుమతులు అవసరం.</translation>
@@ -4702,7 +4702,7 @@
<translation id="5198430103906431024">వినియోగం &amp; విశ్లేషణల డేటాను పంపండి. ఈ పరికరం ప్రస్తుతం సమస్య విశ్లేషణ డేటాను, పరికరం డేటాను, దానితో పాటు యాప్ వినియోగ డేటాను ఆటోమేటిక్‌గా Googleకు పంపుతోంది. ఇది సిస్టమ్, యాప్ స్థిరత్వానికి, అలాగే ఇతర మెరుగుదలలకు సహాయపడుతుంది. కొంత ఏకీకృత డేటా కూడా Google యాప్‌లకు, Android డెవలపర్‌ల లాంటి భాగస్వాములకు సహాయపడుతుంది. మీ అదనపు వెబ్ &amp; యాప్ యాక్టివిటీ సెట్టింగ్‌ను ఆన్ చేసినట్లయితే, ఈ డేటా మీ Google ఖాతాలో సేవ్ చేయబడవచ్చు.</translation>
<translation id="5199729219167945352">ప్రయోగాలు</translation>
<translation id="5203920255089865054">{NUM_EXTENSIONS,plural, =1{ఎక్స్‌టెన్షన్‌ను చూడటానికి క్లిక్ చేయండి}other{ఈ ఎక్స్‌టెన్షన్‌లను చూడటానికి క్లిక్ చేయండి}}</translation>
-<translation id="5204673965307125349">దయచేసి పరికరాన్ని పవర్‌వాష్ చేసి, మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="5204673965307125349">దయచేసి పరికరాన్ని పవర్‌వాష్ చేసి, మళ్లీ ట్రై చేయండి.</translation>
<translation id="5204967432542742771">పాస్‌వర్డ్‌ని నమోదు చేయండి</translation>
<translation id="5205484256512407285">బదిలీ చేయడానికి మొబైల్ డేటాను ఎప్పుడూ ఉపయోగించవద్దు</translation>
<translation id="520568280985468584">నెట్‌వర్క్ విజయవంతంగా జోడించబడింది. యాక్టివ్ కావడానికి మీ సెల్యులర్ నెట్‌వర్క్‌కు కొన్ని నిమిషాలు పట్టవచ్చు.</translation>
@@ -4738,7 +4738,7 @@
<translation id="5236374273162681467">మీ పరికరాలన్నిటిలో వాటిని సులభంగా ఉపయోగించడానికి, వాటిని మీరు మీ Google ఖాతాకు తరలించవచ్చు</translation>
<translation id="523862956770478816">సైట్ అనుమతులు</translation>
<translation id="5242724311594467048">"<ph name="EXTENSION_NAME" />"ను ప్రారంభించాలా?</translation>
-<translation id="5243522832766285132">దయచేసి కొన్ని నిమిషాల్లో మళ్లీ ప్రయత్నించండి</translation>
+<translation id="5243522832766285132">దయచేసి కొన్ని నిమిషాల్లో మళ్లీ ట్రై చేయండి</translation>
<translation id="5244474230056479698"><ph name="EMAIL" /> ఖాతాకు సింక్ చేస్తోంది</translation>
<translation id="5245610266855777041">పాఠశాల ఖాతాతో ప్రారంభించండి</translation>
<translation id="5246282308050205996"><ph name="APP_NAME" /> క్రాష్ అయ్యింది. యాప్‌ పునఃప్రారంభించడానికి ఈ బెలూన్‌ను క్లిక్ చేయండి.</translation>
@@ -4830,7 +4830,7 @@
<translation id="5319359161174645648">Chromeను Google సిఫార్సు చేస్తోంది</translation>
<translation id="5319712128756744240">కొత్త పరికరాన్ని పెయిర్ చేయండి</translation>
<translation id="5320135788267874712">కొత్త పరికరం పేరు</translation>
-<translation id="532247166573571973">సర్వర్ అందుబాటులో లేకపోవచ్చు. తర్వాత మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="532247166573571973">సర్వర్ అందుబాటులో లేకపోవచ్చు. తర్వాత మళ్లీ ట్రై చేయండి.</translation>
<translation id="5324300749339591280">యాప్‌ల లిస్ట్</translation>
<translation id="5324780743567488672">మీ స్థానాన్ని ఉపయోగించి సమయ మండలిని ఆటోమేటిక్‌గా సెట్ చేయండి</translation>
<translation id="5327248766486351172">పేరు</translation>
@@ -4883,7 +4883,7 @@
<translation id="5369491905435686894">మౌస్ యాక్సిలరేషన్‌ను ప్రారంభించండి</translation>
<translation id="5369694795837229225">Linux డెవలప్‌మెంట్ ఎన్విరాన్మెంట్‌ను సెటప్ చేయండి</translation>
<translation id="5370819323174483825">&amp;మళ్లీ లోడ్ చేయి</translation>
-<translation id="5372529912055771682">సరఫరా చేయబడిన నమోదు మోడ్‌ను, ఆపరేటింగ్ సిస్టమ్ యొక్క ఈ వెర్షన్ మద్దతివ్వదు. మీరు తాజా వెర్షన్‌ను అమలు చేస్తున్నారని దయచేసి నిర్ధారించుకుని, మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="5372529912055771682">సరఫరా చేయబడిన నమోదు మోడ్‌ను, ఆపరేటింగ్ సిస్టమ్ యొక్క ఈ వెర్షన్ మద్దతివ్వదు. మీరు తాజా వెర్షన్‌ను అమలు చేస్తున్నారని దయచేసి నిర్ధారించుకుని, మళ్లీ ట్రై చేయండి.</translation>
<translation id="5372579129492968947">ఎక్స్‌టెన్ష‌న్‌‍‌ పిన్‌ను తీసివేయండి</translation>
<translation id="5372632722660566343">ఖాతా లేకుండా కొనసాగించండి</translation>
<translation id="5375318608039113175">ఈ కాంటాక్ట్‌లతో సమీప షేరింగ్‌ను ఉపయోగించడానికి, వారి Google ఖాతాతో లింక్ చేయబడిన ఈమెయిల్‌ అడ్రస్‌ను మీ కాంటాక్ట్‌లకు జోడించండి.</translation>
@@ -4954,7 +4954,7 @@
<translation id="544083962418256601">షార్ట్‌కట్‌లను క్రియేట్ చేయండి...</translation>
<translation id="5441133529460183413">Chrome బ్రౌజర్ నుండి వెబ్ యాప్ ఇన్‌స్టాల్ చేయబడింది</translation>
<translation id="5441466871879044658">ఈ భాషలోకి అనువదించు</translation>
-<translation id="5442228125690314719">డిస్క్ ఇమేజ్‌ను సృష్టించడంలో ఎర్రర్ ఏర్పడింది. దయచేసి మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="5442228125690314719">డిస్క్ ఇమేజ్‌ను సృష్టించడంలో ఎర్రర్ ఏర్పడింది. దయచేసి మళ్లీ ట్రై చేయండి.</translation>
<translation id="5442550868130618860">స్వీయ-అప్‌డేట్‌ని ఆన్ చేయి</translation>
<translation id="5445400788035474247">10x</translation>
<translation id="5446983216438178612">సంస్థ కోసం కలిగి ఉన్న ప్రమాణపత్రాలను చూపు</translation>
@@ -5081,7 +5081,7 @@
<translation id="5551573675707792127">కీబోర్డ్ మరియు వచన ఇన్‌పుట్</translation>
<translation id="5553089923092577885">సర్టిఫికెట్ విధాన మ్యాపింగ్‌లు</translation>
<translation id="5554240068773209752">కంట్రోల్స్‌ను అనుకూలంగా మార్చడానికి ఇక్కడ క్లిక్ చేయండి</translation>
-<translation id="5554403733534868102">దీని తరువాత, అప్‌డేట్‌ల కోసం వేచి ఉండాల్సిన అవసరం లేదు</translation>
+<translation id="5554403733534868102">దీని తర్వాత, అప్‌డేట్‌ల కోసం వేచి ఉండాల్సిన అవసరం లేదు</translation>
<translation id="5554489410841842733">ప్రస్తుత పేజీలో ఎక్స్‌టెన్ష‌న్‌ ఉండే వరకు ఈ చిహ్నం కనిపిస్తుంది.</translation>
<translation id="5554720593229208774">ఈమెయిల్‌ అధికారి స‌ర్టిఫికేష‌న్ అధికారిక సంస్థ‌</translation>
<translation id="5554866693883022680">ఈ లింక్‌ను తెరవడానికి మీ <ph name="DEVICE_TYPE" />‌లో యాప్‌ను ఎంచుకోండి</translation>
@@ -5134,7 +5134,7 @@
<translation id="5594899180331219722">ఫైల్‌ను ఎంచుకోండి</translation>
<translation id="5595307023264033512">సైట్‌లు ఉపయోగించిన మొత్తం స్టోరేజ్: <ph name="TOTAL_USAGE" /></translation>
<translation id="5595485650161345191">అడ్రస్‌ను ఎడిట్ చేయండి</translation>
-<translation id="5596627076506792578">మరిన్ని ఎంపికలు</translation>
+<translation id="5596627076506792578">మరిన్ని ఆప్షన్‌లు</translation>
<translation id="5600348067066185292">కొన్ని సులభమైన దశలలో ఇన్‌స్టాలేషన్ పూర్తవుతుంది. మీ కంప్యూటర్‌లో ఏవైనా మార్పులను చేసే ముందు మీకు నిర్ధారించుకోవడానికి మరో అవకాశం ఉంటుంది.</translation>
<translation id="5600706100022181951"><ph name="UPDATE_SIZE_MB" /> MB మొబైల్ డేటాను ఉపయోగించి అప్‌డేట్‌ డౌన్‌లోడ్ చేయబడుతుంది. మీరు కొనసాగాలని అనుకుంటున్నారా?</translation>
<translation id="5601503069213153581">PIN</translation>
@@ -5505,7 +5505,7 @@
<translation id="5935656526031444304">సురక్షిత బ్రౌజింగ్‌ను మేనేజ్ చేయండి</translation>
<translation id="5936065461722368675">మొత్తం పేజీని అనువదించండి</translation>
<translation id="5938002010494270685">భద్రతా అప్‌గ్రేడ్ అందుబాటులో ఉంది</translation>
-<translation id="5939518447894949180">రీసెట్ చేయి</translation>
+<translation id="5939518447894949180">రీసెట్ చేయండి</translation>
<translation id="5939719276406088041">షార్ట్‌కట్‌ను క్రియేట్ చేయడం సాధ్యపడదు</translation>
<translation id="594048410531370124">గుర్తించబడని కీ. <ph name="RESPONSE" /> కోసం ఏదైనా కీని నొక్కండి.</translation>
<translation id="5941153596444580863">వ్యక్తిని జోడించండి...</translation>
@@ -5694,7 +5694,7 @@
<translation id="6102043788063419338">అధునాతన రక్షణ ప్రోగ్రామ్ ద్వారా ఈ ఫైల్ బ్లాక్ చేయబడింది.</translation>
<translation id="6103681770816982672">హెచ్చరిక: మీరు డెవలపర్ ఛానెల్‌కు మారుతున్నారు</translation>
<translation id="6104068876731806426">Google ఖాతాలు</translation>
-<translation id="6104311680260824317">పరికరాన్ని డొమైన్‌కు చేర్చడం సాధ్యపడలేదు. పేర్కొనబడిన Kerberos ఎన్‌క్రిప్షన్ రకాలకు ఈ సర్వర్ మద్దతు ఇవ్వదు. ఎన్‌క్రిప్షన్ సెట్టింగ్‌ల కోసం "మరిన్ని ఎంపికలు" చూడండి.</translation>
+<translation id="6104311680260824317">పరికరాన్ని డొమైన్‌కు చేర్చడం సాధ్యపడలేదు. పేర్కొనబడిన Kerberos ఎన్‌క్రిప్షన్ రకాలకు ఈ సర్వర్ మద్దతు ఇవ్వదు. ఎన్‌క్రిప్షన్ సెట్టింగ్‌ల కోసం "మరిన్ని ఆప్షన్‌లు" చూడండి.</translation>
<translation id="6104796831253957966">ప్రింటర్ క్యూ నిండిపోయింది</translation>
<translation id="6111972606040028426">Google Assistantను ఎనేబుల్ చేయండి</translation>
<translation id="6112294629795967147">సైజ్‌ మార్చడం కోసం తాకండి</translation>
@@ -5763,7 +5763,7 @@
<translation id="6169040057125497443">దయచేసి మీ మైక్రోఫోన్‌ని చెక్ చేయండి.</translation>
<translation id="6169967265765719844">Steam ద్వారా ఇన్‌స్టాల్ చేయబడిన గేమ్‌లు, యాప్‌ల కోసం అనుమతులు <ph name="LINK_BEGIN" />Steam యాప్ సెట్టింగ్‌ల<ph name="LINK_END" />లో మేనేజ్ చేయబడతాయి.</translation>
<translation id="6170470584681422115">శాండ్విచ్</translation>
-<translation id="6170498031581934115">ADB డీబగ్గింగ్‌ను ఎనేబుల్ చేయడం సాధ్యపడలేదు. సెట్టింగ్‌లకు వెళ్లి, ఆపై మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="6170498031581934115">ADB డీబగ్గింగ్‌ను ఎనేబుల్ చేయడం సాధ్యపడలేదు. సెట్టింగ్‌లకు వెళ్లి, ఆపై మళ్లీ ట్రై చేయండి.</translation>
<translation id="6171779718418683144">ప్రతి సందర్శనలో అడగండి</translation>
<translation id="617213288191670920">భాషలు ఏవీ జోడించబడలేదు</translation>
<translation id="6173623053897475761">మీ పిన్‌ని మళ్లీ టైప్ చేయండి</translation>
@@ -5794,7 +5794,7 @@
<translation id="6206199626856438589">తెరిచిన ట్యాబ్‌లతో సహా ప్రదర్శించబడిన సైట్‌ల నుండి మీరు సైన్ అవుట్ చేయబడతారు</translation>
<translation id="6206311232642889873">చిత్రాన్ని కా&amp;పీ చేయండి</translation>
<translation id="6206521455877863927">ఒకే డొమైన్‌కు సంబంధించిన సైట్‌లతో సహా, ఉదాహరణకు, google.com, mail.google.com. మీరు చూసే సైట్‌లు మీ పరికరంలో డేటాను సేవ్ చేయవచ్చు.</translation>
-<translation id="6207200176136643843">డిఫాల్ట్ జూమ్ స్థాయికి రీసెట్ చేయి</translation>
+<translation id="6207200176136643843">డిఫాల్ట్ జూమ్ స్థాయికి రీసెట్ చేయండి</translation>
<translation id="6207806976844244951">Google Password Manager (<ph name="EMAIL" />)కి సేవ్ చేయండి</translation>
<translation id="6207937957461833379">దేశం/ప్రాంతం</translation>
<translation id="6208521041562685716">మొబైల్ డేటా యాక్టివేట్ చేయబడుతోంది</translation>
@@ -5810,7 +5810,7 @@
<translation id="6216239400972191926">తిరస్కరించబడిన సైట్‌లు, యాప్‌లు</translation>
<translation id="6216601812881225442">సైజ్‌ మార్చబడటానికి మీ కంటైనర్ సపోర్ట్ చేయదు. Linuxకు ముందుగానే కేటాయించిన స్పేస్‌ను సర్దుబాటు చేయడానికి, బ్యాకప్ చేసి, ఆపై కొత్త కంటైనర్‌లో రీస్టోర్ చేయండి.</translation>
<translation id="6216696360484424239">ఆటోమేటిక్‌గా సైన్ ఇన్ చేయండి</translation>
-<translation id="6218058416316985984"><ph name="DEVICE_TYPE" /> ఆఫ్‌లైన్‌లో ఉంది. ఇంటర్నెట్‌కు కనెక్ట్ చేసి, మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="6218058416316985984"><ph name="DEVICE_TYPE" /> ఆఫ్‌లైన్‌లో ఉంది. ఇంటర్నెట్‌కు కనెక్ట్ చేసి, మళ్లీ ట్రై చేయండి.</translation>
<translation id="6220413761270491930">ఎక్స్‌టెన్షన్‌ను లోడ్ చేయడంలో ఎర్రర్</translation>
<translation id="6224481128663248237">ఫార్మాటింగ్ విజయవంతంగా పూర్తి అయ్యింది! </translation>
<translation id="622474711739321877">ఈ కంటైనర్ ఇప్పటికే ఉంది.</translation>
@@ -5834,7 +5834,7 @@
<translation id="6238767809035845642">ఇతర పరికరం నుండి షేర్ చేసిన వచనం</translation>
<translation id="6238923052227198598">లాక్ స్క్రీన్‌పై తాజా గమనికను ఉంచండి</translation>
<translation id="6239558157302047471">&amp;ఫ్రేమ్‌ను మళ్లీ లోడ్ చేయి</translation>
-<translation id="6240821072888636753">ప్రతిసారి అడుగు</translation>
+<translation id="6240821072888636753">ప్రతిసారి అడగాలి</translation>
<translation id="6241530762627360640">మీ సిస్టమ్‌తో జత చేయబడిన బ్లూటూత్ పరికరాలకు సంబంధించిన సమాచారాన్ని యాక్సెస్‌ చేయడానికి, సమీపంలోని బ్లూటూత్ పరికరాలను కనుగొనడానికి అనుమతి.</translation>
<translation id="6241844896329831164">యాక్సెస్ అవసరం లేదు</translation>
<translation id="6242574558232861452">మీ సంస్థకు చెందిన భద్రతా పాలసీలను చెక్ చేస్తోంది.</translation>
@@ -5981,7 +5981,7 @@
<translation id="638418309848716977">సపోర్ట్ చేయబడిన లింక్‌లు</translation>
<translation id="6384275966486438344">మీ శోధన సెట్టింగ్‌లను దీనికి మార్చండి: <ph name="SEARCH_HOST" /></translation>
<translation id="63849924261838903">{NUM_TABS,plural, =1{పేరు లేని గ్రూప్ - 1 ట్యాబ్}other{పేరు లేని గ్రూప్ - # ట్యాబ్‌లు}}</translation>
-<translation id="6385149369087767061">ఇంటర్నెట్‌కు కనెక్ట్ చేసి, మళ్లీ ప్రయత్నించండి</translation>
+<translation id="6385149369087767061">ఇంటర్నెట్‌కు కనెక్ట్ చేసి, మళ్లీ ట్రై చేయండి</translation>
<translation id="6385543213911723544">సైట్‌లు కుక్కీ డేటాను సేవ్ చేయగలవు మరియు చదవగలవు</translation>
<translation id="6385994920693662133">హెచ్చరిక - వివరణాత్మక లాగింగ్ ఎనేబుల్ చేయబడింది; ఈ కిందన పేర్కొన్న లాగ్‌లు, URLలను లేదా ఇతర గోప్యమైన సమాచారాన్ని కలిగి ఉండవచ్చు. దయచేసి ఈ సమాచారాన్ని రివ్యూ చేసి, దీన్ని సమర్పించడంలో మీకు ఎటువంటి అభ్యంతరం లేదని నిర్ధారించుకోండి.</translation>
<translation id="6387674443318562538">నిలువుగా విభజించు</translation>
@@ -6144,7 +6144,7 @@
<translation id="6532101170117367231">Google డిస్క్‌‌కు సేవ్ చేయండి</translation>
<translation id="6532106788206463496">మార్పులను సేవ్ చేయండి</translation>
<translation id="6532206849875187177">భద్రత మరియు సైన్ ఇన్</translation>
-<translation id="6532527800157340614">మీ యాక్సెస్ టోకెన్‌ని పొందడం సాధ్యం కాలేదు కాబట్టి, సైన్ ఇన్ విఫలమైంది. దయచేసి మీ నెట్‌వర్క్ కనెక్షన్‌ను చెక్ చేసి, మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="6532527800157340614">మీ యాక్సెస్ టోకెన్‌ని పొందడం సాధ్యం కాలేదు కాబట్టి, సైన్ ఇన్ విఫలమైంది. దయచేసి మీ నెట్‌వర్క్ కనెక్షన్‌ను చెక్ చేసి, మళ్లీ ట్రై చేయండి.</translation>
<translation id="6532663472409656417">ఎంటర్‌ప్రైజ్ నమోదు చేయబడింది</translation>
<translation id="6533315466883598769">Google Translateను ఉపయోగించండి</translation>
<translation id="6535331821390304775">అనుబంధిత యాప్‌లో ఈ రకమైన లింక్‌లను తెరవడానికి <ph name="ORIGIN" />ను ఎల్లప్పుడూ అనుమతించండి</translation>
@@ -6456,7 +6456,7 @@
<ph name="BR" />
<ph name="FOOTER_MESSAGE" /></translation>
<translation id="6810613314571580006">స్టోరేజ్‌ చేసిన ఆధారాలను ఉపయోగించి ఆటోమేటిక్‌గా వెబ్‌సైట్‌లకు సైన్ ఇన్ చేస్తుంది. ఫీచ‌ర్‌ను నిలిపివేసినప్పుడు, మీరు వెబ్‌సైట్‌కు సైన్ ఇన్ చేసే ప్రతిసారి నిర్ధారణ కోసం మిమ్మల్ని అడుగుతుంది.</translation>
-<translation id="6810768462515084623">అయ్యో! మీ పాస్‌వర్డ్ గడువు ముగిసింది. దయచేసి మరో పరికరంలో దానిని పునరుద్ధరించి, ఆపై మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="6810768462515084623">అయ్యో! మీ పాస్‌వర్డ్ గడువు ముగిసింది. దయచేసి మరో పరికరంలో దానిని పునరుద్ధరించి, ఆపై మళ్లీ ట్రై చేయండి.</translation>
<translation id="6811034713472274749">పేజీ చూడటానికి సిద్ధంగా ఉంది</translation>
<translation id="6811151703183939603">గట్టిగా జరపండి</translation>
<translation id="6811332638216701903">DHCP హోస్ట్‌పేరు</translation>
@@ -6782,7 +6782,7 @@
<translation id="7086672505018440886">ఆర్కైవ్‌లో Chrome లాగ్ ఫైళ్లను చేర్చండి.</translation>
<translation id="7088434364990739311">అప్‌డేట్‌ తనిఖీ ప్రారంభం విఫలమైంది (ఎర్ర‌ర్‌ కోడ్ <ph name="ERROR" />).</translation>
<translation id="7088674813905715446">నిర్వాహకులు, ఈ పరికరాన్ని కేటాయించబడని స్థితిలో ఉంచారు. దీనిని నమోదు కోసం ప్రారంభించడానికి, ఈ పరికరాన్ని పెండింగ్ స్థితిలో ఉంచమని దయచేసి మీ నిర్వాహకులను కోరండి.</translation>
-<translation id="7088960765736518739">స్విచ్ యాక్సెస్</translation>
+<translation id="7088960765736518739">Switch Access</translation>
<translation id="7089253021944603172">ట్యాబ్ మళ్లీ యాక్టివేట్ చేయబడింది</translation>
<translation id="7090160970140261931">వెబ్‌సైట్‌లు, Android యాప్‌లతో ఉపయోగించడానికి మీరు మీ <ph name="DEVICE_TYPE" />కు అదనపు ఖాతాలను జోడించవచ్చు. Android యాప్‌లతో ఏ ఖాతాలను ఉపయోగించాలో కూడా మీరు కంట్రోల్ చేయవచ్చు.</translation>
<translation id="7090714929377281710">హాట్‌స్పాట్‌ను ఆటోమేటిక్‌గా ఆఫ్ చేయండి</translation>
@@ -6809,7 +6809,7 @@
<translation id="7114054701490058191">పాస్‌‌వర్డ్‌లు సరిపోలలేదు</translation>
<translation id="7114648273807173152">మీ Google ఖాతాకు సైన్ ఇన్ చేయడం కోసం Smart Lockని ఉపయోగించడానికి, సెట్టింగ్‌లు &gt; కనెక్ట్ చేసిన పరికరాలు &gt; మీ ఫోన్ &gt; Smart Lockకు వెళ్లండి.</translation>
<translation id="7115361495406486998">అందుబాటులో కాంటాక్ట్‌లు ఏవీ లేవు</translation>
-<translation id="7117228822971127758">దయచేసి తర్వాత మళ్లీ ప్రయత్నించండి</translation>
+<translation id="7117228822971127758">దయచేసి తర్వాత మళ్లీ ట్రై చేయండి</translation>
<translation id="711840821796638741">నిర్వహించబడే బుక్‌మార్క్‌లను చూపు</translation>
<translation id="711985611146095797">మీరు సైన్ ఇన్ చేసిన Google ఖాతాలను మేనేజ్ చేయడానికి ఈ పేజీ మిమ్మల్ని అనుమతిస్తుంది. <ph name="LINK_BEGIN" />మరింత తెలుసుకోండి<ph name="LINK_END" /></translation>
<translation id="7120762240626567834">VPN కనెక్ట్ చేయకపోతే Chrome బ్రౌజర్, Android ట్రాఫిక్ బ్లాక్ చేయబడతాయి</translation>
@@ -6830,7 +6830,7 @@
<translation id="7136694880210472378">ఆటోమేటిక్ ఆప్షన్‌గా సెట్ చేయి</translation>
<translation id="7138678301420049075">ఇతర</translation>
<translation id="7139627972753429585"><ph name="APP_NAME" /> మీ మైక్రోఫోన్‌ను ఉపయోగిస్తోంది</translation>
-<translation id="7141105143012495934">మీ ఖాతా వివరాలను తిరిగి పొందలేనందున సైన్-ఇన్ విఫలమైంది. దయచేసి మీ నిర్వాహకుడిని సంప్రదించండి లేదా మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="7141105143012495934">మీ ఖాతా వివరాలను తిరిగి పొందలేనందున సైన్-ఇన్ విఫలమైంది. దయచేసి మీ నిర్వాహకుడిని సంప్రదించండి లేదా మళ్లీ ట్రై చేయండి.</translation>
<translation id="7141844554192012199">చెకప్</translation>
<translation id="7144878232160441200">మళ్ళీ ప్రయత్నించు</translation>
<translation id="7148426638542880639">సైట్‌లు మీరు ఊహించిన విధంగా పని చేయకపోవచ్చు. మీరు సందర్శించిన సైట్‌లకు సంబంధించిన సమాచారాన్ని మీరు పరికరంలో ఉంచకూడదు అనుకుంటే ఈ ఆప్షన్‌ను ఎంచుకోండి.</translation>
@@ -7136,7 +7136,7 @@
<translation id="7433957986129316853">అలాగే ఉంచండి</translation>
<translation id="7434509671034404296">డెవలపర్</translation>
<translation id="7434757724413878233">మౌస్ యాక్సిలరేషన్</translation>
-<translation id="7434969625063495310">ప్రింట్ సర్వర్‌ని జోడించడం సాధ్యపడలేదు. దయచేసి సర్వర్ కాన్ఫిగరేషన్ చెక్ చేసుకుని, ఆపై మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="7434969625063495310">ప్రింట్ సర్వర్‌ని జోడించడం సాధ్యపడలేదు. దయచేసి సర్వర్ కాన్ఫిగరేషన్ చెక్ చేసుకుని, ఆపై మళ్లీ ట్రై చేయండి.</translation>
<translation id="7436921188514130341">అయ్యో! పేరు మారుస్తున్నప్పుడు ఎర్రర్ ఏర్పడింది.</translation>
<translation id="7439519621174723623">కొనసాగించడానికి, పరికరం పేరును జోడించండి</translation>
<translation id="7441736921018636843">ఈ సెట్టింగ్‌ని మార్చడానికి, మీ సింక్‌ రహస్య పదబంధాన్ని తీసివేయడానికి <ph name="BEGIN_LINK" />సింక్‌ను రీసెట్ చేయండి<ph name="END_LINK" /></translation>
@@ -7164,7 +7164,7 @@
<translation id="7458168200501453431">Google Searchలో ఉపయోగించే స్పెల్ చెకర్‌నే ఇక్కడ ఉపయోగిస్తుంది. మీరు బ్రౌజర్‌లో టైప్ చేసే టెక్స్ట్‌ను Googleకు పంపుతుంది.</translation>
<translation id="7458715171471938198">యాప్‌లను రీస్టోర్ చేయాలా?</translation>
<translation id="7460045493116006516">మీరు ప్రస్తుతం ఇన్‌స్టాల్ చేసుకున్న థీమ్</translation>
-<translation id="7461924472993315131">పిన్ చేయి</translation>
+<translation id="7461924472993315131">పిన్ చేయండి</translation>
<translation id="746216226901520237">తదుపరిసారి మీ ఫోన్ మీ <ph name="DEVICE_TYPE" />‌ను అన్‌లాక్ చేస్తుంది. మీరు సెట్టింగ్‌లలో Smart Lockను ఆఫ్ చేయవచ్చు.</translation>
<translation id="7464153996453281700">కాంపోనెంట్ ఇప్పటికే అప్‌డేట్ అయ్యి ఉంది</translation>
<translation id="7464637891177137294">దీనిని మీ Google ఖాతా, <ph name="ACCOUNT" />లో సేవ్ చేయండి</translation>
@@ -7303,7 +7303,7 @@
<translation id="7595453277607160340">Android యాప్‌లను ఉపయోగించాలంటే, మీ <ph name="DEVICE_TYPE" /> సరిగ్గా పని చేస్తున్నట్లు నిర్ధారించుకుని, ఆపై మళ్లీ సైన్ ఇన్ చేసి, అప్‌డేట్ చేయండి.</translation>
<translation id="7595547011743502844"><ph name="ERROR" /> (ఎర్రర్ కోడ్ <ph name="ERROR_CODE" />).</translation>
<translation id="7598466960084663009">కంప్యూటర్‌ని పునఃప్రారంభించు</translation>
-<translation id="7599527631045201165">పరికరం పేరు చాలా పొడవుగా ఉంది. చిన్న పేరును నమోదు చేసి, ఆపై మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="7599527631045201165">పరికరం పేరు చాలా పొడవుగా ఉంది. చిన్న పేరును నమోదు చేసి, ఆపై మళ్లీ ట్రై చేయండి.</translation>
<translation id="7600054753482800821">సెర్చ్ ఇంజిన్‌లను, సైట్ సెర్చ్‌ను &amp;మేనేజ్ చేయండి</translation>
<translation id="7600965453749440009"><ph name="LANGUAGE" />‌ను ఎప్పటికీ అనువదించవద్దు</translation>
<translation id="760197030861754408">కనెక్ట్ చేయడానికి <ph name="LANDING_PAGE" />కి వెళ్లండి.</translation>
@@ -7316,7 +7316,7 @@
<translation id="7606992457248886637">అధికారాలు</translation>
<translation id="7607002721634913082">పాజ్ చేయబడింది</translation>
<translation id="7608810328871051088">Android ప్రాధాన్యతలు</translation>
-<translation id="7609148976235050828">దయచేసి ఇంటర్నెట్‌కి కనెక్ట్ చేసి, మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="7609148976235050828">దయచేసి ఇంటర్నెట్‌కి కనెక్ట్ చేసి, మళ్లీ ట్రై చేయండి.</translation>
<translation id="7612401678989660900">మైక్రోఫోన్ అనుమతి ఉన్న యాప్‌లు, వెబ్‌సైట్‌లకు యాక్సెస్‌ను అనుమతించండి</translation>
<translation id="7612655942094160088">కనెక్ట్ చేసిన ఫోన్ ఫీచర్‌లు ఎనేబుల్ చేయబడతాయి.</translation>
<translation id="7612989789287281429">మిమ్మల్ని సైన్ ఇన్ చేస్తోంది…</translation>
@@ -7346,7 +7346,7 @@
<translation id="7632948528260659758">కింది కియోస్క్ యాప్‌ల అప్‌డేట్‌ విఫలమైంది:</translation>
<translation id="7633724038415831385">ఈ ఒక్క సమయంలో మాత్రమే మీరు అప్‌డేట్ కోసం వేచి ఉండాల్సి వస్తుంది. Chromebookలో, సాఫ్ట్‌వేర్ అప్‌డేట్‌లు బ్యాక్‌గ్రౌండ్‌లోనే జరుగుతాయి.</translation>
<translation id="7634280112532283638">స్పామ్ &amp; మోసాన్ని తగ్గించడం</translation>
-<translation id="7634566076839829401">ఏదో తప్పు జరిగింది. దయచేసి మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="7634566076839829401">ఏదో తప్పు జరిగింది. దయచేసి మళ్లీ ట్రై చేయండి.</translation>
<translation id="7635048370253485243">మీ అడ్మినిస్ట్రేటర్ పిన్ చేశారు</translation>
<translation id="7635711411613274199">మీరు బ్రౌజ్ చేస్తున్నప్పుడు, మీకు కనిపించే యాడ్ ఈ సెట్టింగ్ ఆధారంగా, లేదా <ph name="BEGIN_LINK1" />యాడ్ టాపిక్‌ల<ph name="LINK_END1" /> ఆధారంగా, లేదా మీ <ph name="BEGIN_LINK2" />కుక్కీ సెట్టింగ్‌ల<ph name="LINK_END2" /> ఆధారంగా వ్యక్తిగతీకరించబడవచ్చు, అలాగే మీరు చూసే సైట్ యాడ్‌లను వ్యక్తిగతీకరించవచ్చు</translation>
<translation id="7636919061354591437">ఈ పరికరంలో ఇన్‌స్టాల్ చేయి</translation>
@@ -7628,7 +7628,7 @@
<translation id="7872758299142009420">చాలా ఎక్కువ Nest చేయబడిన గ్రూప్‌లు: <ph name="ERROR_LINE" /></translation>
<translation id="7874257161694977650">Chrome నేపథ్యాలు</translation>
<translation id="7876027585589532670">షార్ట్‌కట్‌ను ఎడిట్ చేయడం సాధ్యపడదు</translation>
-<translation id="7877451762676714207">తెలియని సర్వర్ ఎర్రర్. దయచేసి మళ్లీ ప్రయత్నించండి లేదా సర్వర్ నిర్వాహకుడిని సంప్రదించండి.</translation>
+<translation id="7877451762676714207">తెలియని సర్వర్ ఎర్రర్. దయచేసి మళ్లీ ట్రై చేయండి లేదా సర్వర్ నిర్వాహకుడిని సంప్రదించండి.</translation>
<translation id="7879478708475862060">ఇన్‌పుట్ మోడ్‌ను అనుసరించండి</translation>
<translation id="7879631849810108578">షార్ట్‌కట్ సెట్ చేయబడింది: <ph name="IDS_SHORT_SET_COMMAND" /></translation>
<translation id="7880823633812189969">మీరు పునఃప్రారంభించినప్పుడు స్థానిక డేటా తొలగించబడుతుంది</translation>
@@ -7698,7 +7698,7 @@
<translation id="7933314993013528982">{NUM_TABS,plural, =1{సైట్‌ను అన్‌మ్యూట్ చేయి}other{సైట్‌లను అన్‌మ్యూట్ చేయి}}</translation>
<translation id="7933518760693751884">తర్వాతి అవసరాల కోసం పేజీని సేవ్ చేయడానికి, బుక్‌మార్క్ చిహ్నాన్ని క్లిక్ చేయండి</translation>
<translation id="7933634003144813719">షేర్ చేసిన ఫోల్డర్‌లను నిర్వహించండి</translation>
-<translation id="793531125873261495">వర్చువల్ మెషిన్‌ను డౌన్‌లోడ్ చేయడంలో ఎర్రర్ ఏర్పడింది. దయచేసి మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="793531125873261495">వర్చువల్ మెషిన్‌ను డౌన్‌లోడ్ చేయడంలో ఎర్రర్ ఏర్పడింది. దయచేసి మళ్లీ ట్రై చేయండి.</translation>
<translation id="7935451262452051102"><ph name="PERCENT" />% పూర్తయింది</translation>
<translation id="7939062555109487992">అధునాతన ఎంపికలు</translation>
<translation id="7939073735115504773"><ph name="HOST" />ను చదవడానికి, మార్చడానికి ఈ ఎక్స్‌టెన్షన్ చిహ్నంపై క్లిక్ చేయండి</translation>
@@ -7765,7 +7765,7 @@
<translation id="7988355189918024273">సులభంగా యాక్సెస్‌ చేసే ఫీచ‌ర్‌లను ప్రారంభించండి</translation>
<translation id="7988805580376093356">మీ OSను అలానే ఉంచి, USB నుండి <ph name="DEVICE_OS" />‌ను రన్ చేయండి.</translation>
<translation id="7990863024647916394"><ph name="DISPLAY_NAME" /> వాయిస్ <ph name="COUNT" /></translation>
-<translation id="7991296728590311172">స్విచ్ యాక్సెస్ సెట్టింగ్‌లు</translation>
+<translation id="7991296728590311172">Switch Access సెట్టింగ్‌లు</translation>
<translation id="7992203134935383159">స్పీచ్ సింథసిస్</translation>
<translation id="7994515119120860317"><ph name="VISUAL_SEARCH_PROVIDER" />తో ఇమేజ్‌లోని టెక్స్ట్‌ను అనువదించండి</translation>
<translation id="799570308305997052">వెబ్ వీక్షణ</translation>
@@ -7786,7 +7786,7 @@
<translation id="8011875486979733097">Steamను ఇన్‌స్టాల్ చేయడం సాధ్యపడదు</translation>
<translation id="8013993649590906847">చిత్రంలో ఉపయోగకరమైన వివరణ లేకుంటే, మీ కోసం ఒక వివరణను అందించడానికి Chrome ప్రయత్నిస్తుంది. వివరణలను క్రియేట్ చేయడానికి, చిత్రాలు Googleకు పంపబడతాయి.</translation>
<translation id="8014154204619229810">అప్‌డేటర్ ప్రస్తుతం అమలులో ఉంది. మళ్లీ చెక్ చేయడానికి ఒక నిమిషం తర్వాత రిఫ్రెష్ చేయండి.</translation>
-<translation id="8014206674403687691"><ph name="IDS_SHORT_PRODUCT_NAME" /> మునుపు ఇన్‌స్టాల్ చేసిన వెర్షన్‌కు తిరిగి మారలేకపోయింది. దయచేసి మీ పరికరాన్ని పవర్‌వాష్ చేయడానికి మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="8014206674403687691"><ph name="IDS_SHORT_PRODUCT_NAME" /> మునుపు ఇన్‌స్టాల్ చేసిన వెర్షన్‌కు తిరిగి మారలేకపోయింది. దయచేసి మీ పరికరాన్ని పవర్‌వాష్ చేయడానికి మళ్లీ ట్రై చేయండి.</translation>
<translation id="8015812716978143">అన్ని డౌన్‌లోడ్‌లను కొత్త ట్యాబ్‌లో చూడండి</translation>
<translation id="8016266267177410919">తాత్కాలిక స్టోరేజ్‌</translation>
<translation id="8017176852978888182">Linux షేర్ చేసిన డైరెక్టరీలు</translation>
@@ -7896,7 +7896,7 @@
<translation id="8100972288595615768"><ph name="SITE_NAME" />లో సైట్ డేటాను, అనుమతులను క్లియర్ చేయాలనుకుంటున్నారా?</translation>
<translation id="8101409298456377967">మీ పాస్‌వర్డ్‌లను క్రియేట్ చేయండి, సేవ్ చేయండి, అలాగే మేనేజ్ చేయండి, తద్వారా మీరు సైట్‌లకు, యాప్‌లకు సులభంగా సైన్ ఇన్ చేయవచ్చు. <ph name="BEGIN_LINK" />మరింత తెలుసుకోండి<ph name="END_LINK" /></translation>
<translation id="810185532889603849">అనుకూల రంగు</translation>
-<translation id="8101987792947961127">తరువాత రీబూట్‌లో పవర్‌వాష్ అవసరం</translation>
+<translation id="8101987792947961127">తర్వాత రీబూట్‌లో పవర్‌వాష్ అవసరం</translation>
<translation id="8102139037507939978">system_logs.txt నుండి వ్యక్తిగతంగా గుర్తించగలిగే సమాచారాన్ని తొలగించండి.</translation>
<translation id="810362914482827094">పాస్-కీలను సెర్చ్ చేయండి</translation>
<translation id="8104088837833760645">eSIM ప్రొఫైల్‌ను డౌన్‌లోడ్ చేయండి</translation>
@@ -7939,7 +7939,7 @@
<translation id="8145170459658034418">మెమరీ సేవర్</translation>
<translation id="8146177459103116374">మీరు ఇప్పటికే ఈ పరికరంలో నమోదు చేసి ఉంటే, మీరు <ph name="LINK2_START" />ఇప్పటికే ఉన్న వినియోగదారు వలే సైన్ ఇన్ చేయవచ్చు<ph name="LINK2_END" />.</translation>
<translation id="8146287226035613638">మీ ప్రాధాన్య భాషలను జోడించి, వాటికి ర్యాంకింగ్ ఇవ్వండి. సాధ్యమైనప్పుడల్లా, వెబ్‌సైట్‌లు, తమ కంటెంట్‌ను మీ ప్రాధాన్య భాషలలో చూపుతాయి. ఈ ప్రాధాన్యతలు మీ బ్రౌజర్ సెట్టింగ్‌లతో సింక్ చేయబడతాయి. <ph name="BEGIN_LINK_LEARN_MORE" />మరింత తెలుసుకోండి<ph name="END_LINK_LEARN_MORE" /></translation>
-<translation id="8146793085009540321">సైన్-ఇన్ విఫలమైంది. దయచేసి మీ నిర్వాహకులను సంప్రదించండి లేదా మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="8146793085009540321">సైన్-ఇన్ విఫలమైంది. దయచేసి మీ నిర్వాహకులను సంప్రదించండి లేదా మళ్లీ ట్రై చేయండి.</translation>
<translation id="8147346945017130012">క్రాష్ రిపోర్ట్‌లు, సమస్య విశ్లేషణలు, వినియోగ డేటాను ఆటోమేటిక్‌గా Googleకు పంపడం ద్వారా Chrome, అలాగే ChromeOS ఫీచర్‌ల పనితీరును మెరుగుపరచడంలో సహాయపడండి.</translation>
<translation id="8147900440966275470"><ph name="NUM" /> ట్యాబ్ కనుగొనబడింది</translation>
<translation id="8148760431881541277">సైన్ ఇన్‌ను పరిమితం చేయండి</translation>
@@ -8349,7 +8349,7 @@
<translation id="8528962588711550376">సైన్ ఇన్ అవుతోంది.</translation>
<translation id="8529925957403338845">తక్షణ టెథెరింగ్ కనెక్షన్ విఫలమైంది</translation>
<translation id="8531701051932785007">మెరుగైన సురక్షిత బ్రౌజింగ్ ఆఫ్ చేయబడింది</translation>
-<translation id="8534656636775144800">అయ్యో! డొమైన్‌‌ను చేర్చడానికి ప్రయత్నిస్తున్నప్పుడు ఏదో తప్పు జరిగింది. దయచేసి మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="8534656636775144800">అయ్యో! డొమైన్‌‌ను చేర్చడానికి ప్రయత్నిస్తున్నప్పుడు ఏదో తప్పు జరిగింది. దయచేసి మళ్లీ ట్రై చేయండి.</translation>
<translation id="8535005006684281994">Netscape సర్టిఫికెట్ పునరుద్ధరణ URL</translation>
<translation id="8536713137312218707">క్విక్ కమాండ్స్</translation>
<translation id="8536956381488731905">కీని నొక్కినప్పుడు ధ్వని</translation>
@@ -8422,7 +8422,7 @@
<translation id="8607326572516521315">మోసాన్ని ఎదుర్కోవడంలో, అలాగే వ్యక్తులకు, బాట్‌లకు మధ్య ఉన్న తేడాను గుర్తించడంలో సైట్‌లకు సహాయపడటానికి స్పామ్ &amp; మోసం తగ్గింపు ప్రైవేట్ స్టేట్ టోకెన్‌లపై ఆధారపడుతుంది.</translation>
<translation id="8608618451198398104">Kerberos టిక్కెట్‌ను జోడించండి</translation>
<translation id="8609465669617005112">పైకి తరలించు</translation>
-<translation id="8610103157987623234">ఫార్మాట్ తప్పు, దయచేసి మళ్లీ ప్రయత్నించండి</translation>
+<translation id="8610103157987623234">ఫార్మాట్ తప్పు, దయచేసి మళ్లీ ట్రై చేయండి</translation>
<translation id="8611682088849615761">MIDI డివైజ్‌లపై పూర్తి కంట్రోల్‌ను కలిగి ఉండటానికి ఈ సైట్‌ను అనుమతించడాన్ని కొనసాగించండి</translation>
<translation id="8613164732773110792">లోయర్‌కేస్ అక్షరాలు, అంకెలు, కింది గీతలు లేదా డాష్‌లు మాత్రమే</translation>
<translation id="8613645710357126807">ఎక్స్‌టెన్షన్‌లను ఉపయోగించడానికి అనుమతి లేదు</translation>
@@ -8484,7 +8484,7 @@
<translation id="8652400352452647993">ప్యాక్ ఎక్స్‌టెన్షన్ ఎర్రర్</translation>
<translation id="8654151524613148204">మీ కంప్యూటర్ మేనేజ్ చేయడానికి ఫైల్ చాలా పెద్దదిగా ఉంది. క్షమించండి.</translation>
<translation id="8655295600908251630">ఛానల్</translation>
-<translation id="8655972064210167941">మీ పాస్‌వర్డ్‌ను ధృవీకరించలేకపోయినందున సైన్-ఇన్ విఫలమైంది. దయచేసి మీ నిర్వాహకుడిని సంప్రదించండి లేదా మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="8655972064210167941">మీ పాస్‌వర్డ్‌ను ధృవీకరించలేకపోయినందున సైన్-ఇన్ విఫలమైంది. దయచేసి మీ నిర్వాహకుడిని సంప్రదించండి లేదా మళ్లీ ట్రై చేయండి.</translation>
<translation id="8657393004602556571">మీరు ఫీడ్‌బ్యాక్‌ను విస్మరించాలనుకుంటున్నారా?</translation>
<translation id="8661290697478713397">అజ్ఞా&amp;త విండోలో లింక్‌ను తెరువు</translation>
<translation id="8662671328352114214"><ph name="TYPE" /> నెట్‌వర్క్‌లో చేరండి</translation>
@@ -8748,7 +8748,7 @@
<translation id="8879284080359814990">&amp;ట్యాబ్ లాగా చూపండి</translation>
<translation id="8879921471468674457">సైన్-ఇన్ సమాచారం గుర్తుంచుకో</translation>
<translation id="8880054210564666174">కాంటాక్ట్ లిస్ట్‌ను డౌన్‌లోడ్ చేయడం సాధ్యపడలేదు. దయచేసి మీ నెట్‌వర్క్ కనెక్షన్‌ను చెక్ చేయండి, లేదా <ph name="LINK_BEGIN" />మళ్లీ ట్రై చేయండి<ph name="LINK_END" />.</translation>
-<translation id="8881020143150461183">దయచేసి మళ్లీ ప్రయత్నించండి. సాంకేతిక మద్దతు పొందడానికి, <ph name="CARRIER_NAME" />ను సంప్రదించండి.</translation>
+<translation id="8881020143150461183">దయచేసి మళ్లీ ట్రై చేయండి. సాంకేతిక మద్దతు పొందడానికి, <ph name="CARRIER_NAME" />ను సంప్రదించండి.</translation>
<translation id="888256071122006425">మౌస్, టచ్‌ప్యాడ్ సెట్టింగ్‌లు</translation>
<translation id="8883273463630735858">టచ్‌ప్యాడ్ యాక్సిలరేషన్‌ను ప్రారంభించండి</translation>
<translation id="8884023684057697730"><ph name="BEGIN_BOLD" />మీరు మీ డేటాను ఎలా మేనేజ్ చేసుకోగలరు:<ph name="END_BOLD" /> మీ గోప్యతను రక్షించడానికి, 4 వారాల కంటే పాతవైన సైట్‌లను మేము లిస్ట్ నుండి ఆటోమేటిక్‌గా తొలగిస్తాము. మీరు మళ్లీ సందర్శించే సైట్ ఆ లిస్ట్‌లో మళ్లీ కనిపించవచ్చు. లేదా మీ కోసం, ఆసక్తి ఉన్న టాపిక్‌లను ఇకపై ఏదైనా సైట్ చూపించకూడదు అని మీరు భావిస్తే, ఆ సైట్‌ను మీరు తీసివేయవచ్చు.</translation>
@@ -8800,7 +8800,7 @@
<translation id="8933960630081805351">శోధినిలో &amp;చూపించు</translation>
<translation id="8934732568177537184">కొనసాగించండి</translation>
<translation id="8938800817013097409">USB-C పరికరం (వెనుక భాగంలో కుడి పోర్ట్)</translation>
-<translation id="8940081510938872932">ప్రస్తుతం మీ కంప్యూటర్ అనేక చర్యలను అమలు చేస్తోంది. తర్వాత మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="8940081510938872932">ప్రస్తుతం మీ కంప్యూటర్ అనేక చర్యలను అమలు చేస్తోంది. తర్వాత మళ్లీ ట్రై చేయండి.</translation>
<translation id="8940381019874223173">మీ Google Photos నుండి</translation>
<translation id="8941173171815156065">'<ph name="PERMISSION" />' అనుమతిని ఉపసంహరించు</translation>
<translation id="8941688920560496412"><ph name="DEVICE_NAME" /> ఆఫ్‌లో ఉంది</translation>
@@ -8899,7 +8899,7 @@
<translation id="9023015617655685412">ఈ ట్యాబ్‌ను బుక్‌మార్క్ చేయండి...</translation>
<translation id="9023909777842748145">ఈ ఫీచర్‌ను ఆఫ్ చేయడం వలన సిస్టమ్ అప్‌డేట్‌లు, భద్రత లాంటి ముఖ్యమైన సేవలకు అవసరమైన సమాచారాన్ని పంపగల మీ పరికర సామర్థ్యం ప్రభావితం కాదు.</translation>
<translation id="9024127637873500333">&amp;కొత్త‌ ట్యాబ్‌లో తెరువు</translation>
-<translation id="9024158959543687197">షేర్‌ను మౌంట్ చేయడంలో ఎర్రర్ ఏర్పడింది. ఫైల్ షేర్ URLని చెక్ చేసి, ఆపై మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="9024158959543687197">షేర్‌ను మౌంట్ చేయడంలో ఎర్రర్ ఏర్పడింది. ఫైల్ షేర్ URLని చెక్ చేసి, ఆపై మళ్లీ ట్రై చేయండి.</translation>
<translation id="9024692527554990034">ఒక నిర్దిష్ట సైట్‌ను వేగంగా వెతకడానికి లేదా వేరొక సెర్చ్ ఇంజిన్‌ను ఉపయోగించడానికి మీరు అడ్రస్ బార్‌లో షార్ట్‌కట్‌లను ఉపయోగించవచ్చు</translation>
<translation id="902638246363752736">కీబోర్డ్ సెట్టింగ్‌లు</translation>
<translation id="9026731007018893674">డౌన్‌లోడ్</translation>
@@ -8979,7 +8979,7 @@
<translation id="9085776959277692427"><ph name="LANGUAGE" /> ఎంచుకోబడలేదు. ఎంచుకోవడానికి 'Search + Space'ను నొక్కండి.</translation>
<translation id="9087949559523851360">పరిమితం చేయబడిన యూజర్‌ను జోడించండి</translation>
<translation id="9088234649737575428"><ph name="PLUGIN_NAME" /> ఎంటర్‌ప్రైజ్ విధానం వలన బ్లాక్ చేయబడింది</translation>
-<translation id="9088446193279799727">Linuxను కాన్ఫిగర్ చేయడం సాధ్యం కాలేదు. ఇంటర్నెట్‌కు కనెక్ట్ చేసి, మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="9088446193279799727">Linuxను కాన్ఫిగర్ చేయడం సాధ్యం కాలేదు. ఇంటర్నెట్‌కు కనెక్ట్ చేసి, మళ్లీ ట్రై చేయండి.</translation>
<translation id="9089416786594320554">ఇన్‌పుట్ పద్ధతులు</translation>
<translation id="9090044809052745245">మీ పరికరం ఇతరులకు ఇలా కనిపిస్తుంది</translation>
<translation id="9093470422440389061">Wi-Fi పనితీరు కొలమానాలు</translation>
@@ -9057,7 +9057,7 @@
<translation id="9157096865782046368">0.8 సెకన్లు</translation>
<translation id="9157697743260533322">వినియోగదారులందరి కోసం ఆటోమేటిక్ అప్‌డేట్‌లను సెటప్ చేయడం విఫలమైంది (ప్రీఫ్లయిట్ ప్రారంభ ఎర్రర్: <ph name="ERROR_NUMBER" />)</translation>
<translation id="9157915340203975005">ప్రింటర్ డోర్ తెరిచి ఉంది</translation>
-<translation id="9158715103698450907">అయ్యో! ప్రామాణీకరణ సమయంలో నెట్‌వర్క్ కమ్యూనికేషన్ సమస్య ఏర్పడింది. దయచేసి మీ నెట్‌వర్క్ కనెక్షన్‌ను చెక్ చేసి, మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="9158715103698450907">అయ్యో! ప్రామాణీకరణ సమయంలో నెట్‌వర్క్ కమ్యూనికేషన్ సమస్య ఏర్పడింది. దయచేసి మీ నెట్‌వర్క్ కనెక్షన్‌ను చెక్ చేసి, మళ్లీ ట్రై చేయండి.</translation>
<translation id="9159643062839240276">ఇలా ప్రయత్నించండి:
<ph name="BEGIN_LIST" />
<ph name="LIST_ITEM" />నెట్‌వర్క్ కేబుల్‌లు, మోడెమ్, రూటర్‌ను చెక్ చేయండి
diff --git a/chromium/chrome/app/resources/generated_resources_th.xtb b/chromium/chrome/app/resources/generated_resources_th.xtb
index 783c30149fa..08a18c38053 100644
--- a/chromium/chrome/app/resources/generated_resources_th.xtb
+++ b/chromium/chrome/app/resources/generated_resources_th.xtb
@@ -2126,7 +2126,7 @@
<translation id="2836269494620652131">ขัดข้อง</translation>
<translation id="283669119850230892">หากต้องการใช้เครือข่าย <ph name="NETWORK_ID" /> ก่อนอื่น ให้เชื่อมต่ออินเทอร์เน็ตตามด้านล่างนี้</translation>
<translation id="2838379631617906747">การติดตั้ง</translation>
-<translation id="2839032553903800133">บล็อกการแจ้งเตือนอยู่</translation>
+<translation id="2839032553903800133">การแจ้งเตือนถูกบล็อก</translation>
<translation id="2841013758207633010">เวลา</translation>
<translation id="2841837950101800123">ผู้ให้บริการ</translation>
<translation id="2842013086666334835">ลงชื่อเข้าใช้ "<ph name="NETWORK_ID" />"</translation>
@@ -2878,7 +2878,7 @@
<translation id="3541823293333232175">กำหนดแล้ว</translation>
<translation id="3543393733900874979">การอัปเดตล้มเหลว (ข้อผิดพลาด: <ph name="ERROR_NUMBER" />)</translation>
<translation id="3543597750097719865">ลายเซ็น X9.62 ECDSA ที่มี SHA-512</translation>
-<translation id="3544058026430919413">บริษัทสามารถกำหนดกลุ่มเว็บไซต์ที่ใช้คุกกี้เพื่อแชร์กิจกรรมในกลุ่มได้ ตัวเลือกนี้จะปิดไว้ในโหมดไม่ระบุตัวตน</translation>
+<translation id="3544058026430919413">บริษัทสามารถกำหนดกลุ่มเว็บไซต์ที่ใช้คุกกี้เพื่อแชร์กิจกรรมของคุณในกลุ่มได้ ตัวเลือกนี้จะปิดไว้ในโหมดไม่ระบุตัวตน</translation>
<translation id="3544879808695557954">ชื่อผู้ใช้ (ไม่บังคับ)</translation>
<translation id="354602065659584722">นำซอฟต์แวร์อันตรายออกแล้ว</translation>
<translation id="3547954654003013442">การตั้งค่าพร็อกซี</translation>
@@ -7791,7 +7791,7 @@
<translation id="8028993641010258682">ขนาด</translation>
<translation id="8029492516535178472"><ph name="WINDOW_TITLE" /> - ขอสิทธิ์ กด ⌘ + Option + ลูกศรขึ้นเพื่อตอบกลับ</translation>
<translation id="8030169304546394654">ยกเลิกการเชื่อมต่อแล้ว</translation>
-<translation id="8030852056903932865">อนุญาต</translation>
+<translation id="8030852056903932865">อนุมัติ</translation>
<translation id="8032244173881942855">ไม่สามารถแคสต์แท็บ</translation>
<translation id="8032569120109842252">กำลังติดตาม</translation>
<translation id="8033023935541439900">เมนูเครื่องหมายการเน้นเสียงเปิดอยู่ กดซ้ายหรือขวาเพื่อเลือกเครื่องหมายที่ต้องการและกด Enter เพื่อแทรก</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_tr.xtb b/chromium/chrome/app/resources/generated_resources_tr.xtb
index 76918f42364..993ec7a09b5 100644
--- a/chromium/chrome/app/resources/generated_resources_tr.xtb
+++ b/chromium/chrome/app/resources/generated_resources_tr.xtb
@@ -544,7 +544,7 @@ Uygulamalara vermiş olduğunuz izinler bu hesap için geçerli olabilir. Androi
<translation id="1480663089572535854">"Seç"in atamasını değiştirmek için geri dönebilirsiniz. Otomatik tarama özelliğini istediğiniz zaman Ayarlar'dan kapatabilirsiniz.</translation>
<translation id="1481537595330271162">Disk yeniden boyutlandırılırken hata oluştu</translation>
<translation id="1482626744466814421">Bu Sekmeye Yer İşareti Koy...</translation>
-<translation id="1482772681918035149">Şifreleri düzenlemek</translation>
+<translation id="1482772681918035149">şifreleri düzenlemek</translation>
<translation id="1483493594462132177">Gönder</translation>
<translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
<translation id="1484979925941077974">Sitede Bluetooth bağlantısı kullanılıyor</translation>
@@ -561,7 +561,7 @@ Uygulamalara vermiş olduğunuz izinler bu hesap için geçerli olabilir. Androi
<translation id="1503392482221435031">Kullanım istatistiklerini Google'a otomatik olarak gönderir. Kilitlenme raporlarını cihazınızın ayarlarından açabilir veya kapatabilirsiniz.</translation>
<translation id="150411034776756821"><ph name="SITE" /> sitesini kaldır</translation>
<translation id="1504551620756424144">Paylaşılan klasörleri Windows'da <ph name="BASE_DIR" /> adresinde bulabilirsiniz.</translation>
-<translation id="1505494256539862015">Şifreleri dışa aktarmak</translation>
+<translation id="1505494256539862015">şifreleri dışa aktarmak</translation>
<translation id="1506061864768559482">Arama motoru</translation>
<translation id="1507170440449692343">Bu sayfanın kameranıza erişimi engellenmiştir.</translation>
<translation id="1507246803636407672">&amp;Sil</translation>
@@ -1196,7 +1196,7 @@ Cihazınızda Family Link uygulamasını yükleyerek bu hesabın ayarlarını y
<translation id="2048554637254265991">Kapsayıcı yöneticisi başlatılırken hata oluştu. Lütfen tekrar deneyin.</translation>
<translation id="2048653237708779538">İşlem kullanılamıyor</translation>
<translation id="204914487372604757">Kısayol oluştur </translation>
-<translation id="2050339315714019657">Dikey</translation>
+<translation id="2050339315714019657">Portre</translation>
<translation id="2051555741181591333">Hotspot'u otomatik olarak devre dışı bırak</translation>
<translation id="2052572566310583903">Diğer cihazlarınızda yüklü</translation>
<translation id="2053105195397337973">Sitelerin, reklam spam'ini ve sahtekarlığı durdurmasını sağlarken siteler arası izlemeyi kısıtlamanın yollarını da araştırıyoruz.</translation>
@@ -2477,7 +2477,7 @@ Sunucunun mesajı: <ph name="SERVER_MSG" /></translation>
<translation id="3160928651883997588">VPN Tercihleri</translation>
<translation id="3161522574479303604">Tüm diller</translation>
<translation id="3162853326462195145">Okul hesabı</translation>
-<translation id="3162899666601560689">Siteler size daha iyi bir göz atma deneyimi sunmak, örneğin, oturumunuzu açık tutmak veya alışveriş sepetinizdeki ürünleri hatırlamak için çerez kullanabilir</translation>
+<translation id="3162899666601560689">Siteler size daha iyi bir göz atma deneyimi sunmak, örneğin, oturumunuzu açık tutmak veya alışveriş sepetinizdeki ürünleri hatırlamak için çerez kullanabilir.</translation>
<translation id="3163201441334626963"><ph name="VENDOR_ID" /> adlı satıcı firma tarafından sağlanan <ph name="PRODUCT_ID" /> ürün kimliğine sahip bilinmeyen ürün</translation>
<translation id="3163511056918491211">Verilerinizi istediğiniz zaman kolayca geri yükleyebilir veya cihazlar arasında geçiş yapabilirsiniz. Yedek verileriniz Google'a yüklenir ve Google Hesabınızın şifresi kullanılarak şifrelenir.</translation>
<translation id="3164329792803560526">Bu sekme <ph name="APP_NAME" /> ile paylaşılıyor</translation>
@@ -3196,7 +3196,7 @@ Sunucunun mesajı: <ph name="SERVER_MSG" /></translation>
<translation id="3814529970604306954">Okul Hesabı</translation>
<translation id="3816118180265633665">Chrome Renkleri</translation>
<translation id="3817524650114746564">Bilgisayarınızın proxy ayarlarını açın</translation>
-<translation id="3817873131406403663"><ph name="BEGIN_PARAGRAPH1" />ChromeOS cihazların otomatik raporlar göndermesine izin vererek ChromeOS ile ilgili düzeltme ve iyileştirme çalışmalarımızda nelere öncelik verileceğini belirlememize yardımcı olursunuz. Chrome OS kilitlenme zamanı, kullandığınız özellikler ve genellikle kullandığınız bellek miktarı gibi bilgiler bu raporlarda yer alabilir.<ph name="END_PARAGRAPH1" />
+<translation id="3817873131406403663"><ph name="BEGIN_PARAGRAPH1" />ChromeOS cihazların otomatik raporlar göndermesine izin vererek ChromeOS ile ilgili düzeltme ve iyileştirme çalışmalarımızda nelere öncelik verileceğini belirlememize yardımcı olursunuz. ChromeOS kilitlenme zamanı, kullandığınız özellikler ve genellikle kullandığınız bellek miktarı gibi bilgiler bu raporlarda yer alabilir.<ph name="END_PARAGRAPH1" />
<ph name="BEGIN_PARAGRAPH2" />İstediğiniz zaman Chrome cihaz ayarlarınızda bu raporlara izin verebilir veya izni iptal edebilirsiniz. Alan yöneticisiyseniz bu ayarı yönetici konsolunda değiştirebilirsiniz.<ph name="END_PARAGRAPH2" /></translation>
<translation id="3819164369574292143">Ekrandaki öğeleri büyütmek için yakınlaştırın. Büyüteci açmak ve kapatmak için Arama + Ctrl + M tuşlarını kullanın. Yakınlaştırılmış ekranda gezinmek için de Ctrl + Alt + Ok tuşlarını kullanın.</translation>
<translation id="3819257035322786455">Yedekleme</translation>
@@ -3432,7 +3432,7 @@ Sunucunun mesajı: <ph name="SERVER_MSG" /></translation>
<translation id="402184264550408568">(TCP)</translation>
<translation id="4021909830315618592">Yapı ayrıntılarını kopyala</translation>
<translation id="4021941025609472374">Soldaki sekmeleri kapat</translation>
-<translation id="402211067068791756">Bu işlem, siteler tarafından görüntülenen <ph name="TOTAL_USAGE" /> veriyi temizleyecek</translation>
+<translation id="402211067068791756">Bu işlem, görüntülenen siteler tarafından depolanan <ph name="TOTAL_USAGE" /> veriyi temizleyecek</translation>
<translation id="4022426551683927403">Sözlüğe &amp;Ekle</translation>
<translation id="4025039777635956441">Seçili Sitenin Sesini Kapat</translation>
<translation id="402707738228916911"><ph name="AUTHORIZE_INSTRUCTION_NAME" /> talimatı alındı</translation>
@@ -3557,7 +3557,7 @@ Sunucunun mesajı: <ph name="SERVER_MSG" /></translation>
<translation id="4132969033912447558"><ph name="FILE_NAME" /> indirme işlemini devam ettir</translation>
<translation id="4133076602192971179">Şifrenizi değiştirmek için uygulamayı açın</translation>
<translation id="4134818201340504801">Kurulumu tamamlayacak kadar yeterli depolama alanı yok. Lütfen depolama alanında yer açıp tekrar deneyin</translation>
-<translation id="4135746311382563554">Google Chrome ve Chrome OS ek hizmet şartları</translation>
+<translation id="4135746311382563554">Google Chrome ve ChromeOS ek hizmet şartları</translation>
<translation id="4136203100490971508">Gece Işığı güneş doğduğunda otomatik olarak kapatılır</translation>
<translation id="41365691917097717">Devam edilirse ADB hata ayıklama işlevi, Android uygulaması oluşturmak ve test etmek için etkinleştirilir. Bu işlemin Google tarafından doğrulanmamış Android uygulamalarının yüklenmesine izin verdiğini, fabrika ayarlarına sıfırlama işlemi yapılmadan devre dışı bırakılamayacağını unutmayın.</translation>
<translation id="4138267921960073861">Oturum açma ekranında kullanıcı adlarını ve fotoğrafları göster</translation>
@@ -4542,7 +4542,7 @@ Uzaklaştırmak için Ctrl + Alt + Parlaklığı Azalt tuşlarını kullanın.</
<translation id="5066160542186949327">Başka bir klasöre taşı</translation>
<translation id="5067399438976153555">Her zaman açık</translation>
<translation id="5067867186035333991"><ph name="HOST" /> sitesi mikrofonuma erişmek isterse sor</translation>
-<translation id="5068553687099139861">Şifreleri göstermek</translation>
+<translation id="5068553687099139861">şifreleri göstermek</translation>
<translation id="5068918910148307423">Yeni kapatılan sitelerin veri gönderme ve alma işlemini bitirmesine izin verme</translation>
<translation id="5068919226082848014">Pizza</translation>
<translation id="5070710277167211639">Gezinmeleri HTTPS'ye yükseltip bu uzantıyı desteklemeyen siteleri yüklemeden önce sizi uyarır</translation>
@@ -5776,7 +5776,7 @@ Hassas bilgileri vermediğinizden emin olun.</translation>
<translation id="6201608810045805374">Bu hesap kaldırılsın mı?</translation>
<translation id="6202304368170870640">Cihazınızda oturum açmak veya cihazınızın kilidini açmak için PIN'inizi kullanabilirsiniz.</translation>
<translation id="6205314730813004066">Reklam gizliliği</translation>
-<translation id="6206199626856438589">Açık sekmeler de dahil olmak üzere görüntülenen sitelerde oturumunuz kapatılır</translation>
+<translation id="6206199626856438589">Açık sekmeler de dahil olmak üzere görüntülenen sitelerde oturumunuz kapatılacak</translation>
<translation id="6206311232642889873">Resmi Kop&amp;yala</translation>
<translation id="6206521455877863927">google.com ve mail.google.com gibi aynı alandaki siteler dahildir. Görüntülediğiniz siteler cihazınıza veri kaydedebilir.</translation>
<translation id="6207200176136643843">Varsayılan yakınlaştırma seviyesine sıfırla</translation>
@@ -7013,7 +7013,7 @@ Güvenliği ihlal edilmiş # şifreniz daha var. Google Şifre Yöneticisi bu ş
<translation id="7346909386216857016">Tamam, anladım</translation>
<translation id="7347751611463936647">Bu uzantıyı kullanmak için "<ph name="EXTENSION_KEYWORD" />" yazın, ardından SEKME tuşuna basın ve komutunuzu veya arama teriminizi girin.</translation>
<translation id="7347943691222276892"><ph name="SUBPAGE_TITLE" /> sayfasından ayrılmak için tıklayın.</translation>
-<translation id="7348093485538360975">Ekran klavyesi</translation>
+<translation id="7348093485538360975">Dokunmatik klavye</translation>
<translation id="7349010927677336670">Videonun Düzgün Oynatılması</translation>
<translation id="7352651011704765696">Bir şeyler ters gitti</translation>
<translation id="7353261921908507769">Kişileriniz yakındayken sizinle içerik paylaşabilirler. Siz kabul edene kadar aktarım başlamaz.</translation>
@@ -7023,7 +7023,7 @@ Güvenliği ihlal edilmiş # şifreniz daha var. Google Şifre Yöneticisi bu ş
<translation id="735745346212279324">VPN bağlantısı kesildi</translation>
<translation id="7358324924540718595">Bugün için anılar gizlendi</translation>
<translation id="7358338787722390626">Aramayı yan panelde kapat</translation>
-<translation id="735994578317267253">Uygulamalarınıza, ayarlarınıza ve daha fazlasına herhangi bir Chrome OS cihazda erişme</translation>
+<translation id="735994578317267253">Uygulamalarınıza, ayarlarınıza ve daha fazlasına herhangi bir ChromeOS cihazda erişme</translation>
<translation id="7360233684753165754"><ph name="PRINTER_NAME" /> adlı yazıcıya <ph name="PAGE_NUMBER" /> sayfa</translation>
<translation id="7360257054721917104">Kayıtlı masalar ve şablonlar gösteriliyor. Gezinmek için sekme tuşuna basın.</translation>
<translation id="7361297102842600584"><ph name="PLUGIN_NAME" /> eklentisini çalıştırmak için sağ tıklayın</translation>
@@ -7584,7 +7584,7 @@ Atamayı kaldırmak için atanmış bir anahtara veya tuşa basın.</translation
<translation id="7847212883280406910"><ph name="IDS_SHORT_PRODUCT_OS_NAME" /> ürününe geçmek için Ctrl + Alt + S tuşlarına basın.</translation>
<translation id="7849264908733290972">&amp;Resmi Yeni Sekmede Aç</translation>
<translation id="784934925303690534">Zaman aralığı</translation>
-<translation id="7850717413915978159"><ph name="BEGIN_PARAGRAPH1" />ChromeOS cihazların otomatik raporlar göndermesine izin vererek ChromeOS ile ilgili düzeltme ve iyileştirme çalışmalarımızda nelere öncelik verileceğini belirlememize yardımcı olursunuz. Chrome OS kilitlenme zamanları, kullandığınız özellikler, genellikle kullandığınız bellek miktarı ve Android uygulamalarının teşhis ile kullanım verileri gibi bilgiler bu raporlarda yer alabilir. Bazı birleştirilmiş veriler, Google uygulamalarına ve iş ortaklarına da (ör. Android geliştiricileri) yardımcı olur.<ph name="END_PARAGRAPH1" />
+<translation id="7850717413915978159"><ph name="BEGIN_PARAGRAPH1" />ChromeOS cihazların otomatik raporlar göndermesine izin vererek ChromeOS ile ilgili düzeltme ve iyileştirme çalışmalarımızda nelere öncelik verileceğini belirlememize yardımcı olursunuz. ChromeOS kilitlenme zamanları, kullandığınız özellikler, genellikle kullandığınız bellek miktarı ve Android uygulamalarının teşhis ile kullanım verileri gibi bilgiler bu raporlarda yer alabilir. Bazı birleştirilmiş veriler, Google uygulamalarına ve iş ortaklarına da (ör. Android geliştiricileri) yardımcı olur.<ph name="END_PARAGRAPH1" />
<ph name="BEGIN_PARAGRAPH2" />İstediğiniz zaman ChromeOS cihaz ayarlarınızda bu raporlara izin verebilir veya izni iptal edebilirsiniz. Alan yöneticisiyseniz bu ayarı yönetici konsolunda değiştirebilirsiniz.<ph name="END_PARAGRAPH2" />
<ph name="BEGIN_PARAGRAPH3" />Google Hesabınızda Web ve Uygulama Etkinliği ayarı açıksa Android verileriniz Google Hesabınıza kaydedilebilir. account.google.com adresinde verilerinizi görebilir, silebilir ve hesap ayarlarınızı değiştirebilirsiniz.<ph name="END_PARAGRAPH3" /></translation>
<translation id="7851021205959621355"><ph name="BEGIN_BOLD" />Not:<ph name="END_BOLD" /> Benzer bir sese veya ses kayıtlarına sahip olan kişiler de kişisel sonuçlarınıza ya da Asistanınıza erişebilir. Pilden tasarruf etmek için Asistan ayarlarınızdan "Ok Google" ifadesinin yalnızca bu cihaz güç kaynağına bağlıyken açık olmasını seçebilirsiniz.</translation>
@@ -8118,7 +8118,7 @@ Anahtar dosyanızı güvenli bir yerde saklayın. Uzantınızın yeni sürümler
<translation id="831440797644402910">Bu klasör açılamaz</translation>
<translation id="8314835274931377415">Anahtar Erişimi kurulumu başlasın mı?</translation>
<translation id="8317671367883557781">Ağ bağlantısı ekle</translation>
-<translation id="8317965619823678157">Şifreleri kopyalamak</translation>
+<translation id="8317965619823678157">şifreleri kopyalamak</translation>
<translation id="8318266828739827371">Ekranınızın büyütülmüş alanını görmek için bölünmüş ekran görünümünü kullanın. Yerleşik büyüteci açmak ve kapatmak için Arama + Ctrl + D tuşlarını kullanın.</translation>
<translation id="8319414634934645341">Uzatılmış Anahtar Kullanımı</translation>
<translation id="8321837372750396788">Bu <ph name="DEVICE_TYPE" /> cihaz, <ph name="MANAGER" /> tarafından yönetilecek.</translation>
@@ -8149,7 +8149,7 @@ Anahtar dosyanızı güvenli bir yerde saklayın. Uzantınızın yeni sürümler
<translation id="8342861492835240085">Koleksiyon seçin</translation>
<translation id="8345848587667658367">Artık telefonunuzdaki son fotoğrafları, medya içeriklerini, bildirimleri ve uygulamaları görüntüleyebilirsiniz</translation>
<translation id="8347227221149377169">Yazdırma işleri</translation>
-<translation id="834785183489258869">Gizli moddayken siteler, örneğin reklamları kişiselleştirmek amacıyla farklı sitelerde tarama etkinliğinizi görmek için çerezlerinizi kullanamaz. Bazı sitelerdeki özellikler çalışmayabilir.</translation>
+<translation id="834785183489258869">Gizli moddayken siteler, örneğin reklamları kişiselleştirmek amacıyla farklı sitelerde tarama etkinliğinizi görmek için çerezlerinizi kullanamaz. Bazı sitelerdeki özellikler çalışmayabilir</translation>
<translation id="8350789879725387295">Yuvadayken ekran kalemi aracı</translation>
<translation id="8351316842353540018">Her zaman a11y seçeneklerini göster</translation>
<translation id="8351419472474436977">Bu uzantı proxy ayarlarınızın denetimini ele geçirdi. Bu, uzantının çevrimiçinde yaptıklarınızı değiştirebileceği, kesebileceği veya dinleyebileceği anlamına gelir. Bu değişikliğin neden olduğundan emin değilseniz muhtemelen bu değişikliği yapmayı istememişsinizdir.</translation>
@@ -9084,7 +9084,7 @@ Anahtar dosyanızı güvenli bir yerde saklayın. Uzantınızın yeni sürümler
<translation id="9199503643457729322">Gizlilik Rehberi'nden ayrılmak için tıklayın.</translation>
<translation id="9200339982498053969"><ph name="ORIGIN" />, <ph name="FOLDERNAME" /> klasöründeki dosyaları düzenleyebilir</translation>
<translation id="920045321358709304"><ph name="SEARCH_ENGINE" /> üzerinde ara</translation>
-<translation id="9201023452444595544">Tüm çevrimdışı veriler temizlenecek</translation>
+<translation id="9201023452444595544">Tüm çevrimdışı veriler temizlenir</translation>
<translation id="9201117361710210082">Daha önce görüntülendi</translation>
<translation id="9201220332032049474">Ekran kilidi seçenekleri</translation>
<translation id="9201842707396338580">Bir hata oluştu. Lütfen cihaz sahibiyle ya da yöneticisiyle iletişime geçin. Hata kodu: <ph name="ERROR_CODE" />.</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_uk.xtb b/chromium/chrome/app/resources/generated_resources_uk.xtb
index 6eeb0e67461..798f5409f8a 100644
--- a/chromium/chrome/app/resources/generated_resources_uk.xtb
+++ b/chromium/chrome/app/resources/generated_resources_uk.xtb
@@ -382,7 +382,7 @@
<translation id="1338802252451106843">Веб-сайт <ph name="ORIGIN" /> просить дозвіл відкрити цей додаток.</translation>
<translation id="1338950911836659113">Видалення…</translation>
<translation id="1339009753652684748">Активуйте Асистента командою "Ok Google". Щоб заощаджувати заряд акумулятора, виберіть опцію "Увімкнено (рекомендовано)". Асистент відповідатиме, лише коли пристрій підключений до джерела живлення або заряджається.</translation>
-<translation id="13392265090583506">Спеціальні можливості</translation>
+<translation id="13392265090583506">Доступність</translation>
<translation id="1340527397989195812">Створити резервну копію медіа-вмісту з пристрою за допомогою додатка Файли.</translation>
<translation id="1341701348342335220">Чудова робота!</translation>
<translation id="1341871421050612057">Не вдалося виконати синхронізацію в обліковому записі <ph name="USERNAME" /></translation>
@@ -394,7 +394,7 @@
<translation id="1347256498747320987">Встановлення оновлень і додатків. Продовжуючи, ви дозволяєте цьому пристрою автоматично завантажувати та встановлювати оновлення й додатки від Google, вашого оператора чи виробника пристрою, зокрема через мобільний трафік. У деяких додатках можуть пропонуватися покупки. <ph name="BEGIN_LINK1" />Докладніше<ph name="END_LINK1" /></translation>
<translation id="1347512539447549782">Пам'ять Linux</translation>
<translation id="1347975661240122359">Оновлення почнеться, коли рівень заряду акумулятора сягне <ph name="BATTERY_LEVEL" />%.</translation>
-<translation id="1348966090521113558">Налаштування спеціальних можливостей миші</translation>
+<translation id="1348966090521113558">Налаштування функцій доступності миші</translation>
<translation id="1353275871123211385">Використовувати функції батьківського контролю (наприклад, схвалювати додатки чи обмежувати час використання пристрою) можна тільки за умови, що дитина має обліковий запис Google, яким керує хтось із батьків. Пізніше можна додати обліковий запис закладу освіти для таких інструментів, як Google Клас.</translation>
<translation id="135389172849514421">Доступно в режимі офлайн</translation>
<translation id="1353980523955420967">Не вдається знайти файл PPD. Переконайтеся, що Chromebook під’єднано до Інтернету, і повторіть спробу.</translation>
@@ -1211,7 +1211,7 @@
<translation id="2048554637254265991">Не вдалося запустити менеджер контейнера. Повторіть спробу.</translation>
<translation id="2048653237708779538">Дія недоступна</translation>
<translation id="204914487372604757">Створити ярлик</translation>
-<translation id="2050339315714019657">Портретна</translation>
+<translation id="2050339315714019657">Портретна орієнтація</translation>
<translation id="2051555741181591333">Автоматично вимикати точку доступу</translation>
<translation id="2052572566310583903">Установлено на інших ваших пристроях</translation>
<translation id="2053105195397337973">Ми досліджуємо способи обмежити відстеження, водночас допомагаючи сайтам протидіяти рекламному спаму та шахрайству.</translation>
@@ -1435,7 +1435,7 @@
<translation id="2233502537820838181">&amp;Докладніше</translation>
<translation id="223356358902285214">Історія додатків і веб-пошуку</translation>
<translation id="2234827758954819389">Посібник із конфіденційності</translation>
-<translation id="2234876718134438132">Синхронізація та сервіси Google</translation>
+<translation id="2234876718134438132">Синхронізація і сервіси Google</translation>
<translation id="2235344399760031203">Сторонні файли cookie блокуються</translation>
<translation id="2238379619048995541">Дані про стан частоти</translation>
<translation id="2241053333139545397">Читати та змінювати свої дані на декількох веб-сайтах</translation>
@@ -1924,7 +1924,7 @@
<translation id="265390580714150011">Значення поля</translation>
<translation id="2654553774144920065">Запит на друк</translation>
<translation id="265748523151262387">Не від’єднуйте телефон</translation>
-<translation id="2657612187216250073">Налаштування спеціальних можливостей курсора</translation>
+<translation id="2657612187216250073">Налаштування функцій доступності курсора</translation>
<translation id="2658941648214598230">Показати оригінальний контент?</translation>
<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />На різних пристроях функції можуть бути іншими</translation>
<translation id="2659971421398561408">Змінити розмір диска в Crostini</translation>
@@ -2359,7 +2359,7 @@
<translation id="3023464535986383522">Читання з екрана</translation>
<translation id="3024374909719388945">Використовувати 24-годинний формат</translation>
<translation id="3025174326431589540">{COUNT,plural, =0{Немає збережених паролів}=1{Перевірено паролі для {COUNT} сайту}one{Перевірено паролі для {COUNT} сайту й додатка}few{Перевірено паролі для {COUNT} сайтів і додатків}many{Перевірено паролі для {COUNT} сайтів і додатків}other{Перевірено паролі для {COUNT} сайту й додатка}}</translation>
-<translation id="3027296729579831126">Увімкнути функцію "Передавання поблизу"</translation>
+<translation id="3027296729579831126">Увімкнути функцію "Обмін поблизу"</translation>
<translation id="3027644380269727216">На основі ваших дій на сайті. Це налаштування ввімкнено.</translation>
<translation id="3029276696788198026">Без попереднього завантаження</translation>
<translation id="3029466929721441205">Показувати інструменти стилуса на панелі</translation>
@@ -3964,7 +3964,7 @@
<translation id="450552327874992444">Слово вже додано</translation>
<translation id="4507128560633489176">Дані видалено.</translation>
<translation id="4507373251891673233">Ви заборонили всім розширенням отримувати доступ до сайту <ph name="HOST" /></translation>
-<translation id="450867954911715010">Налаштування спеціальних можливостей</translation>
+<translation id="450867954911715010">Налаштування функцій доступності</translation>
<translation id="4508765956121923607">Переглянути д&amp;жерело</translation>
<translation id="4509421746503122514">Перезапустити, щоб оновити дані</translation>
<translation id="4510195992002502722">Не вдалося надіслати відгук. Повторна спроба…</translation>
@@ -5247,7 +5247,7 @@
<translation id="5701786609538182967">Зараз їх можна відкривати не лише в додатку <ph name="APP_NAME" />. Після зміни <ph name="APP_NAME_2" />, <ph name="APP_NAME_3" />, <ph name="APP_NAME_4" /> та ще 1 додаток більше не зможуть відкривати підтримувані посилання.</translation>
<translation id="5702749864074810610">Пропозицію закрито</translation>
<translation id="5704875434923668958">Синхронізовано з</translation>
-<translation id="5705005699929844214">Завжди показувати параметри спеціальних можливостей</translation>
+<translation id="5705005699929844214">Завжди показувати функції доступності</translation>
<translation id="5705882733397021510">Назад</translation>
<translation id="5707185214361380026">Не вдалося завантажити розширення з:</translation>
<translation id="5708171344853220004">Ім'я учасника Microsoft</translation>
@@ -6667,7 +6667,7 @@
<translation id="6979737339423435258">Увесь час</translation>
<translation id="6981553172137913845">Щоб переглядати веб-сторінки конфіденційно, натисніть значок меню з трьома крапками й відкрийте вікно в режимі анонімного перегляду</translation>
<translation id="6981761993313539853">Переконайтеся, що пристрій із Bluetooth поруч і на ньому ввімкнено режим підключення. Під’єднуйте лише надійні пристрої. <ph name="BEGIN_LINK_LEARN_MORE" />Докладніше<ph name="END_LINK_LEARN_MORE" /></translation>
-<translation id="6981982820502123353">Спеціальні можливості</translation>
+<translation id="6981982820502123353">Доступність</translation>
<translation id="6983507711977005608">Від'єднати мережу миттєвої точки доступу</translation>
<translation id="6983783921975806247">Зареєстрований ідентифікатор об'єкта (OID)</translation>
<translation id="6985235333261347343">Агент відновлення ключів Microsoft</translation>
@@ -7236,7 +7236,7 @@
<translation id="7515998400212163428">Android</translation>
<translation id="7516981202574715431">Додаток <ph name="APP_NAME" /> призупинено</translation>
<translation id="7520766081042531487">Портал анонімного режиму: <ph name="SUBFRAME_SITE" /></translation>
-<translation id="752098910262610337">Показати комбінації клавіш</translation>
+<translation id="752098910262610337">Показувати ярлики</translation>
<translation id="7522255036471229694">Скажіть "Ok Google"</translation>
<translation id="7523585675576642403">Перейменувати профіль</translation>
<translation id="7525067979554623046">Створити</translation>
@@ -8174,7 +8174,7 @@
<translation id="8347227221149377169">Завдання друку</translation>
<translation id="834785183489258869">В анонімному режимі сайти не можуть використовувати файли cookie для перегляду ваших дій у веб-переглядачі, зокрема, щоб персоналізувати рекламу. Функції на деяких сайтах можуть не працювати.</translation>
<translation id="8350789879725387295">Інструменти стилуса на закріпленій панелі</translation>
-<translation id="8351316842353540018">Завжди показувати параметри спеціальних можливостей</translation>
+<translation id="8351316842353540018">Завжди показувати функції доступності</translation>
<translation id="8351419472474436977">Розширення керує налаштуваннями проксі-сервера, тобто може змінювати та переривати будь-які ваші дії онлайн, а також стежити за ними. Якщо ви не знаєте причини такої зміни, імовірно, вона небажана.</translation>
<translation id="8351630282875799764">Акумулятор не заряджається</translation>
<translation id="8352287103893778223">Назва групи вкладок</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_ur.xtb b/chromium/chrome/app/resources/generated_resources_ur.xtb
index 9b7f0c5a49b..edec81334b3 100644
--- a/chromium/chrome/app/resources/generated_resources_ur.xtb
+++ b/chromium/chrome/app/resources/generated_resources_ur.xtb
@@ -2979,7 +2979,7 @@
<translation id="3630995161997703415">اس سائٹ کو کسی بھی وقت استعمال کرنے کیلئے، اسے اپنی شیلف میں شامل کریں</translation>
<translation id="3634652306074934350">اجازت کی درخواست کی میعاد ختم ہو گئی</translation>
<translation id="3635199270495525546">‏قابل اعتماد پلیٹ فارم ماڈیول (TPM) کا پتہ چلا</translation>
-<translation id="3635353578505343390">‏Google کو تاثرات بھیجیں</translation>
+<translation id="3635353578505343390">‏‫Google کو تاثرات بھیجیں</translation>
<translation id="3635960017746711110">‏Crostini USB کی ترجیحات</translation>
<translation id="3636766455281737684"><ph name="PERCENTAGE" />% - <ph name="TIME" /> باقی</translation>
<translation id="3636940436873918441">ترجیحی زبانیں</translation>
@@ -5184,7 +5184,7 @@
<translation id="5651308944918885595">قریبی آلات کے ساتھ اشتراک کی قابل دریافتگی</translation>
<translation id="5653154844073528838">آپ کے پاس <ph name="PRINTER_COUNT" /> محفوظ کردہ پرنٹرز ہیں۔</translation>
<translation id="5655296450510165335">آلہ کا اندراج</translation>
-<translation id="5656845498778518563">‏Google کو تاثرات بھیجیں</translation>
+<translation id="5656845498778518563">‏‫Google کو تاثرات بھیجیں</translation>
<translation id="5657156137487675418">سبھی کوکیز کی اجازت دیں</translation>
<translation id="5657667036353380798">‏بیرونی ایکسٹینشن کیلئے chrome ورژن <ph name="MINIMUM_CHROME_VERSION" /> یا اس سے اعلی تر کو انسٹال کیے جانے کی ضرورت ہے۔</translation>
<translation id="5658415415603568799">‏اضافی سیکیورٹی کیلئے Smart Lock آپ سے 20 گھنٹے بعد آپ کا پاس ورڈ درج کرنے کا تقاضہ کرے گا۔</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_uz.xtb b/chromium/chrome/app/resources/generated_resources_uz.xtb
index 27aa5ec629a..16656eb0917 100644
--- a/chromium/chrome/app/resources/generated_resources_uz.xtb
+++ b/chromium/chrome/app/resources/generated_resources_uz.xtb
@@ -364,7 +364,7 @@ Parollarni istalgan vaqtda <ph name="GOOGLE_PASSWORD_MANAGER" /> orqali tekshiri
<translation id="1324106254079708331">Shaxsiy Google hisoblarini barcha maqsadli hujumlardan himoya qiladi</translation>
<translation id="1327272175893960498">Kerberos chiptalari</translation>
<translation id="1327495825214193325">ADB tuzatish vositalarini yoqish uchun <ph name="DEVICE_TYPE" /> qurilmasini oʻchirib yoqish zarur. ADB vositasini oʻchirish uchun qurilmani zavod sozlamalariga qaytarish kerak.</translation>
-<translation id="1327527584824210101">Kod ishlatish</translation>
+<translation id="1327527584824210101">Kalit ishlatish</translation>
<translation id="1327794256477341646">Joylashuvga ruxsat talab qiladigan funksiyalar ishlamaydi</translation>
<translation id="1329466763986822896">Bu hotspotning maxfiylik darajasini oshiring</translation>
<translation id="1331977651797684645">Bu men</translation>
@@ -1606,7 +1606,7 @@ Oʻz qurilmangizda Family Link ilovasini oʻrnatib, bu hisob sozlamalarini boshq
<translation id="2371076942591664043">&amp;Yakunlanishida ochish</translation>
<translation id="2373666622366160481">Qogʻozga moslash</translation>
<translation id="2375406435414127095">Telefonga ulang</translation>
-<translation id="2376056713414548745">Matnni ovozli qilish</translation>
+<translation id="2376056713414548745">Ovozli oʻqish</translation>
<translation id="2377588536920405462">Qurilmangizda asosiy Joylashuv sozlamasini faolsizlantirish orqali Joylashuvni aniqlash xizmatini faolsizlantirish mumkin. Shuningdek, joylashuv parametri orqali joylashuv axboroti uchun Wi-Fi va mobil tarmoqlardan foydalanish hamda sensorlarni ham faolsizlantirish mumkin.</translation>
<translation id="2377667304966270281">Xotirada sahifa yo‘qligi xatolari</translation>
<translation id="237828693408258535">Bu sahifa tarjima qilinsinmi?</translation>
@@ -2343,7 +2343,7 @@ Oʻz qurilmangizda Family Link ilovasini oʻrnatib, bu hisob sozlamalarini boshq
<translation id="3023464535986383522">Teginib tinglash</translation>
<translation id="3024374909719388945">24 soatli vaqt formatidan foydalanish</translation>
<translation id="3025174326431589540">{COUNT,plural, =0{Hech qanday parol saqlanmagan}=1{{COUNT} ta sayt parollari tekshirildi}other{{COUNT} ta sayt va ilova parollari tekshirildi}}</translation>
-<translation id="3027296729579831126">Nearby Share funksiyasini yoqish</translation>
+<translation id="3027296729579831126">Nearby Share yoqilsin</translation>
<translation id="3027644380269727216">Saytdagi harakatlaringiz asosida. Bu sozlama yoniq.</translation>
<translation id="3029276696788198026">Oldindan yuklanmaydi</translation>
<translation id="3029466929721441205">Stilus vositalarini ishga tushirish paneliga chiqarish</translation>
@@ -4432,7 +4432,7 @@ Kichiklashtirish uchun Ctrl+Alt+Yorqinlikni pasaytirish tugmalarini bosing.</tra
<translation id="4940845626435830013">Diskda joy zaxiralash</translation>
<translation id="4941074198479265146">Saytlar odatda musiqa yaratish va tahrirlash kabi maqsadlarda MIDI qurilmalarga ulanadi</translation>
<translation id="4941246025622441835">Qurilmani korporativ boshqaruvda ro‘yxatdan o‘tkazishda quyidagi talablar qo‘llansin:</translation>
-<translation id="4941627891654116707">Shrift o‘lchami</translation>
+<translation id="4941627891654116707">Shrift hajmi</translation>
<translation id="4941963255146903244">Telefondagi suratlar, media fayllar va ilovalarni ochish</translation>
<translation id="494286511941020793">Proksi-server sozlamalari yuzasidan yordam</translation>
<translation id="4943368462779413526">Futbol</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_vi.xtb b/chromium/chrome/app/resources/generated_resources_vi.xtb
index 17480fde70e..0f940a61939 100644
--- a/chromium/chrome/app/resources/generated_resources_vi.xtb
+++ b/chromium/chrome/app/resources/generated_resources_vi.xtb
@@ -240,7 +240,7 @@ Bạn có thể kiểm tra mật khẩu bất cứ lúc nào trong <ph name="GOO
<translation id="120069043972472860">Không xem được</translation>
<translation id="1201402288615127009">Tiếp theo</translation>
<translation id="1201564082781748151">Bạn có thể khôi phục dữ liệu cục bộ nếu quên mật khẩu</translation>
-<translation id="1202116106683864634">Bạn có chắc chắn muốn xoá mã xác thực này không?</translation>
+<translation id="1202116106683864634">Bạn có chắc chắn muốn xoá khoá đăng nhập này không?</translation>
<translation id="1202596434010270079">Ứng dụng Kiosk đã được cập nhật. Vui lòng rút thẻ USB.</translation>
<translation id="120368089816228251">Ghi chú âm nhạc</translation>
<translation id="1203942045716040624">Shared Worker: <ph name="SCRIPT_URL" /></translation>
@@ -264,7 +264,7 @@ Bạn có thể kiểm tra mật khẩu bất cứ lúc nào trong <ph name="GOO
<translation id="1223484782328004593"><ph name="APP_NAME" /> yêu cầu giấy phép</translation>
<translation id="1223853788495130632">Quản trị viên của bạn đề xuất một giá trị cụ thể cho cài đặt này.</translation>
<translation id="1225177025209879837">Đang xử lý yêu cầu...</translation>
-<translation id="1227660082540388410">Chỉnh sửa mã xác thực</translation>
+<translation id="1227660082540388410">Chỉnh sửa khoá đăng nhập</translation>
<translation id="1227993798763400520">Không truyền được. Vui lòng thử lại.</translation>
<translation id="1230417814058465809">Tính năng Bảo vệ thông thường đang bật. Để tăng cường khả năng bảo mật, hãy sử dụng chế độ bảo vệ nâng cao.</translation>
<translation id="1231733316453485619">Bật tính năng đồng bộ hóa?</translation>
@@ -366,7 +366,7 @@ Bạn có thể kiểm tra mật khẩu bất cứ lúc nào trong <ph name="GOO
<translation id="1324106254079708331">Bảo vệ Tài khoản Google cá nhân của bất kỳ ai có nguy cơ bị tấn công có chủ đích</translation>
<translation id="1327272175893960498">Phiếu Kerberos</translation>
<translation id="1327495825214193325">Để bật tùy chọn gỡ lỗi ADB, bạn cần phải khởi động lại <ph name="DEVICE_TYPE" /> này. Để tắt tùy chọn này, bạn phải đặt lại thiết bị về trạng thái ban đầu.</translation>
-<translation id="1327527584824210101">Sử dụng mã xác thực của bạn</translation>
+<translation id="1327527584824210101">Sử dụng khóa truy cập của bạn</translation>
<translation id="1327794256477341646">Các tính năng cần dùng thông tin vị trí của bạn sẽ không hoạt động</translation>
<translation id="1329466763986822896">Nâng cao tính bảo mật của điểm phát sóng này</translation>
<translation id="1331977651797684645">Đây chính là tôi.</translation>
@@ -827,7 +827,7 @@ Các quyền bạn từng cấp cho ứng dụng có thể áp dụng cho cả t
<translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (Gốc)</translation>
<translation id="1709217939274742847">Chọn một phiếu để dùng cho việc xác thực. <ph name="LINK_BEGIN" />Tìm hiểu thêm<ph name="LINK_END" /></translation>
<translation id="1709762881904163296">Cài đặt mạng</translation>
-<translation id="1709916727352927457">Xoá mã xác thực</translation>
+<translation id="1709916727352927457">Xoá khoá đăng nhập</translation>
<translation id="1709972045049031556">Không thể chia sẻ</translation>
<translation id="1711935594505774770">Thao tác này sẽ xóa toàn bộ dữ liệu và cookie lưu trữ trong <ph name="SITE_GROUP_NAME" /> cũng như trong mọi trang web và ứng dụng đã cài đặt thuộc nhóm này</translation>
<translation id="1714644264617423774">Bật các tính năng hỗ trợ tiếp cận để dễ dàng sử dụng thiết bị của bạn. <ph name="LINK_BEGIN" />Tìm hiểu thêm<ph name="LINK_END" /></translation>
@@ -1103,7 +1103,7 @@ Các quyền bạn từng cấp cho ứng dụng có thể áp dụng cho cả t
<translation id="1941995177877935582">Hiện ánh xạ khóa</translation>
<translation id="1942128823046546853">Đọc và thay đổi tất cả dữ liệu của bạn trên mọi trang web</translation>
<translation id="1944528062465413897">Mã ghép nối Bluetooth:</translation>
-<translation id="1944535645109964458">Không có mã xác thực nào</translation>
+<translation id="1944535645109964458">Không có khoá đăng nhập nào</translation>
<translation id="1944921356641260203">Đã tìm thấy bản cập nhật</translation>
<translation id="1947136734041527201">Cho phép bạn đăng nhập vào các trang web bằng tài khoản có dịch vụ nhận dạng</translation>
<translation id="1949584741547056205">Trả lời nhanh</translation>
@@ -1115,7 +1115,7 @@ Các quyền bạn từng cấp cho ứng dụng có thể áp dụng cho cả t
<translation id="1956167375087861299">Không được phép sử dụng giá trị nhận dạng để phát nội dung được bảo vệ</translation>
<translation id="1956390763342388273">Thao tác này sẽ tải tất cả các tệp từ "<ph name="FOLDER_PATH" />" lên. Chỉ thực hiện thao tác này nếu bạn tin tưởng trang web.</translation>
<translation id="1962233722219655970">Trang này sử dụng ứng dụng Native Client không hoạt động trên máy tính của bạn.</translation>
-<translation id="1963976881984600709">Chế độ bảo vệ thông thường</translation>
+<translation id="1963976881984600709">Bảo vệ tiêu chuẩn</translation>
<translation id="1965624977906726414">Không có đặc quyền.</translation>
<translation id="1966649499058910679">Làm nổi bật từng từ khi từ được đọc</translation>
<translation id="1967970931040389207">Bật điểm phát sóng</translation>
@@ -1782,7 +1782,7 @@ Bạn có thể quản lý các tùy chọn cài đặt của tài khoản này
<translation id="2523184218357549926">Gửi cho Google URL của các trang bạn truy cập</translation>
<translation id="252418934079508528">Cài đặt <ph name="DEVICE_OS" /></translation>
<translation id="2526590354069164005">Màn hình nền</translation>
-<translation id="2526619973349913024">Kiểm tra bản cập nhật</translation>
+<translation id="2526619973349913024">Kiểm tra để tìm bản cập nhật</translation>
<translation id="2527167509808613699">Bất kỳ loại kết nối</translation>
<translation id="2529887123641260401">Bạn có thể thay đổi các chế độ cài đặt hoặc mở lại trình hướng dẫn thiết lập trong phần cài đặt Tiếp cận bằng công tắc bất cứ lúc nào.</translation>
<translation id="2530166226437958497">Khắc phục sự cố</translation>
@@ -1980,7 +1980,7 @@ Bạn có thể quản lý các tùy chọn cài đặt của tài khoản này
<translation id="2710101514844343743">Dữ liệu chẩn đoán và dữ liệu về mức sử dụng</translation>
<translation id="271033894570825754">Mới</translation>
<translation id="2711073837061989559">Bản dùng thử</translation>
-<translation id="2712207122921938368">Tạo mã xác thực trên một thiết bị khác</translation>
+<translation id="2712207122921938368">Tạo khoá đăng nhập trên một thiết bị khác</translation>
<translation id="2713106313042589954">Tắt máy ảnh</translation>
<translation id="2713444072780614174">Trắng</translation>
<translation id="2714180132046334502">Nền tối</translation>
@@ -2024,7 +2024,7 @@ Bạn có thể quản lý các tùy chọn cài đặt của tài khoản này
<translation id="274029851662193272">Chìm</translation>
<translation id="2740363334137520315">Thêm một mục mới trong phần "Tìm kiếm thẻ" để dễ dàng tìm thấy thẻ đang phát nhạc hoặc video. Truy cập thông qua nút ở góc trên cùng của trình duyệt.</translation>
<translation id="2740531572673183784">Ok</translation>
-<translation id="2740876196999178364">Các mã xác thực này chỉ được lưu trên thiết bị này. Các mã này không được lưu vào Tài khoản Google của bạn.</translation>
+<translation id="2740876196999178364">Các khoá đăng nhập này chỉ được lưu trên thiết bị này. Các mã này không được lưu vào Tài khoản Google của bạn.</translation>
<translation id="2741713322780029189">Mở Cửa sổ lệnh khôi phục</translation>
<translation id="2741912629735277980">Hiển thị giao diện người dùng trên màn hình đăng nhập</translation>
<translation id="2742448780373473567">Quá trình cài đặt <ph name="DEVICE_OS" /> sẽ ghi đè mọi dữ liệu trên thiết bị của bạn.</translation>
@@ -2101,7 +2101,7 @@ Bạn có thể quản lý các tùy chọn cài đặt của tài khoản này
<translation id="2801954693771979815">Kích thước màn hình</translation>
<translation id="2802557211515765772">Không có máy in nào được quản lý.</translation>
<translation id="2803313416453193357">Mở thư mục</translation>
-<translation id="2803719750464280163">Vui lòng xác nhận rằng <ph name="PASSKEY" /> là mã xác thực hiển thị trên thiết bị Bluetooth <ph name="DEVICE" />.</translation>
+<translation id="2803719750464280163">Vui lòng xác nhận rằng <ph name="PASSKEY" /> là khoá đăng nhập hiển thị trên thiết bị Bluetooth <ph name="DEVICE" />.</translation>
<translation id="2804043232879091219">Không thể mở trình duyệt thay thế</translation>
<translation id="2804667941345577550">Bạn sẽ bị đăng xuất khỏi trang web này, bao gồm cả các thẻ đang mở</translation>
<translation id="2804680522274557040">Đã tắt máy ảnh</translation>
@@ -2303,7 +2303,7 @@ Bạn có thể quản lý các tùy chọn cài đặt của tài khoản này
<translation id="2989123969927553766">Tăng tốc độ cuộn chuột</translation>
<translation id="2989474696604907455">chưa được đính kèm</translation>
<translation id="2989786307324390836">DER-mã hóa nhị phân, chứng chỉ đơn</translation>
-<translation id="2989805286512600854">Mở bằng Thẻ Mới</translation>
+<translation id="2989805286512600854">Mở trong thẻ mới</translation>
<translation id="2990313168615879645">Thêm Tài khoản Google</translation>
<translation id="2990583317361835189">Không cho phép trang web sử dụng cảm biến chuyển động</translation>
<translation id="2992931425024192067">Hiện mọi nội dung thông báo</translation>
@@ -2670,7 +2670,7 @@ Bạn có thể quản lý các tùy chọn cài đặt của tài khoản này
<translation id="3341699307020049241">Mã PIN không chính xác. Bạn còn <ph name="RETRIES" /> lần thử.</translation>
<translation id="3341703758641437857">Cho phép truy cập vào các URL của tệp</translation>
<translation id="3342361181740736773">"<ph name="TRIGGERING_EXTENSION_NAME" />" muốn xóa tiện ích này.</translation>
-<translation id="3343046414300263892">Tăng kích thước phông chữ</translation>
+<translation id="3343046414300263892">Tăng cỡ chữ</translation>
<translation id="3343977377045378693">Đang thiết lập</translation>
<translation id="3345634917232014253">Tính năng kiểm tra an toàn đã hoạt động vài phút trước</translation>
<translation id="3345886924813989455">Không tìm thấy trình duyệt được hỗ trợ</translation>
@@ -2947,7 +2947,7 @@ Bạn có thể quản lý các tùy chọn cài đặt của tài khoản này
<translation id="3593152357631900254">Bật chế độ Fuzzy-Pinyin</translation>
<translation id="3593965109698325041">Ràng buộc Tên của Chứng chỉ</translation>
<translation id="3596012367874587041">Cài đặt ứng dụng</translation>
-<translation id="3596414637720633074">Chặn các cookie của bên thứ ba trong chế độ Ẩn danh</translation>
+<translation id="3596414637720633074">Chặn cookie của bên thứ ba ở chế độ Ẩn danh</translation>
<translation id="3598010454707842106">Nhấp vào "Tuỳ chỉnh Chrome"</translation>
<translation id="3599221874935822507">Nhô lên</translation>
<translation id="3600051066689725006">Thông tin yêu cầu web</translation>
@@ -3021,7 +3021,7 @@ Bạn có thể quản lý các tùy chọn cài đặt của tài khoản này
<translation id="3654045516529121250">Đọc cài đặt trợ năng của bạn</translation>
<translation id="3655712721956801464">{NUM_FILES,plural, =1{Ứng dụng có quyền truy cập vĩnh viễn vào một tệp.}other{Ứng dụng có quyền truy cập vĩnh viễn vào # tệp.}}</translation>
<translation id="3658871634334445293">Tăng tốc TrackPoint</translation>
-<translation id="3659550105763988702">Sử dụng mã xác thực của bạn cho <ph name="APP_NAME" /></translation>
+<translation id="3659550105763988702">Sử dụng khoá đăng nhập của bạn cho <ph name="APP_NAME" /></translation>
<translation id="3659929705630080526">Bạn đã nhập sai mã truy cập quá nhiều lần. Hãy thử lại sau</translation>
<translation id="3660234220361471169">Không đáng tin cậy</translation>
<translation id="3664511988987167893">Biểu tượng tiện ích</translation>
@@ -3154,7 +3154,7 @@ Bạn có thể quản lý các tùy chọn cài đặt của tài khoản này
<translation id="3772046291955677288">Tôi đã đọc và đồng ý với <ph name="BEGIN_LINK1" />Điều khoản dịch vụ của Google<ph name="END_LINK1" /> và <ph name="BEGIN_LINK2" />Điều khoản dịch vụ bổ sung của Google Chrome và Chrome OS<ph name="END_LINK2" />.</translation>
<translation id="3774166835015494435">Thông báo và ảnh mới đây</translation>
<translation id="3775432569830822555">Chứng chỉ Máy chủ SSL</translation>
-<translation id="3775705724665058594">Gửi đến các thiết bị của bạn</translation>
+<translation id="3775705724665058594">Gửi đến thiết bị của bạn</translation>
<translation id="3776508619697147021">Các trang web có thể yêu cầu tự động tải nhiều tệp xuống</translation>
<translation id="3776796446459804932">Tiện ích này vi phạm chính sách của Cửa hàng Chrome trực tuyến.</translation>
<translation id="3777483481409781352">Không kích hoạt được thiết bị di động</translation>
@@ -3311,11 +3311,11 @@ Bạn có thể quản lý các tùy chọn cài đặt của tài khoản này
<translation id="3898768766145818464">Phát hoặc tạm dừng video</translation>
<translation id="389901847090970821">Chọn bàn phím</translation>
<translation id="3900966090527141178">Xuất mật khẩu</translation>
-<translation id="3902789559055749153">Chọn cách bạn muốn tạo mã xác thực cho <ph name="APP_NAME" /></translation>
+<translation id="3902789559055749153">Chọn cách bạn muốn tạo khoá đăng nhập cho <ph name="APP_NAME" /></translation>
<translation id="3903187154317825986">Bàn phím tích hợp</translation>
<translation id="3904326018476041253">Dịch vụ vị trí</translation>
<translation id="3905761538810670789">Sửa ứng dụng</translation>
-<translation id="3908288065506437185">Chặn cookie của bên thứ ba ở Chế độ ẩn danh</translation>
+<translation id="3908288065506437185">Chặn cookie của bên thứ ba ở chế độ Ẩn danh</translation>
<translation id="3908501907586732282">Bật tiện ích</translation>
<translation id="3909701002594999354">Hiển thị tất cả &amp;nút điều khiển</translation>
<translation id="3909791450649380159">Cắ&amp;t</translation>
@@ -3421,7 +3421,7 @@ Bạn có thể quản lý các tùy chọn cài đặt của tài khoản này
<translation id="3985022125189960801">Thêm lại một trang web nếu bạn muốn thêm trang này vào nhóm những trang web có thể đoán sở thích của bạn</translation>
<translation id="3987544746655539083">Tiếp tục chặn không cho trang web này truy cập thông tin vị trí của bạn</translation>
<translation id="3987938432087324095">Rất tiếc, vẫn chưa hiểu được nội dung đó.</translation>
-<translation id="3987993985790029246">Sao chép đường liên kết</translation>
+<translation id="3987993985790029246">Sao chép liên kết</translation>
<translation id="3988996860813292272">Chọn múi giờ</translation>
<translation id="399179161741278232">Đã nhập</translation>
<translation id="3992008114154328194">Đang tải <ph name="FILE_NAME" /> xuống, <ph name="STATUS" /></translation>
@@ -3653,7 +3653,7 @@ Bạn có thể quản lý các tùy chọn cài đặt của tài khoản này
<translation id="4217571870635786043">Nhập bằng giọng nói</translation>
<translation id="4218081191298393750">Nhấp vào biểu tượng loa để tắt tiếng thẻ này</translation>
<translation id="4220648711404560261">Đã xảy ra lỗi trong quá trình kích hoạt.</translation>
-<translation id="4223845867739585293">Tạo một mã xác thực</translation>
+<translation id="4223845867739585293">Tạo một khoá đăng nhập</translation>
<translation id="4225397296022057997">Trên tất cả các trang web</translation>
<translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{Không được phép dùng tiện ích này}other{Không được phép dùng một số tiện ích}}</translation>
<translation id="4231095370974836764">Cài đặt ứng dụng và trò chơi từ Google Play trên <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Tìm hiểu thêm<ph name="LINK_END" /></translation>
@@ -3854,7 +3854,7 @@ Bạn có thể quản lý các tùy chọn cài đặt của tài khoản này
<translation id="4409697491990005945">Lề</translation>
<translation id="4410545552906060960">Dùng một số (mã PIN) thay cho mật khẩu để mở khóa thiết bị. Để đặt mã PIN vào thời điểm khác, hãy chuyển đến mục Cài đặt.</translation>
<translation id="4411578466613447185">Trình ký mã</translation>
-<translation id="4411719918614785832">Các mã xác thực này được lưu vào Windows Hello trên máy tính này. Các mã này không được lưu vào Tài khoản Google của bạn.</translation>
+<translation id="4411719918614785832">Các khoá đăng nhập này được lưu vào Windows Hello trên máy tính này. Các mã này không được lưu vào Tài khoản Google của bạn.</translation>
<translation id="4412632005703201014">Ứng dụng Chrome đang di chuyển sang Ứng dụng web tiến bộ. Tổ chức của bạn đã cài đặt Ứng dụng Chrome này trên trình duyệt bạn sử dụng. Để mở Ứng dụng web tiến bộ trong danh sách Ứng dụng, trước tiên hãy liên hệ với quản trị viên và yêu cầu họ gỡ cài đặt Ứng dụng Chrome. Trong thời gian chờ đợi, bạn có thể truy cập <ph name="EXTENSION_LAUNCH_URL" /> để mở <ph name="EXTENSION_NAME" /> trên web.</translation>
<translation id="4412698727486357573">Trung tâm trợ giúp</translation>
<translation id="4412992751769744546">Cho phép cookie của bên thứ ba</translation>
@@ -4068,7 +4068,7 @@ Bạn có thể quản lý các tùy chọn cài đặt của tài khoản này
<translation id="4594577641390224176">Bạn đang tìm hệ thống giới thiệu trang? Hãy truy cập</translation>
<translation id="4595560905247879544">Chỉ người quản lý mới có thể sửa đổi ứng dụng và tiện ích (<ph name="CUSTODIAN_NAME" />).</translation>
<translation id="4596295440756783523">Bạn có các chứng chỉ trên tệp có thể nhận dạng các máy chủ này</translation>
-<translation id="4598345735110653698">Quản lý mã xác thực</translation>
+<translation id="4598345735110653698">Quản lý khoá đăng nhập</translation>
<translation id="4598549027014564149">Ở chế độ Ẩn danh, các trang web không thể dùng cookie để xem hoạt động duyệt web của bạn trên nhiều trang web, ngay cả các trang web có liên quan. Hoạt động duyệt web của bạn không được dùng cho các mục đích như cá nhân hoá quảng cáo. Các tính năng của một số trang web có thể không hoạt động.</translation>
<translation id="4598556348158889687">Quản lý bộ nhớ</translation>
<translation id="4598776695426288251">Wi-Fi khả dụng qua nhiều thiết bị</translation>
@@ -4307,7 +4307,7 @@ Nhấn tổ hợp phím Ctrl + Alt + Giảm độ sáng để thu nhỏ.</transl
<translation id="4823484602432206655">Đọc và thay đổi cài đặt người dùng và thiết bị</translation>
<translation id="4824037980212326045">Sao lưu và khôi phục Linux</translation>
<translation id="4824958205181053313">Bạn muốn hủy đồng bộ hóa?</translation>
-<translation id="4825532258163983651">Không thể xoá mã xác thực</translation>
+<translation id="4825532258163983651">Không thể xoá khoá đăng nhập</translation>
<translation id="4827283332383516812">Xoá thẻ</translation>
<translation id="4827675678516992122">Không thể kết nối</translation>
<translation id="4827784381479890589">Tính năng kiểm tra lỗi chính tả nâng cao trong trình duyệt Chrome (văn bản sẽ được gửi đến Google để đưa ra các đề xuất chính tả)</translation>
@@ -4560,7 +4560,7 @@ Nhấn tổ hợp phím Ctrl + Alt + Giảm độ sáng để thu nhỏ.</transl
<translation id="5066160542186949327">Chuyển đến một thư mục khác</translation>
<translation id="5067399438976153555">Luôn bật</translation>
<translation id="5067867186035333991">Hỏi nếu <ph name="HOST" /> muốn truy cập micrô của bạn</translation>
-<translation id="5068553687099139861">hiển thị mật khẩu</translation>
+<translation id="5068553687099139861">hiện mật khẩu</translation>
<translation id="5068918910148307423">Không cho phép các trang web đóng gần đây hoàn tất gửi và nhận dữ liệu</translation>
<translation id="5068919226082848014">Pizza</translation>
<translation id="5070710277167211639">Nâng các hình thức chuyển hướng lên giao thức HTTPS và cảnh báo bạn trước khi tải những trang web không hỗ trợ giao thức HTTPS</translation>
@@ -4609,7 +4609,7 @@ Nhấn tổ hợp phím Ctrl + Alt + Giảm độ sáng để thu nhỏ.</transl
<translation id="5109816792918100764">Xóa <ph name="LANGUAGE_NAME" /></translation>
<translation id="5111646998522066203">Thoát khỏi chế độ ẩn danh</translation>
<translation id="5111692334209731439">&amp;Trình quản lý Dấu trang</translation>
-<translation id="5111794652433847656">Không có mã xác thực nào cho <ph name="APP_NAME" /> trên thiết bị này</translation>
+<translation id="5111794652433847656">Không có khoá đăng nhập nào cho <ph name="APP_NAME" /> trên thiết bị này</translation>
<translation id="5112577000029535889">&amp;Công cụ dành cho Nhà phát triển</translation>
<translation id="511313294362309725">Bật tính năng Ghép nối nhanh</translation>
<translation id="5113739826273394829">Nếu nhấp vào biểu tượng này, bạn sẽ khóa <ph name="DEVICE_TYPE" /> này theo cách thủ công. Vào lần tới, bạn cần phải nhập mật khẩu của mình để truy cập.</translation>
@@ -4751,7 +4751,7 @@ Nhấn tổ hợp phím Ctrl + Alt + Giảm độ sáng để thu nhỏ.</transl
<translation id="5252653240322147470">Mã PIN phải có ít hơn <ph name="MAXIMUM" /> chữ số</translation>
<translation id="5254368820972107711">Hiển thị các tệp cần xóa</translation>
<translation id="52550593576409946">Không thể chạy ứng dụng Kiosk.</translation>
-<translation id="5255726914791076208">Khi bạn chỉnh sửa mã xác thực, tài khoản <ph name="RP_ID" /> của bạn sẽ không thay đổi</translation>
+<translation id="5255726914791076208">Khi bạn chỉnh sửa khoá đăng nhập, tài khoản <ph name="RP_ID" /> của bạn sẽ không thay đổi</translation>
<translation id="5255859108402770436">Đăng nhập lại</translation>
<translation id="52566111838498928">Đang tải phông chữ...</translation>
<translation id="5256861893479663409">Trên tất cả các trang web</translation>
@@ -4794,7 +4794,7 @@ Nhấn tổ hợp phím Ctrl + Alt + Giảm độ sáng để thu nhỏ.</transl
<translation id="5285635972691565180">Màn hình <ph name="DISPLAY_ID" /></translation>
<translation id="5286194356314741248">Đang quét</translation>
<translation id="5287425679749926365">Tài khoản của bạn</translation>
-<translation id="5288106344236929384">Các thao tác khác, tuỳ chọn mã xác thực cho <ph name="USERNAME" /> trên <ph name="DOMAIN" /></translation>
+<translation id="5288106344236929384">Các thao tác khác, tuỳ chọn khoá đăng nhập cho <ph name="USERNAME" /> trên <ph name="DOMAIN" /></translation>
<translation id="5288678174502918605">&amp;Mở lại Thẻ đã Đóng</translation>
<translation id="52895863590846877">Trang không viết bằng <ph name="LANGUAGE" /></translation>
<translation id="52912272896845572">Tệp khóa cá nhân không hợp lệ.</translation>
@@ -5276,7 +5276,7 @@ Bạn có thể gán nhiều công tắc cho thao tác này.</translation>
<translation id="5734697361979786483">Thêm mục chia sẻ tệp</translation>
<translation id="5736092224453113618">{NUM_FILES,plural, =0{Dữ liệu này hoặc thiết bị của bạn không đáp ứng một số chính sách bảo mật của tổ chức. Hãy trao đổi với quản trị viên của bạn để biết những vấn đề cần khắc phục.}=1{Tệp này hoặc thiết bị của bạn không đáp ứng một số chính sách bảo mật của tổ chức. Hãy trao đổi với quản trị viên của bạn để biết những vấn đề cần khắc phục.}other{Những tệp này không đáp ứng một số chính sách bảo mật của tổ chức. Hãy trao đổi với quản trị viên của bạn để biết những vấn đề cần khắc phục.}}</translation>
<translation id="5736796278325406685">Vui lòng nhập tên người dùng hợp lệ</translation>
-<translation id="5738093759615225354">Bạn cần mã xác thực này để đăng nhập vào máy tính của mình</translation>
+<translation id="5738093759615225354">Bạn cần khoá đăng nhập này để đăng nhập vào máy tính của mình</translation>
<translation id="5739017626473506901">Đăng nhập để giúp <ph name="USER_NAME" /> thêm tài khoản trường học</translation>
<translation id="5739235828260127894">Đang chờ xác minh. <ph name="LINK_BEGIN" />Tìm hiểu thêm<ph name="LINK_END" /></translation>
<translation id="5739458112391494395">Rất lớn</translation>
@@ -5385,7 +5385,7 @@ Bạn có thể gán nhiều công tắc cho thao tác này.</translation>
<translation id="583431638776747">Không truy cập được trang</translation>
<translation id="5834581999798853053">Còn khoảng <ph name="TIME" /> phút</translation>
<translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - Đang ghi âm hoặc quay phim</translation>
-<translation id="5835625581856809102">Quét mã QR này bằng thiết bị mà bạn muốn tạo mã xác thực cho <ph name="APP_NAME" /></translation>
+<translation id="5835625581856809102">Quét mã QR này bằng thiết bị mà bạn muốn tạo khoá đăng nhập cho <ph name="APP_NAME" /></translation>
<translation id="583673505367439042">Các trang web có thể yêu cầu chỉnh sửa tệp và thư mục trên thiết bị của bạn</translation>
<translation id="5836999627049108525">Ngôn ngữ gốc</translation>
<translation id="583756221537636748">Hộp đựng</translation>
@@ -5483,7 +5483,7 @@ Bạn có thể gán nhiều công tắc cho thao tác này.</translation>
<translation id="5915207966717429886">Cho phép lưu dữ liệu</translation>
<translation id="5916655001090539219">Tự động đọc</translation>
<translation id="5916664084637901428">Bật</translation>
-<translation id="59174027418879706">Được kích hoạt</translation>
+<translation id="59174027418879706">Đã bật</translation>
<translation id="5920543303088087579">Quản trị viên của bạn đã tắt tính năng kết nối với mạng này</translation>
<translation id="5921257443092182237">Dịch vụ vị trí của Google sử dụng các nguồn như mạng di động, Wi-Fi và các cảm biến để giúp ước đoán vị của trí thiết bị này.</translation>
<translation id="5924047253200400718">Nhận trợ giúp<ph name="SCANNING_STATUS" /></translation>
@@ -5774,7 +5774,7 @@ Bạn có thể gán nhiều công tắc cho thao tác này.</translation>
<translation id="6178664161104547336">Chọn một chứng chỉ</translation>
<translation id="6178682841350631965">Dữ liệu đăng nhập của bạn đã được cập nhật</translation>
<translation id="6180510783007738939">Công cụ đường thẳng</translation>
-<translation id="6180550893222597997">Bạn muốn sử dụng mã xác thực nào cho <ph name="APP_NAME" />?</translation>
+<translation id="6180550893222597997">Bạn muốn sử dụng khoá đăng nhập nào cho <ph name="APP_NAME" />?</translation>
<translation id="6181431612547969857">Tải xuống bị chặn</translation>
<translation id="6184099524311454384">Tìm kiếm thẻ</translation>
<translation id="6185132558746749656">Vị trí thiết bị</translation>
@@ -6095,7 +6095,7 @@ Bạn có thể gán nhiều công tắc cho thao tác này.</translation>
<translation id="6482559668224714696">Phóng to toàn màn hình</translation>
<translation id="6483485061007832714">Mở tệp đã tải xuống</translation>
<translation id="6483805311199035658">Đang mở <ph name="FILE" />...</translation>
-<translation id="6486301003991593638">Để quản lý mã xác thực, hãy sử dụng phiên bản Windows mới hơn</translation>
+<translation id="6486301003991593638">Để quản lý khoá đăng nhập, hãy sử dụng phiên bản Windows mới hơn</translation>
<translation id="6488266788670893993"><ph name="BRAND" /> không thể kiểm tra mật khẩu để xem có bị rò rỉ dữ liệu hay không. Hãy thử kiểm tra kết nối Internet.</translation>
<translation id="6488384360522318064">Chọn ngôn ngữ</translation>
<translation id="648927581764831596">Không có</translation>
@@ -6851,7 +6851,7 @@ Bạn còn # mật khẩu bị lộ nữa. Trình quản lý mật khẩu của
<translation id="7167486101654761064">&amp;Luôn mở loại tệp này</translation>
<translation id="716775164025088943">Dấu trang, nhật ký, mật khẩu và một số dữ liệu khác của bạn sẽ không được đồng bộ hoá nữa.</translation>
<translation id="716810439572026343">Đang tải xuống <ph name="FILE_NAME" /></translation>
-<translation id="7168109975831002660">Kích thước phông chữ tối thiểu</translation>
+<translation id="7168109975831002660">Cỡ chữ tối thiểu</translation>
<translation id="7169122689956315694">Bật thông báo khi có thiết bị ở gần</translation>
<translation id="7170236477717446850">Ảnh hồ sơ</translation>
<translation id="7171000599584840888">Thêm hồ sơ...</translation>
@@ -6877,7 +6877,7 @@ Bạn còn # mật khẩu bị lộ nữa. Trình quản lý mật khẩu của
<translation id="7193051357671784796">Tổ chức của bạn đã thêm ứng dụng này. Hãy khởi động lại ứng dụng này để hoàn tất quá trình cài đặt.</translation>
<translation id="7193374945610105795">Không có mật khẩu nào được lưu cho <ph name="ORIGIN" /></translation>
<translation id="7194873994243265344">Tổ chức của bạn đã chặn tệp này vì tệp đã được mã hoá. Hãy yêu cầu chủ sở hữu tệp giải mã.</translation>
-<translation id="7196272782924897510">Sử dụng mã xác thực từ một thiết bị khác?</translation>
+<translation id="7196272782924897510">Sử dụng khoá đăng nhập từ một thiết bị khác?</translation>
<translation id="7196913789568937443">Sao lưu lên Google Drive. Dễ dàng khôi phục dữ liệu hoặc chuyển đổi thiết bị bất kỳ lúc nào. Bản sao lưu bao gồm cả dữ liệu ứng dụng. Các bản sao lưu sẽ được tải lên Google và mã hóa bằng mật khẩu Tài khoản Google. <ph name="BEGIN_LINK1" />Tìm hiểu thêm<ph name="END_LINK1" /></translation>
<translation id="7197190419934240522">Sử dụng Google Tìm kiếm và các tính năng thông minh của Google mỗi khi duyệt web</translation>
<translation id="719791532916917144">Phím tắt</translation>
@@ -7403,7 +7403,7 @@ Bạn còn # mật khẩu bị lộ nữa. Trình quản lý mật khẩu của
<translation id="7670483791111801022">Phụ đề</translation>
<translation id="7671130400130574146">Sử dụng thanh tiêu đề và đường viền của hệ thống</translation>
<translation id="767127784612208024">Chạm để xác nhận đặt lại</translation>
-<translation id="7672504401554182757">Chọn thiết bị có mã xác thực cho <ph name="APP_NAME" /></translation>
+<translation id="7672504401554182757">Chọn thiết bị có khoá đăng nhập cho <ph name="APP_NAME" /></translation>
<translation id="7672520070349703697"><ph name="HUNG_IFRAME_URL" />, trong <ph name="PAGE_TITLE" />.</translation>
<translation id="7674416868315480713">Hủy kích hoạt mọi cổng đang được chuyển tiếp trong Linux</translation>
<translation id="7674537509496907005"><ph name="APP_COUNT" /> ứng dụng</translation>
@@ -7515,7 +7515,7 @@ Nhấn một công tắc hoặc phím đã gán để xóa.</translation>
<translation id="7766807826975222231">Tìm hiểu thêm</translation>
<translation id="7766838926148951335">Chấp nhận quyền</translation>
<translation id="7767554953520855281">Khi bạn chia sẻ màn hình, thông tin chi tiết sẽ bị ẩn</translation>
-<translation id="7767972280546034736">Tạo một mã xác thực cho <ph name="APP_NAME" /></translation>
+<translation id="7767972280546034736">Tạo một khoá đăng nhập cho <ph name="APP_NAME" /></translation>
<translation id="7768507955883790804">Các trang web sẽ tự động tuân theo chế độ cài đặt này khi bạn truy cập</translation>
<translation id="7768526219335215384"><ph name="ORIGIN" /> sẽ xem được các tệp trong <ph name="FOLDERNAME" /></translation>
<translation id="7768770796815395237">Thay đổi</translation>
@@ -7904,7 +7904,7 @@ Giữ tệp khóa của bạn ở nơi an toàn. Bạn sẽ cần tệp khóa đ
<translation id="810185532889603849">Màu tùy chỉnh</translation>
<translation id="8101987792947961127">Yêu cầu Powerwash trong lần khởi động lại tiếp theo</translation>
<translation id="8102139037507939978">Xóa thông tin nhận dạng cá nhân khỏi tệp system_logs.txt.</translation>
-<translation id="810362914482827094">Tìm kiếm mã xác thực</translation>
+<translation id="810362914482827094">Tìm kiếm khoá đăng nhập</translation>
<translation id="8104088837833760645">Tải hồ sơ eSIM xuống</translation>
<translation id="8105368624971345109">Tắt</translation>
<translation id="8107015733319732394">Đang cài đặt Cửa hàng Google Play trên <ph name="DEVICE_TYPE" /> của bạn. Quá trình này có thể mất vài phút.</translation>
@@ -8013,7 +8013,7 @@ Giữ tệp khóa của bạn ở nơi an toàn. Bạn sẽ cần tệp khóa đ
<translation id="820568752112382238">Trang web truy cập nhiều nhất</translation>
<translation id="8206745257863499010">Nốt nhạc xanh</translation>
<translation id="8206859287963243715">Di động</translation>
-<translation id="8207404892907560325">Chọn một mã xác thực</translation>
+<translation id="8207404892907560325">Chọn một khoá đăng nhập</translation>
<translation id="8207794858944505786">Máy ảo "<ph name="DEFAULT_VM_NAME" />" tồn tại nhưng có vẻ không phải là máy ảo <ph name="VM_TYPE" /> hợp lệ. Vui lòng liên hệ với quản trị viên của bạn.</translation>
<translation id="8208188204689616705">Các trang web này nằm trong nhóm do <ph name="FPS_OWNER" /> xác định. Các trang web nằm trong nhóm có thể xem hoạt động của bạn trong nhóm.</translation>
<translation id="8208216423136871611">Không lưu</translation>
@@ -8057,7 +8057,7 @@ Giữ tệp khóa của bạn ở nơi an toàn. Bạn sẽ cần tệp khóa đ
<translation id="8248381369318572865">Truy cập micrô và phân tích lời nói</translation>
<translation id="8248887045858762645">Mẹo khi dùng Chrome</translation>
<translation id="8249048954461686687">Thư mục OEM</translation>
-<translation id="8249615410597138718">Gửi đến các thiết bị của bạn</translation>
+<translation id="8249615410597138718">Gửi đến thiết bị của bạn</translation>
<translation id="8250210000648910632">Hết không gian lưu trữ</translation>
<translation id="8251441930213048644">Làm mới ngay</translation>
<translation id="8251509999076836464">Đang ghép nối với <ph name="DEVICE_NAME" /></translation>
@@ -8543,7 +8543,7 @@ Giữ tệp khóa của bạn ở nơi an toàn. Bạn sẽ cần tệp khóa đ
<translation id="8699188901396699995">Tệp PPD cho <ph name="PRINTER_NAME" /></translation>
<translation id="8702278591052316269">Trình đơn chứa các nhóm thẻ đã lưu bị ẩn</translation>
<translation id="8702825062053163569"><ph name="DEVICE_TYPE" /> của bạn đã bị khóa.</translation>
-<translation id="8703166594516496633">Giảm kích thước phông chữ</translation>
+<translation id="8703166594516496633">Giảm cỡ chữ</translation>
<translation id="8703346390800944767">Bỏ qua quảng cáo</translation>
<translation id="8705331520020532516">Số Sê-ri</translation>
<translation id="8705580154597116082">Wi-Fi khả dụng qua điện thoại</translation>
@@ -8561,7 +8561,7 @@ Giữ tệp khóa của bạn ở nơi an toàn. Bạn sẽ cần tệp khóa đ
<translation id="871515167518607670">Hãy chọn một thiết bị. Sau đó, hãy mở Chrome trên thiết bị đó để xem trang.</translation>
<translation id="8715480913140015283">Thẻ nền đang sử dụng máy ảnh</translation>
<translation id="8716931980467311658">Bạn muốn xóa tất cả ứng dụng Linux và dữ liệu trong thư mục tệp Linux khỏi <ph name="DEVICE_TYPE" /> này?</translation>
-<translation id="8717864919010420084">Sao chép đường liên kết</translation>
+<translation id="8717864919010420084">Sao chép liên kết</translation>
<translation id="8718994464069323380">Đã phát hiện thấy màn hình cảm ứng</translation>
<translation id="8719472795285728850">Đang nghe các hoạt động của tiện ích...</translation>
<translation id="8720200012906404956">Đang tìm mạng di động. <ph name="BEGIN_LINK" />Tìm hiểu thêm<ph name="END_LINK" /></translation>
@@ -8572,7 +8572,7 @@ Giữ tệp khóa của bạn ở nơi an toàn. Bạn sẽ cần tệp khóa đ
<translation id="8724859055372736596">&amp;Hiển thị trong Thư mục</translation>
<translation id="8725066075913043281">Thử lại</translation>
<translation id="8725178340343806893">Mục ưa thích/Dấu trang</translation>
-<translation id="87254326763805752">Xác nhận mã xác thực</translation>
+<translation id="87254326763805752">Xác nhận khoá đăng nhập</translation>
<translation id="8726206820263995930">Lỗi khi tìm nạp cài đặt chính sách từ máy chủ: <ph name="CLIENT_ERROR" />.</translation>
<translation id="8728351286589123703">Các quyền bạn đã chọn sẽ được đặt lại</translation>
<translation id="8729133765463465108">Dùng máy ảnh để quét mã QR</translation>
@@ -8944,7 +8944,7 @@ Giữ tệp khóa của bạn ở nơi an toàn. Bạn sẽ cần tệp khóa đ
<translation id="90528604757378587">Hoạt động chạy trong nền và một số hiệu ứng hình ảnh như cuộn mượt có thể bị hạn chế.</translation>
<translation id="9053563360605707198">In trên hai mặt</translation>
<translation id="9055636786322918818">Thực thi mã hóa RC4. Việc sử dụng tùy chọn này sẽ làm gia tăng rủi ro vì các thuật toán mã hóa RC4 là không an toàn.</translation>
-<translation id="9056788090206401048">Bạn phải bật Bluetooth để sử dụng mã xác thực trên một thiết bị khác. Bạn có thể quản lý chế độ cài đặt này bất cứ lúc nào trong phần cài đặt.</translation>
+<translation id="9056788090206401048">Bạn phải bật Bluetooth để sử dụng khoá truy cập trên một thiết bị khác. Bạn có thể quản lý chế độ cài đặt này bất cứ lúc nào trong phần cài đặt.</translation>
<translation id="9056810968620647706">Không tìm thấy kết quả phù hợp nào.</translation>
<translation id="9057007989365783744"><ph name="SUPERVISED_USER_NAME" /> muốn truy cập nội dung sau:</translation>
<translation id="9057354806206861646">Cập nhật lịch biểu</translation>
@@ -9090,7 +9090,7 @@ Giữ tệp khóa của bạn ở nơi an toàn. Bạn sẽ cần tệp khóa đ
<translation id="9180281769944411366">Quá trình này có thể mất vài phút. Đang khởi động vùng chứa Linux.</translation>
<translation id="9180380851667544951">Trang web có thể chia sẻ màn hình của bạn</translation>
<translation id="9182556968660520230">Không cho phép trang web phát nội dung được bảo vệ</translation>
-<translation id="9183331776983279456">Chrome tự động xoá những trang web mà đã hơn 4 tuần bạn không truy cập. Trang web bạn truy cập lại có thể xuất hiện lại trong danh sách. Ngoài ra, bạn có thể ngăn một trang web đề xuất quảng cáo cho bạn.</translation>
+<translation id="9183331776983279456">Chrome tự động xoá những trang web mà đã hơn 4 tuần bạn không truy cập. Những trang web bạn truy cập lại có thể xuất hiện lại trong danh sách. Ngoài ra, bạn có thể ngăn một trang web đề xuất quảng cáo cho bạn.</translation>
<translation id="918352324374649435">{COUNT,plural, =1{Ứng dụng}other{# ứng dụng}}</translation>
<translation id="9186963452600581158">Đăng nhập bằng Tài khoản Google của trẻ</translation>
<translation id="9187967020623675250">Các phím không khớp. Hãy nhấn phím bất kỳ để <ph name="RESPONSE" />.</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_zh-CN.xtb b/chromium/chrome/app/resources/generated_resources_zh-CN.xtb
index e32cbfdc4c7..4bf48add73a 100644
--- a/chromium/chrome/app/resources/generated_resources_zh-CN.xtb
+++ b/chromium/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -181,7 +181,7 @@
<translation id="1155545602507378023">否,仅限此设备</translation>
<translation id="1155816283571436363">正在连接到您的手机</translation>
<translation id="1158080958325422608">转换为大写</translation>
-<translation id="1158238185437008462">查看回忆集锦</translation>
+<translation id="1158238185437008462">查看回忆</translation>
<translation id="1160842321113409343">为保护您的隐私,一旦网站的保留时长超过 4 周,系统便会自动从列表中删除相应网站。您再次访问的网站可能会重新出现在列表中。如果您不希望系统(再)根据某个网站来推测您的兴趣,也可自行移除相应网站。</translation>
<translation id="1161575384898972166">请登录“<ph name="TOKEN_NAME" />”,导出客户端证书。</translation>
<translation id="116173250649946226">您的管理员已设置默认主题,您无法更改。</translation>
@@ -376,7 +376,7 @@
<translation id="1338631221631423366">正在配对…</translation>
<translation id="1338802252451106843"><ph name="ORIGIN" /> 想打开此应用。</translation>
<translation id="1338950911836659113">正在删除…</translation>
-<translation id="1339009753652684748">只需说“Ok Google”即可使用您的 Google 助理。为了省电,请选择“开启(推荐)”。选择这一选项后,只有当您的设备已接通电源或正在充电时,Google 助理才会做出响应。</translation>
+<translation id="1339009753652684748">只需说“Hey Google”即可使用您的 Google 助理。为了省电,请选择“开启(推荐)”。选择这一选项后,只有当您的设备已接通电源或正在充电时,Google 助理才会做出响应。</translation>
<translation id="13392265090583506">无障碍设置</translation>
<translation id="1340527397989195812">使用“文件”应用备份设备上的媒体。</translation>
<translation id="1341701348342335220">太棒了,全部完成!</translation>
@@ -1189,7 +1189,7 @@
<translation id="2048554637254265991">启动容器管理器时出错。请重试。</translation>
<translation id="2048653237708779538">无法执行操作</translation>
<translation id="204914487372604757">创建快捷方式</translation>
-<translation id="2050339315714019657">纵向</translation>
+<translation id="2050339315714019657">人像</translation>
<translation id="2051555741181591333">自动停用热点</translation>
<translation id="2052572566310583903">已安装在您的其他设备上</translation>
<translation id="2053105195397337973">我们正在探索如何既能让网站阻止垃圾广告和欺诈行为,又能限制跟踪。</translation>
@@ -1506,7 +1506,7 @@
<ph name="BEGIN_BOLD" />注意<ph name="END_BOLD" />:在此过程中,系统将会重新启动。</translation>
<translation id="23030561267973084">“<ph name="EXTENSION_NAME" />”请求获得更多权限。</translation>
<translation id="2307462900900812319">配置网络</translation>
-<translation id="2307553512430195144">如果您同意,Google 助理将会在待机模式下等待检测“Ok Google”,并可以通过 Voice Match 识别出是<ph name="SUPERVISED_USER_NAME" />在说话。
+<translation id="2307553512430195144">如果您同意,Google 助理将会在待机模式下等待检测“Hey Google”,并可以通过 Voice Match 识别出是<ph name="SUPERVISED_USER_NAME" />在说话。
<ph name="BR" />
借助 Voice Match,Google 助理可在您的 <ph name="DEVICE_TYPE" /> 上识别出<ph name="SUPERVISED_USER_NAME" />的语音,从而将其与他人区分开。
<ph name="BR" />
@@ -2541,7 +2541,7 @@
<translation id="3244294424315804309">继续保持静音</translation>
<translation id="324849028894344899"><ph name="WINDOW_TITLE" /> - 网络错误</translation>
<translation id="3248902735035392926">安全至上。请花点时间<ph name="BEGIN_LINK" />立即检查一下您的扩展程序<ph name="END_LINK" />吧</translation>
-<translation id="3251714896659475029">允许<ph name="SUPERVISED_USER_NAME" />使用“Ok Google”指令启动 Google 助理</translation>
+<translation id="3251714896659475029">允许<ph name="SUPERVISED_USER_NAME" />使用“Hey Google”指令启动 Google 助理</translation>
<translation id="3251759466064201842">&lt;未包含在证书中&gt;</translation>
<translation id="325238099842880997">设置数字设备基本使用规则,以方便孩子在家中玩乐、探索和完成学校作业</translation>
<translation id="3253448572569133955">未知帐号</translation>
@@ -3533,7 +3533,7 @@
<translation id="4116704186509653070">重新打开</translation>
<translation id="4117714603282104018">触控板触感反馈</translation>
<translation id="4118579674665737931">请重新启动此设备,然后重试。</translation>
-<translation id="412022815379960229">登录后即可开始浏览您在 Google 相册中的回忆集锦。</translation>
+<translation id="412022815379960229">登录后即可开始浏览您在 Google 相册中的回忆。</translation>
<translation id="4120388883569225797">无法重置此安全密钥</translation>
<translation id="4120817667028078560">路径过长</translation>
<translation id="4124823734405044952">您的安全密钥已重置完毕</translation>
@@ -3757,7 +3757,7 @@
<translation id="4348766275249686434">收集各项错误</translation>
<translation id="4349828822184870497">有用</translation>
<translation id="4350230709416545141">始终禁止 <ph name="HOST" /> 使用您的位置信息</translation>
-<translation id="4350782034419308508">Ok Google</translation>
+<translation id="4350782034419308508">Hey Google</translation>
<translation id="4351770750390404505"><ph name="BEGIN_PARAGRAPH1" />为了提供最佳体验,<ph name="DEVICE_OS" /> 会收集与设备有关的硬件数据并将其分享给 Google,以确定应提供哪些更新。您也可允许 Google 将这些数据用于其他用途,例如提供支持以及改进 <ph name="DEVICE_OS" /> 体验和服务。<ph name="END_PARAGRAPH1" /><ph name="BEGIN_PARAGRAPH2" />您可在此设备上登录,然后访问 chrome://system 中的 CHROMEOSFLEX_HARDWARE_INFO 部分,以查看向 Google 发送的用于更新过滤机制的数据,以及您选择与 Google 分享数据的所有其他情形。<ph name="END_PARAGRAPH2" /><ph name="BEGIN_PARAGRAPH3" />如需详细了解 <ph name="DEVICE_OS" /> 可能会与 Google 分享的数据及其使用方式,请访问 g.co/flex/HWDataCollection。<ph name="END_PARAGRAPH3" /></translation>
<translation id="4354073718307267720">在网站想为您的周边环境创建 3D 地图或跟踪摄像头位置时询问您</translation>
<translation id="4354344420232759511">您访问的网站将显示在此处</translation>
@@ -3888,7 +3888,7 @@
<translation id="4461483878391246134">添加一律不提供翻译的语言</translation>
<translation id="4462159676511157176">自定义域名服务器</translation>
<translation id="4465236939126352372">为“<ph name="APP_NAME" />”设置了 <ph name="TIME" />的使用时限</translation>
-<translation id="4466839823729730432">在此处查看您的回忆集锦</translation>
+<translation id="4466839823729730432">在此处查看您的回忆</translation>
<translation id="4469324811108161144">备注最多可以包含 <ph name="CHARACTER_LIMIT" /> 个字符。</translation>
<translation id="4469762931504673593"><ph name="ORIGIN" /> 可修改“<ph name="FOLDERNAME" />”内的文件</translation>
<translation id="4470957202018033307">外部存储偏好设置</translation>
@@ -4203,7 +4203,7 @@
<translation id="4743260470722568160"><ph name="BEGIN_LINK" />了解如何更新应用<ph name="END_LINK" /></translation>
<translation id="4744268813103118742">前往网站</translation>
<translation id="4744981231093950366">{NUM_TABS,plural, =1{将这个网站取消静音}other{将这些网站取消静音}}</translation>
-<translation id="474609389162964566">说“Ok Google”即可启动 Google 助理</translation>
+<translation id="474609389162964566">说“Hey Google”即可启动 Google 助理</translation>
<translation id="4746351372139058112">信息</translation>
<translation id="4748783296226936791">网站通常会连接到 HID 设备以实现某些需要使用非标准键盘、游戏控制器和其他设备的功能</translation>
<translation id="4749960740855309258">打开新标签页</translation>
@@ -4570,7 +4570,7 @@
<translation id="5094721898978802975">与协作的本机应用通信</translation>
<translation id="5097002363526479830">无法连接到网络“<ph name="NAME" />”:<ph name="DETAILS" /></translation>
<translation id="5097306410549350357">详细了解如何使用位置信息</translation>
-<translation id="5097349930204431044">您访问的网站能推测您的喜好,然后在您继续浏览时向您展示建议的广告</translation>
+<translation id="5097349930204431044">您访问的网站能判断您的喜好,然后在您继续浏览时向您展示建议的广告</translation>
<translation id="5097649414558628673">工具:<ph name="PRINT_NAME" /></translation>
<translation id="5097874180538493929">光标停止移动时自动点击</translation>
<translation id="5101839224773798795">光标停止时自动点击</translation>
@@ -4924,7 +4924,7 @@
<translation id="5435779377906857208">始终允许 <ph name="HOST" /> 使用您的位置信息</translation>
<translation id="5436492226391861498">正在等待代理隧道的响应...</translation>
<translation id="5436510242972373446">用 <ph name="SITE_NAME" /> 搜索:</translation>
-<translation id="5436575196282187764">Google 相册中的回忆集锦</translation>
+<translation id="5436575196282187764">Google 相册中的回忆</translation>
<translation id="5439680044267106777">跳过此步骤并设置新的个人资料</translation>
<translation id="544083962418256601">创建快捷方式...</translation>
<translation id="5441133529460183413">从 Chrome 浏览器安装的 Web 应用</translation>
@@ -5149,7 +5149,7 @@
<translation id="5632566673632479864">您的帐号 <ph name="EMAIL" /> 已无法再用作主帐号。该帐号由 <ph name="DOMAIN" /> 管理,因此您的书签、历史记录、密码及其他设置将从此设备中清除。</translation>
<translation id="5633149627228920745">详细了解系统要求</translation>
<translation id="563371367637259496">移动网络</translation>
-<translation id="5634446357546764049">查看近期旅行等活动的回忆集锦</translation>
+<translation id="5634446357546764049">查看近期旅行等活动的回忆</translation>
<translation id="5635312199252507107">在特定网站上允许</translation>
<translation id="563535393368633106">使用前先询问(推荐)</translation>
<translation id="5636012309446422">从 <ph name="PRIMARY_EMAIL" /> 中移除“<ph name="DEVICE" />”?</translation>
@@ -5264,7 +5264,7 @@
<translation id="5747809636523347288">粘贴并转到 <ph name="URL" /></translation>
<translation id="5748137879145720682">在拔下计算机电源线时开启</translation>
<translation id="5751345516399502412">检查网络共享就绪与否</translation>
-<translation id="5755022574660047665">Google 相册中的回忆集锦</translation>
+<translation id="5755022574660047665">Google 相册中的回忆</translation>
<translation id="5756163054456765343">帮助中心(&amp;E)</translation>
<translation id="5757375109985023827">选择一个标签页即可预览</translation>
<translation id="5758631781033351321">您的阅读清单会显示在此处</translation>
@@ -5611,7 +5611,7 @@
<translation id="6059925163896151826">USB 设备</translation>
<translation id="6061408389284235459">通知已发送至<ph name="DEVICE_NAME" /></translation>
<translation id="6063284707309177505">创建二维码</translation>
-<translation id="6063847492705284550"><ph name="BEGIN_BOLD" />注意<ph name="END_BOLD" />:如果有人在语音上与<ph name="SUPERVISED_USER_NAME" />相似或拥有后者的语音录音,此人可能也能获取后者的个人信息相关结果。为了省电,您可以在<ph name="SUPERVISED_USER_NAME" />的 Google 助理设置中选择让“Ok Google”指令仅在此设备已接通电源时可用。</translation>
+<translation id="6063847492705284550"><ph name="BEGIN_BOLD" />注意<ph name="END_BOLD" />:如果有人在语音上与<ph name="SUPERVISED_USER_NAME" />相似或拥有后者的语音录音,此人可能也能获取后者的个人信息相关结果。为了省电,您可以在<ph name="SUPERVISED_USER_NAME" />的 Google 助理设置中选择让“Hey Google”指令仅在此设备已接通电源时可用。</translation>
<translation id="6064217302520318294">屏幕锁定</translation>
<translation id="6065145031947216733">单独存储您的浏览数据?</translation>
<translation id="6065289257230303064">证书主题背景目录属性</translation>
@@ -5762,7 +5762,7 @@
<translation id="6200151268994853226">管理扩展程序</translation>
<translation id="6201608810045805374">移除此帐号?</translation>
<translation id="6202304368170870640">您可以使用 PIN 码登录或解锁您的设备。</translation>
-<translation id="6205314730813004066">广告隐私设置</translation>
+<translation id="6205314730813004066">广告隐私权设置</translation>
<translation id="6206199626856438589">您将从显示的网站(包括已打开的标签页中的网站)退出帐号</translation>
<translation id="6206311232642889873">复制图片(&amp;Y)</translation>
<translation id="6206521455877863927">包括同一个网域中的各个网站,例如 google.com 和 mail.google.com。您正在查看的网站可将数据保存在您的设备上。</translation>
@@ -5880,7 +5880,7 @@
<translation id="6308493641021088955">登录服务提供方:<ph name="EXTENSION_NAME" /></translation>
<translation id="6308937455967653460">链接另存为(&amp;K)...</translation>
<translation id="6309443618838462258">您的管理员不允许使用此输入法</translation>
-<translation id="630948338437014525">回忆集锦</translation>
+<translation id="630948338437014525">回忆</translation>
<translation id="6309510305002439352">麦克风已关闭</translation>
<translation id="6310141306111263820">无法安装 eSIM 卡配置文件。如需帮助,请与您的运营商联系。</translation>
<translation id="6311165245110979290">有可用的虚拟卡</translation>
@@ -6174,7 +6174,7 @@
<translation id="6584878029876017575">Microsoft 生存时间签名</translation>
<translation id="6585584201072946561">自定义网络浏览器的文字大小和字体</translation>
<translation id="6586099239452884121">访客浏览</translation>
-<translation id="6586213706115310390">只需说“Ok Google”即可使用您的 Google 助理。</translation>
+<translation id="6586213706115310390">只需说“Hey Google”即可使用您的 Google 助理。</translation>
<translation id="6586451623538375658">切换鼠标主按钮</translation>
<translation id="6587958707401001932">选择您的默认设置</translation>
<translation id="6588043302623806746">使用安全 DNS</translation>
@@ -6420,7 +6420,7 @@
<translation id="6808166974213191158">ChromeOS Flex 系统映像写入工具</translation>
<translation id="6808193438228982088">狐狸</translation>
<translation id="6809470175540814047">在无痕式窗口中打开</translation>
-<translation id="6809656734323672573">如果您同意,Google 助理将会在待机模式下等待检测“Ok Google”指令,并可以通过 Voice Match 识别出是您在说话。
+<translation id="6809656734323672573">如果您同意,Google 助理将会在待机模式下等待检测“Hey Google”指令,并可以通过 Voice Match 识别出是您在说话。
<ph name="BR" />
借助 Voice Match 功能,Google 助理能够识别出您的语音,从而将您与他人区分开。Google 助理会录制您的语音剪辑以创建专属语音模型,这个语音模型只会存储在您的设备上。系统可能会暂时将您的语音模型发送给 Google,以便更准确地识别您的语音。
<ph name="BR" />
@@ -6640,7 +6640,7 @@
<translation id="6988094684494323731">正在启动 Linux 容器</translation>
<translation id="6988403677482707277">此标签页已移至标签栏的开头</translation>
<translation id="6989123022222588975">您尚未移除任何兴趣</translation>
-<translation id="6990209147952697693">传统版 Chrome</translation>
+<translation id="6990209147952697693">经典 Chrome 外观</translation>
<translation id="6991665348624301627">选择目标打印机</translation>
<translation id="6992554835374084304">开启增强的“拼写检查”功能</translation>
<translation id="6993000214273684335">此标签页已从未命名的组中移除 - 该组包含<ph name="GROUP_CONTENTS" /></translation>
@@ -6791,7 +6791,7 @@
<translation id="7123302939607518173">如果您认为与某项兴趣或某个网站相关的广告对您有用,可以添加该兴趣或网站。</translation>
<translation id="7124013154139278147">为“上一项”操作分配开关</translation>
<translation id="7124712201233930202">不符合贵组织的政策</translation>
-<translation id="7125029162161377569">Privacy Sandbox 试用计划推出后,网站既能减少使用您的信息,又能提供同样出色的浏览体验。这意味着您的隐私会受到更好的保护,而且跨网站跟踪也会减少。一旦新的功能可供试用,我们即会添加相应功能。</translation>
+<translation id="7125029162161377569">Privacy Sandbox 试用版推出后,网站既能减少使用您的信息,又能提供同样出色的浏览体验。这意味着您的隐私会受到更好的保护,而且跨网站跟踪也会减少。一旦新的功能可供试用,我们即会添加相应功能。</translation>
<translation id="7125148293026877011">删除 Crostini</translation>
<translation id="7127980134843952133">下载记录</translation>
<translation id="7128151990937044829">当通知处于屏蔽状态时在地址栏中显示“已屏蔽”图标</translation>
@@ -6957,7 +6957,7 @@
<translation id="7299337219131431707">启用访客浏览</translation>
<translation id="7299515639584427954">为默认应用更改受支持的链接?</translation>
<translation id="7299588179200441056"><ph name="URL" /> - <ph name="FOLDER" /></translation>
-<translation id="7301470816294041580">您可以这样问:“Ok Google,这是什么歌?”或“Ok Google,我的屏幕上显示的是什么?”</translation>
+<translation id="7301470816294041580">您可以这样问:“Hey Google,这是什么歌?”或“Hey Google,我的屏幕上显示的是什么?”</translation>
<translation id="730289542559375723">{NUM_APPLICATIONS,plural, =1{这款应用可能会致使 Chrome 无法正常运行。}other{这些应用可能会致使 Chrome 无法正常运行。}}</translation>
<translation id="7303281435234579599">糟糕!设置演示模式时出了点问题。</translation>
<translation id="7303900363563182677">此网站已被阻止查看复制到剪贴板的文字和图片</translation>
@@ -7008,7 +7008,7 @@
<translation id="7354120289251608189">您现在可以随时为浏览器换上全新外观了。</translation>
<translation id="7356908624372060336">网络日志</translation>
<translation id="735745346212279324">VPN 连接已断开</translation>
-<translation id="7358324924540718595">今天已隐藏回忆集锦</translation>
+<translation id="7358324924540718595">今天已隐藏回忆</translation>
<translation id="7358338787722390626">关闭侧边栏中的搜索工具栏。</translation>
<translation id="735994578317267253">在任意 Chrome 操作系统设备上使用您的应用、设置等等</translation>
<translation id="7360233684753165754">通过“<ph name="PRINTER_NAME" />”打印 <ph name="PAGE_NUMBER" /> 个页面</translation>
@@ -7098,7 +7098,7 @@
<translation id="7423807071740419372"><ph name="APP_NAME" /> 需要获得相应权限才能运行</translation>
<translation id="7424153922653300265">节能模式已开启</translation>
<translation id="7424818322350938336">已添加网络</translation>
-<translation id="7427315069950454694">今天的回忆集锦</translation>
+<translation id="7427315069950454694">今天的回忆</translation>
<translation id="7427348830195639090">后台网页:<ph name="BACKGROUND_PAGE_URL" /></translation>
<translation id="7427798576651127129">通过<ph name="DEVICE_NAME" />拨打电话</translation>
<translation id="7431719494109538750">找不到任何 HID 设备</translation>
@@ -7295,7 +7295,7 @@
<translation id="7614260613810441905">在网站想要修改您设备上的文件或文件夹时先询问您(推荐)</translation>
<translation id="761530003705945209">备份到 Google 云端硬盘。您随时可以轻松地恢复数据或更换设备。您的备份内容包含应用数据。您的备份内容将上传到 Google 并使用您的 Google 帐号密码进行加密。</translation>
<translation id="7615365294369022248">添加帐号时出错</translation>
-<translation id="7615807797520072741">重置为传统版 Chrome</translation>
+<translation id="7615807797520072741">重置为经典 Chrome 外观</translation>
<translation id="7616214729753637086">正在注册设备…</translation>
<translation id="7617263010641145920">开启 Play 商店</translation>
<translation id="7617648809369507487">使用干扰性更低的提示方式</translation>
@@ -7399,7 +7399,7 @@
<translation id="7690853182226561458">添加文件夹(&amp;F)...</translation>
<translation id="7691073721729883399">无法为该自助服务终端应用装载 cryptohome。</translation>
<translation id="7691077781194517083">无法重置此安全密钥。错误代码为 <ph name="ERROR_CODE" />。</translation>
-<translation id="7691163173018300413">“Ok Google”</translation>
+<translation id="7691163173018300413">“Hey Google”</translation>
<translation id="7691698019618282776">Crostini 升级</translation>
<translation id="7694246789328885917">荧光笔工具</translation>
<translation id="7696063401938172191">在您的“<ph name="PHONE_NAME" />”上:</translation>
@@ -7574,7 +7574,7 @@
<translation id="7850717413915978159"><ph name="BEGIN_PARAGRAPH1" />允许 Chrome 操作系统设备自动发送报告,可以帮助我们确定 Chrome 操作系统中需要优先解决的问题和优先改进的方面。这些报告可能包含的内容有:Chrome 操作系统的崩溃时间、使用的功能、通常占用的内存量、Android 应用诊断数据和使用情况数据,等等。部分汇总数据还会对 Google 应用和合作伙伴(例如 Android 开发者)有所帮助。<ph name="END_PARAGRAPH1" />
<ph name="BEGIN_PARAGRAPH2" />您随时可在 Chrome 操作系统设备的设置中开始或停止发送这些报告。如果您是网域管理员,则可在管理控制台中更改这一设置。<ph name="END_PARAGRAPH2" />
<ph name="BEGIN_PARAGRAPH3" />如果您已为自己的 Google 帐号开启“网络与应用活动记录”设置,您的 Android 数据可能会被保存到您的 Google 帐号中。您可在 account.google.com 上查看和删除您的数据以及更改您的帐号设置。<ph name="END_PARAGRAPH3" /></translation>
-<translation id="7851021205959621355"><ph name="BEGIN_BOLD" />注意<ph name="END_BOLD" />:如果有人在语音上与您相似或拥有您的语音录音,此人可能也能获取您的个人信息相关结果或使用您的 Google 助理。为了省电,您可以在 Google 助理设置中选择让“Ok Google”指令仅在此设备已接通电源时可用。</translation>
+<translation id="7851021205959621355"><ph name="BEGIN_BOLD" />注意<ph name="END_BOLD" />:如果有人在语音上与您相似或拥有您的语音录音,此人可能也能获取您的个人信息相关结果或使用您的 Google 助理。为了省电,您可以在 Google 助理设置中选择让“Hey Google”指令仅在此设备已接通电源时可用。</translation>
<translation id="7851457902707056880">仅所有者帐号才能登录。请重新启动并使用所有者帐号登录。设备将在30秒后自动重新启动。</translation>
<translation id="7851716364080026749">始终禁止使用摄像头和麦克风</translation>
<translation id="7851720427268294554">IPP 解析器</translation>
@@ -8209,7 +8209,7 @@
<translation id="8412136526970428322">授予了“<ph name="PERMISSION" />”权限和另外 <ph name="COUNT" /> 项权限</translation>
<translation id="8413385045638830869">先询问(推荐)</translation>
<translation id="8413956290606243087">您想为 Chrome 操作系统启用 ChromeVox(内置屏幕阅读器)吗?</translation>
-<translation id="8414249071344507766">回忆集锦已设为隐藏两天</translation>
+<translation id="8414249071344507766">回忆已设为隐藏两天</translation>
<translation id="8414396119627470038">通过 <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> 登录 <ph name="SITE_ETLD_PLUS_ONE" /></translation>
<translation id="8414685983518053656">备注</translation>
<translation id="8416730306157376817"><ph name="BATTERY_PERCENTAGE" />%(保护套)</translation>
@@ -8311,7 +8311,7 @@
<translation id="8512396579636492893">{COUNT,plural, =0{未发现任何安全系数低的密码}=1{发现了 {COUNT} 个安全系数低的密码}other{发现了 {COUNT} 个安全系数低的密码}}</translation>
<translation id="8512476990829870887">结束进程</translation>
<translation id="851263357009351303">始终允许 <ph name="HOST" /> 显示图片</translation>
-<translation id="8513108775083588393">自动旋转屏幕</translation>
+<translation id="8513108775083588393">自动屏幕旋转</translation>
<translation id="8514746246728959655">尝试改用一个不同的安全密钥</translation>
<translation id="8514955299594277296">不允许网站将数据保存在设备上(不推荐)</translation>
<translation id="8519895319663397036">无法导入密码。文件大小应小于 150 KB。</translation>
@@ -8604,7 +8604,7 @@
<ph name="DOMAIN" /> 要求您使智能卡保持插入状态。}}</translation>
<translation id="8776294611668764629">贵组织屏蔽了此文件,因为它过大,无法接受安全检查。您只能打开不超过 50 MB 的文件。</translation>
<translation id="8777628254805677039">根密码</translation>
-<translation id="8778393144535275552">清除显示的数据</translation>
+<translation id="8778393144535275552">清除所显示网站的数据</translation>
<translation id="8779944680596936487">网站只能使用 Cookie 查看您在相应网站上的浏览活动</translation>
<translation id="8780123805589053431">从 Google 获取图片说明</translation>
<translation id="8780443667474968681">已关闭语音搜索功能。</translation>
@@ -9060,7 +9060,7 @@
<translation id="9180281769944411366">此过程可能需要几分钟的时间。正在启动 Linux 容器。</translation>
<translation id="9180380851667544951">该网站可能会共享您的屏幕</translation>
<translation id="9182556968660520230">不允许网站播放受保护内容</translation>
-<translation id="9183331776983279456">Chrome 会自动删除保留时长超过 4 周的网站。再次访问的网站可能会重新出现在列表中。您也可屏蔽某个网站,拒绝其展示建议的广告。</translation>
+<translation id="9183331776983279456">Chrome 会自动删除保留时长超过 4 周的网站。您再次访问的网站可能会重新出现在列表中。您也可以禁止某个网站向您展示建议的广告。</translation>
<translation id="918352324374649435">{COUNT,plural, =1{应用}other{# 个应用}}</translation>
<translation id="9186963452600581158">使用孩子的 Google 帐号登录</translation>
<translation id="9187967020623675250">按的键不匹配。按任意键即可<ph name="RESPONSE" />。</translation>
@@ -9112,7 +9112,7 @@
<translation id="936646668635477464">摄像头和麦克风</translation>
<translation id="936801553271523408">系统诊断数据</translation>
<translation id="93766956588638423">修复扩展程序</translation>
-<translation id="938568644810664664">不妨试着这样问:“Ok Google,这是什么歌?”或“Ok Google,我的屏幕上显示的是什么?”</translation>
+<translation id="938568644810664664">不妨试着这样问:“Hey Google,这是什么歌?”或“Hey Google,我的屏幕上显示的是什么?”</translation>
<translation id="938623846785894166">不常用的文件</translation>
<translation id="939401694733344652">目前这些帐号并未用于 Android 应用。如果您选择了一个帐号用于该 Android 应用,那么此帐号也可用于其他 Android 应用。您可在<ph name="LINK_BEGIN" />设置 &gt; 帐号<ph name="LINK_END" />部分中更改 Android 应用的权限。</translation>
<translation id="939598580284253335">请输入密码</translation>
@@ -9172,7 +9172,7 @@
<translation id="995755448277384931">添加 IBAN</translation>
<translation id="995782501881226248">YouTube</translation>
<translation id="996250603853062861">正在建立安全连接...</translation>
-<translation id="996803490569799917">查看与亲朋好友相聚时刻的回忆集锦</translation>
+<translation id="996803490569799917">查看与亲朋好友相聚时刻的回忆</translation>
<translation id="997143476478634194">网站会在您访问时自动采用此设置。网站通常会传送通知,以便您知悉重大新闻或聊天消息。</translation>
<translation id="99731366405731005">您需要开启 <ph name="LINK1_BEGIN" />Chrome 同步<ph name="LINK1_END" />才能使用 Wi-Fi 同步功能。<ph name="LINK2_BEGIN" />了解详情<ph name="LINK2_END" /></translation>
<translation id="998747458861718449">检查(&amp;N)</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_zh-HK.xtb b/chromium/chrome/app/resources/generated_resources_zh-HK.xtb
index 06355d79b65..91aa4be3cc8 100644
--- a/chromium/chrome/app/resources/generated_resources_zh-HK.xtb
+++ b/chromium/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -1208,7 +1208,7 @@
<translation id="2048554637254265991">啟動容器管理員時發生錯誤。請再試一次。</translation>
<translation id="2048653237708779538">無法執行操作</translation>
<translation id="204914487372604757">建立捷徑</translation>
-<translation id="2050339315714019657">直向</translation>
+<translation id="2050339315714019657">人像</translation>
<translation id="2051555741181591333">自動停用熱點</translation>
<translation id="2052572566310583903">您在其他裝置上安裝的應用程式</translation>
<translation id="2053105195397337973">我們正在探索方法,讓網站阻止垃圾廣告和欺詐行為,同時限制追蹤功能。</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_zh-TW.xtb b/chromium/chrome/app/resources/generated_resources_zh-TW.xtb
index 27515ccddb3..e7ec536a0ef 100644
--- a/chromium/chrome/app/resources/generated_resources_zh-TW.xtb
+++ b/chromium/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -1196,7 +1196,7 @@
<translation id="2048554637254265991">啟動容器管理工具時發生錯誤,請再試一次。</translation>
<translation id="2048653237708779538">無法執行操作</translation>
<translation id="204914487372604757">建立捷徑</translation>
-<translation id="2050339315714019657">直向</translation>
+<translation id="2050339315714019657">肖像模式</translation>
<translation id="2051555741181591333">自動停用無線基地台</translation>
<translation id="2052572566310583903">你在其他裝置上安裝的應用程式</translation>
<translation id="2053105195397337973">我們正在研究如何限制追蹤行為,同時讓網站能夠防範廣告垃圾內容和詐欺行為。</translation>
@@ -1307,7 +1307,7 @@
<translation id="2136476978468204130">你輸入的通關密語不正確</translation>
<translation id="2137128126782078222">不允許接收來自 <ph name="WEBSITE" /> 的通知</translation>
<translation id="2139919072249842737">「設定」按鈕</translation>
-<translation id="2140788884185208305">電池壽命</translation>
+<translation id="2140788884185208305">電池健康度</translation>
<translation id="2140902257485550046">選擇封鎖這個網站的所有擴充功能</translation>
<translation id="2142328300403846845">以其他身分開啟連結</translation>
<translation id="2142582065325732898">開啟 <ph name="LINK1_BEGIN" />Chrome 同步功能<ph name="LINK1_END" />即可查看最近開啟的 Chrome 分頁。<ph name="LINK2_BEGIN" />瞭解詳情<ph name="LINK2_END" /></translation>
@@ -1557,7 +1557,7 @@
<translation id="2336228925368920074">將所有分頁加入書籤...</translation>
<translation id="2336376423977300504">一律在視窗關閉時清除 Cookie</translation>
<translation id="2336381494582898602">Powerwash</translation>
-<translation id="2337236196941929873">預先載入 Chrome 認為你可能造訪的網頁。為此,Chrome 可能會使用 Cookie (如果你允許的話),也可能加密網頁並透過 Google 傳送,以便向網站隱藏你的身分。</translation>
+<translation id="2337236196941929873">預先載入 Chrome 認為你可能造訪的網頁。因此,Chrome 可能會使用 Cookie (如果你允許的話),也可能加密網頁並透過 Google 傳送,向網站隱藏你的身分。</translation>
<translation id="2340239562261172947">無法安全下載「<ph name="FILE_NAME" />」</translation>
<translation id="2342180549977909852">你的孩子可以使用一組數字 (PIN 碼) 來解鎖這部裝置,這組數字與密碼不同。如要稍後再設定 PIN 碼,請前往「設定」。</translation>
<translation id="2342740338116612727">已新增書籤</translation>
@@ -2183,7 +2183,7 @@
<translation id="2891922230654533301">要從這部裝置登入「<ph name="APP_NAME" />」嗎?</translation>
<translation id="2893013536106749396">挑選所需資訊卡,隨時掌握所關切事物的最新資訊</translation>
<translation id="2893168226686371498">預設瀏覽器</translation>
-<translation id="2893180576842394309">Google 可能會使用你的歷史記錄,為你提供個人化的搜尋服務和其他各項 Google 服務</translation>
+<translation id="2893180576842394309">Google 可能會使用你的歷史記錄,為你提供個人化的 Google 搜尋和其他服務</translation>
<translation id="2894757982205307093">在群組中新增分頁</translation>
<translation id="289695669188700754">金鑰識別碼:<ph name="KEY_ID" /></translation>
<translation id="2897713966423243833">所有無痕式視窗關閉後,這項自訂設定將會移除</translation>
@@ -2277,7 +2277,7 @@
<translation id="2979639724566107830">於新視窗中開啟</translation>
<translation id="2981113813906970160">顯示大型滑鼠游標</translation>
<translation id="2981293774053328982">這個檔案含有惡意軟體,可能會入侵你的社群網路或個人帳戶</translation>
-<translation id="2983102365694924129">根據你在網站上的活動獨家推薦。這項設定已關閉。</translation>
+<translation id="2983102365694924129">以你的網站活動做為依據。這項設定已關閉。</translation>
<translation id="2983373101216420412">充電盒電量為 <ph name="PERCENTAGE" />%。</translation>
<translation id="2985348301114641460">要傳送「<ph name="EXTENSION_NAME" />」的安裝要求給系統管理員嗎?</translation>
<translation id="2987620471460279764">從其他裝置分享的文字</translation>
@@ -2340,7 +2340,7 @@
<translation id="3024374909719388945">使用 24 小時制時鐘</translation>
<translation id="3025174326431589540">{COUNT,plural, =0{未儲存密碼}=1{已檢查 {COUNT} 個網站的密碼}other{已檢查 {COUNT} 個網站和應用程式的密碼}}</translation>
<translation id="3027296729579831126">開啟鄰近分享功能</translation>
-<translation id="3027644380269727216">根據你在網站上的活動獨家推薦。這項設定已開啟。</translation>
+<translation id="3027644380269727216">以你的網站活動做為依據。這項設定已開啟。</translation>
<translation id="3029276696788198026">不使用預先載入模式</translation>
<translation id="3029466929721441205">在檔案櫃中顯示觸控筆工具</translation>
<translation id="3029808567601324798">鎖定時間</translation>
@@ -3389,7 +3389,7 @@
<translation id="3979748722126423326">啟用 <ph name="NETWORKDEVICE" /></translation>
<translation id="3981058120448670012">以「<ph name="DEVICE_NAME" />」的名稱向附近的裝置顯示 <ph name="REMAINING_TIME" />...</translation>
<translation id="3981760180856053153">輸入的儲存類型無效。</translation>
-<translation id="3981902534690264083">廣告客戶可以瞭解廣告成效</translation>
+<translation id="3981902534690264083">廣告商可以瞭解廣告成效</translation>
<translation id="3982375475032951137">只要簡單幾個步驟就能完成瀏覽器設定</translation>
<translation id="3983400541576569538">某些應用程式的資料可能會遺失</translation>
<translation id="3983586614702900908">製造商不明的裝置</translation>
@@ -4793,7 +4793,7 @@
<translation id="5299109548848736476">不追蹤</translation>
<translation id="5299558715747014286">查看及管理分頁群組</translation>
<translation id="5300287940468717207">要重設網站權限嗎?</translation>
-<translation id="5300426565656326054">以瀏覽器為主的廣告個人化</translation>
+<translation id="5300426565656326054">根據瀏覽器的使用記錄放送個人化廣告</translation>
<translation id="5300589172476337783">顯示</translation>
<translation id="5300719150368506519">將你造訪的網頁網址傳送給 Google</translation>
<translation id="5301751748813680278">正在以訪客身分登入。</translation>
@@ -5771,7 +5771,7 @@
<translation id="6201608810045805374">要移除這個帳戶嗎?</translation>
<translation id="6202304368170870640">你可以使用 PIN 碼登入裝置,或將裝置解鎖。</translation>
<translation id="6205314730813004066">廣告隱私權設定</translation>
-<translation id="6206199626856438589">系統會將你登出這些目前顯示的網站,包含已開啟的分頁</translation>
+<translation id="6206199626856438589">系統會將你登出所顯示的網站,包含已開啟的分頁</translation>
<translation id="6206311232642889873">複製圖片(&amp;Y)</translation>
<translation id="6206521455877863927">包括同一網域中的網站,例如 google.com 和 mail.google.com。你目前瀏覽的網站可將資料儲存到你的裝置。</translation>
<translation id="6207200176136643843">重設為預設縮放等級</translation>
@@ -7059,7 +7059,7 @@
<translation id="7387273928653486359">可以接受</translation>
<translation id="7387951778417998929">如要使用非系統預設的搜尋引擎,請在網址列中輸入相應的快捷字詞,然後按下你慣用的鍵盤快速鍵。你也可以在這裡變更你的預設搜尋引擎。</translation>
<translation id="7388209873137778229">只顯示支援的裝置。</translation>
-<translation id="7388615499319468910">網站和廣告客戶可以瞭解廣告成效。這項設定已關閉。</translation>
+<translation id="7388615499319468910">網站和廣告商可以瞭解廣告成效。這項設定已關閉。</translation>
<translation id="7392118418926456391">病毒掃描失敗</translation>
<translation id="7392915005464253525">重新開啟已關閉視窗(&amp;E)</translation>
<translation id="7393073300870882456">{COUNT,plural, =1{已複製 1 個項目}other{已複製 {COUNT} 個項目}}</translation>
@@ -7136,7 +7136,7 @@
<translation id="7453467225369441013">大多數網站都會將你登出,但系統並不會將你登出 Google 帳戶。</translation>
<translation id="7454548535253569100">入口網站:<ph name="SUBFRAME_SITE" /></translation>
<translation id="7455730275746867420">管理其他容器</translation>
-<translation id="7455988709578031708">根據你的瀏覽記錄獨家推薦。這項設定已開啟。</translation>
+<translation id="7455988709578031708">以你的瀏覽記錄做為依據。這項設定已開啟。</translation>
<translation id="7456142309650173560">開發人員版</translation>
<translation id="7456774706094330779">延伸預先載入模式</translation>
<translation id="7456847797759667638">開啟位置...</translation>
@@ -8166,7 +8166,7 @@
<translation id="8366396658833131068">你的網路連線已恢復。請選取其他網路,或按底下的 [繼續] 按鈕啟動 Kiosk 應用程式。</translation>
<translation id="8366694425498033255">選字鍵</translation>
<translation id="8368859634510605990">開啟所有書籤(&amp;O)</translation>
-<translation id="8369028061188107403">這會清除目前顯示的網站所儲存的資料 (共 <ph name="TOTAL_USAGE" />),以及所安裝的應用程式</translation>
+<translation id="8369028061188107403">這項操作會清除所顯示網站與已安裝應用程式儲存的資料 (共 <ph name="TOTAL_USAGE" />)</translation>
<translation id="8370294614544004647">闔上筆電時進入休眠狀態</translation>
<translation id="8371695176452482769">請說話</translation>
<translation id="8371925839118813971">{NUM_TABS,plural, =1{關閉網站音訊}other{關閉多個網站的音訊}}</translation>
@@ -8483,7 +8483,7 @@
<translation id="8665180165765946056">備份完成</translation>
<translation id="866611985033792019">信任這個用於識別電子郵件使用者的憑證</translation>
<translation id="8666321716757704924">已重新授權給 <ph name="WEBSITE" /></translation>
-<translation id="8666759526542103597">關於以瀏覽器為主的廣告個人化</translation>
+<translation id="8666759526542103597">「根據瀏覽器的使用記錄放送個人化廣告」的相關說明</translation>
<translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> 已顯示為全螢幕,並且停用了滑鼠游標。</translation>
<translation id="8667760277771450375">我們正在開發限制跨網站追蹤的方法,同時讓網站能夠防範廣告垃圾內容和欺詐行為。</translation>
<translation id="8668378421690365723">裝置可能無法再正常運作,而且可能會有安全性和效能問題。</translation>
@@ -8973,12 +8973,12 @@
<translation id="9094982973264386462">移除</translation>
<translation id="9095364055741191097">無法復原本機資料</translation>
<translation id="909554839118732438">關閉無痕模式</translation>
-<translation id="9099220545925418560">根據你的瀏覽記錄獨家推薦。這項設定已關閉。</translation>
+<translation id="9099220545925418560">以你的瀏覽記錄做為依據。這項設定已關閉。</translation>
<translation id="9100416672768993722">如要切換到上次使用的輸入法,請按下 <ph name="BEGIN_SHORTCUT" /><ph name="BEGIN_CTRL" />Ctrl<ph name="END_CTRL" /><ph name="SEPARATOR" /><ph name="BEGIN_SPACE" />Space<ph name="END_SPACE" /><ph name="END_SHORTCUT" /> 鍵</translation>
<translation id="9100765901046053179">進階設定</translation>
<translation id="9101691533782776290">啟動應用程式</translation>
<translation id="9102610709270966160">啟用擴充功能</translation>
-<translation id="9102864637938129124">網站和廣告客戶可以瞭解廣告成效。這項設定已開啟。</translation>
+<translation id="9102864637938129124">網站和廣告商可以瞭解廣告成效。這項設定已開啟。</translation>
<translation id="9103479157856427471">放大的螢幕畫面會追蹤鍵盤焦點</translation>
<translation id="9103868373786083162">按下即可返回,內容選單會顯示歷史記錄</translation>
<translation id="9108035152087032312">命名視窗...(&amp;W)</translation>
diff --git a/chromium/chrome/app/resources/generated_resources_zu.xtb b/chromium/chrome/app/resources/generated_resources_zu.xtb
index ff3179e275a..775723ea200 100644
--- a/chromium/chrome/app/resources/generated_resources_zu.xtb
+++ b/chromium/chrome/app/resources/generated_resources_zu.xtb
@@ -3789,7 +3789,7 @@ I-<ph name="DOMAIN" /> idinga ukuba ugcine ikhadi lakho elimsathi lifakiwe.</tra
<translation id="4354344420232759511">Amasayithi owavakashelayo azovela lapha</translation>
<translation id="435527878592612277">Khetha isithombe sakho</translation>
<translation id="4358302248024731679">Ukuze uxilonge kangcono izinkinga ze-Bluetooth, abasebenza kwa-Google bangabandakanya amalogu e-Bluetooth angeziwe ngemibiko yabo yempendulo. Uma le nketho imakiwe, umbiko wakho uzobandakanya amalogu e-btsnoop ne-HCI kusuka esikhathini sakho samanje, kuqinisekiselwe ukususa i-PII kakhulu. Ukufinyelela kulawo malogu kuzokhawulelwa kubaphathi beqembu lomkhiqizo we-ChromeOS ku-Listnr. Amalogu azosuswa ngemuva kwezinsuku ezingu-90.</translation>
-<translation id="4358643842961018282">Idivayisi yakho isesikhathini</translation>
+<translation id="4358643842961018282">Idivayisi yakho ibuyekeziwe</translation>
<translation id="4359408040881008151">Kufakiwe ngenxa yezandiso ezincikile.</translation>
<translation id="4359717112757026264">I-Cityscape</translation>
<translation id="4361142739114356624">Ukhiye Wobumfihlo walesi Sitifiketi Seklayenti awukho noma awuvumelekile</translation>
diff --git a/chromium/chrome/app/resources/google_chrome_strings_am.xtb b/chromium/chrome/app/resources/google_chrome_strings_am.xtb
index 882b433f99c..336fcde11f4 100644
--- a/chromium/chrome/app/resources/google_chrome_strings_am.xtb
+++ b/chromium/chrome/app/resources/google_chrome_strings_am.xtb
@@ -86,14 +86,14 @@
<translation id="2559253115192232574">በኋላ ላይ እርስዎ የሚጎበኙት ጣቢያ እርስዎ የሚያዩዋቸውን ማስታወቂያዎች ግላዊነት ለማላበስ Chrome ዝንባሌዎችዎን እንዲያይ ሊጠይቅ ይችላል። Chrome እስከ 3 ዝንባሌዎች ድረስ ማጋራት ይችላል።</translation>
<translation id="2563121210305478421">Chrome ዳግም ይጀመር?</translation>
<translation id="2574930892358684005"><ph name="EXISTING_USER" /> ወደዚህ የChrome መገለጫ አስቀድሞ ገብቷል። አሰሳዎን የተለየ እንደሆነ ለማቆየት Chrome የራስዎን መገለጫ ለእርስዎ መፍጠር ይችላል።</translation>
-<translation id="2580411288591421699">አሁን እየሰራ ካለው Google Chrome ጋር አንድ አይነት የሆነ ስሪት መጫን አይቻልም። እባክዎ Google Chrome ይዝጉና እንደገና ይሞክሩ።</translation>
+<translation id="2580411288591421699">አሁን እየሰራ ካለው Google Chrome ጋር አንድ ዓይነት የሆነ ስሪት መጫን አይቻልም። እባክዎ Google Chrome ይዝጉና እንደገና ይሞክሩ።</translation>
<translation id="2586406160782125153">ይሄ የአሰሳ ውሂብዎን ከዚህ መሣሪያዎ ይሰርዘዋል። ውሂብዎን በኋላ ላይ ሰርስረው ለማውጣት እንደ <ph name="USER_EMAIL" /> ሆነው ወደ Chrome ይግቡ።</translation>
<translation id="2597976513418770460">የእርስዎን Chrome አሳሽ ነገሮች ከ<ph name="ACCOUNT_EMAIL" /> ያግኙ</translation>
<translation id="2622559029861875898">Chrome ዝማኔዎችን መፈተሽ አይችልም። የበይነመረብ ግንኙነትዎን ለመፈተሽ ይሞክሩ።</translation>
<translation id="2645435784669275700">ChromeOS</translation>
<translation id="2652691236519827073">አገናኝ በአዲስ የChrome &amp;ትር ውስጥ ክፈት</translation>
<translation id="2665296953892887393">የብልሽት ሪፖርቶችን እና <ph name="UMA_LINK" /> ወደ Google በመላክ Google Chromeን የተሻለ ለማድረግ እገዛ ያድርጉ</translation>
-<translation id="2689103672227170538">ይህ ቅጥያ Chromeን ሲጀምሩት የሚታየውን ገጽ ቀይሮታል።</translation>
+<translation id="2689103672227170538">ይህ ቅጥያ Chromeን ሲጀምሩት የሚታየውን ገፅ ቀይሮታል።</translation>
<translation id="2742320827292110288">ማስጠንቀቂያ፦ የGoogle Chrome ቅጥያዎች የአሰሳ ታሪክዎን እንዳይመዘግቡ መከልከል አይችልም። ይህን ቅጥያ ማንነት በማያሳውቅ ሁነት ላይ ለማሰናከል ይህን አማራጭ አይምረጡ።</translation>
<translation id="2765403129283291972">Chrome ለዚህ ጣቢያ የእርስዎን ማይክሮፎን ለመድረስ ፈቃድ ያስፈልገዋል</translation>
<translation id="2770231113462710648">ነባሪ አሳሽን ወደዚህ ቀይር፦</translation>
@@ -152,7 +152,7 @@
<translation id="3703994572283698466">ChromeOS እና <ph name="BEGIN_LINK_LINUX_OSS" />Linux ግንባታ ምህዳር<ph name="END_LINK_LINUX_OSS" /> ሊሠሩ የቻሉት በተጨማሪ <ph name="BEGIN_LINK_CROS_OSS" />የክፍት ምንጭ ሶፍትዌር<ph name="END_LINK_CROS_OSS" /> ነው።</translation>
<translation id="3716540481907974026">የChromeOS Flex ስሪት</translation>
<translation id="3718181793972440140">ይሄ 1 ንጥል ከዚህ መሣሪያዎ ይሰርዘዋል። ውሂብዎን በኋላ ላይ ሰርስረው ለማውጣት እንደ <ph name="USER_EMAIL" /> ሆነው ወደ Chrome ይግቡ።</translation>
-<translation id="3735758079232443276">ይህ «<ph name="EXTENSION_NAME" />» ቅጥያ Chromeን ሲጀምሩት የሚታየውን ገጽ ቀይሮታል።</translation>
+<translation id="3735758079232443276">ይህ «<ph name="EXTENSION_NAME" />» ቅጥያ Chromeን ሲጀምሩት የሚታየውን ገፅ ቀይሮታል።</translation>
<translation id="3744202345691150878">ChromeOS ላይ እገዛ ያግኙ</translation>
<translation id="3780814664026482060">Chrome - <ph name="PAGE_TITLE" /></translation>
<translation id="3785324443014631273">ሲገቡ በነበረ ስህተት ምክንያት ChromeOS Flex ውሂብዎን ማስመር አልቻለም።</translation>
@@ -214,7 +214,7 @@
<translation id="4969674060580488087">የመለያ መግቢያ ዝርዝሮችዎ ጊዜ ያለፈባቸው ስለሆኑ ChromeOS Flex ውሂብዎን ማስመር አልቻለም።</translation>
<translation id="4970761609246024540">ወደ Chrome መገለጫዎች እንኳን በደህና መጡ</translation>
<translation id="4970880042055371251">የChromeOS ስሪት</translation>
-<translation id="4970947549776831107">እንደዚህ አይነት ፋይል አደገኛ ስለሆነ Chrome ይህን ፋይል አግዶታል።</translation>
+<translation id="4970947549776831107">እንደዚህ ዓይነት ፋይል አደገኛ ስለሆነ Chrome ይህን ፋይል አግዶታል።</translation>
<translation id="4990567037958725628">Google Chrome Canary</translation>
<translation id="5098668839038261629">ሲበራ ከChrome ዘግተው እንዲወጡም ይደረጋሉ</translation>
<translation id="5132929315877954718">ለGoogle Chrome ምርጥ መተግበሪያዎችን፣ ጨዋታዎችን፣ ቅጥያዎችን እና ገጽታዎችን ያግኙ።</translation>
@@ -229,7 +229,7 @@
<translation id="5334487786912937552">Chrome ፋይሎችን ለማውረድ የማከማቻ መዳረሻ ፈቃድ ያስፈልገዋል</translation>
<translation id="5337648990166757586">ከተፈለገ፦ የምርመራ እና የአጠቃቀም ውሂብ ወደ Google በራስ-ሰር በመላክ የChromeOS ባህሪያትን እና አፈጻጸምን እንዲሻሻል ያግዙ።</translation>
<translation id="5357889879764279201">በChromeOS Flex ላይ እገዛን ያግኙ</translation>
-<translation id="5386244825306882791">እንዲሁም Chromeን ሲጀምሩት ወይም ከኦምኒቦክሱ ሆነው ሲፈልጉ የሚታየውን ገጽ ይቆጣጠራል።</translation>
+<translation id="5386244825306882791">እንዲሁም Chromeን ሲጀምሩት ወይም ከኦምኒቦክሱ ሆነው ሲፈልጉ የሚታየውን ገፅ ይቆጣጠራል።</translation>
<translation id="5394833366792865639">አንድ የChrome ትር ያጋሩ</translation>
<translation id="5412485296464121825">ጣቢያዎች በChrome አማካኝነት ስለዝንባሌዎችዎ መረጃን ማከማቸት ይችላሉ። ለምሳሌ፣ ለማራቶን ጫማ ለመግዛት ጣቢያን ከጎበኙ ጣቢያው ዝንባሌዎን እንደ ማራቶን መሮጥ ሊገልጽ ይችላል። በኋላ ላይ ለሩጫ ለመመዝገብ ሌላ ጣቢያ ከጎበኙ ይህ ጣቢያ በዝንባሌዎችዎ ላይ ተመስርቶ የመሮጫ ጫማ ማስታወቂያ ሊያሳየዎት ይችላል።</translation>
<translation id="5430073640787465221">የምርጫዎችዎ ፋይል ተበላሽቷል ወይም ልክ አይደለም ነው።
@@ -393,7 +393,7 @@ Google Chrome ቅንጅቶችዎን ማስመለስ አልቻለም።</translat
<translation id="8641606876632989680">እርስዎ በተጠለፈ የይለፍ ቅቃል ሲገቡ Chrome ያሳውቀዎታል</translation>
<translation id="8649026945479135076">የሚጎበኟቸው ጣቢያዎች ልምድዎን ግላዊነት ማላበስ እንዲችሉ እርስዎ የሚፈልጓቸውን ነገሮች ማስታወስ የተለመደ ነው። እንዲሁም ጣቢያዎች ስለዝንባሌዎችዎ መረጃን በChrome አማካኝነት ማከማቸት ይችላሉ።</translation>
<translation id="8669527147644353129">Google Chrome አጋዥ</translation>
-<translation id="8679801911857917785">እንዲሁም Chromeን ሲጀምሩት የሚታየውን ገጽ ይቆጣጠራል።</translation>
+<translation id="8679801911857917785">እንዲሁም Chromeን ሲጀምሩት የሚታየውን ገፅ ይቆጣጠራል።</translation>
<translation id="8684875378076460854">Chrome ይህ ፋይል አደገኛ ሊሆን ስለሚችል እንዲቃኙት ይመክራል</translation>
<translation id="8686817260976772516">በ Chromium መገለጫዎች ሁሉንም የ Chromium ነገሮችዎን መለየት ይችላሉ። ለጓደኞች እና ለቤተሰብ መገለጫዎችን ይፍጠሩ፣ ወይም በሥራ እና በመዝናኛ መካከል ይከፋፈሉ።</translation>
<translation id="8712767363896337380">ሊዘመን ጥቂት ቀርቶታል! ዝማኔውን ለማጠናቀቅ Chromeን እንደገና ያስጀምሩ።</translation>
@@ -403,7 +403,7 @@ Google Chrome ቅንጅቶችዎን ማስመለስ አልቻለም።</translat
<translation id="8823341990149967727">Chrome ጊዜው አልፎበታል</translation>
<translation id="8825634023950448068">የእርስዎን ግላዊነት ለመጠበቅ ከ4 ሳምንታት በላይ የቆዩ ዝንባሌዎችዎን በራስ-ሰር እንሰርዛለን። ማሰስዎን በሚቀጥሉበት ጊዜ ዝንባሌ እንደገና በዝርዝሩ ላይ ሊታይ ይችላል። እና Chrome ከተሳሳተ ወይም የተወሰኑ ማስታወቂያዎችን ማየት ካልፈለጉ ዝንባሌን ማስወገድ ይችላሉ።</translation>
<translation id="8834965163890861871">Google Chrome የይለፍ ቃላትን ለማርትዕ እየሞከረ ነው። ይህን ለመፍቀድ የእርስዎን Windows የይለፍ ቃል ይተይቡ።</translation>
-<translation id="884296878221830158">እንዲሁም Chromeን ሲጀምሩት ወይም የመነሻ አዝራሩን ጠቅ ሲያደርጉት የሚታየውን ገጽ ይቆጣጠራል።</translation>
+<translation id="884296878221830158">እንዲሁም Chromeን ሲጀምሩት ወይም የመነሻ አዝራሩን ጠቅ ሲያደርጉት የሚታየውን ገፅ ይቆጣጠራል።</translation>
<translation id="8847000024471094355">Chrome ገቢር አይደለም</translation>
<translation id="8862326446509486874">ለስርዓተ-ደረጃ ጭነት ተገቢ መብቶች የሉዎትም። ጫኚውን እንደ አስተዳዳሪ በማሄድ እንደገና ይሞክሩ።</translation>
<translation id="8914504000324227558">Chromeን ዳግም አስጀምር</translation>
diff --git a/chromium/chrome/app/resources/google_chrome_strings_da.xtb b/chromium/chrome/app/resources/google_chrome_strings_da.xtb
index 0445601b556..54e8c62a355 100644
--- a/chromium/chrome/app/resources/google_chrome_strings_da.xtb
+++ b/chromium/chrome/app/resources/google_chrome_strings_da.xtb
@@ -32,7 +32,7 @@
<translation id="1597911401261118146">Du kan tjekke, om dine andre adgangskoder er beskyttet mod brud på datasikkerheden og andre sikkerhedsproblemer ved at <ph name="BEGIN_LINK" />logge ind på Chrome<ph name="END_LINK" />.</translation>
<translation id="1599904803480101533">Chrome har blokeret denne arkivfil, fordi den muligvis indeholder malware</translation>
<translation id="1619887657840448962">For at gøre Chrome mere sikker har vi deaktiveret følgende udvidelse, som ikke er anført i <ph name="IDS_EXTENSION_WEB_STORE_TITLE" /> og muligvis er blevet tilføjet, uden at du vidste det.</translation>
-<translation id="1627304841979541023"><ph name="BEGIN_BOLD" />Sådan kan du administrere dine data:<ph name="END_BOLD" /> Vi sletter automatisk de interesser, der er ældre end 4 uger, for at beskytte dine personlige oplysninger Mens du surfer, kan en interesse vises på listen igen. Du kan også fjerne interesser, som du ikke vil have, at Chrome skal tage med i betragtning.</translation>
+<translation id="1627304841979541023"><ph name="BEGIN_BOLD" />Sådan kan du administrere dine data:<ph name="END_BOLD" /> Vi sletter automatisk de interesser, der er ældre end 4 uger, for at beskytte dit privatliv. Mens du surfer, kan en interesse vises på listen igen. Du kan også fjerne interesser, som du ikke vil have, at Chrome skal tage med i betragtning.</translation>
<translation id="1628000112320670027">Få hjælp til Chrome</translation>
<translation id="1640672724030957280">Downloader...</translation>
<translation id="1662146548738125461">Om ChromeOS Flex</translation>
@@ -62,7 +62,7 @@
<translation id="2120620239521071941">Denne handling sletter <ph name="ITEMS_COUNT" /> elementer på denne enhed. Hvis du senere vil hente dine data igen, skal du logge ind på Chrome som <ph name="USER_EMAIL" />.</translation>
<translation id="2121284319307530122">Genstart og opdater &amp;Chrome</translation>
<translation id="2123055963409958220">Vær med til at gøre Chrome bedre ved at rapportere de <ph name="BEGIN_LINK" />aktuelle indstillinger<ph name="END_LINK" />.</translation>
-<translation id="2131230230468101642">Vi sletter automatisk de interesser, der er ældre end 4 uger, for at beskytte dine personlige oplysninger Mens du surfer, kan en interesse vises på listen igen. Du kan også fjerne interesser, som du ikke vil have, at Chrome skal tage med i betragtning.</translation>
+<translation id="2131230230468101642">Vi sletter automatisk de interesser, der er ældre end 4 uger, for at beskytte dit privatliv. Mens du surfer, kan en interesse vises på listen igen. Du kan også fjerne interesser, som du ikke vil have, at Chrome skal tage med i betragtning.</translation>
<translation id="2139300032719313227">Genstart ChromeOS</translation>
<translation id="2151406531797534936">Genstart Chrome nu</translation>
<translation id="2174917724755363426">Installationen er ikke fuldført. Er du sikker på, at du vil annullere?</translation>
@@ -80,7 +80,7 @@
<translation id="2467438592969358367">Google Chrome anmoder om at eksportere dine adgangskoder. Angiv din Windows-adgangskode for at tillade dette.</translation>
<translation id="2485422356828889247">Afinstaller</translation>
<translation id="2534507159460261402">Google Pay (kopieret til Chrome)</translation>
-<translation id="2559253115192232574">Et website, du besøger, kan på et senere tidspunkt anmode Chrome om at se dine interesser med henblik på at tilpasse de annoncer, du får vist. Chrome kan dele op til 3 interesser.</translation>
+<translation id="2559253115192232574">Et website, du besøger, kan på et senere tidspunkt anmode Chrome om at se dine interesser med henblik på at personligt tilpasse de annoncer, du får vist. Chrome kan dele op til 3 interesser.</translation>
<translation id="2563121210305478421">Vil du genstarte Chrome?</translation>
<translation id="2574930892358684005"><ph name="EXISTING_USER" /> er allerede logget ind på denne Chrome-profil. Hvis du vil holde din browsing adskilt, kan Chrome oprette en ny profil til dig selv.</translation>
<translation id="2580411288591421699">Det er ikke muligt at installere den samme version af Google Chrome, som allerede kører. Luk Google Chrome, og prøv igen.</translation>
@@ -142,7 +142,7 @@
<translation id="3541482654983822893">Chrome kan ikke tjekke dine adgangskoder. Prøv igen efter 24 timer.</translation>
<translation id="3576528680708590453">Din systemadministrator har konfigureret Google Chrome til at åbne en anden browser for at få adgang til <ph name="TARGET_URL_HOSTNAME" />.</translation>
<translation id="3579965087968408543">Ryd altid websitedata fra din enhed, når du lukker Chrome</translation>
-<translation id="3582972582564653026">Synkroniser og tilpas Chrome på alle dine enheder</translation>
+<translation id="3582972582564653026">Synkroniser og personligt tilpas Chrome på alle dine enheder</translation>
<translation id="3596080736082218006">{COUNT,plural, =0{Din administrator kræver, at du genstarter Chrome for at anvende en opdatering}=1{Din administrator kræver, at du genstarter Chrome for at anvende en opdatering. Dit inkognitovindue åbnes ikke igen.}one{Din administrator kræver, at du genstarter Chrome for at anvende en opdatering. # inkognitovindue åbnes ikke igen.}other{Din administrator kræver, at du genstarter Chrome for at anvende en opdatering. Dine # inkognitovinduer åbnes ikke igen.}}</translation>
<translation id="3622797965165704966">Nu er det blevet nemmere at bruge Chrome med din Google-konto og på delte computere.</translation>
<translation id="3673813398384385993">Chrome har registreret malware i "<ph name="EXTENSION_NAME" />"</translation>
@@ -176,7 +176,7 @@
<translation id="4251615635259297716">Vil du linke dine Chrome-data til denne konto?</translation>
<translation id="4262915912852657291"><ph name="BEGIN_BOLD" />Disse data bruges:<ph name="END_BOLD" /> Din browserhistorik, dvs. en oversigt over, hvilke websites du har besøgt i Chrome på denne enhed.</translation>
<translation id="4281844954008187215">Servicevilkår</translation>
-<translation id="4293420128516039005">Log ind for at synkronisere og tilpasse Chrome på alle dine enheder</translation>
+<translation id="4293420128516039005">Log ind for at synkronisere og personligt tilpasse Chrome på alle dine enheder</translation>
<translation id="430327780270213103">Tillad, at udvidelsen viser adgangsanmodninger på Chrome-værktøjslinjen</translation>
<translation id="4328355335528187361">Udviklerversionen af Google Chrome (mDNS-In)</translation>
<translation id="4334294535648607276">Download fuldført.</translation>
@@ -198,7 +198,7 @@
<translation id="4680828127924988555">Annuller installation</translation>
<translation id="469553575393225953">Udvidelser, apps og temaer fra ukendte kilder kan skade din enhed. Chrome anbefaler, at de kun installeres via Chrome Webshop</translation>
<translation id="4728575227883772061">Installationen mislykkedes på grund af en ikke-specificeret fejl. Hvis Google Chrome kører, bedes du lukke programmet og prøve igen.</translation>
-<translation id="4747730611090640388">Chrome kan estimere dine interesser. Senere kan et website, du besøger, anmode Chrome om at se dine interesser med henblik på at tilpasse de annoncer, du ser.</translation>
+<translation id="4747730611090640388">Chrome kan estimere dine interesser. Senere kan et website, du besøger, anmode Chrome om at se dine interesser med henblik på at personligt tilpasse de annoncer, du ser.</translation>
<translation id="4754614261631455953">Google Chrome Canary (mDNS-In)</translation>
<translation id="4771048833395599659">Denne fil kan være farlig, så Chrome har blokeret den.</translation>
<translation id="479167709087336770">Dette anvender den samme stavekontrol, som anvendes i Google Søgning. Tekst, som du angiver i browseren, sendes til Google. Du kan altid ændre denne adfærd i indstillingerne.</translation>
@@ -228,7 +228,7 @@
<translation id="5394833366792865639">Del en Chrome-fane</translation>
<translation id="5412485296464121825">Websites kan gemme oplysninger med Chrome om dine interesser. Hvis du f.eks. besøger et website for at købe sko til et maraton, kan websitet muligvis definere, at din interesse er at løbe maraton. Hvis du derefter besøger et andet website for at tilmelde dig et løb, kan det website vise dig en annonce for løbesko baseret på dine interesser.</translation>
<translation id="5430073640787465221">Din præferencefil er beskadiget eller ugyldig. Google Chrome kan ikke gendanne dine præferencer.</translation>
-<translation id="5524761631371622910">Når prøver er aktiveret, og hvis Chrome har placeret dig tilfældigt i en aktiv prøve, vil din browserhistorik påvirke de annoncer, du ser, og de interesser, som er estimeret nedenfor. Af hensyn til beskyttelsen af dine personlige oplysninger sletter Chrome dine interesser en gang om måneden.</translation>
+<translation id="5524761631371622910">Når prøver er aktiveret, og hvis Chrome har placeret dig tilfældigt i en aktiv prøve, vil din browserhistorik påvirke de annoncer, du ser, og de interesser, som er estimeret nedenfor. Af hensyn til privatlivsbeskyttelsen Chrome dine interesser en gang om måneden.</translation>
<translation id="5530733413481476019">Gør Chrome hurtigere</translation>
<translation id="556024056938947818">Google Chrome forsøger at vise adgangskoder.</translation>
<translation id="5566025111015594046">Google Chrome (mDNS-In)</translation>
@@ -238,7 +238,7 @@
<translation id="5690427481109656848">Google LLC</translation>
<translation id="570005089986962444">Når denne indstilling er aktiveret, frigør Chrome hukommelse fra inaktive faner. Dette tildeler aktive faner og andre apps flere computerressourcer og gør Chrome hurtigere. Dine inaktive faner bliver automatisk aktive igen, når du vender tilbage til dem.</translation>
<translation id="5715063361988620182">{SECONDS,plural, =1{Google Chrome genstarter om 1 sekund}one{Google Chrome genstarter om # sekund}other{Google Chrome genstarter om # sekunder}}</translation>
-<translation id="5727531838415286053">Hvis Chrome har placeret dig tilfældigt i en aktiv prøve, vil din browserhistorik påvirke de annoncer, du ser, og de interesser, som er estimeret nedenfor. Af hensyn til beskyttelsen af dine personlige oplysninger sletter Chrome dine interesser en gang om måneden. Interesserne opdateres, medmindre du fjerner dem.</translation>
+<translation id="5727531838415286053">Hvis Chrome har placeret dig tilfældigt i en aktiv prøve, vil din browserhistorik påvirke de annoncer, du ser, og de interesser, som er estimeret nedenfor. Af hensyn til privatlivsbeskyttelsen sletter Chrome dine interesser en gang om måneden. Interesserne opdateres, medmindre du fjerner dem.</translation>
<translation id="5736850870166430177">Hvis et website forsøger at stjæle din adgangskode, eller hvis du downloader en skadelig fil, sender Chrome muligvis også webadresser, bl.a. mindre mængder sideindhold, til Beskyttet browsing</translation>
<translation id="5756509061973259733">Der findes allerede en Chrome-profil med denne konto på enheden</translation>
<translation id="5795887333006832406"><ph name="PAGE_TITLE" /> – Google Chrome Canary</translation>
@@ -298,7 +298,7 @@
De tilladelser, du har givet til websites og apps, gælder muligvis for denne konto. Du kan administrere dine Google-konti under <ph name="SETTINGS_LINK_BEGIN" />Indstillinger<ph name="SETTINGS_LINK_END" />.</translation>
<translation id="7062128746136194023">Din forælder har deaktiveret "Tilladelser til websites, apps og udvidelser" for Chrome. Det er ikke tilladt at tilføje denne <ph name="EXTENSION_TYPE_PARAMETER" />.</translation>
-<translation id="7085332316435785646">Vælg, om du vil inkludere Chrome-historikken for at få mere tilpassede oplevelser i Googles tjenester</translation>
+<translation id="7085332316435785646">Vælg, om du vil inkludere Chrome-historikken for at få mere personligt tilpassede oplevelser i Googles tjenester</translation>
<translation id="7088681679121566888">Chrome er opdateret</translation>
<translation id="7098166902387133879">Google Chrome bruger din mikrofon.</translation>
<translation id="7099479769133613710">Genstart og opdater &amp;Chrome OS</translation>
@@ -364,11 +364,11 @@ De tilladelser, du har givet til websites og apps, gælder muligvis for denne ko
<translation id="8342675569599923794">Denne fil er farlig, så Chrome har blokeret den.</translation>
<translation id="8349795646647783032"><ph name="BEGIN_BOLD" />Sådan bruger vi disse data:<ph name="END_BOLD" /> Websites kan gemme oplysninger med Chrome om dine interesser. Hvis du f.eks. besøger et website for at købe sko til et maraton, kan websitet muligvis definere, at din interesse er at løbe maraton. Hvis du derefter besøger et andet website for at tilmelde dig et løb, kan det website vise dig en annonce for løbesko baseret på dine interesser.</translation>
<translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Alle rettigheder forbeholdes.</translation>
-<translation id="8383226135083126309"><ph name="BEGIN_BOLD" />Sådan bruger vi disse data:<ph name="END_BOLD" /> Chrome kan estimere dine interesser. Senere kan et website, du besøger, anmode Chrome om at se dine interesser med henblik på at tilpasse de annoncer, du ser.</translation>
+<translation id="8383226135083126309"><ph name="BEGIN_BOLD" />Sådan bruger vi disse data:<ph name="END_BOLD" /> Chrome kan estimere dine interesser. Senere kan et website, du besøger, anmode Chrome om at se dine interesser med henblik på at personligt tilpasse de annoncer, du ser.</translation>
<translation id="8387459386171870978">Fortsæt med at bruge Chrome</translation>
<translation id="8394720698884623075">Webadresser tjekkes i forhold til en liste over usikre websites, der er gemt i Chrome</translation>
<translation id="840084489713044809">Google Chrome anmoder om at eksportere dine adgangskoder.</translation>
-<translation id="8416347857511542594">Få flere oplysninger om annoncetilpasning i Chrome</translation>
+<translation id="8416347857511542594">Få flere oplysninger om personlig tilpasning af annoncer i Chrome</translation>
<translation id="8418845734693287262">ChromeOS kunne ikke synkronisere dine data, fordi loginoplysningerne til din konto er forældede.</translation>
<translation id="8433638294851456451">Hvis du vil sende et nummer fra denne enhed til din Android-telefon, skal du logge ind på Chrome på begge enheder.</translation>
<translation id="8451192282033883849">Din konto administreres af <ph name="MANAGER_NAME" />. Din administrator kan se og redigere denne Chrome-browserprofil og dens data som f.eks. bogmærker, historik og adgangskoder.</translation>
@@ -384,7 +384,7 @@ De tilladelser, du har givet til websites og apps, gælder muligvis for denne ko
<translation id="861702415419836452">Chrome skal have adgangstilladelse til dit kamera for at oprette et 3D-kort over dine omgivelser</translation>
<translation id="8625237574518804553">{0,plural, =1{Chrome genstarter om 1 minut}one{Chrome genstarter om # minut}other{Chrome genstarter om # minutter}}</translation>
<translation id="8641606876632989680">Chrome giver dig besked, når du logger ind med en kompromitteret adgangskode</translation>
-<translation id="8649026945479135076">Det er almindeligt, at de websites, du besøger, husker ting, du er interesseret i, så din oplevelse tilpasses. Websites kan også gemme oplysninger med Chrome om dine interesser.</translation>
+<translation id="8649026945479135076">Det er almindeligt, at de websites, du besøger, husker ting, du er interesseret i, så din oplevelse personligt tilpasses. Websites kan også gemme oplysninger med Chrome om dine interesser.</translation>
<translation id="8669527147644353129">Hjælp til Google Chrome</translation>
<translation id="8679801911857917785">Den styrer også, hvilken side der vises, når du åbner Chrome.</translation>
<translation id="8684875378076460854">Chrome anbefaler, at du scanner denne fil, da den kan være skadelig</translation>
@@ -394,7 +394,7 @@ De tilladelser, du har givet til websites og apps, gælder muligvis for denne ko
<translation id="8765470054473112089">Når du indtaster noget i adresselinjen eller søgefeltet, sender Chrome det, du skriver, til din standardsøgemaskine for at få bedre forslag. Dette er deaktiveret i inkognitotilstand.</translation>
<translation id="8821043148920470810">Hvis du vil have fremtidige Google Chrome-opdateringer, skal du have Windows 10 eller nyere. Denne computer anvender Windows 7.</translation>
<translation id="8823341990149967727">Chrome er forældet</translation>
-<translation id="8825634023950448068">Vi sletter automatisk de interesser, der er ældre end 4 uger, for at beskytte dine personlige oplysninger Mens du surfer, kan en interesse vises på listen igen. Hvis Chrome tager fejl, eller du ikke vil se visse annoncer, kan du fjerne en interesse.</translation>
+<translation id="8825634023950448068">Vi sletter automatisk de interesser, der er ældre end 4 uger, for at beskytte dit privatliv. Mens du surfer, kan en interesse vises på listen igen. Hvis Chrome tager fejl, eller du ikke vil se visse annoncer, kan du fjerne en interesse.</translation>
<translation id="8834965163890861871">Google Chrome forsøger at redigere adgangskoder. Angiv din Windows-adgangskode for at tillade dette.</translation>
<translation id="884296878221830158">Den styrer også, hvilken side der vises, når du åbner Chrome eller klikker på knappen Startside.</translation>
<translation id="8847000024471094355">Chrome er inaktivt</translation>
@@ -403,7 +403,7 @@ De tilladelser, du har givet til websites og apps, gælder muligvis for denne ko
<translation id="8922193594870374009">Hvis du vil sende et nummer fra <ph name="ORIGIN" /> til din Android-telefon, skal du logge ind på Chrome på begge enheder.</translation>
<translation id="8983720963221508955">Du har aktiveret Udvidet beskyttet browsing på din konto. Nu skal du aktivere funktionen for Chrome.</translation>
<translation id="8986207147630327271">Du er ved at føje en arbejdsprofil til denne browser, og du giver kun din administrator kontrol over arbejdsprofilen.</translation>
-<translation id="8989968390305463310">Din browserhistorik påvirker de annoncer, som du ser, og de interesser, som er estimeret nedenfor. Af hensyn til beskyttelsen af dine personlige oplysninger sletter Chrome automatisk dine interesser en gang om måneden. Interesserne kan blive opdateret, medmindre du fjerner dem.</translation>
+<translation id="8989968390305463310">Din browserhistorik påvirker de annoncer, som du ser, og de interesser, som er estimeret nedenfor. Af hensyn til privatlivsbeskyttelsen sletter Chrome automatisk dine interesser en gang om måneden. Interesserne kan blive opdateret, medmindre du fjerner dem.</translation>
<translation id="8999208279178790196">{0,plural, =0{Der er en tilgængelig Chrome-opdatering}=1{Der er en tilgængelig Chrome-opdatering}one{En Chrome-opdatering har været tilgængelig i # dag}other{En Chrome-opdatering har været tilgængelig i # dage}}</translation>
<translation id="9053892488859122171">ChromeOS Flex-system</translation>
<translation id="9067395829937117663">Google Chrome kræver Windows 7 eller nyere.</translation>
diff --git a/chromium/chrome/app/resources/google_chrome_strings_es-419.xtb b/chromium/chrome/app/resources/google_chrome_strings_es-419.xtb
index 739692f8245..24c0ed630df 100644
--- a/chromium/chrome/app/resources/google_chrome_strings_es-419.xtb
+++ b/chromium/chrome/app/resources/google_chrome_strings_es-419.xtb
@@ -147,7 +147,7 @@
<translation id="3622797965165704966">Ahora es más sencillo utilizar Chrome con la cuenta de Google y en computadoras compartidas.</translation>
<translation id="3673813398384385993">Chrome detectó que "<ph name="EXTENSION_NAME" />" contiene software malicioso.</translation>
<translation id="3703994572283698466">Chrome OS funciona gracias a <ph name="BEGIN_LINK_CROS_OSS" />software de código abierto<ph name="END_LINK_CROS_OSS" /> adicional, como <ph name="BEGIN_LINK_LINUX_OSS" />el entorno de desarrollo de Linux<ph name="END_LINK_LINUX_OSS" />.</translation>
-<translation id="3716540481907974026">Versión de Chrome OS Flex</translation>
+<translation id="3716540481907974026">Versión de ChromeOS Flex</translation>
<translation id="3718181793972440140">Esta acción borrará 1 elemento de este dispositivo. Si más adelante deseas recuperar los datos, accede a tu cuenta en Chrome como <ph name="USER_EMAIL" />.</translation>
<translation id="3735758079232443276">La extensión "<ph name="EXTENSION_NAME" />" cambió la página que se muestra al iniciar Chrome.</translation>
<translation id="3744202345691150878">Obtener ayuda con Chrome OS</translation>
@@ -210,9 +210,9 @@
<translation id="495931528404527476">En Chrome</translation>
<translation id="4969674060580488087">Chrome OS Flex no pudo sincronizar los datos porque la información de acceso de la cuenta está desactualizada.</translation>
<translation id="4970761609246024540">Te damos la bienvenida a los perfiles de Chrome</translation>
-<translation id="4970880042055371251">Versión de Chrome OS</translation>
+<translation id="4970880042055371251">Versión de ChromeOS</translation>
<translation id="4970947549776831107">Chrome bloqueó este archivo porque este tipo de archivo es peligroso</translation>
-<translation id="4990567037958725628">Google Chrome Canario</translation>
+<translation id="4990567037958725628">Google Chrome Canary</translation>
<translation id="5098668839038261629">Si activas esta opción, saldrás de Chrome</translation>
<translation id="5132929315877954718">Descubre aplicaciones, juegos, extensiones y temas geniales para Google Chrome.</translation>
<translation id="5139423532931106058">Personaliza tu perfil de Chrome</translation>
diff --git a/chromium/chrome/app/resources/google_chrome_strings_fr-CA.xtb b/chromium/chrome/app/resources/google_chrome_strings_fr-CA.xtb
index 4b0842c6dea..53d6e4ff682 100644
--- a/chromium/chrome/app/resources/google_chrome_strings_fr-CA.xtb
+++ b/chromium/chrome/app/resources/google_chrome_strings_fr-CA.xtb
@@ -90,7 +90,7 @@ Certaines fonctionnalités ne seront peut-être pas disponibles et les modificat
<translation id="2586406160782125153">Cette action entraînera la suppression de vos données de navigation sur cet appareil. Pour récupérer vos données plus tard, connectez-vous à Chrome en tant que <ph name="USER_EMAIL" />.</translation>
<translation id="2597976513418770460">Profitez de vos données du navigateur Chrome associées au compte <ph name="ACCOUNT_EMAIL" /></translation>
<translation id="2622559029861875898">Chrome ne peut pas vérifier la présence de mises à jour. Essayez de vérifier votre connexion Internet.</translation>
-<translation id="2645435784669275700">Chrome OS</translation>
+<translation id="2645435784669275700">ChromeOS</translation>
<translation id="2652691236519827073">Ouvrir le lien dans un nouvel ongle&amp;t Chrome</translation>
<translation id="2665296953892887393">Aidez-nous à améliorer Google Chrome en nous envoyant des rapports d'erreur et des <ph name="UMA_LINK" />.</translation>
<translation id="2689103672227170538">Cette extension a modifié la page qui s'affiche au démarrage de Chrome.</translation>
diff --git a/chromium/chrome/app/resources/google_chrome_strings_it.xtb b/chromium/chrome/app/resources/google_chrome_strings_it.xtb
index 04ca01bed50..8d00e87dbc4 100644
--- a/chromium/chrome/app/resources/google_chrome_strings_it.xtb
+++ b/chromium/chrome/app/resources/google_chrome_strings_it.xtb
@@ -246,7 +246,7 @@
<translation id="5895138241574237353">Riavvia</translation>
<translation id="5903106910045431592"><ph name="PAGE_TITLE" /> - Accesso rete</translation>
<translation id="5924017743176219022">Connessione a Internet in corso…</translation>
-<translation id="5932997892801542621">Quando digiti nella barra degli indirizzi o nella casella di ricerca, Chrome invia ciò che digiti a Google Drive per ricevere suggerimenti sugli elementi. Questa opzione è disattivata in incognito.</translation>
+<translation id="5932997892801542621">Quando digiti nella barra degli indirizzi o nella casella di ricerca, Chrome invia ciò che digiti a Google Drive per ricevere suggerimenti sugli elementi. Questa opzione è disattivata nella modalità di navigazione in incognito.</translation>
<translation id="5940385492829620908">Il tuoi siti web, i tuoi segnalibri e gli altri contenuti Chrome sempre disponibili e aggiornati qui.</translation>
<translation id="5941711191222866238">Riduci a icona</translation>
<translation id="5941830788786076944">Imposta Google Chrome come browser predefinito</translation>
@@ -321,7 +321,7 @@ A questo account potrebbero essere applicate le autorizzazioni già concesse a s
<translation id="7535429826459677826">Google Chrome Dev</translation>
<translation id="7583399374488819119">Programma di installazione di <ph name="COMPANY_NAME" /></translation>
<translation id="7606334485649076285">Google ChromeOS Flex</translation>
-<translation id="7626032353295482388">Benvenuto in Chrome</translation>
+<translation id="7626032353295482388">Ti diamo il benvenuto in Chrome</translation>
<translation id="7626072681686626474"><ph name="MANAGER" /> richiede di leggere e accettare i seguenti Termini di servizio prima di utilizzare il dispositivo. Questi termini non ampliano, modificano né limitano i Termini di Google ChromeOS.</translation>
<translation id="7629695634924605473">Chrome ti avvisa se le tue password vengono compromesse</translation>
<translation id="7641148173327520642">L'amministratore di sistema ha configurato Google Chrome per l'apertura di <ph name="ALTERNATIVE_BROWSER_NAME" /> per accedere a<ph name="TARGET_URL_HOSTNAME" />.</translation>
@@ -390,7 +390,7 @@ A questo account potrebbero essere applicate le autorizzazioni già concesse a s
<translation id="8686817260976772516">Con i profili Chrome puoi separare tutti i tuoi contenuti di Chrome. Crea profili per amici e familiari oppure dividi i dati di lavoro e i contenuti di svago.</translation>
<translation id="8712767363896337380">Aggiornamento quasi terminato. Riavvia Chrome per terminare l'aggiornamento.</translation>
<translation id="873133009373065397">Google Chrome non è in grado di determinare o impostare il browser predefinito</translation>
-<translation id="8765470054473112089">Quando digiti nella barra degli indirizzi o nella casella di ricerca, Chrome invia ciò che digiti al tuo motore di ricerca predefinito per ricevere suggerimenti migliori. Questa opzione è disattivata in incognito.</translation>
+<translation id="8765470054473112089">Quando digiti nella barra degli indirizzi o nella casella di ricerca, Chrome invia ciò che digiti al tuo motore di ricerca predefinito per ricevere suggerimenti migliori. Questa opzione è disattivata nella modalità di navigazione in incognito.</translation>
<translation id="8821043148920470810">Per ricevere gli aggiornamenti futuri di Google Chrome, devi avere Windows 10 o versioni successive. Su questo computer è installato Windows 7.</translation>
<translation id="8823341990149967727">Chrome non è aggiornato</translation>
<translation id="8825634023950448068">Per tutelare la tua privacy, eliminiamo automaticamente i tuoi interessi risalenti a più di 4 settimane prima della data corrente. Mentre continui a navigare, un interesse potrebbe essere nuovamente visualizzato nell'elenco. Se Chrome ha fatto la scelta sbagliata o se non vuoi ricevere determinati annunci, puoi rimuovere un interesse.</translation>
diff --git a/chromium/chrome/app/resources/google_chrome_strings_kk.xtb b/chromium/chrome/app/resources/google_chrome_strings_kk.xtb
index e644373c15f..57517e7a959 100644
--- a/chromium/chrome/app/resources/google_chrome_strings_kk.xtb
+++ b/chromium/chrome/app/resources/google_chrome_strings_kk.xtb
@@ -271,7 +271,7 @@ Google Chrome параметрлеріңізді қалпына келтіре
<translation id="6169866489629082767"><ph name="PAGE_TITLE" /> - Google Chrome</translation>
<translation id="6173637689840186878"><ph name="PAGE_TITLE" /> - Google Chrome бета нұсқасы</translation>
<translation id="6235018212288296708">mDNS трафигіне рұқсат беретін Google Chrome кіріс ережесі.</translation>
-<translation id="6247557882553405851">Google Құпия сөз менеджері</translation>
+<translation id="6247557882553405851">Google Password Manager</translation>
<translation id="6273793429163604305">Басталайын деп жатыр…</translation>
<translation id="6291089322031436445">Chrome Dev қолданбалары</translation>
<translation id="6291549208091401781">Google Chrome компьютердегі барлық пайдаланушылар үшін әлдеқашан орнатылған.</translation>
diff --git a/chromium/chrome/app/resources/google_chrome_strings_kn.xtb b/chromium/chrome/app/resources/google_chrome_strings_kn.xtb
index 71c72b692e3..861e5387bf2 100644
--- a/chromium/chrome/app/resources/google_chrome_strings_kn.xtb
+++ b/chromium/chrome/app/resources/google_chrome_strings_kn.xtb
@@ -173,8 +173,8 @@
<translation id="4205939740494406371">Chrome ಗೆ ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ. 24 ಗಂಟೆಗಳ ನಂತರ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ ಅಥವಾ <ph name="BEGIN_LINK" />ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿರುವ ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ಪರಿಶೀಲಿಸಿ<ph name="END_LINK" />.</translation>
<translation id="4222932583846282852">ರದ್ದುಗೊಳಿಸಲಾಗುತ್ತಿದೆ...</translation>
<translation id="4242034826641750751">ಈ ಸೈಟ್‌ಗೆ ಸಂಬಂಧಿಸಿದಂತೆ Chrome ಗೆ ಕ್ಯಾಮರಾ ಮತ್ತು ಮೈಕ್ರೊಫೋನ್ ಅನುಮತಿಗಳ ಅಗತ್ಯವಿದೆ</translation>
-<translation id="424864128008805179">Chrome ನಿಂದ ಸೈನ್ ಔಟ್ ಮಾಡುವುದೇ?</translation>
-<translation id="4251615635259297716">ಈ ಖಾತೆಗೆ ನಿಮ್ಮ Chrome ಡೇಟಾವನ್ನು ಲಿಂಕ್ ಮಾಡುವುದೇ?</translation>
+<translation id="424864128008805179">Chrome ನಿಂದ ಸೈನ್ ಔಟ್ ಮಾಡಬೇಕೆ?</translation>
+<translation id="4251615635259297716">ಈ ಖಾತೆಗೆ ನಿಮ್ಮ Chrome ಡೇಟಾವನ್ನು ಲಿಂಕ್ ಮಾಡಬೇಕೆ?</translation>
<translation id="4262915912852657291"><ph name="BEGIN_BOLD" />ಯಾವ ಡೇಟಾವನ್ನು ಬಳಸಲಾಗುತ್ತದೆ:<ph name="END_BOLD" /> ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಇತಿಹಾಸ, ಎಂದರೆ, ಈ ಸಾಧನದಲ್ಲಿ Chrome ಬಳಸುವಾಗ ನೀವು ಭೇಟಿ ನೀಡಿದ ಸೈಟ್‌ಗಳ ದಾಖಲೆ.</translation>
<translation id="4281844954008187215">ಸೇವೆಯ ನಿಯಮಗಳು</translation>
<translation id="4293420128516039005">ನಿಮ್ಮ ಸಾಧನಗಳಲ್ಲಿ Chrome ಅನ್ನು ಸಿಂಕ್ ಮಾಡಲು ಮತ್ತು ವೈಯಕ್ತೀಕರಿಸಲು ಸೈನ್ ಇನ್ ಮಾಡಿ</translation>
@@ -326,7 +326,7 @@
<translation id="7626032353295482388">Chrome ಗೆ ಸ್ವಾಗತ</translation>
<translation id="7626072681686626474"><ph name="MANAGER" /> ನ ನೀತಿಯ ಪ್ರಕಾರ ಈ ಸಾಧನವನ್ನು ಬಳಸುವ ಮೊದಲು ನೀವು ಈ ಕೆಳಗಿನ ಸೇವಾ ನಿಯಮಗಳನ್ನು ಓದಿ, ಅವುಗಳಿಗೆ ಸಮ್ಮತಿಸಬೇಕಾಗುತ್ತದೆ. ಈ ನಿಯಮಗಳು Google ChromeOS ನಿಯಮಗಳನ್ನು ವಿಸ್ತರಿಸುವುದಿಲ್ಲ, ಮಾರ್ಪಡಿಸುವುದಿಲ್ಲ, ಅಥವಾ ಸೀಮಿತಗೊಳಿಸುವುದಿಲ್ಲ.</translation>
<translation id="7629695634924605473">ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್‌ಗಳು ಎಂದಾದರೂ ಹ್ಯಾಕ್‌ ಆಗಿವೆಯೇ ಎಂಬುದನ್ನು Chrome ನಿಮಗೆ ತಿಳಿಸುತ್ತದೆ</translation>
-<translation id="7641148173327520642"><ph name="TARGET_URL_HOSTNAME" /> ಗೆ ಪ್ರವೇಶ ಪಡೆಯುವುದಕ್ಕಾಗಿ <ph name="ALTERNATIVE_BROWSER_NAME" /> ಅನ್ನು ತೆರೆಯಲು ನಿಮ್ಮ ಸಿಸ್ಟಂ ನಿರ್ವಾಹಕರು Google Chrome ಅನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿದ್ದಾರೆ.</translation>
+<translation id="7641148173327520642"><ph name="TARGET_URL_HOSTNAME" /> ಗೆ ಆ್ಯಕ್ಸೆಸ್ ಪಡೆಯುವುದಕ್ಕಾಗಿ <ph name="ALTERNATIVE_BROWSER_NAME" /> ಅನ್ನು ತೆರೆಯಲು ನಿಮ್ಮ ಸಿಸ್ಟಂ ನಿರ್ವಾಹಕರು Google Chrome ಅನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿದ್ದಾರೆ.</translation>
<translation id="7649070708921625228">ಸಹಾಯ</translation>
<translation id="7651907282515937834">Chrome ಎಂಟರ್‌ಪ್ರೈಸ್ ಲೋಗೋ</translation>
<translation id="7655455401911432608">ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಇತಿಹಾಸ, ಎಂದರೆ, ಈ ಸಾಧನದಲ್ಲಿ Chrome ಬಳಸುವಾಗ ನೀವು ಭೇಟಿ ನೀಡಿದ ಸೈಟ್‌ಗಳ ದಾಖಲೆ.</translation>
diff --git a/chromium/chrome/app/resources/google_chrome_strings_ky.xtb b/chromium/chrome/app/resources/google_chrome_strings_ky.xtb
index 85f8413b69d..24d82ebfe9c 100644
--- a/chromium/chrome/app/resources/google_chrome_strings_ky.xtb
+++ b/chromium/chrome/app/resources/google_chrome_strings_ky.xtb
@@ -4,7 +4,7 @@
<translation id="1001534784610492198">Орнотуу архиви бузук же жараксыз. Google Chrome'ду кайра жүктөп алыңыз.</translation>
<translation id="1026101648481255140">Орнотууну улантуу</translation>
<translation id="102763973188675173">Google Chrome'ду ыңгайлаштырып алып, көзөмөлдөңүз. Жаңыртуу бар.</translation>
-<translation id="1051826050538111504">Компьютериңизде кооптуу программа бар. Серепчиңизди кайра ойдогудай иштетүү үчүн Chrome аны алып салып, жөндөөлөрдү калыбына келтирип, кеңейтүүлөрдү өчүрө алат.</translation>
+<translation id="1051826050538111504">Компьютериңизде кооптуу программа бар. Серепчиңизди кайра ойдогудай иштетүү үчүн Chrome аны алып салып, параметрлерди калыбына келтирип, кеңейтүүлөрдү өчүрө алат.</translation>
<translation id="1065672644894730302">Жеке жөндөлөөрүңүз окулбай жатат.
Айрым мүмкүнчүлүктөр иштебегендиктен, жеке жөндөөлөрдөгү өзгөрүүлөр сакталбайт.</translation>
@@ -193,7 +193,7 @@
<translation id="4458462641685292929">Google Chrome'до башка операция жүрүп жатат. Кийинчерээк дагы аракет кылып көрүңүз.</translation>
<translation id="4459234553906210702">Жарнамаларды талдоо аркылуу сиз баш баккан сайттар Chrome'дон маалымат алып, жарнамаларынын майнаптуулугун талдай алышат. Жарнамаларды талдоо сайттарга мүмкүн болушунча аз маалымат өткөрүү менен башка сайттарга көз салууну чектейт.</translation>
<translation id="4561051373932531560">Google Chrome'дун жардамы менен, желеден телефон номерин чыкылдатып, ага Skype аркылуу чала аласыз!</translation>
-<translation id="4567424176335768812"><ph name="USER_EMAIL_ADDRESS" /> катары кирдиңиз. Эми кыстармаларды, таржымалды жана башка жөндөөлөрдү бардык катталган түзмөктөрүңүздөн колдоно аласыз.</translation>
+<translation id="4567424176335768812"><ph name="USER_EMAIL_ADDRESS" /> катары кирдиңиз. Эми кыстармаларды, таржымалды жана башка параметрлерди бардык катталган түзмөктөрүңүздөн колдоно аласыз.</translation>
<translation id="4571503333518166079">Chrome'дун эскертмелеринин параметрлерине өтүү</translation>
<translation id="459622048091363950">Chrome'го уруксат берилгенден кийин вебсайттар уруксат сурай алышат.</translation>
<translation id="4600710005438004015">Chrome акыркы версиясына жаңыртылбай койду, андыктан жаңы функциялар менен коопсуздук оңдоолорун пайдалана албай калдыңыз.</translation>
@@ -205,7 +205,7 @@
<translation id="4747730611090640388">Chrome сиз кызыккан нерселерди болжолдойт. Кийинчерээк сиз баш баккан сайттар Chrome'дон кызыккан нерселериңиз тууралуу маалымат алып, ылайыктуу жарнамаларды көрсөтө алат.</translation>
<translation id="4754614261631455953">Google Chrome Canary (mDNS-In)</translation>
<translation id="4771048833395599659">Бул файл кооптуу болушу мүмкүн, ошондуктан Chrome аны бөгөттөп койду.</translation>
-<translation id="479167709087336770">Ал Google Издөөдө колдонулган орфографияны текшерүүчү программаны колдонот. Серепчиде терилген текстти Google кызматтарына жөнөтүп турат. Бул параметрди каалаган убакта жөндөөлөргө өтүп, өзгөртүп койсоңуз болот.</translation>
+<translation id="479167709087336770">Ал Google Издөөдө колдонулган орфографияны текшерүүчү программаны колдонот. Серепчиде терилген текстти Google кызматтарына жөнөтүп турат. Бул параметрди каалаган убакта параметрлерге өтүп, өзгөртүп койсоңуз болот.</translation>
<translation id="4842397268809523050">ChromeOS Flex дайын-даректериңизди шайкештештире алган жок, себеби домениңизде Шайкештештирүү аракети жеткиликтүү эмес.</translation>
<translation id="4873783916118289636">Chrome'догу негизги купуялык жана коопсуздукту көзөмөлдөө каражаттарын карап көрүңүз</translation>
<translation id="4891791193823137474">Google Chrome'го фондо иштөө мүмкүнчүлүгүн берүү</translation>
@@ -233,7 +233,7 @@
<translation id="5386244825306882791">Chrome'ду иштетип баштаганда же Omnibox'тон издегенде көрсөтүлө турган баракты да көзөмөлдөйт.</translation>
<translation id="5394833366792865639">Chrome өтмөгүн бөлүшүү</translation>
<translation id="5412485296464121825">Сайттар кызыккан нерселериңиз тууралуу маалыматты Chrome'до сакташы мүмкүн. Мисалы, марафон үчүн бут кийим сатып алуу үчүн сайтка баш баксаңыз, ал сайт "марафондо чуркоону" кызыккан нерсеңиз катары аныктайт. Кийинчерээк, жарышууга катталуу үчүн башка бир сайтка баш баксаңыз, ал сайт кызыккан нерселериңиздин негизинде чуркоо үчүн бут кийимдин жарнамасын көрсөтүшү мүмкүн.</translation>
-<translation id="5430073640787465221">Жеке жөндөөлөр файлыңыз бузулган же жараксыз.
+<translation id="5430073640787465221">Жеке параметрлер файлыңыз бузулган же жараксыз.
Google Chrome параметрлериңизди калыбына келтире албайт.</translation>
<translation id="5524761631371622910">Сыноолор күйүк болгондо жана Chrome сизди башаламан иретте активдүү сыноого кошуп койгон болсо, Жарнамалар көрүлгөн вебсайттарга жана төмөндө болжолдонгон кызыккан нерселериңизге жараша көрсөтүлөт. Купуялыгыңызды коргоо максатында Chrome кызыккан нерселериңизди ай сайын өчүрүп турат.</translation>
@@ -304,7 +304,7 @@ Google Chrome параметрлериңизди калыбына келтире
<translation id="7025800014283535195">Chrome профилдерин бул жерден которо аласыз</translation>
<translation id="7036251913954633326">Бул аккаунтту бир жолу гана колдонгону жатсаңыз, Chrome серепчисинен <ph name="GUEST_LINK_BEGIN" />Конок режимине<ph name="GUEST_LINK_END" /> өтүңүз. Эгер кимдир бирөөнүн аккаунтун кошкуңуз келсе, <ph name="DEVICE_TYPE" /> түзмөгүңүзгө <ph name="LINK_BEGIN" />жаңы кишини кошуңуз<ph name="LINK_END" />.
-Вебсайттарга жана колдонмолорго берилген уруксаттар ушул аккаунтка карата колдонулушу мүмкүн. Google аккаунттарыңызды <ph name="SETTINGS_LINK_BEGIN" />Жөндөөлөрдөн<ph name="SETTINGS_LINK_END" /> башкара аласыз.</translation>
+Вебсайттарга жана колдонмолорго берилген уруксаттар ушул аккаунтка карата колдонулушу мүмкүн. Google аккаунттарыңызды <ph name="SETTINGS_LINK_BEGIN" />Параметрлерден<ph name="SETTINGS_LINK_END" /> башкара аласыз.</translation>
<translation id="7062128746136194023">Ата-энеңиз Chrome үчүн "Сайттарга, колдонмолорго жана кеңейтүүлөргө уруксаттарды" өчүрүп койгон. Бул <ph name="EXTENSION_TYPE_PARAMETER" /> кеңейтүүсүн кошууга болбойт.</translation>
<translation id="7085332316435785646">Chrome таржымалын Google кызматтарын жекелештирүү үчүн колдонуп же колдонбоону тандаңыз</translation>
<translation id="7088681679121566888">Chrome жаңыртылды</translation>
@@ -322,7 +322,7 @@ Google Chrome параметрлериңизди калыбына келтире
<translation id="7339898014177206373">Жаңы терезе</translation>
<translation id="7388770099345495132">Бул аккаунтту бир жолу гана колдонгону жатсаңыз, Chrome серепчисинен Конок режимине өтүңүз. Эгер кимдир бирөөнүн аккаунтун кошкуңуз келсе, <ph name="DEVICE_TYPE" /> түзмөгүңүзгө <ph name="LINK_BEGIN" />жаңы кишини кошуңуз<ph name="LINK_END" />.
-Вебсайттарга жана колдонмолорго берилген уруксаттар ушул аккаунтка карата колдонулушу мүмкүн. Google аккаунттарыңызды <ph name="SETTINGS_LINK_BEGIN" />Жөндөөлөрдөн<ph name="SETTINGS_LINK_END" /> башкара аласыз.</translation>
+Вебсайттарга жана колдонмолорго берилген уруксаттар ушул аккаунтка карата колдонулушу мүмкүн. Google аккаунттарыңызды <ph name="SETTINGS_LINK_BEGIN" />Параметрлерден<ph name="SETTINGS_LINK_END" /> башкара аласыз.</translation>
<translation id="7398801000654795464">Chrome'го <ph name="USER_EMAIL_ADDRESS" /> катары кирдиңиз. Кайра кирүү үчүн ушул каттоо эсебин колдонуңуз.</translation>
<translation id="7410958280246779049">Бул файл кооптуу болгондуктан, Chrome аны бөгөттөп койду</translation>
<translation id="7426611252293106642">Google Chrome туура эмес иштеши мүмкүн, себеби Linux тутумунун бул версиясында колдоого алынбай калган</translation>
@@ -406,7 +406,7 @@ Google Chrome параметрлериңизди калыбына келтире
<translation id="8834965163890861871">Google Chrome сырсөздөрдү өзгөртүүгө аракет кылып жатат. Ага уруксат берүү үчүн Windows сырсөзүңүздү териңиз.</translation>
<translation id="884296878221830158">Chrome'ду иштетип баштаганда же Башкы бет баскычы чыкылдатылганда, кайсы бет көрсөтүлө тургандыгын көзөмөлдөйт.</translation>
<translation id="8847000024471094355">Chrome жигерсиз</translation>
-<translation id="8862326446509486874">Тутум деңгээлинде орнотууга тийиштүү укугуңуз жок. Орноткучту Администратор катары кайра иштетип көрүңүз.</translation>
+<translation id="8862326446509486874">Система деңгээлинде орнотууга тийиштүү укугуңуз жок. Орноткучту Администратор катары кайра иштетип көрүңүз.</translation>
<translation id="8914504000324227558">Chrome'ду кайрадан ишке киргизүү</translation>
<translation id="8922193594870374009">Номерди <ph name="ORIGIN" /> сайтынан Android телефонуңузга жөнөтүү үчүн эки түзмөгүңүздөн тең Chrome'го кириңиз.</translation>
<translation id="8983720963221508955">Аккаунтуңузда Өркүндөтүлгөн коопсуз серептөөнү күйгүздүңүз. Эми аны Chrome'до да иштетиңиз.</translation>
diff --git a/chromium/chrome/app/resources/google_chrome_strings_mk.xtb b/chromium/chrome/app/resources/google_chrome_strings_mk.xtb
index 6cd1907c733..5c60c77da7e 100644
--- a/chromium/chrome/app/resources/google_chrome_strings_mk.xtb
+++ b/chromium/chrome/app/resources/google_chrome_strings_mk.xtb
@@ -193,7 +193,7 @@
<translation id="4458462641685292929">Во тек е друга операција на Google Chrome. Обидете се повторно подоцна.</translation>
<translation id="4459234553906210702">Мерењето на рекламите им овозможува на сајтовите што ги посетувате да бараат податоци од Chrome што му помагаат на сајтот да ја мери изведбата на своите реклами. Мерењето на рекламите го ограничува следењето меѓу сајтовите со префрлање што е можно помалку податоци меѓу сајтовите.</translation>
<translation id="4561051373932531560">Google Chrome ви овозможува да кликнете на телефонски број на интернет и да го повикате со Skype!</translation>
-<translation id="4567424176335768812">Најавени сте како <ph name="USER_EMAIL_ADDRESS" />. Сега може да пристапувате кон вашите обележувачи, историја и други поставки на сите најавени уреди.</translation>
+<translation id="4567424176335768812">Најавени сте како: <ph name="USER_EMAIL_ADDRESS" />. Сега може да пристапувате кон вашите обележувачи, историја и други поставки на сите најавени уреди.</translation>
<translation id="4571503333518166079">Одете во поставките за известувања на Chrome</translation>
<translation id="459622048091363950">Ако Chrome има пристап, тогаш и веб-сајтовите ќе може да ви бараат пристап.</translation>
<translation id="4600710005438004015">Chrome не може да се ажурира на најновата верзија и поради тоа ги пропуштате новите функции и безбедносни поправки.</translation>
diff --git a/chromium/chrome/app/resources/google_chrome_strings_mr.xtb b/chromium/chrome/app/resources/google_chrome_strings_mr.xtb
index 85a80b2a257..d0d15e2c64c 100644
--- a/chromium/chrome/app/resources/google_chrome_strings_mr.xtb
+++ b/chromium/chrome/app/resources/google_chrome_strings_mr.xtb
@@ -228,7 +228,7 @@
<translation id="5334487786912937552">Chrome ला फाइल डाउनलोड करण्यासाठी स्टोरेज ॲक्सेस करण्याची परवानगी आवश्यक आहे.</translation>
<translation id="5337648990166757586">पर्यायी: Google ला निदान आणि वापर डेटा आपोआप पाठवून, ChromeOS च्या वैशिष्‍ट्यांमध्ये व परफॉर्मन्समध्ये सुधारणा करण्यात मदत करा.</translation>
<translation id="5357889879764279201">ChromeOS Flex शी संबंधित मदत मिळवा</translation>
-<translation id="5386244825306882791">तुम्ही Chrome सुरू करता किंवा ओम्निबॉक्समधून शोध घेता तेव्हा कोणते पृष्ठ दर्शविले जाते हेदेखील हे नियंत्रित करते.</translation>
+<translation id="5386244825306882791">तुम्ही Chrome सुरू करता किंवा तुम्ही ओम्निबॉक्समधून शोध घेता तेव्हा कोणते पेज दाखवावे हेदेखील ते नियंत्रित करते.</translation>
<translation id="5394833366792865639">Chrome टॅब शेअर करा</translation>
<translation id="5412485296464121825">साइट तुमच्या स्वारस्यांबद्दलची माहिती Chrome वापरून स्टोअर करू शकतात. उदाहरणार्थ, तुम्ही मॅरेथॉनसाठी शूज खरेदी करण्यासाठी एखाद्या साइटला भेट दिल्यास, ती साइट तुमचे स्वारस्य मॅरेथॉनमध्ये धावणे म्हणून परिभाषित करू शकते. त्यानंतर, तुम्ही एखाद्या शर्यतीसाठी नोंदणी करण्याकरिता वेगळ्या साइटला भेट दिल्यास, ती साइट तुम्हाला तुमच्या स्वारस्यांनुसार धावण्यासाठीच्या शूजची जाहिरात दाखवू शकते.</translation>
<translation id="5430073640787465221">तुमची प्राधान्ये फाइल दूषित किंवा चुकीचे आहेत.
@@ -392,7 +392,7 @@ Google Chrome तुमची सेटिंग्ज पुन्हा मि
<translation id="8641606876632989680">तुम्ही धोक्यात असलेल्या पासवर्डने साइन इन केल्यावर Chrome तुम्हाला सूचित करेल</translation>
<translation id="8649026945479135076">सर्वसाधारणपणे, तुम्ही भेट देता त्या साइट तुमचा अनुभव पर्सनलाइझ करण्यासाठी, तुम्हाला स्वारस्य असलेल्या गोष्टी लक्षात ठेवतात. साइट तुमच्या स्वारस्यांबद्दलची माहिती Chrome वापरून स्टोअरदेखील करू शकतात.</translation>
<translation id="8669527147644353129">Google Chrome मदतनीस</translation>
-<translation id="8679801911857917785">तुम्ही Chrome सुरू करता तेव्हा कोणते पृष्ठ दर्शविले जाते हेदेखील हे नियंत्रित करते.</translation>
+<translation id="8679801911857917785">तुम्ही Chrome सुरू करता तेव्हा कोणते पेज दर्शविले जाते हेदेखील हे नियंत्रित करते.</translation>
<translation id="8684875378076460854">Chrome हे ही फाइल स्कॅन करण्याच्या शिफारशी करते, कारण ती धोकादायक असू शकते</translation>
<translation id="8686817260976772516">Chrome प्रोफाइल वापरून तुम्ही तुमच्या सर्व गोष्टी Chrome वर वेगवेगळ्या ठेवू शकता. मित्रमैत्रिणी आणि कुटुंबासाठी प्रोफाइल तयार करा किंवा त्यांची काम व मनोरंजन यामध्ये विभागणी करा.</translation>
<translation id="8712767363896337380">जवळजवळ अप टू डेट! अपडेट करणे पूर्ण करण्यासाठी, Chrome पुन्हा लाँच करा.</translation>
diff --git a/chromium/chrome/app/resources/google_chrome_strings_ne.xtb b/chromium/chrome/app/resources/google_chrome_strings_ne.xtb
index 867d08598b2..9ac9781624e 100644
--- a/chromium/chrome/app/resources/google_chrome_strings_ne.xtb
+++ b/chromium/chrome/app/resources/google_chrome_strings_ne.xtb
@@ -109,7 +109,7 @@
<translation id="2926676257163822632">कमजोर पासवर्डहरू सजिलै अनुमान लगाउन सकिन्छ। Chrome लाई <ph name="BEGIN_LINK" />तपाईंका लागि भरपर्दा पासवर्ड बनाउन र याद राख्न<ph name="END_LINK" /> दिनुहोस्।</translation>
<translation id="2926952073016206995">यो साइट चलाउन Chrome लाई क्यामेरा प्रयोग गर्ने अनुमति दिनु पर्ने हुन्छ</translation>
<translation id="2928420929544864228">इन्स्टल गरियो।</translation>
-<translation id="2929907241665500097">Chrome अद्यावधिक भएन, केही चिज गडबड भयो। <ph name="BEGIN_LINK" />Chrome अद्यावधिक गर्दा देखिएका समस्या तथा अद्यावधिक नहुने समस्याहरू समाधान गर्नुहोस्।<ph name="END_LINK" /></translation>
+<translation id="2929907241665500097">Chrome अद्यावधिक भएन, कुनै समस्या आयो। <ph name="BEGIN_LINK" />Chrome अद्यावधिक गर्दा देखिएका समस्या तथा अद्यावधिक नहुने समस्याहरू समाधान गर्नुहोस्।<ph name="END_LINK" /></translation>
<translation id="2969728957078202736"><ph name="PAGE_TITLE" /> - नेटवर्क साइन इन - Chrome</translation>
<translation id="3019382870990049182">तपाईं &amp;ChromeOS Flex अपडेट गर्न चाहनुहुन्छ भने रिलन्च गर्नुहोस्</translation>
<translation id="303514781271618814">Chrome ले साइटहरूलाई कम डेटा प्रयोग गरेर उही स्तरको ब्राउजिङ अनुभव प्रदान गर्न सघाउने नयाँ सुविधाहरूको जाँच गरिरहेको छ</translation>
diff --git a/chromium/chrome/app/resources/google_chrome_strings_nl.xtb b/chromium/chrome/app/resources/google_chrome_strings_nl.xtb
index 8b7b8cf154e..1afb1686836 100644
--- a/chromium/chrome/app/resources/google_chrome_strings_nl.xtb
+++ b/chromium/chrome/app/resources/google_chrome_strings_nl.xtb
@@ -21,7 +21,7 @@ Sommige functies zijn wellicht niet beschikbaar en wijzigingen in voorkeuren wor
<translation id="1363996462118479832">Chrome OS kan je gegevens niet synchroniseren vanwege een fout tijdens het inloggen.</translation>
<translation id="137466361146087520">Google Chrome Bèta</translation>
<translation id="1399397803214730675">Deze computer beschikt al over een nieuwere versie van Google Chrome. Als de software niet werkt, verwijder je Google Chrome en probeer je het opnieuw.</translation>
-<translation id="139993653570221430">Je kunt dit op elk moment wijzigen via de Chrome-instellingen. De proeven worden uitgevoerd in combinatie met de huidige manier waarop advertenties worden weergegeven, dus je ziet de wijzigingen niet meteen.</translation>
+<translation id="139993653570221430">Je kunt dit altijd wijzigen via de Chrome-instellingen. De proeven worden uitgevoerd in combinatie met de huidige manier waarop advertenties worden weergegeven, dus je ziet de wijzigingen niet meteen.</translation>
<translation id="1434626383986940139">Chrome Canary-apps</translation>
<translation id="1507198376417198979">Je nieuwe Chrome-profiel aanpassen</translation>
<translation id="1516530951338665275">Google Chrome heeft bluetooth-toegang nodig om door te gaan met koppelen. <ph name="IDS_BLUETOOTH_DEVICE_CHOOSER_AUTHORIZE_BLUETOOTH_LINK" /></translation>
@@ -162,7 +162,7 @@ Sommige functies zijn wellicht niet beschikbaar en wijzigingen in voorkeuren wor
<translation id="3865754807470779944">Chrome-versie <ph name="PRODUCT_VERSION" /> is geïnstalleerd</translation>
<translation id="3873044882194371212">Link openen in een Chrome-inco&amp;gnitovenster</translation>
<translation id="3889417619312448367">Google Chrome verwijderen</translation>
-<translation id="3999683152997576765">Je kunt interessante onderwerpen bekijken en verwijderen die sites hebben gebruikt om je advertenties te laten zien. Chrome schat je interesses op basis van je recente browsegeschiedenis.</translation>
+<translation id="3999683152997576765">Je kunt interessante onderwerpen bekijken en verwijderen die sites hebben gebruikt om advertenties te tonen. Chrome schat je interesses op basis van je recente browsegeschiedenis.</translation>
<translation id="4035053306113201399">Chrome OS moet opnieuw worden gestart om de update uit te voeren.</translation>
<translation id="4050175100176540509">Er zijn belangrijke beveiligingsverbeteringen en nieuwe functies beschikbaar in de nieuwste versie.</translation>
<translation id="4053720452172726777">Google Chrome aanpassen en beheren</translation>
diff --git a/chromium/chrome/app/resources/google_chrome_strings_pt-BR.xtb b/chromium/chrome/app/resources/google_chrome_strings_pt-BR.xtb
index be445a8cc65..1a2db0ec534 100644
--- a/chromium/chrome/app/resources/google_chrome_strings_pt-BR.xtb
+++ b/chromium/chrome/app/resources/google_chrome_strings_pt-BR.xtb
@@ -322,7 +322,7 @@ As permissões que você já concedeu a sites e apps podem ser aplicadas a essa
<translation id="7535429826459677826">Google Chrome Dev</translation>
<translation id="7583399374488819119">Instalador do <ph name="COMPANY_NAME" /></translation>
<translation id="7606334485649076285">Google ChromeOS Flex</translation>
-<translation id="7626032353295482388">Bem-vindo ao Google Chrome</translation>
+<translation id="7626032353295482388">Este é o Google Chrome</translation>
<translation id="7626072681686626474"><ph name="MANAGER" /> requer que você leia e aceite os Termos de Serviço a seguir antes de usar o dispositivo. Esses termos não ampliam, modificam nem limitam os Termos do Google ChromeOS.</translation>
<translation id="7629695634924605473">O Chrome avisa se suas senhas forem comprometidas</translation>
<translation id="7641148173327520642">O administrador do seu sistema configurou o Google Chrome para abrir o <ph name="ALTERNATIVE_BROWSER_NAME" /> ao acessar <ph name="TARGET_URL_HOSTNAME" />.</translation>
diff --git a/chromium/chrome/app/resources/google_chrome_strings_sw.xtb b/chromium/chrome/app/resources/google_chrome_strings_sw.xtb
index 6d61fcdc24c..d760be6fb81 100644
--- a/chromium/chrome/app/resources/google_chrome_strings_sw.xtb
+++ b/chromium/chrome/app/resources/google_chrome_strings_sw.xtb
@@ -252,7 +252,7 @@ Google Chrome haiwezi kufufua mipangilio yako.</translation>
<translation id="5795887333006832406"><ph name="PAGE_TITLE" /> - Toleo la Jaribio la Google Chrome</translation>
<translation id="5804318322022881572">Imeshindwa kuanzisha Chrome. Jaribu tena.</translation>
<translation id="5867197326698922595">Google Chrome inajaribu kubadilisha manenosiri.</translation>
-<translation id="5895138241574237353">Zzima na uwashe</translation>
+<translation id="5895138241574237353">Zima na uwashe</translation>
<translation id="5903106910045431592"><ph name="PAGE_TITLE" /> - Kuingia katika Akaunti ya Mtandao</translation>
<translation id="5924017743176219022">Inaunganisha kwenye Intaneti...</translation>
<translation id="5932997892801542621">Unapoandika kwenye sehemu ya anwani au kisanduku cha kutafutia, Chrome hutuma unachokiandika kwenda kwenye Hifadhi ya Google ili upate mapendekezo ya kipengee. Kipengele hiki huwa kimezimwa katika Hali fiche.</translation>
diff --git a/chromium/chrome/app/resources/google_chrome_strings_ta.xtb b/chromium/chrome/app/resources/google_chrome_strings_ta.xtb
index 2b8a3fa94a0..19df6646909 100644
--- a/chromium/chrome/app/resources/google_chrome_strings_ta.xtb
+++ b/chromium/chrome/app/resources/google_chrome_strings_ta.xtb
@@ -162,7 +162,7 @@
<translation id="3999683152997576765">உங்களுக்கு விளம்பரங்களைக் காட்ட தளங்கள் பயன்படுத்தும் ஆர்வமான தலைப்புகளை நீங்கள் பார்க்கலாம் அகற்றலாம். இணையத்தில் நீங்கள் சமீபத்தில் பார்த்தவற்றின் அடிப்படையில் உங்கள் ஆர்வங்களை Chrome உத்தேசமாகக் கணிக்கும்.</translation>
<translation id="4035053306113201399">புதுப்பிப்பைப் பயன்படுத்த, ChromeOSஸை மீண்டும் தொடங்க வேண்டும்.</translation>
<translation id="4050175100176540509">முக்கியப் பாதுகாப்பு மேம்பாடுகளும், புதிய அம்சங்களும் சமீபத்திய பதிப்பில் கிடைக்கின்றன.</translation>
-<translation id="4053720452172726777">Google Chrome ஐ தனிப்பயனாக்கி கட்டுப்படுத்து</translation>
+<translation id="4053720452172726777">Google Chromeமைப் பிரத்தியேகமாக்கிக் கட்டுப்படுத்துக</translation>
<translation id="4106587138345390261">உங்கள் தனிப்பட்ட தகவல்களைக் குறைந்தளவில் பயன்படுத்தி அதே உலாவல் அனுபவத்தை வழங்கும் வகையில் எங்கள் தளங்கள் செயல்படுமாறு புதிய அம்சங்களை Chrome சோதனை செய்து வருகிறது</translation>
<translation id="4110895483821904099">உங்கள் புதிய Chrome சுயவிவரத்தை அமைத்திடுங்கள்</translation>
<translation id="4147555960264124640">நீங்கள் நிர்வகிக்கப்படும் கணக்கு மூலம் உள்நுழைகிறீர்கள், மேலும் அதன் நிர்வாகிக்கு உங்கள் Google Chrome சுயவிவரத்தின் கட்டுப்பாட்டை வழங்குகிறீர்கள். உங்கள் ஆப்ஸ், புக்மார்க்குகள், வரலாறு, கடவுச்சொற்கள் போன்ற உங்கள் Chrome தரவு மற்றும் பிற அமைப்புகள் நிரந்தரமாக <ph name="USER_NAME" /> உடன் இணைக்கப்படும். இந்தத் தரவை Google கணக்குகளின் டாஷ்போர்டு வழியாக நீக்க முடியும், ஆனால் இந்தத் தரவை வேறொரு கணக்குடன் தொடர்புப்படுத்த முடியாது. <ph name="LEARN_MORE" /></translation>
@@ -268,7 +268,7 @@
<translation id="6273793429163604305">நிறுவத் தயாராகிறது...</translation>
<translation id="6291089322031436445">Chrome Dev ஆப்ஸ்</translation>
<translation id="6291549208091401781">உங்கள் கம்ப்யூட்டரில் ஏற்கனவே எல்லாப் பயனர்களுக்கும் Google Chrome நிறுவப்பட்டுள்ளது.</translation>
-<translation id="6326175484149238433">Chrome இலிருந்து அகற்று</translation>
+<translation id="6326175484149238433">Chromeமிலிருந்து அகற்று</translation>
<translation id="6327105987658262776">புதுப்பிப்புகள் எதுவும் இல்லை.</translation>
<translation id="6412673304250309937">Chromeமில் சேமிக்கப்பட்டுள்ள பாதுகாப்பில்லாத தளங்களின் பட்டியலைப் பயன்படுத்தி URLகளைச் சரிபார்க்கும். தளம் உங்கள் கடவுச்சொல்லைத் திருட முயன்றலோ தீங்குவிளைவிக்கும் ஃபைலை நீங்கள் பதிவிறக்கினாலோ Chromeமானது பக்க உள்ளடக்கத்தின் சிறிய பகுதிகள் உட்பட URLகளையும் பாதுகாப்பு உலாவலுக்கு அனுப்பக்கூடும்.</translation>
<translation id="6418662306461808273">ஏற்கெனவே உள்ள Chrome சுயவிவரத்திற்கு மாறவா?</translation>
diff --git a/chromium/chrome/app/resources/google_chrome_strings_te.xtb b/chromium/chrome/app/resources/google_chrome_strings_te.xtb
index 429ee4da23c..22474ab1a6c 100644
--- a/chromium/chrome/app/resources/google_chrome_strings_te.xtb
+++ b/chromium/chrome/app/resources/google_chrome_strings_te.xtb
@@ -186,7 +186,7 @@
<translation id="4393248995085527349">భవిష్యత్తులో Google Chrome అప్‌డేట్‌లను పొందడానికి, మీకు macOS 10.15 లేదా ఆ తర్వాతి వెర్షన్ అవసరం అవుతుంది. ఈ కంప్యూటర్ macOS 10.13 వెర్షన్‌ను ఉపయోగిస్తోంది.</translation>
<translation id="4427306783828095590">ఫిషింగ్, అలాగే మాల్‌వేర్‌ను బ్లాక్ చేయడానికి మెరుగుపరచిన రక్షణ మరింత చేయగలదు</translation>
<translation id="4450664632294415862">Chrome - నెట్‌వర్క్ సైన్ ఇన్ - <ph name="PAGE_TITLE" /></translation>
-<translation id="4458462641685292929">Google Chromeలో మరొక వ్యవస్థాపన జరుగుతోంది. దయచేసి తర్వాత మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="4458462641685292929">Google Chromeలో మరొక వ్యవస్థాపన జరుగుతోంది. దయచేసి తర్వాత మళ్లీ ట్రై చేయండి.</translation>
<translation id="4459234553906210702">మీరు సందర్శించే సైట్‌లను Chrome నుండి సమాచారాన్ని రిక్వెస్ట్ చేసేలా 'యాడ్‌ల అంచనా' అనుమతిస్తుంది, ఇది యాడ్‌ల పనితీరును అంచనా వేయడంలో సైట్‌కు సహాయపడుతుంది. 'యాడ్‌ల అంచనా', సైట్‌ల మధ్య వీలయినంత తక్కువ సమాచారాన్ని బదిలీ చేసి, క్రాస్-సైట్ ట్రాకింగ్‌ను తగ్గిస్తుంది.</translation>
<translation id="4561051373932531560">మీరు Google Chrome వెబ్‌లో ఫోన్ నంబర్ క్లిక్ చేసేలా అవ‌కాశం ఇస్తుంది మరియు Skypeతో కాల్ చేస్తుంది!</translation>
<translation id="4567424176335768812">మీరు <ph name="USER_EMAIL_ADDRESS" />గా సైన్ ఇన్ చేశారు. ఇప్పుడు మీరు సైన్ ఇన్ చేసిన అన్ని పరికరాల్లో మీ బుక్‌మార్క్‌లు, హిస్టరీ మరియు ఇతర సెట్టింగ్‌లను యాక్సెస్ చేయవచ్చు.</translation>
@@ -242,7 +242,7 @@
<translation id="5736850870166430177">ఏదైనా సైట్ మీ పాస్‌వర్డ్‌ను దొంగిలించే ప్రయత్నం చేసినా, లేదంటే ఏదైనా హానికరమైన ఫైల్‌ను మీరు డౌన్‌లోడ్ చేసినా, సదరు URLలను, ఆయా పేజీల కంటెంట్‌లోని కొన్ని భాగాలను కూడా Chrome, 'సురక్షిత బ్రౌజింగ్'కు పంపవచ్చు</translation>
<translation id="5756509061973259733">ఈ పరికరంలో ఇప్పటికే ఈ ఖాతాతో ఒక Chrome ప్రొఫైల్ ఉంది</translation>
<translation id="5795887333006832406"><ph name="PAGE_TITLE" /> - Google Chrome Canary</translation>
-<translation id="5804318322022881572">Chromeను ప్రారంభించడం సాధ్యపడలేదు. మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="5804318322022881572">Chromeను ప్రారంభించడం సాధ్యపడలేదు. మళ్లీ ట్రై చేయండి.</translation>
<translation id="5867197326698922595">పాస్‌వర్డ్‌లను ఎడిట్ చేయడానికి Google Chrome ప్రయత్నిస్తోంది.</translation>
<translation id="5895138241574237353">మళ్ళీ ప్రారంభించండి</translation>
<translation id="5903106910045431592"><ph name="PAGE_TITLE" /> - నెట్‌వర్క్ సైన్ ఇన్</translation>
diff --git a/chromium/chrome/app/resources/google_chrome_strings_zh-TW.xtb b/chromium/chrome/app/resources/google_chrome_strings_zh-TW.xtb
index 13dffbb00f4..c1aaaf61b9b 100644
--- a/chromium/chrome/app/resources/google_chrome_strings_zh-TW.xtb
+++ b/chromium/chrome/app/resources/google_chrome_strings_zh-TW.xtb
@@ -110,7 +110,7 @@
<translation id="2929907241665500097">發生錯誤,Chrome 未能更新。<ph name="BEGIN_LINK" />請修正 Chrome 更新問題與更新失敗項目。<ph name="END_LINK" /></translation>
<translation id="2969728957078202736"><ph name="PAGE_TITLE" /> - 網路登入 - Chrome</translation>
<translation id="3019382870990049182">重新啟動以更新 ChromeOS Flex</translation>
-<translation id="303514781271618814">Chrome 正在探索新功能,讓網站能在使用較少資料的情況下提供相同的瀏覽體驗</translation>
+<translation id="303514781271618814">Chrome 團隊正在研究新功能,設法讓網站減少存取個人資訊的情況,同時讓使用者享有相同的瀏覽體驗</translation>
<translation id="3037838751736561277">Google Chrome 正在背景模式中執行。</translation>
<translation id="3038232873781883849">正在等待安裝...</translation>
<translation id="3059710691562604940">安全瀏覽功能已停用。Chrome 建議啟用這項功能。</translation>
@@ -163,7 +163,7 @@
<translation id="4035053306113201399">Chrome OS 必須重新啟動,才能套用更新。</translation>
<translation id="4050175100176540509">最新版本包含重要的安全性改善與新功能。</translation>
<translation id="4053720452172726777">自訂及管理 Google Chrome</translation>
-<translation id="4106587138345390261">Chrome 正在探索新功能,讓網站在存取較少個人資訊的情況下,仍能提供相同的瀏覽體驗</translation>
+<translation id="4106587138345390261">Chrome 團隊正在研究新功能,設法讓網站減少存取個人資訊的情況,同時讓使用者享有相同的瀏覽體驗。</translation>
<translation id="4110895483821904099">設定新的 Chrome 設定檔</translation>
<translation id="4147555960264124640">你已登入管理化環境下的帳戶,並將管理控制權授予你的 Chrome 設定檔。你的 Chrome 資料 (例如應用程式、書籤、記錄、密碼和其他設定) 均將永久與 <ph name="USER_NAME" /> 建立關聯。你可以透過 Google 帳戶資訊主頁刪除這些資料,但你無法將這些資料與其他帳戶建立關聯。<ph name="LEARN_MORE" /></translation>
<translation id="4148957013307229264">安裝中...</translation>
diff --git a/chromium/chrome/browser/extensions/api/input_ime/input_ime_api_chromeos.cc b/chromium/chrome/browser/extensions/api/input_ime/input_ime_api_chromeos.cc
index 2a15a28e23f..d4d1ae5862a 100644
--- a/chromium/chrome/browser/extensions/api/input_ime/input_ime_api_chromeos.cc
+++ b/chromium/chrome/browser/extensions/api/input_ime/input_ime_api_chromeos.cc
@@ -454,7 +454,7 @@ class ImeObserverChromeOS
context.autocapitalization_mode);
private_api_input_context.spell_check =
ConvertInputContextSpellCheck(context.spellcheck_mode);
- private_api_input_context.has_been_password = context.has_been_password;
+ private_api_input_context.has_been_password = false;
private_api_input_context.should_do_learning =
ConvertPersonalizationMode(context);
private_api_input_context.focus_reason =
diff --git a/chromium/chrome/browser/signin/signin_util.cc b/chromium/chrome/browser/signin/signin_util.cc
index e15a5b675b2..a647d4dfe74 100644
--- a/chromium/chrome/browser/signin/signin_util.cc
+++ b/chromium/chrome/browser/signin/signin_util.cc
@@ -88,13 +88,14 @@ ProfileSeparationPolicyStateSet GetProfileSeparationPolicyState(
std::string current_profile_account_restriction =
profile->GetPrefs()->GetString(prefs::kManagedAccountsSigninRestriction);
- if (profile->GetPrefs()->GetBoolean(
- prefs::kManagedAccountsSigninRestrictionScopeMachine)) {
- result.Put(ProfileSeparationPolicyState::kEnforcedOnMachineLevel);
- }
if (base::StartsWith(current_profile_account_restriction,
"primary_account")) {
result.Put(ProfileSeparationPolicyState::kEnforcedByExistingProfile);
+
+ if (profile->GetPrefs()->GetBoolean(
+ prefs::kManagedAccountsSigninRestrictionScopeMachine)) {
+ result.Put(ProfileSeparationPolicyState::kEnforcedOnMachineLevel);
+ }
}
if (base::StartsWith(current_profile_account_restriction,
"primary_account_strict")) {
diff --git a/chromium/chrome/browser/signin/signin_util_unittest.cc b/chromium/chrome/browser/signin/signin_util_unittest.cc
index 6facd0ab069..131af1ceb86 100644
--- a/chromium/chrome/browser/signin/signin_util_unittest.cc
+++ b/chromium/chrome/browser/signin/signin_util_unittest.cc
@@ -73,6 +73,68 @@ TEST_F(SigninUtilTest, GetProfileSeparationPolicyState) {
ProfileSeparationPolicyState::kStrict,
ProfileSeparationPolicyState::kKeepsBrowsingData));
+ // Active profile has "none" as a user level policy.
+ profile->GetPrefs()->SetString(prefs::kManagedAccountsSigninRestriction,
+ "none");
+ profile->GetPrefs()->SetBoolean(
+ prefs::kManagedAccountsSigninRestrictionScopeMachine, false);
+ EXPECT_TRUE(
+ signin_util::GetProfileSeparationPolicyState(profile.get()).Empty());
+ EXPECT_TRUE(
+ signin_util::GetProfileSeparationPolicyState(profile.get(), "none")
+ .Empty());
+ EXPECT_EQ(signin_util::GetProfileSeparationPolicyState(profile.get(),
+ "primary_account"),
+ ProfileSeparationPolicyStateSet(
+ ProfileSeparationPolicyState::kEnforcedByInterceptedAccount));
+ EXPECT_EQ(signin_util::GetProfileSeparationPolicyState(
+ profile.get(), "primary_account_strict"),
+ ProfileSeparationPolicyStateSet(
+ ProfileSeparationPolicyState::kStrict,
+ ProfileSeparationPolicyState::kEnforcedByInterceptedAccount));
+ EXPECT_EQ(signin_util::GetProfileSeparationPolicyState(
+ profile.get(), "primary_account_keep_existing_data"),
+ ProfileSeparationPolicyStateSet(
+ ProfileSeparationPolicyState::kEnforcedByInterceptedAccount,
+ ProfileSeparationPolicyState::kKeepsBrowsingData));
+ EXPECT_EQ(signin_util::GetProfileSeparationPolicyState(
+ profile.get(), "primary_account_strict_keep_existing_data"),
+ ProfileSeparationPolicyStateSet(
+ ProfileSeparationPolicyState::kEnforcedByInterceptedAccount,
+ ProfileSeparationPolicyState::kKeepsBrowsingData,
+ ProfileSeparationPolicyState::kStrict));
+
+ // Active profile has "none" as a machine level policy.
+ profile->GetPrefs()->SetString(prefs::kManagedAccountsSigninRestriction,
+ "none");
+ profile->GetPrefs()->SetBoolean(
+ prefs::kManagedAccountsSigninRestrictionScopeMachine, true);
+ EXPECT_TRUE(
+ signin_util::GetProfileSeparationPolicyState(profile.get()).Empty());
+ EXPECT_TRUE(
+ signin_util::GetProfileSeparationPolicyState(profile.get(), "none")
+ .Empty());
+ EXPECT_EQ(signin_util::GetProfileSeparationPolicyState(profile.get(),
+ "primary_account"),
+ ProfileSeparationPolicyStateSet(
+ ProfileSeparationPolicyState::kEnforcedByInterceptedAccount));
+ EXPECT_EQ(signin_util::GetProfileSeparationPolicyState(
+ profile.get(), "primary_account_strict"),
+ ProfileSeparationPolicyStateSet(
+ ProfileSeparationPolicyState::kStrict,
+ ProfileSeparationPolicyState::kEnforcedByInterceptedAccount));
+ EXPECT_EQ(signin_util::GetProfileSeparationPolicyState(
+ profile.get(), "primary_account_keep_existing_data"),
+ ProfileSeparationPolicyStateSet(
+ ProfileSeparationPolicyState::kEnforcedByInterceptedAccount,
+ ProfileSeparationPolicyState::kKeepsBrowsingData));
+ EXPECT_EQ(signin_util::GetProfileSeparationPolicyState(
+ profile.get(), "primary_account_strict_keep_existing_data"),
+ ProfileSeparationPolicyStateSet(
+ ProfileSeparationPolicyState::kEnforcedByInterceptedAccount,
+ ProfileSeparationPolicyState::kKeepsBrowsingData,
+ ProfileSeparationPolicyState::kStrict));
+
// Active profile has "primary_account" as a user level policy.
profile->GetPrefs()->SetString(prefs::kManagedAccountsSigninRestriction,
"primary_account");
@@ -339,6 +401,34 @@ TEST_F(SigninUtilTest, ProfileSeparationEnforcedByPolicy) {
EXPECT_TRUE(signin_util::ProfileSeparationEnforcedByPolicy(
profile.get(), "primary_account_strict"));
+ // Active profile has "none" as a user level policy.
+ profile->GetPrefs()->SetString(prefs::kManagedAccountsSigninRestriction,
+ "none");
+ profile->GetPrefs()->SetBoolean(
+ prefs::kManagedAccountsSigninRestrictionScopeMachine, false);
+ EXPECT_FALSE(signin_util::ProfileSeparationEnforcedByPolicy(profile.get(),
+ std::string()));
+ EXPECT_FALSE(
+ signin_util::ProfileSeparationEnforcedByPolicy(profile.get(), "none"));
+ EXPECT_TRUE(signin_util::ProfileSeparationEnforcedByPolicy(
+ profile.get(), "primary_account"));
+ EXPECT_TRUE(signin_util::ProfileSeparationEnforcedByPolicy(
+ profile.get(), "primary_account_strict"));
+
+ // Active profile has "none" as a machine level policy.
+ profile->GetPrefs()->SetString(prefs::kManagedAccountsSigninRestriction,
+ "none");
+ profile->GetPrefs()->SetBoolean(
+ prefs::kManagedAccountsSigninRestrictionScopeMachine, true);
+ EXPECT_FALSE(signin_util::ProfileSeparationEnforcedByPolicy(profile.get(),
+ std::string()));
+ EXPECT_FALSE(
+ signin_util::ProfileSeparationEnforcedByPolicy(profile.get(), "none"));
+ EXPECT_TRUE(signin_util::ProfileSeparationEnforcedByPolicy(
+ profile.get(), "primary_account"));
+ EXPECT_TRUE(signin_util::ProfileSeparationEnforcedByPolicy(
+ profile.get(), "primary_account_strict"));
+
// Active profile has "primary_account" as a user level policy.
profile->GetPrefs()->SetString(prefs::kManagedAccountsSigninRestriction,
"primary_account");
diff --git a/chromium/chrome/browser/ui/webui/devtools_ui_data_source.cc b/chromium/chrome/browser/ui/webui/devtools_ui_data_source.cc
index f896563cc68..6282d913509 100644
--- a/chromium/chrome/browser/ui/webui/devtools_ui_data_source.cc
+++ b/chromium/chrome/browser/ui/webui/devtools_ui_data_source.cc
@@ -359,11 +359,13 @@ void DevToolsDataSource::StartFileRequest(const std::string& path,
void DevToolsDataSource::OnLoadComplete(
std::list<PendingRequest>::iterator request_iter,
std::unique_ptr<std::string> response_body) {
- std::move(request_iter->callback)
- .Run(response_body ? base::MakeRefCounted<base::RefCountedString>(
- std::move(*response_body))
- : CreateNotFoundResponse());
+ GotDataCallback callback = std::move(request_iter->callback);
pending_requests_.erase(request_iter);
+ std::move(callback).Run(response_body
+ ? base::MakeRefCounted<base::RefCountedString>(
+ std::move(*response_body))
+ : CreateNotFoundResponse());
+ // `this` might no longer be valid after `callback` has run.
}
DevToolsDataSource::PendingRequest::PendingRequest() = default;
diff --git a/chromium/chrome/browser/ui/webui/devtools_ui_data_source_unittest.cc b/chromium/chrome/browser/ui/webui/devtools_ui_data_source_unittest.cc
index 2d2b3dbd31c..f83df79cca8 100644
--- a/chromium/chrome/browser/ui/webui/devtools_ui_data_source_unittest.cc
+++ b/chromium/chrome/browser/ui/webui/devtools_ui_data_source_unittest.cc
@@ -9,13 +9,17 @@
#include "base/command_line.h"
#include "base/functional/bind.h"
#include "base/memory/ref_counted_memory.h"
+#include "base/memory/scoped_refptr.h"
#include "base/strings/strcat.h"
#include "base/strings/string_piece.h"
+#include "base/test/bind.h"
#include "build/build_config.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/url_constants.h"
#include "content/public/browser/url_data_source.h"
+#include "content/public/test/browser_task_environment.h"
#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
+#include "services/network/test/test_shared_url_loader_factory.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace {
@@ -322,3 +326,36 @@ TEST_F(DevToolsUIDataSourceTest, TestDevToolsNoRouteWithSwitch) {
ASSERT_TRUE(base::StartsWith(data(), kDevToolsUITest404Response,
base::CompareCase::SENSITIVE));
}
+
+class DevToolsUIDataSourceWithTaskEnvTest : public testing::Test {
+ public:
+ DevToolsUIDataSourceWithTaskEnvTest()
+ : task_environment_(content::BrowserTaskEnvironment::IO_MAINLOOP) {}
+
+ private:
+ content::BrowserTaskEnvironment task_environment_;
+};
+
+TEST_F(DevToolsUIDataSourceWithTaskEnvTest,
+ GotDataCallbackOwnsDevToolsDataSource) {
+ scoped_refptr<network::SharedURLLoaderFactory> factory =
+ base::MakeRefCounted<network::TestSharedURLLoaderFactory>();
+ DevToolsDataSource* data_source = new DevToolsDataSource(factory);
+
+ DevToolsDataSource::GotDataCallback callback = base::BindOnce(
+ [](DevToolsDataSource* data_source,
+ scoped_refptr<base::RefCountedMemory> payload) {
+ // Do nothing in the callback.
+ },
+ base::Owned(data_source));
+
+ // `callback` controls the life-time of the data_source now, so data_source is
+ // deleted after the callback is done running. This is similar to what
+ // WebUIURLLoaderFactory is doing.
+
+ const GURL path =
+ DevToolsUrl().Resolve(DevToolsRemotePath(kDevToolsUITestFrontEndUrl));
+ content::WebContents::Getter wc_getter;
+ data_source->StartDataRequest(path, std::move(wc_getter),
+ std::move(callback));
+}
diff --git a/chromium/chrome/common/extensions/api/input_method_private.json b/chromium/chrome/common/extensions/api/input_method_private.json
index 559558f458c..4368d602abb 100644
--- a/chromium/chrome/common/extensions/api/input_method_private.json
+++ b/chromium/chrome/common/extensions/api/input_method_private.json
@@ -77,7 +77,7 @@
"spellCheck": {"type": "boolean", "description": "Whether the text field wants spell-check."},
"shouldDoLearning": {"type": "boolean", "description": "Whether text entered into the text field should be used to improve typing suggestions for the user."},
"focusReason": {"$ref": "FocusReason", "description": "How the text field was focused"},
- "hasBeenPassword": {"type": "boolean", "description": "Whether the text field has ever been a password field."},
+ "hasBeenPassword": {"type": "boolean", "description": "DEPRECATED: when this was true, we now just set input field type to be password. Was: Whether the text field has ever been a password field."},
"appKey": {"type": "string", "optional": true, "description": "Key of the app associated with this text field if any."}
}
},
diff --git a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb
index cc9668a79d8..2a5a814b3fc 100644
--- a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb
+++ b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb
@@ -10,7 +10,7 @@
<translation id="1201402288615127009">ቀጣይ</translation>
<translation id="1242008676835033345"><ph name="WEBSITE_URL" /> ላይ ተካትቷል</translation>
<translation id="1272079795634619415">አቁም</translation>
-<translation id="1289742167380433257">ውሂብ እንዲቆጥብልዎ የዚህ ገጽ ምስሎች በGoogle እንዲተቡ ተደርገዋል።</translation>
+<translation id="1289742167380433257">ውሂብ እንዲቆጥብልዎ የዚህ ገፅ ምስሎች በGoogle እንዲተቡ ተደርገዋል።</translation>
<translation id="129382876167171263">በድር ጣቢያዎች የተቀመጡ ፋይሎች እዚህ ይታያሉ</translation>
<translation id="131112695174432497">ማስታወቂያን ግላዊነት ማላበስ ላይ ተጽዕኖ የሚያሳድር ውሂብ ተሰርዟል</translation>
<translation id="1317194122196776028">ይህን ጣቢያ እርሳ</translation>
@@ -165,7 +165,7 @@
<translation id="3967822245660637423">ማውረድ ተጠናቅቋል</translation>
<translation id="3987993985790029246">አገናኝ ቅዳ</translation>
<translation id="3991845972263764475"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / ?</translation>
-<translation id="3992684624889376114">ስለዚህ ገጽ</translation>
+<translation id="3992684624889376114">ስለዚህ ገፅ</translation>
<translation id="4002066346123236978">ርዕስ</translation>
<translation id="4008040567710660924">የተወሰነ ጣቢያ ኩኪዎችን ፍቀድ።</translation>
<translation id="4046123991198612571">ቀጣይ ትራክ</translation>
@@ -228,7 +228,7 @@
<translation id="5225463052809312700">ካሜራን አብራ</translation>
<translation id="5234764350956374838">አሰናብት</translation>
<translation id="5264323282659631142">«<ph name="CHIP_LABEL" />»ን ያስወግዱ</translation>
-<translation id="528192093759286357">ከሙሉ ማያ ገጽ ለመውጣት ከላይ ይጎትቱ እና የተመለስ አዝራሩን ይንኩ።</translation>
+<translation id="528192093759286357">ከሙሉ ማያ ገፅ ለመውጣት ከላይ ይጎትቱ እና የተመለስ አዝራሩን ይንኩ።</translation>
<translation id="5300589172476337783">አሳይ</translation>
<translation id="5301954838959518834">እሺ፣ ገባኝ</translation>
<translation id="5317780077021120954">አስቀምጥ</translation>
@@ -359,7 +359,7 @@
<translation id="7658239707568436148">ይቅር</translation>
<translation id="7667547420449112975">አስደናቂው የኦዝ ምትሃተኛ</translation>
<translation id="7684642910516280563">አንድ ጣቢያ የሦስተኛ ወገን ኩኪዎችን እንዲጠቀም አይፍቀዱ</translation>
-<translation id="7719367874908701697">ገጽ አጉላ</translation>
+<translation id="7719367874908701697">ገፅ አጉላ</translation>
<translation id="7781829728241885113">ትናንት</translation>
<translation id="7791543448312431591">ያክሉ</translation>
<translation id="780301667611848630">አይ፣ አመሰግናለሁ</translation>
@@ -413,8 +413,8 @@
<translation id="8499083585497694743">የማይክሮፎን ድምፀ-ከል አንሳ</translation>
<translation id="8514955299594277296">ጣቢያዎች በመሣሪያዎ ላይ ውሂብ እንዲያስቀምጡ አይፍቀዱ (አይመከርም)</translation>
<translation id="851751545965956758">ጣቢያዎች ከመሣሪያዎች ጋር እንዳይገናኙ አግድ</translation>
-<translation id="8525306231823319788">ሙሉ ማያ ገጽ</translation>
-<translation id="8528440122773422556">ይህ እርምጃ በ<ph name="ORIGIN" /> ሥር ወይም በእርስዎ መነሻ ማያ ገጽ ላይ በመተግበሪያው ሁሉም ጣቢያዎች የተከማቹትን ሁሉንም ውሂብ እና ኩኪዎች ያጸዳል</translation>
+<translation id="8525306231823319788">ሙሉ ማያ ገፅ</translation>
+<translation id="8528440122773422556">ይህ እርምጃ በ<ph name="ORIGIN" /> ሥር ወይም በእርስዎ መነሻ ማያ ገፅ ላይ በመተግበሪያው ሁሉም ጣቢያዎች የተከማቹትን ሁሉንም ውሂብ እና ኩኪዎች ያጸዳል</translation>
<translation id="8541410041357371550">ይህ ጣቢያ ይበልጥ አግባብነት ያላቸው ማስታወቂያዎችን ለእርስዎ ለማሳየት የእርስዎን የማስታወቂያ ርዕሶች ከChrome ያገኛል</translation>
<translation id="8564613706851221529">{COUNT,plural, =1{ለ<ph name="FPS_MEMBERS_COUNT" /> <ph name="FPS_OWNER" /> ጣቢያ የተፈቀደ ኩኪ}one{ለ<ph name="FPS_MEMBERS_COUNT" /> <ph name="FPS_OWNER" /> ጣቢያ የተፈቀደ ኩኪ}other{ለ<ph name="FPS_MEMBERS_COUNT" /> <ph name="FPS_OWNER" /> ጣቢያዎች የተፈቀዱ ኩኪዎች}}</translation>
<translation id="857943718398505171">ተፈቅዷል (የሚመከር)</translation>
@@ -450,7 +450,7 @@
<translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />፣ <ph name="PERMISSION_2" />፣ እና <ph name="NUM_MORE" /> ተጨማሪ}one{<ph name="PERMISSION_1" />፣ <ph name="PERMISSION_2" />፣ እና <ph name="NUM_MORE" /> ተጨማሪ}other{<ph name="PERMISSION_1" />፣ <ph name="PERMISSION_2" />፣ እና <ph name="NUM_MORE" /> ተጨማሪ}}</translation>
<translation id="913657688200966289">ለ <ph name="APP_NAME" /> በ <ph name="BEGIN_LINK" />Android ቅንብሮች<ph name="END_LINK" /> ውስጥ ፈቃዶችን ያብሩ።</translation>
<translation id="9138217887606523162">የአሁን ማጉላት <ph name="ZOOM_LEVEL" /> %% ነው</translation>
-<translation id="9162462602695099906">ይህ ገጽ አደገኛ ነው</translation>
+<translation id="9162462602695099906">ይህ ገፅ አደገኛ ነው</translation>
<translation id="9201023452444595544">ማናቸውም የመስመር ውጭ ውሂብ ይጸዳል</translation>
<translation id="930525582205581608">ይህ ጣቢያ ይረሳ?</translation>
<translation id="967624055006145463">የተከማቸ ውሂብ</translation>
diff --git a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb
index df11e1a73a6..863279cdd22 100644
--- a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb
+++ b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb
@@ -350,7 +350,7 @@
<translation id="7425915948813553151">المظهر الداكن للمواقع الإلكترونية</translation>
<translation id="7521387064766892559">JavaScript</translation>
<translation id="7554752735887601236">هناك موقع إلكتروني يستخدم الميكروفون.</translation>
-<translation id="7561196759112975576">دومًا</translation>
+<translation id="7561196759112975576">دائمًا</translation>
<translation id="757524316907819857">منع المواقع الإلكترونية من تشغيل المحتوى المحمي</translation>
<translation id="7577900504646297215">إدارة الاهتمامات</translation>
<translation id="7594634374516752650">تم الاتصال بجهاز يتضمّن بلوتوث.</translation>
diff --git a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb
index 15332f54337..c82e3f0e041 100644
--- a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb
+++ b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb
@@ -451,7 +451,7 @@
<translation id="913657688200966289">Activa els permisos per a <ph name="APP_NAME" /> a la <ph name="BEGIN_LINK" />configuració d'Android<ph name="END_LINK" />.</translation>
<translation id="9138217887606523162">El zoom actual és <ph name="ZOOM_LEVEL" /> %%</translation>
<translation id="9162462602695099906">Aquesta pàgina és perillosa</translation>
-<translation id="9201023452444595544">S'esborraran totes les dades sense connexió</translation>
+<translation id="9201023452444595544">S'esborraran totes les dades fora de línia</translation>
<translation id="930525582205581608">Vols oblidar aquest lloc web?</translation>
<translation id="967624055006145463">Dades emmagatzemades</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb
index 000ae57c6a9..30473cae9d7 100644
--- a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb
+++ b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb
@@ -12,7 +12,7 @@
<translation id="1272079795634619415">Stop</translation>
<translation id="1289742167380433257">Billederne på denne side er blevet optimeret af Google, så du sparer data.</translation>
<translation id="129382876167171263">Filer, der gemmes af websites, vises her</translation>
-<translation id="131112695174432497">Data, der påvirker annoncetilpasning, slettes</translation>
+<translation id="131112695174432497">Data, der påvirker personlig tilpasning af annoncer, slettes</translation>
<translation id="1317194122196776028">Glem dette website</translation>
<translation id="1343356790768851700">Dette website foretager en vurdering af, hvad du kan lide, og foreslår derefter annoncer til andre websites</translation>
<translation id="1369915414381695676">Websitet <ph name="SITE_NAME" /> blev tilføjet</translation>
@@ -184,7 +184,7 @@
<translation id="4338831206024587507">Alle websites på <ph name="DOMAIN" /></translation>
<translation id="4402755511846832236">Bloker websites fra at vide, hvornår du aktivt bruger denne enhed</translation>
<translation id="4412992751769744546">Tillad tredjepartscookies</translation>
-<translation id="4428065317363009941">Annoncetilpasning</translation>
+<translation id="4428065317363009941">Personlig tilpasning af annoncer</translation>
<translation id="4434045419905280838">Pop op-vinduer og omdirigeringer</translation>
<translation id="4440642537584213025">Udvid <ph name="TARGET_DESCRIPTION" /></translation>
<translation id="4468959413250150279">Slå lyden fra for et bestemt website.</translation>
@@ -206,7 +206,7 @@
<translation id="483914009762354899">Medtag alle websites under dette domæne</translation>
<translation id="4883854917563148705">Administrerede indstillinger kan ikke nulstilles</translation>
<translation id="4887024562049524730">Spørg, inden websites kan anvende dine virtual reality-enheder og -data (anbefales)</translation>
-<translation id="4955223779495905865">Et website, du besøger, kan indlejre indhold fra andre websites, f.eks. billeder, annoncer og tekst. Ethvert af disse websites kan gemme cookies og andre data for at tilpasse din oplevelse.</translation>
+<translation id="4955223779495905865">Et website, du besøger, kan indlejre indhold fra andre websites, f.eks. billeder, annoncer og tekst. Ethvert af disse websites kan gemme cookies og andre data for at personligt tilpasse din oplevelse.</translation>
<translation id="4962975101802056554">Tilbagekald alle tilladelser for enheden</translation>
<translation id="497421865427891073">Gå fremad</translation>
<translation id="4976702386844183910">Senest besøgt <ph name="DATE" /></translation>
@@ -246,7 +246,7 @@
<translation id="5505264765875738116">Websites kan ikke spørge dig, om de må sende dig notifikationer</translation>
<translation id="5516455585884385570">Åbn indstillinger for notifikationer</translation>
<translation id="5527111080432883924">Spørg, før websites får adgang til at læse tekst og billeder fra udklipsholderen (anbefales)</translation>
-<translation id="5545693483061321551">Websites kan ikke bruge dine cookies til at se din browseraktivitet på forskellige websites for f.eks. at tilpasse annoncer. Funktionerne på visse websites virker muligvis ikke.</translation>
+<translation id="5545693483061321551">Websites kan ikke bruge dine cookies til at se din browseraktivitet på forskellige websites for f.eks. at personligt tilpasse annoncer. Funktionerne på visse websites virker muligvis ikke.</translation>
<translation id="5553374991681107062">Seneste</translation>
<translation id="5556459405103347317">Genindlæs</translation>
<translation id="5596627076506792578">Flere valgmuligheder</translation>
diff --git a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb
index 8f849a03f10..d2ac7b36bac 100644
--- a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb
+++ b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb
@@ -118,7 +118,7 @@
<translation id="3115898365077584848">Mostrar información</translation>
<translation id="3123473560110926937">Bloqueados en algunos sitios</translation>
<translation id="3143754809889689516">Reproducir desde el principio</translation>
-<translation id="3162899666601560689">Los sitios pueden usar cookies para mejorar la experiencia de navegación, por ejemplo, para mantener el acceso a ellos o recordar elementos del carrito de compras.</translation>
+<translation id="3162899666601560689">Los sitios pueden usar cookies para mejorar la experiencia de navegación, por ejemplo, para mantener el acceso a ellos o recordar artículos del carrito de compras.</translation>
<translation id="3165022941318558018">Permitir que un sitio utilice cookies de terceros</translation>
<translation id="3198916472715691905">Datos almacenados: <ph name="STORAGE_AMOUNT" /></translation>
<translation id="3203366800380907218">Desde la Web</translation>
diff --git a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb
index 77240850154..01092b5385c 100644
--- a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb
+++ b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb
@@ -262,7 +262,7 @@
<translation id="5771720122942595109"><ph name="PERMISSION_1" /> bloqueado</translation>
<translation id="5804241973901381774">Permisos</translation>
<translation id="5810805850857689118">Esta acción borrará todos los datos y cookies de <ph name="ORIGIN" /> y de todos los sitios que incluya</translation>
-<translation id="5860033963881614850">Desactivado</translation>
+<translation id="5860033963881614850">Desactivada</translation>
<translation id="5876056640971328065">Pausar vídeo</translation>
<translation id="5884085660368669834">Preferencia de sitio</translation>
<translation id="5887687176710214216">Última visita: ayer</translation>
@@ -371,7 +371,7 @@
<translation id="7882806643839505685">Permite que se reproduzcan sonidos en un sitio específico.</translation>
<translation id="789180354981963912">Bloquea cookies de terceros en incógnito:</translation>
<translation id="7940722705963108451">Recuérdamelo</translation>
-<translation id="7974024493641668069">{COUNT,plural, =1{<ph name="FPS_MEMBERS_COUNT" /> sitio incluido en el grupo de sitios de <ph name="FPS_OWNER" /> que puede ver tu actividad en el grupo}other{<ph name="FPS_MEMBERS_COUNT" /> sitios incluidos en el grupo de sitios de <ph name="FPS_OWNER" /> que puede ver tu actividad en el grupo}}</translation>
+<translation id="7974024493641668069">{COUNT,plural, =1{<ph name="FPS_MEMBERS_COUNT" /> sitio incluido en el grupo de sitios de <ph name="FPS_OWNER" /> que puede ver tu actividad en el grupo}other{<ph name="FPS_MEMBERS_COUNT" /> sitios incluidos en el grupo de sitios de <ph name="FPS_OWNER" /> que pueden ver tu actividad en el grupo}}</translation>
<translation id="7986741934819883144">Selecciona un contacto</translation>
<translation id="7999064672810608036">¿Seguro que quieres borrar todos los datos locales, incluidas las cookies, y restablecer todos los permisos para este sitio web?</translation>
<translation id="8007176423574883786">Desactivada para este dispositivo</translation>
diff --git a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb
index 4a03b417e2c..1adfe1d088d 100644
--- a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb
+++ b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb
@@ -141,7 +141,7 @@
<translation id="3586500876634962664">Kameran ja mikrofonin käyttö</translation>
<translation id="358794129225322306">Anna sivuston ladata useita tiedostoja automaattisesti.</translation>
<translation id="3594780231884063836">Mykistä video</translation>
-<translation id="3596414637720633074">Kolmannen osapuolen evästeiden estäminen incognito-tilassa</translation>
+<translation id="3596414637720633074">Estä kolmannen osapuolen evästeet incognito-tilassa</translation>
<translation id="3600792891314830896">Mykistä ääniä toistavat sivustot</translation>
<translation id="3602290021589620013">Esikatselu</translation>
<translation id="3628308229821498208">Ehdotetut haut</translation>
diff --git a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb
index 4de30e3c38e..5b812f39729 100644
--- a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb
+++ b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb
@@ -118,7 +118,7 @@
<translation id="3115898365077584848">Afficher les informations</translation>
<translation id="3123473560110926937">Bloqué sur certains sites</translation>
<translation id="3143754809889689516">Lire depuis le début</translation>
-<translation id="3162899666601560689">Les sites peuvent utiliser des cookies pour améliorer votre expérience de navigation, par exemple pour maintenir votre connexion ou mémoriser les articles de votre panier</translation>
+<translation id="3162899666601560689">Les sites peuvent utiliser des cookies pour améliorer votre expérience de navigation, par exemple pour vous maintenir connecté ou se souvenir des articles de votre panier</translation>
<translation id="3165022941318558018">Autorisez un site à utiliser des cookies tiers</translation>
<translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> de données stockées</translation>
<translation id="3203366800380907218">Sur le Web</translation>
@@ -451,7 +451,7 @@
<translation id="913657688200966289">Activez les autorisations pour <ph name="APP_NAME" /> dans les <ph name="BEGIN_LINK" />paramètres Android<ph name="END_LINK" />.</translation>
<translation id="9138217887606523162">Le zoom actuel est de <ph name="ZOOM_LEVEL" /> %%</translation>
<translation id="9162462602695099906">Cette page est dangereuse</translation>
-<translation id="9201023452444595544">Toutes les données hors connexion vont être effacées</translation>
+<translation id="9201023452444595544">Les éventuelles données hors connexion seront effacées</translation>
<translation id="930525582205581608">Effacer pour ce site ?</translation>
<translation id="967624055006145463">Données stockées</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb
index 8d5643313c4..6c2666e4cb0 100644
--- a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb
+++ b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb
@@ -105,7 +105,7 @@
<translation id="2874939134665556319">पिछला ट्रैक</translation>
<translation id="2891975107962658722">किसी साइट को, आपके डिवाइस पर डेटा सेव करने से रोकें</translation>
<translation id="2903493209154104877">पते</translation>
-<translation id="2910701580606108292">साइटों को सुरक्षित सामग्री चलाने की अनुमति देने से पहले पूछें</translation>
+<translation id="2910701580606108292">साइटों को सुरक्षित कॉन्टेंट चलाने की अनुमति देने से पहले पूछें</translation>
<translation id="2913331724188855103">साइटों को कुकी डेटा सेव करने और पढ़ने की अनुमति दें (सुझाए गए)</translation>
<translation id="2932883381142163287">बुरे बर्ताव की शिकायत करें</translation>
<translation id="2968755619301702150">प्रमाणपत्र व्यूअर</translation>
@@ -161,7 +161,7 @@
<translation id="3895926599014793903">ज़बरदस्ती ज़ूम करना चालू करें</translation>
<translation id="3908288065506437185">गुप्त मोड में, तीसरे पक्ष की कुकी को ब्लॉक करें</translation>
<translation id="3918378745482005425">शायद कुछ सुविधाएं काम न करें. इससे जुड़ी साइटें अब भी तीसरे पक्ष की कुकी का इस्तेमाल कर सकती हैं.</translation>
-<translation id="3955193568934677022">साइटों को सुरक्षित सामग्री चलाने दें (हम इस सेटिंग को चालू रखने का सुझाव देते हैं)</translation>
+<translation id="3955193568934677022">साइटों को सुरक्षित कॉन्टेंट चलाने दें (हम इस सेटिंग को चालू रखने का सुझाव देते हैं)</translation>
<translation id="3967822245660637423">डाउनलोड पूरा हुआ</translation>
<translation id="3987993985790029246">लिंक कॉपी करें</translation>
<translation id="3991845972263764475"><ph name="BYTES_DOWNLOADED_WITH_UNITS" /> / ?</translation>
@@ -202,7 +202,7 @@
<translation id="477781522763920796">आपकी पहचान ज़ाहिर नहीं होती. इसके अलावा, साइटों को आपका ब्राउज़िंग इतिहास देखने की अनुमति नहीं मिलती.</translation>
<translation id="4779083564647765204">ज़ूम</translation>
<translation id="4811450222531576619">इस पेज के स्रोत और विषय के बारे में जानें</translation>
-<translation id="4836046166855586901">साइटों को यह पूछने दें कि आप इस डिवाइस का इस्तेमाल कब करते हैं</translation>
+<translation id="4836046166855586901">साइटों को यह पूछने दें कि आपकी ओर से इस डिवाइस का इस्तेमाल कब किया जाता है</translation>
<translation id="483914009762354899">इस डोमेन की सभी साइटें शामिल करें</translation>
<translation id="4883854917563148705">प्रबंधित सेटिंग रीसेट नहीं की जा सकती हैं</translation>
<translation id="4887024562049524730">साइटों को अपने वर्चुअल रिएलिटी वाले डिवाइस और डेटा का इस्तेमाल करने की अनुमति देने से पहले पूछें (हम इसका सुझाव देते हैं)</translation>
@@ -350,7 +350,7 @@
<translation id="7521387064766892559">JavaScript</translation>
<translation id="7554752735887601236">कोई साइट आपके माइक्रोफ़ोन का इस्तेमाल कर रही है</translation>
<translation id="7561196759112975576">हमेशा</translation>
-<translation id="757524316907819857">साइटों को सुरक्षित सामग्री चलाने से रोकें</translation>
+<translation id="757524316907819857">साइटों को सुरक्षित कॉन्टेंट चलाने से रोकें</translation>
<translation id="7577900504646297215">पसंद प्रबंधित करें</translation>
<translation id="7594634374516752650">ब्लूटूथ डिवाइस से जुड़ा हुआ है</translation>
<translation id="7634280112532283638">स्पैम और धोखाधड़ी को कम करना</translation>
diff --git a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb
index 98ea69351e4..3cf61dc6a72 100644
--- a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb
+++ b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb
@@ -31,7 +31,7 @@
<translation id="1644574205037202324">Cronologia</translation>
<translation id="1647582022260550163">Vuoi reimpostare le autorizzazioni e cancellare cookie e dati dei siti?</translation>
<translation id="1660204651932907780">Consenti ai siti di riprodurre l'audio (opzione consigliata)</translation>
-<translation id="1677097821151855053">I cookie e altri dati dei siti vengono utilizzati per ricordare attività e informazioni dell'utente, ad esempio per l'esecuzione dell'accesso o per personalizzare gli annunci. Per gestire i cookie per tutti i siti, consulta le <ph name="BEGIN_LINK" />Impostazioni<ph name="END_LINK" />.</translation>
+<translation id="1677097821151855053">I cookie e altri dati dei siti vengono utilizzati per ricordare attività e informazioni dell'utente, ad esempio per eseguire l'accesso o per personalizzare gli annunci. Per gestire i cookie per tutti i siti, consulta le <ph name="BEGIN_LINK" />Impostazioni<ph name="END_LINK" />.</translation>
<translation id="1688867105868176567">Cancellare i dati del sito?</translation>
<translation id="169515064810179024">Impedisci ai siti di accedere ai sensori di movimento</translation>
<translation id="1717218214683051432">Sensori di movimento</translation>
@@ -118,7 +118,7 @@
<translation id="3115898365077584848">Mostra informazioni</translation>
<translation id="3123473560110926937">Bloccati su alcuni siti</translation>
<translation id="3143754809889689516">Riproduci dall'inizio</translation>
-<translation id="3162899666601560689">I siti possono utilizzare i cookie per migliorare la tua esperienza di navigazione, ad esempio per mantenere l'accesso o memorizzare gli articoli aggiunti al carrello</translation>
+<translation id="3162899666601560689">I siti possono utilizzare i cookie per migliorare la tua esperienza di navigazione, ad esempio per mantenere l'accesso o memorizzare gli articoli aggiunti al carrello.</translation>
<translation id="3165022941318558018">Consenti a un sito di utilizzare i cookie di terze parti</translation>
<translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> di dati memorizzati</translation>
<translation id="3203366800380907218">Dal Web</translation>
@@ -136,7 +136,7 @@
<translation id="3403537308306431953"><ph name="ZOOM_LEVEL" />%%</translation>
<translation id="3521663503435878242">Siti in <ph name="DOMAIN" /></translation>
<translation id="3538390592868664640">Impedisci ai siti di creare una mappa 3D dell'ambiente circostante o di monitorare la posizione della fotocamera</translation>
-<translation id="3544058026430919413">Una società può definire un gruppo di siti che possono utilizzare i cookie per condividere la tua attività nel gruppo. Questa opzione è disattivata in incognito.</translation>
+<translation id="3544058026430919413">Una società può definire un gruppo di siti che possono utilizzare i cookie per condividere la tua attività nel gruppo. Questa opzione è disattivata nella modalità di navigazione in incognito.</translation>
<translation id="3551268116566418498">Uscire da modalità in incognito?</translation>
<translation id="3586500876634962664">Uso di videocamera e microfono</translation>
<translation id="358794129225322306">Consenti a un sito di scaricare automaticamente più file.</translation>
diff --git a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb
index c3a9fed3823..8a960a4257b 100644
--- a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb
+++ b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb
@@ -31,7 +31,7 @@
<translation id="1644574205037202324">履歴</translation>
<translation id="1647582022260550163">権限をリセットし、Cookie とサイトデータを削除してもよろしいですか?</translation>
<translation id="1660204651932907780">音声の再生をサイトに許可する(推奨)</translation>
-<translation id="1677097821151855053">Cookie と他のサイトデータは、ログインや広告のカスタマイズなどでユーザーを特定するために使用されます。すべてのサイトの Cookie を管理するには、<ph name="BEGIN_LINK" />設定<ph name="END_LINK" />をご覧ください。</translation>
+<translation id="1677097821151855053">Cookie と他のサイトデータは、ログインや広告のパーソナライズなどでユーザーを覚えておくために使用されます。すべてのサイトの Cookie を管理するには、<ph name="BEGIN_LINK" />設定<ph name="END_LINK" />をご覧ください。</translation>
<translation id="1688867105868176567">サイトデータを削除しますか?</translation>
<translation id="169515064810179024">サイトによるモーション センサーへのアクセスをブロックする</translation>
<translation id="1717218214683051432">モーション センサー</translation>
@@ -111,14 +111,14 @@
<translation id="2968755619301702150">証明書ビューア</translation>
<translation id="300526633675317032">ウェブサイトのストレージ <ph name="SIZE_IN_KB" /> のデータをすべて削除します。</translation>
<translation id="3008272652534848354">権限をリセット</translation>
-<translation id="301521992641321250">自動ブロックされました</translation>
+<translation id="301521992641321250">自動でブロックされました</translation>
<translation id="3069226013421428034">特定のサイトのサードパーティのログインを許可します。</translation>
<translation id="3109724472072898302">折りたたみ表示中</translation>
<translation id="3114012059975132928">動画プレーヤー</translation>
<translation id="3115898365077584848">情報を表示</translation>
<translation id="3123473560110926937">一部のサイトでブロックされています</translation>
<translation id="3143754809889689516">最初から再生</translation>
-<translation id="3162899666601560689">サイトは、Cookie を使用してブラウジングの利便性を改善できます(ログイン状態の維持、ショッピング カートの中身の保存などが行えます)</translation>
+<translation id="3162899666601560689">サイトは、Cookie を使用して閲覧の利便性を高めることができます(ログイン状態の維持、ショッピング カートの中身の保存など)</translation>
<translation id="3165022941318558018">サイトにサードパーティ Cookie の使用を許可する</translation>
<translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> の保存データ</translation>
<translation id="3203366800380907218">ウェブから</translation>
@@ -126,7 +126,7 @@
<translation id="3227137524299004712">マイク</translation>
<translation id="3248611290851046188">このサイトでは、他のサイトが広告の表示に使用できる興味 / 関心を定義しています。また、このサイトでは Chrome からお客様の興味 / 関心に関する情報を取得して、関連性の高い広告を表示しています。</translation>
<translation id="3277252321222022663">サイトによるセンサーへのアクセスを許可する(推奨)</translation>
-<translation id="3285500645985761267">関連サイトにグループでのアクティビティの確認を許可する</translation>
+<translation id="3285500645985761267">関連サイトにグループ内のアクティビティの確認を許可する</translation>
<translation id="3295019059349372795">第 11 章: オズの不思議なエメラルド シティ</translation>
<translation id="3295602654194328831">情報を表示しない</translation>
<translation id="3328801116991980348">サイト情報</translation>
@@ -246,7 +246,7 @@
<translation id="5505264765875738116">通知を送信するかどうかの確認をサイトに許可しない</translation>
<translation id="5516455585884385570">通知設定を開く</translation>
<translation id="5527111080432883924">サイトがクリップボードのテキストや画像を読み取る前に確認する(推奨)</translation>
-<translation id="5545693483061321551">サイトは、Cookie を使用して別のサイトでのあなたの閲覧アクティビティを確認できず、広告のカスタマイズなどが行えなくなります。一部のサイトで機能を使用できなくなる可能性があります。</translation>
+<translation id="5545693483061321551">サイトは、Cookie を使用して別のサイトでのあなたの閲覧アクティビティを確認できず、広告のパーソナライズなどが行えなくなります。一部のサイトで機能を使用できなくなる可能性があります。</translation>
<translation id="5553374991681107062">最新</translation>
<translation id="5556459405103347317">再読み込み</translation>
<translation id="5596627076506792578">その他のオプション</translation>
@@ -262,11 +262,11 @@
<translation id="5771720122942595109"><ph name="PERMISSION_1" />をブロック</translation>
<translation id="5804241973901381774">権限</translation>
<translation id="5810805850857689118">この操作を行うと、<ph name="ORIGIN" /> とそのドメインの全サイトのデータと Cookie がすべて消去されます</translation>
-<translation id="5860033963881614850">オフ</translation>
+<translation id="5860033963881614850">OFF</translation>
<translation id="5876056640971328065">動画を一時停止</translation>
<translation id="5884085660368669834">サイトの設定</translation>
<translation id="5887687176710214216">最終アクセス日: 昨日</translation>
-<translation id="5916664084637901428">オン</translation>
+<translation id="5916664084637901428">ON</translation>
<translation id="5922853908706496913">画面を共有しています</translation>
<translation id="5922967540311291836">サードパーティの Cookie をブロックする:</translation>
<translation id="5939518447894949180">リセット</translation>
@@ -303,7 +303,7 @@
<translation id="6545864417968258051">Bluetooth のスキャン</translation>
<translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,plural, =1{<ph name="PERMISSION_1" />、<ph name="PERMISSION_2" />、他 <ph name="NUM_MORE" /> 個の権限がブロックされています}other{<ph name="PERMISSION_1" />、<ph name="PERMISSION_2" />、他 <ph name="NUM_MORE" /> 個の権限がブロックされています}}</translation>
<translation id="6554732001434021288">最終アクセス日: <ph name="NUM_DAYS" /> 日前</translation>
-<translation id="6561560012278703671">静かな方法で通知する(割り込み通知を行わない)</translation>
+<translation id="6561560012278703671">目立たない方法で通知する(割り込み通知を行わない)</translation>
<translation id="6593061639179217415">PC 版サイト</translation>
<translation id="6608650720463149374"><ph name="GIGABYTES" /> GB</translation>
<translation id="6612358246767739896">保護されたコンテンツ</translation>
diff --git a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb
index f729433de6a..e646cb69b3e 100644
--- a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb
+++ b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb
@@ -111,7 +111,7 @@
<translation id="2968755619301702150">Сертификат көру құралы</translation>
<translation id="300526633675317032">Вебсайттың барлық деректері жойылады (<ph name="SIZE_IN_KB" />).</translation>
<translation id="3008272652534848354">Рұқсаттарды бастапқы күйіне қайтару</translation>
-<translation id="301521992641321250">Автоматты түрде бөгелген</translation>
+<translation id="301521992641321250">Автоматты түрде блокталған</translation>
<translation id="3069226013421428034">Белгілі бір сайт үшін бөгде қызметтер арқылы кіруге рұқсат беру.</translation>
<translation id="3109724472072898302">Жиылған</translation>
<translation id="3114012059975132928">Бейне ойнатқыш</translation>
@@ -257,7 +257,7 @@
<translation id="5690795753582697420">Камера Android параметрлерінде өшірілген.</translation>
<translation id="5706552988683188916"><ph name="WEBSITE" /> арналған cookie файлдары мен басқа да сайт деректері өшіріледі.</translation>
<translation id="5719847187258001597">Негізгі экрандағы <ph name="ORIGIN" /> сайты мен қолданбада сақталған барлық деректер мен cookie файлдары өшіріледі.</translation>
-<translation id="5723967018671998714">Үшінші тараптың cookie файлдары инкогнито режимінде бөгелген.</translation>
+<translation id="5723967018671998714">Үшінші тараптың cookie файлдары инкогнито режимінде блокталған.</translation>
<translation id="5740126560802162366">Сайттар деректерді құрылғыңызда сақтай алады.</translation>
<translation id="5771720122942595109"><ph name="PERMISSION_1" /> үшін тыйым салынған.</translation>
<translation id="5804241973901381774">Рұқсаттар</translation>
@@ -420,7 +420,7 @@
<translation id="857943718398505171">Рұқсат етілген (ең дұрысы)</translation>
<translation id="8609465669617005112">Жоғары қарай жылжыту</translation>
<translation id="8676374126336081632">Енгізілгенді өшіру</translation>
-<translation id="8681886425883659911">Мазалайтын немесе жалған ақпаратты жарнамаларды көрсететіні белгілі сайттарда жарнамалар бөгелген</translation>
+<translation id="8681886425883659911">Мазалайтын немесе жалған ақпаратты жарнамаларды көрсететіні белгілі сайттарда жарнамалар блокталған</translation>
<translation id="868929229000858085">Контактілеріңізді іздеңіз</translation>
<translation id="8712637175834984815">Түсінікті</translation>
<translation id="8719283222052720129"><ph name="APP_NAME" /> браузері үшін рұқсатты <ph name="BEGIN_LINK" />Android параметрлерінде<ph name="END_LINK" /> қосыңыз.</translation>
diff --git a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb
index 45bf2788115..b7765d71232 100644
--- a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb
+++ b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb
@@ -41,7 +41,7 @@
<translation id="1818308510395330587">AR ಬಳಸಲು <ph name="APP_NAME" /> ಗೆ ಅನುಮತಿ ನೀಡುವುದಕ್ಕಾಗಿ, <ph name="BEGIN_LINK" />Android ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ<ph name="END_LINK" /> ಕ್ಯಾಮರಾವನ್ನು ಸಹ ಆನ್ ಮಾಡಿ.</translation>
<translation id="1864927262126810325"><ph name="SOURCE_NAME" /> ನಿಂದ</translation>
<translation id="187227595286001730">ಸಂಬಂಧಿತ ಸೈಟ್‌ಗಳು ಗುಂಪಿನಲ್ಲಿ ನಿಮ್ಮ ಚಟುವಟಿಕೆಯನ್ನು ನೋಡಬಹುದು</translation>
-<translation id="1887786770086287077">ಈ ಸಾಧನದ ಸ್ಥಳ ಪ್ರವೇಶ ಆಫ್ ಆಗಿದೆ. ಅದನ್ನು <ph name="BEGIN_LINK" />Android ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ<ph name="END_LINK" /> ಆನ್ ಮಾಡಿ.</translation>
+<translation id="1887786770086287077">ಈ ಸಾಧನದ ಸ್ಥಳ ಆ್ಯಕ್ಸೆಸ್ ಆಫ್ ಆಗಿದೆ. ಅದನ್ನು <ph name="BEGIN_LINK" />Android ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ<ph name="END_LINK" /> ಆನ್ ಮಾಡಿ.</translation>
<translation id="1915307458270490472">ಹ್ಯಾಂಗ್ ಅಪ್ ಮಾಡಿ</translation>
<translation id="1919345977826869612">ಜಾಹೀರಾತುಗಳು</translation>
<translation id="1919950603503897840">ಸಂಪರ್ಕಗಳನ್ನು ಆಯ್ಕೆ ಮಾಡಿ</translation>
@@ -88,7 +88,7 @@
<translation id="2501278716633472235">ಹಿಂದಿರುಗಿ</translation>
<translation id="2546283357679194313">ಕುಕೀಗಳು ಮತ್ತು ಸೈಟ್ ಡೇಟಾ</translation>
<translation id="2569468611847789653">{COOKIE_COUNT,plural, =1{1 ಕುಕೀಯನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ}one{# ಕುಕೀಗಳನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ}other{# ಕುಕೀಗಳನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ}}</translation>
-<translation id="2570922361219980984">ಈ ಸಾಧನದ ಸ್ಥಳ ಪ್ರವೇಶ ಸಹ ಆಫ್ ಆಗಿದೆ. ಅದನ್ನು <ph name="BEGIN_LINK" />Android ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ<ph name="END_LINK" /> ಆನ್ ಮಾಡಿ.</translation>
+<translation id="2570922361219980984">ಈ ಸಾಧನದ ಸ್ಥಳ ಆ್ಯಕ್ಸೆಸ್ ಸಹ ಆಫ್ ಆಗಿದೆ. ಅದನ್ನು <ph name="BEGIN_LINK" />Android ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ<ph name="END_LINK" /> ಆನ್ ಮಾಡಿ.</translation>
<translation id="257931822824936280">ವಿಸ್ತರಿಸಲಾಗಿದೆ - ಕುಗ್ಗಿಸಲು ಕ್ಲಿಕ್ ಮಾಡಿ</translation>
<translation id="2586657967955657006">ಕ್ಲಿಪ್‌ಬೋರ್ಡ್</translation>
<translation id="2597457036804169544">ಸೈಟ್‌ಗಳಿಗೆ ಡಾರ್ಕ್ ಥೀಮ್ ಅನ್ನು ಅನ್ವಯಿಸಬೇಡಿ</translation>
@@ -244,7 +244,7 @@
<translation id="5494752089476963479">ಅನಪೇಕ್ಷಿತ ಅಥವಾ ತಪ್ಪುದಾರಿಗೆಳೆಯುವ ಜಾಹೀರಾತುಗಳನ್ನು ತೋರಿಸುವ ಸೈಟ್‌ಗಳಲ್ಲಿ ಜಾಹೀರಾತುಗಳನ್ನು ನಿರ್ಬಂಧಿಸಿ</translation>
<translation id="5502860503640766021"><ph name="PERMISSION_1" /> ಅನ್ನು ಅನುಮತಿಸಲಾಗಿದೆ <ph name="PERMISSION_2" /> ಅನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ</translation>
<translation id="5505264765875738116">ಅಧಿಸೂಚನೆಗಳನ್ನು ಕಳುಹಿಸಬಹುದೇ ಎಂದು ಸೈಟ್‌ಗಳು ಕೇಳಲು ಸಾಧ್ಯವಿಲ್ಲ</translation>
-<translation id="5516455585884385570">ಅಧಿಸೂಚನೆ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೆರೆಯಿರಿ</translation>
+<translation id="5516455585884385570">ನೋಟಿಫಿಕೇಶನ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೆರೆಯಿರಿ</translation>
<translation id="5527111080432883924">ಕ್ಲಿಪ್‌ಬೋರ್ಡ್‌ಗೆ ನಕಲಿಸಿರುವ ಪಠ್ಯ ಮತ್ತು ಚಿತ್ರಗಳನ್ನು ನೋಡಲು ಸೈಟ್‌ಗೆ ಅನುಮತಿಸುವ ಮುನ್ನ ಕೇಳಿ (ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ)</translation>
<translation id="5545693483061321551">ವಿವಿಧ ಸೈಟ್‌ಗಳಾದ್ಯಂತ ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಚಟುವಟಿಕೆಯನ್ನು ನೋಡಲು, ಉದಾಹರಣೆಗೆ ಜಾಹೀರಾತುಗಳನ್ನು ವೈಯಕ್ತೀಕರಿಸುವುದಕ್ಕಾಗಿ, ನಿಮ್ಮ ಕುಕೀಗಳನ್ನು ಬಳಸಲು ಸೈಟ್‌ಗಳಿಗೆ ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. ಫೀಚರ್‌ಗಳು ಕೆಲವು ಸೈಟ್‌ಗಳಲ್ಲಿ ಕಾರ್ಯನಿರ್ವಹಿಸದೇ ಇರಬಹುದು.</translation>
<translation id="5553374991681107062">ಇತ್ತೀಚಿನದು</translation>
@@ -327,7 +327,7 @@
<translation id="7000754031042624318">Android ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ಆಫ್ ಮಾಡಲಾಗಿದೆ</translation>
<translation id="7016516562562142042">ಪ್ರಸ್ತುತ ಹುಡುಕಾಟ ಇಂಜಿನ್‌ಗೆ ಅನುಮತಿಸಲಾಗಿದೆ</translation>
<translation id="702275896380648118">ಈ ಸೈಟ್ ನೀವು ಇಷ್ಟಪಡುವ ವಿಷಯಗಳನ್ನು ನಿರ್ಧರಿಸುತ್ತದೆ ಮತ್ತು ನಂತರ ಇತರ ಸೈಟ್‌ಗಳಿಗೆ ಜಾಹೀರಾತುಗಳನ್ನು ಸೂಚಿಸುತ್ತದೆ. ಈ ಸೈಟ್ ನಿಮಗೆ ಹೆಚ್ಚು ಸಂಬಂಧಿತ ಜಾಹೀರಾತನ್ನು ತೋರಿಸಲು Chrome ನಿಂದ ನಿಮ್ಮ ಜಾಹೀರಾತುಗಳ ವಿಷಯಗಳನ್ನು ಸಹ ಪಡೆಯುತ್ತದೆ.</translation>
-<translation id="702463548815491781">TalkBack ಅಥವಾ ಪ್ರವೇಶ ಬದಲಾಯಿಸಿ ಆನ್ ಆಗಿದ್ದಾಗ ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ</translation>
+<translation id="702463548815491781">TalkBack ಅಥವಾ ಸ್ವಿಚ್ ಆ್ಯಕ್ಸೆಸ್ ಆನ್ ಆಗಿದ್ದಾಗ ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ</translation>
<translation id="7050519587566342213">ನೀವು ಒಂದು ಸೈಟ್‌ನಿಂದ ಇನ್ನೊಂದು ಸೈಟ್‌ಗೆ ಹೆಚ್ಚು ವಿಶ್ವಾಸಾರ್ಹರಾಗಿರುವುದರಿಂದ ಬ್ರೌಸಿಂಗ್ ಸರಳವಾಗಿರುತ್ತದೆ.</translation>
<translation id="7053983685419859001">ನಿರ್ಬಂಧಿಸು</translation>
<translation id="7066151586745993502">{NUM_SELECTED,plural, =1{1 ಆಯ್ಕೆ ಮಾಡಲಾಗಿದೆ}one{# ಆಯ್ಕೆ ಮಾಡಲಾಗಿದೆ}other{# ಆಯ್ಕೆ ಮಾಡಲಾಗಿದೆ}}</translation>
diff --git a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb
index d1266c19440..27f986cec55 100644
--- a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb
+++ b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb
@@ -136,12 +136,12 @@
<translation id="3403537308306431953"><ph name="ZOOM_LEVEL" />%%</translation>
<translation id="3521663503435878242"><ph name="DOMAIN" />의 사이트</translation>
<translation id="3538390592868664640">사이트에서 주변 환경의 3D 지도를 생성하거나 카메라 위치를 추적하지 못하도록 차단</translation>
-<translation id="3544058026430919413">회사는 쿠키를 사용하여 내 그룹 활동을 공유하는 사이트 그룹을 정의할 수 있습니다. 시크릿 모드에서는 이 기능이 사용 중지되어 있습니다.</translation>
+<translation id="3544058026430919413">쿠키를 사용하여 내 그룹 활동을 공유할 수 있는 사이트 그룹을 회사가 정의할 수 있습니다. 시크릿 모드에서는 이 기능이 사용 중지되어 있습니다.</translation>
<translation id="3551268116566418498">시크릿 모드를 종료하시겠습니까?</translation>
<translation id="3586500876634962664">카메라 및 마이크 사용</translation>
<translation id="358794129225322306">사이트에서 여러 파일을 자동으로 다운로드하도록 허용합니다.</translation>
<translation id="3594780231884063836">동영상 음소거</translation>
-<translation id="3596414637720633074">시크릿 모드에서 타사 쿠키 차단</translation>
+<translation id="3596414637720633074">시크릿 모드에서 서드 파티 쿠키 차단</translation>
<translation id="3600792891314830896">소리를 재생하는 사이트 음소거</translation>
<translation id="3602290021589620013">미리보기</translation>
<translation id="3628308229821498208">추천 검색어</translation>
@@ -183,7 +183,7 @@
<translation id="4336434711095810371">모든 데이터 삭제</translation>
<translation id="4338831206024587507"><ph name="DOMAIN" />의 모든 사이트</translation>
<translation id="4402755511846832236">사용자가 현재 기기를 사용 중인지 사이트에서 알 수 없도록 차단합니다.</translation>
-<translation id="4412992751769744546">타사 쿠키 허용</translation>
+<translation id="4412992751769744546">서드 파티 쿠키 허용</translation>
<translation id="4428065317363009941">광고 개인 최적화</translation>
<translation id="4434045419905280838">팝업 및 리디렉션</translation>
<translation id="4440642537584213025"><ph name="TARGET_DESCRIPTION" /> 펼치기</translation>
@@ -283,7 +283,7 @@
<translation id="6177128806592000436">이 사이트는 보안 연결(HTTPS)이 사용되지 않았습니다.</translation>
<translation id="6181444274883918285">사이트 예외 추가</translation>
<translation id="6192792657125177640">예외</translation>
-<translation id="6196640612572343990">타사 쿠키 차단</translation>
+<translation id="6196640612572343990">서드 파티 쿠키 차단</translation>
<translation id="6205314730813004066">광고 개인 정보 보호</translation>
<translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> 옵션</translation>
<translation id="6231752747840485235">'<ph name="APP_NAME" />' 앱을 제거하시겠습니까?</translation>
@@ -397,7 +397,7 @@
<translation id="8324158725704657629">다시 묻지 않음</translation>
<translation id="8362795839483915693">방문하는 사이트를 확대 또는 축소할 수 있습니다.</translation>
<translation id="8372893542064058268">특정 사이트에서 백그라운드 동기화를 허용합니다.</translation>
-<translation id="8376384591331888629">이 사이트의 타사 쿠키 포함</translation>
+<translation id="8376384591331888629">이 사이트의 서드 파티 쿠키 포함</translation>
<translation id="83792324527827022">사이트에서 카메라와 마이크를 사용 중입니다.</translation>
<translation id="8380167699614421159">이 사이트에서는 방해가 되거나 사용자를 현혹하는 광고를 표시합니다.</translation>
<translation id="8394832520002899662">탭하여 사이트로 돌아가기</translation>
diff --git a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb
index ce40841445a..87ca0e21a2f 100644
--- a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb
+++ b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb
@@ -31,7 +31,7 @@
<translation id="1644574205037202324">Таржымал</translation>
<translation id="1647582022260550163">Уруксаттар чын эле баштапкы абалга келтирилип, cookie файлдары жана сайттагы маалымат тазалансынбы?</translation>
<translation id="1660204651932907780">Сайттарга үн чыгарууга уруксат берилсин (сунушталат)</translation>
-<translation id="1677097821151855053">Cookie файлдары жана башка маалымат сизди эстеп калып, аккаунтка кирүү же жарнамаларды жекелештирүү ж.б. үчүн колдонулат. Бардык сайттардын cookie файлдарын башкаруу үчүн <ph name="BEGIN_LINK" />Жөндөөлөргө<ph name="END_LINK" /> өтүңүз.</translation>
+<translation id="1677097821151855053">Cookie файлдары жана башка маалымат сизди эстеп калып, аккаунтка кирүү же жарнамаларды жекелештирүү ж.б. үчүн колдонулат. Бардык сайттардын cookie файлдарын башкаруу үчүн <ph name="BEGIN_LINK" />Параметрлерге<ph name="END_LINK" /> өтүңүз.</translation>
<translation id="1688867105868176567">Сайттын дайындары тазалансынбы?</translation>
<translation id="169515064810179024">Сайттардын сенсорлорду колдонуусун бөгөттөө</translation>
<translation id="1717218214683051432">Кыймыл сенсорлору</translation>
@@ -68,7 +68,7 @@
<translation id="2253414712144136228"><ph name="NAME_OF_LIST_ITEM" /> өчүрүү</translation>
<translation id="228293613124499805">Сиз баш баккан сайттардын көпчүлүгү параметрлериңизди же сайт менен бөлүшкөн маалыматыңызды түзмөгүңүзгө сакташы мүмкүн. Бул көбүнчө кызматты жакшыртуу максатында аткарылат. Бул параметрди күйүк бойдон калтырууну сунуштайбыз.</translation>
<translation id="2289270750774289114">Сайт жакын жердеги Bluetooth түзмөктөрүн колдонгону жатканда уруксат суралсын (сунушталат)</translation>
-<translation id="2315043854645842844">Кардар тандаган тастыктама операциялык тутумда колдоого алынбайт.</translation>
+<translation id="2315043854645842844">Кардар тандаган тастыктама операциялык системада колдоого алынбайт.</translation>
<translation id="2321958826496381788">Жылмышкычты текстти окуганга ыңгайлуу болгонго чейин сүйрөңүз. Параграфты эки жолу таптаганыңыздан кийин, текст ушундай өлчөмдө көрүнүп калышы керек.</translation>
<translation id="2329473609445770916">Бул сайт кызыккан нерселериңизди аныктап, ал аркылуу башка сайттар сизге ылайыктуу жарнамаларды көрсөтө алат</translation>
<translation id="2359808026110333948">Улантуу</translation>
@@ -135,7 +135,7 @@
<translation id="3386292677130313581">Сайттарга жайгашкан жериңиз тууралуу маалымат берүүдөн мурун уруксат суралсын (сунушталат)</translation>
<translation id="3403537308306431953"><ph name="ZOOM_LEVEL" /> %%</translation>
<translation id="3521663503435878242"><ph name="DOMAIN" /> домениндеги сайттар</translation>
-<translation id="3538390592868664640">Сайттарга айланаңыздын 3D картасын түзүүгө же камераңыздын абалына көз салууга бөгөт коюуңуз</translation>
+<translation id="3538390592868664640">Сайттарга айланаңыздын 3D картасын түзүүгө же камераңыздын абалына көз салууга бөгөт коюңуз</translation>
<translation id="3544058026430919413">Компания cookie файлдарын колдонуп, топтогу аракеттериңизди бөлүшө алган сайттардын тобун аныктай алат. Бул параметр Жашыруун режимде өчүк болот.</translation>
<translation id="3551268116566418498">Жашыруун режимден чыгасызбы?</translation>
<translation id="3586500876634962664">Камера менен микрофонду колдонуу</translation>
@@ -204,7 +204,7 @@
<translation id="4811450222531576619">Булагы жана темасы тууралуу кеңири маалымат</translation>
<translation id="4836046166855586901">Сайт түзмөктү активдүү колдонуп жаткан учур тууралуу билгиси келгенде уруксат суралсын</translation>
<translation id="483914009762354899">Бул домендеги бардык сайттарды камтуу</translation>
-<translation id="4883854917563148705">Башкарылган жөндөөлөрдү баштапкы абалга келтирүүгө болбойт</translation>
+<translation id="4883854917563148705">Башкарылган параметрлерди баштапкы абалга келтирүүгө болбойт</translation>
<translation id="4887024562049524730">Сайттар виртуалдык чындык түзмөктөрүңүздү жана маалыматыңызды колдонгону жатканда уруксат суралсын (сунушталат)</translation>
<translation id="4955223779495905865">Сиз кирген сайт башка сайттардан алынган материалдарды, мисалы, сүрөттөрдү, жарнамаларды жана текстти жалгаштыра алат. Бул сайттар тажрыйбаңызды жекелештирүү үчүн cookie файлдарын жана башка маалыматтарды сакташат.</translation>
<translation id="4962975101802056554">Түзмөктөгү бардык уруксаттар жоюлсун</translation>
diff --git a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb
index 81c4e3010bf..0cc74a59801 100644
--- a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb
+++ b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb
@@ -128,7 +128,7 @@
<translation id="3277252321222022663">Дозволете сајтовите да пристапуваат до сензорите (препорачано)</translation>
<translation id="3285500645985761267">Дозволувај поврзаните сајтови да ја гледаат мојата активност во групата</translation>
<translation id="3295019059349372795">Поглавје 11: Чудесниот смарагден град Оз</translation>
-<translation id="3295602654194328831">Сокриј ги информациите</translation>
+<translation id="3295602654194328831">Скриј ги информациите</translation>
<translation id="3328801116991980348">Информации за веб-локација</translation>
<translation id="3333961966071413176">Сите контакти</translation>
<translation id="3362437373201486687">Скенира за уреди со Bluetooth</translation>
@@ -447,7 +447,7 @@
<translation id="9074739597929991885">Bluetooth</translation>
<translation id="9090268041676521955">Сајтов е во група што може да ја гледа вашата активност. Групата ја дефинираше <ph name="FPS_OWNER" /></translation>
<translation id="9106233582039520022">Да се избришат колачињата?</translation>
-<translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и уште <ph name="NUM_MORE" /> друго}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и уште <ph name="NUM_MORE" /> друго}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и уште <ph name="NUM_MORE" /> други}}</translation>
+<translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и уште <ph name="NUM_MORE" />}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и уште <ph name="NUM_MORE" />}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и уште <ph name="NUM_MORE" />}}</translation>
<translation id="913657688200966289">Вклучете ги дозволите за <ph name="APP_NAME" /> во <ph name="BEGIN_LINK" />Поставки за Android<ph name="END_LINK" />.</translation>
<translation id="9138217887606523162">Тековното зумирање е <ph name="ZOOM_LEVEL" /> %%</translation>
<translation id="9162462602695099906">Страницава е опасна</translation>
diff --git a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb
index fa69c8ee45d..29aa2e875ba 100644
--- a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb
+++ b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb
@@ -139,7 +139,7 @@
<translation id="3544058026430919413">ഗ്രൂപ്പിലെ നിങ്ങളുടെ ആക്റ്റിവിറ്റി പങ്കിടാൻ കുക്കികൾ ഉപയോഗിക്കാവുന്ന സൈറ്റുകളുടെ ഗ്രൂപ്പിനെ കമ്പനിക്ക് നിർവചിക്കാം. ഇത് അദൃശ്യ മോഡിൽ ഓഫാണ്.</translation>
<translation id="3551268116566418498">അദൃശ്യ മോഡ് വിടണോ?</translation>
<translation id="3586500876634962664">ക്യാമറ, മൈക്രോഫോൺ ഉപയോഗം</translation>
-<translation id="358794129225322306">ഒന്നിലേറെ ഫയലുകള്‍ സ്വമേധയാ ഡൗണ്‍‌ലോഡ് ചെയ്യാന്‍ സൈറ്റിനെ അനുവദിക്കുക.</translation>
+<translation id="358794129225322306">ഒന്നിലേറെ ഫയലുകള്‍ സ്വയമേവ ഡൗണ്‍‌ലോഡ് ചെയ്യാന്‍ സൈറ്റിനെ അനുവദിക്കുക.</translation>
<translation id="3594780231884063836">വീഡിയോ മ്യൂട്ട് ചെയ്യുക</translation>
<translation id="3596414637720633074">അദൃശ്യ മോഡിൽ മൂന്നാം കക്ഷി കുക്കികളെ ബ്ലോക്ക് ചെയ്യുക</translation>
<translation id="3600792891314830896">ശബ്‌ദം പ്ലേ ചെയ്യുന്ന സൈറ്റുകളെ മ്യൂട്ട് ചെയ്യുക</translation>
diff --git a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb
index 1b8c7360e3e..ec34c77accc 100644
--- a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb
+++ b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb
@@ -300,7 +300,7 @@
<translation id="6447842834002726250">ကူကီးများ</translation>
<translation id="6467852467360539617">ဒေတာကိုရှင်းပြီး ခွင့်ပြုချက်များ ပြင်ဆင်သတ်မှတ်ရန်</translation>
<translation id="6527303717912515753">မျှဝေရန်</translation>
-<translation id="6545864417968258051">ဘလူးတုသ် ရှာဖွေခြင်း</translation>
+<translation id="6545864417968258051">ဘလူးတုသ် ရှာဖွေရန်</translation>
<translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,plural, =1{<ph name="PERMISSION_1" />၊ <ph name="PERMISSION_2" /> နှင့် နောက်ထပ် <ph name="NUM_MORE" /> ခုကို ပိတ်ထားသည်}other{<ph name="PERMISSION_1" />၊ <ph name="PERMISSION_2" /> နှင့် နောက်ထပ် <ph name="NUM_MORE" /> ခုကို ပိတ်ထားသည်}}</translation>
<translation id="6554732001434021288">ပြီးခဲ့သော <ph name="NUM_DAYS" /> ရက်က နောက်ဆုံး ဝင်ကြည့်ထားသည်</translation>
<translation id="6561560012278703671">ပိုမိုတိတ်ဆိတ်သော မက်ဆေ့ဂျ်ပို့ခြင်းကို အသုံးပြုပါ (သင့်အားမနှောင့်ယှက်စေရန် အကြောင်းကြားချက် အတည်ပြုစနစ်များကို ပိတ်ပေးသည်)</translation>
diff --git a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ne.xtb b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ne.xtb
index f17345d93f0..883b32b43d6 100644
--- a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ne.xtb
+++ b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ne.xtb
@@ -2,7 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="ne">
<translation id="1006017844123154345">अनलाइन खोल्नुहोस्</translation>
-<translation id="1036348656032585052">निस्कृय पार्नुहोस्</translation>
+<translation id="1036348656032585052">अफ गर्नुहोस्</translation>
<translation id="1044891598689252897">साइटहरू सामान्य रूपमा चल्ने छन्</translation>
<translation id="1124090076051167250">यस कार्यले साइट वा एपहरूले तपाईंको होम स्क्रिनमा भण्डारण गरेका <ph name="DATASIZE" /> बराबरका डेटा र कुकीहरू मेटाउने छ।</translation>
<translation id="1178581264944972037">पज गर्नुहोस्</translation>
diff --git a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb
index 30e62090eee..31cde43b1c6 100644
--- a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb
+++ b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb
@@ -86,7 +86,7 @@
<translation id="2490684707762498678">Zarządzane przez <ph name="APP_NAME" /></translation>
<translation id="2498359688066513246">Pomoc i opinie</translation>
<translation id="2501278716633472235">Wróć</translation>
-<translation id="2546283357679194313">Pliki cookie i dane stron</translation>
+<translation id="2546283357679194313">Pliki cookie i dane witryn</translation>
<translation id="2569468611847789653">{COOKIE_COUNT,plural, =1{Zablokowano 1 plik cookie}few{Zablokowano # pliki cookie}many{Zablokowano # plików cookie}other{Zablokowano # pliku cookie}}</translation>
<translation id="2570922361219980984">Dostęp do lokalizacji jest wyłączony też na tym urządzeniu. Włącz go w <ph name="BEGIN_LINK" />Ustawieniach Androida<ph name="END_LINK" />.</translation>
<translation id="257931822824936280">Rozwinięty – kliknij, by zwinąć.</translation>
@@ -118,7 +118,7 @@
<translation id="3115898365077584848">Pokaż informacje</translation>
<translation id="3123473560110926937">Blokowane na niektórych stronach</translation>
<translation id="3143754809889689516">Odtwórz od początku</translation>
-<translation id="3162899666601560689">Strony mogą używać plików cookie dla Twojej wygody, by na przykład zapamiętać Twoje logowanie lub zawartość koszyka</translation>
+<translation id="3162899666601560689">Witryny mogą używać plików cookie dla Twojej wygody, by na przykład zapamiętać Twoje logowanie lub zawartość koszyka</translation>
<translation id="3165022941318558018">Zezwól witrynie na używanie plików cookie innych firm</translation>
<translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> zapisanych danych</translation>
<translation id="3203366800380907218">Z sieci</translation>
@@ -195,7 +195,7 @@
<translation id="4566417217121906555">Wycisz mikrofon</translation>
<translation id="4570913071927164677">Szczegóły</translation>
<translation id="4575264539271661854">Ułatw powiększanie tekstu i obrazów w odwiedzanej witrynie</translation>
-<translation id="4598549027014564149">W trybie incognito witryny nie mogą używać plików cookie do śledzenia Twojej aktywności związanej z przeglądaniem innych witryn, nawet powiązanych. Twoja aktywność związana z przeglądaniem nie służy do personalizowania reklam. W niektórych witrynach mogą nie działać funkcje.</translation>
+<translation id="4598549027014564149">W trybie incognito witryny nie mogą używać plików cookie do śledzenia Twojej aktywności związanej z przeglądaniem innych witryn, nawet powiązanych. Twoja aktywność związana z przeglądaniem nie służy do personalizowania reklam. Funkcje w niektórych witrynach mogą nie działać.</translation>
<translation id="4645575059429386691">Zarządzany przez Twojego rodzica</translation>
<translation id="4670064810192446073">Rzeczywistość wirtualna</translation>
<translation id="4751476147751820511">Czujniki ruchu lub światła</translation>
@@ -246,7 +246,7 @@
<translation id="5505264765875738116">Strony nie mogą prosić o zgodę na wysyłanie powiadomień</translation>
<translation id="5516455585884385570">Otwórz ustawienia powiadomień</translation>
<translation id="5527111080432883924">Pytaj, czy zezwolić stronom na odczytywanie tekstu i obrazów ze schowka (zalecane)</translation>
-<translation id="5545693483061321551">Strony nie mogą używać plików cookie do śledzenia Twojej aktywność związanej z przeglądaniem różnych stron, na przykład w celu personalizowania reklam. W niektórych witrynach mogą nie działać funkcje.</translation>
+<translation id="5545693483061321551">Witryny nie mogą używać plików cookie do śledzenia Twojej aktywności związanej z przeglądaniem różnych witryn, na przykład w celu personalizowania reklam. W niektórych witrynach mogą nie działać funkcje.</translation>
<translation id="5553374991681107062">Najnowsze</translation>
<translation id="5556459405103347317">Odśwież</translation>
<translation id="5596627076506792578">Więcej opcji</translation>
@@ -384,7 +384,7 @@
<translation id="8116925261070264013">Wyciszone</translation>
<translation id="813082847718468539">Wyświetl informacje o witrynie</translation>
<translation id="8131740175452115882">Potwierdź</translation>
-<translation id="8154912474061769055">W wielu witrynach mogą nie działać funkcje</translation>
+<translation id="8154912474061769055">Funkcje w wielu witrynach mogą nie działać</translation>
<translation id="8168435359814927499">Treść</translation>
<translation id="8197286292360124385">Dozwolone: <ph name="PERMISSION_1" /></translation>
<translation id="8200772114523450471">Wznów</translation>
diff --git a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb
index e123b36ebc1..c4908c8942c 100644
--- a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb
+++ b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb
@@ -262,7 +262,7 @@
<translation id="5771720122942595109">Bloqueada: <ph name="PERMISSION_1" /></translation>
<translation id="5804241973901381774">Permissões</translation>
<translation id="5810805850857689118">Essa ação vai apagar todos os dados e cookies de <ph name="ORIGIN" /> e de todos os sites relacionados</translation>
-<translation id="5860033963881614850">Desativado</translation>
+<translation id="5860033963881614850">Desativada</translation>
<translation id="5876056640971328065">Pausar vídeo</translation>
<translation id="5884085660368669834">Preferência do site</translation>
<translation id="5887687176710214216">Última visita: ontem</translation>
diff --git a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb
index 5f2bd65f8dd..5f6cef2df25 100644
--- a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb
+++ b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb
@@ -118,7 +118,7 @@
<translation id="3115898365077584848">Показать информацию</translation>
<translation id="3123473560110926937">Заблокировано на некоторых сайтах</translation>
<translation id="3143754809889689516">Воспроизвести с начала</translation>
-<translation id="3162899666601560689">Сайты могут использовать файлы cookie для вашего удобства, например, чтобы сохранять информацию о товарах в корзине или о том, что вы вошли в аккаунт.</translation>
+<translation id="3162899666601560689">Сайты могут использовать файлы cookie для вашего удобства, например, чтобы вам не приходилось вновь входить в аккаунт или повторно добавлять товары в корзину.</translation>
<translation id="3165022941318558018">Разрешите сайту использовать сторонние файлы cookie.</translation>
<translation id="3198916472715691905">В памяти занято: <ph name="STORAGE_AMOUNT" /></translation>
<translation id="3203366800380907218">Из интернета</translation>
@@ -247,7 +247,7 @@
<translation id="5516455585884385570">Перейти в настройки уведомлений</translation>
<translation id="5527111080432883924">Запрашивать мое разрешение на доступ сайтов к тексту и изображениям, скопированным в буфер обмена (рекомендуется)</translation>
<translation id="5545693483061321551">Сайты не могут использовать файлы cookie, чтобы отслеживать ваши действия в браузере, например для показа персонализированной рекламы. Из-за этого функции некоторых сайтов могут стать недоступными.</translation>
-<translation id="5553374991681107062">По дате</translation>
+<translation id="5553374991681107062">Дата</translation>
<translation id="5556459405103347317">Перезагрузить</translation>
<translation id="5596627076506792578">Ещё</translation>
<translation id="5649053991847567735">Автоматическое скачивание</translation>
diff --git a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb
index 013394723b1..2c3e81e1372 100644
--- a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb
+++ b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb
@@ -7,7 +7,7 @@
<translation id="1124090076051167250">ఇది మీ హోమ్ స్క్రీన్‌పై ఉన్న, సైట్‌లు లేదా యాప్‌ల ద్వారా స్టోర్ చేయబడిన <ph name="DATASIZE" /> డేటా, కుక్కీలను క్లియర్ చేస్తుంది.</translation>
<translation id="1178581264944972037">పాజ్ చేయి</translation>
<translation id="1181037720776840403">తీసివేయండి</translation>
-<translation id="1201402288615127009">తరువాత</translation>
+<translation id="1201402288615127009">తర్వాత</translation>
<translation id="1242008676835033345"><ph name="WEBSITE_URL" />లో పొందుపరచబడింది</translation>
<translation id="1272079795634619415">ఆపు</translation>
<translation id="1289742167380433257">మీ కోసం డేటాను సేవ్ చేయడానికి, ఈ పేజీ ఇమేజ్‌లు Google ద్వారా ఆప్టిమైజ్ చేయబడ్డాయి.</translation>
@@ -110,7 +110,7 @@
<translation id="2932883381142163287">దుర్వినియోగాన్ని రిపోర్ట్ చేయి</translation>
<translation id="2968755619301702150">ప్రమాణపత్రం వ్యూయర్</translation>
<translation id="300526633675317032">ఇది వెబ్‌సైట్ నిల్వలోని మొత్తం <ph name="SIZE_IN_KB" />ను తీసివేస్తుంది.</translation>
-<translation id="3008272652534848354">అనుమతులను రీసెట్ చేయి</translation>
+<translation id="3008272652534848354">అనుమతులను రీసెట్ చేయండి</translation>
<translation id="301521992641321250">ఆటోమేటిక్‌గా బ్లాక్ చేయబడింది</translation>
<translation id="3069226013421428034">నిర్దిష్ట సైట్ కోసం థర్డ్-పార్టీ సైన్-ఇన్‌ను అనుమతిస్తుంది.</translation>
<translation id="3109724472072898302">కుదించబడింది</translation>
@@ -168,7 +168,7 @@
<translation id="3992684624889376114">ఈ పేజీ గురించి</translation>
<translation id="4002066346123236978">శీర్షిక</translation>
<translation id="4008040567710660924">నిర్దిష్ట సైట్ కోసం కుక్కీలను అనుమతించండి.</translation>
-<translation id="4046123991198612571">తరువాత ట్రాక్</translation>
+<translation id="4046123991198612571">తర్వాత ట్రాక్</translation>
<translation id="4149994727733219643">వెబ్ పేజీల కోసం సరళమైన వీక్షణ</translation>
<translation id="4151930093518524179">ఆటోమేటిక్ జూమ్ సెట్టింగ్</translation>
<translation id="4165986682804962316">సైట్ సెట్టింగ్‌లు</translation>
@@ -249,7 +249,7 @@
<translation id="5545693483061321551">వివిధ సైట్‌లలో మీ బ్రౌజింగ్ యాక్టివిటీని చూడటానికి సైట్‌లు మీ కుక్కీలను ఉపయోగించలేవు, ఉదాహరణకు, యాడ్‌లను వ్యక్తిగతీకరించడం. కొన్ని సైట్‌లలోని ఫీచర్‌లు పని చేయకపోవచ్చు.</translation>
<translation id="5553374991681107062">ఇటీవలివి</translation>
<translation id="5556459405103347317">మళ్లీ లోడ్ చేయి</translation>
-<translation id="5596627076506792578">మరిన్ని ఎంపికలు</translation>
+<translation id="5596627076506792578">మరిన్ని ఆప్షన్‌లు</translation>
<translation id="5649053991847567735">ఆటోమేటిక్ డౌన్‌లోడ్‌లు</translation>
<translation id="5668404140385795438">దగ్గరకు జూమ్ చేయడాన్ని నిరోధించడానికి ప్రయత్నించే వెబ్‌సైట్ రిక్వెస్ట్‌ను పట్టించుకోదు</translation>
<translation id="5677928146339483299">బ్లాక్ చేయబడింది</translation>
@@ -269,7 +269,7 @@
<translation id="5916664084637901428">ఆన్ చేయి</translation>
<translation id="5922853908706496913">మీ స్క్రీన్‌ను షేర్ చేయడం</translation>
<translation id="5922967540311291836">థర్డ్-పార్టీ కుక్కీలను బ్లాక్ చేయండి:</translation>
-<translation id="5939518447894949180">రీసెట్ చేయి</translation>
+<translation id="5939518447894949180">రీసెట్ చేయండి</translation>
<translation id="5968921426641056619">వెబ్ అడ్రస్‌ను ఎంటర్ చేయండి</translation>
<translation id="5975083100439434680">దూరంగా జూమ్ చేయి</translation>
<translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation>
@@ -293,7 +293,7 @@
<translation id="6295158916970320988">అన్ని సైట్‌లు</translation>
<translation id="6320088164292336938">వైబ్రేట్ చేయి</translation>
<translation id="6367753977865761591">నిర్దిష్ట సైట్ కోసం థర్డ్-పార్టీ సైన్-ఇన్‌ను బ్లాక్ చేస్తుంది.</translation>
-<translation id="6388207532828177975">క్లియర్ చేసి, రీసెట్ చేయి</translation>
+<translation id="6388207532828177975">క్లియర్ చేసి, రీసెట్ చేయండి</translation>
<translation id="6398765197997659313">ఫుల్-స్క్రీన్‌ నుండి నిష్క్రమించండి</translation>
<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation>
<translation id="6439114592976064011">మీ వర్చువల్ రియాలిటీ పరికరాన్ని, డేటాను ఉపయోగించనివ్వకుండా సైట్‌లను బ్లాక్ చేస్తుంది</translation>
diff --git a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb
index ec8bda2770d..d5ed73000e1 100644
--- a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb
+++ b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb
@@ -31,7 +31,7 @@
<translation id="1644574205037202324">ประวัติการเข้าชม</translation>
<translation id="1647582022260550163">คุณแน่ใจไหมว่าต้องการรีเซ็ตสิทธิ์ รวมถึงล้างคุกกี้และข้อมูลเว็บไซต์</translation>
<translation id="1660204651932907780">อนุญาตให้เว็บไซต์เล่นเสียง (แนะนำ)</translation>
-<translation id="1677097821151855053">คุกกี้และข้อมูลอื่นๆ ของเว็บไซต์ใช้ในการจดจำคุณ เช่น เพื่อลงชื่อเข้าใช้ให้คุณหรือปรับโฆษณาตามโปรไฟล์ของคุณ ดู<ph name="BEGIN_LINK" />การตั้งค่า<ph name="END_LINK" />เพื่อจัดการคุกกี้สำหรับทุกเว็บไซต์</translation>
+<translation id="1677097821151855053">ระบบใช้คุกกี้และข้อมูลของเว็บไซต์ในการจดจำคุณ เช่น เพื่อลงชื่อเข้าใช้ให้คุณหรือปรับโฆษณาตามโปรไฟล์ของคุณ ดู<ph name="BEGIN_LINK" />การตั้งค่า<ph name="END_LINK" />เพื่อจัดการคุกกี้สำหรับทุกเว็บไซต์</translation>
<translation id="1688867105868176567">ล้างข้อมูลเว็บไซต์ไหม</translation>
<translation id="169515064810179024">บล็อกไม่ให้เว็บไซต์เข้าถึงเซ็นเซอร์ตรวจจับการเคลื่อนไหว</translation>
<translation id="1717218214683051432">เซ็นเซอร์ตรวจจับการเคลื่อนไหว</translation>
@@ -136,7 +136,7 @@
<translation id="3403537308306431953"><ph name="ZOOM_LEVEL" /> %%</translation>
<translation id="3521663503435878242">เว็บไซต์ภายใต้ <ph name="DOMAIN" /></translation>
<translation id="3538390592868664640">บล็อกไม่ให้เว็บไซต์สร้างแผนที่ 3 มิติของสิ่งที่อยู่รอบตัวคุณหรือติดตามตำแหน่งของกล้อง</translation>
-<translation id="3544058026430919413">บริษัทสามารถกำหนดกลุ่มเว็บไซต์ที่ใช้คุกกี้เพื่อแชร์กิจกรรมในกลุ่มได้ ตัวเลือกนี้จะปิดไว้ในโหมดไม่ระบุตัวตน</translation>
+<translation id="3544058026430919413">บริษัทสามารถกำหนดกลุ่มเว็บไซต์ที่ใช้คุกกี้เพื่อแชร์กิจกรรมของคุณในกลุ่มได้ ตัวเลือกนี้จะปิดไว้ในโหมดไม่ระบุตัวตน</translation>
<translation id="3551268116566418498">ออกจากโหมดไม่ระบุตัวตนไหม</translation>
<translation id="3586500876634962664">การใช้กล้องและไมโครโฟน</translation>
<translation id="358794129225322306">อนุญาตให้เว็บไซต์ดาวน์โหลดไฟล์หลายไฟล์โดยอัตโนมัติ</translation>
@@ -445,7 +445,7 @@
<translation id="9019902583201351841">มีการจัดการโดยผู้ปกครอง</translation>
<translation id="9039697262778250930">คุณอาจออกจากระบบเว็บไซต์เหล่านี้</translation>
<translation id="9074739597929991885">บลูทูธ</translation>
-<translation id="9090268041676521955">เว็บไซต์นี้อยู่ในกลุ่มที่สามารถดูกิจกรรมของคุณได้ กลุ่มที่ <ph name="FPS_OWNER" /> กำหนดไว้</translation>
+<translation id="9090268041676521955">เว็บไซต์นี้อยู่ในกลุ่มที่สามารถดูกิจกรรมของคุณได้ ซึ่งเป็นกลุ่มที่ <ph name="FPS_OWNER" /> กำหนดไว้</translation>
<translation id="9106233582039520022">ลบคุกกี้ไหม</translation>
<translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" /> <ph name="PERMISSION_2" /> และอีก <ph name="NUM_MORE" /> รายการ}other{<ph name="PERMISSION_1" /> <ph name="PERMISSION_2" /> และอีก <ph name="NUM_MORE" /> รายการ}}</translation>
<translation id="913657688200966289">เปิดการใช้สิทธิ์สำหรับ <ph name="APP_NAME" /> ใน<ph name="BEGIN_LINK" />การตั้งค่า Android<ph name="END_LINK" /></translation>
diff --git a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb
index f3b27938165..4c0b52d2093 100644
--- a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb
+++ b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb
@@ -118,7 +118,7 @@
<translation id="3115898365077584848">Bilgileri Göster</translation>
<translation id="3123473560110926937">Bazı sitelerde engelleniyor</translation>
<translation id="3143754809889689516">Baştan oynat</translation>
-<translation id="3162899666601560689">Siteler size daha iyi bir göz atma deneyimi sunmak, örneğin, oturumunuzu açık tutmak veya alışveriş sepetinizdeki ürünleri hatırlamak için çerez kullanabilir</translation>
+<translation id="3162899666601560689">Siteler size daha iyi bir göz atma deneyimi sunmak, örneğin, oturumunuzu açık tutmak veya alışveriş sepetinizdeki ürünleri hatırlamak için çerez kullanabilir.</translation>
<translation id="3165022941318558018">Bir sitenin, üçüncü taraf çerezlerini kullanmasına izin verin</translation>
<translation id="3198916472715691905"><ph name="STORAGE_AMOUNT" /> depolanmış veri</translation>
<translation id="3203366800380907218">Web'den</translation>
@@ -451,7 +451,7 @@
<translation id="913657688200966289"><ph name="APP_NAME" /> için izinleri açmak üzere <ph name="BEGIN_LINK" />Android Ayarları<ph name="END_LINK" />'nda izinleri açın.</translation>
<translation id="9138217887606523162">Şu anki yakınlaştırma düzeyi %%<ph name="ZOOM_LEVEL" /></translation>
<translation id="9162462602695099906">Bu sayfa tehlikeli</translation>
-<translation id="9201023452444595544">Tüm çevrimdışı veriler temizlenecek</translation>
+<translation id="9201023452444595544">Tüm çevrimdışı veriler temizlenir</translation>
<translation id="930525582205581608">Bu site unutulsun mu?</translation>
<translation id="967624055006145463">Depolanan veriler</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb
index 31a0c79f736..b857d644262 100644
--- a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb
+++ b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb
@@ -322,7 +322,7 @@
<translation id="6912998170423641340">Не дозволяти сайтам переглядати тексти й зображення в буфері обміну</translation>
<translation id="6945221475159498467">Вибрати</translation>
<translation id="6965382102122355670">OK</translation>
-<translation id="6981982820502123353">Спеціальні можливості</translation>
+<translation id="6981982820502123353">Доступність</translation>
<translation id="6992289844737586249">Запитувати, перш ніж дозволити сайтам використовувати мікрофон (рекомендується)</translation>
<translation id="7000754031042624318">Вимкнено в налаштуваннях Android</translation>
<translation id="7016516562562142042">Дозволено для поточної пошукової системи</translation>
diff --git a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb
index 824b91e74ad..b0edb1aa11d 100644
--- a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb
+++ b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb
@@ -141,13 +141,13 @@
<translation id="3586500876634962664">Đang sử dụng máy ảnh và micrô</translation>
<translation id="358794129225322306">Cho phép một trang web tự động tải xuống nhiều tệp.</translation>
<translation id="3594780231884063836">Tắt tiếng video</translation>
-<translation id="3596414637720633074">Chặn các cookie của bên thứ ba trong chế độ Ẩn danh</translation>
+<translation id="3596414637720633074">Chặn cookie của bên thứ ba ở chế độ Ẩn danh</translation>
<translation id="3600792891314830896">Tắt tiếng trên các trang web phát âm thanh</translation>
<translation id="3602290021589620013">Xem trước</translation>
<translation id="3628308229821498208">Cụm từ tìm kiếm đề xuất</translation>
<translation id="3636279694100170143">Các trang web bạn truy cập có thể xác thực bạn là người dùng thực sự chứ không phải là bot</translation>
<translation id="3649190289964910441">Trang web bạn truy cập có thể lưu thông tin qua Chrome để xác thực rằng bạn là người dùng thực sự. Khi bạn tiếp tục duyệt web, các trang web có thể kiểm tra qua Chrome và xác minh, dựa trên thông tin từ trang web đầu tiên, rằng bạn có thể là người dùng đáng tin cậy.</translation>
-<translation id="3744111561329211289">Đồng bộ hóa dưới nền</translation>
+<translation id="3744111561329211289">Đồng bộ hoá trong nền</translation>
<translation id="3763247130972274048">Nhấn đúp vào bên trái hoặc bên phải của video để tua lại/tua đi 10 giây</translation>
<translation id="3794286421982011626">Trang web bạn truy cập có thể lưu thông tin về những việc bạn đang làm để hoạt động như bạn mong muốn – ví dụ: để duy trì trạng thái đăng nhập vào một trang web hoặc lưu các mặt hàng vào giỏ hàng. Thông thường, các trang web lưu thông tin này tạm thời trên thiết bị của bạn.</translation>
<translation id="3797520601150691162">Không áp dụng giao diện tối cho một trang web cụ thể</translation>
@@ -159,11 +159,11 @@
<translation id="385051799172605136">Quay lại</translation>
<translation id="3859306556332390985">Tìm kiếm tiến</translation>
<translation id="3895926599014793903">Buộc bật thu phóng</translation>
-<translation id="3908288065506437185">Chặn cookie của bên thứ ba ở Chế độ ẩn danh</translation>
+<translation id="3908288065506437185">Chặn cookie của bên thứ ba ở chế độ Ẩn danh</translation>
<translation id="3918378745482005425">Một số tính năng có thể không hoạt động. Các trang web có liên quan vẫn có thể sử dụng cookie của bên thứ ba.</translation>
<translation id="3955193568934677022">Cho phép trang web phát nội dung được bảo vệ (được đề xuất)</translation>
<translation id="3967822245660637423">Đã tải xuống xong</translation>
-<translation id="3987993985790029246">Sao chép đường liên kết</translation>
+<translation id="3987993985790029246">Sao chép liên kết</translation>
<translation id="3991845972263764475"><ph name="BYTES_DOWNLOADED_WITH_UNITS" />/?</translation>
<translation id="3992684624889376114">Giới thiệu về trang này</translation>
<translation id="4002066346123236978">Tiêu đề</translation>
@@ -416,7 +416,7 @@
<translation id="8525306231823319788">Toàn màn hình</translation>
<translation id="8528440122773422556">Thao tác này sẽ xoá toàn bộ dữ liệu và cookie được lưu trữ bởi tất cả trang web trong <ph name="ORIGIN" /> hoặc ứng dụng liên kết với nhóm này trên Màn hình chính</translation>
<translation id="8541410041357371550">Trang web này thu thập thông tin về chủ đề quảng cáo bạn quan tâm qua Chrome để hiển thị cho bạn những quảng cáo phù hợp hơn</translation>
-<translation id="8564613706851221529">{COUNT,plural, =1{Đã cho phép cookie cho trang web của <ph name="FPS_MEMBERS_COUNT" /> <ph name="FPS_OWNER" />}other{Đã cho phép cookie cho các trang web của <ph name="FPS_MEMBERS_COUNT" /> <ph name="FPS_OWNER" />}}</translation>
+<translation id="8564613706851221529">{COUNT,plural, =1{Đã cho phép cookie với <ph name="FPS_MEMBERS_COUNT" /> trang web của <ph name="FPS_OWNER" />}other{Đã cho phép cookie với <ph name="FPS_MEMBERS_COUNT" /> trang web của <ph name="FPS_OWNER" />}}</translation>
<translation id="857943718398505171">Được phép (nên dùng)</translation>
<translation id="8609465669617005112">Di chuyển lên</translation>
<translation id="8676374126336081632">Xóa văn bản nhập</translation>
diff --git a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb
index 0ca511b53f7..5020513a885 100644
--- a/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb
+++ b/chromium/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb
@@ -149,7 +149,7 @@
<translation id="3649190289964910441">您访问的网站可将信息保存在 Chrome 中,以用来验证您是真实用户。随着您继续浏览,其他网站可通过从 Chrome 中获取第一个网站提供的信息,确认您可能是受信任的用户。</translation>
<translation id="3744111561329211289">后台同步</translation>
<translation id="3763247130972274048">在视频左侧或右侧点按两次即可跳过 10 秒</translation>
-<translation id="3794286421982011626">您访问的网站可以保存与您正在进行的浏览活动有关的信息,以便网站能按预期运行 - 例如,以便保持您在网站上的登录状态或者保存您的购物车内的商品。网站通常会将这类信息暂时保存在您的设备上。</translation>
+<translation id="3794286421982011626">您访问的网站可以保存与您正在进行的浏览活动有关的信息,以便确保网站能按预期运行,例如保持您在网站上的登录状态或者保存您的购物车内的商品。网站通常会将这类信息暂时保存在您的设备上。</translation>
<translation id="3797520601150691162">不对特定网站应用深色主题</translation>
<translation id="3803367742635802571">您访问的网站可能会停止按预期运行</translation>
<translation id="3804247818991980532"><ph name="TYPE_1" />。<ph name="TYPE_2" />。</translation>
@@ -284,7 +284,7 @@
<translation id="6181444274883918285">添加例外网站</translation>
<translation id="6192792657125177640">例外</translation>
<translation id="6196640612572343990">阻止第三方 Cookie</translation>
-<translation id="6205314730813004066">广告隐私设置</translation>
+<translation id="6205314730813004066">广告隐私权设置</translation>
<translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" />选项</translation>
<translation id="6231752747840485235">卸载“<ph name="APP_NAME" />”?</translation>
<translation id="6262191102408817757">基于您的上一个标签页</translation>
diff --git a/chromium/components/certificate_transparency/data/log_list.json b/chromium/components/certificate_transparency/data/log_list.json
index b3a206f85c9..adf145837de 100644
--- a/chromium/components/certificate_transparency/data/log_list.json
+++ b/chromium/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@
{
- "version": "20.38",
- "log_list_timestamp": "2023-04-13T12:54:19Z",
+ "version": "20.51",
+ "log_list_timestamp": "2023-04-25T12:56:12Z",
"operators": [
{
"name": "Google",
diff --git a/chromium/components/guest_view/browser/guest_view_base.cc b/chromium/components/guest_view/browser/guest_view_base.cc
index 583c6d49455..d2ea8b7ce3f 100644
--- a/chromium/components/guest_view/browser/guest_view_base.cc
+++ b/chromium/components/guest_view/browser/guest_view_base.cc
@@ -128,6 +128,9 @@ class GuestViewBase::OpenerLifetimeObserver : public WebContentsObserver {
void WebContentsDestroyed() override {
// If the opener is destroyed and the guest has not been attached, then
// destroy the guest.
+ // Note that the guest contents may be owned by content/ at this point. In
+ // this case, we expect content/ to safely destroy the contents without
+ // accessing delegate methods of the destroyed guest.
// Destroys `this`.
DestroyGuestIfUnattached(guest_);
}
@@ -919,4 +922,9 @@ content::RenderFrameHost* GuestViewBase::GetGuestMainFrame() const {
return web_contents()->GetPrimaryMainFrame();
}
+base::WeakPtr<content::BrowserPluginGuestDelegate>
+GuestViewBase::GetGuestDelegateWeakPtr() {
+ return weak_ptr_factory_.GetWeakPtr();
+}
+
} // namespace guest_view
diff --git a/chromium/components/guest_view/browser/guest_view_base.h b/chromium/components/guest_view/browser/guest_view_base.h
index c87e090e4c9..609d1bf9a64 100644
--- a/chromium/components/guest_view/browser/guest_view_base.h
+++ b/chromium/components/guest_view/browser/guest_view_base.h
@@ -354,6 +354,8 @@ class GuestViewBase : public content::BrowserPluginGuestDelegate,
std::unique_ptr<content::WebContents> CreateNewGuestWindow(
const content::WebContents::CreateParams& create_params) final;
content::WebContents* GetOwnerWebContents() final;
+ base::WeakPtr<content::BrowserPluginGuestDelegate> GetGuestDelegateWeakPtr()
+ final;
// WebContentsDelegate implementation.
void ActivateContents(content::WebContents* contents) final;
diff --git a/chromium/components/javascript_dialogs/android/translations/javascript_dialogs_android_strings_am.xtb b/chromium/components/javascript_dialogs/android/translations/javascript_dialogs_android_strings_am.xtb
index 52e21a617f2..f98af4b25d1 100644
--- a/chromium/components/javascript_dialogs/android/translations/javascript_dialogs_android_strings_am.xtb
+++ b/chromium/components/javascript_dialogs/android/translations/javascript_dialogs_android_strings_am.xtb
@@ -1,6 +1,6 @@
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="am">
-<translation id="1623104350909869708">ይህ ገጽ ተጨማሪ መገናኛዎችን እንዳይፈጥር አግድ</translation>
+<translation id="1623104350909869708">ይህ ገፅ ተጨማሪ መገናኛዎችን እንዳይፈጥር አግድ</translation>
<translation id="2677748264148917807">ለቅቀህ ውጣ</translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/components/permissions/android/translations/permissions_android_strings_kn.xtb b/chromium/components/permissions/android/translations/permissions_android_strings_kn.xtb
index 23a4a63e750..7085552755c 100644
--- a/chromium/components/permissions/android/translations/permissions_android_strings_kn.xtb
+++ b/chromium/components/permissions/android/translations/permissions_android_strings_kn.xtb
@@ -2,7 +2,7 @@
<!DOCTYPE translationbundle>
<translationbundle lang="kn">
<translation id="1569387923882100876">ಸಂಪರ್ಕಿಸಲಾದ ಸಾಧನ</translation>
-<translation id="1612196535745283361">ಸಾಧನಗಳನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಲು Chrome ಗೆ ಸ್ಥಳ ಪ್ರವೇಶ ಅಗತ್ಯವಿದೆ. ಸ್ಥಳ ಪ್ರವೇಶವನ್ನು <ph name="BEGIN_LINK" />
+<translation id="1612196535745283361">ಸಾಧನಗಳನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಲು Chrome ಗೆ ಸ್ಥಳ ಆ್ಯಕ್ಸೆಸ್ ಅಗತ್ಯವಿದೆ. ಸ್ಥಳ ಪ್ರವೇಶವನ್ನು <ph name="BEGIN_LINK" />
ಈ ಸಾಧನಕ್ಕೆ ಆಫ್ ಮಾಡಲಾಗಿದೆ<ph name="END_LINK" />.</translation>
<translation id="1769234867324334094">ಈ ಸೈಟ್‌ಗಾಗಿ ನಿಮ್ಮ ಕ್ಯಾಮರಾವನ್ನು ಪ್ರವೇಶಿಸಲು <ph name="APP_NAME" /> ಗೆ ಅನುಮತಿಯ ಅಗತ್ಯವಿದೆ.</translation>
<translation id="1993768208584545658"><ph name="SITE" /> ಜೋಡಿಸಲು ಬಯಸುತ್ತದೆ</translation>
@@ -15,13 +15,13 @@
<translation id="4915549754973153784">ಸಾಧನಗಳಿಗೆ ಸ್ಕ್ಯಾನ್ ಮಾಡುವಾಗ <ph name="BEGIN_LINK" />ಸಹಾಯ ಪಡೆಯಿರಿ<ph name="END_LINK" />...</translation>
<translation id="4925793601605263825">ಈ ಸೈಟ್‌ಗಾಗಿ ನಿಮ್ಮ ಮೈಕ್ರೊಫೋನ್ ಅನ್ನು ಪ್ರವೇಶಿಸಲು <ph name="APP_NAME" /> ಗೆ ಅನುಮತಿಯ ಅಗತ್ಯವಿದೆ.</translation>
<translation id="5230560987958996918">ಸಮೀಪದಲ್ಲಿರುವ ಬ್ಲೂಟೂತ್ ಸಾಧನಗಳಿಗಾಗಿ ಸ್ಕ್ಯಾನ್ ಮಾಡಲು <ph name="SITE" /> ಬಯಸುತ್ತದೆ. ಈ ಕೆಳಗಿನ ಸಾಧನಗಳು ಕಂಡುಬಂದಿವೆ:</translation>
-<translation id="5527082711130173040">ಸಾಧನಗಳನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಲು, Chrome ಗೆ ಸ್ಥಳ ಪ್ರವೇಶ ಅಗತ್ಯವಿದೆ. <ph name="BEGIN_LINK1" />ಅನುಮತಿಗಳನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡಿ<ph name="END_LINK1" />. ಸ್ಥಳ ಪ್ರವೇಶವನ್ನು ಸಹ <ph name="BEGIN_LINK2" />ಈ ಸಾಧನಕ್ಕೆ ಆಫ್ ಮಾಡಲಾಗಿದೆ<ph name="END_LINK2" />.</translation>
+<translation id="5527082711130173040">ಸಾಧನಗಳನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಲು, Chrome ಗೆ ಸ್ಥಳ ಆ್ಯಕ್ಸೆಸ್ ಅಗತ್ಯವಿದೆ. <ph name="BEGIN_LINK1" />ಅನುಮತಿಗಳನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡಿ<ph name="END_LINK1" />. ಸ್ಥಳ ಆ್ಯಕ್ಸೆಸ್ ಸಹ <ph name="BEGIN_LINK2" />ಈ ಸಾಧನಕ್ಕೆ ಆಫ್ ಮಾಡಲಾಗಿದೆ<ph name="END_LINK2" />.</translation>
<translation id="5817918615728894473">ಜೋಡಿಸು</translation>
<translation id="5858741533101922242">ಬ್ಲೂಟೂತ್ ಅಡಾಪ್ಟರ್ ಆನ್ ಮಾಡಲು Chrome ಗೆ ಸಾಧ್ಯವಾಗಲಿಲ್ಲ</translation>
<translation id="5860491529813859533">ಆನ್ ಮಾಡಿ</translation>
<translation id="6049776452963514597">ಈ ಸೈಟ್‌ಗಾಗಿ ನಿಮ್ಮ ಕ್ಯಾಮರಾ ಮತ್ತು ಮೈಕ್ರೊಫೋನ್ ಪ್ರವೇಶಿಸಲು <ph name="APP_NAME" /> ಗೆ ಅನುಮತಿಯ ಅಗತ್ಯವಿದೆ.</translation>
<translation id="6092062101542170135">ಮುಂದುವರಿಸಲು, Android ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ NFC ಆನ್ ಮಾಡಿ</translation>
-<translation id="6656545060687952787">ಸಾಧನಗಳನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಲು Chrome ಗೆ ಸ್ಥಳ ಪ್ರವೇಶ ಅಗತ್ಯವಿದೆ. <ph name="BEGIN_LINK" />ಅನುಮತಿಗಳನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡಿ<ph name="END_LINK" /></translation>
+<translation id="6656545060687952787">ಸಾಧನಗಳನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಲು Chrome ಗೆ ಸ್ಥಳ ಆ್ಯಕ್ಸೆಸ್ ಅಗತ್ಯವಿದೆ. <ph name="BEGIN_LINK" />ಅನುಮತಿಗಳನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡಿ<ph name="END_LINK" /></translation>
<translation id="7146360184282545445">ನಿಮ್ಮ ಸುತ್ತಲಿನ ಪರಿಸರದ 3D ನಕ್ಷೆಯನ್ನು ರಚಿಸುವುದಕ್ಕಾಗಿ ನಿಮ್ಮ ಕ್ಯಾಮರಾವನ್ನು ಪ್ರವೇಶಿಸಲು <ph name="APP_NAME" /> ಗೆ ಅನುಮತಿಯ ಅಗತ್ಯವಿದೆ.</translation>
<translation id="7624880197989616768"><ph name="BEGIN_LINK1" />ಸಹಾಯ ಪಡೆಯಿರಿ<ph name="END_LINK1" /> ಅಥವಾ <ph name="BEGIN_LINK2" />ಮರು-ಸ್ಕ್ಯಾನ್‌ಮಾಡಿ<ph name="END_LINK2" /></translation>
<translation id="781351614677332494">ಈ ಸೈಟ್ ಜೊತೆಗೆ ನಿಮ್ಮ ಸ್ಥಳವನ್ನು ಹಂಚಿಕೊಳ್ಳಲು <ph name="APP_NAME" /> ಗೆ ನಿಮ್ಮ ಸ್ಥಳದ ಪ್ರವೇಶದ ಅಗತ್ಯವಿದೆ.</translation>
diff --git a/chromium/components/strings/components_chromium_strings_am.xtb b/chromium/components/strings/components_chromium_strings_am.xtb
index 6c30e442365..67d48bd6405 100644
--- a/chromium/components/strings/components_chromium_strings_am.xtb
+++ b/chromium/components/strings/components_chromium_strings_am.xtb
@@ -3,7 +3,7 @@
<translationbundle lang="am">
<translation id="130631256467250065">ለውጦችዎ መሣሪያዎን ዳግም በሚያስጀምሩበት ቀጣዩ ጊዜ ላይ ይተገበራሉ።</translation>
<translation id="275588974610408078">የብልሽት ሪፖርት በChromium ውስጥ አይገኝም።</translation>
-<translation id="3064346599913645280">ደህንነቱ የተጠበቀ የChromium ገጽ እየተመለከቱ ነው</translation>
+<translation id="3064346599913645280">ደህንነቱ የተጠበቀ የChromium ገፅ እየተመለከቱ ነው</translation>
<translation id="358997566136285270">የChromium ዓርማ</translation>
<translation id="4365115785552740256">Chromium በ<ph name="BEGIN_LINK_CHROMIUM" />Chromium<ph name="END_LINK_CHROMIUM" /> ክፍት ምንጭ ፕሮጀክት እና በሌላ <ph name="BEGIN_LINK_OSS" />ክፍት ምንጭ ሶፍትዌር<ph name="END_LINK_OSS" /> እውን ሊሆን ችሏል።</translation>
<translation id="4559775032954821361">ወደ
@@ -16,7 +16,7 @@
&gt;
የላን ቅንብሮች
ይሂዱና የ«ለእርስዎ ላን ተኪ አገልጋይ ይጠቀሙ»ን አመልካች ሳጥኑን አይምረጡ።</translation>
-<translation id="4622039161600275920">ይህ ገጽ በChromium ታግዷል</translation>
+<translation id="4622039161600275920">ይህ ገፅ በChromium ታግዷል</translation>
<translation id="48558539577516920">Chromium በኬላ ወይም የጸረ-ቫይረስ ቅንብሮችዎን አውታረ መረቡን እንዲደርስበት
ይፍቀዱለት።</translation>
<translation id="580822234363523061">ወደ
diff --git a/chromium/components/strings/components_chromium_strings_mr.xtb b/chromium/components/strings/components_chromium_strings_mr.xtb
index 9f48e36ed17..c4d0bb4359f 100644
--- a/chromium/components/strings/components_chromium_strings_mr.xtb
+++ b/chromium/components/strings/components_chromium_strings_mr.xtb
@@ -3,7 +3,7 @@
<translationbundle lang="mr">
<translation id="130631256467250065">तुम्ही आपल्या डिव्हाइसचा पुढील वेळी पुनरारंभ कराल तेव्हा तुमचे बदल प्रभावी होतील.</translation>
<translation id="275588974610408078">Chromium मध्ये क्रॅश अहवाल उपलब्ध नाही.</translation>
-<translation id="3064346599913645280">तुम्ही एक सुरक्षित Chromium पृष्ठ पाहत आहात</translation>
+<translation id="3064346599913645280">तुम्ही एक सुरक्षित Chromium पेज पाहत आहात</translation>
<translation id="358997566136285270">Chromium लोगो</translation>
<translation id="4365115785552740256">Chromium हे <ph name="BEGIN_LINK_CHROMIUM" />Chromium<ph name="END_LINK_CHROMIUM" /> खुला स्रोत प्रकल्प आणि इतर <ph name="BEGIN_LINK_OSS" />खुले स्रोत सॉफ्टवेअर<ph name="END_LINK_OSS" /> द्वारे बनवणे शक्य झाले.</translation>
<translation id="4559775032954821361">Chromium मेनू &gt;
diff --git a/chromium/components/strings/components_google_chrome_strings_am.xtb b/chromium/components/strings/components_google_chrome_strings_am.xtb
index 9c5b2e9ea13..3a4a927903f 100644
--- a/chromium/components/strings/components_google_chrome_strings_am.xtb
+++ b/chromium/components/strings/components_google_chrome_strings_am.xtb
@@ -6,10 +6,10 @@
<translation id="1635457557763038537">ለውጦችዎ Chrome ዳግም በሚያስጀምሩበት ቀጣዩ ጊዜ ላይ ይተገበራሉ።</translation>
<translation id="2447485272386224171">Chrome በ<ph name="BEGIN_LINK_CHROMIUM" />Chromium<ph name="END_LINK_CHROMIUM" /> ክፍት ምንጭ ፕሮጀክት እና በሌላ <ph name="BEGIN_LINK_OSS" />ክፍት ምንጭ ሶፍትዌር<ph name="END_LINK_OSS" /> ሊሰራ ችሏል።</translation>
<translation id="2588322182880276190">የChrome ዓርማ</translation>
-<translation id="3444832043240812445">ይህ ገጽ <ph name="BEGIN_LINK" />የብልሽት ሪፖርት ማድረግ<ph name="END_LINK" />ን ካነቁ የቅርብ ጊዜ ብልሽቶችዎን ብቻ ነው መረጃ የሚያሳየው።</translation>
+<translation id="3444832043240812445">ይህ ገፅ <ph name="BEGIN_LINK" />የብልሽት ሪፖርት ማድረግ<ph name="END_LINK" />ን ካነቁ የቅርብ ጊዜ ብልሽቶችዎን ብቻ ነው መረጃ የሚያሳየው።</translation>
<translation id="3875312571075912821">Chrome በኬላ ወይም የጸረ-ቫይረስ ቅንብሮችዎን ውስጥ አውታረ መረቡን እንዲደርስበት
ይፍቀዱለት።</translation>
-<translation id="5005121315113832363">ይህ ገጽ በChrome ታግዷል</translation>
+<translation id="5005121315113832363">ይህ ገፅ በChrome ታግዷል</translation>
<translation id="6011049234605203654">ወደ
የChrome ምናሌ &gt;
<ph name="SETTINGS_TITLE" />
@@ -35,7 +35,7 @@
&gt;
የላን ቅንብሮች
ይሂዱና «ለእርስዎ ላን ተኪ አገልጋይ ይጠቀሙ»ን አይምረጡ።</translation>
-<translation id="7230956101631259640">ደህንነቱ የተጠበቀ የChrome ገጽ እየተመለከቱ ነው</translation>
+<translation id="7230956101631259640">ደህንነቱ የተጠበቀ የChrome ገፅ እየተመለከቱ ነው</translation>
<translation id="8187289872471304532">ወደ
መተግበሪያዎች &gt; የስርዓት ምርጫዎች &gt; አውታረ መረብ &gt; የላቁ &gt; ተኪዎች
ይሂዱና የተመረጡ ማናቸውም ተኪዎችን አይምረጡ።</translation>
diff --git a/chromium/components/strings/components_google_chrome_strings_mr.xtb b/chromium/components/strings/components_google_chrome_strings_mr.xtb
index e6e4791fcef..26fcd3e6412 100644
--- a/chromium/components/strings/components_google_chrome_strings_mr.xtb
+++ b/chromium/components/strings/components_google_chrome_strings_mr.xtb
@@ -4,7 +4,7 @@
<translation id="1016765312371154165">Chrome योग्यरित्या बंद झाले नाही.</translation>
<translation id="130631256467250065">तुम्ही आपल्या डिव्हाइसचा पुढील वेळी पुनरारंभ कराल तेव्हा तुमचे बदल प्रभावी होतील.</translation>
<translation id="1635457557763038537">पुढील वेळी तुम्ही Chrome पुन्हा लाँच केल्यानंतर तुमचे बदल लागू होतील.</translation>
-<translation id="2447485272386224171"><ph name="BEGIN_LINK_CHROMIUM" />Chromium<ph name="END_LINK_CHROMIUM" /> मुक्त-स्रोत प्रोजेक्ट आणि इतर <ph name="BEGIN_LINK_OSS" />मुक्त स्रोत सॉफ्टवेअर<ph name="END_LINK_OSS" /> द्वारे Chrome ची निर्मिती करणे शक्य झाले.</translation>
+<translation id="2447485272386224171"><ph name="BEGIN_LINK_CHROMIUM" />Chromium<ph name="END_LINK_CHROMIUM" /> मुक्त स्रोत प्रोजेक्ट आणि इतर <ph name="BEGIN_LINK_OSS" />मुक्त स्रोत सॉफ्टवेअर<ph name="END_LINK_OSS" /> द्वारे Chrome ची निर्मिती करणे शक्य झाले.</translation>
<translation id="2588322182880276190">Chrome लोगो</translation>
<translation id="3444832043240812445">हे पेज तुम्ही <ph name="BEGIN_LINK" />कॅशे अहवाल सुरू<ph name="END_LINK" /> केल्यास केवळ तुम्हाला अलीकडील क्रॅशची माहिती दाखवते.</translation>
<translation id="3875312571075912821">तुमच्या फायरवॉल किंवा अँटीव्हायरस सेटिंग्जमधील नेटवर्क ॲक्सेस करण्यास
diff --git a/chromium/components/strings/components_strings_am.xtb b/chromium/components/strings/components_strings_am.xtb
index b36a85293ad..75d895375e8 100644
--- a/chromium/components/strings/components_strings_am.xtb
+++ b/chromium/components/strings/components_strings_am.xtb
@@ -4,7 +4,7 @@
<translation id="1003222766972176318">ማስታወሻ፦ የተቀመጠ ቅናሽ ይገኛል</translation>
<translation id="1008557486741366299">አሁን አይደለም</translation>
<translation id="100957008357583611">የእርስዎን አካባቢ ይጠቀሙ?</translation>
-<translation id="1010200102790553230">በኋላ ላይ ገጽ ጫን</translation>
+<translation id="1010200102790553230">በኋላ ላይ ገፅ ጫን</translation>
<translation id="1011206368273183593">ፋይሎችን በማዘጋጀት ላይ</translation>
<translation id="1015730422737071372">ተጨማሪ ዝርዝሮችን ያቅርቡ</translation>
<translation id="1019413721762100891">ጠፍቷል</translation>
@@ -20,12 +20,12 @@
<ph name="END_LIST" /></translation>
<translation id="1036348656032585052">አጥፋ</translation>
<translation id="1036881361735705143">ሲ4 ፖስታ</translation>
-<translation id="1036982837258183574">ከሙሉ ማያ ገጽ ለመውጣት |<ph name="ACCELERATOR" />|ን ይጫኑ</translation>
+<translation id="1036982837258183574">ከሙሉ ማያ ገፅ ለመውጣት |<ph name="ACCELERATOR" />|ን ይጫኑ</translation>
<translation id="1038106730571050514">የአስተያየት ጥቆማዎችን አሳይ</translation>
<translation id="1038842779957582377">ያልታወቀ ስም</translation>
<translation id="1041998700806130099">የስራ ሉህ መልዕክት</translation>
<translation id="1043382569739532657">ድጎማዎች፣ ስኮላርሺፖች እና የገንዘብ ድጋፍ</translation>
-<translation id="1048785276086539861">ማብራሪያዎችን ሲያርትዑ ይህ ሰነድ ወደ የነጠላ ገጽ እይታ ይመለሳል</translation>
+<translation id="1048785276086539861">ማብራሪያዎችን ሲያርትዑ ይህ ሰነድ ወደ የነጠላ ገፅ እይታ ይመለሳል</translation>
<translation id="1050038467049342496">ሌሎች መተግበሪያዎችን ይዝጉ</translation>
<translation id="1053959602163383901"><ph name="PROVIDER_ORIGIN" />ን በሚጠቀሙ ድር ጣቢያዎች ላይ በአረጋጋጭ መሣሪያ ማረጋገጥን መርጠዋል። ይህ አቅራቢ ስለእርስዎ የመክፈያ ዘዴ መረጃ አከማችቶ ሊሆን ይችላል። እርስዎ ይህንን <ph name="LINK_TEXT" /> ይችላሉ።</translation>
<translation id="1055184225775184556">&amp;አክልን ቀልብስ</translation>
@@ -60,7 +60,7 @@
<translation id="1123753900084781868">የቀጥታ መግለጫ ጽሁፍ አሁን ላይ አይገኝም</translation>
<translation id="1125573121925420732">ማስጠንቀቂያዎች ድርጣቢያዎች የእነርሱን ደህንነት በሚያዘምኑበት ጊዜ የተለመዱ ሊሆኑ ይችላሉ። ይህ በቅርቡ መሻሻል አለበት።</translation>
<translation id="112840717907525620">የመምሪያ መሸጎጫ እሺ</translation>
-<translation id="1130564665089811311">የገጽ ተርጉም አዝራር፣ ይህን ገጽ በGoogle ትርጉም ለመተርጎም አስገባን ይጫኑ።</translation>
+<translation id="1130564665089811311">የገፅ ተርጉም አዝራር፣ ይህን ገፅ በGoogle ትርጉም ለመተርጎም አስገባን ይጫኑ።</translation>
<translation id="1131264053432022307">እርስዎ የቀዱት ምስል</translation>
<translation id="1142846828089312304">ማንነትን በማያሳውቅ ሁነታ ላይ የሶስተኛ ወገን ኩኪዎችን ያግዱ</translation>
<translation id="1147769322402934017">የመስመር ላይ ምስል ማዕከለ-ስዕላት</translation>
@@ -71,7 +71,7 @@
<translation id="115926840831309955">የእርስዎን CVC ይፈትሹ እና እንደገና ይሞክሩ ወይም የአገልግሎት ማብቂያ ቀኑን ያዘምኑ</translation>
<translation id="1161325031994447685">ከWi-Fi ጋር ዳግም በማገናኘት</translation>
<translation id="1165039591588034296">ስህተት</translation>
-<translation id="1165174597379888365">ገጽ ተጎብኝቷል</translation>
+<translation id="1165174597379888365">ገፅ ተጎብኝቷል</translation>
<translation id="1165852471352757509">የቲቪ ዘጋቢ ፊልም እና ልብ ወለድ ያልሆኑ</translation>
<translation id="1174644974616730562">#1 የቻይና ፖስታ</translation>
<translation id="1174723505405632867"><ph name="EMBEDDED_URL" /> ኩኪዎችን እና የጣቢያ ውሂብን በ<ph name="TOP_LEVEL_URL" /> ላይ መጠቀም እንዲችል መፍቀድ ይፈልጋሉ?
@@ -185,7 +185,7 @@
<translation id="1380591466760231819">የደብዳቤ እጥፋት</translation>
<translation id="138218114945450791">ፈካ ያለ ሰማያዊ</translation>
<translation id="1382194467192730611">በእርስዎ አስተዳዳሪ የተፈቀደ የዩኤስቢ መሣሪያ</translation>
-<translation id="1382378825779654399">በማንኛውም ጣቢያ ላይ ዋጋው ከቀነሰ የኢሜይል ማንቂያዎችን ያገኛሉ። ይህ ገጽ ወደ <ph name="LAST_BOOKMARKS_FOLDER" /> ይቀመጣል።</translation>
+<translation id="1382378825779654399">በማንኛውም ጣቢያ ላይ ዋጋው ከቀነሰ የኢሜይል ማንቂያዎችን ያገኛሉ። ይህ ገፅ ወደ <ph name="LAST_BOOKMARKS_FOLDER" /> ይቀመጣል።</translation>
<translation id="1384725838384960382">ደህንነቱ የተጠበቀ የክፍያ የመግቢያ ማስረጃ ማረጋገጫ ሉህ</translation>
<translation id="1386623374109090026">ማብራሪያዎች</translation>
<translation id="1391289752476847787">አክሲዮኖች እና ቦንዶች</translation>
@@ -206,7 +206,7 @@
<translation id="142858679511221695">የደመና ተጠቃሚ</translation>
<translation id="1428729058023778569">ይህ ጣቢያ ኤችቲቲፒኤስ ስለማይደግፍ ይህን ማስጠንቀቂያ እያዩ ነው። <ph name="BEGIN_LEARN_MORE_LINK" />የበለጠ ለመረዳት<ph name="END_LEARN_MORE_LINK" /></translation>
<translation id="1430915738399379752">አትም</translation>
-<translation id="1432187715652018471">ገጽ የአገልግሎት ተቆጣጣሪን መጫን ይፈልጋል።</translation>
+<translation id="1432187715652018471">ገፅ የአገልግሎት ተቆጣጣሪን መጫን ይፈልጋል።</translation>
<translation id="1432581352905426595">የፍለጋ ፕሮግራሞችን ያቀናብሩ</translation>
<translation id="1435940442311036198">አንድ የይለፍ ቁልፍን በተለየ መሣሪያ ላይ ይጠቀሙ</translation>
<translation id="1436185428532214179">በመሣሪያዎ ላይ ያሉ ፋይሎችን እና አቃፊዎችን ለማርትዕ መጠየቅ ይችላል</translation>
@@ -241,7 +241,7 @@
<translation id="1501859676467574491">ከእርስዎ የGoogle መለያ ካርዶችን አሳይ</translation>
<translation id="150536342253161096">አካባቢያዊ ዜና</translation>
<translation id="1507202001669085618">&lt;p&gt;መስመር ላይ መሆን ከመቻልዎ በፊት በመለያ መግባት የሚያስፈልግበት የWi-Fi መግቢያ እየተጠቀሙ ከሆኑ ይህን ስህተት ይመለከታሉ።&lt;/p&gt;
- &lt;p&gt;ይህን ስህተት ለመፍታት ለመክፈት እየሞከሩ ባለው ገጽ ላይ &lt;strong&gt;ተገናኝ&lt;/strong&gt;ን ጠቅ ያድርጉ።&lt;/p&gt;</translation>
+ &lt;p&gt;ይህን ስህተት ለመፍታት ለመክፈት እየሞከሩ ባለው ገፅ ላይ &lt;strong&gt;ተገናኝ&lt;/strong&gt;ን ጠቅ ያድርጉ።&lt;/p&gt;</translation>
<translation id="1507780850870535225">የመሬት ገጽታ ንድፍ</translation>
<translation id="1513706915089223971">የታሪክ ግቤቶች ዝርዝር</translation>
<translation id="1516097932025103760">የተመሰጠረ ይሆናል፣ ደህንነቱ በተጠበቀ ሁኔታ ይቀመጣል እና የካርድ ማረጋገጫ ኮዱ በፍጹም አይከማችም።</translation>
@@ -252,9 +252,9 @@
<translation id="1527263332363067270">ግንኙነትን በመጠበቅ ላይ…</translation>
<translation id="1529789484829130889">መሳቢያ 8</translation>
<translation id="1530707389502320859">አሁን ለመጎብኘት የሞከሩት ጣቢያ የሐስት ይመስላል። አጥቂዎች አንዳንድ ግ ጊዜ በዩአርኤሉ ላይ ለመታየት የሚያስቸግሩ አነስተኛ ለውጦችን በማድረግ ጥኣቢያዎችን ያስመስላሉ።</translation>
-<translation id="1532118530259321453">ይህ ገጽ እንዲህ ይላል፦</translation>
+<translation id="1532118530259321453">ይህ ገፅ እንዲህ ይላል፦</translation>
<translation id="153384715582417236">ለአሁን ያለው ይኸው ነው</translation>
-<translation id="1536390784834419204">ገጽ ተርጉም</translation>
+<translation id="1536390784834419204">ገፅ ተርጉም</translation>
<translation id="1539840569003678498">ሪፖርት ተልኳል፦</translation>
<translation id="154408704832528245">የማድረሻ አድራሻ ይምረጡ</translation>
<translation id="1549470594296187301">ይህን ባህሪ ለመጠቀም ጃቫስክሪፕት መንቃት አለበት።</translation>
@@ -275,7 +275,7 @@
<translation id="1569694109004336106">Google Chrome የይለፍ ቃላትን ለመሙላት Windows Helloን ለማብራት እየሞከረ ነው።</translation>
<translation id="1572765991610098222"><ph name="WIDTH" /> x <ph name="HEIGHT" /> ኢንች</translation>
<translation id="1581080074034554886">CVC</translation>
-<translation id="1583429793053364125">ይህን ድረ-ገጽ በማሳየት ላይ ሳለ የሆነ ችግር ተፈጥሯል።</translation>
+<translation id="1583429793053364125">ይህን ድረ-ገፅ በማሳየት ላይ ሳለ የሆነ ችግር ተፈጥሯል።</translation>
<translation id="1584492003828271317">በሚያስሱበት ጊዜ የሚያዩት ማስታወቂያ ግላዊነት የተላበሰ መሆን አለመሆኑ በዚህ ቅንብር፣ በጣቢያ የተጠቆሙ ማስታወቂያዎች፣ በእርስዎ የኩኪ ቅንብሮች እና እየተመለከቱት ያለው ጣቢያ ማስታወቂያዎችን ግላዊነት የሚያላብስ ከሆነ በሚሉት ላይ ይወሰናል</translation>
<translation id="1586541204584340881">የትኛዎቹ ቅጥያዎች ናቸው እርስዎ የጫኑት</translation>
<translation id="1588438908519853928">መደበኛ</translation>
@@ -287,19 +287,19 @@
<translation id="160851722280695521">በChrome ውስጥ የDino አሂድ ጨዋታ አጫውት</translation>
<translation id="161042844686301425">ውሃ ሰማያዊ</translation>
<translation id="1611101756749861742">ሁለተኛ ጥቅልል</translation>
-<translation id="1615402009686901181">ሚስጥራዊ ይዘት በሚታይበት ጊዜ የአስተዳዳሪ መመሪያ የማያ ገጽ ማንሳትን ያሰናክላል</translation>
+<translation id="1615402009686901181">ሚስጥራዊ ይዘት በሚታይበት ጊዜ የአስተዳዳሪ መመሪያ የማያ ገፅ ማንሳትን ያሰናክላል</translation>
<translation id="1617276713587758852">ክሮስኦቨሮች</translation>
<translation id="1618571384971354160">የመጎተት እና የመንገድ ዳር እርዳታ</translation>
<translation id="1620510694547887537">ካሜራ</translation>
<translation id="1622571349153632031">የተክል-በል ምግብ</translation>
-<translation id="1623104350909869708">ይህ ገጽ ተጨማሪ መገናኛዎችን እንዳይፈጥር አግድ</translation>
+<translation id="1623104350909869708">ይህ ገፅ ተጨማሪ መገናኛዎችን እንዳይፈጥር አግድ</translation>
<translation id="1633137413609266904">{0,plural, =1{ይህን ፋይል መክፈት በአስተዳዳሪ መመሪያ ታግዷል}one{# ፋይልን መክፈት በአስተዳዳሪ መመሪያ ታግዷል}other{# ፋይሎችን መክፈት በአስተዳዳሪ መመሪያ ታግዷል}}</translation>
<translation id="1634828734222219955">ጠቅላላ</translation>
<translation id="163669211644121865">የግብር ዝግጅት እና ዕቅድ</translation>
<translation id="1638780421120290329">ካርድን ማስቀመጥ አይቻልም</translation>
<translation id="1639239467298939599">በመጫን ላይ</translation>
<translation id="1640180200866533862">የተጠቃሚ መምሪያዎች</translation>
-<translation id="1640244768702815859"><ph name="BEGIN_LINK" />የጣቢያውን መነሻ ገጽ ለመጎብኘት<ph name="END_LINK" /> ይሞክሩ።</translation>
+<translation id="1640244768702815859"><ph name="BEGIN_LINK" />የጣቢያውን መነሻ ገፅ ለመጎብኘት<ph name="END_LINK" /> ይሞክሩ።</translation>
<translation id="1641976391427233992">ውጽዓትን አዘግይ እስከ</translation>
<translation id="164212631332220697">ከፍሎ መውጫው ላይ በ<ph name="CARD_DETAIL" /> ይክፈሉ።</translation>
<translation id="1642410292376109062">የGoogle የይለፍ ቃልዎን አዝራር ይቀይሩ፣ የGoogle መለያ የይለፍ ቃልዎን ለመቀየር አስገባን ይጫኑ</translation>
@@ -307,7 +307,7 @@
<translation id="1645368109819982629">የማይደገፍ ፕሮቶኮል</translation>
<translation id="1650602712345345441">የእርስዎን Chrome ቅንብሮች ያቀናብሩ</translation>
<translation id="1652415888492971589">JIS B8</translation>
-<translation id="1656024727720460136">Chrome ለማንበብ እንዲቀልል ይህን ገጽ አቃልሎታል። Chrome የመጀመሪያውን ገጽ ደህንነቱ በተጠበቀ ግንኙነት ላይ ሰርስሮ አውጥቶታል።</translation>
+<translation id="1656024727720460136">Chrome ለማንበብ እንዲቀልል ይህን ገፅ አቃልሎታል። Chrome የመጀመሪያውን ገፅ ደህንነቱ በተጠበቀ ግንኙነት ላይ ሰርስሮ አውጥቶታል።</translation>
<translation id="1656489000284462475">መውሰጃ</translation>
<translation id="1658918301167915956">የብሉቱዝ መሣሪያዎች</translation>
<translation id="1662550410081243962">የመክፈያ ዘዴዎችን አስቀምጥ እና ሙላ</translation>
@@ -339,7 +339,7 @@
<translation id="1725591448053514783">ዩ 6 ፖስታ</translation>
<translation id="1727613060316725209">የዕውቅና ማረጋገጫ ልክ የሆነ ነው</translation>
<translation id="1727741090716970331">የሚሰራ የካርድ ቁጥር ያክሉ</translation>
-<translation id="1728677426644403582">የአንድ ድረ-ገጽ ምንጭ እየተመለከቱ ነው</translation>
+<translation id="1728677426644403582">የአንድ ድረ-ገፅ ምንጭ እየተመለከቱ ነው</translation>
<translation id="173080396488393970">የዚህ ዓይነቱ ካርድ አይደገፍም</translation>
<translation id="1732445923934584865">በምትኩ በአካል ተገኝተው ይጠይቁ</translation>
<translation id="1733064249834771892">ቅርጸ-ቁምፊዎች</translation>
@@ -376,7 +376,7 @@
<translation id="1807246157184219062">ብርሃን</translation>
<translation id="1807528111851433570">የመጀመሪያ ሉህ</translation>
<translation id="181000283860817563">በብዙ ጣቢያዎች ዙሪያ ያሉትን ዋጋዎች ይከታተሉ</translation>
-<translation id="1810391395243432441">በማያ ገጽ መቆለፊያዎ ለይለፍ ቃላት ጥበቃ ያድርጉ</translation>
+<translation id="1810391395243432441">በማያ ገፅ መቆለፊያዎ ለይለፍ ቃላት ጥበቃ ያድርጉ</translation>
<translation id="1812527064848182527">የመሬት ገጽታ</translation>
<translation id="1813414402673211292">የአሰሳ ውሂብ አስወግድ</translation>
<translation id="182139138257690338">ራስ-ሰር ውርዶች</translation>
@@ -396,7 +396,7 @@
<translation id="1871208020102129563">የ.pac ስክሪፕት ዩአርኤል ሳይሆን ተኪ አገልጋዮችን እንዲጠቀም ነው ተኪ የተዋቀረው።</translation>
<translation id="1871284979644508959">የሚያስፈልግ መስክ</translation>
<translation id="1873899211667975540">ሮክ ሙዚቃ</translation>
-<translation id="1874224422119691492">በ<ph name="SETTINGS" /> ውስጥ የይለፍ ቃላትን ለመሙላት ማያ ገጽ መቆለፊያዎን የሚጠቀሙ እንደሆነ መቀየር ይችላሉ</translation>
+<translation id="1874224422119691492">በ<ph name="SETTINGS" /> ውስጥ የይለፍ ቃላትን ለመሙላት ማያ ገፅ መቆለፊያዎን የሚጠቀሙ እንደሆነ መቀየር ይችላሉ</translation>
<translation id="1875025161375567525">የፎቶ መሳቢያ</translation>
<translation id="1875512691959384712">Google ቅጾች</translation>
<translation id="187918866476621466">የመነሻ ገጾችን ክፈት</translation>
@@ -404,13 +404,13 @@
<translation id="1884843295353628214">ጃዝ</translation>
<translation id="1890171020361705182">የዳይኖ ጨዋታ። በፒክስሎች የተሰራ የዳይኖሰር በረሃን ሮጦ እያቋረጠ ሳለ ቁልቋሎችን እና ቴሮዳክቲሎችን ያመልጣል። የድምጽ ምልክት ሲሰሙ መሰናክሎችን ለመዝለል መታ ያድርጉ።</translation>
<translation id="1898423065542865115">በማጣራት ላይ</translation>
-<translation id="1901443836186977402">{1,plural, =1{ይህ አገልጋይ <ph name="DOMAIN" /> መሆኑን ማረጋገጥ አልቻለም፤ የደህንነት እውቅና ማረጋገጫው ባለፈው ቀን ነው ጊዜ ያበቃው። ይሄ በተሳሳተ አወቃቀር ወይም አንድ አጥቂ ግንኙነትዎን በመጥለፉ የተከሰተ ሊሆን ይችላል። የኮምፒውተርዎ ሰዓት በአሁኑ ጊዜ ወደ <ph name="CURRENT_DATE" /> ተቀናብሯል። ይህ ልክ ይመስላል? ትክክል ካልሆነ የስርዓትዎን ሰዓት ማስተካከል እና ይህንን ገጽ ማደስ አለብዎት።}one{ይህ አገልጋይ <ph name="DOMAIN" /> መሆኑን ማረጋገጥ አልቻለም፤ የደህንነት ዕውቅና ማረጋገጫው ከ# ቀኖች በፊት ጊዜው አብቅቷል። ይህ በተሳሳተ ውቅረት ወይም የእርስዎን ግንኙነት በሚጠልፍ አጥቂ ምክንያት የተፈጠረ ሊሆን ይችላል። የእርስዎ ኮምፒውተር ሰዓት አሁን ወደ <ph name="CURRENT_DATE" /> ተዋቅሯል። ትክክል ይመስላል? ካልሆነ የሥርዓትዎን ሰዓት ማስተካከልና ከዚያ ይህን ገጽ ማደስ ይኖርብዎታል።}other{ይህ አገልጋይ <ph name="DOMAIN" /> መሆኑን ማረጋገጥ አልቻለም፤ የደህንነት ዕውቅና ማረጋገጫው ከ# ቀኖች በፊት ጊዜው አብቅቷል። ይህ በተሳሳተ ውቅረት ወይም የእርስዎን ግንኙነት በሚጠልፍ አጥቂ ምክንያት የተፈጠረ ሊሆን ይችላል። የእርስዎ ኮምፒውተር ሰዓት አሁን ወደ <ph name="CURRENT_DATE" /> ተዋቅሯል። ትክክል ይመስላል? ካልሆነ የሥርዓትዎን ሰዓት ማስተካከልና ከዚያ ይህን ገጽ ማደስ ይኖርብዎታል።}}</translation>
+<translation id="1901443836186977402">{1,plural, =1{ይህ አገልጋይ <ph name="DOMAIN" /> መሆኑን ማረጋገጥ አልቻለም፤ የደህንነት እውቅና ማረጋገጫው ባለፈው ቀን ነው ጊዜ ያበቃው። ይሄ በተሳሳተ አወቃቀር ወይም አንድ አጥቂ ግንኙነትዎን በመጥለፉ የተከሰተ ሊሆን ይችላል። የኮምፒውተርዎ ሰዓት በአሁኑ ጊዜ ወደ <ph name="CURRENT_DATE" /> ተቀናብሯል። ይህ ልክ ይመስላል? ትክክል ካልሆነ የስርዓትዎን ሰዓት ማስተካከል እና ይህንን ገፅ ማደስ አለብዎት።}one{ይህ አገልጋይ <ph name="DOMAIN" /> መሆኑን ማረጋገጥ አልቻለም፤ የደህንነት ዕውቅና ማረጋገጫው ከ# ቀኖች በፊት ጊዜው አብቅቷል። ይህ በተሳሳተ ውቅረት ወይም የእርስዎን ግንኙነት በሚጠልፍ አጥቂ ምክንያት የተፈጠረ ሊሆን ይችላል። የእርስዎ ኮምፒውተር ሰዓት አሁን ወደ <ph name="CURRENT_DATE" /> ተዋቅሯል። ትክክል ይመስላል? ካልሆነ የሥርዓትዎን ሰዓት ማስተካከልና ከዚያ ይህን ገፅ ማደስ ይኖርብዎታል።}other{ይህ አገልጋይ <ph name="DOMAIN" /> መሆኑን ማረጋገጥ አልቻለም፤ የደህንነት ዕውቅና ማረጋገጫው ከ# ቀኖች በፊት ጊዜው አብቅቷል። ይህ በተሳሳተ ውቅረት ወይም የእርስዎን ግንኙነት በሚጠልፍ አጥቂ ምክንያት የተፈጠረ ሊሆን ይችላል። የእርስዎ ኮምፒውተር ሰዓት አሁን ወደ <ph name="CURRENT_DATE" /> ተዋቅሯል። ትክክል ይመስላል? ካልሆነ የሥርዓትዎን ሰዓት ማስተካከልና ከዚያ ይህን ገፅ ማደስ ይኖርብዎታል።}}</translation>
<translation id="1902576642799138955">የተገቢነት ክፍለ ጊዜ</translation>
<translation id="1906155288650175567">የማስታወሻ አዝራርን ይፍጠሩ፣ በGoogle Keep ውስጥ አዲስ ማስታወሻን በፍጥነት ለመፍጠር አስገባን ይጫኑ</translation>
<translation id="1908217026282415406">የካሜራ አጠቃቀም እና እንቅስቃሴ</translation>
<translation id="191374271204266022">እንደ JSON ቅዳ</translation>
<translation id="1914326953223720820">አገልግሎትን በትን</translation>
-<translation id="1916770123977586577">የተዘመኑ ቅንብሮችዎን በዚህ ጣቢያ ላይ ለመተግበር ይህን ገጽ እንደገና ይጫኑት</translation>
+<translation id="1916770123977586577">የተዘመኑ ቅንብሮችዎን በዚህ ጣቢያ ላይ ለመተግበር ይህን ገፅ እንደገና ይጫኑት</translation>
<translation id="1919367280705858090">በአንድ የተወሰነ የስህተት መልዕክት ላይ እገዛ ያግኙ</translation>
<translation id="1919526244108283799">400 x 600 ሚሜ</translation>
<translation id="192020519938775529">{COUNT,plural, =0{ምንም}=1{1 ጣቢያ}one{# ጣቢያዎች}other{# ጣቢያዎች}}</translation>
@@ -528,7 +528,7 @@
<translation id="2212579473415663542">ይህ አድራሻ የተቀመጠው በGoogle መለያዎ (<ph name="ACCOUNT" />) ውስጥ ነው። አድራሻን በመላው Google ምርቶች ላይ በማንኛውም መሣሪያ ላይ መጠቀም ይችላሉ።</translation>
<translation id="2212735316055980242">መመሪያ አልተገኘም</translation>
<translation id="2213606439339815911">ግቤቶችን በማምጣት ላይ...</translation>
-<translation id="2213612003795704869">ገጽ ታትሟል</translation>
+<translation id="2213612003795704869">ገፅ ታትሟል</translation>
<translation id="2215632862494199917">የተሽከርካሪ ትርዒቶች</translation>
<translation id="2215727959747642672">የፋይል አርትዖት አደራረግ</translation>
<translation id="2215963164070968490">ውሻዎች</translation>
@@ -559,7 +559,7 @@
<translation id="2283340219607151381">አድራሻዎችን አስቀምጥ እና ሙላ</translation>
<translation id="2283447177162560884">«<ph name="PAGE_TITLE" />» ተሰርዟል</translation>
<translation id="2286383991450886080">34 x 44 ኢንች</translation>
-<translation id="2288422996159078444">ማናቸውም እርስዎ የሚተይቡት፣ የሚመለከቱት ማናቸውም ገጽ፣ ወይም ማናቸውም በድር ላይ ያለ ሌላ እንቅስቃሴ እየታየ ነው። በጣቢያዎች ላይ ያለ ይዘት እርስዎ ሳያውቁት ሊለወጥ ይችላል።</translation>
+<translation id="2288422996159078444">ማናቸውም እርስዎ የሚተይቡት፣ የሚመለከቱት ማናቸውም ገፅ፣ ወይም ማናቸውም በድር ላይ ያለ ሌላ እንቅስቃሴ እየታየ ነው። በጣቢያዎች ላይ ያለ ይዘት እርስዎ ሳያውቁት ሊለወጥ ይችላል።</translation>
<translation id="2289385804009217824">ከርክም</translation>
<translation id="2292556288342944218">የእርስዎ የበየነመረብ መዳረሻ ታግዷል</translation>
<translation id="2293443924986248631">ሲበራ ጣቢያዎች እርስዎን በመላው ድር ላይ የሚከታተሉ ኩኪዎችን መጠቀም አይችሉም። በአንዳንድ ጣቢያዎች ላይ ያሉ ባህሪያት ሊሰበሩ ይችላሉ።</translation>
@@ -619,12 +619,12 @@
<translation id="2467272921457885625">እንደ የሲፒዩ/ራም አጠቃቀም ታሪክ ያሉ የመሣሪያ ሃርድዌር ዝርዝሮች እና ስታቲስቲክስ</translation>
<translation id="2467694685043708798"><ph name="BEGIN_LINK" />የአውታረ መረብ መመርመሪያን በማሄድ ላይ<ph name="END_LINK" /></translation>
<translation id="2469153820345007638">1-ለN ቅደም-ተከተል</translation>
-<translation id="2470767536994572628">ማብራሪያዎችን ሲያርትዑ ይህ ሰነድ ወደ የነጠላ ገጽ እይታ እና የመጀመሪያው ማዞር ይመለሳል</translation>
+<translation id="2470767536994572628">ማብራሪያዎችን ሲያርትዑ ይህ ሰነድ ወደ የነጠላ ገፅ እይታ እና የመጀመሪያው ማዞር ይመለሳል</translation>
<translation id="2479410451996844060">ልክ ያልሆነ የፍለጋ ዩአርኤል።</translation>
<translation id="2482878487686419369">ማስታወቂያዎች</translation>
<translation id="248348093745724435">የማሽን መመሪያዎች</translation>
<translation id="2491120439723279231">የአገልጋይ እውቅና ማረጋገጫ ስህተቶችን ይዟል።</translation>
-<translation id="2491414235131909199">ይህ ገጽ በቅጥያ ታግዷል</translation>
+<translation id="2491414235131909199">ይህ ገፅ በቅጥያ ታግዷል</translation>
<translation id="2495083838625180221">JSON ተንታኝ</translation>
<translation id="2498091847651709837">አዲስ ካርድ ቃኝ</translation>
<translation id="2501278716633472235">ወደ ኋላ ተመለስ</translation>
@@ -654,7 +654,7 @@
<translation id="254947805923345898">የመመሪያ እሴት የሚሰራ አይደለም።</translation>
<translation id="255002559098805027"><ph name="HOST_NAME" /> ልክ ያልኾነ ምላሽ ልኳል።</translation>
<translation id="2552246211866555379">ሃጋኪ</translation>
-<translation id="2552295903035773204">ከአሁን በኋላ ካርዶችን ለማረጋገጥ የማያ ገጽ መቆለፊያን ይጠቀሙ</translation>
+<translation id="2552295903035773204">ከአሁን በኋላ ካርዶችን ለማረጋገጥ የማያ ገፅ መቆለፊያን ይጠቀሙ</translation>
<translation id="2553853292994445426">ደህንነታቸው የተጠበቁ የዲኤንኤስ ቅንብሮችዎን ይፈትሹ። ግንኙነቶቹ እየተሳኩ ያልሆነ ደህንነቱ የተጠበቀ የዲኤንኤስ አገልጋይ አዋቅረው ሊሆኑ ይችላሉ።</translation>
<translation id="2556876185419854533">&amp;አርትዕን ቀልብስ</translation>
<translation id="2557417190997681027">የንግድ ጉዞ</translation>
@@ -720,7 +720,7 @@
<translation id="2713444072780614174">ነጭ</translation>
<translation id="2715612312510870559"><ph name="UPDATE_CREDIT_CARD_FOCUSED_FRIENDLY_MATCH_TEXT" />፣ ትር ይጫኑ፣ ከዚያ የእርስዎን ክፍያዎች እና የክሬዲት ካርድ መረጃ በChrome ቅንብሮች ውስጥ ለማቀናበር አስገባን ይጫኑ</translation>
<translation id="2715808615350965923">ልዕለ-A</translation>
-<translation id="271663710482723385">ከሙሉ ገጽ ዕይታ ለመውጣት |<ph name="ACCELERATOR1" />| + |<ph name="ACCELERATOR2" />|ን ይጫኑ</translation>
+<translation id="271663710482723385">ከሙሉ ገፅ ዕይታ ለመውጣት |<ph name="ACCELERATOR1" />| + |<ph name="ACCELERATOR2" />|ን ይጫኑ</translation>
<translation id="2718207025093645426">የሚተዳደር ተጠቃሚ ወይም መሣሪያ ምንም የተጫነ መመሪያ የለውም።</translation>
<translation id="2721148159707890343">ጥያቄ ተሳክቷል</translation>
<translation id="2723669454293168317">በChrome ቅንብሮች ውስጥ የደህንነት ፍተሻን ያሂዱ</translation>
@@ -739,7 +739,7 @@
<translation id="2765217105034171413">ትንሽ</translation>
<translation id="277133753123645258">የመላኪያ ዘዴ</translation>
<translation id="277499241957683684">የሚጎድል የመሣሪያ መዝገብ</translation>
-<translation id="2775884851269838147">የመጀመሪያውን የታተመ ገጽ</translation>
+<translation id="2775884851269838147">የመጀመሪያውን የታተመ ገፅ</translation>
<translation id="2781692009645368755">Google Pay</translation>
<translation id="2784474685437057136">B5 Extra</translation>
<translation id="2784949926578158345">ግንኙነቱ ዳግም እንዲጀምር ተደርጓል።</translation>
@@ -768,16 +768,16 @@
<translation id="2876949457278336305"><ph name="MANAGE_SECURITY_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />፣ በChrome ቅንብሮች ውስጥ የጥንቃቄ አሰሳዎን እና ተጨማሪ ነገሮችን ለማቀናበር ትርን ከዚያ አስገባን ይጫኑ</translation>
<translation id="2878197950673342043">የፖስተር እጥፋት</translation>
<translation id="2878424575911748999">A1</translation>
-<translation id="2879694782644540289">የይለፍ ቃላትን ለመሙላት ማያ ገጽ መቆለፊያዎን ይጠቀሙ</translation>
+<translation id="2879694782644540289">የይለፍ ቃላትን ለመሙላት ማያ ገፅ መቆለፊያዎን ይጠቀሙ</translation>
<translation id="2881276955470682203">ካርድ ይቀመጥ?</translation>
<translation id="2882949212241984732">ድርብ-በር ማጠፍ</translation>
<translation id="2893773853358652045">አራተኛ ጥቅልል</translation>
<translation id="2900528713135656174">ክስተት ፍጠር</translation>
<translation id="2903493209154104877">አድራሻዎች</translation>
-<translation id="290376772003165898">ገጽ በ<ph name="LANGUAGE" /> አይደለም?</translation>
+<translation id="290376772003165898">ገፅ በ<ph name="LANGUAGE" /> አይደለም?</translation>
<translation id="2909946352844186028">የአውታረ መረብ ለውጥ ተገኝቷል።</translation>
<translation id="2911973620368911614">የስራ አካውንቲንግ ተጠቃሚ መታወቂያ</translation>
-<translation id="2914160345369867329"><ph name="SITE" /> የእርስዎን መረጃ ለመጠበቅ በመደበኝነት ምስጠራ ይጠቀማል። Chrome አሁን ከ<ph name="SITE" /> ጋር ለመገናኘት ሲሞክር ድር ጣቢያው ያልተለመደ እና ትክክል ያልሆኑ የመግቢያ ማስረጃዎችን መልሷል። ይህ አንድ አጥቂ <ph name="SITE" />ን አስመስሎ ለመቅረብ ከሞከረ ነው ወይም አንድ የWi-Fi መግቢያ ገጽ ግንኙነቱን ካቋረጠ ሊከሰት ይችላል። Chrome ማንኛውም የውሂብ ልውውጥ ከመካሄዱ በፊት ግንኙነቱን ስላቋረጠው የእርስዎ መረጃ ደህንነት ተጠብቋል።</translation>
+<translation id="2914160345369867329"><ph name="SITE" /> የእርስዎን መረጃ ለመጠበቅ በመደበኝነት ምስጠራ ይጠቀማል። Chrome አሁን ከ<ph name="SITE" /> ጋር ለመገናኘት ሲሞክር ድር ጣቢያው ያልተለመደ እና ትክክል ያልሆኑ የመግቢያ ማስረጃዎችን መልሷል። ይህ አንድ አጥቂ <ph name="SITE" />ን አስመስሎ ለመቅረብ ከሞከረ ነው ወይም አንድ የWi-Fi መግቢያ ገፅ ግንኙነቱን ካቋረጠ ሊከሰት ይችላል። Chrome ማንኛውም የውሂብ ልውውጥ ከመካሄዱ በፊት ግንኙነቱን ስላቋረጠው የእርስዎ መረጃ ደህንነት ተጠብቋል።</translation>
<translation id="2915068235268646559"><ph name="CRASH_TIME" /> ላይ ስንክል</translation>
<translation id="2915496182262110498">የቀለም ሥዕል</translation>
<translation id="2916038427272391327">ሌሎች ፕሮግራሞችን ይዝጉ</translation>
@@ -794,7 +794,7 @@
<translation id="2941952326391522266">ይህ አገልጋይ <ph name="DOMAIN" /> መሆኑን ሊያረጋግጥ አልቻለም፤ የደህንነት እውቅና ማረጋገጫው በ<ph name="DOMAIN2" /> ነው የተሰጠው። ይሄ በተሳሳተ አወቃቀር ወይም አንድ አጥቂ ግንኙነትዎን በመጥለፉ የተከሰተ ሊሆን ይችላል።</translation>
<translation id="2943895734390379394">የሰቀላ ጊዜ፦</translation>
<translation id="2945026002409061480">መስመር ላይ ማኀበረሰቦች</translation>
-<translation id="2948083400971632585">ከቅንብሮች ገጽ ሆነው ማናቸውንም ለግንኙነት የተዋቀሩ ተኪዎችን ማሰናከል ይችላሉ።</translation>
+<translation id="2948083400971632585">ከቅንብሮች ገፅ ሆነው ማናቸውንም ለግንኙነት የተዋቀሩ ተኪዎችን ማሰናከል ይችላሉ።</translation>
<translation id="2949183777371959169">ማሽኑ በChrome አሳሽ ደመና አስተዳደር ያልተመዘገበ ስለሆነ ችላ ተብሏል።</translation>
<translation id="2951588413176968965">የእኔ የመልዕክት ሳጥን</translation>
<translation id="2952820037279740115">ሁሉንም ማንነት የማያሳውቁ መስኮቶች ዝጋ</translation>
@@ -816,7 +816,7 @@
<translation id="2989742184762224133">ድርብ ከላይ ስቴፕለር ምታ</translation>
<translation id="2991174974383378012">ከድረ ገጾች ጋር ማጋራት</translation>
<translation id="299122504639061328">ነባሪ የፍለጋ ፕሮግራምዎን እና የጣቢያ ፍለጋዎን ያቀናብሩ</translation>
-<translation id="2991571918955627853">የድር ጣቢያው HSTS ስለሚጠቀም አሁን <ph name="SITE" />ን መጎብኘት አይችሉም። የአውታረ መረብ ስህተቶች እና ጥቃቶች አብዛኛው ጊዜ ጊዜያዊ ናቸው፣ ስለዚህ ይህ ገጽ በኋላ ላይ ሳይሠራ አይቀርም።</translation>
+<translation id="2991571918955627853">የድር ጣቢያው HSTS ስለሚጠቀም አሁን <ph name="SITE" />ን መጎብኘት አይችሉም። የአውታረ መረብ ስህተቶች እና ጥቃቶች አብዛኛው ጊዜ ጊዜያዊ ናቸው፣ ስለዚህ ይህ ገፅ በኋላ ላይ ሳይሠራ አይቀርም።</translation>
<translation id="2995517112308048736">የፋይል መጠን፡</translation>
<translation id="299990983510665749">ሃችባኮች</translation>
<translation id="3002501248619246229">የግቤት መሳቢያ ሚዲያን ይመልከቱ</translation>
@@ -826,7 +826,7 @@
<translation id="3016780570757425217">የእርስዎን መገኛ አካባቢ ይወቁ</translation>
<translation id="3017086357773116182"><ph name="REMOVE_SUGGESTION_SUFFIX" />፣ የአስተያየት ጥቆማዎችን ለማስወገድ ትርን ከዚያ አስገባን ይጫኑ።</translation>
<translation id="3023165109041533893">በጣቢያ የተጠቆሙ ማስታወቂያዎች ጣቢያዎች አግባብነት ያሏቸው ማስታወቂያዎችን ለእርስዎ እንዲያሳዩ እያስቻሉ ሳለ የእርስዎን የአሰሳ ታሪክ እና ማንነት ለመጠበቅ ያግዛሉ። በእንቅስቃሴዎ መሠረት እርስዎ የጎበኙት ጣቢያ ማሰስ ሲቀጥሉ ተዛማጅ ማስታወቂያዎችን መጠቆም ይችላል። የእነዚህን ጣቢያዎች ዝርዝር ማየት እና የማይፈልጓቸውን በቅንብሮች ውስጥ ማገድ ይችላሉ።</translation>
-<translation id="3024663005179499861">የተሳሳተ የመምሪያ አይነት</translation>
+<translation id="3024663005179499861">የተሳሳተ የመምሪያ ዓይነት</translation>
<translation id="3029752078111257850">ዓለም አቀፍ ዜና</translation>
<translation id="3037177537145227281">ዋጋዎችን በመከታተል ላይ</translation>
<translation id="3037605927509011580">ውይ፣ ተሰናከለ!</translation>
@@ -848,7 +848,7 @@
<translation id="3105172416063519923">የእሴት መታወቂያ፦</translation>
<translation id="3107591622054137333"><ph name="BEGIN_LINK" />ደህንነቱ የተጠበቀ የዲኤስንኤስ ውቅረትን በመፈተሽ ላይ<ph name="END_LINK" /></translation>
<translation id="3108943290502734357">መሃከለኛ መሳቢያ</translation>
-<translation id="3109728660330352905">ይህን ገጽ ለማየት ፍቃድ የለዎትም።</translation>
+<translation id="3109728660330352905">ይህን ገፅ ለማየት ፍቃድ የለዎትም።</translation>
<translation id="3113284927548439113">ሶስተኛ ፈረቃ</translation>
<translation id="3114040155724590991">የAndroid ስርዓትን በማዘመን ላይ
መተግበሪያዎን ማስጀመር ከተለመደው ጊዜ በላይ ሊወስድ ይችላል።</translation>
@@ -863,7 +863,7 @@
<translation id="3141641372357166056">ምንም የፈቃደኝነት ውሳኔ የለም</translation>
<translation id="3145945101586104090">ምላሹን መግለጥ አልተሳካም</translation>
<translation id="3150653042067488994">ጊዜያዊ የአገልጋይ ስህተት</translation>
-<translation id="3154506275960390542">ይህ ገጽ ደህንነቱ አስተማማኝ ባልሆነ መንገድ ላይገባ የሚችል ቅጽ ያካትታል። እርስዎ የሚልኩት ውሂብ በሽግግር ላይ እያለ በሌሎች ሊታይ ወይም አገልጋዩ የሚቀበለውን ለመለወጥ በአጥቂ ሊቀየር ይችላል።</translation>
+<translation id="3154506275960390542">ይህ ገፅ ደህንነቱ አስተማማኝ ባልሆነ መንገድ ላይገባ የሚችል ቅጽ ያካትታል። እርስዎ የሚልኩት ውሂብ በሽግግር ላይ እያለ በሌሎች ሊታይ ወይም አገልጋዩ የሚቀበለውን ለመለወጥ በአጥቂ ሊቀየር ይችላል።</translation>
<translation id="3154987252551138431">አቅራቢያ አጋራን ሲጠቀሙ የሆነ ችግር ተፈጥሯል</translation>
<translation id="315504272643575312">የእርስዎ መለያ በ<ph name="MANAGER" /> ነው የሚተዳደረው።</translation>
<translation id="3157931365184549694">እነበረበት መልስ</translation>
@@ -887,7 +887,7 @@
<translation id="320323717674993345">ክፍያን ሰርዝ</translation>
<translation id="3203366800380907218">ከድሩ</translation>
<translation id="3207960819495026254">ዕልባት ተደርጎበታል</translation>
-<translation id="3209034400446768650">ገጽ ገንዘብ ሊያስከፍል ይችል ይሆናል</translation>
+<translation id="3209034400446768650">ገፅ ገንዘብ ሊያስከፍል ይችል ይሆናል</translation>
<translation id="3212581601480735796">በ<ph name="HOSTNAME" /> ላይ የእርስዎ እንቅስቃሴ ቁጥጥር እየተደረገበት ነው</translation>
<translation id="3215092763954878852">WebAuthn ን መጠቀም አልተቻለም</translation>
<translation id="3216313131063488104">ብሉዝ</translation>
@@ -965,7 +965,7 @@
<translation id="3375754925484257129">የChrome ደህንነት ፍተሻን ያሂዱ</translation>
<translation id="3377144306166885718">አገልጋዩ ጊዜ ያለፈበት የTLS ስሪት ተጠቅመዋል።</translation>
<translation id="3377188786107721145">የመምሪያ ትንተና ስህተት</translation>
-<translation id="3377736046129930310">ካርዶችን በበለጠ ፍጥነት ለማረጋገጥ የማያ ገጽ መቆለፊያን ይጠቀሙ</translation>
+<translation id="3377736046129930310">ካርዶችን በበለጠ ፍጥነት ለማረጋገጥ የማያ ገፅ መቆለፊያን ይጠቀሙ</translation>
<translation id="3380365263193509176">ያልታወቀ ስህተት</translation>
<translation id="3380864720620200369">የደንበኛ መታወቂያ፦</translation>
<translation id="3381668585148405088">ግዢዎን ያረጋግጡ</translation>
@@ -988,8 +988,8 @@
<translation id="3427342743765426898">&amp;አርትዕን ድገም</translation>
<translation id="342781501876943858">Chromium የእርስዎን ይለፍ ቃል በሌሎች ጣቢያዎች ላይ ዳግም ከተጠቀሙበት እንደገና እንዲያዋቅሩት ይመክራል።</translation>
<translation id="3428151540071562330">አንድ ወይም ተጨማሪ የDnsOverHttpsTemplates አገልጋይ ቅንብር ደንብ ዩአርአዮች ልክ ያልሆኑ ናቸው፣ እና ስራ ላይ አይውሉም።</translation>
-<translation id="3431216045099978607">ከሙሉ ገጽ ዕይታ ለመውጣት እና ውርድን ለማየት |<ph name="ACCELERATOR" />|ን ይጫኑ።</translation>
-<translation id="3432601291244612633">ገጽ ይዝጉ</translation>
+<translation id="3431216045099978607">ከሙሉ ገፅ ዕይታ ለመውጣት እና ውርድን ለማየት |<ph name="ACCELERATOR" />|ን ይጫኑ።</translation>
+<translation id="3432601291244612633">ገፅ ይዝጉ</translation>
<translation id="3435738964857648380">የደህንነት ጥበቃ</translation>
<translation id="3438829137925142401">በእርስዎ የGoogle መለያ ውስጥ የተቀመጡ የይለፍ ቃሎችን ይጠቀሙ</translation>
<translation id="3440783957068352691">ካሬ</translation>
@@ -1023,7 +1023,7 @@
<translation id="3528171143076753409">የአገልጋይ እውቅና ማረጋገጫ የታመነ አይደለም።</translation>
<translation id="3528485271872257980">ደማቅ ቡናማ</translation>
<translation id="3530944546672790857">{COUNT,plural, =0{በተሰመሩ መሣሪያዎች ላይ ቢያንስ 1 ንጥል}=1{1 ንጥል (እና ተጨማሪ የተሰመሩ መሣሪያዎች ላይ)}one{# ንጥሎች (እና ተጨማሪ የተሰመሩ መሣሪያዎች ላይ)}other{# ንጥሎች (እና ተጨማሪ የተሰመሩ መሣሪያዎች ላይ)}}</translation>
-<translation id="3531366304259615706">የማያ ገጽ መቆለፊያን ይጠቀሙ</translation>
+<translation id="3531366304259615706">የማያ ገፅ መቆለፊያን ይጠቀሙ</translation>
<translation id="3531780078352352885">የስራ ሉሆች</translation>
<translation id="3532844647053365774"><ph name="HOST" /> ማይክሮፎንዎን መጠቀም ይፈልጋል</translation>
<translation id="3533328374079021623">የመልዕክት ሳጥን 5</translation>
@@ -1042,10 +1042,10 @@
<translation id="3574305903863751447"><ph name="CITY" />፣ <ph name="STATE" /> <ph name="COUNTRY" /></translation>
<translation id="3575121482199441727">ለዚህ ጣቢያ ፍቀድ</translation>
<translation id="3575168918110434329">A4x7</translation>
-<translation id="3576616784287504635"><ph name="SITE" /> ላይ የተካተተ ገጽ እንዲህ ይላል፦</translation>
+<translation id="3576616784287504635"><ph name="SITE" /> ላይ የተካተተ ገፅ እንዲህ ይላል፦</translation>
<translation id="3577473026931028326">የሆነ ችግር ተፈጥሯል። እንደገና ይሞክሩ።</translation>
<translation id="3577902790357386792">ጂምናስቲክስ</translation>
-<translation id="3581089476000296252">Chrome ይህ ገጽ ዝግጁ ሲሆን እርስዎ እንዲያውቁት ያደርጋል። &lt;a&gt;ተወው&lt;/a&gt;</translation>
+<translation id="3581089476000296252">Chrome ይህ ገፅ ዝግጁ ሲሆን እርስዎ እንዲያውቁት ያደርጋል። &lt;a&gt;ተወው&lt;/a&gt;</translation>
<translation id="3582930987043644930">ስም ያክሉ</translation>
<translation id="3583757800736429874">&amp;ውሰድን ድገም</translation>
<translation id="3584299510153766161">ድርብ ብስ ከታች</translation>
@@ -1068,8 +1068,8 @@
አስወግደው እንደገና ለማከል ይሞክሩ።</translation>
<translation id="3630699740441428070">የዚህ መሣሪያ አስተዳዳሪዎች የአውታረ መረብዎን ግንኙነት አዋቅረውታል፣ ይህም የትኛዎቹን ድር ጣቢያዎች እንደጎበኙ ጨምሮ የአውታረ መረብዎን ትራፊክ እንዲመለከቱ ያስችላቸዋል።</translation>
<translation id="3631244953324577188">ባዮሜትሪክስ</translation>
-<translation id="3632503704576938756">ማያ ገጽ ማጋራት ከቆመበት ቀጥሏል</translation>
-<translation id="3632892046558972264">ማያ ገጽ ማጋራት ባለበት ቆሟል</translation>
+<translation id="3632503704576938756">ማያ ገፅ ማጋራት ከቆመበት ቀጥሏል</translation>
+<translation id="3632892046558972264">ማያ ገፅ ማጋራት ባለበት ቆሟል</translation>
<translation id="3633738897356909127">የChrome አዝራርን ያዘምኑ፣ Chromeን ለማዘመን ከእርስዎ Chrome ቅንብሮች ሆነው አስገባን ይጫኑ</translation>
<translation id="3634530185120165534">መሳቢያ 5</translation>
<translation id="3634567936866541746">አሁን የይለፍ ቃልዎን በአንድ አታላይ ጣቢያ ላይ አስገብተዋል። የእርስዎን መለያዎች ደህንነት ለመጠበቅ፣ Chrome የተቀመጡ ይለፍ ቃላትዎን መፈተሽ ይመክራል።</translation>
@@ -1119,7 +1119,7 @@
<translation id="3740319564441798148">የረጅም ርቀት አውቶቡስ እና ባቡር</translation>
<translation id="3744111561329211289">የዳራ ስምረት</translation>
<translation id="3744286742364977428">እርስዎ የሚያወርዷቸው ፋይሎች ወደ Google ደመና ወይም ሶስተኛ ወገኖች ለትንታኔ ይላካሉ። ለምሳሌ፣ አደጋ ሊያስከትል ለሚችል ውሂብ ወይም ለተንኮል አዘል ዌር ሊቃኙ እና ምናልባት በኩባንያ መመሪያዎች መሰረት ሊከማቹ ይችላሉ።</translation>
-<translation id="3744899669254331632">የድር ጣቢያው Chromium ሊያስኬዳቸው የማይችሉ የተዘበራረቁ ምስክርነቶችን ስለላከ አሁን ላይ <ph name="SITE" />ን መጎብኘት አይችሉም። የአውታረ መረብ ስህተቶች እና ጥቃቶች ብዙውን ጊዜ ጊዜያዊ ናቸው፣ ስለዚህ ይህ ገጽ በኋላ ላይ ምናልባት ሊሰራ ይችል ይሆናል።</translation>
+<translation id="3744899669254331632">የድር ጣቢያው Chromium ሊያስኬዳቸው የማይችሉ የተዘበራረቁ ምስክርነቶችን ስለላከ አሁን ላይ <ph name="SITE" />ን መጎብኘት አይችሉም። የአውታረ መረብ ስህተቶች እና ጥቃቶች ብዙውን ጊዜ ጊዜያዊ ናቸው፣ ስለዚህ ይህ ገፅ በኋላ ላይ ምናልባት ሊሰራ ይችል ይሆናል።</translation>
<translation id="3748148204939282805">በ<ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> ላይ ያሉ አጥቂዎች ልክ እንደ ሶፍትዌርን መጫን ወይም የግል መረጃዎችን (ለምሳሌ፦ የይለፍ ቃላትን፣ የስልክ ቁጥሮችን ወይም የክሬዲት ካርዶችን የመሳሰሉ) አጋልጦ መስጠት እንዲያደርጉ ሊያታልለዎት ይችላል። <ph name="BEGIN_LEARN_MORE_LINK" />የበለጠ ለመረዳት<ph name="END_LEARN_MORE_LINK" /></translation>
<translation id="3748912308089554501">የአየር በረራ ኢንዱስትሪ</translation>
<translation id="3752543821772132562"><ph name="POLICY_NAME" /> ስላልተቀናበረ ችላ ተብሏል።</translation>
@@ -1207,14 +1207,14 @@
<translation id="3987460020348247775"><ph name="EXPRESSION" /> = <ph name="ANSWER" /></translation>
<translation id="3987940399970879459">ከ1 ሜባ ያነሰ</translation>
<translation id="3990250421422698716">ሕትመት አጠናቅ</translation>
-<translation id="3992684624889376114">ስለዚህ ገጽ</translation>
+<translation id="3992684624889376114">ስለዚህ ገፅ</translation>
<translation id="399952081411886534">ማስታወቂያዎችን ይበልጥ የግል የሚያደርጉ ሌሎች ባህሪያት</translation>
<translation id="4000598935132966791">በሚተዳደሩ አሳሾች ውስጥ ስለ ጣቢያ ገደቦች የበለጠ ይወቁ</translation>
<translation id="4006465311664329701">Google Payን የሚጠቀሙ የመክፈያ ዘዴዎች፣ ቅናሾች እና አድራሻዎች</translation>
<translation id="4009243425692662128">እርስዎ የሚያትሙት የገጾች ይዘት ለትንተና ወደ Google ደመና ወይም ሶስተኛ ወገኖች ይላካል። ለምሳሌ፣ አደጋን ሊያስከትል ለሚችል ውሂብ ሊቃኙ ይችላሉ።</translation>
<translation id="4010758435855888356">የማከማቻ መዳረሻ ይፈቀድ?</translation>
<translation id="401170183602135785">ሲ6 ፖስታ</translation>
-<translation id="4014128326099193693">{COUNT,plural, =1{{COUNT} ገጽ የያዘ የፒዲኤፍ ሰነድ}one{{COUNT} ገጾችን የያዘ የፒዲኤፍ ሰነድ}other{{COUNT} ገጾችን የያዘ የፒዲኤፍ ሰነድ}}</translation>
+<translation id="4014128326099193693">{COUNT,plural, =1{{COUNT} ገፅ የያዘ የፒዲኤፍ ሰነድ}one{{COUNT} ገጾችን የያዘ የፒዲኤፍ ሰነድ}other{{COUNT} ገጾችን የያዘ የፒዲኤፍ ሰነድ}}</translation>
<translation id="4023431997072828269">ይህ ቅጽ ደህንነቱ በማያስተማምን ግንኙነት በመጠቀም እየገባ ያለ ስለሆነ የእርስዎ መረጃ ለሌሎች የሚታይ ይሆናል።</translation>
<translation id="4025913568718019429">የGoogle የግላዊነት ቅንብሮች አዝራርን ያስተዳድሩ፣ የGoogle መለያዎን የግላዊነት ቅንብሮች ለመጎብኘት አስገባን ይጫኑ</translation>
<translation id="4030383055268325496">&amp;አክልን ቀልብስ</translation>
@@ -1269,7 +1269,7 @@
<translation id="4148925816941278100">American Express</translation>
<translation id="4150099059797363385">#4 የቻይና ፖስታ</translation>
<translation id="4151403195736952345">ሁለገብ ነባሪን ተጠቀም (አግኝ)</translation>
-<translation id="4152318981910038897">{COUNT,plural, =1{ገጽ 1}one{ገጽ {COUNT}}other{ገጽ {COUNT}}}</translation>
+<translation id="4152318981910038897">{COUNT,plural, =1{ገፅ 1}one{ገፅ {COUNT}}other{ገፅ {COUNT}}}</translation>
<translation id="4154664944169082762">የጣት አሻራዎች</translation>
<translation id="4159784952369912983">ሐምራዊ</translation>
<translation id="4165986682804962316">የጣቢያ ቅንብሮች</translation>
@@ -1295,17 +1295,17 @@
<translation id="421066178035138955">የምናባዊ እውነታ መሣሪያዎችን እና ውሂብ ይጠቀሙ</translation>
<translation id="4213305257324635756">የእነማ ፊልሞች</translation>
<translation id="4213500579045346575">የሰውነት ግንባታ</translation>
-<translation id="4214357935346142455">በማያ ገጽ መግቢያ መገለጫ</translation>
+<translation id="4214357935346142455">በማያ ገፅ መግቢያ መገለጫ</translation>
<translation id="4220128509585149162">ብልሽቶች</translation>
-<translation id="422022731706691852">በ<ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> ላይ ያሉ አጥቂዎች (የአሰሳ ተሞክሮዎን የሚጎዱ ፕሮግራሞችን እንዲጭኑ ሊያታልልዎት ሊሞክሩ ይችላሉ ለምሳሌ፦ የእርስዎን የመነሻ ገጽ በመለወጥ ወይም እርስዎ በሚጎበኙዋቸው ጣቢያዎች ላይ ትርፍ ማስታወቂያዎችን ማሳየት የመሳሰሉ በማድረግ)። <ph name="BEGIN_LEARN_MORE_LINK" />የበለጠ ለመረዳት<ph name="END_LEARN_MORE_LINK" /></translation>
+<translation id="422022731706691852">በ<ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> ላይ ያሉ አጥቂዎች (የአሰሳ ተሞክሮዎን የሚጎዱ ፕሮግራሞችን እንዲጭኑ ሊያታልልዎት ሊሞክሩ ይችላሉ ለምሳሌ፦ የእርስዎን የመነሻ ገፅ በመለወጥ ወይም እርስዎ በሚጎበኙዋቸው ጣቢያዎች ላይ ትርፍ ማስታወቂያዎችን ማሳየት የመሳሰሉ በማድረግ)። <ph name="BEGIN_LEARN_MORE_LINK" />የበለጠ ለመረዳት<ph name="END_LEARN_MORE_LINK" /></translation>
<translation id="4221630205957821124">&lt;h4&gt;ደረጃ 1፦ ወደ መግቢያው ይግቡ&lt;/h4&gt;
- &lt;p&gt;እንደ ካፌዎች ወይም የአየር ማረፊያዎች ያሉ የWi-Fi አውታረ መረቦች እንዲገቡ ይፈልጋሉ። የመግቢያ ገጹን ለመመልከት &lt;code&gt;http://&lt;/code&gt;ን የሚጠቀም ገጽ ይጠቀሙ።&lt;/p&gt;
+ &lt;p&gt;እንደ ካፌዎች ወይም የአየር ማረፊያዎች ያሉ የWi-Fi አውታረ መረቦች እንዲገቡ ይፈልጋሉ። የመግቢያ ገጹን ለመመልከት &lt;code&gt;http://&lt;/code&gt;ን የሚጠቀም ገፅ ይጠቀሙ።&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;እንደ &lt;a href="http://example.com" target="_blank"&gt;http://example.com&lt;/a&gt; ያለ በ&lt;code&gt;http://&lt;/code&gt; ወደሚጀምር ማንኛውም ድር ጣቢያ ይሂዱ።&lt;/li&gt;
- &lt;li&gt;በይነመረቡን ለመጠቀም በሚከፈተው መግቢያ ገጽ ላይ በመለያ ይግቡ።&lt;/li&gt;
+ &lt;li&gt;በይነመረቡን ለመጠቀም በሚከፈተው መግቢያ ገፅ ላይ በመለያ ይግቡ።&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;ደረጃ 2፦ ገጹን ማንነት በማያሳውቅ ሁነታ ላይ ይክፈቱ (ኮምፒውተር ብቻ)&lt;/h4&gt;
- &lt;p&gt;ሲጎበኙት የነበረውን ገጽ ማንነት በማያሳውቅ መስኮት ውስጥ ይክፈቱት።&lt;/p&gt;
+ &lt;p&gt;ሲጎበኙት የነበረውን ገፅ ማንነት በማያሳውቅ መስኮት ውስጥ ይክፈቱት።&lt;/p&gt;
&lt;p&gt;ገጹ ከተከፈተ አንድ የChrome ቅጥያ በአግባቡ እየሰራ አይደለም። ስህተቱን ለማስተካከል ቅጥያውን ያጥፉት።&lt;/p&gt;
&lt;h4&gt;ደረጃ 3፦ ስርዓተ-ክወናዎን ያዘምኑት&lt;/h4&gt;
&lt;p&gt;መሣሪያዎ የተዘመነ መሆኑን ያረጋግጡ።&lt;/p&gt;
@@ -1426,7 +1426,7 @@
<translation id="4506176782989081258">የማረጋገጥ ስህተት፦ <ph name="VALIDATION_ERROR" /></translation>
<translation id="4506599922270137252">የሥርዓት አስተዳዳሪውን ማነጋገር</translation>
<translation id="450710068430902550">ከአስተዳዳሪ ጋር ማጋራት</translation>
-<translation id="4509074745930862522"><ph name="TRANSLATE_FOCUSED_FRIENDLY_MATCH_TEXT" />፣ ትርን ይጫኑ በመቀጠል በGoogle ትርጉም ይህን ገጽ ለመተርጎም አስገባን ይጫኑ</translation>
+<translation id="4509074745930862522"><ph name="TRANSLATE_FOCUSED_FRIENDLY_MATCH_TEXT" />፣ ትርን ይጫኑ በመቀጠል በGoogle ትርጉም ይህን ገፅ ለመተርጎም አስገባን ይጫኑ</translation>
<translation id="4514308731478712184">ጉዞዎችን ያጥፉ</translation>
<translation id="4515275063822566619">ካርዶች እና አድራሻዎች ከChrome እና ከGoogle መለያዎ (<ph name="ACCOUNT_EMAIL" />) የተገኙ ናቸው። በ<ph name="BEGIN_LINK" />ቅንብሮች<ph name="END_LINK" /> ውስጥ ሊያቀናብሯቸው ይችላሉ።</translation>
<translation id="4520048001084013693">ይህን ፋይል ማውረድ በአስተዳዳሪ መመሪያ ታግዷል</translation>
@@ -1444,7 +1444,7 @@
<translation id="4541810033354695636">ትክክለኛ እውነታ</translation>
<translation id="4542971377163063093">መሳቢያ 6</translation>
<translation id="455113658016510503">A9</translation>
-<translation id="4556069465387849460">የይለፍ ቃላትን ለመሙላት ማያ ገጽ መቆለፊያዎን እየተጠቀሙ ነው</translation>
+<translation id="4556069465387849460">የይለፍ ቃላትን ለመሙላት ማያ ገፅ መቆለፊያዎን እየተጠቀሙ ነው</translation>
<translation id="4558551763791394412">ቅጥያዎችዎን አሰናክለው ይሞክሩ።</translation>
<translation id="4566017918361049074">ከቤት ውጭ</translation>
<translation id="4567686777917670400">የእርስዎ አስተዳዳሪ በርቀት የአሳሽዎን ውቅረት መቀየር ይችላል። በዚህ መሣሪያ ላይ ያለ እንቅስቃሴ እንዲሁም ከChromium ውጭ ሊተዳደር ይችላል። <ph name="BEGIN_LINK" />የበለጠ ለመረዳት<ph name="END_LINK" /></translation>
@@ -1493,7 +1493,7 @@
<translation id="467662567472608290">ይህ አገልጋይ <ph name="DOMAIN" /> መሆኑን ሊያረጋግጥ አልቻለም፤ የደህንነት እውቅና ማረጋገጫው ስህተቶች አሉበት። ይሄ በተሳሳተ አወቃቀር ወይም አንድ አጥቂ ግንኙነትዎን በመጥለፉ የተከሰተ ሊሆን ይችላል።</translation>
<translation id="4677585247300749148"><ph name="URL" /> ለተደራሽነት ክስተቶች ምላሽ መስጠት ይፈልጋል</translation>
<translation id="467809019005607715">Google ስላይዶች</translation>
-<translation id="4682496302933121474">ገጽ ይተርጎም?</translation>
+<translation id="4682496302933121474">ገፅ ይተርጎም?</translation>
<translation id="468314109939257734">የእርስዎን ምናባዊ ካርድ ቁጥር ይመልከቱ</translation>
<translation id="4687718960473379118">በጣቢያ የተጠቆሙ ማስታወቂያዎች</translation>
<translation id="4692623383562244444">የፍለጋ ፕሮግራሞች</translation>
@@ -1533,7 +1533,7 @@
<translation id="4758311279753947758">የእውቂያ መረጃን ያክሉ</translation>
<translation id="4761104368405085019">ማይክፎሮንዎን ይጠቀማል</translation>
<translation id="4761869838909035636">የChrome ደህንነት ፍተሻን ያሂዱ</translation>
-<translation id="4764776831041365478"><ph name="URL" /> ላይ ያለው ድረ-ገጽ ለጊዜው የማይሰራ ወይም እስከመጨረሻው ወደ አዲስ የድር አድራሻ ተዛውሮ ሊሆን ይችላል።</translation>
+<translation id="4764776831041365478"><ph name="URL" /> ላይ ያለው ድረ-ገፅ ለጊዜው የማይሰራ ወይም እስከመጨረሻው ወደ አዲስ የድር አድራሻ ተዛውሮ ሊሆን ይችላል።</translation>
<translation id="4766713847338118463">ድርብ ከታች ስቴፕለር ምታ</translation>
<translation id="4771973620359291008">ያልታወቀ ስህተት ተከስቷል።</translation>
<translation id="477945296921629067">{NUM_POPUPS,plural, =1{ብቅ-ባይ ታግዷል}one{# ብቅ-ባዮች ታግዷል}other{# ብቅ-ባዮች ታግዷል}}</translation>
@@ -1572,7 +1572,7 @@
<translation id="4853901935952445031">ይህ ጣቢያ ከፌብሩዋሪ 2022 በኋላ የU2F ኤፒአዩን መጠቀም አይችልም። የዚህ ጣቢያ ባለቤት ከሆኑ የድር ማረጋገጫ ኤፒአዩን እንዲጠቀም መለወጥ አለብዎት።</translation>
<translation id="4854362297993841467">የማድረሻ ዘዴው አይገኝም። የተለየ ዘዴ ይሞክሩ።</translation>
<translation id="4854853140771946034">በGoogle Keep ውስጥ አዲስ ማስታወሻ በፍጥነት ፍጠር</translation>
-<translation id="4858792381671956233">ይህን ገጽ መጎብኘት ችግር ካለው ወላጆችዎንጠይቀዋል</translation>
+<translation id="4858792381671956233">ይህን ገፅ መጎብኘት ችግር ካለው ወላጆችዎንጠይቀዋል</translation>
<translation id="485902285759009870">ኮድ በማረጋገጥ ላይ...</translation>
<translation id="486459320933704969">ወላጅ ወይም አሳዳጊ ይህን ድር ጣቢያ ቢጎበኙ ምንም ችግር የለውም ማለት አለባቸው</translation>
<translation id="4866506163384898554">የእርስዎን ጠቋሚ ለማሳየት |<ph name="ACCELERATOR1" />| + |<ph name="ACCELERATOR2" />| ይጫኑ</translation>
@@ -1634,7 +1634,7 @@
<translation id="5015510746216210676">የማሽን ስም፦</translation>
<translation id="5017554619425969104">እርስዎ የቀዱት ጽሁፍ</translation>
<translation id="5017828934289857214">በኋላ አስታውሰኝ</translation>
-<translation id="5018422839182700155">ይህን ገጽ መክፈት አልተቻለም</translation>
+<translation id="5018422839182700155">ይህን ገፅ መክፈት አልተቻለም</translation>
<translation id="5018802455907704660">16 x 20 ኢንች</translation>
<translation id="5019198164206649151">የመጠባበቂያ ማከማቻ በመጥፎ ሁኔታ ላይ</translation>
<translation id="5020776957610079374">የዓለም ሙዚቃ</translation>
@@ -1708,7 +1708,7 @@
<translation id="5169827969064885044">የድርጅት መለያዎን መዳረሻ ሊያጡ ወይም የማንነት ስርቆት ሊያጋጥመዎት ይችላሉ። Chrome የይለፍ ቃልዎን አሁን እንዲቀይሩ ይመክራል።</translation>
<translation id="5171045022955879922">ይፈልጉ ወይም ዩአርኤል ይጻፉ</translation>
<translation id="5172758083709347301">ማሽን</translation>
-<translation id="5177076414499237632">ስለዚህ ገጽ ምንጭ እና ርዕስ ይወቁ</translation>
+<translation id="5177076414499237632">ስለዚህ ገፅ ምንጭ እና ርዕስ ይወቁ</translation>
<translation id="5179510805599951267">በ<ph name="ORIGINAL_LANGUAGE" /> አይደለም? ይህን ስህተት ሪፖርት ያድርጉ</translation>
<translation id="518639307526414276">የቤት እንስሳት ምግብ እና የቤት እንስሳት እንክብካቤ አቅርቦቶች</translation>
<translation id="5190072300954988691">ካሜራ እና ማይክሮፎን አይፈቀዱም</translation>
@@ -1716,7 +1716,7 @@
<translation id="5191315092027169558">የእርስዎ መገለጫ የሚተዳደረው በ<ph name="DOMAIN" /> ነው።</translation>
<translation id="51918995459521422"><ph name="ORIGIN" /> በርካታ ፋይሎችን ለማውረድ ይፈልጋል</translation>
<translation id="519422657042045905">ማብራሪያ አይገኝም</translation>
-<translation id="5201306358585911203">በዚህ ድረ-ገጽ ላይ ያለ የተካተተ ገጽ እንዲህ ይላል፦</translation>
+<translation id="5201306358585911203">በዚህ ድረ-ገፅ ላይ ያለ የተካተተ ገፅ እንዲህ ይላል፦</translation>
<translation id="5205222826937269299">ስም ያስፈልጋል</translation>
<translation id="5209518306177824490">SHA-1 የጣት አሻራ</translation>
<translation id="5209670883520018268">መሳቢያ 20</translation>
@@ -1780,9 +1780,9 @@
<translation id="5340250774223869109">መተግበሪያ ታግዷል</translation>
<translation id="534295439873310000">የNFC መሣሪያዎች</translation>
<translation id="5344522958567249764">የማስታወቂያ ግላዊነትን ያስተዳድሩ</translation>
-<translation id="5344579389779391559">ይህ ገጽ እርስዎን ገንዘብ ለማስከፈል ሊሞክር ይችላል</translation>
+<translation id="5344579389779391559">ይህ ገፅ እርስዎን ገንዘብ ለማስከፈል ሊሞክር ይችላል</translation>
<translation id="5347645913823149105">በChrome አዝራር ውስጥ ቅርጸ-ቁምፊዎችን ያብጁ፣ በChrome ውስጥ የቅርጸ-ቁምፊ መጠኖችን እና መልከ ቁምፊዎችን ለማበጀት አስገባን ይጫኑ</translation>
-<translation id="5355557959165512791">የዕውቅና ማረጋገጫው ስለተሻረ <ph name="SITE" />ን መጎብኘት አይችሉም። የአውታረ መረብ ስህተቶች እና ጥቃቶች አብዛኛው ጊዜ ጊዜያዊ ብቻ ናቸው፣ ስለዚህ ይህ ገጽ በኋላ ላይ ሊሠራ ይችላል።</translation>
+<translation id="5355557959165512791">የዕውቅና ማረጋገጫው ስለተሻረ <ph name="SITE" />ን መጎብኘት አይችሉም። የአውታረ መረብ ስህተቶች እና ጥቃቶች አብዛኛው ጊዜ ጊዜያዊ ብቻ ናቸው፣ ስለዚህ ይህ ገፅ በኋላ ላይ ሊሠራ ይችላል።</translation>
<translation id="5357848622083956825">የምስል ስነ ጥበብ እና ንድፍ</translation>
<translation id="536296301121032821">የመምሪያ ቅንብሮችን ማከማቸት አልተሳካም</translation>
<translation id="5363309033720083897">በአስተዳዳሪዎ የተፈቀደ ተከታታይ ወደብ</translation>
@@ -1810,7 +1810,7 @@
<translation id="5430298929874300616">ዕልባት አስወግድ</translation>
<translation id="5443468954631487277">ተቃራኒ ቅደም-ተከተል ፊቱ ወደ ላይ</translation>
<translation id="5447765697759493033">ይህ ጣቢያ አይተረጎምም</translation>
-<translation id="5452270690849572955">ይህ <ph name="HOST_NAME" /> ገጽ ሊገኝ አይችልም</translation>
+<translation id="5452270690849572955">ይህ <ph name="HOST_NAME" /> ገፅ ሊገኝ አይችልም</translation>
<translation id="5455374756549232013">መጥፎ የመምሪያ ጊዜ ማህተም</translation>
<translation id="5457113250005438886">ልክ ያልሆነ</translation>
<translation id="5458150163479425638">{CONTACT,plural, =0{<ph name="CONTACT_PREVIEW" />}=1{<ph name="CONTACT_PREVIEW" /> እና <ph name="NUMBER_OF_ADDITIONAL_CONTACTS" /> ተጨማሪ}one{<ph name="CONTACT_PREVIEW" /> እና <ph name="NUMBER_OF_ADDITIONAL_CONTACTS" /> ተጨማሪ}other{<ph name="CONTACT_PREVIEW" /> እና <ph name="NUMBER_OF_ADDITIONAL_CONTACTS" /> ተጨማሪ}}</translation>
@@ -1881,7 +1881,7 @@
<translation id="5606444889871204172"><ph name="BEGIN_BOLD" />ውሂብዎን እንዴት ማስተዳደር እንደሚችሉ፦<ph name="END_BOLD" /> Chrome ከ4 ሳምንታት በላይ የቆዩ ጣቢያዎችን በራስ-ሰር ይሰርዛል። እንደገና የሚጎበኙት ጣቢያ በዝርዝሩ ላይ እንደገና ሊታይ ይችላል። እንዲሁም አንድ ጣቢያ ለእርስዎ ማስታወቂያዎችን እንዳይጠቁም ማገድ እና በማንኛውም ጊዜ በChrome ቅንብሮች ውስጥ በጣቢያ የተጠቆሙ ማስታወቂያዎችን ማጥፋት ይችላሉ።</translation>
<translation id="5610142619324316209">ግንኙነቱን መፈተሽ</translation>
<translation id="5610807607761827392">ካርዶችን እና አድራሻዎችን በ<ph name="BEGIN_LINK" />ቅንብሮች<ph name="END_LINK" /> ውስጥ ማቀናበር ይችላሉ።</translation>
-<translation id="561165882404867731">በGoogle ትርጉም አማካኝነት ይህን ገጽ ይተርጉሙ</translation>
+<translation id="561165882404867731">በGoogle ትርጉም አማካኝነት ይህን ገፅ ይተርጉሙ</translation>
<translation id="5612720917913232150"><ph name="URL" /> የኮምፒውተርዎን አካባቢ መጠቀም ይፈልጋል</translation>
<translation id="561669346091975195">የቲቪ ሳይሳዊ ልብወለድ እና ምናባዊ ትርዒቶች</translation>
<translation id="5617949217645503996"><ph name="HOST_NAME" /> እርስዎን በጣም ብዙ ጊዜ ወደ ሌላ ቦታ መርተዎታል።</translation>
@@ -1902,10 +1902,10 @@
<translation id="5659593005791499971">ኢሜይል</translation>
<translation id="5663955426505430495">የዚህ መሣሪያ አስተዳዳሪ ለተጨማሪ ተግባራት ቅጥያዎችን ጭኗል። ቅጥያዎች የአንዳንድ ውሂብዎ መዳረሻ አላቸው።</translation>
<translation id="5666606186680807225">የባህር ዳርቻዎች እና ደሴቶች</translation>
-<translation id="5675650730144413517">ይህ ገጽ እየሠራ አይደለም</translation>
+<translation id="5675650730144413517">ይህ ገፅ እየሠራ አይደለም</translation>
<translation id="568292603005599551">የምስል X አቀማመጥ</translation>
<translation id="5684277895745049190">ዝርዝር</translation>
-<translation id="5684874026226664614">ውይ። ይህ ገጽ ሊተረጎም አይችልም።</translation>
+<translation id="5684874026226664614">ውይ። ይህ ገፅ ሊተረጎም አይችልም።</translation>
<translation id="5685654322157854305">የመላኪያ አድራሻ ያክሉ</translation>
<translation id="5689199277474810259">ወደ JSON ላክ</translation>
<translation id="5689516760719285838">አካባቢ</translation>
@@ -1945,7 +1945,7 @@
<translation id="578305955206182703">አምበር</translation>
<translation id="57838592816432529">ድምፅ ይዝጉ</translation>
<translation id="5784606427469807560">የእርስዎን ካርድ ማረጋገጥ ላይ አንድ ችግር ነበር። የበይነመረብ ግንኙነትዎን ይፈትሹት እና እንደገና ይሞክሩ።</translation>
-<translation id="5785756445106461925">በተጨማሪ፣ ይህ ገጽ ደህንነታቸው ያልተጠበቀ ሌሎች ንብረቶችን አካትቷል። እነዚህ ንብረቶች በሽግግር ወቅት በሌሎች ሊታዩ ይችላሉ፣ እናም የገጹን መልክ ለመለወጥ በአጥቂዎች ሊቀየሩ ይችላሉ።</translation>
+<translation id="5785756445106461925">በተጨማሪ፣ ይህ ገፅ ደህንነታቸው ያልተጠበቀ ሌሎች ንብረቶችን አካትቷል። እነዚህ ንብረቶች በሽግግር ወቅት በሌሎች ሊታዩ ይችላሉ፣ እናም የገጹን መልክ ለመለወጥ በአጥቂዎች ሊቀየሩ ይችላሉ።</translation>
<translation id="5786044859038896871">የካርድዎን መረጃ መሙላት ይፈልጋሉ?</translation>
<translation id="578633867165174378">Chrome እርስዎ አሁን የተጠቀሙበትን የይለፍ ቃል በውሂብ ጥሰት ውስጥ አግኝቷል። ይህንን የይለፍ ቃል አሁን እንዲቀይሩ እንመክራለን።</translation>
<translation id="5789643057113097023">.</translation>
@@ -1967,9 +1967,9 @@
<translation id="5852909432155870672">RA4</translation>
<translation id="5860033963881614850">አጥፋ</translation>
<translation id="5862579898803147654">ቁልል 8</translation>
-<translation id="5863847714970149516">ከፊት ያለው ገጽ እርስዎን ገንዘብ ለማስከፈል ሊሞክር ይችላል</translation>
+<translation id="5863847714970149516">ከፊት ያለው ገፅ እርስዎን ገንዘብ ለማስከፈል ሊሞክር ይችላል</translation>
<translation id="5866257070973731571">ስልክ ቁጥር ያክሉ</translation>
-<translation id="5866898949289125849">እርስዎ የገንቢ መሣሪያዎች ገጽ እየተመለከቱ ነው</translation>
+<translation id="5866898949289125849">እርስዎ የገንቢ መሣሪያዎች ገፅ እየተመለከቱ ነው</translation>
<translation id="5869405914158311789">ይህ ጣቢያ ሊደረስበት አይችልም</translation>
<translation id="5869522115854928033">የተቀመጡ የይለፍ ቃሎች</translation>
<translation id="5872692522325383488">አይቢኤኤን ተቀምጧል</translation>
@@ -1996,7 +1996,7 @@
<translation id="5924782825030413055">የመጨረሻው የፈቃደኝነት ዝማኔ ምንጭ፦</translation>
<translation id="5928444777041341328">ቤት እና የአትክልት ስፍራ</translation>
<translation id="5932224571077948991">ጣቢያ ረባሽ ወይም አሳሳች ማስታወቂያዎችን ያሳያል</translation>
-<translation id="5937560539988385583">ገጽ ተተርጉሟል</translation>
+<translation id="5937560539988385583">ገፅ ተተርጉሟል</translation>
<translation id="5938153366081463283">ምናባዊ ካርድ ያክሉ</translation>
<translation id="5938793338444039872">Troy</translation>
<translation id="5947508410139465809">እርስዎ የሚሰቅሏቸው ወይም ዓባሪ የሚያደርጓቸው ፋይሎች ለትንታኔ ወደ Google ደመና ወይም ሦስተኛ ወገኖች ይላካሉ። ለምሳሌ፣ አደጋ ሊያስከትል ለሚችል ውሂብ ወይም ለተንኮል አዘል ዌር ሊቃኙ እና ምናልባት በኩባንያ መመሪያዎች መሰረት ሊከማቹ ይችላሉ።</translation>
@@ -2048,10 +2048,10 @@
<translation id="6045164183059402045">የማስፈጸሚያ ቅንብር ደንብ</translation>
<translation id="6047233362582046994">በእርስዎ ደህንነት ላይ የሚያመጣቸውን ስጋቶች ከተረዱ አደገኛ መተግበሪያዎቹ ከመወገዳቸው በፊት <ph name="BEGIN_LINK" />ይህን ጣቢያ መጎብኘት<ph name="END_LINK" /> ይችላሉ።</translation>
<translation id="6047927260846328439">ይህ ይዘት ሶፍትዌር እንዲጭኑ ወይም የግል መረጃ ገልጸው እንዲያሳዩ እርስዎን ለማሳሳት ሊሞክር ይችል ይሆናል። <ph name="BEGIN_LINK" />የሆነው ሆኖ አሳይ<ph name="END_LINK" /></translation>
-<translation id="6049004884579590341">ከሙሉ ማያ ገጽ ለመውጣት |<ph name="ACCELERATOR" />|ን ተጭነው ይያዙ</translation>
+<translation id="6049004884579590341">ከሙሉ ማያ ገፅ ለመውጣት |<ph name="ACCELERATOR" />|ን ተጭነው ይያዙ</translation>
<translation id="6049056807983403918">ቢ4 ፖስታ</translation>
-<translation id="6049488691372270142">ገጽ ማድረስ</translation>
-<translation id="6051221802930200923"><ph name="SITE" /> የዕውቅና ማረጋገጫ ሚስማር መሰካትን ስለሚጠቀም ድር ጣቢያውን አሁን መጎብኘት አይችሉም። የአውታረ መረብ ስህተቶች እና ጥቃቶች ብዙውን ጊዜ ጊዜያዊ ስለሆኑ ይህ ገጽ በኋላ ላይ ሊሠራ ይችላል።</translation>
+<translation id="6049488691372270142">ገፅ ማድረስ</translation>
+<translation id="6051221802930200923"><ph name="SITE" /> የዕውቅና ማረጋገጫ ሚስማር መሰካትን ስለሚጠቀም ድር ጣቢያውን አሁን መጎብኘት አይችሉም። የአውታረ መረብ ስህተቶች እና ጥቃቶች ብዙውን ጊዜ ጊዜያዊ ስለሆኑ ይህ ገፅ በኋላ ላይ ሊሠራ ይችላል።</translation>
<translation id="6051898664905071243">የገጽ ብዛት፦</translation>
<translation id="6052284303005792909">•</translation>
<translation id="6053735090575989697">Google በግላዊነት መመሪያችን ውስጥ እንዴት ውሂብዎን እንደሚጠብቅ የበለጠ ይወቁ።</translation>
@@ -2061,12 +2061,12 @@
<translation id="6060009363608157444">ልክ ያልሆነ የDnsOverHttps ሁነታ።</translation>
<translation id="6061154937977953833">ነፃ ትግል</translation>
<translation id="6062937464449575061">ዋጋ ላይ ክትትል ማድረግ አቁም</translation>
-<translation id="6064217302520318294">ማያ ገጽ መቆለፊያ</translation>
+<translation id="6064217302520318294">ማያ ገፅ መቆለፊያ</translation>
<translation id="6064602040258638498">ኩፖኖች እና የዋጋ ቅናሾች</translation>
<translation id="6080696365213338172">በአስተዳዳሪ የቀረበ የእውቅና ማረጋገጫ በመጠቀም ይዘት ደርሰዋል። ለ<ph name="DOMAIN" /> የሚያቀርቡት ውሂብ በአስተዳዳሪዎ ሊያዝ ይችላል።</translation>
<translation id="6087312102907839798">ተዛማጅ ፍለጋዎች</translation>
<translation id="6094273045989040137">አብራራ</translation>
-<translation id="6094290315941448991">ሚስጥራዊ ይዘት በሚታይበት ጊዜ የአስተዳዳሪ መመሪያ የማያ ገጽ ቀረጻን ያሰናክላል</translation>
+<translation id="6094290315941448991">ሚስጥራዊ ይዘት በሚታይበት ጊዜ የአስተዳዳሪ መመሪያ የማያ ገፅ ቀረጻን ያሰናክላል</translation>
<translation id="6099269767116481177">22 x 29.5 ኢንች</translation>
<translation id="6104072995492677441">JIS B6</translation>
<translation id="6105460996796456817">ጣቢያን ፍጠር</translation>
@@ -2118,7 +2118,7 @@
<translation id="6241121617266208201">የአስተያየት ጥቆማዎችን ደብቅ</translation>
<translation id="624499991300733384">የህትመት ጥንቅር አገልግሎት</translation>
<translation id="6252613631861574218"><ph name="MANAGE_CHROME_DOWNLOADS_FOCUSED_FRIENDLY_MATCH_TEXT" />፣ ከዚያ በChrome ውስጥ ያወረዷቸውን ፋይሎች ለማቀናበር ትርን ከዚያ አስገባን ይጫኑ</translation>
-<translation id="6254436959401408446">ይህን ገጽ ለመክፈት በቂ ማህደረ ትውስታ የለም</translation>
+<translation id="6254436959401408446">ይህን ገፅ ለመክፈት በቂ ማህደረ ትውስታ የለም</translation>
<translation id="6259156558325130047">&amp;ዳግም ደርድርን ድገም</translation>
<translation id="6263376278284652872"><ph name="DOMAIN" /> እልባቶች</translation>
<translation id="6264376385120300461">ለማንኛውም አውርድ</translation>
@@ -2133,7 +2133,7 @@
<translation id="6280223929691119688">ወደዚህ አድራሻ ማድረስ አይቻልም። የተለየ አድራሻ ይምረጡ።</translation>
<translation id="6284292079994426700">26 x 38 ኢንች</translation>
<translation id="6285507000506177184">በChrome አዝራር ውስጥ ውርዶችን ያቀናብሩ፣ በChrome ውስጥ ያወረዷቸውን ፋይሎች ለማቀናበር አስገባን ይጫኑ</translation>
-<translation id="6289939620939689042">ገጽ ቀለም</translation>
+<translation id="6289939620939689042">ገፅ ቀለም</translation>
<translation id="6290238015253830360">የእርስዎ የተጠቆሙ ዘገባዎች እዚህ ይመጣሉ</translation>
<translation id="6293309776179964942">JIS B5</translation>
<translation id="6295618774959045776">ካርድ ማረጋገጫ ኮድ፦</translation>
@@ -2143,7 +2143,7 @@
<translation id="6305205051461490394"><ph name="URL" /> ሊደረስበት አይችልም።</translation>
<translation id="6306713302480826305">ይህ አድራሻ ከዚህ እና ከሌሎች በመለያ የገቡባቸው መሣሪያዎች ይሰረዛል</translation>
<translation id="6311165245110979290">ምናባዊ ካርድ አለ</translation>
-<translation id="6312113039770857350">ድረ-ገጽ አይገኝም</translation>
+<translation id="6312113039770857350">ድረ-ገፅ አይገኝም</translation>
<translation id="6316226860534107313">ስኩተሮች እና ሞፔዶች</translation>
<translation id="63172326633386613">የተደራሽነት ቅንብሮችን ያቀናብሩ</translation>
<translation id="6319249456820053699">ካሜራዎች እና ካምኮርደሮች</translation>
@@ -2156,7 +2156,7 @@
<translation id="6337133576188860026">ከ<ph name="SIZE" /> ያነሰ ቦታ ያስለቅቃል። አንዳንድ ጣቢያዎች በሚቀጥለው ጉብኝትዎ ላይ ይበልጥ በዝግታ ሊጫኑ ይችላሉ።</translation>
<translation id="6337534724793800597">መምሪያዎችን በስም አጣራ</translation>
<translation id="633770708279464947">የ<ph name="SECURE_DNS_SALT" /> እሴት ልክ አይደለም እና ሥራ ላይ አይውልም።</translation>
-<translation id="6340739886198108203">ሚስጥራዊ ይዘት በሚታይበት ጊዜ የአስተዳዳሪ መመሪያ ቅጽበታዊ ገጽ እይታዎችን ወይም ቅጂዎች መውሰድን አይመክርም፡-</translation>
+<translation id="6340739886198108203">ሚስጥራዊ ይዘት በሚታይበት ጊዜ የአስተዳዳሪ መመሪያ ቅጽበታዊ ገፅ እይታዎችን ወይም ቅጂዎች መውሰድን አይመክርም፡-</translation>
<translation id="6341434961864773665">{0,plural, =1{የአስተዳዳሪ መመሪያ ይህን ፋይል ወደ <ph name="DESTINATION_NAME" /> መስቀልን አይመክርም}one{የአስተዳዳሪ መመሪያ ይህን ፋይል ወደ <ph name="DESTINATION_NAME" /> መስቀልን አይመክርም}other{የአስተዳዳሪ መመሪያ እነዚህን ፋይሎች ወደ <ph name="DESTINATION_NAME" /> መስቀልን አይመክርም}}</translation>
<translation id="6348220984832452017">ንቁ ተለዋዋጮች</translation>
<translation id="6349101878882523185"><ph name="APP_NAME" />ን ይጫኑ</translation>
@@ -2241,7 +2241,7 @@
<translation id="6554732001434021288">ለመጨረሻ ጊዜ የተጎበኘው ከ<ph name="NUM_DAYS" /> ቀናት በፊት ነው</translation>
<translation id="6556866813142980365">ድገም</translation>
<translation id="6557715786897013164">14 x 17 ኢንች</translation>
-<translation id="6569060085658103619">የቅጥያ ገጽ እየተመለከቱ ነው</translation>
+<translation id="6569060085658103619">የቅጥያ ገፅ እየተመለከቱ ነው</translation>
<translation id="6569366777234823130">ድራማ ፊልሞች</translation>
<translation id="6573200754375280815">ድርብ ብስ ቀኝ</translation>
<translation id="657902945730878902">መሳል እና ቀለም መቀባት</translation>
@@ -2355,7 +2355,7 @@
<translation id="6883221904761970440">ደህንነቱ የተጠበቀ የክፍያ ማስረጃ ማረጋገጫ ሉህ ተዘግቷል</translation>
<translation id="6884662655240309489">መጠን 1</translation>
<translation id="6886577214605505410"><ph name="LOCATION_TITLE" /> <ph name="SHORT_URL" /></translation>
-<translation id="6888584790432772780">Chrome ለማንበብ እንዲቀልል ይህን ገጽ አቃልሎታል። Chrome የመጀመሪያውን ገጽ ደህንነቱ ባልተጠበቀ ግንኙነት ላይ ሰርስሮ አውጥቶታል።</translation>
+<translation id="6888584790432772780">Chrome ለማንበብ እንዲቀልል ይህን ገፅ አቃልሎታል። Chrome የመጀመሪያውን ገፅ ደህንነቱ ባልተጠበቀ ግንኙነት ላይ ሰርስሮ አውጥቶታል።</translation>
<translation id="6890443033788248019">አካባቢ ይፈቀድ?</translation>
<translation id="6890531741535756070"><ph name="PROVIDER_ORIGIN" />ን በሚጠቀሙ ድር ጣቢያዎች ላይ በ<ph name="DEVICE_LABEL" /> ማረጋገጥን መርጠዋል። ይህ አቅራቢ እርስዎ <ph name="BEGIN_LINK" />እንዲሰረዝ መጠየቅ<ph name="END_LINK" /> የሚችሉት ስለእርስዎ የመክፈያ ዘዴ መረጃን አከማችቶ ሊሆን ይችላል።</translation>
<translation id="6890956352250146925">የኩኪዎች እና የጣቢያ ውሂብ አማራጮች</translation>
@@ -2409,7 +2409,7 @@
<translation id="6992499368826755835">የኦቶሞቲቭ ኢንዱስትሪ</translation>
<translation id="6996312675313362352">ሁልጊዜ <ph name="ORIGINAL_LANGUAGE" />ን ተርጉም</translation>
<translation id="6999969238895751684">የመዝናኛ ኢንዱስትሪ</translation>
-<translation id="7003335073762455340">ይህን ምርት እየተከታተሉ ነው። ይህ ገጽ በ<ph name="LAST_BOOKMARKS_FOLDER" /> ውስጥ ተቀምጧል።</translation>
+<translation id="7003335073762455340">ይህን ምርት እየተከታተሉ ነው። ይህ ገፅ በ<ph name="LAST_BOOKMARKS_FOLDER" /> ውስጥ ተቀምጧል።</translation>
<translation id="7004583254764674281">ካርዶችን በበለጠ ፍጥነት ለማረጋገጥ Windows Helloን ይጠቀሙ</translation>
<translation id="7006930604109697472">ለማንኛውም ላክ</translation>
<translation id="7012363358306927923">China UnionPay</translation>
@@ -2482,7 +2482,7 @@
<translation id="7180611975245234373">አድስ</translation>
<translation id="7181261019481237103">ማንነት የማያሳውቅ መስኮት ክፈት</translation>
<translation id="7182878459783632708">ምንም መምሪያዎች አልተዋቀሩም</translation>
-<translation id="7186367841673660872">ይህ ገጽ ከ<ph name="ORIGINAL_LANGUAGE" />ወደ<ph name="LANGUAGE_LANGUAGE" />ተተርጉሟል</translation>
+<translation id="7186367841673660872">ይህ ገፅ ከ<ph name="ORIGINAL_LANGUAGE" />ወደ<ph name="LANGUAGE_LANGUAGE" />ተተርጉሟል</translation>
<translation id="7186840261985974511">#12 ፖስታ</translation>
<translation id="718872491229180389">ቺርሊዲንግ</translation>
<translation id="7192188280913829296">እንዲሁም መገለጫ ባህሪው «vendor_id» መገለጽ አለበት።</translation>
@@ -2578,7 +2578,7 @@
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;ጀምር&lt;/strong&gt;ን ጠቅ ያድርጉ፣ ከዚያ &lt;strong&gt;«አካባቢያዊ አገልግሎቶችን ይመልከቱ»&lt;/strong&gt;ን ይምረጡ
&lt;li&gt;&lt;strong&gt;VisualDiscovery&lt;/strong&gt;ን ይምረጡ
- &lt;li&gt;በ&lt;strong&gt;የጅምር አይነት&lt;/strong&gt; ስር &lt;strong&gt;ተሰናክሏል&lt;/strong&gt;ን ይምረጡ
+ &lt;li&gt;በ&lt;strong&gt;የጅምር ዓይነት&lt;/strong&gt; ስር &lt;strong&gt;ተሰናክሏል&lt;/strong&gt;ን ይምረጡ
&lt;li&gt;በ&lt;strong&gt;የአገልግሎት ሁኔታ&lt;/strong&gt; ስር &lt;strong&gt;አቁም&lt;/strong&gt;ን ጠቅ ያድርጉ
&lt;li&gt;&lt;strong&gt;ተግብር&lt;/strong&gt;ን ጠቅ ያድርጉ፣ ከዚያ &lt;strong&gt;እሺ&lt;/strong&gt;ን ጠቅ ያድርጉ
&lt;li&gt;እንዴት ሶፍትዌሩን ከኮምፒውተርዎ እስከመጨረሻው ማስወገድ እንደሚችሉ ለማወቅ &lt;a href="https://support.google.com/chrome/answer/6098869"&gt;የChrome እገዛ ማዕከል&lt;/a&gt;ን ይጎብኙ
@@ -2632,7 +2632,7 @@
<translation id="7512685745044087310">ይህ መመሪያ ወደ «እውነት» መቀናበር እና አስገዳጅ መሆን አይችልም፣ በመሆኑም ወደ የሚመከር ተለውጧል።</translation>
<translation id="7514365320538308">አውርድ</translation>
<translation id="7517414872996418597">ሲ10 ፖስታ</translation>
-<translation id="7518003948725431193">ለዚህ የድር አድራሻ ምንም ድረ-ገጽ አልተገኘም፦ <ph name="URL" /></translation>
+<translation id="7518003948725431193">ለዚህ የድር አድራሻ ምንም ድረ-ገፅ አልተገኘም፦ <ph name="URL" /></translation>
<translation id="7521387064766892559">ጃቫስክሪፕት</translation>
<translation id="7521825010239864438">የ«<ph name="SECTION" />» ክፍል ተደብቋል</translation>
<translation id="7523408071729642236">ማምረት</translation>
@@ -2645,7 +2645,7 @@
<translation id="7543525346216957623">የእርስዎን ወላጅ ይጠይቁ</translation>
<translation id="7546409722674205727"><ph name="APP_NAME" /> በመጀመር ላይ</translation>
<translation id="7548892272833184391">የግንኙነት ስህተቶችን ያስተካክሉ</translation>
-<translation id="7549584377607005141">ይህ ድረ-ገጽ በአግባቡ እንዲታይ ቀደም ብለው ያስገቡት ውሂብ ያስፈልገዋል። ይህን ውሂብ እንደገና መላክ ይችላሉ፣ ነገር ግን ይህን በማድረግዎ ይህ ገጽ ከዚህ በፊት ያከናወነው ማንኛውም እርምጃ ይደግማሉ።</translation>
+<translation id="7549584377607005141">ይህ ድረ-ገፅ በአግባቡ እንዲታይ ቀደም ብለው ያስገቡት ውሂብ ያስፈልገዋል። ይህን ውሂብ እንደገና መላክ ይችላሉ፣ ነገር ግን ይህን በማድረግዎ ይህ ገፅ ከዚህ በፊት ያከናወነው ማንኛውም እርምጃ ይደግማሉ።</translation>
<translation id="7550637293666041147">የእርስዎ መሣሪያ ተጠቃሚ ስም እና የ Chrome ተጠቃሚ ስም</translation>
<translation id="7551484245293639699">የጉዞ መድህን</translation>
<translation id="755279583747225797">ሙከራ ንቁ ነው</translation>
@@ -2777,7 +2777,7 @@
<translation id="7815407501681723534">ለ«<ph name="SEARCH_STRING" />» <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> ተገኝተዋል።</translation>
<translation id="7822320754433038727">ማደን እና ተኩስ</translation>
<translation id="782886543891417279">እየተጠቀሙበት ያለው Wi-Fi (<ph name="WIFI_NAME" />) በመለያ መግቢያ ገጹን እንዲጎበኙ ሊጠይቅዎት ይችላል።</translation>
-<translation id="7840103971441592723">የማያ ገጽ ቀረጻ ተጀምሯል</translation>
+<translation id="7840103971441592723">የማያ ገፅ ቀረጻ ተጀምሯል</translation>
<translation id="7844689747373518809">{COUNT,plural, =0{ምንም}=1{1 መተግበሪያ (<ph name="EXAMPLE_APP_1" />)}=2{2 መተግበሪያዎች (<ph name="EXAMPLE_APP_1" />፣ <ph name="EXAMPLE_APP_2" />)}one{# መተግበሪያዎች (<ph name="EXAMPLE_APP_1" />፣ <ph name="EXAMPLE_APP_2" />፣ <ph name="AND_MORE" />)}other{# መተግበሪያዎች (<ph name="EXAMPLE_APP_1" />፣ <ph name="EXAMPLE_APP_2" />፣ <ph name="AND_MORE" />)}}</translation>
<translation id="7855695075675558090"><ph name="TOTAL_LABEL" /> <ph name="CURRENCY_CODE" /> <ph name="FORMATTED_TOTAL_AMOUNT" /></translation>
<translation id="7857116075376571629">በኋላ፣ የሚጎበኙት ጣቢያ የሚያዩዋቸውን ማስታወቂያዎች ለማበጀት ለርዕሶችዎ Chromeን መጠይቅ ይችላል። Chrome የአሰሳ ታሪክዎን እና ማንነትዎን በመጠበቅ ላይ ሳለ እስከ 3 የሚደርሱ ርዕሶችን ያጋራል።</translation>
@@ -2821,7 +2821,7 @@
<translation id="7956713633345437162">የተንቀሳቃሽ ስልክ ዕልባቶች</translation>
<translation id="7961015016161918242">በፍጹም</translation>
<translation id="7962467575542381659">የመሠረተ ሥርዓት ማሽን</translation>
-<translation id="7966803981046576691">የስራ መለያ አይነት</translation>
+<translation id="7966803981046576691">የስራ መለያ ዓይነት</translation>
<translation id="79682505114836835">እሴት «<ph name="VALUE" />» ልክ ያልሆነ የአስራስድስትዮሽ ቀለም ነው።</translation>
<translation id="7968982339740310781">ዝርዝሮችን ይመልከቱ</translation>
<translation id="7976214039405368314">በጣም ብዙ ጥያቄዎች</translation>
@@ -2829,10 +2829,10 @@
<translation id="7981129096182302364">የዳንስ እና ኤሌክትሮኒክ ሙዚቃ</translation>
<translation id="798134797138789862">ምናባዊ የእውነታ መሣሪያዎችን እና ውሂብን ለመጠቀም መጠየቅ ይችላል</translation>
<translation id="7983008347525536475">ኤስዩቪዎች</translation>
-<translation id="7984945080620862648">ድር ጣቢያው Chrome ሊሰራባቸው የማይችላቸው የተዘበራረቁ ምስክርነቶችን ስለላከ <ph name="SITE" />ን አሁን መጎብኘት ይችላሉ። የአውታረ መረብ ስህተቶች እና ጥቃቶች አብዛኛው ጊዜ ጊዜያዊ ናቸው፣ ስለዚህ ይህ ገጽ በኋላ ላይ ሊሰራ ይችላል።</translation>
+<translation id="7984945080620862648">ድር ጣቢያው Chrome ሊሰራባቸው የማይችላቸው የተዘበራረቁ ምስክርነቶችን ስለላከ <ph name="SITE" />ን አሁን መጎብኘት ይችላሉ። የአውታረ መረብ ስህተቶች እና ጥቃቶች አብዛኛው ጊዜ ጊዜያዊ ናቸው፣ ስለዚህ ይህ ገፅ በኋላ ላይ ሊሰራ ይችላል።</translation>
<translation id="7986319120639858961"><ph name="CARD_TITLE" /> <ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
<translation id="799149739215780103">ጠርዝ</translation>
-<translation id="7992044431894087211">ከ <ph name="APPLICATION_TITLE" /> ጋር የማያ ገጽ መጋራት ከቆመበት ቀጥሏል</translation>
+<translation id="7992044431894087211">ከ <ph name="APPLICATION_TITLE" /> ጋር የማያ ገፅ መጋራት ከቆመበት ቀጥሏል</translation>
<translation id="7995512525968007366">አልተጠቀሰም</translation>
<translation id="7998269595945679889">ማንነት የማያሳውቅ ትር አዝራርን ይክፈቱ፣ በግል እንዲያስሱ አዲስ ማንነት የማያሳውቅ ትርን ለመክፈት አስገባን ይጫኑ</translation>
<translation id="800218591365569300">የማህደረ ትውስታ ቦታን ለማስለቀቅ ሌሎች ትሮችን ወይም ፕሮግራሞችን ዘግተው ይሞክሩ።</translation>
@@ -2851,7 +2851,7 @@
<translation id="8027077570865220386">መሳቢያ 15</translation>
<translation id="8028698320761417183"><ph name="CREATE_GOOGLE_FORM_FOCUSED_FRIENDLY_MATCH_TEXT" />፣ በGoogle ቅጾች ውስጥ አዲስ ቅጽ በፍጥነት ለመፍጠር ትርን ከዚያ አስገባን ይጫኑ</translation>
<translation id="8028960012888758725">ከሥራው በኋላ ከርክም</translation>
-<translation id="8034522405403831421">ይህ ገጽ በ<ph name="SOURCE_LANGUAGE" /> ነው። ወደ <ph name="TARGET_LANGUAGE" /> ይተርጎም?</translation>
+<translation id="8034522405403831421">ይህ ገፅ በ<ph name="SOURCE_LANGUAGE" /> ነው። ወደ <ph name="TARGET_LANGUAGE" /> ይተርጎም?</translation>
<translation id="8035152190676905274">ብዕር</translation>
<translation id="8037117624646282037">በቅርቡ ማን ይህን መሣሪያ እንደተጠቀመ</translation>
<translation id="8037357227543935929">ጠይቅ (ነባሪ)</translation>
@@ -2923,7 +2923,7 @@
<translation id="8217748145574471584">የሰው ኃይል አስተዳደር</translation>
<translation id="8218327578424803826">የተመደበ መገኛ አካባቢ፦</translation>
<translation id="8225771182978767009">ይህን ኮምፒውተር ያቀናበረው ሰው ይህን ጣቢያ ለማገድ መርጧል።</translation>
-<translation id="8228419419708659934">ሁለት ገጽ ዕይታ</translation>
+<translation id="8228419419708659934">ሁለት ገፅ ዕይታ</translation>
<translation id="8229288958566709448"><ph name="WIDTH" /> x <ph name="HEIGHT" /> ሚሜ</translation>
<translation id="822964464349305906"><ph name="TYPE_1" />፣ <ph name="TYPE_2" /></translation>
<translation id="8231564988424805352">የስፖርት ጨዋታዎች</translation>
@@ -2933,10 +2933,10 @@
<translation id="8237519162179154808">የትርፍ ጊዜ እንቅስቃሴዎች እና መዝናኛዎች</translation>
<translation id="8238188918340945316">28 x 40 ኢንች</translation>
<translation id="8238581221633243064">ገጹን ማንነት በማያሳውቅ አዲስ ትር ውስጥ ይክፈቱ</translation>
-<translation id="8241707690549784388">እየፈለጉት ያሉት ገጽ ያስገቡትን መረጃ ተጥቅሟል። ወደዛ ገጽ መመለስ ወስደውት የነበረውን ርምጃ እንዲደገም ሊያደርግ ይችላል። ለመቀጠል ይፈልጋሉ?</translation>
+<translation id="8241707690549784388">እየፈለጉት ያሉት ገፅ ያስገቡትን መረጃ ተጥቅሟል። ወደዛ ገፅ መመለስ ወስደውት የነበረውን ርምጃ እንዲደገም ሊያደርግ ይችላል። ለመቀጠል ይፈልጋሉ?</translation>
<translation id="8241712895048303527">በዚህ ጣቢያ ላይ አግድ</translation>
<translation id="8242426110754782860">ቀጥል</translation>
-<translation id="8245703462678310750">ከሙሉ ገጽ ዕይታ ለመውጣት እና ውርድን ለማየት |<ph name="ACCELERATOR" />|ን ተጭነው ይያዙ።</translation>
+<translation id="8245703462678310750">ከሙሉ ገፅ ዕይታ ለመውጣት እና ውርድን ለማየት |<ph name="ACCELERATOR" />|ን ተጭነው ይያዙ።</translation>
<translation id="8249296373107784235">አጨንግፍ</translation>
<translation id="8249463483885748674">መደበኛ እና የመግቢያዎች ፈተናዎች</translation>
<translation id="8252991034201168845">የተደራሽነት ቅንብሮች አዝራርን ያቀናብሩ፣ በChromeOS ቅንብሮች ውስጥ የተደራሽነት መሣሪያዎችዎን ግላዊነት ለማላበስ ያስገቡ</translation>
@@ -3000,7 +3000,7 @@
<translation id="8398335999901363925">በንክኪ ለመሞላት የሚገኙ የመክፈያ ዘዴዎች በሙሉ ቁመት ተከፍተዋል።</translation>
<translation id="8398790343843005537">ስልክዎን ያግኙ</translation>
<translation id="8405579342203358118">በChrome ቅንብሮች ውስጥ ምን መረጃ እንደሚያሰምሩ ያቀናብሩ</translation>
-<translation id="8406071103346257942">የይለፍ ቃላትን ለመሙላት ማያ ገጽ መቆለፊያዎን መጠቀም ያቁሙ</translation>
+<translation id="8406071103346257942">የይለፍ ቃላትን ለመሙላት ማያ ገፅ መቆለፊያዎን መጠቀም ያቁሙ</translation>
<translation id="8409413588194360210">የክፍያ ተቆጣጣሪዎች</translation>
<translation id="8412145213513410671">ብልሽቶች (<ph name="CRASH_COUNT" />)</translation>
<translation id="8412392972487953978">ተመሳሳዩ የይለፍ ሐረጉን ሁለት ጊዜ ማስገባት አለብዎት።</translation>
@@ -3094,7 +3094,7 @@
<translation id="8672264262457010862">ንግድ እና ኢንዱስትሪ</translation>
<translation id="8676424191133491403">የዘገየ የለም</translation>
<translation id="8680536109547170164"><ph name="QUERY" />፣ መልስ፣ <ph name="ANSWER" /></translation>
-<translation id="8681531050781943054">በ<ph name="PAGE" /> ላይ ያለው ድረ-ገጽ ሊጫን አልቻለም ምክንያቱም፦</translation>
+<translation id="8681531050781943054">በ<ph name="PAGE" /> ላይ ያለው ድረ-ገፅ ሊጫን አልቻለም ምክንያቱም፦</translation>
<translation id="8687429322371626002">የእርስዎ መሣሪያ እና መለያ የሚተዳደሩት በ<ph name="MANAGER" /> ነው።</translation>
<translation id="8688672835843460752">ይገኛል</translation>
<translation id="868922510921656628">ገጾች በስብስብብ</translation>
@@ -3151,7 +3151,7 @@
<translation id="8798739476508189189">የአሳሽ ጥቆማዎችን እየፈለጉ ነው? ይጎብኙ</translation>
<translation id="8805819170075074995">የዝርዝር ግቤት «<ph name="LANGUAGE_ID" />»፦ ግቤት እንዲሁም በSpellcheckLanguage መመሪያው ላይ ስለተካተተ ችላ ተብሏል።</translation>
<translation id="8806285662264631610">የመታጠቢያ እና የሰውነት ምርቶች</translation>
-<translation id="8807160976559152894">ከእያንዳንዱ ገጽ በኋላ ከርክም</translation>
+<translation id="8807160976559152894">ከእያንዳንዱ ገፅ በኋላ ከርክም</translation>
<translation id="8809203544698246977">የታገዱ ርዕሶች እዚህ ላይ ይታያሉ</translation>
<translation id="8813277370772331957">ቆይተህ አስታውሰኝ</translation>
<translation id="8814707942599948500">ሲ8 ፖስታ</translation>
@@ -3206,7 +3206,7 @@
<translation id="8951415078585015151">ህግ እና መንግስት</translation>
<translation id="8957210676456822347">የተያዥ መግቢያ ፈቀዳ</translation>
<translation id="8963117664422609631">ወደ የጣቢያ ቅንብሮች ይሂዱ</translation>
-<translation id="8963213021028234748"><ph name="MARKUP_1" />አስተያየቶች፦<ph name="MARKUP_2" /> የውሂብ ግንኙነት እንዳለዎት እርግጠኛ ይሁኑ<ph name="MARKUP_3" />ይህንን ድረ-ገጽ ቆይተው ዳግም ይጫኑት<ph name="MARKUP_4" /> ያስገቡትን አድራሻ ይፈትሹ<ph name="MARKUP_5" /></translation>
+<translation id="8963213021028234748"><ph name="MARKUP_1" />አስተያየቶች፦<ph name="MARKUP_2" /> የውሂብ ግንኙነት እንዳለዎት እርግጠኛ ይሁኑ<ph name="MARKUP_3" />ይህንን ድረ-ገፅ ቆይተው ዳግም ይጫኑት<ph name="MARKUP_4" /> ያስገቡትን አድራሻ ይፈትሹ<ph name="MARKUP_5" /></translation>
<translation id="8968766641738584599">ካርድ አስቀምጥ</translation>
<translation id="8971063699422889582">የአገልጋይ እውቅና ማረጋገጫ ጊዜው አልፎበታል።</translation>
<translation id="8975012916872825179">እንደ ስልክ ቁጥሮች፣ ኢሜይል አድራሻዎች እና የመላኪያ አድራሻዎች ያሉ መረጃዎችን ያካትታል</translation>
@@ -3232,7 +3232,7 @@
<translation id="9018120810758822233">ለ<ph name="CREDIT_CARD" /> የይለፍ ኮድዎን ያስገቡ</translation>
<translation id="901834265349196618">ኢሜይል</translation>
<translation id="9020200922353704812">የካርድ ማስከፈያ አድራሻ ያስፈልጋል</translation>
-<translation id="9020542370529661692">ይህ ገጽ ወደ <ph name="TARGET_LANGUAGE" /> ተተርጉሟል</translation>
+<translation id="9020542370529661692">ይህ ገፅ ወደ <ph name="TARGET_LANGUAGE" /> ተተርጉሟል</translation>
<translation id="9020742383383852663">A8</translation>
<translation id="9021429684248523859"><ph name="SHARE_THIS_PAGE_FOCUSED_FRIENDLY_MATCH_TEXT" />፣ ትርን ይጫኑ ከዚያ አገናኙን በማጋራት፣ የQR ኮድ በመፍጠር፣ ካስት በማድረግ እና በሌሎችም ይህን ትር ለማጋራት ያስገቡ</translation>
<translation id="9025348182339809926">(ልክ ያልሆነ)</translation>
@@ -3240,7 +3240,7 @@
<translation id="9035022520814077154">የደህንነት ጥበቃ ስህተት</translation>
<translation id="9036306139374661733">ማይክሮፎን ይፈቀድ?</translation>
<translation id="9038649477754266430">ገጾችን ይበልጥ በፍጥነት ለመጫን የግመታ አገልግሎትን ይጠቀሙ</translation>
-<translation id="9039213469156557790">በተጨማሪ፣ ይህ ገጽ ደህንነታቸው ያልተጠበቀ ሌሎች ንብረቶችን አካትቷል። እነዚህ ንብረቶች በሽግግር ወቅት በሌሎች ሊታዩ ይችላሉ፣ እናም የገጹን ባህሪ ለመለወጥ በአጥቂዎች ሊቀየሩ ይችላሉ።</translation>
+<translation id="9039213469156557790">በተጨማሪ፣ ይህ ገፅ ደህንነታቸው ያልተጠበቀ ሌሎች ንብረቶችን አካትቷል። እነዚህ ንብረቶች በሽግግር ወቅት በሌሎች ሊታዩ ይችላሉ፣ እናም የገጹን ባህሪ ለመለወጥ በአጥቂዎች ሊቀየሩ ይችላሉ።</translation>
<translation id="9040464167025094690">የእኔን መሣሪያ አግኝ አዝራር፣ በGoogle መለያ ውስጥ መሳርያዎን ያግኙን ለመጎብኘት አስገባንን ይጫኑ</translation>
<translation id="9042617223719777575">ትልቅ የመያዝ አቅም</translation>
<translation id="9044359186343685026">የንክኪ መታወቂያን ተጠቀም</translation>
@@ -3266,10 +3266,10 @@
<translation id="9096679202588811390">የቲቪ ትርዒቶች እና ፕሮግራሞች</translation>
<translation id="9101630580131696064">መሳቢያ 1</translation>
<translation id="9103537084693478942">የቪዲዮ ሶፍትዌር</translation>
-<translation id="9103872766612412690"><ph name="SITE" /> የእርስዎን መረጃ ለመጠበቅ በመደበኝነት ምስጠራን ይጠቀማል። Chromium አሁን ከ<ph name="SITE" /> ጋር ለመገናኘት ሲሞክር ድር ጣቢያው ያልተለመዱ እና ትክክል ያልሆኑ ምስክርነቶችን መልሷል። ይህ አንድ አጥቂ <ph name="SITE" />ን አስመስሎ ለመቅረብ ሲሞክር ነው ወይም አንድ የWi-Fi መግቢያ ገጽ ግንኙነቱን ሲቋረጥ ሊከሰት ይችላል። Chromium ማንኛውም የውሂብ ልውውጥ ከመካሄዱ በፊት ግንኙነቱን ስላቋረጠው አሁንም የእርስዎ መረጃ ደህንነት የተጠበቀ ነው።</translation>
+<translation id="9103872766612412690"><ph name="SITE" /> የእርስዎን መረጃ ለመጠበቅ በመደበኝነት ምስጠራን ይጠቀማል። Chromium አሁን ከ<ph name="SITE" /> ጋር ለመገናኘት ሲሞክር ድር ጣቢያው ያልተለመዱ እና ትክክል ያልሆኑ ምስክርነቶችን መልሷል። ይህ አንድ አጥቂ <ph name="SITE" />ን አስመስሎ ለመቅረብ ሲሞክር ነው ወይም አንድ የWi-Fi መግቢያ ገፅ ግንኙነቱን ሲቋረጥ ሊከሰት ይችላል። Chromium ማንኛውም የውሂብ ልውውጥ ከመካሄዱ በፊት ግንኙነቱን ስላቋረጠው አሁንም የእርስዎ መረጃ ደህንነት የተጠበቀ ነው።</translation>
<translation id="9106062320799175032">የመክፈያ አድራሻ ያክሉ</translation>
<translation id="9107467864910557787">የእርስዎ አሳሽ የሚተዳደረው በ<ph name="MANAGER" /> ነው</translation>
-<translation id="91108059142052966">ሚስጥራዊ ይዘት በሚታይበት ጊዜ የአስተዳዳሪ መመሪያ ከ <ph name="APPLICATION_TITLE" /> ጋር የማያ ገጽ መጋራትን ያሰናክላል</translation>
+<translation id="91108059142052966">ሚስጥራዊ ይዘት በሚታይበት ጊዜ የአስተዳዳሪ መመሪያ ከ <ph name="APPLICATION_TITLE" /> ጋር የማያ ገፅ መጋራትን ያሰናክላል</translation>
<translation id="9114524666733003316">ካርድን በማረጋገጥ ላይ...</translation>
<translation id="9114581008513152754">ይህ አሳሽ በኩባንያ ወይም ሌላ ድርጅት አይተዳደርም። በዚህ መሣሪያ ላይ ያለ እንቅስቃሴ ከChrome ውጭ ሊተዳደር ይችላል። <ph name="BEGIN_LINK" />የበለጠ ለመረዳት<ph name="END_LINK" /></translation>
<translation id="9116548361133462832">በChrome ውስጥ ስላሉ ማስታወቂያዎች ተጨማሪ</translation>
@@ -3280,7 +3280,7 @@
<translation id="9128016270925453879">መመሪያዎች ተጭነዋል</translation>
<translation id="9128870381267983090">ከአውታረ መረብ ጋር ይገናኙ</translation>
<translation id="9131119348384879525">ሚስጥራዊ ይዘት ይቀረጹ?</translation>
-<translation id="9133985615769429248">ይህን መሣሪያ ከሌሎች ጋር የሚጋሩ ከሆነ የተቀመጠ የይለፍ ቃልን በተጠቀሙ ቁጥር እርስዎ መሆንዎን ለማረጋገጥ ማያ ገጽ መቆለፊያዎን መጠቀም ይችላሉ</translation>
+<translation id="9133985615769429248">ይህን መሣሪያ ከሌሎች ጋር የሚጋሩ ከሆነ የተቀመጠ የይለፍ ቃልን በተጠቀሙ ቁጥር እርስዎ መሆንዎን ለማረጋገጥ ማያ ገፅ መቆለፊያዎን መጠቀም ይችላሉ</translation>
<translation id="9136861683332321024">የቅንጦት ተሽከርካሪዎች</translation>
<translation id="9137013805542155359">የመጀመሪያውን አሳይ</translation>
<translation id="9137248913990643158">ይህን መተግበሪያ ከመጠቀምዎ በፊት እባክዎ ይጀምሩና ወደ Chrome ይግቡ።</translation>
@@ -3300,7 +3300,7 @@
<translation id="9166851138617700776">ስለ በጣቢያ የተጠቆሙ ማስታወቂያዎች እና የማስታወቂያ ልኬት ተጨማሪ</translation>
<translation id="9168814207360376865">የተቀመጡ የመክፈያ ዘዴዎች ካልዎት ጣቢያዎች እንዲፈትሹ ይፍቀዱ</translation>
<translation id="9169664750068251925">ሁልጊዜ በዚህ ጣቢያ ላይ አግድ</translation>
-<translation id="9169931577761441333"><ph name="APP_NAME" />ን ወደ መነሻ ገጽ ያክሉ</translation>
+<translation id="9169931577761441333"><ph name="APP_NAME" />ን ወደ መነሻ ገፅ ያክሉ</translation>
<translation id="9170848237812810038">&amp;ቀልብስ</translation>
<translation id="9171296965991013597">መተግበሪያ ይተው?</translation>
<translation id="9173282814238175921">ነጠላ ሰነድ/አዲስ ሉህ</translation>
diff --git a/chromium/components/strings/components_strings_ar.xtb b/chromium/components/strings/components_strings_ar.xtb
index 98c5aea594e..7458e314c77 100644
--- a/chromium/components/strings/components_strings_ar.xtb
+++ b/chromium/components/strings/components_strings_ar.xtb
@@ -2164,7 +2164,7 @@
<translation id="6340739886198108203">حسب سياسة المشرف، لا يُنصح بأخذ لقطات شاشة أو تسجيل فيديوهات لمحتوى سرّي معروض على الشاشة:</translation>
<translation id="6341434961864773665">{0,plural, =1{لا تنصح سياسة المشرف بتحميل هذا الملف إلى <ph name="DESTINATION_NAME" />.}zero{لا تنصح سياسة المشرف بتحميل هذه الملفات إلى <ph name="DESTINATION_NAME" />.}two{لا تنصح سياسة المشرف بتحميل هذين الملفَين إلى <ph name="DESTINATION_NAME" />.}few{لا تنصح سياسة المشرف بتحميل هذه الملفات إلى <ph name="DESTINATION_NAME" />.}many{لا تنصح سياسة المشرف بتحميل هذه الملفات إلى <ph name="DESTINATION_NAME" />.}other{لا تنصح سياسة المشرف بتحميل هذه الملفات إلى <ph name="DESTINATION_NAME" />.}}</translation>
<translation id="6348220984832452017">الأنماط المتنوّعة المفعَّلة</translation>
-<translation id="6349101878882523185">تثبيت <ph name="APP_NAME" /></translation>
+<translation id="6349101878882523185">تثبيت "<ph name="APP_NAME" />"</translation>
<translation id="6353505687280762741">{COUNT,plural, =0{ما من كلمات مرور}=1{كلمة مرور واحدة (للقائمة <ph name="DOMAIN_LIST" />، تمت المزامنة)}=2{كلمتا مرور (للقائمة <ph name="DOMAIN_LIST" />، تمت المزامنة)}few{# كلمات مرور (للقائمة <ph name="DOMAIN_LIST" />، تمت المزامنة)}many{# كلمة مرور (للقائمة <ph name="DOMAIN_LIST" />، تمت المزامنة)}other{# كلمة مرور (للقائمة <ph name="DOMAIN_LIST" />، تمت المزامنة)}}</translation>
<translation id="6355392890578844978">‏لا تتم إدارة هذا المتصفِّح من خلال شركة أو مؤسسة أخرى. وقد تتم إدارة النشاط على هذا الجهاز خارج Chromium. <ph name="BEGIN_LINK" />مزيد من المعلومات<ph name="END_LINK" /></translation>
<translation id="6358450015545214790">ماذا تعني هذه الأقسام؟</translation>
@@ -2438,7 +2438,7 @@
<translation id="706295145388601875">‏إضافة عناوين وإدارتها في إعدادات متصفّح Chrome</translation>
<translation id="7064851114919012435">معلومات الاتصال</translation>
<translation id="7067633076996245366">موسيقى "سول" وموسيقى "آر آند بي"</translation>
-<translation id="7068733155164172741">أدخِل الرمز المكوَّن من <ph name="OTP_LENGTH" /> رقم.</translation>
+<translation id="7068733155164172741">أدخِل الرمز الذي يبلغ عدد أرقامه <ph name="OTP_LENGTH" />.</translation>
<translation id="70705239631109039">اتصالك بهذا الموقع تتخلله ثغرات أمنية.</translation>
<translation id="7075452647191940183">الطلب كبير جدًا</translation>
<translation id="7078665357168027058">RA3</translation>
@@ -2972,7 +2972,7 @@
<translation id="829335040383910391">الصوت</translation>
<translation id="8294431847097064396">المصدر</translation>
<translation id="8296205692406981542">منتزهات وحدائق عامة ومحلية</translation>
-<translation id="8297545700510100061">يتم استخدام ملفات تعريف الارتباط وبيانات الموقع الإلكتروني الأخرى لتذكُّر بيانات تسجيل دخولك أو تقديم إعلانات مخصّصة لك مثلاً. لإدارة ملفات تعريف الارتباط لجميع المواقع الإلكترونية، يمكنك الانتقال إلى <ph name="SETTINGS" />.</translation>
+<translation id="8297545700510100061">يتم استخدام ملفات تعريف الارتباط وبيانات المواقع الإلكترونية الأخرى لتذكُّر بيانات تسجيل دخولك أو تقديم إعلانات مخصّصة لك مثلاً. لإدارة ملفات تعريف الارتباط لجميع المواقع الإلكترونية، يمكنك الانتقال إلى <ph name="SETTINGS" />.</translation>
<translation id="8298115750975731693">‏قد يتتطلب Wi-Fi الذي تستخدمه (<ph name="WIFI_NAME" />) زيارة <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation>
<translation id="8299269255470343364">اليابانية</translation>
<translation id="8303854710873047864">تم عرض قسم "<ph name="SECTION" />"</translation>
diff --git a/chromium/components/strings/components_strings_as.xtb b/chromium/components/strings/components_strings_as.xtb
index e4f3bf0cc30..95b0fe184d2 100644
--- a/chromium/components/strings/components_strings_as.xtb
+++ b/chromium/components/strings/components_strings_as.xtb
@@ -2297,7 +2297,7 @@
<translation id="6711464428925977395">প্ৰ’ক্সি ছার্ভাৰত কিবা আসোঁৱাহ আছে বা ঠিকনাটো শুদ্ধ নহয়।</translation>
<translation id="6716672519412350405"><ph name="URL" />এ আপোনাৰ চৌপাশৰ এখন 3D মেপ সৃষ্টি কৰিবলৈ আৰু কেমেৰাৰ স্থান ট্ৰেক কৰিবলৈ বিচাৰিছে</translation>
<translation id="6718612893943028815">কেমেৰা ব্যৱহাৰ কৰিবনে?</translation>
-<translation id="6721678857435001674">আপোনাৰ সুৰক্ষা সম্পৰ্কীয় চাবিৰ মেক আৰু ম’ডেল চাওক</translation>
+<translation id="6721678857435001674">আপোনাৰ সুৰক্ষা সম্পৰ্কীয় চাবিৰ মেক আৰু মডেল চাওক</translation>
<translation id="6727094998759448074">SRA4</translation>
<translation id="6732087373923685049">কেমেৰা</translation>
<translation id="6738516213925468394">আপোনাৰ ডেটাখিনি আপুনি <ph name="BEGIN_LINK" />ছিংক কৰি থোৱা পাছফ্ৰে'জ<ph name="END_LINK" />ৰ সহায়ত <ph name="TIME" />ত এনক্রিপ্ট কৰা হৈছিল। ছিংক আৰম্ভ কৰিবলৈ এইটো দিয়ক।</translation>
diff --git a/chromium/components/strings/components_strings_be.xtb b/chromium/components/strings/components_strings_be.xtb
index 2372269e9de..5a92a45987b 100644
--- a/chromium/components/strings/components_strings_be.xtb
+++ b/chromium/components/strings/components_strings_be.xtb
@@ -1389,7 +1389,7 @@
<translation id="4386413576162606861">Ролевыя гульні</translation>
<translation id="4390472908992056574">Мяжа</translation>
<translation id="4393632246160856858">Тавары для догляду пазногцяў</translation>
-<translation id="4406883609789734330">Імгненныя субцітры</translation>
+<translation id="4406883609789734330">Аўтаматычныя субцітры</translation>
<translation id="4406896451731180161">вынікі пошуку</translation>
<translation id="4408413947728134509">Файлы cookie: <ph name="NUM_COOKIES" /></translation>
<translation id="4411435778612100394">Бытавая электроніка</translation>
diff --git a/chromium/components/strings/components_strings_cs.xtb b/chromium/components/strings/components_strings_cs.xtb
index 9426a29c2c8..b7603eb2fdf 100644
--- a/chromium/components/strings/components_strings_cs.xtb
+++ b/chromium/components/strings/components_strings_cs.xtb
@@ -2892,7 +2892,7 @@ Kontaktujte administrátora systému.</translation>
<translation id="8118489163946903409">Platební metoda</translation>
<translation id="8123046743443732598">Stolní počítače</translation>
<translation id="8124639700796374294">Tlačítko přizpůsobení Chromu. Stisknutím klávesy Enter si můžete přizpůsobit vzhled prohlížeče</translation>
-<translation id="8126056688005753476">Dobrodružné cestování</translation>
+<translation id="8126056688005753476">Cestování za dobrodružstvím</translation>
<translation id="8127301229239896662">Software <ph name="SOFTWARE_NAME" /> na počítači nebo v síti nebyl nainstalován správně. Požádejte administrátora IT o vyřešení tohoto problému.</translation>
<translation id="8131740175452115882">Potvrdit</translation>
<translation id="8148608574971654810">Verze PDF:</translation>
@@ -3008,7 +3008,7 @@ Další podrobnosti:
<translation id="8428634594422941299">Rozumím</translation>
<translation id="8431194080598727332"><ph name="MANAGE_COOKIES_FOCUSED_FRIENDLY_MATCH_TEXT" />, stisknutím tabulátoru a poté klávesy Enter můžete spravovat nastavení souborů cookie v nastavení Chromu</translation>
<translation id="8433057134996913067">Budete odhlášeni z většiny webů.</translation>
-<translation id="8434840396568290395">Domácí zvířata</translation>
+<translation id="8434840396568290395">Domácí mazlíčci</translation>
<translation id="8437238597147034694">&amp;Vrátit přesunutí zpět</translation>
<translation id="8438476240229491014">Zapamatovat toto nastavení</translation>
<translation id="8438786541497918448">Použít kameru a mikrofon?</translation>
diff --git a/chromium/components/strings/components_strings_cy.xtb b/chromium/components/strings/components_strings_cy.xtb
index acc9eb3bf3c..b779bf331bb 100644
--- a/chromium/components/strings/components_strings_cy.xtb
+++ b/chromium/components/strings/components_strings_cy.xtb
@@ -928,7 +928,7 @@ Fel arall, bydd eich gosodiadau preifatrwydd yn rhwystro hyn. Bydd hyn yn caniat
<translation id="3281350579597955952">{0,plural, =1{Nid yw polisi gweinyddwr yn argymell agor y ffeil hon yn <ph name="DESTINATION_NAME" />}zero{Nid yw polisi gweinyddwr yn argymell agor y ffeiliau hyn yn <ph name="DESTINATION_NAME" />}two{Nid yw polisi gweinyddwr yn argymell agor y ffeiliau hyn yn <ph name="DESTINATION_NAME" />}few{Nid yw polisi gweinyddwr yn argymell agor y ffeiliau hyn yn <ph name="DESTINATION_NAME" />}many{Nid yw polisi gweinyddwr yn argymell agor y ffeiliau hyn yn <ph name="DESTINATION_NAME" />}other{Nid yw polisi gweinyddwr yn argymell agor y ffeiliau hyn yn <ph name="DESTINATION_NAME" />}}</translation>
<translation id="3282085321714087552">Mae eich sefydliad, <ph name="ENROLLMENT_DOMAIN" />, wedi anfon rhywfaint o wybodaeth at y gwefannau canlynol, megis gosodiadau neu bolisïau.</translation>
<translation id="3282497668470633863">Ychwanegwch yr enw ar y cerdyn</translation>
-<translation id="3286372614333682499">portread</translation>
+<translation id="3286372614333682499">fertigol</translation>
<translation id="3287510313208355388">Lawrlwytho ar ôl cysylltu â'r we</translation>
<translation id="3288238092761586174">Mae'n bosib y bydd angen i <ph name="URL" /> gymryd camau ychwanegol i ddilysu eich taliad</translation>
<translation id="3293642807462928945">Dysgu rhagor am y polisi <ph name="POLICY_NAME" /></translation>
diff --git a/chromium/components/strings/components_strings_da.xtb b/chromium/components/strings/components_strings_da.xtb
index 3fd65c36dfb..6581fc7c29f 100644
--- a/chromium/components/strings/components_strings_da.xtb
+++ b/chromium/components/strings/components_strings_da.xtb
@@ -27,7 +27,7 @@
<translation id="1043382569739532657">Bevillinger, legater og finansiel bistand</translation>
<translation id="1048785276086539861">Når du redigerer annoteringer, skifter dette dokument tilbage til enkeltsidevisning</translation>
<translation id="1050038467049342496">Luk andre apps</translation>
-<translation id="1053959602163383901">Du har valgt at bekræfte med en authenticator-enhed på websites, der anvender <ph name="PROVIDER_ORIGIN" />. Denne udbyder har muligvis gemt oplysninger om din betalingsmetode. Du kan <ph name="LINK_TEXT" /> af disse oplysninger.</translation>
+<translation id="1053959602163383901">Du har valgt at verificere med en authenticator-enhed på websites, der anvender <ph name="PROVIDER_ORIGIN" />. Denne udbyder har muligvis gemt oplysninger om din betalingsmetode. Du kan <ph name="LINK_TEXT" /> af disse oplysninger.</translation>
<translation id="1055184225775184556">&amp;Fortryd tilføjelse</translation>
<translation id="1056663316309890343">Fotosoftware</translation>
<translation id="1056898198331236512">Advarsel</translation>
@@ -198,7 +198,7 @@ Ellers vil det blive blokeret af dine privatlivsindstillinger. Det giver det ind
<translation id="1408787208417187241">Trehæftning øverst</translation>
<translation id="1410941016594047814">Konvolut Invitation</translation>
<translation id="1413407968866574823">Action- og platformspil</translation>
-<translation id="1413809658975081374">Fejl i forbindelse med beskyttelse af personlige oplysninger</translation>
+<translation id="1413809658975081374">Fejl i forbindelse med privatlivbeskyttelse</translation>
<translation id="1414134146594747368">Børnehave</translation>
<translation id="1422930527989633628">Websitet kan anmode om tilladelse til at søge efter Bluetooth-enheder i nærheden</translation>
<translation id="1426410128494586442">Ja</translation>
@@ -276,7 +276,7 @@ Ellers vil det blive blokeret af dine privatlivsindstillinger. Det giver det ind
<translation id="1572765991610098222"><ph name="WIDTH" /> x <ph name="HEIGHT" /> tommer</translation>
<translation id="1581080074034554886">CVC</translation>
<translation id="1583429793053364125">Noget gik galt ved visningen af denne webside.</translation>
-<translation id="1584492003828271317">Om de annoncer, du ser på nettet, er tilpassede, afhænger af denne indstilling, dvs. Foreslåede annoncer fra websites, dine cookieindstillinger, og om det website, du besøger, tilpasser annoncer</translation>
+<translation id="1584492003828271317">Om de annoncer, du ser på nettet, er personligt tilpasset, afhænger af denne indstilling, dvs. Foreslåede annoncer fra websites, dine cookieindstillinger, og om det website, du besøger, tilpasser annoncer</translation>
<translation id="1586541204584340881">Hvilke udvidelser, du har installeret</translation>
<translation id="1588438908519853928">Normal</translation>
<translation id="1592005682883173041">Lokal dataadgang</translation>
@@ -348,7 +348,7 @@ Ellers vil det blive blokeret af dine privatlivsindstillinger. Det giver det ind
<translation id="1736420071277903564">Computer</translation>
<translation id="1740951997222943430">Angiv en gyldig udløbsmåned</translation>
<translation id="1741613555002899862">Skal angives og være en gyldig streng, når DnsOverHttpsMode er <ph name="SECURE_DNS_MODE_SECURE" />.</translation>
-<translation id="1745399796851657441"><ph name="BEGIN_BOLD" />Sådan bruger vi disse data:<ph name="END_BOLD" /> Chrome registrerer emner, du kan være interesseret i, mens du browser. Emneetiketter er foruddefinerede og omfatter ting som Kunst og underholdning, Shopping og Sport. Senere, når du besøger et website, kan websitet anmode Chrome om nogle få af dine emner (men ikke din browserhistorik) for at tilpasse de annoncer, du får vist.</translation>
+<translation id="1745399796851657441"><ph name="BEGIN_BOLD" />Sådan bruger vi disse data:<ph name="END_BOLD" /> Chrome registrerer emner, du kan være interesseret i, mens du browser. Emneetiketter er foruddefinerede og omfatter ting som Kunst og underholdning, Shopping og Sport. Senere, når du besøger et website, kan websitet anmode Chrome om nogle få af dine emner (men ikke din browserhistorik) for at personligt tilpasse de annoncer, du får vist.</translation>
<translation id="1745880797583122200">Din browser administreres</translation>
<translation id="1746113442205726301">Billedskift Y</translation>
<translation id="1746531169546376413">0 grader</translation>
@@ -442,7 +442,7 @@ Ellers vil det blive blokeret af dine privatlivsindstillinger. Det giver det ind
<translation id="2003709556000175978">Nulstil din adgangskode nu</translation>
<translation id="2003775180883135320">Fire huller øverst</translation>
<translation id="201174227998721785">Administrer tilladelser og data, der gemmes på websites, i Chrome-indstillingerne</translation>
-<translation id="2019607688127825327">Knappen "Administrer indstillinger for hjælpefunktioner" – tryk på Enter for at tilpasse dine hjælpefunktioner i Chrome-indstillingerne</translation>
+<translation id="2019607688127825327">Knappen "Administrer indstillinger for hjælpefunktioner" – tryk på Enter for at personligt tilpasse dine hjælpefunktioner i Chrome-indstillingerne</translation>
<translation id="202224654587969958">12 x 19 tommer</translation>
<translation id="2025115093177348061">Augmented reality</translation>
<translation id="2025186561304664664">Proxyen konfigureres automatisk.</translation>
@@ -633,7 +633,7 @@ Ellers vil det blive blokeret af dine privatlivsindstillinger. Det giver det ind
<translation id="2512101340618156538">Ikke tilladt (standard)</translation>
<translation id="2512413427717747692">Knappen Angiv Chrome som standardbrowser, tryk på Enter for at angive Chrome som systemets standardbrowser i iOS-indstillingerne</translation>
<translation id="2515629240566999685">Tjekke signalet i dit område</translation>
-<translation id="2515761554693942801">Du har valgt at bekræfte med Touch ID på websites, der anvender <ph name="PROVIDER_ORIGIN" />. Denne udbyder har muligvis gemt oplysninger om din betalingsmetode. Du kan <ph name="LINK_TEXT" /> af disse oplysninger.</translation>
+<translation id="2515761554693942801">Du har valgt at verificere med Touch ID på websites, der anvender <ph name="PROVIDER_ORIGIN" />. Denne udbyder har muligvis gemt oplysninger om din betalingsmetode. Du kan <ph name="LINK_TEXT" /> af disse oplysninger.</translation>
<translation id="2521385132275182522">Hæftning nederst til højre</translation>
<translation id="2521736961081452453">Opret formular</translation>
<translation id="2523886232349826891">Gemmes kun på denne enhed</translation>
@@ -669,7 +669,7 @@ Ellers vil det blive blokeret af dine privatlivsindstillinger. Det giver det ind
<translation id="2587841377698384444">Id for Directory API:</translation>
<translation id="2594318783181750337">Hurtig webvisning:</translation>
<translation id="2595719060046994702">Denne enhed og konto administreres ikke af et selskab eller en organisation.</translation>
-<translation id="2596415276201385844">For at kunne oprette en sikker forbindelse skal dit ur skal være indstillet korrekt. Det er vigtigt, da de certifikater, som websites bruger til at identificere sig selv, kun er gyldige i bestemte tidsperioder. Da uret på din enhed går forkert, kan Chrome ikke bekræfte disse certifikater.</translation>
+<translation id="2596415276201385844">For at kunne oprette en sikker forbindelse skal dit ur skal være indstillet korrekt. Det er vigtigt, da de certifikater, som websites bruger til at identificere sig selv, kun er gyldige i bestemte tidsperioder. Da uret på din enhed går forkert, kan Chrome ikke verificere disse certifikater.</translation>
<translation id="2597378329261239068">Dette dokument er adgangskodebeskyttet. Angiv en adgangskode.</translation>
<translation id="259821504105826686">Foto- og digitalkunst</translation>
<translation id="2601150049980261779">Romantiske film</translation>
@@ -729,7 +729,7 @@ Ellers vil det blive blokeret af dine privatlivsindstillinger. Det giver det ind
<translation id="2730326759066348565"><ph name="BEGIN_LINK" />Køre Diagnosticering af forbindelse<ph name="END_LINK" /></translation>
<translation id="2730600605555029057">Klassisk musik</translation>
<translation id="2731382536835015353">44 x 68 tommer</translation>
-<translation id="2734319753272419592">Giv Google tilladelse til at bruge din kurv til at søge efter tilpassede rabatter. Hvis der er tilgængelige rabatter, vises de automatisk i din kurv.</translation>
+<translation id="2734319753272419592">Giv Google tilladelse til at bruge din kurv til at søge efter personligt tilpassede rabatter. Hvis der er tilgængelige rabatter, vises de automatisk i din kurv.</translation>
<translation id="2738330467931008676">Vælg afhentningsadresse</translation>
<translation id="2740531572673183784">OK</translation>
<translation id="2742511345840685325">Bordtennis</translation>
@@ -917,7 +917,7 @@ Ellers vil det blive blokeret af dine privatlivsindstillinger. Det giver det ind
<translation id="3259648571731540213"><ph name="CREATE_GOOGLE_CALENDAR_EVENT_FOCUSED_FRIENDLY_MATCH_TEXT" />, tryk på Tab-tasten efterfulgt af Enter for hurtigt at oprette en ny begivenhed i Google Kalender</translation>
<translation id="3261488570342242926">Få flere oplysninger om virtuelle kort</translation>
<translation id="3264837738038045344">Knappen Administrer Chrome-indstillinger, tryk på Enter for at gå til dine Chrome-indstillinger</translation>
-<translation id="3266367459139339908">Vi lancerer nye metoder til at begrænse, hvad websites kan lære om dig, når de viser dig tilpassede annoncer, f.eks.:</translation>
+<translation id="3266367459139339908">Vi lancerer nye metoder til at begrænse, hvad websites kan lære om dig, når de viser dig personligt tilpassede annoncer, f.eks.:</translation>
<translation id="3266793032086590337">Værdi (modstridende)</translation>
<translation id="3266972086368072861">{NUM_COOKIES,plural, =0{Ingen websites, inkl. relaterede websites, er blokeret}=1{1 website, inkl. relaterede websites, er blokeret}one{# website, inkl. relaterede websites, er blokeret}other{# websites, inkl. relaterede websites, er blokeret}}</translation>
<translation id="3268451620468152448">Åbne faner</translation>
@@ -930,7 +930,7 @@ Ellers vil det blive blokeret af dine privatlivsindstillinger. Det giver det ind
<translation id="3282497668470633863">Tilføj navn på kort</translation>
<translation id="3286372614333682499">stående</translation>
<translation id="3287510313208355388">Download, når du er online</translation>
-<translation id="3288238092761586174"><ph name="URL" /> er muligvis nødt til at gennemføre yderligere trin for at bekræfte din betaling</translation>
+<translation id="3288238092761586174"><ph name="URL" /> er muligvis nødt til at gennemføre yderligere trin for at verificere din betaling</translation>
<translation id="3293642807462928945">Få flere oplysninger om politikken <ph name="POLICY_NAME" /></translation>
<translation id="3295444047715739395">Se og administrer dine adgangskoder i Chrome-indstillingerne</translation>
<translation id="3299098170013242198">Windows Hello er aktiveret med henblik på udfyldning af adgangskoder</translation>
@@ -969,7 +969,7 @@ Ellers vil det blive blokeret af dine privatlivsindstillinger. Det giver det ind
<translation id="3377736046129930310">Brug skærmlåsen til at bekræfte kort hurtigere</translation>
<translation id="3380365263193509176">Ukendt fejl</translation>
<translation id="3380864720620200369">Klient-id:</translation>
-<translation id="3381668585148405088">Bekræft dit køb</translation>
+<translation id="3381668585148405088">Verificer dit køb</translation>
<translation id="3383566085871012386">Aktuel rangfølge</translation>
<translation id="3387261909427947069">Betalingsmetoder</translation>
<translation id="3391030046425686457">Leveringsadresse</translation>
@@ -1398,7 +1398,7 @@ Ellers vil det blive blokeret af dine privatlivsindstillinger. Det giver det ind
<translation id="4414515549596849729">cookies og websitedata</translation>
<translation id="4415426530740016218">Afhentningsadresse</translation>
<translation id="4424024547088906515">Denne server kunne ikke bevise, at den er <ph name="DOMAIN" />, da Chrome ikke har tillid til sikkerhedscertifikatet. Dette kan skyldes en fejlkonfiguration, eller at en hacker har opfanget din forbindelse.</translation>
-<translation id="4428065317363009941">Annoncetilpasning</translation>
+<translation id="4428065317363009941">Personlig tilpasning af annoncer</translation>
<translation id="443121186588148776">Serieport</translation>
<translation id="4432688616882109544"><ph name="HOST_NAME" /> accepterede ikke dit logincertifikat, eller der er ikke angivet et.</translation>
<translation id="4432792777822557199">Sider på <ph name="SOURCE_LANGUAGE" /> oversættes fremover til <ph name="TARGET_LANGUAGE" /></translation>
@@ -1656,7 +1656,7 @@ Ellers vil det blive blokeret af dine privatlivsindstillinger. Det giver det ind
<translation id="5051305769747448211">Livekomedier</translation>
<translation id="5056425809654826431">{NUM_FILES,plural, =1{Hvis du vil sende denne fil ved hjælp af Deling tæt på, skal du frigøre plads (<ph name="DISK_SPACE_SIZE" />) på din enhed}one{Hvis du vil sende denne fil ved hjælp af Deling tæt på, skal du frigøre plads (<ph name="DISK_SPACE_SIZE" />) på din enhed}other{Hvis du vil sende disse filer ved hjælp af Deling tæt på, skal du frigøre plads (<ph name="DISK_SPACE_SIZE" />) på din enhed}}</translation>
<translation id="5056549851600133418">Artikler til dig</translation>
-<translation id="5060483733937416656">Du har valgt at bekræfte med Windows Hello på websites, der anvender <ph name="PROVIDER_ORIGIN" />. Denne udbyder har muligvis gemt oplysninger om din betalingsmetode. Du kan <ph name="LINK_TEXT" /> af disse oplysninger.</translation>
+<translation id="5060483733937416656">Du har valgt at verificere med Windows Hello på websites, der anvender <ph name="PROVIDER_ORIGIN" />. Denne udbyder har muligvis gemt oplysninger om din betalingsmetode. Du kan <ph name="LINK_TEXT" /> af disse oplysninger.</translation>
<translation id="5061227663725596739">Mente du <ph name="LOOKALIKE_DOMAIN" />?</translation>
<translation id="5066056036849835175">Udskrivningshistorik</translation>
<translation id="5068234115460527047">Hedgefonde</translation>
@@ -1840,7 +1840,7 @@ Ellers vil det blive blokeret af dine privatlivsindstillinger. Det giver det ind
<translation id="5519516356611866228">Med dine ændringer</translation>
<translation id="5523118979700054094">Navn på politik</translation>
<translation id="5525755241743357906">Filen kopieres eller flyttes</translation>
-<translation id="5526617258931667850"><ph name="MANAGE_CHROMEOS_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" /> – tryk på Tab-tasten efterfulgt af Enter for at tilpasse dine hjælpefunktioner i ChromeOS-indstillingerne</translation>
+<translation id="5526617258931667850"><ph name="MANAGE_CHROMEOS_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" /> – tryk på Tab-tasten efterfulgt af Enter for at personligt tilpasse dine hjælpefunktioner i ChromeOS-indstillingerne</translation>
<translation id="5528532273234423708">Hjemmeautomatisering</translation>
<translation id="55293785478302737">Kanthæftning</translation>
<translation id="5535133333442455806">Knappen Ryd browserdata – tryk på Enter for at rydde browserhistorik, cookies, cache m.m. i Chrome-indstillingerne</translation>
@@ -2110,7 +2110,7 @@ Ellers vil det blive blokeret af dine privatlivsindstillinger. Det giver det ind
<translation id="6218753634732582820">Vil du fjerne adressen fra Chromium?</translation>
<translation id="622039917539443112">Parallelfals</translation>
<translation id="6221345481584921695">Google Beskyttet browsing <ph name="BEGIN_LINK" />registrerede malware<ph name="END_LINK" /> på <ph name="SITE" /> for nylig. Websites, der normalt er sikre, inficeres undertiden med malware. Det skadelige indhold kommer fra <ph name="SUBRESOURCE_HOST" />, som er en kendt malwaredistributør.</translation>
-<translation id="6226163402662242066"><ph name="MANAGE_CHROME_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" />– tryk på Tab-tasten efterfulgt af Enter for at tilpasse dine hjælpefunktioner i Chrome-indstillingerne</translation>
+<translation id="6226163402662242066"><ph name="MANAGE_CHROME_ACCESSIBILITY_FOCUSED_FRIENDLY_MATCH_TEXT" />– tryk på Tab-tasten efterfulgt af Enter for at personligt tilpasse dine hjælpefunktioner i Chrome-indstillingerne</translation>
<translation id="6229649258872345286">Familierejser</translation>
<translation id="6232271601416750929">Bæredygtige skønhedsprodukter</translation>
<translation id="6234122620015464377">Beskær efter hvert dokument</translation>
@@ -2261,7 +2261,7 @@ Ellers vil det blive blokeret af dine privatlivsindstillinger. Det giver det ind
<translation id="6615297766614333076">Stabler 2</translation>
<translation id="6624427990725312378">Kontaktoplysninger</translation>
<translation id="6626291197371920147">Tilføj gyldigt kortnummer</translation>
-<translation id="6627727261837091711">Vis oplysninger om annoncetilpasning</translation>
+<translation id="6627727261837091711">Vis oplysninger om personlig tilpasning af annoncer</translation>
<translation id="6628463337424475685"><ph name="ENGINE" /> -søgning</translation>
<translation id="6630043285902923878">Finder USB-enheder...</translation>
<translation id="6630809736994426279">Brugere med ondsindede hensigter, der i øjeblikket er på <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />, kan forsøge at installere farlige programmer på din Mac, som stjæler eller sletter dine oplysninger (f.eks. fotos, adgangskoder, beskeder og kreditkort). <ph name="BEGIN_LEARN_MORE_LINK" />Få flere oplysninger<ph name="END_LEARN_MORE_LINK" /></translation>
@@ -2781,7 +2781,7 @@ Yderligere oplysninger:
<translation id="7840103971441592723">Screenshot er startet</translation>
<translation id="7844689747373518809">{COUNT,plural, =0{Ingen}=1{1 app (<ph name="EXAMPLE_APP_1" />)}=2{2 apps (<ph name="EXAMPLE_APP_1" />, <ph name="EXAMPLE_APP_2" />)}one{# app (<ph name="EXAMPLE_APP_1" />, <ph name="EXAMPLE_APP_2" /> <ph name="AND_MORE" />)}other{# apps (<ph name="EXAMPLE_APP_1" />, <ph name="EXAMPLE_APP_2" /> <ph name="AND_MORE" />)}}</translation>
<translation id="7855695075675558090"><ph name="TOTAL_LABEL" /> <ph name="CURRENCY_CODE" /> <ph name="FORMATTED_TOTAL_AMOUNT" /></translation>
-<translation id="7857116075376571629">Senere, når du besøger et website, kan websitet anmode Chrome om dine emner for at tilpasse de annoncer, du får vist. Chrome deler op til 3 emner, samtidig med at din browserhistorik og identitet beskyttes.</translation>
+<translation id="7857116075376571629">Senere, når du besøger et website, kan websitet anmode Chrome om dine emner for at personligt tilpasse de annoncer, du får vist. Chrome deler op til 3 emner, samtidig med at din browserhistorik og identitet beskyttes.</translation>
<translation id="7860345425589240791">Angiv din nye udløbsdato og kontrolkode, som du finder på <ph name="SIDE_OF_CARD" /></translation>
<translation id="7862185352068345852">Vil du forlade websitet?</translation>
<translation id="7865448901209910068">Bedste hastighed</translation>
@@ -2940,7 +2940,7 @@ Yderligere oplysninger:
<translation id="8245703462678310750">Hold fingeren på |<ph name="ACCELERATOR" />| for at afslutte visningen i fuld skærm og se downloadfilen.</translation>
<translation id="8249296373107784235">Annuller</translation>
<translation id="8249463483885748674">Standardiserede prøver og adgangsprøver</translation>
-<translation id="8252991034201168845">Knappen Administrer indstillinger for hjælpefunktioner – tryk på Enter for at tilpasse dine hjælpefunktioner i ChromeOS-indstillingerne</translation>
+<translation id="8252991034201168845">Knappen Administrer indstillinger for hjælpefunktioner – tryk på Enter for at personligt tilpasse dine hjælpefunktioner i ChromeOS-indstillingerne</translation>
<translation id="8253091569723639551">Faktureringsadresse skal angives</translation>
<translation id="8257387598443225809">Denne app er udviklet til mobilenheder</translation>
<translation id="825929999321470778">Se alle gemte adgangskoder</translation>
@@ -2967,7 +2967,7 @@ Yderligere oplysninger:
<translation id="829335040383910391">lyd</translation>
<translation id="8294431847097064396">Kilde</translation>
<translation id="8296205692406981542">Regionale parker og haver</translation>
-<translation id="8297545700510100061">Cookies og andre websitedata bruges til at huske dig, f.eks. for at logge dig ind eller give dig tilpassede annoncer. Gå til <ph name="SETTINGS" /> for at administrere cookies for alle websites.</translation>
+<translation id="8297545700510100061">Cookies og andre websitedata bruges til at huske dig, f.eks. for at logge dig ind eller give dig personligt tilpassede annoncer. Gå til <ph name="SETTINGS" /> for at administrere cookies for alle websites.</translation>
<translation id="8298115750975731693">Det Wi-Fi-netværk, du bruger (<ph name="WIFI_NAME" />), kan kræve, at du går til <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation>
<translation id="8299269255470343364">Japansk</translation>
<translation id="8303854710873047864">Sektionen "<ph name="SECTION" />" vises</translation>
@@ -3076,7 +3076,7 @@ Yderligere oplysninger:
<translation id="860043288473659153">Kortholderens navn</translation>
<translation id="8601027005147870853"><ph name="BEGIN_BOLD" />Disse data bruges:<ph name="END_BOLD" /> Din aktivitet på et website, du besøger via Chrome på denne enhed.</translation>
<translation id="8606726445206553943">Brug dine MIDI-enheder</translation>
-<translation id="8606988009912891950">Annonceemner hjælper websites med at vise dig relevante annoncer, samtidig med at din browserhistorik og identitet beskyttes. Chrome kan registrere emner, du muligvis er interesseret i, baseret på din seneste browserhistorik. Senere, når du besøger et website, kan websitet anmode Chrome om nogle relevante emner for at tilpasse de annoncer, du får vist.</translation>
+<translation id="8606988009912891950">Annonceemner hjælper websites med at vise dig relevante annoncer, samtidig med at din browserhistorik og identitet beskyttes. Chrome kan registrere emner, du muligvis er interesseret i, baseret på din seneste browserhistorik. Senere, når du besøger et website, kan websitet anmode Chrome om nogle relevante emner for at personligt tilpasse de annoncer, du får vist.</translation>
<translation id="8617269623452051934">din enhedsbrug</translation>
<translation id="861775596732816396">Størrelse 4</translation>
<translation id="8620276786115098679">Konvolut Kaku 7</translation>
@@ -3125,7 +3125,7 @@ Yderligere oplysninger:
<translation id="8736059027199600831">30 x 40 tommer</translation>
<translation id="8737134861345396036"><ph name="LAUNCH_INCOGNITO_FOCUSED_FRIENDLY_MATCH_TEXT" /> – tryk på Tab-tasten efterfulgt af Enter for at åbne et nyt inkognitovindue, så du kan browse privat</translation>
<translation id="8737685506611670901">Åbne <ph name="PROTOCOL" />-links i stedet for <ph name="REPLACED_HANDLER_TITLE" /></translation>
-<translation id="8738058698779197622">For at kunne oprette en sikker forbindelse skal dit ur være indstillet korrekt. Det er vigtigt, da de certifikater, som websites bruger til at identificere sig selv, kun er gyldige i bestemte tidsperioder. Da uret på din enhed går forkert, kan Chromium ikke bekræfte disse certifikater.</translation>
+<translation id="8738058698779197622">For at kunne oprette en sikker forbindelse skal dit ur være indstillet korrekt. Det er vigtigt, da de certifikater, som websites bruger til at identificere sig selv, kun er gyldige i bestemte tidsperioder. Da uret på din enhed går forkert, kan Chromium ikke verificere disse certifikater.</translation>
<translation id="8740359287975076522">&lt;abbr id="dnsDefinition"&gt;DNS-adressen&lt;/abbr&gt; for <ph name="HOST_NAME" /> blev ikke fundet. Diagnosticerer problemet.</translation>
<translation id="8742371904523228557"><ph name="ONE_TIME_CODE" /> er din kode til <ph name="ORIGIN" /></translation>
<translation id="874918643257405732">Tilføj denne fane som bogmærke</translation>
diff --git a/chromium/components/strings/components_strings_de.xtb b/chromium/components/strings/components_strings_de.xtb
index fb223f70163..0c5d164a162 100644
--- a/chromium/components/strings/components_strings_de.xtb
+++ b/chromium/components/strings/components_strings_de.xtb
@@ -313,7 +313,7 @@ Du wirst sonst gemäß deinen Datenschutzeinstellungen blockiert. Wenn Cookies u
<translation id="1662550410081243962">Zahlungsmethoden speichern und ausfüllen</translation>
<translation id="1663943134801823270">Die Karten und Adressen stammen aus Chrome. Sie werden in den <ph name="BEGIN_LINK" />Einstellungen<ph name="END_LINK" /> verwaltet.</translation>
<translation id="1671391448414634642">Seiten auf <ph name="SOURCE_LANGUAGE" /> werden ab jetzt auf <ph name="TARGET_LANGUAGE" /> übersetzt.</translation>
-<translation id="1674504678466460478">Von <ph name="SOURCE_LANGUAGE" /> auf <ph name="TARGET_LANGUAGE" /></translation>
+<translation id="1674504678466460478"><ph name="SOURCE_LANGUAGE" /> – <ph name="TARGET_LANGUAGE" /></translation>
<translation id="1682696192498422849">Kurze Seite zuerst</translation>
<translation id="168693727862418163">Die Richtlinienwertprüfung des Schemas ist fehlgeschlagen. Der Richtlinienwert wird ignoriert.</translation>
<translation id="168841957122794586">Das Serverzertifikat weist einen schwachen kryptografischen Schlüssel auf.</translation>
@@ -1076,7 +1076,7 @@ Du wirst sonst gemäß deinen Datenschutzeinstellungen blockiert. Wenn Cookies u
<translation id="3646643500201740985">Leistung einer Werbeanzeige messen</translation>
<translation id="3647286794400715637">Jeder URL-Stringeintrag muss eine oder zwei URLs enthalten.</translation>
<translation id="3650584904733503804">Überprüfung erfolgreich</translation>
-<translation id="3650594806107685466">Gib für die Sicherheit deiner Karte den CVC auf der <ph name="SIDE_OF_CARD" /> ein</translation>
+<translation id="3650594806107685466">Bitte gib aus Sicherheitsgründen den CVC auf der <ph name="SIDE_OF_CARD" /> ein</translation>
<translation id="3653033846669030038">Freizeitparks</translation>
<translation id="3655241534245626312">Berechtigungseinstellungen aufrufen</translation>
<translation id="3655670868607891010">Sollte dir diese Meldung häufiger angezeigt werden, sieh dir unsere <ph name="HELP_LINK" /> an.</translation>
diff --git a/chromium/components/strings/components_strings_en-GB.xtb b/chromium/components/strings/components_strings_en-GB.xtb
index 742ac7d51ab..cf6d1b24a0e 100644
--- a/chromium/components/strings/components_strings_en-GB.xtb
+++ b/chromium/components/strings/components_strings_en-GB.xtb
@@ -262,7 +262,7 @@ This will otherwise be blocked by your privacy settings. This will allow the con
<translation id="1553358976309200471">Update Chrome</translation>
<translation id="1555130319947370107">Blue</translation>
<translation id="1559447966090556585">Get notifications?</translation>
-<translation id="1559486004335285648">Auto-fill payment info</translation>
+<translation id="1559486004335285648">Autofill payment info</translation>
<translation id="1559528461873125649">No such file or directory</translation>
<translation id="1559572115229829303">&lt;p&gt;A private connection to <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> can't be established because your device's date and time (<ph name="DATE_AND_TIME" />) are incorrect.&lt;/p&gt;
@@ -540,7 +540,7 @@ This will otherwise be blocked by your privacy settings. This will allow the con
<translation id="2239100178324503013">Send now</translation>
<translation id="2241693394036365668">File is downloaded</translation>
<translation id="2246264294482514010">10 in x 12 in</translation>
-<translation id="2246480341630108201">Your parent hasn't said it's OK yet</translation>
+<translation id="2246480341630108201">Your parent hasn't said that it's OK yet</translation>
<translation id="2247789808226901522">Card expired</translation>
<translation id="2248949050832152960">Use WebAuthn</translation>
<translation id="2250931979407627383">Edge stitch left</translation>
@@ -2570,7 +2570,7 @@ Additional details:
<translation id="7390545607259442187">Confirm Card</translation>
<translation id="7392089738299859607">Update Address</translation>
<translation id="739728382607845710">Payment handler icon</translation>
-<translation id="7399802613464275309">Safety check</translation>
+<translation id="7399802613464275309">Safety Check</translation>
<translation id="7400418766976504921">URL</translation>
<translation id="7403392780200267761">Share this tab by sharing the link, creating a QR code, casting and more</translation>
<translation id="7403591733719184120">Your <ph name="DEVICE_NAME" /> is managed</translation>
diff --git a/chromium/components/strings/components_strings_es-419.xtb b/chromium/components/strings/components_strings_es-419.xtb
index 9c95c2e79e1..5f93a1e6056 100644
--- a/chromium/components/strings/components_strings_es-419.xtb
+++ b/chromium/components/strings/components_strings_es-419.xtb
@@ -415,7 +415,7 @@ De lo contrario, la configuración de privacidad bloqueará esta acción. Esto p
<translation id="1919526244108283799">400 × 600 mm</translation>
<translation id="192020519938775529">{COUNT,plural, =0{Ninguno}=1{1 sitio}other{# sitios}}</translation>
<translation id="1924727005275031552">Nuevas</translation>
-<translation id="1927439593081478069">Botón Ejecutar la verificación de seguridad de Chrome: presiona Intro para realizar una verificación de seguridad en la configuración de Chrome</translation>
+<translation id="1927439593081478069">Botón Ejecutar la Verificación de seguridad de Chrome: presiona Intro para realizar una Verificación de seguridad en la configuración de Chrome</translation>
<translation id="1935995810530254458">Copiar de todos modos</translation>
<translation id="1939175642807587452">Puede solicitar permiso para enviar notificaciones</translation>
<translation id="1943994668912612445">Diseño</translation>
@@ -723,7 +723,7 @@ De lo contrario, la configuración de privacidad bloqueará esta acción. Esto p
<translation id="271663710482723385">Presiona |<ph name="ACCELERATOR1" />| + |<ph name="ACCELERATOR2" />| para salir de la pantalla completa</translation>
<translation id="2718207025093645426">El usuario o dispositivo administrado no tiene ninguna política cargada.</translation>
<translation id="2721148159707890343">Solicitud correcta</translation>
-<translation id="2723669454293168317">Ejecutar una verificación de seguridad en la configuración de Chrome</translation>
+<translation id="2723669454293168317">Ejecutar una Verificación de seguridad en la configuración de Chrome</translation>
<translation id="2726001110728089263">Bandeja lateral</translation>
<translation id="2728127805433021124">El certificado del servidor está firmado con un algoritmo de firma no seguro.</translation>
<translation id="2730326759066348565"><ph name="BEGIN_LINK" />Ejecución del Diagnóstico de conectividad<ph name="END_LINK" /></translation>
@@ -768,7 +768,7 @@ De lo contrario, la configuración de privacidad bloqueará esta acción. Esto p
<translation id="2876949457278336305"><ph name="MANAGE_SECURITY_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, presiona Tab y, luego, Intro para administrar tu Navegación segura y más en la configuración de Chrome</translation>
<translation id="2878197950673342043">Plegado de póster</translation>
<translation id="2878424575911748999">A1</translation>
-<translation id="2879694782644540289">usar el bloqueo de pantalla para completar contraseñas.</translation>
+<translation id="2879694782644540289">usar el bloqueo de pantalla para completar contraseñas</translation>
<translation id="2881276955470682203">¿Quieres guardar la tarjeta?</translation>
<translation id="2882949212241984732">Plegado en ventana doble</translation>
<translation id="2893773853358652045">Cuarto rollo</translation>
@@ -964,7 +964,7 @@ De lo contrario, la configuración de privacidad bloqueará esta acción. Esto p
<translation id="3369459162151165748">Piezas y accesorios para vehículos</translation>
<translation id="3371064404604898522">Establecer Chrome como navegador predeterminado</translation>
<translation id="337363190475750230">Desaprovisionado</translation>
-<translation id="3375754925484257129">Ejecutar la verificación de seguridad de Chrome</translation>
+<translation id="3375754925484257129">Ejecutar la Verificación de seguridad de Chrome</translation>
<translation id="3377144306166885718">El servidor usaba una versión obsoleta de TLS.</translation>
<translation id="3377188786107721145">Error al analizar la política</translation>
<translation id="3377736046129930310">Usa el bloqueo de pantalla para confirmar las tarjetas más rápido</translation>
@@ -1061,7 +1061,7 @@ De lo contrario, la configuración de privacidad bloqueará esta acción. Esto p
<translation id="3611317423880285981">Productos del hogar</translation>
<translation id="3614103345592970299">Tamaño 2</translation>
<translation id="361438452008624280">Entrada de lista "<ph name="LANGUAGE_ID" />": El idioma es desconocido o no es compatible.</translation>
-<translation id="3614934205542186002"><ph name="RUN_CHROME_SAFETY_CHECK_FOCUSED_FRIENDLY_MATCH_TEXT" />, presiona Tab y, luego, Intro para realizar una verificación de seguridad en la configuración de Chrome</translation>
+<translation id="3614934205542186002"><ph name="RUN_CHROME_SAFETY_CHECK_FOCUSED_FRIENDLY_MATCH_TEXT" />, presiona Tab y, luego, Intro para realizar una Verificación de seguridad en la configuración de Chrome</translation>
<translation id="3615877443314183785">Ingresa una fecha de vencimiento válida</translation>
<translation id="36224234498066874">Borrar datos de navegación...</translation>
<translation id="362276910939193118">Mostrar historial completo</translation>
@@ -2362,7 +2362,7 @@ De lo contrario, la configuración de privacidad bloqueará esta acción. Esto p
<translation id="6890531741535756070">Elegiste realizar la verificación con <ph name="DEVICE_LABEL" /> en sitios web que usan <ph name="PROVIDER_ORIGIN" />. Es posible que este proveedor haya almacenado información sobre tu forma de pago, la que puedes <ph name="BEGIN_LINK" />solicitar que se borre<ph name="END_LINK" />.</translation>
<translation id="6890956352250146925">Opciones para cookies y datos de sitios</translation>
<translation id="6891596781022320156">No se admite el nivel de políticas.</translation>
-<translation id="6895330447102777224">Tu tarjeta se confirmó</translation>
+<translation id="6895330447102777224">Se confirmó tu tarjeta</translation>
<translation id="6896758677409633944">Copiar</translation>
<translation id="6897140037006041989">Usuario-agente</translation>
<translation id="6898699227549475383">Organización (O)</translation>
@@ -2522,7 +2522,7 @@ Detalles adicionales:
<translation id="7277998515889183784">Maquillaje y cosméticos</translation>
<translation id="7285654172857511148"><ph name="CHANGE_GOOGLE_PASSWORD_FOCUSED_FRIENDLY_MATCH_TEXT" />, presiona Tab y, luego, Intro para cambiar la contraseña de tu Cuenta de Google</translation>
<translation id="7292031607255951991">Nombre del destinatario</translation>
-<translation id="7298195798382681320">Recomendada</translation>
+<translation id="7298195798382681320">Recomendado</translation>
<translation id="7299471494012161875">Periféricos de pantallas conectados</translation>
<translation id="7300012071106347854">Azul cobalto</translation>
<translation id="7304030187361489308">Alto</translation>
diff --git a/chromium/components/strings/components_strings_es.xtb b/chromium/components/strings/components_strings_es.xtb
index 38677dff50e..c674dd1d0bd 100644
--- a/chromium/components/strings/components_strings_es.xtb
+++ b/chromium/components/strings/components_strings_es.xtb
@@ -276,7 +276,7 @@ De lo contrario, lo impedirá tu configuración de privacidad. Permitirá que el
<translation id="1572765991610098222"><ph name="WIDTH" /> x <ph name="HEIGHT" /> in</translation>
<translation id="1581080074034554886">CVC</translation>
<translation id="1583429793053364125">Se ha producido un error al mostrar esta página web.</translation>
-<translation id="1584492003828271317">Mientras navegas, la personalización de los anuncios que ves depende de esta opción, de los anuncios sugeridos por sitios, de la configuración de las cookies y de si el sitio que estás viendo personaliza los anuncios.</translation>
+<translation id="1584492003828271317">Mientras navegas, verás anuncios personalizados o no en función de esta opción, de los anuncios sugeridos por sitios, de la configuración de las cookies y de si el sitio que estás viendo personaliza los anuncios.</translation>
<translation id="1586541204584340881">Qué extensiones tienes instaladas</translation>
<translation id="1588438908519853928">Modo normal</translation>
<translation id="1592005682883173041">Acceso a datos locales</translation>
@@ -1966,7 +1966,7 @@ De lo contrario, lo impedirá tu configuración de privacidad. Permitirá que el
<translation id="5838278095973806738">No deberías introducir información confidencial en este sitio web (por ejemplo, contraseñas o tarjetas de crédito) porque los atacantes podrían robarla.</translation>
<translation id="5851548754964597211">Lista de pestañas</translation>
<translation id="5852909432155870672">RA4</translation>
-<translation id="5860033963881614850">Desactivado</translation>
+<translation id="5860033963881614850">Desactivada</translation>
<translation id="5862579898803147654">Apilador 8</translation>
<translation id="5863847714970149516">Es posible que la página a la que vas a acceder intente aplicar algún cargo</translation>
<translation id="5866257070973731571">Añade un número de teléfono</translation>
@@ -2367,7 +2367,7 @@ De lo contrario, lo impedirá tu configuración de privacidad. Permitirá que el
<translation id="6898699227549475383">Organización (O)</translation>
<translation id="6899000063526916106">Introduce el código de <ph name="NUMBER_OF_DIGITS" /> dígitos</translation>
<translation id="6907293445143367439">Permitir a <ph name="SITE_NAME" />:</translation>
-<translation id="6907458757809079309">Fitness</translation>
+<translation id="6907458757809079309">Actividad física</translation>
<translation id="6910240653697687763"><ph name="URL" /> quiere obtener un control absoluto de tus dispositivos MIDI</translation>
<translation id="691024665142758461">Descargar varios archivos</translation>
<translation id="6915804003454593391">Usuario:</translation>
@@ -2758,7 +2758,7 @@ Más información:
<translation id="7764225426217299476">Añadir dirección</translation>
<translation id="7766518757692125295">Skirt</translation>
<translation id="7773005668374414287">Mismo orden boca arriba</translation>
-<translation id="7785790577395078482">este tablet</translation>
+<translation id="7785790577395078482">esta tablet</translation>
<translation id="7786368602962652765">Un campo obligatorio está vacío. Rellénalo antes de guardar.</translation>
<translation id="7790488044432570133">Los sitios que visites pueden solicitar a Chrome información que les ayude a medir el rendimiento de sus anuncios. Chrome permite que los sitios recojan algunos tipos de datos limitados, como la hora del día en la que se te mostró un anuncio.</translation>
<translation id="7791011319128895129">Sin publicar</translation>
diff --git a/chromium/components/strings/components_strings_eu.xtb b/chromium/components/strings/components_strings_eu.xtb
index 7551c1ccd29..1327c804803 100644
--- a/chromium/components/strings/components_strings_eu.xtb
+++ b/chromium/components/strings/components_strings_eu.xtb
@@ -776,7 +776,7 @@ Bestela, pribatutasun-ezarpenek blokeatu egingo dute baimen hori. Baimen honekin
<translation id="2903493209154104877">Helbideak</translation>
<translation id="290376772003165898">Ez al da <ph name="LANGUAGE" /> orriko hizkuntza?</translation>
<translation id="2909946352844186028">Aldaketa bat hauteman da sarean.</translation>
-<translation id="2911973620368911614">Laneko kontabilitateaz arduratzen den erabiltzaile IDa</translation>
+<translation id="2911973620368911614">Laneko kontabilitateaz arduratzen den erabiltzaile-identifikatzailea</translation>
<translation id="2914160345369867329">Eskuarki, <ph name="SITE" /> webguneak enkriptatzea erabiltzen du informazioa babesteko. Chrome <ph name="SITE" /> webgunera konektatzen saiatu denean, webguneak kredentzial desegokiak eta ezohikoak bidali ditu. Erasotzaile bat <ph name="SITE" /> webgunearen plantak egiten ari delako gerta daiteke hori, edo wifi-sarean saioa hasteko pantailak konexioa eten duelako. Zure informazioa seguru dago, datuak trukatu aurretik eten baitu Chrome-k konexioa.</translation>
<translation id="2915068235268646559">Hutsegitearen ordua: <ph name="CRASH_TIME" /></translation>
<translation id="2915496182262110498">Margotzea</translation>
@@ -845,7 +845,7 @@ Bestela, pribatutasun-ezarpenek blokeatu egingo dute baimen hori. Baimen honekin
<translation id="3096100844101284527">Gehitu jasotze-helbidea</translation>
<translation id="3096195745018397576">Haurrentzako arropa</translation>
<translation id="3098513225387949945">Ez ikusi egin zaio, desgaitzeko zerrendak * karakterearen berdina den eredu bat daukalako, eta hori gidalerroa desgaitzea bezala da.</translation>
-<translation id="3105172416063519923">Aktibo IDa:</translation>
+<translation id="3105172416063519923">Erreproduzigaiaren identifikatzailea:</translation>
<translation id="3107591622054137333"><ph name="BEGIN_LINK" />DNS konfigurazio segurua egiaztatzen<ph name="END_LINK" /></translation>
<translation id="3108943290502734357">Erdiko erretilua</translation>
<translation id="3109728660330352905">Ez duzu baimenik orri hau ikusteko.</translation>
@@ -1084,7 +1084,7 @@ Bestela, pribatutasun-ezarpenek blokeatu egingo dute baimen hori. Baimen honekin
<translation id="3671540257457995106">Tamaina aldatzeko baimena ematen duzu?</translation>
<translation id="3672568546897166916">Errorea (<ph name="ERROR_PATH" />): <ph name="ERROR_MESSAGE" /></translation>
<translation id="3675563144891642599">Hirugarren arrabola</translation>
-<translation id="3676592649209844519">Gailuaren IDa:</translation>
+<translation id="3676592649209844519">Gailuaren identifikatzailea:</translation>
<translation id="3677008721441257057">&lt;a href="#" id="dont-proceed-link"&gt;<ph name="DOMAIN" />&lt;/a&gt; esan nahi al zenuen?</translation>
<translation id="3678029195006412963">Ezin izan da sinatu eskaera</translation>
<translation id="3678342917559046352">Luzapenak ez du balio: balioak formatu hauetako bat izatea espero zen: &lt;extension_id&gt; edo &lt;extension_id&gt;;&lt;update_url&gt;.</translation>
@@ -1542,7 +1542,7 @@ Bestela, pribatutasun-ezarpenek blokeatu egingo dute baimen hori. Baimen honekin
<translation id="4791134497475588553">Instalatutako Linux-erako aplikazioak eta azken erabiltze-data</translation>
<translation id="4792686369684665359">Bidaltzear zauden informazioa ez da segurua</translation>
<translation id="4793219378458250238">27,94 × 30,48 cm (11 × 12 in)</translation>
-<translation id="4796594887379589189">Laneko kontuaren IDa</translation>
+<translation id="4796594887379589189">Laneko kontuaren identifikatzailea</translation>
<translation id="4798078619018708837"><ph name="CREDIT_CARD" /> txartelaren xehetasunak eguneratzeko, idatzi iraungitze-data eta CVC kodea. Datuok berresten dituzunean, webgune honekin partekatuko dira Google-ko kontuarekin lotutako txartelaren xehetasunak.</translation>
<translation id="4798269756263412078">Jaso alertak webguneren batean prezioa jaisten bada. Helbide elektronikora bidaliko dira alertak.</translation>
<translation id="4800132727771399293">Egiaztatu CVC kodea eta saiatu berriro</translation>
@@ -2072,7 +2072,7 @@ Bestela, pribatutasun-ezarpenek blokeatu egingo dute baimen hori. Baimen honekin
<translation id="610911394827799129">Google-ko kontuko arakatze-historiaren bestelako datu batzuk gera litezke <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> webgunean.</translation>
<translation id="6116338172782435947">Arbelean kopiatzen ditudan testuak eta irudiak ikusi.</translation>
<translation id="6118782133429281336">Jatorrizko zerrenda hutsik dago.</translation>
-<translation id="6120179357481664955">Gogoan al duzu UPIko IDa?</translation>
+<translation id="6120179357481664955">Gogoan al duzu UPIko identifikatzailea?</translation>
<translation id="6122181661879998141">txartelaren aurrealdean</translation>
<translation id="6124432979022149706">Chrome Enterprise Connectors</translation>
<translation id="6126565365696310362">Gutun-azal txinatarra 2</translation>
@@ -2620,7 +2620,7 @@ Xehetasun gehiago:
<ph name="LIST_ITEM" />inprimakietan idatzitako informazioa
<ph name="END_LIST" /></translation>
<translation id="7507075214339298899">Gutun-azala 9</translation>
-<translation id="7508255263130623398">Itzuli den gidalerroaren gailu IDa hutsik dago edo ez dator bat gailuaren IDarekin</translation>
+<translation id="7508255263130623398">Itzuli den gidalerroaren gailuaren identifikatzailea hutsik dago edo ez dator bat gailuaren identifikatzailearekin</translation>
<translation id="7508870219247277067">Ahuakatea</translation>
<translation id="7510225383966760306"><ph name="BEGIN_BOLD" />Nola erabiltzen dituzte webguneek datu horiek?<ph name="END_BOLD" /> Zure interesei eta gustuei buruzko informazioa gorde dezakete webguneek Chrome-n. Adibidez, demagun maratoietarako entrenamenduei buruzko webgune batera joan zarela. Hala bada, korrika egiteko oinetakoak interesatzen zaizkizula erabakiko du agian webgune horrek. Horregatik, gero beste webgune batera joaten zarenean, baliteke korrika egiteko oinetakoen iragarki bat agertzea, lehen webguneak iradokita.</translation>
<translation id="7510269639068718544">Katuak</translation>
diff --git a/chromium/components/strings/components_strings_fa.xtb b/chromium/components/strings/components_strings_fa.xtb
index d1858ddc766..305b2c53d60 100644
--- a/chromium/components/strings/components_strings_fa.xtb
+++ b/chromium/components/strings/components_strings_fa.xtb
@@ -1478,7 +1478,7 @@
<translation id="4644670975240021822">روبه‌پایین به‌ترتیب معکوس</translation>
<translation id="4646534391647090355">اکنون من را به آنجا ببر</translation>
<translation id="4648262692072505866">‏درهم‌سازی باید در قالب SHA-256 باشد.</translation>
-<translation id="4652266463001779298">غیرمجاز</translation>
+<translation id="4652266463001779298">مجاز نبودن</translation>
<translation id="4652440160515225514">سازمانتان این سایت را مسدود کرده است زیرا خط‌مشی‌ای را نقض می‌کند.</translation>
<translation id="4653167719759882810">ادغام و تملک</translation>
<translation id="4658638640878098064">منگنه در بالا سمت چپ</translation>
diff --git a/chromium/components/strings/components_strings_fr.xtb b/chromium/components/strings/components_strings_fr.xtb
index a95f72a9c83..27d867602fe 100644
--- a/chromium/components/strings/components_strings_fr.xtb
+++ b/chromium/components/strings/components_strings_fr.xtb
@@ -734,7 +734,7 @@ Par défaut, ce type d'accès est bloqué par vos paramètres de confidentialit
<translation id="2740531572673183784">OK</translation>
<translation id="2742511345840685325">Tennis de table</translation>
<translation id="2742870351467570537">Supprimer les éléments sélectionnés</translation>
-<translation id="2759825833388495838">saisir votre mot de passe sur <ph name="APP_NAME" /></translation>
+<translation id="2759825833388495838">de renseigner votre mot de passe sur <ph name="APP_NAME" /></translation>
<translation id="2764001903315068341">Bandes dessinées</translation>
<translation id="2765217105034171413">Léger</translation>
<translation id="277133753123645258">Mode d'expédition</translation>
@@ -768,7 +768,7 @@ Par défaut, ce type d'accès est bloqué par vos paramètres de confidentialit
<translation id="2876949457278336305"><ph name="MANAGE_SECURITY_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, puis Tabulation, puis Entrée pour gérer la navigation sécurisée, etc., dans les paramètres Chrome</translation>
<translation id="2878197950673342043">Pli au format affiche</translation>
<translation id="2878424575911748999">A1</translation>
-<translation id="2879694782644540289">utiliser le verrouillage de l'écran lors de la saisie des mots de passe</translation>
+<translation id="2879694782644540289">d'utiliser le verrouillage de l'écran pour renseigner les mots de passe</translation>
<translation id="2881276955470682203">Enregistrer la carte ?</translation>
<translation id="2882949212241984732">Pli en deux volets</translation>
<translation id="2893773853358652045">4e rouleau</translation>
@@ -1078,7 +1078,7 @@ Par défaut, ce type d'accès est bloqué par vos paramètres de confidentialit
<translation id="3646643500201740985">Mesurer les performances d'une annonce</translation>
<translation id="3647286794400715637">Chaque chaîne d'URL doit contenir entre une et deux URL.</translation>
<translation id="3650584904733503804">Validation réussie.</translation>
-<translation id="3650594806107685466">Pour protéger votre carte, saisissez le code CVC au <ph name="SIDE_OF_CARD" /></translation>
+<translation id="3650594806107685466">Pour protéger votre carte, saisissez le code CVC indiqué à l'<ph name="SIDE_OF_CARD" /></translation>
<translation id="3653033846669030038">Parcs à thème</translation>
<translation id="3655241534245626312">Accéder aux paramètres de l'autorisation</translation>
<translation id="3655670868607891010">Si ce message s'affiche régulièrement, essayez ces <ph name="HELP_LINK" />.</translation>
@@ -1537,7 +1537,7 @@ Par défaut, ce type d'accès est bloqué par vos paramètres de confidentialit
<translation id="4764776831041365478">Il se peut que la page Web à l'adresse <ph name="URL" /> soit temporairement inaccessible ou qu'elle ait été déplacée de façon permanente à une autre adresse Web.</translation>
<translation id="4766713847338118463">Double agrafe en bas</translation>
<translation id="4771973620359291008">Une erreur inconnue s'est produite.</translation>
-<translation id="477945296921629067">{NUM_POPUPS,plural, =1{ fenêtre pop-up bloquée}one{# fenêtre pop-up bloquée}other{# fenêtres pop-up bloquées}}</translation>
+<translation id="477945296921629067">{NUM_POPUPS,plural, =1{Fenêtre pop-up bloquée}one{# fenêtre pop-up bloquée}other{# fenêtres pop-up bloquées}}</translation>
<translation id="4780366598804516005">Boîte aux lettres 1</translation>
<translation id="4785376858512657294">Gérer le compte Google</translation>
<translation id="4785689107224900852">Passer à cet onglet</translation>
@@ -3002,7 +3002,7 @@ Informations supplémentaires :
<translation id="8398335999901363925">Liste des modes de paiement à saisir de façon tactile, ouverte à pleine hauteur.</translation>
<translation id="8398790343843005537">Rechercher votre téléphone</translation>
<translation id="8405579342203358118">Gérez les infos que vous synchronisez dans les paramètres Chrome</translation>
-<translation id="8406071103346257942">cesser d'utiliser le verrouillage de l'écran pour saisir les mots de passe</translation>
+<translation id="8406071103346257942">de cesser d'utiliser le verrouillage de l'écran pour renseigner les mots de passe</translation>
<translation id="8409413588194360210">gestionnaires de paiement</translation>
<translation id="8412145213513410671">Erreurs (<ph name="CRASH_COUNT" />)</translation>
<translation id="8412392972487953978">Vous devez saisir deux fois la même phrase secrète.</translation>
diff --git a/chromium/components/strings/components_strings_gl.xtb b/chromium/components/strings/components_strings_gl.xtb
index 92be5df58d9..48d171c8db7 100644
--- a/chromium/components/strings/components_strings_gl.xtb
+++ b/chromium/components/strings/components_strings_gl.xtb
@@ -173,7 +173,7 @@ En caso contrario, a configuración de privacidade impedirao. Se o permites, o c
<translation id="1355754231781595724">Seguranza viaria</translation>
<translation id="1357195169723583938">Quen utilizou o dispositivo recentemente e cando o fixo</translation>
<translation id="1358187717814494928">Crear folla</translation>
-<translation id="1360955481084547712">Abre unha nova ventá do modo de incógnito para navegar de forma privada</translation>
+<translation id="1360955481084547712">Abrir unha nova ventá do modo de incógnito para navegar de forma privada</translation>
<translation id="1363819917331173092">Non ofrecer opción de traducir páxinas escritas en <ph name="SOURCE_LANGUAGE" /></translation>
<translation id="1364822246244961190">Esta política está bloqueada, polo cal se ignorará o seu valor.</translation>
<translation id="1368318639262510626">Xogo do dinosauro. Un dinosauro pixelado esquiva cactos e pterodáctilos mentres vai a fume de carozo por unha paisaxe desolada. Cando escoites un sinal de audio, preme Espazo para saltar os obstáculos.</translation>
@@ -415,7 +415,7 @@ En caso contrario, a configuración de privacidade impedirao. Se o permites, o c
<translation id="1919526244108283799">400 x 600 mm</translation>
<translation id="192020519938775529">{COUNT,plural, =0{Ningún}=1{1 sitio}other{# sitios}}</translation>
<translation id="1924727005275031552">Novo</translation>
-<translation id="1927439593081478069">Botón para executar a comprobación de seguranza de Chrome. Se queres executar unha comprobación de seguranza na configuración de Chrome, preme Introducir</translation>
+<translation id="1927439593081478069">Botón para executar a Comprobación de seguranza de Chrome. Se queres executar unha Comprobación de seguranza na configuración de Chrome, preme Introducir</translation>
<translation id="1935995810530254458">Copiar igualmente</translation>
<translation id="1939175642807587452">Pode pedirche permiso para enviar notificacións</translation>
<translation id="1943994668912612445">Deseño</translation>
@@ -441,7 +441,7 @@ En caso contrario, a configuración de privacidade impedirao. Se o permites, o c
<translation id="2001146170449793414">{COUNT,plural, =1{e 1 máis}other{e # máis}}</translation>
<translation id="2003709556000175978">Restablecer o teu contrasinal agora</translation>
<translation id="2003775180883135320">Catro perforacións na parte superior</translation>
-<translation id="201174227998721785">Xestiona na configuración de Chrome os permisos e os datos almacenados dos sitios</translation>
+<translation id="201174227998721785">Xestionar na configuración de Chrome os permisos e os datos almacenados dos sitios</translation>
<translation id="2019607688127825327">Botón para xestionar a configuración de accesibilidade. Se queres personalizar as ferramentas de accesibilidade na configuración de Chrome, preme Introducir</translation>
<translation id="202224654587969958">12 x 19 polgadas</translation>
<translation id="2025115093177348061">Realidade aumentada</translation>
@@ -594,7 +594,7 @@ En caso contrario, a configuración de privacidade impedirao. Se o permites, o c
<translation id="2380886658946992094">Legal</translation>
<translation id="2383455408879745299">Personalizar as túas ferramentas de accesibilidade na configuración de Chrome</translation>
<translation id="2384307209577226199">Política predeterminada da empresa</translation>
-<translation id="2385809941344967209">Actualiza Chrome desde a súa configuración</translation>
+<translation id="2385809941344967209">Actualizar Chrome desde a súa configuración</translation>
<translation id="2386255080630008482">Revogouse o certificado do servidor.</translation>
<translation id="239293030466334554">Cabriolés</translation>
<translation id="2392959068659972793">Mostrar políticas sen ningún valor establecido</translation>
@@ -932,7 +932,7 @@ En caso contrario, a configuración de privacidade impedirao. Se o permites, o c
<translation id="3287510313208355388">Descargar a páxina cando estea en liña</translation>
<translation id="3288238092761586174">Pode que <ph name="URL" /> teña que tomar outras medidas para verificar o pago</translation>
<translation id="3293642807462928945">Máis información acerca da política de <ph name="POLICY_NAME" /></translation>
-<translation id="3295444047715739395">Consulta e xestiona os teus contrasinais na configuración de Chrome</translation>
+<translation id="3295444047715739395">Consultar e xestiona os teus contrasinais na configuración de Chrome</translation>
<translation id="3299098170013242198">Windows Hello está activado para completar contrasinais</translation>
<translation id="3303176609391916566">30 x 42 polgadas</translation>
<translation id="3303855915957856445">Non se encontraron resultados da busca</translation>
@@ -963,7 +963,7 @@ En caso contrario, a configuración de privacidade impedirao. Se o permites, o c
<translation id="3369459162151165748">Pezas e accesorios para vehículos</translation>
<translation id="3371064404604898522">Establecer Chrome como navegador predeterminado</translation>
<translation id="337363190475750230">Desaprovisionado</translation>
-<translation id="3375754925484257129">Executar comprobación de seguranza de Chrome</translation>
+<translation id="3375754925484257129">Executar Comprobación de seguranza de Chrome</translation>
<translation id="3377144306166885718">O servidor utilizou unha versión obsoleta de TLS.</translation>
<translation id="3377188786107721145">Erro de análise da política</translation>
<translation id="3377736046129930310">Usar o bloqueo de pantalla para confirmar as tarxetas máis rápido</translation>
@@ -1060,7 +1060,7 @@ En caso contrario, a configuración de privacidade impedirao. Se o permites, o c
<translation id="3611317423880285981">Produtos do fogar</translation>
<translation id="3614103345592970299">Tamaño 2</translation>
<translation id="361438452008624280">Entrada da lista "<ph name="LANGUAGE_ID" />": idioma descoñecido ou non compatible.</translation>
-<translation id="3614934205542186002"><ph name="RUN_CHROME_SAFETY_CHECK_FOCUSED_FRIENDLY_MATCH_TEXT" />. Se queres executar unha comprobación de seguranza na configuración de Chrome, preme Tabulador e, a continuación, Introducir</translation>
+<translation id="3614934205542186002"><ph name="RUN_CHROME_SAFETY_CHECK_FOCUSED_FRIENDLY_MATCH_TEXT" />. Se queres executar unha Comprobación de seguranza na configuración de Chrome, preme Tabulador e, a continuación, Introducir</translation>
<translation id="3615877443314183785">Introduce unha data de caducidade válida</translation>
<translation id="36224234498066874">Borrar datos de navegación...</translation>
<translation id="362276910939193118">Mostrar historial completo</translation>
@@ -1533,7 +1533,7 @@ En caso contrario, a configuración de privacidade impedirao. Se o permites, o c
<translation id="4757993714154412917">Acabas de escribir o teu contrasinal nun sitio enganoso. Para protexer as túas contas, Chromium recoméndache que comprobes os contrasinais que tes gardados.</translation>
<translation id="4758311279753947758">Engadir información de contacto</translation>
<translation id="4761104368405085019">Utilizar o micrófono</translation>
-<translation id="4761869838909035636">Executar comprobación de seguranza de Chrome</translation>
+<translation id="4761869838909035636">Executar Comprobación de seguranza de Chrome</translation>
<translation id="4764776831041365478">É posible que a páxina web de <ph name="URL" /> estea temporalmente inactiva ou que se trasladase definitivamente a outro enderezo web.</translation>
<translation id="4766713847338118463">Dúas grampas na parte inferior</translation>
<translation id="4771973620359291008">Produciuse un erro descoñecido.</translation>
@@ -1882,7 +1882,7 @@ En caso contrario, a configuración de privacidade impedirao. Se o permites, o c
<translation id="5606444889871204172"><ph name="BEGIN_BOLD" />Como podes xestionar os teus datos?<ph name="END_BOLD" /> Chrome elimina de xeito automático os sitios que teñen máis de 4 semanas de antigüidade. Se volves visitar un sitio, podería aparecer outra vez na lista. Tamén podes impedir que os sitios che suxiran anuncios ou desactivar os anuncios suxeridos polos sitios en calquera momento na configuración de Chrome.</translation>
<translation id="5610142619324316209">Comprobar a conexión</translation>
<translation id="5610807607761827392">Podes xestionar as tarxetas e os enderezos na <ph name="BEGIN_LINK" />Configuración<ph name="END_LINK" />.</translation>
-<translation id="561165882404867731">Traduce esta páxina co Tradutor de Google</translation>
+<translation id="561165882404867731">Traducir esta páxina co Tradutor de Google</translation>
<translation id="5612720917913232150">O URL <ph name="URL" /> quere utilizar a localización do teu ordenador</translation>
<translation id="561669346091975195">Programas de televisión de fantasía e ciencia ficción</translation>
<translation id="5617949217645503996"><ph name="HOST_NAME" /> redireccionoute demasiadas veces.</translation>
@@ -2352,7 +2352,7 @@ En caso contrario, a configuración de privacidade impedirao. Se o permites, o c
<translation id="6869334554832814367">Préstamos persoais</translation>
<translation id="6873456682041376666">Bandexa superior</translation>
<translation id="6874604403660855544">&amp;Refacer adición</translation>
-<translation id="6881240511396774766">Crea rapidamente un novo documento de Google</translation>
+<translation id="6881240511396774766">Crear rapidamente un novo documento de Google</translation>
<translation id="6883221904761970440">A folla de autenticación da credencial de pagos seguros está pechada</translation>
<translation id="6884662655240309489">Tamaño 1</translation>
<translation id="6886577214605505410"><ph name="LOCATION_TITLE" /> <ph name="SHORT_URL" /></translation>
@@ -2431,7 +2431,7 @@ En caso contrario, a configuración de privacidade impedirao. Se o permites, o c
<translation id="7058774143982824355">Servizo de análise de ficheiros CSV de contrasinais</translation>
<translation id="7061777300866737982">Seguranza doméstica</translation>
<translation id="7062635574500127092">Verde azulado</translation>
-<translation id="706295145388601875">Engade e xestiona enderezos na configuración de Chrome</translation>
+<translation id="706295145388601875">Engadir e xestionar enderezos na configuración de Chrome</translation>
<translation id="7064851114919012435">Información de contacto</translation>
<translation id="7067633076996245366">Soul e R&amp;B</translation>
<translation id="7068733155164172741">Mete un código de <ph name="OTP_LENGTH" /> díxitos</translation>
@@ -2813,7 +2813,7 @@ Detalles adicionais:
<translation id="7946724693008564269">Idioma detectado</translation>
<translation id="7947285636476623132">Comproba o ano de caducidade e téntao de novo</translation>
<translation id="7947813448670013867"><ph name="SEE_CHROME_TIPS_FOCUSED_FRIENDLY_MATCH_TEXT" />. Preme Tabulador e, a continuación, Introducir para obter máis información sobre as funcións de Chrome</translation>
-<translation id="7950027195171824198">Xestiona as túas preferencias relativas ás cookies na configuración de Chrome</translation>
+<translation id="7950027195171824198">Xestionar as túas preferencias relativas ás cookies na configuración de Chrome</translation>
<translation id="7951415247503192394">(32 bits)</translation>
<translation id="7952192831285741665">EDP europeo</translation>
<translation id="7952804540472583406"><ph name="BEGIN_LINK" />Inicia sesión<ph name="END_LINK" /> na rede.</translation>
@@ -2958,7 +2958,7 @@ Detalles adicionais:
<translation id="8280630997017109758">Bandexa 11</translation>
<translation id="8281886186245836920">Omitir</translation>
<translation id="8282947398454257691">Coñece o teu identificador de dispositivo único</translation>
-<translation id="8284769179630993263">Xestiona na configuración de Chrome a Navegación segura e outras opcións</translation>
+<translation id="8284769179630993263">Xestionar na configuración de Chrome a Navegación segura e outras opcións</translation>
<translation id="8286036467436129157">Iniciar sesión</translation>
<translation id="8286799286781881307">As aplicacións que o teu administrador autorice poden facer capturas de todas as pantallas que estean conectadas ao dispositivo. Esta información pode procesarse de forma local ou cargarse nos servidores da túa organización.</translation>
<translation id="8288807391153049143">Mostrar certificado</translation>
@@ -3000,7 +3000,7 @@ Detalles adicionais:
<translation id="8396522675989118466">Este é o código de <ph name="NUMBER_OF_DIGITS" /> díxitos que aparece indicado neste lugar: <ph name="SIDE_OF_CARD" /></translation>
<translation id="8398335999901363925">Lista de métodos de pago dispoñibles que se completarán ao tocalos aberta a altura completa.</translation>
<translation id="8398790343843005537">Atopa o teu teléfono</translation>
-<translation id="8405579342203358118">Xestiona na configuración de Chrome a información que se sincroniza</translation>
+<translation id="8405579342203358118">Xestionar na configuración de Chrome a información que se sincroniza</translation>
<translation id="8406071103346257942">deixar de usar o bloqueo de pantalla para completar contrasinais</translation>
<translation id="8409413588194360210">indicadores de pago</translation>
<translation id="8412145213513410671">Erros (<ph name="CRASH_COUNT" />)</translation>
@@ -3048,7 +3048,7 @@ Detalles adicionais:
<translation id="8513580896341796021">Iniciouse a descarga. Para vela, preme |<ph name="ACCELERATOR" />|.</translation>
<translation id="8519753333133776369">O teu administrador permite o uso do dispositivo HID</translation>
<translation id="8522552481199248698">Chrome pode axudarche a protexer a túa Conta de Google e a cambiar o teu contrasinal.</translation>
-<translation id="8530813470445476232">Borra o historial de navegación, as cookies, a memoria caché e moito máis na configuración de Chrome</translation>
+<translation id="8530813470445476232">Borrar o historial de navegación, as cookies, a memoria caché e moito máis na configuración de Chrome</translation>
<translation id="853332391023689529">Camionetas pickup</translation>
<translation id="8533619373899488139">Visita &lt;strong&gt;chrome://policy&lt;/strong&gt; para ver a lista dos URL bloqueados e outras políticas aplicadas pola persoa que administra o sistema.</translation>
<translation id="8539500321752640291">Queres conceder 2 permisos?</translation>
@@ -3308,7 +3308,7 @@ Detalles adicionais:
<translation id="917450738466192189">O certificado do servidor non é válido.</translation>
<translation id="9174623988242579721">Vehículos personalizados e de alto rendemento</translation>
<translation id="9174917557437862841">Botón de cambio de pestana; preme Intro para cambiar a esta pestana</translation>
-<translation id="9179703756951298733">Xestiona os teus pagos e a información das tarxetas de crédito na configuración de Chrome</translation>
+<translation id="9179703756951298733">Xestionar os teus pagos e a información das tarxetas de crédito na configuración de Chrome</translation>
<translation id="9179907736442194268">Recibe alertas por correo electrónico se baixa o prezo en calquera sitio</translation>
<translation id="9183302530794969518">Documentos de Google</translation>
<translation id="9183425211371246419"><ph name="HOST_NAME" /> utiliza un protocolo non compatible.</translation>
diff --git a/chromium/components/strings/components_strings_hi.xtb b/chromium/components/strings/components_strings_hi.xtb
index ce67ce94dc2..e902420da05 100644
--- a/chromium/components/strings/components_strings_hi.xtb
+++ b/chromium/components/strings/components_strings_hi.xtb
@@ -156,7 +156,7 @@
<translation id="1333745675627230582">Chrome Dino गेम खेलें</translation>
<translation id="1333989956347591814">आपकी गतिविधि इन्हें <ph name="BEGIN_EMPHASIS" />अब भी दिखाई दे सकती है<ph name="END_EMPHASIS" />:
<ph name="BEGIN_LIST" />
- <ph name="LIST_ITEM" />जिन वेबसाइट पर आप जाते हैं
+ <ph name="LIST_ITEM" />उन वेबसाइटों को जो आपके खाते से देखी जाती हैं
<ph name="LIST_ITEM" />आपका नियोक्ता या स्कूल
<ph name="LIST_ITEM" />आपको इंटरनेट सेवा देने वाली कंपनी
<ph name="END_LIST" /></translation>
@@ -447,7 +447,7 @@
<translation id="202224654587969958">12 x 19 इंच</translation>
<translation id="2025115093177348061">ऑगमेंटेड रिएलिटी (एआर)</translation>
<translation id="2025186561304664664">प्रॉक्‍सी अपने-आप कॉन्‍फ़‍िगर पर सेट है.</translation>
-<translation id="2025891858974379949">असुरक्षित सामग्री</translation>
+<translation id="2025891858974379949">असुरक्षित कॉन्टेंट</translation>
<translation id="2032962459168915086"><ph name="BEGIN_LINK" />प्रॉक्सी और फायरवॉल की जाँच करें<ph name="END_LINK" /></translation>
<translation id="2034971124472263449">फिर भी सेव करें</translation>
<translation id="2035400064145347639">यात्रा गाइड और यात्रा की जानकारी</translation>
@@ -1419,7 +1419,7 @@
<translation id="4482953324121162758">इस साइट का अनुवाद नहीं किया जाएगा.</translation>
<translation id="4489023393592172404">काकू 4 साइज़ का लिफ़ाफ़ा</translation>
<translation id="4490717597759821841">ए7</translation>
-<translation id="449126573531210296">अपने Google खाते के क्रेडेंशियल का इस्तेमाल कर, सिंक किए गए पासवर्ड को सुरक्षित करें.</translation>
+<translation id="449126573531210296">अपने Google खाते के क्रेडेंशियल का इस्तेमाल करके, सिंक किए गए पासवर्ड को सुरक्षित करें.</translation>
<translation id="4492519888999857993">ये सुविधाएं डिफ़ॉल्ट रूप से बंद कर दी गई हैं. Chrome के आने वाले वर्शन पर ये सुविधाएं उपलब्ध नहीं होंगी.</translation>
<translation id="4493480324863638523">यूआरएल गलत है. यूआरएल में सामान्य स्कीम, जैसे कि, http://example.com या https://example.com.ज़रूर होनी चाहिए.</translation>
<translation id="4494323206460475851">सेटिंग में विज्ञापन के विषयों की जानकारी दिख सकती है. आप चाहें, तो उन विषयों को ब्लॉक कर दें जिनकी जानकारी आपको साइटों के साथ शेयर नहीं करनी है. Chrome भी, विज्ञापन के विषयों की जानकारी अपने-आप मिटा देता है जो चार हफ़्ते से ज़्यादा पुरानी होती हैं.</translation>
@@ -1434,7 +1434,7 @@
<translation id="4521157617044179198"><ph name="WIDTH" /> × <ph name="HEIGHT" /> मि॰मी॰ (<ph name="ORIENTATION" />)</translation>
<translation id="4521280267704259211">मोनार्क साइज़ का लिफ़ाफ़ा</translation>
<translation id="4521916730539354575">बाईं ट्रे</translation>
-<translation id="4522570452068850558">विवरण</translation>
+<translation id="4522570452068850558">ब्यौरा</translation>
<translation id="4524138615196389145">अब WebAuthn का इस्तेमाल करके अपने कार्ड की जल्दी पुष्टि करें</translation>
<translation id="45243788195988825"><ph name="TOPIC" /> को ब्लॉक करें</translation>
<translation id="4524805452350978254">कार्ड प्रबंधित करें</translation>
@@ -1482,7 +1482,7 @@
<translation id="4652440160515225514">आपके संगठन ने इस साइट को ब्लॉक कर दिया है, क्योंकि यह किसी नीति का उल्लंघन करती है.</translation>
<translation id="4653167719759882810">विलय और अधिग्रहण</translation>
<translation id="4658638640878098064">सबसे ऊपर बाईं ओर स्टेपल</translation>
-<translation id="4660119392514473465">अब आप निजी तौर पर ब्राउज़ कर सकते हैं. इस डिवाइस का इस्तेमाल करने वाले अन्य लोगों को आपकी गतिविधि नहीं दिखेगी. हालांकि, आपके डाउनलोड, बुकमार्क, और रीडिंग लिस्ट के आइटम सेव होंगे.</translation>
+<translation id="4660119392514473465">अब निजी तौर पर ब्राउज़ किया जा सकता है. इस डिवाइस का इस्तेमाल करने वाले अन्य लोगों को आपकी गतिविधि नहीं दिखेगी. हालांकि, आपके डाउनलोड, बुकमार्क, और रीडिंग लिस्ट के आइटम सेव होंगे.</translation>
<translation id="4660567771874403130">ऊर्जा और काम की सेवाएं देने वाली कंपनियां</translation>
<translation id="4663373278480897665">कैमरे की अनुमति है</translation>
<translation id="4666114623408286498">फ़ार्मास्यूटिकल और बॉयोटेक</translation>
@@ -1522,7 +1522,7 @@
<translation id="4742407542027196863">पासवर्ड प्रबंधित करें…</translation>
<translation id="4744514002166662487">प्रज़ेंटेशन बनाएं</translation>
<translation id="4744603770635761495">निष्पादित किए जाने वाले पाथ</translation>
-<translation id="4749011317274908093">आप गुप्त मोड में चले गए हैं</translation>
+<translation id="4749011317274908093">आप गुप्त मोड में हैं</translation>
<translation id="4750671009706599284">यह फ़ोन</translation>
<translation id="4750917950439032686">आपकी जानकारी (जैसे- पासवर्ड या क्रेडिट कार्ड नंबर वगैरह) जब इस साइट पर भेजी जाती है, तब वह निजी होती है.</translation>
<translation id="4751249061288707459">सहमति से जुड़ी नीति में पिछली बार बदलाव किए जाने की तारीख:</translation>
@@ -1831,7 +1831,7 @@
<translation id="549333378215107354">आकार 3</translation>
<translation id="5503356662318814623">मैसेज भेजें</translation>
<translation id="5509762909502811065">बी0</translation>
-<translation id="5509780412636533143">प्रबंधित बुकमार्क</translation>
+<translation id="5509780412636533143">मैनेज किए गए बुकमार्क</translation>
<translation id="5510481203689988000">इस सेटिंग को कुकी की सेटिंग में कंट्रोल किया जाता है.</translation>
<translation id="5510766032865166053">हो सकता है कि उसे ले जाया गया हो या हटा दिया गया हो.</translation>
<translation id="5513528801833998679">Use device sign-in</translation>
@@ -2517,7 +2517,7 @@
<translation id="7256634549594854023">पीछे वाली ट्रे</translation>
<translation id="725866823122871198"><ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> से एक निजी कनेक्‍शन स्‍थापित नहीं किया जा सकता क्‍योंकि आपके कंप्‍यूटर का तारीख और समय (<ph name="DATE_AND_TIME" />) गलत है.</translation>
<translation id="7260504762447901703">एक्सेस रद्द करें</translation>
-<translation id="7275334191706090484">प्रबंधित बुकमार्क</translation>
+<translation id="7275334191706090484">मैनेज किए गए बुकमार्क</translation>
<translation id="7277998515889183784">मेकअप और कॉस्मेटिक</translation>
<translation id="7285654172857511148"><ph name="CHANGE_GOOGLE_PASSWORD_FOCUSED_FRIENDLY_MATCH_TEXT" />, अपने Google खाते का पासवर्ड बदलने के लिए, पहले Tab दबाएं और फिर Enter दबाएं</translation>
<translation id="7292031607255951991">पाने वाले का नाम</translation>
@@ -3026,7 +3026,7 @@
<translation id="8449836157089738489">सभी यूआरएल नए टैब ग्रुप में खोलें</translation>
<translation id="8457125768502047971">कोई तय अवधि नहीं</translation>
<translation id="8458202188076138974">लेटर एक्स्ट्रा</translation>
-<translation id="8461694314515752532">सिंक किए गए डेटा को अपने खुद के सिंक लंबे पासवर्ड से सुरक्षित करें</translation>
+<translation id="8461694314515752532">सिंक किए गए डेटा को अपने सिंक किए गए लंबे पासवर्ड से सुरक्षित करें</translation>
<translation id="8466379296835108687">{COUNT,plural, =1{1 क्रेडिट कार्ड}one{# क्रेडिट कार्ड}other{# क्रेडिट कार्ड}}</translation>
<translation id="8468358362970107653">C3 साइज़ का लिफ़ाफ़ा</translation>
<translation id="8473626140772740486">300 x 450 मि॰मी॰</translation>
@@ -3210,7 +3210,7 @@
<translation id="8963213021028234748"><ph name="MARKUP_1" />सुझाव:<ph name="MARKUP_2" />तय करें कि आपके पास डेटा कनेक्शन है<ph name="MARKUP_3" />इस वेबपेज को बाद में फिर लोड करें<ph name="MARKUP_4" />आपने जो पता डाला है उसकी जाँच करें<ph name="MARKUP_5" /></translation>
<translation id="8968766641738584599">कार्ड सेव करें</translation>
<translation id="8971063699422889582">सर्वर के प्रमाणपत्र की समय-सीमा खत्म हो चुकी है.</translation>
-<translation id="8975012916872825179">इसमें फ़ोन नंबर, ईमेल पते और शिपिंग पते जैसी जानकारी शामिल होती है</translation>
+<translation id="8975012916872825179">इसमें फ़ोन नंबर, ईमेल पते, और शिपिंग पते जैसी जानकारी शामिल होती है</translation>
<translation id="8975263830901772334">उन फ़ाइलों के नाम जिन्हें आप प्रिंट करते हैं</translation>
<translation id="8978053250194585037">Google सुरक्षित ब्राउज़िंग को <ph name="SITE" /> पर हाल ही में <ph name="BEGIN_LINK" />फ़िशिंग का पता चला है<ph name="END_LINK" />. फ़िशिंग साइटें आपको भ्रमित करने के लिए अन्य वेबसाइटें होने का दिखावा करती हैं.</translation>
<translation id="8983369100812962543">अब आप ऐप्लिकेशन का डिसप्ले, डिवाइस के वि़ंडो साइज़ के हिसाब से बदल सकते हैं.</translation>
diff --git a/chromium/components/strings/components_strings_it.xtb b/chromium/components/strings/components_strings_it.xtb
index 2e884f8ab22..e6e9a8b59b9 100644
--- a/chromium/components/strings/components_strings_it.xtb
+++ b/chromium/components/strings/components_strings_it.xtb
@@ -262,7 +262,7 @@ In caso contrario l'uso sarà bloccato dalle impostazioni sulla privacy. I conte
<translation id="1553358976309200471">Aggiorna Chrome</translation>
<translation id="1555130319947370107">Blu</translation>
<translation id="1559447966090556585">Ricevere notifiche?</translation>
-<translation id="1559486004335285648">Compilazione automatica delle informazioni di pagamento</translation>
+<translation id="1559486004335285648">Compilazione automatica dei dati di pagamento</translation>
<translation id="1559528461873125649">Nessun file o directory corrispondente</translation>
<translation id="1559572115229829303">&lt;p&gt;Impossibile stabilire una connessione privata con il sito <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> perché data e ora del dispositivo (<ph name="DATE_AND_TIME" />) non sono corrette.&lt;/p&gt;
@@ -1462,7 +1462,7 @@ In caso contrario l'uso sarà bloccato dalle impostazioni sulla privacy. I conte
<translation id="4607603470419975064">Pulsante Leggi i suggerimenti di Chrome, premi Invio per scoprire di più sulle funzionalità di Chrome</translation>
<translation id="4607608436550361748">Leggi i suggerimenti di Chrome</translation>
<translation id="460848736049414407">Bloccato dall'amministratore</translation>
-<translation id="4610279718074907952">Questo sito fa parte di un gruppo definito da <ph name="SET_OWNER" />, che può vedere la tua attività</translation>
+<translation id="4610279718074907952">Questo sito fa parte di un gruppo, definito da <ph name="SET_OWNER" />, che può vedere la tua attività</translation>
<translation id="4617273035598175554">Software di grafica e animazione</translation>
<translation id="4622292761762557753">Trasferisci comunque</translation>
<translation id="4627675673814409125">Questo criterio non può essere impostato a livello di profilo Chrome e verrà ignorato.</translation>
@@ -1935,7 +1935,7 @@ In caso contrario l'uso sarà bloccato dalle impostazioni sulla privacy. I conte
<translation id="5764725887548570807">Formato di origine non valido.</translation>
<translation id="5764920692828389743">Invia a <ph name="EMAIL_ADDRESS" /></translation>
<translation id="5765072501007116331">Seleziona un indirizzo per conoscere i requisiti e i metodi di consegna</translation>
-<translation id="57689295674415555">Il numero della carta virtuale non è stato compilato?</translation>
+<translation id="57689295674415555">Il numero della carta virtuale non è stato inserito?</translation>
<translation id="5772086939108830423">Usa una passkey su un altro dispositivo</translation>
<translation id="5776313857861697733">Priorità</translation>
<translation id="5776574724412881956">I dati della carta virtuale non sono stati inseriti? Fai clic sui dati della carta virtuale per copiarli negli appunti. <ph name="IDS_AUTOFILL_VIRTUAL_CARD_MANUAL_FALLBACK_BUBBLE_LEARN_MORE_LINK_LABEL" /></translation>
@@ -2963,7 +2963,7 @@ Ulteriori dettagli:
<translation id="829335040383910391">audio</translation>
<translation id="8294431847097064396">Origine</translation>
<translation id="8296205692406981542">Parchi e giardini regionali</translation>
-<translation id="8297545700510100061">I cookie e altri dati dei siti vengono utilizzati per ricordare attività e informazioni dell'utente, ad esempio per l'esecuzione dell'accesso o per personalizzare gli annunci. Per gestire i cookie per tutti i siti, consulta le <ph name="SETTINGS" />.</translation>
+<translation id="8297545700510100061">I cookie e altri dati dei siti vengono utilizzati per ricordare attività e informazioni dell'utente, ad esempio per eseguire l'accesso o per personalizzare gli annunci. Per gestire i cookie per tutti i siti, consulta le <ph name="SETTINGS" />.</translation>
<translation id="8298115750975731693">La rete Wi-Fi in uso (<ph name="WIFI_NAME" />) potrebbe richiedere la visita della pagina <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation>
<translation id="8299269255470343364">Giapponese</translation>
<translation id="8303854710873047864">Sezione "<ph name="SECTION" />" mostrata</translation>
diff --git a/chromium/components/strings/components_strings_ja.xtb b/chromium/components/strings/components_strings_ja.xtb
index 4f7384d68f3..29ba6a15fc9 100644
--- a/chromium/components/strings/components_strings_ja.xtb
+++ b/chromium/components/strings/components_strings_ja.xtb
@@ -540,7 +540,7 @@
<translation id="2239100178324503013">送信</translation>
<translation id="2241693394036365668">ファイルがダウンロードされた</translation>
<translation id="2246264294482514010">10x12 インチ</translation>
-<translation id="2246480341630108201">このサイトは保護者から許可されていません</translation>
+<translation id="2246480341630108201">まだ保護者から許可されていません</translation>
<translation id="2247789808226901522">カードの有効期限が切れています</translation>
<translation id="2248949050832152960">WebAuthn を使用</translation>
<translation id="2250931979407627383">端綴じ(左)</translation>
@@ -734,7 +734,7 @@
<translation id="2740531572673183784">OK</translation>
<translation id="2742511345840685325">卓球</translation>
<translation id="2742870351467570537">選択したアイテムを削除</translation>
-<translation id="2759825833388495838"><ph name="APP_NAME" /> でパスワードを入力してください</translation>
+<translation id="2759825833388495838"><ph name="APP_NAME" /> でパスワードを入力しようとしています</translation>
<translation id="2764001903315068341">コミック</translation>
<translation id="2765217105034171413">小</translation>
<translation id="277133753123645258">配送方法</translation>
@@ -822,7 +822,7 @@
<translation id="3002501248619246229">給紙トレイのメディアを確認してください</translation>
<translation id="3005723025932146533">保存済みのコピーを表示</translation>
<translation id="3013291976881901233">MIDI デバイス</translation>
-<translation id="301521992641321250">自動ブロックされました</translation>
+<translation id="301521992641321250">自動でブロックされました</translation>
<translation id="3016780570757425217">ユーザーの現在地の認識</translation>
<translation id="3017086357773116182"><ph name="REMOVE_SUGGESTION_SUFFIX" /> です。Tab キー、Enter キーの順に押すと、候補を削除します。</translation>
<translation id="3023165109041533893">サイトによる広告の提案は、閲覧履歴と個人情報を保護しながら、サイトで関連性の高い広告を表示できるようにする機能です。アクセスするサイトでは、ユーザーのアクティビティに基づき、関連する広告をそれ以降のブラウジング時に提案できます。設定で、これらのサイトのリストを確認したり、必要のないサイトをブロックしたりできます。</translation>
@@ -1035,7 +1035,7 @@
<translation id="3550112004925580947">サービス業</translation>
<translation id="3552297013052089404">Sans Serif フォント</translation>
<translation id="3558573058928565255">日中</translation>
-<translation id="3560824484345057728">関連サイトを表示</translation>
+<translation id="3560824484345057728">関連サイトを表示する</translation>
<translation id="3566021033012934673">この接続ではプライバシーが保護されません</translation>
<translation id="3566336457819493938">215x315 mm</translation>
<translation id="3567778190852720481">企業アカウントでは登録できません(企業アカウントは利用できません)。</translation>
@@ -1078,7 +1078,7 @@
<translation id="3646643500201740985">広告のパフォーマンスの測定</translation>
<translation id="3647286794400715637">各 urls 文字列エントリには 1 つまたは 2 つの URL を含める必要があります。</translation>
<translation id="3650584904733503804">検証が正常に完了しました</translation>
-<translation id="3650594806107685466">カードのセキュリティを確保するには、<ph name="SIDE_OF_CARD" /> に記載されている CVC を入力してください</translation>
+<translation id="3650594806107685466">カードの安全を守るために、<ph name="SIDE_OF_CARD" />に記載されている CVC を入力してください</translation>
<translation id="3653033846669030038">テーマパーク</translation>
<translation id="3655241534245626312">権限の設定に移動します</translation>
<translation id="3655670868607891010">このエラーが頻繁に表示される場合は、こちらの<ph name="HELP_LINK" />をお試しください。</translation>
@@ -1198,7 +1198,7 @@
<translation id="3962859241508114581">前の曲</translation>
<translation id="3963721102035795474">リーダーモード</translation>
<translation id="3964661563329879394">{COUNT,plural, =0{なし}=1{1 件のサイトから}other{# 件のサイトから}}</translation>
-<translation id="3969052498612555048">コードが表示されない場合は、<ph name="BEGIN_LINK" />新しいコードを取得<ph name="END_LINK" />してください</translation>
+<translation id="3969052498612555048">コードが届かない場合は、<ph name="BEGIN_LINK" />新しいコードを取得<ph name="END_LINK" />してください</translation>
<translation id="397105322502079400">計算しています...</translation>
<translation id="3973234410852337861"><ph name="HOST_NAME" /> はブロックされています</translation>
<translation id="3984581365661308170">#11 封筒</translation>
@@ -1465,7 +1465,7 @@
<translation id="4607603470419975064">[Chrome のヒントを表示] ボタンです。Enter キーを押して、Chrome の機能を確認します</translation>
<translation id="4607608436550361748">Chrome のヒントを表示</translation>
<translation id="460848736049414407">管理者によりブロック済み</translation>
-<translation id="4610279718074907952">このサイトは、アクティビティを確認できる <ph name="SET_OWNER" /> により定義されたグループに属しています</translation>
+<translation id="4610279718074907952">このサイトは、<ph name="SET_OWNER" /> により定義され、アクティビティを確認できるグループに属しています</translation>
<translation id="4617273035598175554">グラフィック、アニメーション ソフトウェア</translation>
<translation id="4622292761762557753">このまま転送</translation>
<translation id="4627675673814409125">このポリシーは、Chrome プロフィール単位では設定できないため、無視されます。</translation>
@@ -1513,7 +1513,7 @@
<translation id="4726672564094551039">ポリシーを再読み込み</translation>
<translation id="4728558894243024398">プラットフォーム</translation>
<translation id="4731638775147756694">このアプリケーションは管理者によってブロックされています</translation>
-<translation id="4733082559415072992"><ph name="URL" /> から、デバイスの現在地情報の使用許可を求められています</translation>
+<translation id="4733082559415072992">デバイスの現在地情報について、<ph name="URL" /> が使用許可を求めています</translation>
<translation id="4736491186715342415">自動車</translation>
<translation id="4736825316280949806">Chromium を再起動する</translation>
<translation id="4736934858538408121">仮想カード</translation>
@@ -1966,7 +1966,7 @@
<translation id="5838278095973806738">このサイトでは機密情報(パスワード、クレジット カードなど)を入力しないでください。悪意のあるユーザーに情報が盗まれる恐れがあります。</translation>
<translation id="5851548754964597211">タブ リスト</translation>
<translation id="5852909432155870672">RA4</translation>
-<translation id="5860033963881614850">オフ</translation>
+<translation id="5860033963881614850">OFF</translation>
<translation id="5862579898803147654">スタッカー 8</translation>
<translation id="5863847714970149516">表示しようとしているページでは課金される恐れがあります</translation>
<translation id="5866257070973731571">電話番号の追加</translation>
@@ -2500,7 +2500,7 @@
<translation id="7217745192097460130">Touch ID を使用して本人確認し、購入手続きを完了しますか?</translation>
<translation id="7219179957768738017">この接続には <ph name="SSL_VERSION" /> を使用しています。</translation>
<translation id="7220786058474068424">処理しています</translation>
-<translation id="7221855153210829124">通知の表示</translation>
+<translation id="7221855153210829124">通知を表示</translation>
<translation id="722454870747268814">新しいシークレット タブ</translation>
<translation id="7233592378249864828">確認シートの印刷</translation>
<translation id="7234638337680728591">ガソリン料金、燃費</translation>
@@ -2585,7 +2585,7 @@
&lt;li&gt;このソフトウェアをパソコンから完全に削除する方法については、&lt;a href="https://support.google.com/chrome/answer/6098869"&gt;Chrome ヘルプセンター&lt;/a&gt;をご覧ください。
&lt;/ol&gt;</translation>
<translation id="7410471291937727359">ラブリー</translation>
-<translation id="741204030948306876">有効にする</translation>
+<translation id="741204030948306876">ON にする</translation>
<translation id="7416351320495623771">パスワードを管理…</translation>
<translation id="7418620734632363981">プログラミング</translation>
<translation id="7419106976560586862">プロフィール パス</translation>
@@ -2967,7 +2967,7 @@
<translation id="829335040383910391">音声</translation>
<translation id="8294431847097064396">ソース</translation>
<translation id="8296205692406981542">公園、庭園</translation>
-<translation id="8297545700510100061">Cookie と他のサイトデータは、ログインや広告のカスタマイズなどでユーザーを特定するために使用されます。すべてのサイトの Cookie を管理するには、<ph name="SETTINGS" /> をご覧ください。</translation>
+<translation id="8297545700510100061">Cookie と他のサイトデータは、ログインや広告のパーソナライズなどでユーザーを覚えておくために使用されます。すべてのサイトの Cookie を管理するには、<ph name="SETTINGS" /> をご覧ください。</translation>
<translation id="8298115750975731693">ご利用の Wi-Fi(<ph name="WIFI_NAME" />)では、<ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /> へのアクセスが必要な可能性があります。</translation>
<translation id="8299269255470343364">日本語</translation>
<translation id="8303854710873047864">「<ph name="SECTION" />」セクションを表示しています</translation>
diff --git a/chromium/components/strings/components_strings_kk.xtb b/chromium/components/strings/components_strings_kk.xtb
index 8e9e783aac5..7ddbeabd86c 100644
--- a/chromium/components/strings/components_strings_kk.xtb
+++ b/chromium/components/strings/components_strings_kk.xtb
@@ -453,7 +453,7 @@
<translation id="2036514476578229158">Осы сайтқа кіруді сұрадыңыз. Ата-аналарыңыз Family Link-те жауап бере алады.</translation>
<translation id="2036983605131262583">Басқа орам</translation>
<translation id="2040463897538655645">Алынбалы жад</translation>
-<translation id="2040894699575719559">Орын бөгелген</translation>
+<translation id="2040894699575719559">Орын блокталған</translation>
<translation id="2042213636306070719">7-науа</translation>
<translation id="204357726431741734">Google аккаунтыңызда сақталған құпия сөздерді пайдалану үшін кіру</translation>
<translation id="2045871135676061132">Personal хатқалтасы</translation>
@@ -744,7 +744,7 @@
<translation id="2784474685437057136">B5 Extra</translation>
<translation id="2784949926578158345">Байланыс қалпына келтірілді.</translation>
<translation id="2792012897584536778">Бұл құрылғының әкімшілері қауіпсіздік сертификаттарын орнатты, енді олар сіз кірген веб-сайттардың контентін көруі мүмкін.</translation>
-<translation id="2794233252405721443">Сайт бөгелген</translation>
+<translation id="2794233252405721443">Сайт блокталған</translation>
<translation id="2799020568854403057">Сайтта зиянды қолданбалар бар</translation>
<translation id="2799223571221894425">Қайта іске қосу</translation>
<translation id="2803306138276472711"><ph name="SITE" /> сайтында Google Safe Browsing жақында <ph name="BEGIN_LINK" />зиянды бағдарламаны анықтады<ph name="END_LINK" />. Қорғалған веб-сайттар да кейде зиянды бағдарламамен зақымдалады.</translation>
@@ -822,7 +822,7 @@
<translation id="3002501248619246229">Кіріс науасының деректерін тексеру</translation>
<translation id="3005723025932146533">Сақталған көшірмені көрсету</translation>
<translation id="3013291976881901233">MIDI құрылғылары</translation>
-<translation id="301521992641321250">Автоматты түрде бөгелген</translation>
+<translation id="301521992641321250">Автоматты түрде блокталған</translation>
<translation id="3016780570757425217">Орналасқан жеріңізді білу</translation>
<translation id="3017086357773116182"><ph name="REMOVE_SUGGESTION_SUFFIX" />, ұсынысты өшіру үшін Tab пернесін, содан кейін Enter пернесін басыңыз.</translation>
<translation id="3023165109041533893">Сайт ұсынған жарнамалар сайттардың қатысты жарнамаларды көрсетуіне мүмкіндік бере отырып, браузерді қолдану тарихы мен жеке ақпаратыңызды қорғауға көмектеседі. Басқа сайттарды шолған кезде, әрекетіңізге байланысты кірген сайтыңыз тиісті жарнамаларды ұсына алады. Параметрлерден осы сайттардың тізімін қарап, қажет еместерін бөгеуге болады.</translation>
@@ -905,7 +905,7 @@
<translation id="3238395604961564389">Сілтемені инкогнито терезесінде ашу</translation>
<translation id="3240683217920639535"><ph name="MANAGE_CHROME_THEMES_FOCUSED_FRIENDLY_MATCH_TEXT" />. Браузер көрінісін реттеу үшін Tab, сосын Enter пернесін басыңыз.</translation>
<translation id="3240791268468473923">Қауіпсіз төлемге арналған деректердің сәйкес келмейтіндігі көрсетілген парақ ашылды.</translation>
-<translation id="324180406144491771">"<ph name="HOST_NAME" />" сілтемелері бөгелген</translation>
+<translation id="324180406144491771">"<ph name="HOST_NAME" />" сілтемелері блокталған</translation>
<translation id="3248611290851046188">Бұл сайт басқа сайттар сізге жарнама көрсету үшін сүйене алатын қызығушылықтарды анықтайды. Ол қызығушылықтарыңыз туралы ақпаратты Chrome браузерінен де алады.</translation>
<translation id="3249151924975132674">Студенттік несиелер және қаржыландыру</translation>
<translation id="3249845759089040423">Заманауи</translation>
@@ -918,7 +918,7 @@
<translation id="3264837738038045344">Chrome параметрлерін басқару түймесі, Chrome параметрлеріне өту үшін Enter пернесін басыңыз.</translation>
<translation id="3266367459139339908">Сайттарда жекелендірілген жарнамалар көрсетілгенде, сіз туралы не білуге болатынын шектейтін жаңа жолдарды іске қосып жатырмыз, мысалы:</translation>
<translation id="3266793032086590337">Мән (қарама-қайшы)</translation>
-<translation id="3266972086368072861">{NUM_COOKIES,plural, =0{Ешбір сайт (қатысты сайттарды қоса алғанда) бөгелмеген}=1{1 сайт (қатысты сайттарды қоса алғанда) бөгелген}other{# сайт (қатысты сайттарды қоса алғанда) бөгелген}}</translation>
+<translation id="3266972086368072861">{NUM_COOKIES,plural, =0{Ешбір сайт (қатысты сайттарды қоса алғанда) бөгелмеген}=1{1 сайт (қатысты сайттарды қоса алғанда) блокталған}other{# сайт (қатысты сайттарды қоса алғанда) блокталған}}</translation>
<translation id="3268451620468152448">Ашық қойындылар</translation>
<translation id="3270156322180235608">Әуе саяхаты</translation>
<translation id="3270847123878663523">&amp;Қайта тәртіпке келтіруді болдырмау</translation>
@@ -937,7 +937,7 @@
<translation id="3303855915957856445">Іздеу нәтижелері табылмады</translation>
<translation id="3304073249511302126">Bluetooth құрылғыларын іздеу</translation>
<translation id="3304777285002411338">A2x3</translation>
-<translation id="33073482541490531">Сіз жаңа ғана қолданған құпия сөз деректердің қолды болуы салдарынан жария етілді. Құпия сөз менеджері оны дереу өзгертуді ұсынады.</translation>
+<translation id="33073482541490531">Сіз жаңа ғана қолданған құпия сөз деректердің қолды болуы салдарынан жария етілді. Password Manager оны дереу өзгертуді ұсынады.</translation>
<translation id="3308006649705061278">Ұйымдық бірлік (OU)</translation>
<translation id="3320021301628644560">Төлем мекенжайын қосу</translation>
<translation id="3324687287337751929">4 x 6 дюйм</translation>
@@ -1199,7 +1199,7 @@
<translation id="3964661563329879394">{COUNT,plural, =0{Жоқ}=1{1 сайттан }other{# сайттан }}</translation>
<translation id="3969052498612555048">Кодты таба алмай жатырсыз ба? <ph name="BEGIN_LINK" />Жаңа код алу<ph name="END_LINK" /></translation>
<translation id="397105322502079400">Есептелуде…</translation>
-<translation id="3973234410852337861"><ph name="HOST_NAME" /> бөгелген</translation>
+<translation id="3973234410852337861"><ph name="HOST_NAME" /> блокталған</translation>
<translation id="3984581365661308170">#11 хатқалта</translation>
<translation id="398470910934384994">Құстар</translation>
<translation id="3985750352229496475">Мекенжайларды басқару...</translation>
@@ -1664,7 +1664,7 @@
<translation id="5070335125961472645"><ph name="BEGIN_LINK" />Прокси мекенжайын тексеру<ph name="END_LINK" /></translation>
<translation id="5070838744279127212">Оныншы орам</translation>
<translation id="507130231501693183">4-ші пошта жәшігі</translation>
-<translation id="5078060223219502807">Сіз жаңа ғана қолданған құпия сөз деректердің қолды болуы салдарынан жария етілді. Аккаунттарыңызды қорғау үшін Құпия сөз менеджері оны дереу өзгертуді және сақталған құпия сөздеріңізді тексеруді ұсынады.</translation>
+<translation id="5078060223219502807">Сіз жаңа ғана қолданған құпия сөз деректердің қолды болуы салдарынан жария етілді. Аккаунттарыңызды қорғау үшін Password Manager оны дереу өзгертуді және сақталған құпия сөздеріңізді тексеруді ұсынады.</translation>
<translation id="5086225927071063542">Деректі үлестіру жолымен және бұлтта өңдеу</translation>
<translation id="5087286274860437796">Сервердің сертификаты әзірше жарамайды.</translation>
<translation id="5087580092889165836">Несие картасын қосу</translation>
@@ -1777,7 +1777,7 @@
<translation id="5334013548165032829">Жүйе журналдары туралы мәліметтер</translation>
<translation id="5334145288572353250">Мекенжайды сақтау керек пе?</translation>
<translation id="5337569431717511221">Chrome-ды әдепкі браузер етіп орнату түймесі: Chrome-ды жүйенің әдепкі браузері етіп орнату үшін Enter пернесін басыңыз</translation>
-<translation id="5340250774223869109">Қолданба бөгелген</translation>
+<translation id="5340250774223869109">Қолданба блокталған</translation>
<translation id="534295439873310000">NFC функциясы бар құрылғылар</translation>
<translation id="5344522958567249764">Жарнамадағы құпиялықты басқару</translation>
<translation id="5344579389779391559">Бетті ашсаңыз, ақы алынуы мүмкін</translation>
@@ -1804,7 +1804,7 @@
<translation id="5414511064953050917">Сонда да ауыстыру</translation>
<translation id="5421136146218899937">Шолу деректерін өшіру…</translation>
<translation id="5423269318075950257">Бағаны бақылау</translation>
-<translation id="5425241977284572032">{NUM_COOKIES,plural, =0{Ешбір сайт бөгелмеген}=1{1 сайт бөгелген}other{# сайт бөгелген}}</translation>
+<translation id="5425241977284572032">{NUM_COOKIES,plural, =0{Ешбір сайт бөгелмеген}=1{1 сайт блокталған}other{# сайт блокталған}}</translation>
<translation id="5426179911063097041"><ph name="SITE" /> хабарландыру жіберуге рұқсат сұрады</translation>
<translation id="5428105026674456456">испан</translation>
<translation id="5430298929874300616">Бетбелгіні жою</translation>
@@ -2019,7 +2019,7 @@
<translation id="5992691462791905444">Z тәрізді етіп жиі бүктеу</translation>
<translation id="5992805036496113940">Сізге жарнама көрсету үшін пайдаланылған ақпаратты көру</translation>
<translation id="5995727681868049093">Google аккаунтыңыздағы ақпаратты, құпиялықты және қауіпсіздікті басқару</translation>
-<translation id="5997247540087773573">Сіз жаңа ғана қолданған құпия сөз деректердің қолды болуы салдарынан жария етілді. Аккаунттарыңызды қорғау үшін Google Құпия сөз менеджері оны дереу өзгертуді және сақталған құпия сөздеріңізді тексеруді ұсынады.</translation>
+<translation id="5997247540087773573">Сіз жаңа ғана қолданған құпия сөз деректердің қолды болуы салдарынан жария етілді. Аккаунттарыңызды қорғау үшін Google Password Manager оны дереу өзгертуді және сақталған құпия сөздеріңізді тексеруді ұсынады.</translation>
<translation id="6000758707621254961">"<ph name="SEARCH_TEXT" />" сұрауы бойынша <ph name="RESULT_COUNT" /> нәтиже шықты</translation>
<translation id="6005765687956866568">Автоматты толтырылған ақпарат үлгіден өшірілді</translation>
<translation id="6006365096047131769">3 x 5 дюйм</translation>
@@ -2371,7 +2371,7 @@
<translation id="691024665142758461">Бірнеше файлды жүктеп алу</translation>
<translation id="6915804003454593391">Пайдаланушы:</translation>
<translation id="6916954549222464607">Қаржылық жоспарлау және басқару</translation>
-<translation id="6917795328362592458">Сіз жаңа ғана қолданған құпия сөз деректердің қолды болуы салдарынан жария етілді. Аккаунттарыңызды қорғау үшін Құпия сөз менеджері сақталған құпия сөздеріңізді тексеруді ұсынады.</translation>
+<translation id="6917795328362592458">Сіз жаңа ғана қолданған құпия сөз деректердің қолды болуы салдарынан жария етілді. Аккаунттарыңызды қорғау үшін Password Manager сақталған құпия сөздеріңізді тексеруді ұсынады.</translation>
<translation id="6925267999184670015">Солтүстік Америка B+</translation>
<translation id="6934672428414710184">Бұл атау Google аккаунтыңызда бар.</translation>
<translation id="6936976777388162184">Бұл құрылғының лицензиясы ендірілген және ол Kiosk and Signage Upgrade лицензиясына тіркелмейді.</translation>
@@ -2569,7 +2569,7 @@
<translation id="7390545607259442187">Картаны растау</translation>
<translation id="7392089738299859607">Мекенжайды жаңарту</translation>
<translation id="739728382607845710">Төлемді өңдегіш белгішесі</translation>
-<translation id="7399802613464275309">Қауіпсіздік шарасы</translation>
+<translation id="7399802613464275309">Қауіпсіздік тексерісі</translation>
<translation id="7400418766976504921">URL</translation>
<translation id="7403392780200267761">Сілтемені бөлісу, QR кодын жасау, трансляциялау және т.б. арқылы осы қойындыны бөлісу</translation>
<translation id="7403591733719184120"><ph name="DEVICE_NAME" /> құрылғыңыз басқарылады</translation>
@@ -2613,7 +2613,7 @@
<translation id="7485870689360869515">Деректер табылмады.</translation>
<translation id="748745328507845862">Концерттер және музыкалық фестивальдар</translation>
<translation id="7489473601138133813">Мансапқа қатысты ресурстар және мансапты жоспарлау</translation>
-<translation id="7495528107193238112">Бұл контент бөгелген. Мәселені шешу үшін сайт иесімен байланыс орнатыңыз.</translation>
+<translation id="7495528107193238112">Бұл контент блокталған. Мәселені шешу үшін сайт иесімен байланыс орнатыңыз.</translation>
<translation id="7497998058912824456">"Құжат жасау" түймесі, жаңа Google құжатын жылдам жасау үшін Enter пернесін басыңыз.</translation>
<translation id="7501663406926337752">Ұйымыңыз сіз ашайын деп жатқан сайтты белгіледі</translation>
<translation id="7501853161948120656">Оқу материалдары</translation>
@@ -2693,7 +2693,7 @@
<translation id="7637586430889951925">{COUNT,plural, =0{Жоқ}=1{Аккаунтыңыздағы 1 құпия сөз (<ph name="DOMAIN_LIST" /> үшін)}other{Аккаунтыңыздағы # құпия сөз (<ph name="DOMAIN_LIST" /> үшін)}}</translation>
<translation id="7638605456503525968">Сериялық порттар</translation>
<translation id="7639968568612851608">Қою сұр</translation>
-<translation id="7646681339175747202">Сіз жаңа ғана қолданған құпия сөз деректердің қолды болуы салдарынан жария етілді. Google Құпия сөз менеджері құпия сөзіңізді дереу өзгертуді ұсынады.</translation>
+<translation id="7646681339175747202">Сіз жаңа ғана қолданған құпия сөз деректердің қолды болуы салдарынан жария етілді. Google Password Manager құпия сөзіңізді дереу өзгертуді ұсынады.</translation>
<translation id="7647206758853451655">Басып шығару сапасы</translation>
<translation id="7648992873808071793">Файлдарды осы құрылғыда сақтау</translation>
<translation id="7653957176542370971">Төлем өңдегіш беті жабық.</translation>
diff --git a/chromium/components/strings/components_strings_kn.xtb b/chromium/components/strings/components_strings_kn.xtb
index 7ca79117c94..e47bdafb58b 100644
--- a/chromium/components/strings/components_strings_kn.xtb
+++ b/chromium/components/strings/components_strings_kn.xtb
@@ -278,7 +278,7 @@
<translation id="1584492003828271317">ನೀವು ಬ್ರೌಸ್ ಮಾಡುತ್ತಿದ್ದಂತೆ, ನೀವು ನೋಡುವ ಜಾಹೀರಾತುಗಳನ್ನು ವೈಯಕ್ತೀಕರಿಸಲಾಗಿದೆಯೇ ಅಥವಾ ಇಲ್ಲವೇ ಎಂಬುದು ಈ ಸೆಟ್ಟಿಂಗ್‌ಗಳು, ಸೈಟ್ ಸೂಚಿಸಿದ ಜಾಹೀರಾತುಗಳು, ನಿಮ್ಮ ಕುಕಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳು ಮತ್ತು ನೀವು ವೀಕ್ಷಿಸುತ್ತಿರುವ ಸೈಟ್ ಜಾಹೀರಾತುಗಳನ್ನು ವೈಯಕ್ತೀಕರಿಸುತ್ತದೆಯೇ ಎಂಬುದನ್ನು ಅವಲಂಬಿಸಿರುತ್ತದೆ</translation>
<translation id="1586541204584340881">ನೀವು ಯಾವ ವಿಸ್ತರಣೆಗಳನ್ನು ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಿದ್ದೀರಿ</translation>
<translation id="1588438908519853928">ಸಾಮಾನ್ಯ</translation>
-<translation id="1592005682883173041">ಸ್ಥಳೀಯ ಡೇಟಾ ಪ್ರವೇಶ</translation>
+<translation id="1592005682883173041">ಸ್ಥಳೀಯ ಡೇಟಾ ಆ್ಯಕ್ಸೆಸ್</translation>
<translation id="1593359183944365958">270 ಡಿಗ್ರಿಗಳು</translation>
<translation id="1594030484168838125">ಆರಿಸಿ</translation>
<translation id="1596296697375291157">ಥ್ರಿಲ್ಲರ್, ಕ್ರೈಂ ಮತ್ತು ರಹಸ್ಯಮಯ ಚಲನಚಿತ್ರಗಳು</translation>
@@ -509,7 +509,7 @@
<translation id="2162510787844374618">ನಿಮ್ಮ ಬ್ಯಾಂಕ್ ಅನ್ನು ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ...</translation>
<translation id="2162620598375156287">ಇದೀಗ <ph name="CURRENT_PRICE" /><ph name="SOURCE_WEBSITE" /> ನಲ್ಲಿ</translation>
<translation id="2164510882479075877"><ph name="HOST_NAME" /> ನ ಕಾಗುಣಿತ ತಪ್ಪಾಗಿದೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸಿ.</translation>
-<translation id="2166049586286450108">ಪೂರ್ಣ ನಿರ್ವಾಹಕ ಪ್ರವೇಶ</translation>
+<translation id="2166049586286450108">ಪೂರ್ಣ ನಿರ್ವಾಹಕ ಆ್ಯಕ್ಸೆಸ್</translation>
<translation id="2166378884831602661">ಈ ಸೈಟ್‌ಗೆ ಸುರಕ್ಷಿತ ಸಂಪರ್ಕವನ್ನು ಒದಗಿಸಲಾಗುವುದಿಲ್ಲ</translation>
<translation id="2168151236314517198">ನಿರ್ವಾಹಕರ ನೀತಿಯ ಪ್ರಕಾರ ಈ ವಿಷಯವನ್ನು ಪ್ರಿಂಟ್ ಮಾಡುವುದನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ</translation>
<translation id="2181821976797666341">ನಿಯಮಗಳು</translation>
@@ -560,7 +560,7 @@
<translation id="2286383991450886080">34 x 44 ಇಂಚು</translation>
<translation id="2288422996159078444">ನೀವು ಟೈಪ್ ಮಾಡುವ ಯಾವುದೇ ವಿಷಯ, ವೀಕ್ಷಿಸುವ ಯಾವುದೇ ಪುಟಗಳು ಅಥವಾ ವೆಬ್‌ನಲ್ಲಿ ನಡೆಸುವ ಇತರ ಯಾವುದೇ ಚಟುವಟಿಕೆಯ ಮೇಲೆ ನಿಗಾ ಇರಿಸಲಾಗಿದೆ. ಸೈಟ್‌ಗಳಲ್ಲಿನ ವಿಷಯವನ್ನು ನಿಮ್ಮ ಗಮನಕ್ಕೆ ತರದೇ ಬದಲಾಯಿಸಬಹುದು.</translation>
<translation id="2289385804009217824">ಟ್ರಿಮ್ ಮಾಡಿ</translation>
-<translation id="2292556288342944218">ನಿಮ್ಮ ಇಂಟರ್ನೆಟ್ ಪ್ರವೇಶ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ</translation>
+<translation id="2292556288342944218">ನಿಮ್ಮ ಇಂಟರ್ನೆಟ್ ಆ್ಯಕ್ಸೆಸ್ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ</translation>
<translation id="2293443924986248631">ಆನ್ ಮಾಡಿದಾಗ, ನಿಮ್ಮನ್ನು ವೆಬ್‌ನಾದ್ಯಂತ ಟ್ರ್ಯಾಕ್ ಮಾಡುವ ಕುಕೀಗಳನ್ನು ಬಳಸಲು ಸೈಟ್‌ಗಳಿಗೆ ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. ಕೆಲವು ವೆಬ್‌ಸೈಟ್‌ಗಳಲ್ಲಿನ ವೈಶಿಷ್ಟ್ಯಗಳು ಕಾರ್ಯನಿರ್ವಹಿಸುವುದನ್ನು ನಿಲ್ಲಿಸಬಹುದು.</translation>
<translation id="2298855485018661510">ಕುಕೀಗಳ ಬಟನ್ ಅನ್ನು ನಿರ್ವಹಿಸಿ, Chrome ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ನಿಮ್ಮ ಕುಕೀ ಆದ್ಯತೆಗಳನ್ನು ನಿರ್ವಹಿಸಲು Enter ಒತ್ತಿ</translation>
<translation id="2300306941146563769">ಅಪ್‌ಲೋಡ್ ಮಾಡಿಲ್ಲ</translation>
@@ -851,7 +851,7 @@
<translation id="3113284927548439113">ಮೂರನೇ ಶಿಫ್ಟ್</translation>
<translation id="3114040155724590991">Android ಸಿಸ್ಟಂ ಅನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡಲಾಗುತ್ತಿದೆ
ನಿಮ್ಮ ಆ್ಯಪ್ ಅನ್ನು ಪ್ರಾರಂಭಿಸಲು ಸಾಮಾನ್ಯಕ್ಕಿಂತ ಹೆಚ್ಚಿನ ಸಮಯ ತೆಗೆದುಕೊಳ್ಳಬಹುದು.</translation>
-<translation id="3115363211799416195">{0,plural, =1{ಗೌಪ್ಯ ಫೈಲ್ ಡೌನ್‌ಲೋಡ್ ಮಾಡುವುದೇ?}one{ಗೌಪ್ಯ ಫೈಲ್‌ಗಳನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡುವುದೇ?}other{ಗೌಪ್ಯ ಫೈಲ್‌ಗಳನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡುವುದೇ?}}</translation>
+<translation id="3115363211799416195">{0,plural, =1{ಗೌಪ್ಯ ಫೈಲ್ ಡೌನ್‌ಲೋಡ್ ಮಾಡಬೇಕೆ?}one{ಗೌಪ್ಯ ಫೈಲ್‌ಗಳನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಬೇಕೆ?}other{ಗೌಪ್ಯ ಫೈಲ್‌ಗಳನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಬೇಕೆ?}}</translation>
<translation id="3115874930288085374"><ph name="ENROLLMENT_DOMAIN" />, ನಿಮ್ಮ ಡೇಟಾವನ್ನು ನೀವು ಬ್ಯಾಕಪ್ ಮಾಡಬೇಕೆಂದು ಮತ್ತು ಈ <ph name="DEVICE_TYPE" /> ಸಾಧನವನ್ನು ಹಿಂತಿರುಗಿಸಬೇಕೆಂದು ಬಯಸುತ್ತದೆ.</translation>
<translation id="3116158981186517402">ಲ್ಯಾಮಿನೇಟ್ ಮಾಡಿ</translation>
<translation id="3120730422813725195">Elo</translation>
@@ -1920,7 +1920,7 @@
<translation id="5730040223043577876">ನೀವು ಇತರ ಸೈಟ್‌ಗಳಲ್ಲಿ ಪಾಸ್‌ವರ್ಡ್‌ ಅನ್ನು ಮರುಬಳಕೆ ಮಾಡಿದ್ದಲ್ಲಿ Chrome ನಿಮ್ಮ ಪಾಸವರ್ಡ್ ಅನ್ನು ಮರುಹೊಂದಿಸಲು ಶಿಫಾರಸು ಮಾಡುತ್ತದೆ.</translation>
<translation id="5732392974455271431">ನಿಮ್ಮ ಪೋಷಕರು ನಿಮಗಾಗಿ ಅದನ್ನು ಅನಿರ್ಬಂಧಿಸಬಹುದಾಗಿದೆ</translation>
<translation id="5736165827969430182">ಲೋಹಗಳು ಮತ್ತು ಗಣಿಗಾರಿಕೆ</translation>
-<translation id="5737183892635480227">{NUM_CARDS,plural, =1{ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಕಾರ್ಡ್‌ ಉಳಿಸಿ}one{ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಕಾರ್ಡ್‌ಗಳನ್ನು ಉಳಿಸಿ}other{ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಕಾರ್ಡ್‌ಗಳನ್ನು ಉಳಿಸಿ}}</translation>
+<translation id="5737183892635480227">{NUM_CARDS,plural, =1{ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಕಾರ್ಡ್‌ ಸೇವ್ ಮಾಡಿ}one{ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಕಾರ್ಡ್‌ಗಳನ್ನು ಸೇವ್ ಮಾಡಿ}other{ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಕಾರ್ಡ್‌ಗಳನ್ನು ಸೇವ್ ಮಾಡಿ}}</translation>
<translation id="5738385766833540397">ನೀವು ಟ್ರ್ಯಾಕ್ ಮಾಡುವ ಉತ್ಪನ್ನಗಳ ಬೆಲೆ ಕುಸಿತದ ಎಚ್ಚರಿಕೆಗಳನ್ನು ನೀವು ಹೇಗೆ ಸ್ವೀಕರಿಸುತ್ತೀರಿ ಎಂಬುದನ್ನು ನಿರ್ವಹಿಸಿ</translation>
<translation id="5740911612628596808">ಎನ್ವಲಪ್ C9</translation>
<translation id="5743638595296120378">ವಾಹನ ಖರೀದಿ</translation>
@@ -2047,7 +2047,7 @@
<translation id="6047927260846328439">ಈ ಕಂಟೆಂಟ್‌ ಸಾಫ್ಟ್‌ವೇರ್ ಸ್ಥಾಪಿಸುವಂತೆ ಅಥವಾ ನಿಮ್ಮ ವೈಯಕ್ತಿಕ ಮಾಹಿತಿಯನ್ನು ಬಹಿರಂಗಪಡಿಸುವಂತೆ ನಿಮ್ಮನ್ನು ಮೋಸಗೊಳಿಸಲು ಪ್ರಯತ್ನಿಸುತ್ತಿರಬಹುದು. <ph name="BEGIN_LINK" />ಹೇಗಿದ್ದರೂ ತೋರಿಸಿ<ph name="END_LINK" /></translation>
<translation id="6049004884579590341">ಪೂರ್ಣಪರದೆಯಿಂದ ನಿರ್ಗಮಿಸಲು <ph name="ACCELERATOR" /> ಅನ್ನು ಒತ್ತಿ ಹಿಡಿದುಕೊಳ್ಳಿ</translation>
<translation id="6049056807983403918">ಎನ್ವಲಪ್ B4</translation>
-<translation id="6049488691372270142">ಪುಟ ವಿತರಣೆ</translation>
+<translation id="6049488691372270142">ಪೇಜ್ ಡೆಲಿವರಿ</translation>
<translation id="6051221802930200923">ನೀವು ಸದ್ಯಕ್ಕೆ <ph name="SITE" /> ಗೆ ಭೇಟಿ ನೀಡಲು ಸಾಧ್ಯವಿಲ್ಲ. ಏಕೆಂದರೆ, ವೆಬ್‌ಸೈಟ್ ಪ್ರಮಾಣಪತ್ರ ಪಿನ್ ಮಾಡುವಿಕೆಯನ್ನು ಬಳಸುತ್ತದೆ. ನೆಟ್‌ವರ್ಕ್ ದೋಷಗಳು ಮತ್ತು ಆಕ್ರಮಣಗಳು ತಾತ್ಕಾಲಿಕವಾಗಿರುತ್ತವೆ, ಹೀಗಾಗಿ ಈ ಪುಟವು ಸ್ವಲ್ಪ ಸಮಯದ ನಂತರ ಕಾರ್ಯ ನಿರ್ವಹಿಸಬಹುದು.</translation>
<translation id="6051898664905071243">ಪುಟ ಎಣಿಕೆ:</translation>
<translation id="6052284303005792909">•</translation>
@@ -2241,7 +2241,7 @@
<translation id="6569366777234823130">ನಾಟಕೀಯ ಚಲನಚಿತ್ರಗಳು</translation>
<translation id="6573200754375280815">ಬಲಭಾಗದಲ್ಲಿ ಎರಡು ತೂತುಗಳನ್ನು ಮಾಡಿ</translation>
<translation id="657902945730878902">ರೇಖಾಚಿತ್ರ ಮತ್ತು ಬಣ್ಣ ಹಚ್ಚುವಿಕೆ</translation>
-<translation id="6579630537141957243">MIDI ಸಾಧನವನ್ನು ಕನೆಕ್ಟ್ ಮಾಡುವುದೇ?</translation>
+<translation id="6579630537141957243">MIDI ಸಾಧನವನ್ನು ಕನೆಕ್ಟ್ ಮಾಡಬೇಕೆ?</translation>
<translation id="6579990219486187401">ತಿಳಿ ಗುಲಾಬಿ</translation>
<translation id="6587182488465657433">ಡೇಟಾ ಉಲ್ಲಂಘನೆಯಲ್ಲಿ ನೀವು ಬಳಸಿದ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು Chrome ಪತ್ತೆಹಚ್ಚಿದೆ. ನಿಮ್ಮ ಖಾತೆಗಳನ್ನು ಸುರಕ್ಷಿತವಾಗಿರಿಸಲು, ಅದನ್ನು ಈಗಲೇ ಬದಲಿಸಲು ಹಾಗೂ ನಂತರ ನೀವು ಉಳಿಸಿದ ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ಪರಿಶೀಲಿಸಲು ನಾವು ಶಿಫಾರಸು ಮಾಡುತ್ತೇವೆ.</translation>
<translation id="6587893660316489419">ಎನ್ವಲಪ್ B5</translation>
@@ -2675,7 +2675,7 @@
<translation id="7610193165460212391">ಮೌಲ್ಯವು ವ್ಯಾಪ್ತಿಯಿಂದ <ph name="VALUE" /> ಹೊರಗಿದೆ.</translation>
<translation id="7613889955535752492">ಅವಧಿ ಮೀರುವ ಸಮಯ: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation>
<translation id="7614494068621678628"><ph name="MANAGE_PASSWORDS_FOCUSED_FRIENDLY_MATCH_TEXT" />, Chrome ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ವೀಕ್ಷಿಸಲು ಮತ್ತು ನಿರ್ವಹಿಸಲು Tab ಒತ್ತಿ, ನಂತರ Enter ಒತ್ತಿರಿ</translation>
-<translation id="7616645509853975347">ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನಿಮ್ಮ ಬ್ರೌಸರ್‌ನಲ್ಲಿ Chrome Enterprise ಕನೆಕ್ಟರ್‌ಗಳನ್ನು ಆನ್ ಮಾಡಿದ್ದಾರೆ. ನಿಮ್ಮ ಕೆಲವೊಂದು ಡೇಟಾಕ್ಕೆ ಈ ಕನೆಕ್ಟರ್‌ಗಳು ಪ್ರವೇಶ ಹೊಂದಿರುತ್ತವೆ.</translation>
+<translation id="7616645509853975347">ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನಿಮ್ಮ ಬ್ರೌಸರ್‌ನಲ್ಲಿ Chrome Enterprise ಕನೆಕ್ಟರ್‌ಗಳನ್ನು ಆನ್ ಮಾಡಿದ್ದಾರೆ. ನಿಮ್ಮ ಕೆಲವೊಂದು ಡೇಟಾಕ್ಕೆ ಈ ಕನೆಕ್ಟರ್‌ಗಳು ಆ್ಯಕ್ಸೆಸ್ ಹೊಂದಿರುತ್ತವೆ.</translation>
<translation id="7617825962482469577">ಎನ್ವಲಪ್ C7/C6</translation>
<translation id="7619838219691048931">ಕೊನೆಯ ಶೀಟ್</translation>
<translation id="7625242817712715120">ನಿರ್ವಾಹಕ ನೀತಿಯು ಈ ವಿಷಯವನ್ನು ಪ್ರಿಂಟ್ ಮಾಡುವುದನ್ನು ಶಿಫಾರಸು ಮಾಡುವುದಿಲ್ಲ</translation>
@@ -3141,7 +3141,7 @@
<translation id="8790007591277257123">&amp;ಅಳಿಸುವುದನ್ನು ಮತ್ತೆಮಾಡು</translation>
<translation id="8792621596287649091">ನಿಮ್ಮ <ph name="ORG_NAME" /> ಖಾತೆಗೆ ನೀವು ಪ್ರವೇಶವನ್ನು ಕಳೆದುಕೊಳ್ಳಬಹುದು ಅಥವಾ ಗುರುತು ಕಳ್ಳತನಕ್ಕೆ ಒಳಗಾಗಬಹುದು. ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್‌ ಅನ್ನು ಇದೀಗ ಬದಲಾಯಿಸುವಂತೆ Chromium ಶಿಫಾರಸು ಮಾಡುತ್ತದೆ.</translation>
<translation id="8792626944327216835">ಮೈಕ್ರೋಫೋನ್‌</translation>
-<translation id="8793655568873652685"><ph name="ENROLLMENT_DOMAIN" />, ನಿಮ್ಮ ಬ್ರೌಸರ್‌ನಲ್ಲಿ Chrome Enterprise ಕನೆಕ್ಟರ್‌ಗಳನ್ನು ಆನ್ ಮಾಡಿದೆ. ನಿಮ್ಮ ಕೆಲವೊಂದು ಡೇಟಾಕ್ಕೆ ಈ ಕನೆಕ್ಟರ್‌ಗಳು ಪ್ರವೇಶ ಹೊಂದಿರುತ್ತವೆ.</translation>
+<translation id="8793655568873652685"><ph name="ENROLLMENT_DOMAIN" />, ನಿಮ್ಮ ಬ್ರೌಸರ್‌ನಲ್ಲಿ Chrome Enterprise ಕನೆಕ್ಟರ್‌ಗಳನ್ನು ಆನ್ ಮಾಡಿದೆ. ನಿಮ್ಮ ಕೆಲವೊಂದು ಡೇಟಾಕ್ಕೆ ಈ ಕನೆಕ್ಟರ್‌ಗಳು ಆ್ಯಕ್ಸೆಸ್ ಹೊಂದಿರುತ್ತವೆ.</translation>
<translation id="8798099450830957504">ಡಿಫಾಲ್ಟ್</translation>
<translation id="8798739476508189189">ಬ್ರೌಸರ್ ಫ್ಲ್ಯಾಗ್‌ಗಳಿಗಾಗಿ ಹುಡುಕುತ್ತಿರುವಿರಾ? ಭೇಟಿ ನೀಡಿ</translation>
<translation id="8805819170075074995">ಪಟ್ಟಿ ನಮೂದು "<ph name="LANGUAGE_ID" />": ಈ ನಮೂದನ್ನು SpellcheckLanguage ಕಾರ್ಯನೀತಿಯಲ್ಲಿ ಸಹ ಸೇರಿಸಿರುವ ಕಾರಣ, ಇದನ್ನು ನಿರ್ಲಕ್ಷಿಸಲಾಗಿದೆ.</translation>
diff --git a/chromium/components/strings/components_strings_ko.xtb b/chromium/components/strings/components_strings_ko.xtb
index 35548f3403f..b9da4e5e886 100644
--- a/chromium/components/strings/components_strings_ko.xtb
+++ b/chromium/components/strings/components_strings_ko.xtb
@@ -276,7 +276,7 @@
<translation id="1572765991610098222"><ph name="WIDTH" />x<ph name="HEIGHT" />인치</translation>
<translation id="1581080074034554886">CVC</translation>
<translation id="1583429793053364125">이 웹페이지를 표시하는 도중 문제가 발생했습니다.</translation>
-<translation id="1584492003828271317">인터넷을 탐색할 때 이 설정, 사이트 추천 광고, 나의 쿠키 설정, 표시되는 사이트에서 광고를 개인 최적화하는지에 따라 나에게 표시되는 광고의 개인 최적화 여부가 달라집니다.</translation>
+<translation id="1584492003828271317">해당 설정, 사이트 추천 광고, 나의 쿠키 설정, 그리고 표시되는 사이트에서 개인 맞춤 광고를 제공하는지에 따라 인터넷을 탐색할 때 개인 맞춤 광고가 표시되는지 여부가 달라집니다.</translation>
<translation id="1586541204584340881">내가 설치한 확장 프로그램</translation>
<translation id="1588438908519853928">일반</translation>
<translation id="1592005682883173041">로컬 데이터 액세스</translation>
@@ -348,7 +348,7 @@
<translation id="1736420071277903564">컴퓨터</translation>
<translation id="1740951997222943430">올바른 만료 월을 입력하세요.</translation>
<translation id="1741613555002899862">DnsOverHttpsMode가 <ph name="SECURE_DNS_MODE_SECURE" />일 때 반드시 지정되어야 하며 유효한 문자열이어야 합니다.</translation>
-<translation id="1745399796851657441"><ph name="BEGIN_BOLD" />Chrome의 데이터 사용 방식:<ph name="END_BOLD" />Chrome에서 내가 인터넷을 사용하는 동안 관심 주제를 파악합니다. 주제 라벨은 사전 정의되어 있으며 예술 및 엔터테인먼트, 쇼핑, 스포츠 등을 포함합니다. 나중에 사이트를 방문하면 사이트에서 광고 개인 최적화를 위해 내 관심 주제 몇 가지를 Chrome에 요청할 수 있습니다(방문 기록 제외).</translation>
+<translation id="1745399796851657441"><ph name="BEGIN_BOLD" />Chrome의 데이터 사용 방식:<ph name="END_BOLD" /> Chrome에서 내가 인터넷을 사용하는 동안 관심 주제를 파악합니다. 주제 라벨은 사전 정의되어 있으며 예술 및 엔터테인먼트, 쇼핑, 스포츠 등을 포함합니다. 나중에 사이트를 방문하면 사이트에서 광고 개인 최적화를 위해 내 관심 주제 몇 가지를 Chrome에 요청할 수 있습니다(방문 기록 제외).</translation>
<translation id="1745880797583122200">관리 대상 브라우저입니다</translation>
<translation id="1746113442205726301">이미지 Y 시프트</translation>
<translation id="1746531169546376413">0도</translation>
@@ -2102,7 +2102,7 @@
<translation id="61877208875190028">여성 의류</translation>
<translation id="6194209731893739467">추적 중인 모든 제품을 여기에서 확인</translation>
<translation id="6195371403461054755">지질학</translation>
-<translation id="6196640612572343990">타사 쿠키 차단</translation>
+<translation id="6196640612572343990">서드 파티 쿠키 차단</translation>
<translation id="6197648101609735209">89x89mm</translation>
<translation id="6203231073485539293">인터넷 연결을 확인하세요.</translation>
<translation id="6205314730813004066">광고 개인 정보 보호</translation>
@@ -2966,7 +2966,7 @@
<translation id="829335040383910391">소리</translation>
<translation id="8294431847097064396">출처</translation>
<translation id="8296205692406981542">국립 및 도립 공원</translation>
-<translation id="8297545700510100061">예를 들어 로그인하거나 광고를 맞춤설정하기 위해 사용자 정보를 저장하는 데 쿠키와 기타 사이트 데이터가 사용됩니다. 모든 사이트의 쿠키를 관리하려면 <ph name="SETTINGS" />을(를) 확인하세요.</translation>
+<translation id="8297545700510100061">예를 들어 로그인하거나 광고를 맞춤설정하기 위해 사용자 정보를 저장하는 데 쿠키와 기타 사이트 데이터가 사용됩니다. 모든 사이트의 쿠키를 관리하려면 <ph name="SETTINGS" /> 페이지를 확인하세요.</translation>
<translation id="8298115750975731693">사용 중인 Wi-Fi(<ph name="WIFI_NAME" />)에서 <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /> 방문을 요청할 수 있습니다.</translation>
<translation id="8299269255470343364">일본어</translation>
<translation id="8303854710873047864">‘<ph name="SECTION" />’ 섹션 표시됨</translation>
@@ -3072,7 +3072,7 @@
<translation id="8589998999637048520">고품질 순</translation>
<translation id="8600271352425265729">이번만 허용</translation>
<translation id="860043288473659153">카드 명의자 이름</translation>
-<translation id="8601027005147870853"><ph name="BEGIN_BOLD" />사용되는 데이터:<ph name="END_BOLD" /> 이 기기에서 Chrome을 사용하여 방문한 사이트에서 이루어진 내 활동입니다.</translation>
+<translation id="8601027005147870853"><ph name="BEGIN_BOLD" />사용되는 데이터:<ph name="END_BOLD" /> 이 기기에서 Chrome을 사용하여 방문한 사이트에서 이루어진 내 활동</translation>
<translation id="8606726445206553943">MIDI 기기를 사용합니다.</translation>
<translation id="8606988009912891950">광고 주제는 사이트에서 내 방문 기록과 신원 정보를 보호하면서 관련성 있는 광고를 표시하는 데 도움이 됩니다. Chrome에서는 내 최근 방문 기록을 기반으로 관심 주제를 파악할 수 있습니다. 나중에 사이트를 방문하면 사이트에서 광고 개인 최적화를 위해 관련 주제를 Chrome에 요청할 수 있습니다.</translation>
<translation id="8617269623452051934">기기 사용 여부</translation>
diff --git a/chromium/components/strings/components_strings_ky.xtb b/chromium/components/strings/components_strings_ky.xtb
index 679a5238f7f..da3fe058c12 100644
--- a/chromium/components/strings/components_strings_ky.xtb
+++ b/chromium/components/strings/components_strings_ky.xtb
@@ -311,7 +311,7 @@
<translation id="1656489000284462475">Алып кетүү</translation>
<translation id="1658918301167915956">bluetooth түзмөктөрү</translation>
<translation id="1662550410081243962">Төлөм ыкмаларын сактоо жана автоматтык түрдө толтуруу</translation>
-<translation id="1663943134801823270">Карточкалар жана даректер Chrome’дон алынган. Аларды <ph name="BEGIN_LINK" />Жөндөөлөрдөн<ph name="END_LINK" /> башкарсаңыз болот.</translation>
+<translation id="1663943134801823270">Карточкалар жана даректер Chrome’дон алынган. Аларды <ph name="BEGIN_LINK" />Параметрлерден<ph name="END_LINK" /> башкарсаңыз болот.</translation>
<translation id="1671391448414634642">Мындан кийин <ph name="SOURCE_LANGUAGE" /> тилиндеги барактар <ph name="TARGET_LANGUAGE" /> тилине которулат.</translation>
<translation id="1674504678466460478"><ph name="SOURCE_LANGUAGE" /> тилинен <ph name="TARGET_LANGUAGE" /> тилине</translation>
<translation id="1682696192498422849">Биринчи туурасы боюнча</translation>
@@ -344,7 +344,7 @@
<translation id="1732445923934584865">Анын ордуна өзүнөн суроо</translation>
<translation id="1733064249834771892">ариптер</translation>
<translation id="1734864079702812349">Amex</translation>
-<translation id="1734878702283171397">Тутум администраторуна кайрылып көрүңүз.</translation>
+<translation id="1734878702283171397">Система администраторуна кайрылып көрүңүз.</translation>
<translation id="1736420071277903564">Компьютер</translation>
<translation id="1740951997222943430">Мөөнөтү аяктоочу айды туура киргизиңиз</translation>
<translation id="1741613555002899862">DnsOverHttpsMode <ph name="SECURE_DNS_MODE_SECURE" /> деп жана мааниси туура көрсөтүлүшү керек.</translation>
@@ -404,13 +404,13 @@
<translation id="1884843295353628214">Джаз</translation>
<translation id="1890171020361705182">Динозавр оюну. Пикселденген динозавр ээн ландшафтты аралап, кактус менен птеродактилдерден качат. Аудио сигналды укканда тоскоолдуктардан секирип өтүңүз.</translation>
<translation id="1898423065542865115">Чыпкалоо</translation>
-<translation id="1901443836186977402">{1,plural, =1{Бул сервер <ph name="DOMAIN" /> экендигин далилдей алган жок; анын коопсуздук тастыктамасынын мөөнөтү бүтүп калды. Мындай көйгөй сервердин туура эмес конфигурацияланышы менен шартталышы мүмкүн же кимдир-бирөө ортодон дайын-даректериңизди кармап калганга аракет кылып жатат. Учурда компьютериңиздин сааты <ph name="CURRENT_DATE" /> болуп коюлган. Туура элеби? Эгер туура эмес болсо, тутумуңуздун саатын тууралап, бул баракты жаңылаңыз.}other{Бул сервер <ph name="DOMAIN" /> экендигин далилдей алган жок; анын коопсуздук тастыктамасынын мөөнөтү # күн мурун аяктаган. Мындай көйгөй туура эмес конфигурация менен шартталышы мүмкүн же туташууңузга чабуулчу кийлигишип жатат. Учурда компьютериңиздеги саат <ph name="CURRENT_DATE" /> болду. Туурабы? Эгер туура эмес болсо, тутумуңуздун саатын тууралап, андан соң бул бетти жаңылаңыз.}}</translation>
+<translation id="1901443836186977402">{1,plural, =1{Бул сервер <ph name="DOMAIN" /> экендигин далилдей алган жок; анын коопсуздук тастыктамасынын мөөнөтү бүтүп калды. Мындай көйгөй сервердин туура эмес конфигурацияланышы менен шартталышы мүмкүн же кимдир-бирөө ортодон дайын-даректериңизди кармап калганга аракет кылып жатат. Учурда компьютериңиздин сааты <ph name="CURRENT_DATE" /> болуп коюлган. Туура элеби? Эгер туура эмес болсо, системаңыздын саатын тууралап, бул баракты жаңылаңыз.}other{Бул сервер <ph name="DOMAIN" /> экендигин далилдей алган жок; анын коопсуздук тастыктамасынын мөөнөтү # күн мурун аяктаган. Мындай көйгөй туура эмес конфигурация менен шартталышы мүмкүн же туташууңузга чабуулчу кийлигишип жатат. Учурда компьютериңиздеги саат <ph name="CURRENT_DATE" /> болду. Туурабы? Эгер туура эмес болсо, системаңыздын саатын тууралап, андан соң бул бетти жаңылаңыз.}}</translation>
<translation id="1902576642799138955">Жарактуулук мезгили</translation>
<translation id="1906155288650175567">Эскертме түзүү баскычы. Google Keep'те эскертмени тез түзүү үчүн Enter баскычын басыңыз</translation>
<translation id="1908217026282415406">Камераны колдонуу жана жылдыруу</translation>
<translation id="191374271204266022">JSON форматында көчүрүү</translation>
<translation id="1914326953223720820">Файлдарды архивден чыгаруу кызматы</translation>
-<translation id="1916770123977586577">Бул сайттагы жаңырган жөндөөлөрдү колдонуп баштоо үчүн баракты жаңыртыңыз</translation>
+<translation id="1916770123977586577">Бул сайттагы жаңырган параметрлерди колдонуп баштоо үчүн баракты жаңыртыңыз</translation>
<translation id="1919367280705858090">Белгилүү бир каталар боюнча жардам алуу</translation>
<translation id="1919526244108283799">400 x 600 мм.</translation>
<translation id="192020519938775529">{COUNT,plural, =0{Бирөө да жок}=1{1 сайт}other{# сайт}}</translation>
@@ -984,7 +984,7 @@
<translation id="3414952576877147120">Өлчөм:</translation>
<translation id="3422248202833853650">Эстутумду бошотуу үчүн башка программаларды жаап көрүңүз.</translation>
<translation id="3422472998109090673"><ph name="HOST_NAME" /> сайты учурда жеткиликсиз.</translation>
-<translation id="3423742043356668186">Тутум белгиленди</translation>
+<translation id="3423742043356668186">Система белгиленди</translation>
<translation id="3427092606871434483">Уруксат берүү (демейки)</translation>
<translation id="3427342743765426898">Түзөтүүнү &amp;кайталоо</translation>
<translation id="342781501876943858">Сырсөзүңүздү башка сайттарда колдонгон болсоңуз, Chromium аны өзгөртүүнү сунуштайт.</translation>
@@ -1424,11 +1424,11 @@
<translation id="4494323206460475851">Параметрлерден жарнама темаларын көрүп, сайттар менен бөлүшкүңүз келбегендерин жашыра аласыз. Ошондой эле, Chrome 4 апта мурун пайда болгон жарнама темаларын автоматтык түрдө өчүрүп турат.</translation>
<translation id="4500587658229086076">кооптуу мазмун</translation>
<translation id="4506176782989081258">Жарактуулугун текшерүү катасы: <ph name="VALIDATION_ERROR" /></translation>
-<translation id="4506599922270137252">Тутум администраторуна кайрылып көрүңүз</translation>
+<translation id="4506599922270137252">Система администраторуна кайрылып көрүңүз</translation>
<translation id="450710068430902550">Администратор менен бөлүшүү</translation>
<translation id="4509074745930862522"><ph name="TRANSLATE_FOCUSED_FRIENDLY_MATCH_TEXT" />. Бул баракты Google Котормочу менен которуу үчүн, Tab, андан соң Enter баскычын басыңыз</translation>
<translation id="4514308731478712184">Саякаттарды өчүрүү</translation>
-<translation id="4515275063822566619">Карточкалар жана даректер Chrome’дон жана Google аккаунтуңуздан (<ph name="ACCOUNT_EMAIL" />) алынган. Аларды <ph name="BEGIN_LINK" />Жөндөөлөрдөн<ph name="END_LINK" /> башкарсаңыз болот.</translation>
+<translation id="4515275063822566619">Карточкалар жана даректер Chrome’дон жана Google аккаунтуңуздан (<ph name="ACCOUNT_EMAIL" />) алынган. Аларды <ph name="BEGIN_LINK" />Параметрлерден<ph name="END_LINK" /> башкарсаңыз болот.</translation>
<translation id="4520048001084013693">Бул файлды жүктөп алуу аракети администраторуңуздун саясаты менен бөгөттөлгөн</translation>
<translation id="4521157617044179198"><ph name="WIDTH" /> × <ph name="HEIGHT" /> мм (<ph name="ORIENTATION" />)</translation>
<translation id="4521280267704259211">Конверт Монарх</translation>
@@ -1826,7 +1826,7 @@
<translation id="5490432419156082418">Даректер жана башкалар</translation>
<translation id="5492298309214877701">Ишкана, уюм же университеттин интранетиндеги бул сайттын URL дареги тышкы вебсайттыкына окшош.
<ph name="LINE_BREAK" />
- Тутум администраторуңузга кайрылып көрүңүз.</translation>
+ Система администраторуңузга кайрылып көрүңүз.</translation>
<translation id="549333378215107354">Өлчөмү: 3</translation>
<translation id="5503356662318814623">Билдирүү жөнөтүү</translation>
<translation id="5509762909502811065">B0</translation>
@@ -1868,7 +1868,7 @@
<translation id="5572851009514199876">Chrome'ду иштетип, аккаунтка кириңиз. Chrome бул сайтка кирүүгө уруксатыңыз бар-жогун текшериши керек.</translation>
<translation id="557886905979275351">Устаралар</translation>
<translation id="5580958916614886209">Мөөнөтү аяктоочу айды текшерип, кайталап көрүңүз</translation>
-<translation id="558420943003240152">Сырсөздөрдү жана мүмкүндүк алуу ачкычтарын башкаруу…</translation>
+<translation id="558420943003240152">Сырсөздөрдү жана киргизүүчү ачкычтарды башкаруу…</translation>
<translation id="5586446728396275693">Сакталган даректер жок</translation>
<translation id="5586831831248371458">Бул жерден издөө <ph name="KEYWORD_SUFFIX" /></translation>
<translation id="5587987780934666589">Платформаны колдонуучу</translation>
@@ -1880,7 +1880,7 @@
<translation id="5605670050355397069">Ledger</translation>
<translation id="5606444889871204172"><ph name="BEGIN_BOLD" />Маалыматыңызды кантип тескей аласыз:<ph name="END_BOLD" /> Chrome 4 апта мурун пайда болгон сайттарды автоматтык түрдө жок кылып турат. Сиз кайрадан баш баккан сайт тизмеде кайра пайда болушу мүмкүн. Ошондой эле, каалаган убакта Chrome параметрлеринен сайттын жарнамаларды сунуштоо мүмкүнчүлүгүн бөгөттөп, сайт сунуштаган жарнамаларды өчүрүп койсоңуз болот.</translation>
<translation id="5610142619324316209">Туташууну текшерип көрүңүз</translation>
-<translation id="5610807607761827392">Карточкаларды жана даректерди <ph name="BEGIN_LINK" />Жөндөөлөрдөн<ph name="END_LINK" /> башкарсаңыз болот.</translation>
+<translation id="5610807607761827392">Карточкаларды жана даректерди <ph name="BEGIN_LINK" />Параметрлерден<ph name="END_LINK" /> башкарсаңыз болот.</translation>
<translation id="561165882404867731">Бул баракты Google Котормочуда которуңуз</translation>
<translation id="5612720917913232150"><ph name="URL" /> компьютериңиздин жайгашуусун пайдаланганы жатат</translation>
<translation id="561669346091975195">Илимий-фантастикалык жана фантастикалык телешоулор</translation>
@@ -2287,7 +2287,7 @@
<translation id="6688743156324860098">Жаңыртуу…</translation>
<translation id="6688775486821967877">Виртуалдык карта учурда жеткиликсиз, кийинчерээк кайра аракет кылыңыз</translation>
<translation id="6689249931105087298">Кара чекит кысуусуна тийиштүү</translation>
-<translation id="6689271823431384964">Аккаунтуңузга кирип турганыңыздан улам, Chrome карталарыңызды Google аккаунтуңузга сактап коюуну сунуштап жатат. Бул параметрди жөндөөлөргө өтүп, өзгөртүп койсоңуз болот. Картанын ээси – аккаунттун ээси болуп эсептелет.</translation>
+<translation id="6689271823431384964">Аккаунтуңузга кирип турганыңыздан улам, Chrome карталарыңызды Google аккаунтуңузга сактап коюуну сунуштап жатат. Бул параметрди параметрлерге өтүп, өзгөртүп койсоңуз болот. Картанын ээси – аккаунттун ээси болуп эсептелет.</translation>
<translation id="6694681292321232194"><ph name="FIND_MY_PHONE_FOCUSED_FRIENDLY_MATCH_TEXT" />, Google аккаунтуңуз менен түзмөгүңүздү табуу үчүн Tab, андан кийин Enter баскычын басыңыз</translation>
<translation id="6696588630955820014">Ушул өтмөктү бөлүшүү баскычы. Бул өтмөктү шилтеме аркылуу бөлүшүү, QR кодун түзүү, тышкы экранга чыгаруу жана башка аракеттерди аткаруу үчүн Enter баскычын басыңыз</translation>
<translation id="6698381487523150993">Түзүлгөн:</translation>
@@ -2905,7 +2905,7 @@
<translation id="8150722005171944719"><ph name="URL" /> дарегиндеги файл окулбайт. Ал чыгарылып салынган, жылдырылган же файл уруксаттарынан улам аны окуу мүмкүн эмес.</translation>
<translation id="8153865548451212769">{0,plural, =1{Администратордун саясаты бул файлды төмөнкүгө жүктөп алууну сунуштабайт: <ph name="DESTINATION_NAME" />}other{Администратордун саясаты бул файлдарды төмөнкүгө жүктөп алууну сунуштабайт: <ph name="DESTINATION_NAME" />}}</translation>
<translation id="8163866351304776260">Сол жагын төрт жолу тешүү</translation>
-<translation id="8175796834047840627">Аккаунтуңузга кирип турганыңыздан улам, Chrome карталарыңызды Google аккаунтуңузга сактап коюуну сунуштап жатат. Бул параметрди жөндөөлөргө өтүп, өзгөртүп койсоңуз болот.</translation>
+<translation id="8175796834047840627">Аккаунтуңузга кирип турганыңыздан улам, Chrome карталарыңызды Google аккаунтуңузга сактап коюуну сунуштап жатат. Бул параметрди параметрлерге өтүп, өзгөртүп койсоңуз болот.</translation>
<translation id="8176440868214972690">Бул түзмөктүн администратору жөндөөлөр же саясаттар сыяктуу айрым маалыматты төмөндөгү вебсайттарга жөнөттү.</translation>
<translation id="8184538546369750125">Дүйнөлүк демейки жөндөөнү колдонуу (Уруксат берүү)</translation>
<translation id="8186706823560132848">Программа</translation>
@@ -3336,7 +3336,7 @@
<translation id="961663415146723894">Төмөн жагын байлоо</translation>
<translation id="962484866189421427">Бул мазмун башка колдонмолорго окшош жасалма колдонмолорду орнотуп коюшу же сизге көз салуу үчүн дайындарды чогултуп алышы мүмкүн. <ph name="BEGIN_LINK" />Баары бир көрүнсүн<ph name="END_LINK" /></translation>
<translation id="963837307749850257">Бардык колдонуучулар</translation>
-<translation id="964050462028070434">Сырсөздөрдү жана мүмкүндүк алуу ачкычтарын тескөө…</translation>
+<translation id="964050462028070434">Сырсөздөрдү жана киргизүүчү ачкычтарды тескөө…</translation>
<translation id="96680173638229310">Машиналар жана унаалар</translation>
<translation id="969892804517981540">Расмий курама</translation>
<translation id="973773823069644502">Жеткирүү дарегин кошуу</translation>
diff --git a/chromium/components/strings/components_strings_mk.xtb b/chromium/components/strings/components_strings_mk.xtb
index 084ec76e954..21ccb3d7907 100644
--- a/chromium/components/strings/components_strings_mk.xtb
+++ b/chromium/components/strings/components_strings_mk.xtb
@@ -92,7 +92,7 @@
<translation id="1202892408424955784">Следени производи</translation>
<translation id="1204602502194308272">Риби и аквариуми</translation>
<translation id="1206967143813997005">Лош почетен потпис</translation>
-<translation id="1209206284964581585">Сокриј засега</translation>
+<translation id="1209206284964581585">Скриј засега</translation>
<translation id="1209221128712833642">Копче за создавање формулар, притиснете го копчето Enter за да набрзина создадете нов формулар во Google Forms</translation>
<translation id="121201262018556460">Се обидовте да стигнете до <ph name="DOMAIN" />, но серверот прикажа сертификат што содржи слаб клуч. Напаѓач може го расипал приватниот клуч, па серверот може не е серверот што го очекувавте (можеби комуницирате со напаѓач).</translation>
<translation id="1219129156119358924">Безбедност на системот</translation>
@@ -702,7 +702,7 @@
<translation id="2672201172023654893">Прелистувачот не е управуван.</translation>
<translation id="2673968385134502798">Игри</translation>
<translation id="2674170444375937751">Дали сигурно сакате да ги избришете страниците од историјата?</translation>
-<translation id="2674804415323431591">Сокриј ги предлозите</translation>
+<translation id="2674804415323431591">Скриј ги предлозите</translation>
<translation id="2677696497921480781">Родендени и имендени</translation>
<translation id="2677748264148917807">Напушти</translation>
<translation id="2687555958734450033">Најдобро вклопување</translation>
@@ -1001,7 +1001,7 @@
<translation id="3454555520521576458">Со променлива големина</translation>
<translation id="3461266716147554923"><ph name="URL" /> сака да гледа текст и слики копирани на привремената меморија</translation>
<translation id="3461824795358126837">Нагласувач</translation>
-<translation id="3462200631372590220">Сокриј напредни</translation>
+<translation id="3462200631372590220">Скриј напредни</translation>
<translation id="346601286295919445">Хемија</translation>
<translation id="3467763166455606212">Името на сопственикот на картичката е задолжително</translation>
<translation id="3468054117417088249"><ph name="TAB_SWITCH_SUFFIX" />, отворена во моментов, притиснете Tab, потоа Enter за да се префрлите на отворената картичка</translation>
@@ -1050,7 +1050,7 @@
<translation id="3582930987043644930">Додај име</translation>
<translation id="3583757800736429874">&amp;Повтори преместување</translation>
<translation id="3584299510153766161">Две дупки долу</translation>
-<translation id="3586931643579894722">Сокриј детали</translation>
+<translation id="3586931643579894722">Скриј детали</translation>
<translation id="3587738293690942763">Средна</translation>
<translation id="3595699422137460894">{NUM_DAYS,plural, =0{Може да ја рестирате групата во секое време. Потребен е околу еден ден за да се придружите на нова група.}=1{Може да ја рестирате групата во секое време. Потребен е околу еден ден за да се придружите на нова група.}one{Може да ја рестирате групата во секое време. Потребен е околу {NUM_DAYS} ден за да се придружите на нова група.}other{Може да ја рестирате групата во секое време. Потребни се околу {NUM_DAYS} дена за да се придружите на нова група.}}</translation>
<translation id="3600246354004376029"><ph name="TITLE" />, <ph name="DOMAIN" />, <ph name="TIME" /></translation>
@@ -2116,7 +2116,7 @@
<translation id="6234122620015464377">Кратење по секој документ</translation>
<translation id="6236290670123303279">Управувајте со поставките</translation>
<translation id="6240447795304464094">Лого на Google Pay</translation>
-<translation id="6241121617266208201">Сокриј ги предлозите</translation>
+<translation id="6241121617266208201">Скриј ги предлозите</translation>
<translation id="624499991300733384">Услуга на составувач на материјал за печатење</translation>
<translation id="6252613631861574218"><ph name="MANAGE_CHROME_DOWNLOADS_FOCUSED_FRIENDLY_MATCH_TEXT" />, притиснете го копчето Tab, а потоа Enter за да управувате со датотеките што сте ги презеле во Chrome</translation>
<translation id="6254436959401408446">Нема доволно меморија за да се отвори страницава</translation>
@@ -2447,7 +2447,7 @@
<translation id="7101893872976785596">Хорор филмови</translation>
<translation id="7102079138917191645">Градежништво и одржување</translation>
<translation id="7102554173784142865">Пушти ја играта „Диносаурус на Chrome“</translation>
-<translation id="7108338896283013870">Сокриј</translation>
+<translation id="7108338896283013870">Скриј</translation>
<translation id="7108634116785509031"><ph name="HOST" /> сака да ја користи вашата камера</translation>
<translation id="7108819624672055576">Дозволено од екстензија</translation>
<translation id="7111012039238467737">(Важечки)</translation>
@@ -2532,7 +2532,7 @@
<translation id="7311244614769792472">Не се најдени резултати</translation>
<translation id="7319430975418800333">A3</translation>
<translation id="7320336641823683070">Помош за поврзување</translation>
-<translation id="7323804146520582233">Сокриј го делот „<ph name="SECTION" />“</translation>
+<translation id="7323804146520582233">Скриј го делот „<ph name="SECTION" />“</translation>
<translation id="733354035281974745">Отфрлање на локалната сметка на уредот</translation>
<translation id="7334320624316649418">&amp;Повтори преуредување</translation>
<translation id="7335157162773372339">Може да прашува за да ја користи камерата</translation>
@@ -2699,7 +2699,7 @@
<translation id="7648992873808071793">Складирај датотеки на уредов</translation>
<translation id="7653957176542370971">Листот на ракувачот со плаќања е затворен</translation>
<translation id="7654909834015434372">Кога ќе ги изменувате прибелешките, документов ќе се врати на својата оригинална ротација</translation>
-<translation id="765676359832457558">Сокриј напредни поставки...</translation>
+<translation id="765676359832457558">Скриј напредни поставки...</translation>
<translation id="7658239707568436148">Откажи</translation>
<translation id="7659327900411729175">Плик Kaku 8</translation>
<translation id="766014026101194726">{0,plural, =1{Прикачувањето на датотекава е блокирано со правило на администраторот}one{Прикачувањето на # датотека е блокирано со правило на администраторот}other{Прикачувањето на # датотеки е блокирано со правило на администраторот}}</translation>
@@ -3037,7 +3037,7 @@
<translation id="8483780878231876732">За да ги користите картичките од вашата сметка на Google, најавете се на Chrome</translation>
<translation id="8488350697529856933">Се однесува на</translation>
<translation id="8490137692873530638">Фиока за складирање 10</translation>
-<translation id="8493948351860045254">Ослободи простор</translation>
+<translation id="8493948351860045254">Ослободете простор</translation>
<translation id="8498891568109133222">На <ph name="HOST_NAME" /> му требаше премногу време да одговори.</translation>
<translation id="8503559462189395349">Лозинки на Chrome</translation>
<translation id="8503813439785031346">Корисничко име</translation>
diff --git a/chromium/components/strings/components_strings_ml.xtb b/chromium/components/strings/components_strings_ml.xtb
index ffaa07a7434..c092d1724ed 100644
--- a/chromium/components/strings/components_strings_ml.xtb
+++ b/chromium/components/strings/components_strings_ml.xtb
@@ -151,7 +151,7 @@
<translation id="1322083935398004629">രാഷ്‌ട്രീയം</translation>
<translation id="132301787627749051">ക്ലിപ്പ്ബോർഡ് ചിത്രത്തിനായി തിരയുക</translation>
<translation id="1323433172918577554">കൂടുതൽ കാണിക്കുക</translation>
-<translation id="132390688737681464">വിലാസങ്ങൾ സംരക്ഷിച്ച് സ്വമേധയാ പൂരിപ്പിക്കുക</translation>
+<translation id="132390688737681464">വിലാസങ്ങൾ സംരക്ഷിച്ച് സ്വയമേവ പൂരിപ്പിക്കുക</translation>
<translation id="1330449323196174374">ലെഫ്റ്റ് ഗേറ്റ് മടക്ക്</translation>
<translation id="1333745675627230582">Chrome ദിനോസർ ഗെയിം കളിക്കുക</translation>
<translation id="1333989956347591814">നിങ്ങളുടെ ആക്‌റ്റിവിറ്റി ഇനിപ്പറയുന്നവയ്‌ക്ക് <ph name="BEGIN_EMPHASIS" />തുടർന്നും ദൃശ്യമായേക്കും<ph name="END_EMPHASIS" />:
@@ -310,7 +310,7 @@
<translation id="1656024727720460136">വായന എളുപ്പമാക്കുന്നതിന് Chrome ഈ പേജ് ലളിതമാക്കി. സുരക്ഷിത കണക്ഷനിലൂടെ Chrome ഒറിജിനൽ പേജ് വീണ്ടെടുത്തു.</translation>
<translation id="1656489000284462475">പിക്കപ്പ്</translation>
<translation id="1658918301167915956">Bluetooth ഉപകരണങ്ങൾ</translation>
-<translation id="1662550410081243962">പേയ്‌മെന്റ് രീതികൾ സംരക്ഷിച്ച് സ്വമേധയാ പൂരിപ്പിക്കുക</translation>
+<translation id="1662550410081243962">പേയ്‌മെന്റ് രീതികൾ സംരക്ഷിച്ച് സ്വയമേവ പൂരിപ്പിക്കുക</translation>
<translation id="1663943134801823270">കാർഡുകളും വിലാസങ്ങളും Chrome-ൽ നിന്നുള്ളതാണ്. നിങ്ങൾക്ക് അവ <ph name="BEGIN_LINK" />ക്രമീകരണത്തിൽ<ph name="END_LINK" /> മാനേജ് ചെയ്യാം.</translation>
<translation id="1671391448414634642">ഇനിമുതൽ <ph name="SOURCE_LANGUAGE" /> ഭാഷയിലുള്ള പേജുകൾ <ph name="TARGET_LANGUAGE" /> ഭാഷയിലേക്ക് വിവർത്തനം ചെയ്യപ്പെടും.</translation>
<translation id="1674504678466460478"><ph name="SOURCE_LANGUAGE" /> എന്നതിൽ നിന്ന് <ph name="TARGET_LANGUAGE" /> എന്നതിലേക്ക്</translation>
@@ -556,7 +556,7 @@
<translation id="2276057643614339130">പ്രിന്റ് ബേസ്</translation>
<translation id="2277103315734023688">മുന്നോട്ട് നീക്കുക</translation>
<translation id="2277753418458118549">കണക്ഷന്റെ വിശദാംശങ്ങൾ കാണിക്കുക</translation>
-<translation id="2283340219607151381">വിലാസങ്ങൾ സംരക്ഷിച്ച് സ്വമേധയാ പൂരിപ്പിക്കുക</translation>
+<translation id="2283340219607151381">വിലാസങ്ങൾ സംരക്ഷിച്ച് സ്വയമേവ പൂരിപ്പിക്കുക</translation>
<translation id="2283447177162560884">'<ph name="PAGE_TITLE" />' ഇല്ലാതാക്കി</translation>
<translation id="2286383991450886080">34 x 44 ഇഞ്ച്</translation>
<translation id="2288422996159078444">നിങ്ങൾ ടൈപ്പ് ചെയ്യുന്നവയും കാണുന്ന പേജുകളും വെബിലെ മറ്റ് എല്ലാ ആക്റ്റിവിറ്റികളും നിരീക്ഷിക്കപ്പെടുന്നുണ്ട്. നിങ്ങളുടെ അറിവില്ലാതെ സൈറ്റുകളിലെ ഉള്ളടക്കം മാറുകയും ചെയ്തേക്കാം.</translation>
@@ -1291,7 +1291,7 @@
<translation id="4203769790323223880">ക്യാമറ ആക്സസ് അനുവദിച്ചില്ല</translation>
<translation id="4203896806696719780"><ph name="BEGIN_LINK" />ഫയർവാളും ആന്റിവൈറസ് കോൺഫിഗറേഷനുകളും പരിശോധിക്കുന്നു<ph name="END_LINK" /></translation>
<translation id="4209092469652827314">വലുത്</translation>
-<translation id="4210602799576081649">പരിശോധനാ കോഡ് കാലഹരണപ്പെട്ടു, പുതിയൊരു കോഡ് അഭ്യർത്ഥിക്കുക</translation>
+<translation id="4210602799576081649">പരിശോധിച്ചുറപ്പിക്കൽ കോഡ് കാലഹരണപ്പെട്ടു, പുതിയൊരു കോഡ് അഭ്യർത്ഥിക്കുക</translation>
<translation id="421066178035138955">വെർച്വൽ റിയാലിറ്റി ഉപകരണങ്ങളും ഡാറ്റയും ഉപയോഗിക്കുക</translation>
<translation id="4213305257324635756">ആനിമേറ്റ് ചെയ്ത സിനിമകൾ</translation>
<translation id="4213500579045346575">ബോഡി ബിൽഡിംഗ്</translation>
@@ -1580,7 +1580,7 @@
<translation id="4876305945144899064">ഉപയോക്തൃനാമമില്ല</translation>
<translation id="4877083676943085827">{COUNT,plural, =0{ഒന്നുമില്ല}=1{<ph name="EXAMPLE_DOMAIN_1" />}=2{<ph name="EXAMPLE_DOMAIN_1" />, <ph name="EXAMPLE_DOMAIN_2" />}other{<ph name="EXAMPLE_DOMAIN_1" />, <ph name="EXAMPLE_DOMAIN_2" />, <ph name="AND_MORE" />}}</translation>
<translation id="4877422487531841831"><ph name="TEXT" /> തിരയുക</translation>
-<translation id="4879491255372875719">സ്വമേധയാ (ഡിഫോൾട്ട്)</translation>
+<translation id="4879491255372875719">സ്വയമേവ (ഡിഫോൾട്ട്)</translation>
<translation id="4880827082731008257">തിരയൽ ചരിത്രം</translation>
<translation id="4881695831933465202">തുറക്കുക</translation>
<translation id="4881808915112408168">24 x 31.5 ഇഞ്ച്</translation>
@@ -2574,7 +2574,7 @@
<translation id="7403392780200267761">ലിങ്ക് പങ്കിട്ടും QR കോഡ് സൃഷ്ടിച്ചും കാസ്റ്റ് ചെയ്തും മറ്റും ഈ ടാബ് പങ്കിടുക</translation>
<translation id="7403591733719184120">നിങ്ങളുടെ <ph name="DEVICE_NAME" /> മാനേജ് ചെയ്യപ്പെട്ടിരിക്കുന്നു</translation>
<translation id="7407424307057130981">&lt;p&gt;നിങ്ങളുടെ Windows കമ്പ്യൂട്ടറിൽ Superfish സോഫ്റ്റ്‌വെയർ ഉണ്ടെങ്കിൽ, നിങ്ങൾ ഈ പിശക് കാണും.&lt;/p&gt;
- &lt;p&gt;നിങ്ങൾക്ക് വെബിലേക്ക് കണക്‌റ്റ് ചെയ്യാൻ, സോഫ്‌റ്റ്‌വെയർ താൽക്കാലികമായി പ്രവർത്തനരഹിതമാക്കാൻ ഈ ഘട്ടങ്ങൾ പിന്തുടരുക. നിങ്ങൾക്ക് അഡ്‌മിനിസ്ട്രേറ്ററുടെ സവിശേഷാധികാരങ്ങൾ ആവശ്യമായിവരും.&lt;/p&gt;
+ &lt;p&gt;നിങ്ങൾക്ക് വെബിലേക്ക് കണക്‌റ്റ് ചെയ്യാൻ, സോഫ്‌റ്റ്‌വെയർ താൽക്കാലികമായി പ്രവർത്തനരഹിതമാക്കാൻ ഈ ഘട്ടങ്ങൾ ഫോളോ ചെയ്യുക. നിങ്ങൾക്ക് അഡ്‌മിനിസ്ട്രേറ്ററുടെ സവിശേഷാധികാരങ്ങൾ ആവശ്യമായിവരും.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;ആരംഭിക്കാൻ&lt;/strong&gt; ക്ലിക്ക് ചെയ്യുക, തുടർന്ന് &lt;strong&gt;"പ്രാദേശിക സേവനങ്ങൾ കാണുക "&lt;/strong&gt; എന്നത് തിരയുകയും തെരഞ്ഞെടുക്കുകയും ചെയ്യുക"
diff --git a/chromium/components/strings/components_strings_mr.xtb b/chromium/components/strings/components_strings_mr.xtb
index ff3458b79b4..bdbe19ff0fb 100644
--- a/chromium/components/strings/components_strings_mr.xtb
+++ b/chromium/components/strings/components_strings_mr.xtb
@@ -352,10 +352,10 @@
<translation id="1745880797583122200">तुमचा ब्राउझर व्यवस्थापित केला आहे</translation>
<translation id="1746113442205726301">इमेज Y शिफ्ट</translation>
<translation id="1746531169546376413">० अंश</translation>
-<translation id="17513872634828108">खुले टॅब</translation>
+<translation id="17513872634828108">उघडे टॅब</translation>
<translation id="1752021286346845558">मेलबॉक्स ८</translation>
<translation id="1753068535428855445">डेटिंग आणि वैयक्तिक गोष्टी</translation>
-<translation id="1753706481035618306">पृष्ठ क्रमांक</translation>
+<translation id="1753706481035618306">पेज क्रमांक</translation>
<translation id="1755621011177747277">दत्तक प्रक्रिया</translation>
<translation id="1756026472674246267">नवीन टॅब मध्ये लिंक उघडा</translation>
<translation id="175656076281618225">जादू</translation>
@@ -399,7 +399,7 @@
<translation id="1874224422119691492">पासवर्ड भरण्यासाठी तुम्ही स्क्रीन लॉक वापरायचे की नाही हे तुम्ही <ph name="SETTINGS" /> मध्ये बदलू शकता</translation>
<translation id="1875025161375567525">फोटो ट्रे</translation>
<translation id="1875512691959384712">Google Forms</translation>
-<translation id="187918866476621466">सुरू पृष्ठ उघडा</translation>
+<translation id="187918866476621466">स्टार्टअप पेज उघडा</translation>
<translation id="1883255238294161206">सूची कोलॅप्स</translation>
<translation id="1884843295353628214">जॅझ</translation>
<translation id="1890171020361705182">Dino गेम. पिक्सलेट झालेला डायनासोर हा काट्यांपासून आणि टेरोडॅक्टिलपासून स्वतःचे रक्षण करत एका ओसाड जागेतून धावत आहे. तुम्ही ऑडिओ संकेत ऐकता तेव्हा, अडथळे आल्यावर उडी मारण्यासाठी टॅप करा.</translation>
@@ -896,7 +896,7 @@
<translation id="3223287115535306850">ॲप लाँचिंग थ्रॉबर</translation>
<translation id="3223425961342298674">स्थानाला अनुमती नाही</translation>
<translation id="3225919329040284222">सर्व्हरने असे सर्टिफिकेट सादर केले आहे जे अंगभूत अपेक्षांशी जुळत नाही. या अपेक्षा तुम्हाला संरक्षित करण्यासाठी विशिष्ट, उच्च सुरक्षिततेच्या वेबसाइटसाठी समाविष्ट केल्या आहेत.</translation>
-<translation id="3226128629678568754">पृष्ठ लोड करण्यास आवश्यक असलेला डेटा पुन्हा सबमिट करण्यासाठी रीलोड बटण प्रेस करा.</translation>
+<translation id="3226128629678568754">पेज लोड करण्यास आवश्यक असलेला डेटा पुन्हा सबमिट करण्यासाठी रीलोड बटण प्रेस करा.</translation>
<translation id="3226387218769101247">थंबनेल</translation>
<translation id="3227137524299004712">मायक्रोफोन</translation>
<translation id="3229041911291329567">तुमच्या डिव्हाइस आणि ब्राउझरविषयी आवृत्ती माहिती</translation>
@@ -1559,7 +1559,7 @@
<translation id="4825496307559726072"><ph name="CREATE_GOOGLE_SHEET_FOCUSED_FRIENDLY_MATCH_TEXT" />, नवीन Google शीट झटपट तयार करण्यासाठी टॅब आणि त्यानंतर एंटर प्रेस करा</translation>
<translation id="4825507807291741242">प्रभावी</translation>
<translation id="483241715238664915">चेतावण्या सुरू करा</translation>
-<translation id="4834250788637067901">Google Pay वापरून पेमेंट पद्धती, ऑफर आणि पत्ते</translation>
+<translation id="4834250788637067901">Google Pay वापरून पेमेंट पद्धती, ऑफर आणि अ‍ॅड्रेस</translation>
<translation id="4838327282952368871">स्वप्नवत</translation>
<translation id="4839087176073128681">पुढील वेळी आणखी जलद पैसे द्या आणि Google च्या उद्योगातील आघाडीच्या सुरक्षेसह तुमचे कार्ड सुरक्षित करा.</translation>
<translation id="4840250757394056958">तुमचा Chrome इतिहास पहा</translation>
@@ -1581,7 +1581,7 @@
<translation id="4877083676943085827">{COUNT,plural, =0{काहीही नाही}=1{<ph name="EXAMPLE_DOMAIN_1" />}=2{<ph name="EXAMPLE_DOMAIN_1" />, <ph name="EXAMPLE_DOMAIN_2" />}other{<ph name="EXAMPLE_DOMAIN_1" />, <ph name="EXAMPLE_DOMAIN_2" />, <ph name="AND_MORE" />}}</translation>
<translation id="4877422487531841831"><ph name="TEXT" /> शोधा</translation>
<translation id="4879491255372875719">आपोआप (डीफॉल्ट)</translation>
-<translation id="4880827082731008257">इतिहास शोध</translation>
+<translation id="4880827082731008257">शोध इतिहास</translation>
<translation id="4881695831933465202">उघडा</translation>
<translation id="4881808915112408168">२४ x ३१.५ इं</translation>
<translation id="4882314601499260499">कोणतीही वापरकर्ता धोरणे लागू केलेली नाहीत. वापरकर्ता धोरणे जोडण्यासाठी, तुमच्या संस्थेने <ph name="LINK_BEGIN" />तुमच्या डोमेनची पडताळणी करणे<ph name="LINK_END" /> आवश्यक आहे.</translation>
@@ -1634,7 +1634,7 @@
<translation id="5015510746216210676">मशीन नाव:</translation>
<translation id="5017554619425969104">तुम्ही कॉपी केलेला मजकूर</translation>
<translation id="5017828934289857214">मला नंतर आठवण करून द्या</translation>
-<translation id="5018422839182700155">हे पृष्‍ठ उघडू शकत नाही</translation>
+<translation id="5018422839182700155">हे पेज उघडू शकत नाही</translation>
<translation id="5018802455907704660">१६ x २० इं</translation>
<translation id="5019198164206649151">समर्थन संचयन खराब स्थितीत</translation>
<translation id="5020776957610079374">जागतिक संगीत</translation>
@@ -1810,7 +1810,7 @@
<translation id="5430298929874300616">बुकमार्क काढून टाका</translation>
<translation id="5443468954631487277">उलट्या क्रमाने फेस अप</translation>
<translation id="5447765697759493033">या साइटचे भाषांतर होणार नाही</translation>
-<translation id="5452270690849572955">हे <ph name="HOST_NAME" /> पृष्ठ शोधले जाऊ शकत नाही</translation>
+<translation id="5452270690849572955">हे <ph name="HOST_NAME" /> पेज सापडत नाही</translation>
<translation id="5455374756549232013">खराब धोरण टाइमस्टँप</translation>
<translation id="5457113250005438886">चुकीचा</translation>
<translation id="5458150163479425638">{CONTACT,plural, =0{<ph name="CONTACT_PREVIEW" />}=1{<ph name="CONTACT_PREVIEW" /> आणि <ph name="NUMBER_OF_ADDITIONAL_CONTACTS" /> आणखी}other{<ph name="CONTACT_PREVIEW" /> आणि <ph name="NUMBER_OF_ADDITIONAL_CONTACTS" /> आणखी}}</translation>
@@ -1902,10 +1902,10 @@
<translation id="5659593005791499971">ई-मेल</translation>
<translation id="5663955426505430495">या डिव्हाइसच्या अ‍ॅडमिनिस्ट्रेटरने अतिरिक्त फंक्शनसाठी एक्स्टेंशन इंस्टॉल केले आहे. एक्स्टेंशनकडे तुमच्या काही डेटाचा अ‍ॅक्सेस आहे.</translation>
<translation id="5666606186680807225">समुद्रकिनारे आणि बेटे</translation>
-<translation id="5675650730144413517">हे पृष्ठ कार्य करीत नाही</translation>
+<translation id="5675650730144413517">हे पेज काम करत नाही</translation>
<translation id="568292603005599551">इमेज X स्थिती</translation>
<translation id="5684277895745049190">सूची</translation>
-<translation id="5684874026226664614">अरेरे. हे पृष्‍ठ भाषांतरित केले जाऊ शकले नाही.</translation>
+<translation id="5684874026226664614">अरेरे. हे पेज भाषांतरित करता आले नाही.</translation>
<translation id="5685654322157854305">पाठवण्याचा पत्ता जोडा</translation>
<translation id="5689199277474810259">JSON वर एक्सपोर्ट करा</translation>
<translation id="5689516760719285838">स्थान</translation>
@@ -2119,7 +2119,7 @@
<translation id="6241121617266208201">सूचना लपवा</translation>
<translation id="624499991300733384">प्रिंट कंपोझिटर सेवा</translation>
<translation id="6252613631861574218"><ph name="MANAGE_CHROME_DOWNLOADS_FOCUSED_FRIENDLY_MATCH_TEXT" />, तुम्ही Chrome मध्ये डाउनलोड केलेल्या फाइल व्यवस्थापित करण्यासाठी, टॅब प्रेस करून एंटर प्रेस करा</translation>
-<translation id="6254436959401408446">हे पृष्‍ठ उघडण्‍यासाठी पुरेशी मेमरी नाही</translation>
+<translation id="6254436959401408446">हे पेज उघडण्‍यासाठी पुरेशी मेमरी नाही</translation>
<translation id="6259156558325130047">&amp;पुनर्क्रमित करा पुन्हा करा</translation>
<translation id="6263376278284652872"><ph name="DOMAIN" /> बुकमार्क</translation>
<translation id="6264376385120300461">तरीही डाउनलोड करा</translation>
@@ -2483,7 +2483,7 @@
<translation id="7180611975245234373">रिफ्रेश करा</translation>
<translation id="7181261019481237103">गुप्त विंडो उघडा</translation>
<translation id="7182878459783632708">कोणतीही धोरणे सेट नाहीत</translation>
-<translation id="7186367841673660872">हे पृष्ठ<ph name="ORIGINAL_LANGUAGE" />मधून<ph name="LANGUAGE_LANGUAGE" />मध्ये अनुवादित केले गेले आहे</translation>
+<translation id="7186367841673660872">हे पेज<ph name="ORIGINAL_LANGUAGE" />मधून<ph name="LANGUAGE_LANGUAGE" />मध्ये अनुवादित केले गेले आहे</translation>
<translation id="7186840261985974511">एन्व्हलप #१२</translation>
<translation id="718872491229180389">चीअरलीडिंग</translation>
<translation id="7192188280913829296">ॲट्रिब्यूट "vendor_id" देखील नमूद करणे आवश्यक आहे.</translation>
@@ -2830,7 +2830,7 @@
<translation id="7981129096182302364">नृत्य आणि इलेक्ट्रॉनिक संगीत</translation>
<translation id="798134797138789862">आभासी वास्तविकता डिव्हाइस आणि डेटा वापरण्याची विनंती करू शकते</translation>
<translation id="7983008347525536475">SUVs</translation>
-<translation id="7984945080620862648">Chrome प्रक्रिया करू शकत नसलेले न समजणारे क्रेडेन्शियल वेबसाइटने पाठविल्यामुळे तुम्ही आत्ता <ph name="SITE" /> ला भेट देऊ शकत नाही. नेटवर्क एरर आणि आक्रमणकर्ते सामान्यतः तात्पुरते असतात, यामुळे हे पृष्ठ कदाचित नंतर कार्य करेल.</translation>
+<translation id="7984945080620862648">Chrome प्रक्रिया करू शकत नसलेली स्क्रॅंबल केलेली क्रेडेंशियल वेबसाइटने पाठवल्यामुळे तुम्ही आत्ता <ph name="SITE" /> ला भेट देऊ शकत नाही. नेटवर्क एरर आणि आक्रमणकर्ते सामान्यतः तात्पुरते असतात, यामुळे हे पेज नंतर व्यवस्थित काम करेल.</translation>
<translation id="7986319120639858961"><ph name="CARD_TITLE" /> <ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
<translation id="799149739215780103">बाइंड</translation>
<translation id="7992044431894087211"><ph name="APPLICATION_TITLE" /> सोबत स्क्रीन शेअर करणे पुन्हा सुरू केले</translation>
@@ -2852,7 +2852,7 @@
<translation id="8027077570865220386">ट्रे १५</translation>
<translation id="8028698320761417183"><ph name="CREATE_GOOGLE_FORM_FOCUSED_FRIENDLY_MATCH_TEXT" />, Google Forms मध्ये नवीन फॉर्म झटपट तयार करण्यासाठी टॅब आणि त्यानंतर एंटर प्रेस करा</translation>
<translation id="8028960012888758725">जॉबनंतर ट्रिम करा</translation>
-<translation id="8034522405403831421">हे पृष्‍ठ <ph name="SOURCE_LANGUAGE" /> मध्ये आहे. त्यास <ph name="TARGET_LANGUAGE" /> मध्ये भाषांतरीत करायचे?</translation>
+<translation id="8034522405403831421">हे पेज <ph name="SOURCE_LANGUAGE" /> मध्ये आहे. त्याला <ph name="TARGET_LANGUAGE" /> मध्ये भाषांतरित करायचे?</translation>
<translation id="8035152190676905274">पेन</translation>
<translation id="8037117624646282037">डिव्हाइस अलीकडे कोणी वापरले</translation>
<translation id="8037357227543935929">विचारा (डीफॉल्ट)</translation>
@@ -3030,7 +3030,7 @@
<translation id="8466379296835108687">{COUNT,plural, =1{1 क्रेडिट कार्ड}other{# क्रेडिट कार्ड}}</translation>
<translation id="8468358362970107653">एन्व्हलप सी३</translation>
<translation id="8473626140772740486">३०० x ४५० मिमी</translation>
-<translation id="8473863474539038330">पत्ते आणि बरेच काही</translation>
+<translation id="8473863474539038330">अ‍ॅड्रेस आणि बरेच काही</translation>
<translation id="8474910779563686872">डेव्हलपर तपशील दाखवा</translation>
<translation id="8479754468255770962">स्टेपल बॉटम लेफ्ट</translation>
<translation id="8483229036294884935">तुमच्या <ph name="ACCOUNT" /> Google खाते वरून हा पत्ता हटवला जाईल</translation>
@@ -3232,7 +3232,7 @@
<translation id="9018120810758822233"><ph name="CREDIT_CARD" /> साठी तुमचा सुरक्षा कोड एंटर करा</translation>
<translation id="901834265349196618">ईमेल</translation>
<translation id="9020200922353704812">कार्ड बिलिंग पत्ता आवश्यक आहे</translation>
-<translation id="9020542370529661692">हे पृष्ठ <ph name="TARGET_LANGUAGE" /> मध्ये भाषांतरित केले गेले आहे.</translation>
+<translation id="9020542370529661692">हे पेज <ph name="TARGET_LANGUAGE" /> मध्ये भाषांतरित केले गेले आहे.</translation>
<translation id="9020742383383852663">A8</translation>
<translation id="9021429684248523859"><ph name="SHARE_THIS_PAGE_FOCUSED_FRIENDLY_MATCH_TEXT" />, लिंक शेअर करून, QR कोड तयार करून, कास्ट करून आणि आणखी बऱ्याच पर्यायांद्वारे हा टॅब शेअर करण्यासाठी टॅब आणि त्यानंतर एंटर प्रेस करा</translation>
<translation id="9025348182339809926">(चुकीचे)</translation>
diff --git a/chromium/components/strings/components_strings_my.xtb b/chromium/components/strings/components_strings_my.xtb
index 21b5a61b7a9..9531616cc09 100644
--- a/chromium/components/strings/components_strings_my.xtb
+++ b/chromium/components/strings/components_strings_my.xtb
@@ -7,7 +7,7 @@
<translation id="1010200102790553230">စာမျက်နှာကို နောက်မှဖွင့်ရန်</translation>
<translation id="1011206368273183593">ဖိုင်များကို ပြင်ဆင်နေသည်</translation>
<translation id="1015730422737071372">နောက်ထပ်အသေးစိတ်အချက်အလက်များ ပေးပါ</translation>
-<translation id="1019413721762100891">ပိတ်ထားသည်</translation>
+<translation id="1019413721762100891">ပိတ်</translation>
<translation id="1021753677514347426">သင် သို့မဟုတ် တစ်စုံတစ်ယောက်က သင့်စက်ပေါ်တွင် ထည့်သွင်းထားသည့် အသိအမှတ်ပြုလက်မှတ်တစ်ခုကြောင့် ဤပြဿနာ ဖြစ်ပေါ်ရခြင်းဖြစ်သည်။ ကွန်ရက်များကို စောင့်ကြည့်ရန်နှင့် ကြားဖြတ်ရန်အတွက် အသိအမှတ်ပြုလက်မှတ်ကို အသုံးပြုကြောင်း သိရှိထားပြီး Chromium က ယုံကြည်စိတ်ချခြင်း မရှိပါ။ ကျောင်း သို့မဟုတ် ကုမ္ပဏီကွန်ရက်များတွင် တရားဝင်စောင့်ကြည့်သည့် ကိစ္စရပ်အချို့ရှိနေပြီး ၎င်းကို သင်က ပိတ်၍မရနိုင်သော်လည်း ထိုသို့စောင့်ကြည့်နေကြောင်း Chromium က သင့်အား သတိထားစေလိုပါသည်။ ဝဘ်ကို အသုံးပြုသည့် ဘရောင်ဇာ သို့မဟုတ် အပလီကေးရှင်းတိုင်းတွင် စောင့်ကြည့်ခြင်းများ ရှိနိုင်သည်။</translation>
<translation id="1024111578869940408">တစ်ခါတစ်ရံ တိုက်ခိုက်သူများသည် ဝဘ်ဆိုက်အစစ်ကို တုပရန် ဝဘ်လိပ်စာအတွင်း မြင်ရန်ခက်ခဲသော အပြောင်းအလဲများ ပြုလုပ်ကြသည်။</translation>
<translation id="1028781062521375153">အသေးစိတ်အချက်များ ကြည့်ရန်</translation>
@@ -124,7 +124,7 @@
<translation id="1263231323834454256">ဖတ်ရန် စာရင်း</translation>
<translation id="1264309058268477500">အရန်</translation>
<translation id="1264974993859112054">အားကစား</translation>
-<translation id="1266469291454105242">စက်လော့ခ်ဖွင့်ခြင်း</translation>
+<translation id="1266469291454105242">စက်လော့ခ်ဖွင့်ရန်</translation>
<translation id="1268480293435976622">Chinese #7 စာအိတ်</translation>
<translation id="1269516672602708785">Google Sites တွင် ဝဘ်ဆိုက်အသစ် အမြန်ပြုလုပ်ရန်</translation>
<translation id="1270502636509132238">လာယူနည်း</translation>
@@ -1991,7 +1991,7 @@
<translation id="5919090499915321845">B10</translation>
<translation id="5920262536204764679">{NUM_COOKIES,plural, =1{၁ ခု အသုံးပြုနေသည်}other{# ခု အသုံးပြုနေသည်}}</translation>
<translation id="592031860219554105">ရေခဲပြင်စကိတ်စီးခြင်း</translation>
-<translation id="5921185718311485855">ဖွင့်ထားသည်</translation>
+<translation id="5921185718311485855">ဖွင့်</translation>
<translation id="5921639886840618607">ကတ်ကို Google အကောင့်သို့ သိမ်းလိုပါသလား။</translation>
<translation id="5922853866070715753">ပြီးလုနီးပါပြီ</translation>
<translation id="5923492272538889093">CVC နံပါတ်အစား စက်လော့ခ်ဖွင့်ခြင်းကို သုံးမလား။</translation>
@@ -2236,7 +2236,7 @@
<translation id="6529602333819889595">&amp;ဖျက်ရန်ကို ပြန်လုပ်ရန်</translation>
<translation id="6535751101619004418">ငွေကြေးနှင့် နိုင်ငံခြားငွေလဲလှယ်ခြင်း</translation>
<translation id="6540534463546766581">ဝိုင်းဝန်း ရင်းနှီးမြှုပ်နှံငွေ</translation>
-<translation id="6545864417968258051">ဘလူးတုသ် ရှာဖွေခြင်း</translation>
+<translation id="6545864417968258051">ဘလူးတုသ် ရှာဖွေရန်</translation>
<translation id="6547208576736763147">ဘယ်ဘက်တွင် နှစ်ချက်ဖောက်ရန်</translation>
<translation id="6549443526281184652">ဝတ်စုံများ</translation>
<translation id="6554732001434021288">ပြီးခဲ့သော <ph name="NUM_DAYS" /> ရက်က နောက်ဆုံး ဝင်ကြည့်ထားသည်</translation>
diff --git a/chromium/components/strings/components_strings_ne.xtb b/chromium/components/strings/components_strings_ne.xtb
index 182f6640067..98b99a4f2fe 100644
--- a/chromium/components/strings/components_strings_ne.xtb
+++ b/chromium/components/strings/components_strings_ne.xtb
@@ -18,7 +18,7 @@
<ph name="LIST_ITEM" />रोजगारदाता वा विद्यालयले ब्राउजर प्रयोग गरी गरिएको क्रियाकलापसम्बन्धी विवरण हेर्न सक्छन्<ph name="END_LIST_ITEM" />
<ph name="LIST_ITEM" />इन्टरनेट सेवा प्रदायकहरूले वेब ट्राफिकको निरीक्षण गर्न सक्छन्<ph name="END_LIST_ITEM" />
<ph name="END_LIST" /></translation>
-<translation id="1036348656032585052">निस्कृय पार्नुहोस्</translation>
+<translation id="1036348656032585052">अफ गर्नुहोस्</translation>
<translation id="1036881361735705143">Envelope C4</translation>
<translation id="1036982837258183574">पूर्ण स्क्रिनबाट बाहिर निस्कनका लागि <ph name="ACCELERATOR" /> लाई थिच्नुहोस्</translation>
<translation id="1038106730571050514">सुझावहरू देखाइयोस्</translation>
@@ -864,7 +864,7 @@
<translation id="3145945101586104090">प्रतिक्रिया डिकोड गर्न असफल भयो</translation>
<translation id="3150653042067488994">अस्थायी सर्भर त्रुटि</translation>
<translation id="3154506275960390542">यो पृष्ठमा सुरक्षित रूपमा पेस गर्न नसकिने फारम समावेश छ। तपाईंले पठाउनुभएको डेटा ट्रान्जिटमा भएको बेला अरूले हेर्न सक्छन् वा सर्भरले प्राप्त गर्ने कुरालाई परिवर्तन गर्न कुनै आक्रमणकारीले यस डेटालाई परिमार्जन गर्न सक्छ।</translation>
-<translation id="3154987252551138431">नजिकैका डिभाइससँग सेयर गर्ने क्रममा केही चिज गडबड भयो</translation>
+<translation id="3154987252551138431">नजिकैका डिभाइससँग सेयर गर्ने क्रममा कुनै समस्या आयो</translation>
<translation id="315504272643575312"><ph name="MANAGER" /> ले तपाईंको खाता व्यवस्थापन गर्छ।</translation>
<translation id="3157931365184549694">पुन: भण्डारण</translation>
<translation id="3158539265159265653">डिस्क</translation>
@@ -1041,7 +1041,7 @@
<translation id="3575121482199441727">यो साइटलाई अनुमति दिनुहोस्</translation>
<translation id="3575168918110434329">A4x7</translation>
<translation id="3576616784287504635"><ph name="SITE" /> मा इम्बेड गरिएको पृष्ठले यसो भन्छ</translation>
-<translation id="3577473026931028326">केही चिज गडबड भयो। फेरि प्रयास गर्नुहोस्।</translation>
+<translation id="3577473026931028326">कुनै समस्या आयो। फेरि प्रयास गर्नुहोस्।</translation>
<translation id="3577902790357386792">जिम्नास्टिक्स</translation>
<translation id="3581089476000296252">यो पृष्ठ तयार भएपछि Chrome ले तपाईंलाई यसबारे सूचित गर्ने छ। &lt;a&gt;रद्द गर्नुहोस्&lt;/a&gt;</translation>
<translation id="3582930987043644930">नाम थप्नुहोस्</translation>
@@ -1438,7 +1438,7 @@
<translation id="4526465106919207193">जनता तथा समाज</translation>
<translation id="4530347922939905757">टेक्स्ट म्यासेज</translation>
<translation id="4531477351494678589">भर्चुअल कार्ड नम्बर:</translation>
-<translation id="4540780316273593836">केही चिज गडबड भयो</translation>
+<translation id="4540780316273593836">कुनै समस्या आयो</translation>
<translation id="4541810033354695636">अग्मेन्टेड रियालिटी</translation>
<translation id="4542971377163063093">ट्रे ६</translation>
<translation id="455113658016510503">A9</translation>
@@ -1871,7 +1871,7 @@
<translation id="5586831831248371458"><ph name="KEYWORD_SUFFIX" /> खोज्नुहोस्</translation>
<translation id="5587987780934666589">प्लेटफर्मका प्रयोगकर्ता</translation>
<translation id="5593349413089863479">इन्टरनेट पूर्ण रूपमा सुरक्षित छैन</translation>
-<translation id="5595485650161345191">ठेगाना सम्पादन गर्नुहोस्</translation>
+<translation id="5595485650161345191">ठेगाना बदल्नुहोस्</translation>
<translation id="5596939519753369075">२ x ३.५ इन्च</translation>
<translation id="5598944008576757369">भुक्तानी विधि छनौट गर्नुहोस्</translation>
<translation id="560412284261940334">व्यवस्थापन समर्थित छैन</translation>
diff --git a/chromium/components/strings/components_strings_nl.xtb b/chromium/components/strings/components_strings_nl.xtb
index c4bb985a6b8..62cec8ef3bc 100644
--- a/chromium/components/strings/components_strings_nl.xtb
+++ b/chromium/components/strings/components_strings_nl.xtb
@@ -348,7 +348,7 @@ Anders wordt dit geblokkeerd door je privacyinstellingen. Hierdoor werkt de cont
<translation id="1736420071277903564">Computer</translation>
<translation id="1740951997222943430">Geef een geldige vervalmaand op</translation>
<translation id="1741613555002899862">Moet gespecificeerd zijn en een geldige tekenreeks zijn als DnsOverHttpsMode <ph name="SECURE_DNS_MODE_SECURE" /> is.</translation>
-<translation id="1745399796851657441"><ph name="BEGIN_BOLD" />Hoe we deze gegevens gebruiken:<ph name="END_BOLD" /> Chrome registreert interessante onderwerpen terwijl je browset. Onderwerplabels zijn vooraf gedefinieerd en omvatten bijvoorbeeld Kunst en entertainment, Shopping en Sport. Later kan een site die je bezoekt Chrome om een aantal van je onderwerpen vragen (maar niet je browsegeschiedenis) om de advertenties te personaliseren die je te zien krijgt.</translation>
+<translation id="1745399796851657441"><ph name="BEGIN_BOLD" />Hoe we deze gegevens gebruiken:<ph name="END_BOLD" /> Chrome registreert interessante onderwerpen terwijl je browst. Onderwerplabels zijn vooraf gedefinieerd en omvatten bijvoorbeeld Kunst en entertainment, Shopping en Sport. Later kan een site die je bezoekt Chrome om een aantal van je onderwerpen vragen (maar niet je browsegeschiedenis) om de advertenties te personaliseren die je te zien krijgt.</translation>
<translation id="1745880797583122200">Je browser wordt beheerd</translation>
<translation id="1746113442205726301">Beeldverschuiving Y</translation>
<translation id="1746531169546376413">0 graden</translation>
@@ -461,7 +461,7 @@ Anders wordt dit geblokkeerd door je privacyinstellingen. Hierdoor werkt de cont
<translation id="205212645995975601">Barbecue en grillen</translation>
<translation id="2053111141626950936">Pagina's in het <ph name="LANGUAGE" /> worden niet vertaald.</translation>
<translation id="2053373601901562871">{NUM_DAYS,plural, =0{Als dit bedieningselement aanstaat en de status actief is, bepaalt Chrome op welke grote groep mensen (ook wel een cohort genoemd) je recente browse-activiteit het meest lijkt. Adverteerders kunnen advertenties voor de groep selecteren en je browse-activiteit blijft privé op je apparaat. Je groep wordt elke dag geüpdatet.}=1{Als dit bedieningselement aanstaat en de status actief is, bepaalt Chrome op welke grote groep mensen (ook wel een cohort genoemd) je recente browse-activiteit het meest lijkt. Adverteerders kunnen advertenties voor de groep selecteren en je browse-activiteit blijft privé op je apparaat. Je groep wordt elke dag geüpdatet.}other{Als dit bedieningselement aanstaat en de status actief is, bepaalt Chrome op welke grote groep mensen (ook wel een cohort genoemd) je recente browse-activiteit het meest lijkt. Adverteerders kunnen advertenties voor de groep selecteren en je browse-activiteit blijft privé op je apparaat. Je groep wordt elke {NUM_DAYS} dagen geüpdatet.}}</translation>
-<translation id="2056658168519009885">Sites kunnen Chrome om informatie vragen om de advertenties te personaliseren die je te zien krijgt.</translation>
+<translation id="2056658168519009885">Sites kunnen Chrome om informatie vragen om de advertenties te personaliseren die je ziet.</translation>
<translation id="2059202684901022309">22 x 34 inch</translation>
<translation id="2064691555167957331">{COUNT,plural, =1{1 suggestie}other{# suggesties}}</translation>
<translation id="2066915425250589881">een verwijderingsverzoek indienen</translation>
@@ -825,7 +825,7 @@ Anders wordt dit geblokkeerd door je privacyinstellingen. Hierdoor werkt de cont
<translation id="301521992641321250">Automatisch geblokkeerd</translation>
<translation id="3016780570757425217">Je locatie weten</translation>
<translation id="3017086357773116182"><ph name="REMOVE_SUGGESTION_SUFFIX" />, druk op Tab en daarna op Enter om de suggestie te verwijderen.</translation>
-<translation id="3023165109041533893">Met door sites voorgestelde advertenties worden je browsegeschiedenis en identiteit beschermd terwijl de sites je relevante advertenties kunnen laten zien. Op basis van je activiteit kan een site die je hebt bezocht gerelateerde advertenties voorstellen terwijl je browset. In de instellingen kun je een lijst van deze sites bekijken en ongewenste sites blokkeren.</translation>
+<translation id="3023165109041533893">Met door sites voorgestelde advertenties worden je browsegeschiedenis en identiteit beschermd terwijl de sites je relevante advertenties kunnen laten zien. Op basis van je activiteit kan een site die je hebt bezocht gerelateerde advertenties voorstellen terwijl je browst. In de instellingen kun je een lijst van deze sites bekijken en ongewenste sites blokkeren.</translation>
<translation id="3024663005179499861">Onjuist beleidstype</translation>
<translation id="3029752078111257850">Wereldnieuws</translation>
<translation id="3037177537145227281">Prijs wordt gevolgd</translation>
@@ -946,7 +946,7 @@ Het kan langer dan normaal duren voordat je app wordt gestart.</translation>
<translation id="3339440062908617027">Hardlopen en wandelen</translation>
<translation id="3339446062576134663">Cloud (Ash)</translation>
<translation id="3340978935015468852">instellingen</translation>
-<translation id="3342018947887487892">Later kan een site die je bezoekt vragen om je advertentieonderwerpen of om advertenties die zijn voorgesteld door sites die je hebt bezocht.</translation>
+<translation id="3342018947887487892">Later kan een site die je bezoekt informatie opvragen over advertentieonderwerpen of over voorgestelde advertenties op andere sites die je hebt bezocht.</translation>
<translation id="3342366525167526994">Body art</translation>
<translation id="3349952286488694786">SRA2</translation>
<translation id="3355823806454867987">Proxyinstellingen wijzigen...</translation>
@@ -1175,7 +1175,7 @@ Het kan langer dan normaal duren voordat je app wordt gestart.</translation>
<translation id="3901925938762663762">De pas is verlopen</translation>
<translation id="3906954721959377182">Tablet</translation>
<translation id="3909695131102177774"><ph name="LABEL" /> <ph name="ERROR" /></translation>
-<translation id="3911401144270344103">Je kunt dit op elk moment wijzigen via de Chrome-instellingen</translation>
+<translation id="3911401144270344103">Je kunt dit altijd wijzigen via de Chrome-instellingen</translation>
<translation id="3921869355029467742">Geef je beveiligingscode op</translation>
<translation id="3927932062596804919">Weigeren</translation>
<translation id="393316646445601645">Internet en telecom</translation>
@@ -1874,7 +1874,7 @@ Het kan langer dan normaal duren voordat je app wordt gestart.</translation>
<translation id="5598944008576757369">Betaalmethode kiezen</translation>
<translation id="560412284261940334">Beheer wordt niet ondersteund</translation>
<translation id="5605670050355397069">Ledger</translation>
-<translation id="5606444889871204172"><ph name="BEGIN_BOLD" />Hoe je je gegevens kunt beheren:<ph name="END_BOLD" /> Chrome verwijdert automatisch sites die ouder zijn dan 4 weken. Een site die je opnieuw bezoekt, kan weer in de lijst verschijnen. Via de Chrome-instellingen kun je ook altijd voorkomen dat een site advertenties voor je voorstelt of door sites voorgestelde advertenties uitzetten.</translation>
+<translation id="5606444889871204172"><ph name="BEGIN_BOLD" />Hoe je je gegevens kunt beheren:<ph name="END_BOLD" /> Chrome verwijdert automatisch sites die ouder zijn dan 4 weken. Een site die je opnieuw bezoekt, kan weer in de lijst verschijnen. Via de Chrome-instellingen kun je ook altijd voorkomen dat een site advertenties voorstelt en voorgestelde advertenties door sites uitzetten.</translation>
<translation id="5610142619324316209">Controleer de verbinding</translation>
<translation id="5610807607761827392">Je kunt passen en adressen beheren in <ph name="BEGIN_LINK" />Instellingen<ph name="END_LINK" />.</translation>
<translation id="561165882404867731">Deze pagina vertalen met Google Translate</translation>
@@ -2313,7 +2313,7 @@ Het kan langer dan normaal duren voordat je app wordt gestart.</translation>
<translation id="6786145470008421571">Envelop 6 x 9 inch</translation>
<translation id="67862343314499040">Violet</translation>
<translation id="6786747875388722282">Extensies</translation>
-<translation id="6787094689637422836">We lanceren nieuwe privacyfuncties die je meer controle geven over de advertenties die je te zien krijgt.</translation>
+<translation id="6787094689637422836">We lanceren nieuwe privacyfuncties die je meer controle geven over de advertenties die je ziet.</translation>
<translation id="678982761784843853">ID's van beschermde content</translation>
<translation id="6790428901817661496">Spelen</translation>
<translation id="679355240208270552">Genegeerd omdat de standaard zoekoptie is uitgezet door het beleid.</translation>
@@ -2754,13 +2754,13 @@ Aanvullende informatie:
<translation id="7773005668374414287">Dezelfde volgorde met de bedrukte zijde omhoog</translation>
<translation id="7785790577395078482">deze tablet</translation>
<translation id="7786368602962652765">Een verplicht veld is leeg. Vul het in voordat je opslaat.</translation>
-<translation id="7790488044432570133">Sites die je bezoekt kunnen Chrome om informatie vragen waarmee ze de prestaties van hun advertenties kunnen meten. Met Chrome kunnen sites slechts bepaalde soorten gegevens verzamelen, zoals het tijdstip waarop je een advertentie te zien kreeg.</translation>
+<translation id="7790488044432570133">Sites die je bezoekt kunnen Chrome om informatie vragen waarmee ze de prestaties van hun advertenties kunnen meten. Met Chrome kunnen sites alleen bepaalde soorten gegevens verzamelen, zoals het tijdstip waarop je een advertentie te zien kreeg.</translation>
<translation id="7791011319128895129">Niet uitgebracht</translation>
<translation id="7791196057686275387">Bundelen</translation>
<translation id="7791543448312431591">Toevoegen</translation>
<translation id="7798389633136518089">Genegeerd omdat het beleid niet is ingesteld door een cloudbron.</translation>
<translation id="7800304661137206267">De verbinding is geëncrypt met <ph name="CIPHER" />, met <ph name="MAC" /> voor berichtverificatie en <ph name="KX" /> als mechanisme voor sleuteluitwisseling.</translation>
-<translation id="7800977246388195491">Chrome stelt interessante onderwerpen vast op basis van je recente browsegeschiedenis. Sites die je bezoekt, kunnen ook vaststellen wat je leuk vindt. Later kunnen sites om deze informatie vragen om de advertenties te personaliseren die je te zien krijgt. Je kunt kiezen welke onderwerpen en sites worden gebruikt om advertenties tonen.</translation>
+<translation id="7800977246388195491">Chrome stelt vast welke onderwerpen je interesseren op basis van je recente browsegeschiedenis. Ook kunnen sites die je bezoekt, vaststellen wat je leuk vindt. Later kunnen sites deze informatie opvragen om je advertenties te personaliseren. Je kunt kiezen welke onderwerpen en sites worden gebruikt om advertenties tonen.</translation>
<translation id="7802523362929240268">Site is legitiem</translation>
<translation id="7802989406998618639">Geef de beveiligingscode van <ph name="NUMBER_OF_DIGITS" /> cijfers op de <ph name="SIDE_OF_CARD" /> op, zodat je bank kan verifiëren dat jij het bent</translation>
<translation id="780301667611848630">Nee, bedankt</translation>
@@ -2841,7 +2841,7 @@ Aanvullende informatie:
<translation id="8019861005170389898"><ph name="TRADITIONAL_TEXT" /> (<ph name="ADDITIONAL_TEXT" />)</translation>
<translation id="8023231537967344568"><ph name="SET_CHROME_AS_DEFAULT_BROWSER_FOCUSED_FRIENDLY_MATCH_TEXT" />, druk op Tab en daarna op Enter om Chrome in te stellen als de standaardbrowser van het systeem</translation>
<translation id="8025119109950072390">Cybercriminelen op deze site proberen je mogelijk te misleiden om iets gevaarlijks te doen, zoals software installeren of je persoonlijke informatie bekendmaken (bijvoorbeeld wachtwoorden, telefoonnummers of creditcards).</translation>
-<translation id="8026126421313327427">Chrome verwijdert automatisch onderwerpen die ouder zijn dan 4 weken. Terwijl je browset, kan er een onderwerp opnieuw verschijnen in de lijst. Je kunt ook onderwerpen verwijderen als je niet wilt dat Chrome deze met sites deelt.</translation>
+<translation id="8026126421313327427">Chrome verwijdert automatisch onderwerpen die ouder zijn dan 4 weken. Terwijl je browst, kan er een onderwerp opnieuw verschijnen in de lijst. Je kunt ook onderwerpen verwijderen als je niet wilt dat Chrome deze met sites deelt.</translation>
<translation id="8026334261755873520">Browsegegevens wissen</translation>
<translation id="8027077570865220386">Lade 15</translation>
<translation id="8028698320761417183"><ph name="CREATE_GOOGLE_FORM_FOCUSED_FRIENDLY_MATCH_TEXT" />, druk op Tab en daarna op Enter om snel een nieuw formulier in Google Formulieren te maken</translation>
@@ -3146,7 +3146,7 @@ Aanvullende informatie:
<translation id="8805819170075074995">Lijstitem '<ph name="LANGUAGE_ID" />': Item is genegeerd omdat dit ook is opgenomen in het beleid SpellcheckLanguage.</translation>
<translation id="8806285662264631610">Bad- en lichaamsverzorgingsproducten</translation>
<translation id="8807160976559152894">Bijsnijden na elke pagina</translation>
-<translation id="8809203544698246977">Hier zie je geblokkeerde onderwerpen</translation>
+<translation id="8809203544698246977">Hier staan je geblokkeerde onderwerpen</translation>
<translation id="8813277370772331957">Later herinneren</translation>
<translation id="8814707942599948500">Envelop C8</translation>
<translation id="8816395686387277279"><ph name="UPDATE_CHROME_FOCUSED_FRIENDLY_MATCH_TEXT" />. Druk op Tab en vervolgens op Enter om Chrome te updaten via je Chrome-instellingen</translation>
@@ -3321,7 +3321,7 @@ Aanvullende informatie:
<translation id="935608979562296692">FORMULIER LEEGMAKEN</translation>
<translation id="936602727769022409">Je kunt de toegang tot je Google-account kwijtraken. Chromium raadt je aan je wachtwoord nu te wijzigen. Je wordt gevraagd in te loggen op je account.</translation>
<translation id="937457230470581909">Dierentuinen, aquaria en natuurreservaten</translation>
-<translation id="937804173274050966"><ph name="BEGIN_BOLD" />Welke gegevens worden gebruikt:<ph name="END_BOLD" /> Je advertentieonderwerpen zijn gebaseerd op je recente browsegeschiedenis, een lijst met sites die je via Chrome op dit apparaat hebt bezocht.</translation>
+<translation id="937804173274050966"><ph name="BEGIN_BOLD" />Welke gegevens worden gebruikt:<ph name="END_BOLD" /> Je advertentieonderwerpen zijn gebaseerd op je recente browsegeschiedenis. Dit is een lijst met sites die je via Chrome op dit apparaat hebt bezocht.</translation>
<translation id="939736085109172342">Nieuwe map</translation>
<translation id="940053046584497293">Reizen en transport</translation>
<translation id="945855313015696284">Controleer de informatie hieronder en verwijder alle ongeldige passen</translation>
diff --git a/chromium/components/strings/components_strings_pl.xtb b/chromium/components/strings/components_strings_pl.xtb
index 17a8df4d923..45e520318e0 100644
--- a/chromium/components/strings/components_strings_pl.xtb
+++ b/chromium/components/strings/components_strings_pl.xtb
@@ -649,7 +649,7 @@ Jeśli się nie zgodzisz, zostaną one zablokowane ze względu na Twoje ustawien
<translation id="2544546346215446551">Administrator uruchomił ponownie Twoje urządzenie</translation>
<translation id="2544644783021658368">Pojedynczy dokument</translation>
<translation id="254524874071906077">Ustaw Chrome jako przeglądarkę domyślną</translation>
-<translation id="2546283357679194313">Pliki cookie i dane stron</translation>
+<translation id="2546283357679194313">Pliki cookie i dane witryn</translation>
<translation id="2547466893236767989">Projektowanie i programowanie internetowe</translation>
<translation id="254947805923345898">Wartość zasady jest nieprawidłowa.</translation>
<translation id="255002559098805027">Serwer <ph name="HOST_NAME" /> wysłał nieprawidłową odpowiedź.</translation>
@@ -1869,7 +1869,7 @@ Uruchamianie aplikacji może potrwać dłużej niż zwykle.</translation>
<translation id="5572851009514199876">Uruchom Chrome i zaloguj się w nim, by mógł sprawdzić, czy masz uprawnienia dostępu do tej strony.</translation>
<translation id="557886905979275351">Maszynki do golenia</translation>
<translation id="5580958916614886209">Sprawdź miesiąc ważności i spróbuj ponownie</translation>
-<translation id="558420943003240152">Zarządzaj hasłami i kluczami…</translation>
+<translation id="558420943003240152">Zarządzaj hasłami i kluczami dostępu…</translation>
<translation id="5586446728396275693">Brak zapisanych adresów</translation>
<translation id="5586831831248371458">Szukaj: <ph name="KEYWORD_SUFFIX" /></translation>
<translation id="5587987780934666589">Platforma – użytkownik</translation>
@@ -3337,7 +3337,7 @@ Dodatkowe informacje:
<translation id="961663415146723894">Wiązanie na dole</translation>
<translation id="962484866189421427">Te treści mogą próbować zainstalować wprowadzające w błąd aplikacje, które udają, że są przeznaczone do czegoś innego niż w rzeczywistości, lub zbierają dane, na podstawie których można Cię śledzić. <ph name="BEGIN_LINK" />Pokaż mimo to<ph name="END_LINK" /></translation>
<translation id="963837307749850257">Wszyscy użytkownicy</translation>
-<translation id="964050462028070434">Zarządzaj hasłami i kluczami…</translation>
+<translation id="964050462028070434">Zarządzaj hasłami i kluczami dostępu…</translation>
<translation id="96680173638229310">Samochody i pojazdy</translation>
<translation id="969892804517981540">Oficjalna wersja</translation>
<translation id="973773823069644502">Dodaj adres dostawy</translation>
diff --git a/chromium/components/strings/components_strings_pt-BR.xtb b/chromium/components/strings/components_strings_pt-BR.xtb
index 8408d966d23..50963ed5efb 100644
--- a/chromium/components/strings/components_strings_pt-BR.xtb
+++ b/chromium/components/strings/components_strings_pt-BR.xtb
@@ -1078,7 +1078,7 @@ Se não fizer isso, a permissão será bloqueada pelas configurações de privac
<translation id="3646643500201740985">Medir a performance de um anúncio</translation>
<translation id="3647286794400715637">Cada entrada de string de URL precisa conter entre um e dois URLs.</translation>
<translation id="3650584904733503804">Validação bem-sucedida</translation>
-<translation id="3650594806107685466">Para manter seu cartão seguro, insira o CVC que fica na <ph name="SIDE_OF_CARD" /></translation>
+<translation id="3650594806107685466">Por questões de segurança, insira o CVC que fica na <ph name="SIDE_OF_CARD" /></translation>
<translation id="3653033846669030038">Parques temáticos</translation>
<translation id="3655241534245626312">Acessar configurações de permissão</translation>
<translation id="3655670868607891010">Caso veja esta página com frequência, tente <ph name="HELP_LINK" />.</translation>
@@ -1198,7 +1198,7 @@ Se não fizer isso, a permissão será bloqueada pelas configurações de privac
<translation id="3962859241508114581">Faixa anterior</translation>
<translation id="3963721102035795474">Modo leitor</translation>
<translation id="3964661563329879394">{COUNT,plural, =0{Nenhum}=1{1 site }one{# site }other{# sites }}</translation>
-<translation id="3969052498612555048">Não encontrou o código? <ph name="BEGIN_LINK" />Gerar novo código<ph name="END_LINK" /></translation>
+<translation id="3969052498612555048">Não encontrou o código? <ph name="BEGIN_LINK" />Gerar outro<ph name="END_LINK" /></translation>
<translation id="397105322502079400">Calculando...</translation>
<translation id="3973234410852337861"><ph name="HOST_NAME" /> está bloqueado</translation>
<translation id="3984581365661308170">Envelope 11</translation>
@@ -1259,7 +1259,7 @@ Se não fizer isso, a permissão será bloqueada pelas configurações de privac
<translation id="4117700440116928470">O escopo da política não é suportado.</translation>
<translation id="4121428309786185360">Expira em</translation>
<translation id="4123572138124678573">Perfuração tripla na parte inferior</translation>
-<translation id="4127575959421463246">Procurando as sinalizações do Chrome OS? Visitar</translation>
+<translation id="4127575959421463246">Procurando as sinalizações do ChromeOS? Visitar</translation>
<translation id="4129401438321186435">{COUNT,plural, =1{mais 1}one{mais #}other{mais #}}</translation>
<translation id="4130226655945681476">Verificar os cabos de rede, modem e roteador</translation>
<translation id="4132448310531350254">Gerenciadores duplicados da extensão de arquivo "<ph name="FILE_EXTENSION" />" referenciada pelos apps "<ph name="POLICY_IDS_LIST" />".</translation>
@@ -1482,7 +1482,7 @@ Se não fizer isso, a permissão será bloqueada pelas configurações de privac
<translation id="4652440160515225514">Sua organização bloqueou este site porque ele viola uma política.</translation>
<translation id="4653167719759882810">Fusões e aquisições</translation>
<translation id="4658638640878098064">Grampo na parte superior direita</translation>
-<translation id="4660119392514473465">Agora você pode navegar com privacidade, e as outras pessoas que usarem este dispositivo não verão suas atividades. No entanto, os downloads, favoritos e itens da Lista de leitura ainda serão salvos.</translation>
+<translation id="4660119392514473465">Agora você pode navegar com privacidade, e as outras pessoas que usarem este dispositivo não terão acesso às suas atividades. No entanto, os downloads, favoritos e itens da Lista de leitura ainda serão salvos.</translation>
<translation id="4660567771874403130">Energia e serviços públicos</translation>
<translation id="4663373278480897665">Câmera permitida</translation>
<translation id="4666114623408286498">Indústria farmacêutica e biotecnologia</translation>
@@ -1966,7 +1966,7 @@ Se não fizer isso, a permissão será bloqueada pelas configurações de privac
<translation id="5838278095973806738">É recomendado não fornecer informações confidenciais a esse site (por exemplo, senhas ou cartões de crédito), porque elas podem ser roubadas por invasores.</translation>
<translation id="5851548754964597211">Lista de guias</translation>
<translation id="5852909432155870672">RA4</translation>
-<translation id="5860033963881614850">Desativado</translation>
+<translation id="5860033963881614850">Desativada</translation>
<translation id="5862579898803147654">Empilhador 8</translation>
<translation id="5863847714970149516">A página que você está prestes a acessar pode tentar cobrar pagamentos</translation>
<translation id="5866257070973731571">Adicione um Número de Telefone</translation>
@@ -2286,7 +2286,7 @@ Se não fizer isso, a permissão será bloqueada pelas configurações de privac
<translation id="6687335167692595844">Tamanho da fonte solicitado</translation>
<translation id="6687696737818665306">Atuação e teatro</translation>
<translation id="6688743156324860098">Atualizar…</translation>
-<translation id="6688775486821967877">O cartão virtual não está disponível no momento. Tente novamente mais tarde</translation>
+<translation id="6688775486821967877">O cartão virtual não está disponível no momento. Tente de novo mais tarde.</translation>
<translation id="6689249931105087298">Relativa com compressão de pontos pretos</translation>
<translation id="6689271823431384964">A opção de salvar seus cartões na Conta do Google está disponível no Chrome porque você fez login. É possível alterar esse comportamento nas configurações. O nome do titular do cartão vem da sua conta.</translation>
<translation id="6694681292321232194"><ph name="FIND_MY_PHONE_FOCUSED_FRIENDLY_MATCH_TEXT" />. Pressione Tab e depois Enter" para encontrar seu dispositivo com a Conta do Google</translation>
@@ -3001,7 +3001,7 @@ Mais detalhes:
<translation id="8398335999901363925">Formas de pagamento disponíveis para preenchimento com um toque abertas na altura máxima.</translation>
<translation id="8398790343843005537">Encontrar seu smartphone</translation>
<translation id="8405579342203358118">Gerencie quais informações são sincronizadas nas configurações do Chrome</translation>
-<translation id="8406071103346257942">Parar de usar o bloqueio de tela para preencher senhas</translation>
+<translation id="8406071103346257942">parar de usar o bloqueio de tela para preencher senhas</translation>
<translation id="8409413588194360210">gerenciadores de pagamento</translation>
<translation id="8412145213513410671">Falhas (<ph name="CRASH_COUNT" />)</translation>
<translation id="8412392972487953978">Você deve inserir a mesma senha duas vezes.</translation>
diff --git a/chromium/components/strings/components_strings_ru.xtb b/chromium/components/strings/components_strings_ru.xtb
index 38d87de47cd..4068f15d96e 100644
--- a/chromium/components/strings/components_strings_ru.xtb
+++ b/chromium/components/strings/components_strings_ru.xtb
@@ -540,7 +540,7 @@
<translation id="2239100178324503013">Отправить</translation>
<translation id="2241693394036365668">Скачан файл</translation>
<translation id="2246264294482514010">10 x 12 дюймов</translation>
-<translation id="2246480341630108201">Твой родитель пока не одобрил этот сайт</translation>
+<translation id="2246480341630108201">Твой родитель пока не одобрил этот сайт.</translation>
<translation id="2247789808226901522">Срок действия карты истек</translation>
<translation id="2248949050832152960">Использовать WebAuthn</translation>
<translation id="2250931979407627383">Скобы по левому краю</translation>
@@ -2159,7 +2159,7 @@
<translation id="6340739886198108203">Администратор не рекомендует делать снимки и видеозаписи экрана, когда на нем показаны конфиденциальные данные:</translation>
<translation id="6341434961864773665">{0,plural, =1{Администратор не рекомендует загружать этот файл на <ph name="DESTINATION_NAME" />.}one{Администратор не рекомендует загружать эти файлы на <ph name="DESTINATION_NAME" />.}few{Администратор не рекомендует загружать эти файлы на <ph name="DESTINATION_NAME" />.}many{Администратор не рекомендует загружать эти файлы на <ph name="DESTINATION_NAME" />.}other{Администратор не рекомендует загружать эти файлы на <ph name="DESTINATION_NAME" />.}}</translation>
<translation id="6348220984832452017">Текущие изменения</translation>
-<translation id="6349101878882523185">Установить приложение "<ph name="APP_NAME" />"</translation>
+<translation id="6349101878882523185">Установите приложение "<ph name="APP_NAME" />"</translation>
<translation id="6353505687280762741">{COUNT,plural, =0{Нет}=1{1 пароль (для <ph name="DOMAIN_LIST" />, синхронизировано)}=2{2 пароля (для <ph name="DOMAIN_LIST" />, синхронизировано)}one{# пароль (для <ph name="DOMAIN_LIST" />, синхронизировано)}few{# пароля (для <ph name="DOMAIN_LIST" />, синхронизировано)}many{# паролей (для <ph name="DOMAIN_LIST" />, синхронизировано)}other{# пароля (для <ph name="DOMAIN_LIST" />, синхронизировано)}}</translation>
<translation id="6355392890578844978">Компания или организация не управляет этим браузером. Действиями на этом устройстве можно управлять вне браузера Chromium. <ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation>
<translation id="6358450015545214790">Что это значит?</translation>
@@ -2216,7 +2216,7 @@
<translation id="6468485451923838994">Шрифты</translation>
<translation id="647261751007945333">Правила устройства</translation>
<translation id="6475672344094591109">Сайты, которые вы посещаете, могут запрашивать у Chrome информацию для оценки эффективности рекламы. Chrome защищает вашу конфиденциальность, ограничивая данные, которыми сайты могут обмениваться друг с другом.</translation>
-<translation id="6476284679642588870">Управление способами оплаты</translation>
+<translation id="6476284679642588870">Настроить способы оплаты</translation>
<translation id="6486200200930923183">Документальные фильмы</translation>
<translation id="6489534406876378309">Начать загрузку сведений об ошибках</translation>
<translation id="6493924760403974580">Приложение доступно только в этом размере</translation>
diff --git a/chromium/components/strings/components_strings_sl.xtb b/chromium/components/strings/components_strings_sl.xtb
index e47760a751d..6eec154efe2 100644
--- a/chromium/components/strings/components_strings_sl.xtb
+++ b/chromium/components/strings/components_strings_sl.xtb
@@ -1567,7 +1567,7 @@ V nasprotnem primeru bodo to blokirale nastavitve zasebnosti. S tem bo vsebina,
<translation id="484462545196658690">Samodejno</translation>
<translation id="484671803914931257">Prejmite popust pri trgovcu <ph name="MERCHANT_NAME" /> in drugo</translation>
<translation id="484988093836683706">Uporabi odklepanje naprave</translation>
-<translation id="4850886885716139402">Pogled</translation>
+<translation id="4850886885716139402">Prikaži</translation>
<translation id="4852429274334674023">Operacijski sistemi</translation>
<translation id="485316830061041779">nemščina</translation>
<translation id="4853901935952445031">To spletno mesto po februarju 2022 ne bo moglo uporabljati API-ja za U2F. Če je spletno mesto vaše, spremenite tako, da bo uporabljalo API za spletno preverjanje pristnosti.</translation>
diff --git a/chromium/components/strings/components_strings_sr-Latn.xtb b/chromium/components/strings/components_strings_sr-Latn.xtb
index 6960e91c4d8..695332587b6 100644
--- a/chromium/components/strings/components_strings_sr-Latn.xtb
+++ b/chromium/components/strings/components_strings_sr-Latn.xtb
@@ -1441,7 +1441,7 @@ To inače blokiraju podešavanja privatnosti. To omogućava da sadržaj sa koji
<translation id="4526465106919207193">Ljudi i društvo</translation>
<translation id="4530347922939905757">SMS</translation>
<translation id="4531477351494678589">Broj virtuelne kartice:</translation>
-<translation id="4540780316273593836">Nešto nije u redu</translation>
+<translation id="4540780316273593836">Došlo je do greške</translation>
<translation id="4541810033354695636">proširena realnost</translation>
<translation id="4542971377163063093">6. fioka</translation>
<translation id="455113658016510503">A9</translation>
@@ -2298,7 +2298,7 @@ To inače blokiraju podešavanja privatnosti. To omogućava da sadržaj sa koji
<translation id="6710213216561001401">Prethodno</translation>
<translation id="6710594484020273272">&lt;Unesite termin za pretragu&gt;</translation>
<translation id="671076103358959139">Token za registraciju:</translation>
-<translation id="6711464428925977395">Nešto nije u redu sa proksi serverom ili je adresa netačna.</translation>
+<translation id="6711464428925977395">Došlo je do greške sa proksi serverom ili je adresa netačna.</translation>
<translation id="6716672519412350405"><ph name="URL" /> želi da pravi 3D mapu okruženja i da prati položaj kamere</translation>
<translation id="6718612893943028815">Dozvolićete korišćenje kamere?</translation>
<translation id="6721678857435001674">da vidi proizvođača i model bezbednosnog ključa</translation>
@@ -2541,7 +2541,7 @@ Dodatni detalji:
<translation id="7341357280245177602">Polovna vozila</translation>
<translation id="7346048084945669753">Povezan je:</translation>
<translation id="7349921148288539306">Dozvoljeno dok ne zatvorite ovu karticu</translation>
-<translation id="7352651011704765696">Nešto nije u redu</translation>
+<translation id="7352651011704765696">Došlo je do greške</translation>
<translation id="7353601530677266744">Komandna linija</translation>
<translation id="7354880545102894991">Jeftina putovanja i putovanja u poslednjem trenutku</translation>
<translation id="7359588939039777303">Oglasi su blokirani.</translation>
@@ -2608,7 +2608,7 @@ Dodatni detalji:
<translation id="7465963048299965912">10×13 in</translation>
<translation id="7469935732330206581">Obrazac nije bezbedan</translation>
<translation id="7473891865547856676">Ne, hvala</translation>
-<translation id="7481312909269577407">Prosledi</translation>
+<translation id="7481312909269577407">Napred</translation>
<translation id="7481603210197454575">Italijanska koverta</translation>
<translation id="7485870689360869515">Nisu pronađeni podaci.</translation>
<translation id="748745328507845862">Koncerti i muzički festivali</translation>
diff --git a/chromium/components/strings/components_strings_sr.xtb b/chromium/components/strings/components_strings_sr.xtb
index 2c84969a7e4..a712dc00022 100644
--- a/chromium/components/strings/components_strings_sr.xtb
+++ b/chromium/components/strings/components_strings_sr.xtb
@@ -1441,7 +1441,7 @@
<translation id="4526465106919207193">Људи и друштво</translation>
<translation id="4530347922939905757">SMS</translation>
<translation id="4531477351494678589">Број виртуелне картице:</translation>
-<translation id="4540780316273593836">Нешто није у реду</translation>
+<translation id="4540780316273593836">Дошло је до грешке</translation>
<translation id="4541810033354695636">проширена реалност</translation>
<translation id="4542971377163063093">6. фиока</translation>
<translation id="455113658016510503">A9</translation>
@@ -2298,7 +2298,7 @@
<translation id="6710213216561001401">Претходно</translation>
<translation id="6710594484020273272">&lt;Унесите термин за претрагу&gt;</translation>
<translation id="671076103358959139">Токен за регистрацију:</translation>
-<translation id="6711464428925977395">Нешто није у реду са прокси сервером или је адреса нетачна.</translation>
+<translation id="6711464428925977395">Дошло је до грешке са прокси сервером или је адреса нетачна.</translation>
<translation id="6716672519412350405"><ph name="URL" /> жели да прави 3D мапу окружења и да прати положај камере</translation>
<translation id="6718612893943028815">Дозволићете коришћење камере?</translation>
<translation id="6721678857435001674">да види произвођача и модел безбедносног кључа</translation>
@@ -2541,7 +2541,7 @@
<translation id="7341357280245177602">Половна возила</translation>
<translation id="7346048084945669753">Повезан је:</translation>
<translation id="7349921148288539306">Дозвољено док не затворите ову картицу</translation>
-<translation id="7352651011704765696">Нешто није у реду</translation>
+<translation id="7352651011704765696">Дошло је до грешке</translation>
<translation id="7353601530677266744">Командна линија</translation>
<translation id="7354880545102894991">Јефтина путовања и путовања у последњем тренутку</translation>
<translation id="7359588939039777303">Огласи су блокирани.</translation>
@@ -2608,7 +2608,7 @@
<translation id="7465963048299965912">10×13 in</translation>
<translation id="7469935732330206581">Образац није безбедан</translation>
<translation id="7473891865547856676">Не, хвала</translation>
-<translation id="7481312909269577407">Проследи</translation>
+<translation id="7481312909269577407">Напред</translation>
<translation id="7481603210197454575">Италијанска коверта</translation>
<translation id="7485870689360869515">Нису пронађени подаци.</translation>
<translation id="748745328507845862">Концерти и музички фестивали</translation>
diff --git a/chromium/components/strings/components_strings_sv.xtb b/chromium/components/strings/components_strings_sv.xtb
index f202eef04cb..73c49a0a66e 100644
--- a/chromium/components/strings/components_strings_sv.xtb
+++ b/chromium/components/strings/components_strings_sv.xtb
@@ -3001,7 +3001,7 @@ Mer information.
<translation id="8398335999901363925">De tillgängliga betalningsmetoderna som kan fyllas i med ett tryck har öppnats över hela skärmen.</translation>
<translation id="8398790343843005537">Sök efter mobilen</translation>
<translation id="8405579342203358118">Hantera vilken information som synkroniseras i inställningarna för Chrome</translation>
-<translation id="8406071103346257942">sluta använda skärmlåset för att fylla i lösenord.</translation>
+<translation id="8406071103346257942">sluta använda skärmlåset för att fylla i lösenord</translation>
<translation id="8409413588194360210">betalningshanterare</translation>
<translation id="8412145213513410671">Krascher (<ph name="CRASH_COUNT" />)</translation>
<translation id="8412392972487953978">Du måste ange samma lösenfras två gånger.</translation>
diff --git a/chromium/components/strings/components_strings_sw.xtb b/chromium/components/strings/components_strings_sw.xtb
index 67522cd5780..579be50b022 100644
--- a/chromium/components/strings/components_strings_sw.xtb
+++ b/chromium/components/strings/components_strings_sw.xtb
@@ -1979,7 +1979,7 @@ Usipoiruhusu, itazuiwa na mipangilio yako ya faragha. Hali hii itaruhusu maudhui
<translation id="5884465125445718607">Bahasha ya muundo wa Kichina ya ukubwa wa #6</translation>
<translation id="5887400589839399685">Kadi imehifadhiwa</translation>
<translation id="5887687176710214216">Ilitembelewa mara ya mwisho jana</translation>
-<translation id="5895138241574237353">Zzima na uwashe</translation>
+<translation id="5895138241574237353">Zima na uwashe</translation>
<translation id="5895187275912066135">Kilitolewa</translation>
<translation id="5901630391730855834">Manjano</translation>
<translation id="5903264686717710770">Kichwa:</translation>
diff --git a/chromium/components/strings/components_strings_te.xtb b/chromium/components/strings/components_strings_te.xtb
index 628240a2a4d..0c1c25c3421 100644
--- a/chromium/components/strings/components_strings_te.xtb
+++ b/chromium/components/strings/components_strings_te.xtb
@@ -87,7 +87,7 @@
<translation id="1195073053842921378">ఈ పరికరం నుండి ఈ అడ్రస్ తొలగించబడుతుంది</translation>
<translation id="1195558154361252544">మీరు అనుమతించినవి మినహా, ఇతర అన్ని సైట్‌లకు నోటిఫికేషన్‌లు ఆటోమేటిక్‌గా బ్లాక్ చేయబడ్డాయి</translation>
<translation id="1197088940767939838">నారింజ రంగు</translation>
-<translation id="1201402288615127009">తరువాత</translation>
+<translation id="1201402288615127009">తర్వాత</translation>
<translation id="1201895884277373915">ఈ సైట్ నుండి మరికొన్ని</translation>
<translation id="1202892408424955784">ట్రాక్ చేసిన ప్రోడక్ట్‌లు</translation>
<translation id="1204602502194308272">చేపలు &amp; అక్వేరియా</translation>
@@ -548,7 +548,7 @@
<translation id="2250931979407627383">ఎడమవైపు కుట్టిన అంచు</translation>
<translation id="225207911366869382">ఈ విధానం కోసం ఈ విలువ విస్మరించబడింది.</translation>
<translation id="2256115617011615191">ఇప్పుడే పునఃప్రారంభించు</translation>
-<translation id="2258928405015593961">భవిష్యత్తులోని గడువు ముగింపు తేదీని నమోదు చేసి, మళ్లీ ప్రయత్నించండి</translation>
+<translation id="2258928405015593961">భవిష్యత్తులోని గడువు ముగింపు తేదీని నమోదు చేసి, మళ్లీ ట్రై చేయండి</translation>
<translation id="225943865679747347">ఎర్రర్ కోడ్: <ph name="ERROR_CODE" /></translation>
<translation id="2262243747453050782">HTTP ఎర్రర్</translation>
<translation id="226481340855943334">సంతతి &amp; వంశ పరిణామ క్రమం</translation>
@@ -1015,7 +1015,7 @@
<translation id="3487845404393360112">ట్రే 4</translation>
<translation id="3495081129428749620">పేజీలో కనుగొనండి
<ph name="PAGE_TITLE" /></translation>
-<translation id="3498215018399854026">మేము ప్రస్తుతం మీ తల్లి/తండ్రిని సంప్రదించలేకపోయాము. దయచేసి మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="3498215018399854026">మేము ప్రస్తుతం మీ తల్లి/తండ్రిని సంప్రదించలేకపోయాము. దయచేసి మళ్లీ ట్రై చేయండి.</translation>
<translation id="350069200438440499">ఫైల్ పేరు:</translation>
<translation id="3507936815618196901">మీ పరిసరాల 3D మ్యాప్‌ను రూపొందించడం, అలాగే కెమెరా పొజిషన్‌ను ట్రాక్ చేయడం</translation>
<translation id="3512163584740124171">ఈ విధానం విస్మరించబడుతుంది, ఎందుకంటే ఒకే విధాన గ్రూప్‌ నుండి మరొక విధానం అధిక ప్రాధాన్యతను కలిగి ఉంది.</translation>
@@ -1233,7 +1233,7 @@
<translation id="4067947977115446013">చెల్లుబాటు అయ్యే అడ్రస్‌ను జోడించండి</translation>
<translation id="4070790659619547722">యాడ్ మెజర్‌మెంట్‌ ద్వారా, యాప్‌లకు సంబంధించిన యాడ్‌ల పనితీరును కొలవడానికి సదరు యాప్‌ల మధ్య పరిమితంగా కొన్ని రకాల డేటా షేర్ చేయబడుతుంది. ఉదాహరణకు మీకు రోజులో ఎప్పుడు యాడ్ చూపబడింది మొదలైనవి.</translation>
<translation id="4072193657607981494">పాలసీలను లోడ్ చేస్తోంది</translation>
-<translation id="4072486802667267160">మీ ఆర్డర్‌ను ప్రాసెస్ చేస్తున్నప్పుడు ఎర్రర్ ఏర్పడింది. దయచేసి మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="4072486802667267160">మీ ఆర్డర్‌ను ప్రాసెస్ చేస్తున్నప్పుడు ఎర్రర్ ఏర్పడింది. దయచేసి మళ్లీ ట్రై చేయండి.</translation>
<translation id="4073376909608563327">పరికర లాక్‌ను ఉపయోగించడం సాధ్యపడలేదు</translation>
<translation id="4073797364926776829">కార్డ్‌ను చూడండి</translation>
<translation id="4075732493274867456">క్లయింట్, సర్వర్- ఒకే SSL ప్రోటోకాల్ వెర్షన్‌ లేదా సైఫర్ సూట్‌కు మద్దతు ఇవ్వవు.</translation>
@@ -1335,7 +1335,7 @@
<translation id="4270541775497538019">స్టాకర్ 6</translation>
<translation id="4274173425554582601">కంప్యూటర్‌లు &amp; ఎలక్ట్రానిక్స్</translation>
<translation id="4275830172053184480">మీ పరికరాన్ని పునఃప్రారంభించండి</translation>
-<translation id="4277028893293644418">పాస్‌వర్డ్‌ను రీసెట్ చేయి</translation>
+<translation id="4277028893293644418">పాస్‌వర్డ్‌ను రీసెట్ చేయండి</translation>
<translation id="4278390842282768270">అనుమతించబడింది</translation>
<translation id="4281998142035485137">{0,plural, =1{గోప్యమైన ఫైల్‌ను తెరవాలా?}other{గోప్యమైన ఫైల్స్‌ను తెరవాలా?}}</translation>
<translation id="4282346679996504092">ఈ ప్రోడక్ట్‌కి సంబంధించిన హెచ్చరికలు ఆఫ్ చేయబడ్డాయి, బుక్‌మార్క్ తీసివేయబడింది</translation>
@@ -1362,7 +1362,7 @@
<translation id="4318566738941496689">మీ పరికరం పేరు, నెట్‌వర్క్ అడ్రస్‌</translation>
<translation id="4325600325087822253">ట్రే 17</translation>
<translation id="4325863107915753736">కథనాన్ని కనుగొనడం విఫలమైంది</translation>
-<translation id="4326324639298822553">మీ గడువు ముగింపు తేదీని చెక్ చేసి, మళ్లీ ప్రయత్నించండి</translation>
+<translation id="4326324639298822553">మీ గడువు ముగింపు తేదీని చెక్ చేసి, మళ్లీ ట్రై చేయండి</translation>
<translation id="4329657820650401545">ఎన్వలప్ C0</translation>
<translation id="4329871760342656885">పాలసీని అన్వయించడంలో ఎర్రర్: <ph name="ERROR" /></translation>
<translation id="4331519897422864041">స్టాకర్ 5</translation>
@@ -1551,7 +1551,7 @@
<translation id="4796594887379589189">జాబ్ ఖాతా ID</translation>
<translation id="4798078619018708837">మీ కార్డ్ వివరాలను అప్‌డేట్ చేయడానికి <ph name="CREDIT_CARD" /> కార్డ్ గడువు ముగింపు తేదీ, CVCని నమోదు చేయండి. మీరు నిర్ధారించిన తర్వాత, మీ Google ఖాతా నుండి కార్డ్ వివరాలు ఈ సైట్‌తో షేర్ చేయబడతాయి.</translation>
<translation id="4798269756263412078">ఏదైనా సైట్‌లో ధర తగ్గితే అలర్ట్‌లు పొందండి. మీ ఈమెయిల్‌కు హెచ్చరికలు పంపబడతాయి.</translation>
-<translation id="4800132727771399293">మీ గడువు ముగింపు తేదీ మరియు CVCని చెక్ చేసి, మళ్లీ ప్రయత్నించండి</translation>
+<translation id="4800132727771399293">మీ గడువు ముగింపు తేదీ మరియు CVCని చెక్ చేసి, మళ్లీ ట్రై చేయండి</translation>
<translation id="4803924862070940586"><ph name="CURRENCY_CODE" /> <ph name="FORMATTED_TOTAL_AMOUNT" /></translation>
<translation id="4809079943450490359">మీ పరికర అడ్మినిస్ట్రేట‌ర్ నుండి సూచనలు:</translation>
<translation id="4811450222531576619">సోర్స్, టాపిక్ గురించి తెలుసుకోండి</translation>
@@ -1870,7 +1870,7 @@
<translation id="5572434905385510939">22 x 28 అంగుళాలు</translation>
<translation id="5572851009514199876">దయచేసి Chromeను ప్రారంభించి, దానికి సైన్ ఇన్ చేయండి, అప్పుడు ఈ సైట్‌ను యాక్సెస్ చేయడానికి మీకు అనుమతి ఉందో లేదో Chrome తనిఖీ చేయగలదు.</translation>
<translation id="557886905979275351">రేజర్లు &amp; షేవర్‌లు</translation>
-<translation id="5580958916614886209">మీ గడువు ముగింపు నెలను చెక్ చేసి, మళ్లీ ప్రయత్నించండి</translation>
+<translation id="5580958916614886209">మీ గడువు ముగింపు నెలను చెక్ చేసి, మళ్లీ ట్రై చేయండి</translation>
<translation id="558420943003240152">పాస్‌వర్డ్‌లను, పాస్-కీలను మేనేజ్ చేయండి…</translation>
<translation id="5586446728396275693">సేవ్ చేయబడిన అడ్రస్‌లు లేవు</translation>
<translation id="5586831831248371458"><ph name="KEYWORD_SUFFIX" />ని వెతకండి</translation>
@@ -1947,7 +1947,7 @@
<translation id="5781136890105823427">ప్రయోగం ప్రారంభించబడింది</translation>
<translation id="578305955206182703">కాషాయ రంగు</translation>
<translation id="57838592816432529">మ్యూట్ చేయి</translation>
-<translation id="5784606427469807560">మీ కార్డ్‌ను నిర్ధారించడంలో సమస్య ఏర్పడింది. మీ ఇంటర్నెట్ కనెక్షన్‌ని చెక్ చేసి, మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="5784606427469807560">మీ కార్డ్‌ను నిర్ధారించడంలో సమస్య ఏర్పడింది. మీ ఇంటర్నెట్ కనెక్షన్‌ని చెక్ చేసి, మళ్లీ ట్రై చేయండి.</translation>
<translation id="5785756445106461925">అలాగే, ఈ పేజీలో సురక్షితం కాని ఇతర వనరులు ఉన్నాయి. ఈ వనరులను బదిలీ చేస్తున్నప్పుడు ఇతరులు చూడగలరు మరియు దాడికి పాల్పడేవారు పేజీ రూపాన్ని మార్చేలా వీటిని ఎడిట్ చేయగలరు.</translation>
<translation id="5786044859038896871">మీరు మీ కార్డ్ సమాచారం పూరించాలనుకుంటున్నారా?</translation>
<translation id="578633867165174378">డేటా ఉల్లంఘనలో మీరు ఇప్పుడే ఉపయోగించిన పాస్‌వర్డ్‌ను Chrome కనుగొనింది. ఇప్పుడే ఈ పాస్‌వర్డ్‌ను మార్చమని మేము సిఫార్సు చేస్తున్నాము.</translation>
@@ -2386,7 +2386,7 @@
<translation id="6948874830249067134">A1x3</translation>
<translation id="6949872517221025916">పాస్‌వర్డ్‌ను రీసెట్ చేయండి</translation>
<translation id="6950684638814147129">JSON విలువను అన్వయిస్తుండగా ఎర్రర్ ఏర్పడింది: <ph name="ERROR" /></translation>
-<translation id="695140971690006676">అన్నీ రీసెట్ చేయి</translation>
+<translation id="695140971690006676">అన్నీ రీసెట్ చేయండి</translation>
<translation id="6954049078461159956">హాకీ</translation>
<translation id="6957887021205513506">సర్వర్ ధృవీకరణ డాక్యుమెంట్‌ చెల్లదు.</translation>
<translation id="6958564499836457428">మీ Google ఖాతాలో Google గోప్యతా సెట్టింగ్‌లను మేనేజ్ చేయండి</translation>
@@ -2606,7 +2606,7 @@
<translation id="7451311239929941790">ఈ సమస్య గురించి <ph name="BEGIN_LINK" />మరింత తెలుసుకోండి<ph name="END_LINK" />.</translation>
<translation id="7455133967321480974">సార్వజనీన డిఫాల్ట్‌ను ఉపయోగించండి (బ్లాక్ చేయండి)</translation>
<translation id="745640750744109667">A0x3</translation>
-<translation id="7461924472993315131">పిన్ చేయి</translation>
+<translation id="7461924472993315131">పిన్ చేయండి</translation>
<translation id="7463075493919226237">ఆస్ట్రేలియన్ ఫుట్‌బాల్</translation>
<translation id="7465963048299965912">10 x 13 అంగుళాలు</translation>
<translation id="7469935732330206581">ఫారమ్ సురక్షితమైనది కాదు</translation>
@@ -2793,7 +2793,7 @@
<translation id="7880146494886811634">అడ్రస్‌ను సేవ్ చేయండి</translation>
<translation id="7882421473871500483">గోధుమ రంగు</translation>
<translation id="7882995332186050355">సరుకు రవాణా చేసే ట్రక్కులు &amp; ట్రయిలర్‌లు</translation>
-<translation id="7887683347370398519">మీ CVCని చెక్ చేసి, మళ్లీ ప్రయత్నించండి</translation>
+<translation id="7887683347370398519">మీ CVCని చెక్ చేసి, మళ్లీ ట్రై చేయండి</translation>
<translation id="7887885240995164102">చిత్రంలో చిత్రం మోడ్‌లోకి ప్రవేశిస్తుంది</translation>
<translation id="7888575728750733395">ప్రింట్ రెండరింగ్ ఇంటెంట్</translation>
<translation id="7894280532028510793">స్పెల్లింగ్ సరైనది అయితే, <ph name="BEGIN_LINK" />నెట్‌వర్క్ సమస్య విశ్లేషణలను రన్ చేయడానికి ట్రై చేయండి<ph name="END_LINK" />.</translation>
@@ -2813,7 +2813,7 @@
<translation id="7943397946612013052">డౌన్‌లోడ్ చేయకుండా బ్లాక్ చేయబడింది</translation>
<translation id="7943893128817522649">అనేక ఫైళ్లను ఆటోమేటిక్‌గా డౌన్‌లోడ్ చేయడానికి సైట్ అనుమతి అడగవచ్చు</translation>
<translation id="7946724693008564269">గుర్తించబడిన భాష</translation>
-<translation id="7947285636476623132">మీ గడువు ముగింపు సంవత్సరాన్ని చెక్ చేసి, మళ్లీ ప్రయత్నించండి</translation>
+<translation id="7947285636476623132">మీ గడువు ముగింపు సంవత్సరాన్ని చెక్ చేసి, మళ్లీ ట్రై చేయండి</translation>
<translation id="7947813448670013867"><ph name="SEE_CHROME_TIPS_FOCUSED_FRIENDLY_MATCH_TEXT" />, Chrome ఫీచర్‌ల గురించి తెలుసుకోవడానికి Tabను నొక్కి, ఆపై Enterను నొక్కండి</translation>
<translation id="7950027195171824198">Chrome సెట్టింగ్‌లలో మీ కుక్కీ ప్రాధాన్యతలను మేనేజ్ చేయండి</translation>
<translation id="7951415247503192394">(32-బిట్)</translation>
@@ -2845,7 +2845,7 @@
<translation id="8009225694047762179">పాస్‌వర్డ్‌లను నిర్వహించండి</translation>
<translation id="8009843239480947060">10 x 11 అంగుళాలు</translation>
<translation id="8012116502927253373">{NUM_CARDS,plural, =1{ఈ కార్డ్, దీని బిల్లింగ్ అడ్రస్‌ సేవ్ చేయబడతాయి. <ph name="USER_EMAIL" />కు సైన్ ఇన్ చేసినప్పుడు మీరు దీనిని ఉపయోగించగలరు.}other{ఈ కార్డ్‌లు, వీటి బిల్లింగ్ అడ్రస్‌లు సేవ్ చేయబడతాయి. <ph name="USER_EMAIL" />కు సైన్ ఇన్ చేసినప్పడు, మీరు వీటిని ఉపయోగించగలరు.}}</translation>
-<translation id="8012647001091218357">మేము ప్రస్తుతం మీ తల్లిదండ్రులను సంప్రదించలేకపోయాము. దయచేసి మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="8012647001091218357">మేము ప్రస్తుతం మీ తల్లిదండ్రులను సంప్రదించలేకపోయాము. దయచేసి మళ్లీ ట్రై చేయండి.</translation>
<translation id="8019861005170389898"><ph name="TRADITIONAL_TEXT" /> (<ph name="ADDITIONAL_TEXT" />)</translation>
<translation id="8023231537967344568"><ph name="SET_CHROME_AS_DEFAULT_BROWSER_FOCUSED_FRIENDLY_MATCH_TEXT" />, Chromeను సిస్టమ్ ఆటోమేటిక్ బ్రౌజర్‌గా సెట్ చేయడానికి tabను నొక్కి, ఆపై Enterను నొక్కండి</translation>
<translation id="8025119109950072390">ఈ సైట్‌లోని దాడి చేసే వారు సాఫ్ట్‌వేర్‌ను ఇన్‌స్టాల్ చేయడం లేదా మీ వ్యక్తిగత సమాచారాన్ని (ఉదాహరణకు, పాస్‌వర్డ్‌లు, ఫోన్ నంబర్‌లు లేదా క్రెడిట్ కార్డ్‌లు) వెల్లడించడం వంటి ప్రమాదకరమైన పనులు చేసేలా మిమ్మల్ని మాయ చేయవచ్చు.</translation>
@@ -3130,7 +3130,7 @@
<translation id="8740359287975076522"><ph name="HOST_NAME" /> &lt;abbr id="dnsDefinition"&gt;DNS అడ్రస్‌&lt;/abbr&gt; కనుగొనబడలేదు. సమస్యను నిర్ధారిస్తోంది.</translation>
<translation id="8742371904523228557"><ph name="ORIGIN" /> కోసం మీ కోడ్ <ph name="ONE_TIME_CODE" /></translation>
<translation id="874918643257405732">ఈ ట్యాబ్‌ను బుక్‌మార్క్ చేయండి</translation>
-<translation id="8751426954251315517">దయచేసి తర్వాత మళ్లీ ప్రయత్నించండి</translation>
+<translation id="8751426954251315517">దయచేసి తర్వాత మళ్లీ ట్రై చేయండి</translation>
<translation id="8753913772043329557">పాలసీ లాగ్‌లు</translation>
<translation id="8755125092386286553">A4x9</translation>
<translation id="8757526089434340176">Google Pay ఆఫర్ అందుబాటులో ఉంది</translation>
diff --git a/chromium/components/strings/components_strings_th.xtb b/chromium/components/strings/components_strings_th.xtb
index 144a0747c3a..414206e2cbc 100644
--- a/chromium/components/strings/components_strings_th.xtb
+++ b/chromium/components/strings/components_strings_th.xtb
@@ -754,7 +754,7 @@
<translation id="2824775600643448204">ที่อยู่และแถบค้นหา</translation>
<translation id="2826760142808435982">การเชื่อมต่อถูกเข้ารหัสและรับรองความถูกต้องโดยใช้ <ph name="CIPHER" /> และใช้ <ph name="KX" /> เป็นกลไกการแลกเปลี่ยนคีย์</translation>
<translation id="2835170189407361413">ล้างฟอร์ม</translation>
-<translation id="2839032553903800133">บล็อกการแจ้งเตือนอยู่</translation>
+<translation id="2839032553903800133">การแจ้งเตือนถูกบล็อก</translation>
<translation id="2839501879576190149">ระวังเว็บไซต์หลอกลวง</translation>
<translation id="2851291081585704741">คุณออฟไลน์อยู่</translation>
<translation id="2851634818064021665">คุณต้องได้รับสิทธิ์เพื่อเข้าชมเว็บไซต์นี้</translation>
@@ -1937,7 +1937,7 @@
<translation id="5764725887548570807">รูปแบบต้นทางไม่ถูกต้อง</translation>
<translation id="5764920692828389743">ส่งไปยัง <ph name="EMAIL_ADDRESS" /></translation>
<translation id="5765072501007116331">หากต้องการดูวิธีการนำส่งสินค้าและข้อกำหนด โปรดเลือกที่อยู่</translation>
-<translation id="57689295674415555">ไม่กรอกหมายเลขบัตรเสมือนใช่ไหม</translation>
+<translation id="57689295674415555">หมายเลขบัตรเสมือนไม่ได้รับการกรอกใช่ไหม</translation>
<translation id="5772086939108830423">ใช้พาสคีย์ในอุปกรณ์อื่น</translation>
<translation id="5776313857861697733">ลำดับความสำคัญ</translation>
<translation id="5776574724412881956">ระบบไม่ได้กรอกบัตรเสมือนใช่ไหม คลิกรายละเอียดบัตรเสมือนเพื่อคัดลอกไปยังคลิปบอร์ด <ph name="IDS_AUTOFILL_VIRTUAL_CARD_MANUAL_FALLBACK_BUBBLE_LEARN_MORE_LINK_LABEL" /></translation>
@@ -2966,7 +2966,7 @@
<translation id="829335040383910391">เสียง</translation>
<translation id="8294431847097064396">แหล่งที่มา</translation>
<translation id="8296205692406981542">อุทยานและสวนระดับเมือง</translation>
-<translation id="8297545700510100061">คุกกี้และข้อมูลเว็บไซต์อื่นๆ ใช้ในการจดจำคุณ เช่น เพื่อลงชื่อเข้าใช้หรือปรับโฆษณาตามโปรไฟล์ของคุณ ดู<ph name="SETTINGS" />เพื่อจัดการคุกกี้สำหรับทุกเว็บไซต์</translation>
+<translation id="8297545700510100061">ระบบจะใช้คุกกี้และข้อมูลอื่นของเว็บไซต์ในการจดจำคุณ เช่น เพื่อลงชื่อเข้าใช้หรือปรับโฆษณาตามโปรไฟล์ของคุณ ดู<ph name="SETTINGS" />เพื่อจัดการคุกกี้สำหรับทุกเว็บไซต์</translation>
<translation id="8298115750975731693">Wi-Fi ที่คุณใช้ (<ph name="WIFI_NAME" />) อาจต้องการให้คุณไปที่ <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /></translation>
<translation id="8299269255470343364">ญี่ปุ่น</translation>
<translation id="8303854710873047864">แสดงส่วน "<ph name="SECTION" />"</translation>
diff --git a/chromium/components/strings/components_strings_tr.xtb b/chromium/components/strings/components_strings_tr.xtb
index e7eaabd7e31..678278e1cd8 100644
--- a/chromium/components/strings/components_strings_tr.xtb
+++ b/chromium/components/strings/components_strings_tr.xtb
@@ -734,7 +734,7 @@ Aksi halde bu işlem gizlilik ayarlarınız tarafından engellenecek. Buna izin
<translation id="2740531572673183784">Tamam</translation>
<translation id="2742511345840685325">Masa tenisi</translation>
<translation id="2742870351467570537">Seçilen öğeleri sil</translation>
-<translation id="2759825833388495838"><ph name="APP_NAME" /> adresinde şifrenizi doldurma</translation>
+<translation id="2759825833388495838"><ph name="APP_NAME" /> uygulamasında şifrenizi doldurmak</translation>
<translation id="2764001903315068341">Çizgi romanlar</translation>
<translation id="2765217105034171413">Küçük</translation>
<translation id="277133753123645258">Gönderim yöntemi</translation>
@@ -768,7 +768,7 @@ Aksi halde bu işlem gizlilik ayarlarınız tarafından engellenecek. Buna izin
<translation id="2876949457278336305"><ph name="MANAGE_SECURITY_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, Chrome ayarlarında Güvenli Tarama ve diğer özellikleri yönetmek için Sekme'ye, ardından Enter'a basın</translation>
<translation id="2878197950673342043">Poster katlama</translation>
<translation id="2878424575911748999">A1</translation>
-<translation id="2879694782644540289">şifreleri doldurmak için ekran kilidinizi kullanma</translation>
+<translation id="2879694782644540289">şifreleri doldurmak için ekran kilidinizi kullanmak</translation>
<translation id="2881276955470682203">Kart kaydedilsin mi?</translation>
<translation id="2882949212241984732">İki kırımlı katlama</translation>
<translation id="2893773853358652045">Dördüncü Rulo</translation>
@@ -1693,7 +1693,7 @@ Aksi halde bu işlem gizlilik ayarlarınız tarafından engellenecek. Buna izin
<translation id="5129534298163637277">Onay iletişim kutusu</translation>
<translation id="5135404736266831032">Adresleri yönet...</translation>
<translation id="5136841603454277753">Doğru kodu girin</translation>
-<translation id="5138014172396933048">Sanal kart şu anda kullanılamıyor. Lütfen bankanızla iletişim kurun</translation>
+<translation id="5138014172396933048">Sanal kart şu anda kullanılamıyor. Lütfen bankanızla iletişim kurun.</translation>
<translation id="5138227688689900538">Daha az göster</translation>
<translation id="5145883236150621069">Politika yanıtında hata kodu var</translation>
<translation id="5146995429444047494"><ph name="ORIGIN" /> için bildirimler engellendi</translation>
@@ -2286,7 +2286,7 @@ Aksi halde bu işlem gizlilik ayarlarınız tarafından engellenecek. Buna izin
<translation id="6687335167692595844">Yazı tipi boyutu istendi</translation>
<translation id="6687696737818665306">Oyunculuk ve tiyatro</translation>
<translation id="6688743156324860098">Güncelle…</translation>
-<translation id="6688775486821967877">Sanal kart şu anda kullanılamıyor. Lütfen daha sonra tekrar deneyin</translation>
+<translation id="6688775486821967877">Sanal kart şu anda kullanılamıyor. Lütfen daha sonra tekrar deneyin.</translation>
<translation id="6689249931105087298">Siyah nokta sıkıştırma ile göreli</translation>
<translation id="6689271823431384964">Chrome, oturumunuz açık olduğu için kartlarınızı Google Hesabınıza kaydetmeyi öneriyor. Bu davranışı ayarlardan değiştirebilirsiniz. Kart sahibinin adı hesabınızdan gelir.</translation>
<translation id="6694681292321232194"><ph name="FIND_MY_PHONE_FOCUSED_FRIENDLY_MATCH_TEXT" />, Google Hesabı'nda cihazınızı bulmak için Sekme'ye, ardından Enter'a basın</translation>
@@ -2967,7 +2967,7 @@ Ek ayrıntılar:
<translation id="829335040383910391">ses</translation>
<translation id="8294431847097064396">Kaynak</translation>
<translation id="8296205692406981542">Bölgesel parklar ve bahçeler</translation>
-<translation id="8297545700510100061">Çerezler ve diğer site verileri sizi hatırlamamız için kullanılır, örneğin oturumunuzu açmak veya reklamları kişiselleştirmek için. Çerezlerin tüm siteler için nasıl yönetileceğini <ph name="SETTINGS" /> sayfasından öğrenebilirsiniz.</translation>
+<translation id="8297545700510100061">Çerezler ve diğer site verileri sizi hatırlamak için kullanılır, örneğin oturumunuzu açmak veya reklamları kişiselleştirmek için. Çerezlerin tüm siteler için nasıl yönetileceğini <ph name="SETTINGS" /> sayfasından öğrenebilirsiniz.</translation>
<translation id="8298115750975731693">Kullandığınız kablosuz bağlantı ağı (<ph name="WIFI_NAME" />) <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /> adresini ziyaret etmenizi gerektiriyor olabilir.</translation>
<translation id="8299269255470343364">Japonca</translation>
<translation id="8303854710873047864">"<ph name="SECTION" />" bölümü gösterildi</translation>
@@ -2990,7 +2990,7 @@ Ek ayrıntılar:
<translation id="836616551641291797">Tarayıcınızın nasıl yönetildiği hakkında daha fazla bilgi</translation>
<translation id="8368001212524806591">Fiyatı takip et</translation>
<translation id="8368027906805972958">Bilinmeyen veya desteklenmeyen cihaz (<ph name="DEVICE_ID" />)</translation>
-<translation id="8368476060205742148">Google Play hizmetleri</translation>
+<translation id="8368476060205742148">Google Play Hizmetleri</translation>
<translation id="8369073279043109617">Yeni kod al</translation>
<translation id="8371889962595521444">Özel kök sertifikalar</translation>
<translation id="8374636051559112948">Değişkenlik gösterir</translation>
@@ -3001,7 +3001,7 @@ Ek ayrıntılar:
<translation id="8398335999901363925">Dokunarak doldurulabilen ödeme yöntemleri tam ekranda açıldı.</translation>
<translation id="8398790343843005537">Telefonunuzu bulun</translation>
<translation id="8405579342203358118">Chrome ayarlarında hangi bilgileri senkronize ettiğinizi yönetin</translation>
-<translation id="8406071103346257942">şifreleri doldurmak için ekran kilidinizi kullanmayı bırakma</translation>
+<translation id="8406071103346257942">şifreleri doldurmak için ekran kilidinizi kullanmayı bırakmak</translation>
<translation id="8409413588194360210">ödeme işleyiciler</translation>
<translation id="8412145213513410671">Kilitlenme Sayısı (<ph name="CRASH_COUNT" />)</translation>
<translation id="8412392972487953978">Aynı parolayı iki kez girmelisiniz.</translation>
@@ -3113,7 +3113,7 @@ Ek ayrıntılar:
<translation id="8718314106902482036">Ödeme işlemi tamamlanmadı</translation>
<translation id="8719263113926255150"><ph name="ENTITY" />, <ph name="DESCRIPTION" />, arama önerisi</translation>
<translation id="8719528812645237045">Üstte çoklu delik</translation>
-<translation id="8723535127346307411">Doğrulama Kodunu Girin</translation>
+<translation id="8723535127346307411">Doğrulama kodunu girin</translation>
<translation id="8724824364712796726">Zarf B6</translation>
<translation id="8725066075913043281">Yeniden dene</translation>
<translation id="8726549941689275341">Sayfa boyutu:</translation>
diff --git a/chromium/components/strings/components_strings_uz.xtb b/chromium/components/strings/components_strings_uz.xtb
index 392de608db6..11a9713f342 100644
--- a/chromium/components/strings/components_strings_uz.xtb
+++ b/chromium/components/strings/components_strings_uz.xtb
@@ -1643,7 +1643,7 @@ Aks holda bu maxfiylik sozlamalaringiz tomonidan bloklanadi. Bunda siz ochgan sa
<translation id="503498442187459473"><ph name="HOST" /> kamera va mikrofoningizdan foydalanishni istaydi</translation>
<translation id="5035135400558156732">Bogʻdorchilik</translation>
<translation id="503574301575803523">SRA3</translation>
-<translation id="5039762155821394373">Shrift oʻlchami</translation>
+<translation id="5039762155821394373">Shrift hajmi</translation>
<translation id="5039804452771397117">Ruxsat berish</translation>
<translation id="5040262127954254034">Shaxsiy ma’lumotlar</translation>
<translation id="5043480802608081735">Nusxalangan havola</translation>
@@ -2277,7 +2277,7 @@ Aks holda bu maxfiylik sozlamalaringiz tomonidan bloklanadi. Bunda siz ochgan sa
<translation id="6668389483194953109">“custom” qogʻoz oʻlchami topildi, lekin custom_size xususiyati boʻsh yoki yaroqsiz.</translation>
<translation id="6671697161687535275">Bu taklif Chromium’dan o‘chirib tashlansinmi?</translation>
<translation id="6683717648675961851">Boʻsh ish oʻrinlari</translation>
-<translation id="6687335167692595844">Shrift oʻlchami talab qilindi</translation>
+<translation id="6687335167692595844">Shrift hajmi zarur</translation>
<translation id="6687696737818665306">Aktyorlik sanʼati va teatr</translation>
<translation id="6688743156324860098">Yangilash…</translation>
<translation id="6688775486821967877">Hozirda virtual karta mavjud emas. Keyinroq qayta urining</translation>
diff --git a/chromium/components/strings/components_strings_vi.xtb b/chromium/components/strings/components_strings_vi.xtb
index 2646bd38bad..ae34eb7fac7 100644
--- a/chromium/components/strings/components_strings_vi.xtb
+++ b/chromium/components/strings/components_strings_vi.xtb
@@ -62,7 +62,7 @@
<translation id="112840717907525620">Bộ nhớ đệm chính sách OK</translation>
<translation id="1130564665089811311">Nút Dịch trang, nhấn phím Enter để dịch trang này bằng Google Dịch</translation>
<translation id="1131264053432022307">Hình ảnh bạn đã sao chép</translation>
-<translation id="1142846828089312304">Chặn cookie của bên thứ ba ở Chế độ ẩn danh</translation>
+<translation id="1142846828089312304">Chặn cookie của bên thứ ba ở chế độ Ẩn danh</translation>
<translation id="1147769322402934017">Thư viện ảnh trực tuyến</translation>
<translation id="1150979032973867961">Máy chủ này không chứng minh được rằng đó là <ph name="DOMAIN" />; chứng chỉ bảo mật của máy chủ này không được hệ điều hành máy tính của bạn tin cậy. Điều này có thể do định cấu hình sai hoặc có kẻ tấn công chặn kết nối của bạn.</translation>
<translation id="1151972924205500581">Mật khẩu bắt buộc</translation>
@@ -208,7 +208,7 @@ Nếu bạn từ chối, chế độ cài đặt quyền riêng tư của bạn
<translation id="1430915738399379752">In</translation>
<translation id="1432187715652018471">trang muốn cài đặt trình xử lý dịch vụ.</translation>
<translation id="1432581352905426595">Quản lý công cụ tìm kiếm</translation>
-<translation id="1435940442311036198">Sử dụng mã xác thực trên một thiết bị khác</translation>
+<translation id="1435940442311036198">Sử dụng khoá đăng nhập trên một thiết bị khác</translation>
<translation id="1436185428532214179">Trang web có thể yêu cầu chỉnh sửa các tệp và thư mục trên thiết bị của bạn</translation>
<translation id="1442386063175183758">Gấp dạng cửa bên phải</translation>
<translation id="1442987760062738829">Đục lỗ</translation>
@@ -1078,7 +1078,7 @@ Nếu bạn từ chối, chế độ cài đặt quyền riêng tư của bạn
<translation id="3646643500201740985">Đo lường hiệu suất quảng cáo</translation>
<translation id="3647286794400715637">Mỗi mục nhập chuỗi url phải chứa từ 1 đến 2 URL.</translation>
<translation id="3650584904733503804">Xác thực thành công</translation>
-<translation id="3650594806107685466">Để đảm bảo an toàn cho thẻ của bạn, hãy nhập CVC trên <ph name="SIDE_OF_CARD" /></translation>
+<translation id="3650594806107685466">Để đảm bảo an toàn cho thẻ của bạn, hãy nhập số CVC có trên <ph name="SIDE_OF_CARD" /></translation>
<translation id="3653033846669030038">Công viên giải trí</translation>
<translation id="3655241534245626312">Chuyển đến phần cài đặt về quyền</translation>
<translation id="3655670868607891010">Nếu bạn thường xuyên thấy thông báo này, hãy thử các <ph name="HELP_LINK" /> sau.</translation>
@@ -1118,7 +1118,7 @@ Nếu bạn từ chối, chế độ cài đặt quyền riêng tư của bạn
<translation id="3736520371357197498">Nếu bạn hiểu các rủi ro bảo mật, bạn có thể <ph name="BEGIN_LINK" />truy cập trang web không an toàn này<ph name="END_LINK" /> trước khi các chương trình nguy hiểm bị xóa.</translation>
<translation id="3738166223076830879">Quản trị viên quản lý trình duyệt của bạn.</translation>
<translation id="3740319564441798148">Xe buýt và tàu đường dài</translation>
-<translation id="3744111561329211289">Đồng bộ hóa dưới nền</translation>
+<translation id="3744111561329211289">Đồng bộ hoá trong nền</translation>
<translation id="3744286742364977428">Các tệp bạn tải xuống được gửi đến Google Cloud hoặc bên thứ ba để phân tích. Ví dụ: các tệp này có thể được quét để tìm dữ liệu nhạy cảm hoặc phần mềm độc hại và có thể được lưu trữ dựa trên chính sách của công ty.</translation>
<translation id="3744899669254331632">Bạn không thể truy cập <ph name="SITE" /> ngay bây giờ vì trang web này đã gửi thông tin đăng nhập hỗn độn mà Chromium không thể xử lý. Lỗi mạng và các cuộc tấn công thường chỉ diễn ra tạm thời nên trang này có thể sẽ hoạt động sau.</translation>
<translation id="3748148204939282805">Những kẻ tấn công trên <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> có thể đánh lừa bạn làm việc gì đó nguy hiểm như cài đặt phần mềm hoặc tiết lộ thông tin cá nhân (ví dụ: mật khẩu, số điện thoại hoặc thẻ tín dụng). <ph name="BEGIN_LEARN_MORE_LINK" />Tìm hiểu thêm<ph name="END_LEARN_MORE_LINK" /></translation>
@@ -1244,7 +1244,7 @@ Nếu bạn từ chối, chế độ cài đặt quyền riêng tư của bạn
<translation id="4096237801206588987">11 x 15 inch</translation>
<translation id="4098354747657067197">Bạn sắp truy cập trang web lừa đảo</translation>
<translation id="4099048595830172239">Chính sách của quản trị viên không khuyến khích chia sẻ màn hình của bạn với <ph name="APPLICATION_TITLE" /> khi đang có nội dung bảo mật trên màn hình:</translation>
-<translation id="4099391883283080991"><ph name="CUSTOMIZE_CHROME_FONTS_FOCUSED_FRIENDLY_MATCH_TEXT" />, Nhấn phím Tab rồi nhấn phím Enter để tùy chỉnh kích thước phông chữ và kiểu chữ trong Chrome</translation>
+<translation id="4099391883283080991"><ph name="CUSTOMIZE_CHROME_FONTS_FOCUSED_FRIENDLY_MATCH_TEXT" />, Nhấn phím Tab rồi nhấn phím Enter để tùy chỉnh cỡ chữ và kiểu chữ trong Chrome</translation>
<translation id="4101413244023615925">Văn bản và đồ họa</translation>
<translation id="410148943680000050">Chế bản điện tử</translation>
<translation id="4103249731201008433">Số sê-ri thiết bị không hợp lệ</translation>
@@ -1465,7 +1465,7 @@ Nếu bạn từ chối, chế độ cài đặt quyền riêng tư của bạn
<translation id="4607603470419975064">Nút xem các mẹo khi dùng Chrome, nhấn phím Enter để tìm hiểu về các tính năng của Chrome</translation>
<translation id="4607608436550361748">Xem các mẹo khi dùng Chrome</translation>
<translation id="460848736049414407">Bị quản trị viên chặn</translation>
-<translation id="4610279718074907952">Trang web này nằm trong nhóm do <ph name="SET_OWNER" /> xác định và người này có thể xem hoạt động của bạn</translation>
+<translation id="4610279718074907952">Trang web này nằm trong nhóm do <ph name="SET_OWNER" /> xác định và có thể xem hoạt động của bạn</translation>
<translation id="4617273035598175554">Phần mềm hoạt hình và đồ hoạ</translation>
<translation id="4622292761762557753">Vẫn chuyển</translation>
<translation id="4627675673814409125">Bạn không thể đặt chính sách ở cấp hồ sơ trên Chrome và hệ thống sẽ bỏ qua chính sách này.</translation>
@@ -1782,7 +1782,7 @@ Nếu bạn từ chối, chế độ cài đặt quyền riêng tư của bạn
<translation id="534295439873310000">Thiết bị dùng công nghệ NFC</translation>
<translation id="5344522958567249764">Quản lý quyền riêng tư trong quảng cáo</translation>
<translation id="5344579389779391559">Trang này có thể tìm cách tính phí bạn</translation>
-<translation id="5347645913823149105">Nút tùy chỉnh phông chữ trong Chrome, nhấn phím Enter để tùy chỉnh kích thước phông chữ và kiểu chữ trong Chrome</translation>
+<translation id="5347645913823149105">Nút tùy chỉnh phông chữ trong Chrome, nhấn phím Enter để tùy chỉnh cỡ chữ và kiểu chữ trong Chrome</translation>
<translation id="5355557959165512791">Bạn không thể truy cập vào <ph name="SITE" /> ngay bây giờ vì chứng chỉ của trang này đã bị thu hồi. Lỗi mạng và các cuộc tấn công mạng thường chỉ là tạm thời nên trang này có thể sẽ hoạt động lại sau.</translation>
<translation id="5357848622083956825">Thiết kế và nghệ thuật thị giác</translation>
<translation id="536296301121032821">Không thể lưu trữ cài đặt chính sách</translation>
@@ -1869,7 +1869,7 @@ Nếu bạn từ chối, chế độ cài đặt quyền riêng tư của bạn
<translation id="5572851009514199876">Vui lòng khởi động và đăng nhập vào Chrome để Chrome có thể kiểm tra xem bạn có được phép truy cập trang web này không.</translation>
<translation id="557886905979275351">Dao cạo và máy cạo</translation>
<translation id="5580958916614886209">Kiểm tra tháng hết hạn của bạn và thử lại</translation>
-<translation id="558420943003240152">Quản lý mật khẩu và mã xác thực…</translation>
+<translation id="558420943003240152">Quản lý mật khẩu và khoá đăng nhập…</translation>
<translation id="5586446728396275693">Không có địa chỉ nào được lưu</translation>
<translation id="5586831831248371458">Tìm kiếm <ph name="KEYWORD_SUFFIX" /></translation>
<translation id="5587987780934666589">Người dùng trên nền tảng</translation>
@@ -1939,7 +1939,7 @@ Nếu bạn từ chối, chế độ cài đặt quyền riêng tư của bạn
<translation id="5764920692828389743">Gửi tới <ph name="EMAIL_ADDRESS" /></translation>
<translation id="5765072501007116331">Để xem các yêu cầu và phương thức phân phối, hãy chọn một địa chỉ</translation>
<translation id="57689295674415555">Bạn chưa điền số thẻ ảo?</translation>
-<translation id="5772086939108830423">Sử dụng mã xác thực trên một thiết bị khác</translation>
+<translation id="5772086939108830423">Sử dụng khoá đăng nhập trên một thiết bị khác</translation>
<translation id="5776313857861697733">Mức độ ưu tiên</translation>
<translation id="5776574724412881956">Thẻ ảo chưa được điền? Hãy nhấp vào thông tin về thẻ ảo để sao chép vào bảng nhớ tạm. <ph name="IDS_AUTOFILL_VIRTUAL_CARD_MANUAL_FALLBACK_BUBBLE_LEARN_MORE_LINK_LABEL" /></translation>
<translation id="5781136890105823427">Đã bật tính năng thử nghiệm</translation>
@@ -1986,7 +1986,7 @@ Nếu bạn từ chối, chế độ cài đặt quyền riêng tư của bạn
<translation id="5904360430676679685">Gia đình và các mối quan hệ</translation>
<translation id="5908541034548427511"><ph name="TYPE_1" /> (được đồng bộ hóa)</translation>
<translation id="5911110632211230665">Đã chặn việc mở tệp</translation>
-<translation id="59174027418879706">Được kích hoạt</translation>
+<translation id="59174027418879706">Đã bật</translation>
<translation id="5919090499915321845">B10</translation>
<translation id="5920262536204764679">{NUM_COOKIES,plural, =1{Đang sử dụng 1 cookie}other{Đang sử dụng # cookie}}</translation>
<translation id="592031860219554105">Trượt băng</translation>
@@ -2283,7 +2283,7 @@ Nếu bạn từ chối, chế độ cài đặt quyền riêng tư của bạn
<translation id="6668389483194953109">Đã tìm thấy tên khổ giấy là "custom", nhưng thuộc tính "custom_size" đang trống hoặc không hợp lệ.</translation>
<translation id="6671697161687535275">Bạn muốn xóa đề xuất biểu mẫu khỏi Chromium?</translation>
<translation id="6683717648675961851">Danh sách việc làm</translation>
-<translation id="6687335167692595844">Kích thước phông chữ đã yêu cầu</translation>
+<translation id="6687335167692595844">Cỡ chữ đã yêu cầu</translation>
<translation id="6687696737818665306">Biểu diễn và nhà hát</translation>
<translation id="6688743156324860098">Cập nhật…</translation>
<translation id="6688775486821967877">Thẻ ảo hiện chưa dùng được, vui lòng thử lại sau</translation>
@@ -2527,7 +2527,7 @@ Thông tin chi tiết bổ sung:
<translation id="7304030187361489308">Cao</translation>
<translation id="7304562222803846232">Quản lý chế độ cài đặt quyền riêng tư của Tài khoản Google</translation>
<translation id="7305756307268530424">Bắt đầu tốc độ chậm hơn</translation>
-<translation id="7308436126008021607">đồng bộ hóa dưới nền</translation>
+<translation id="7308436126008021607">đồng bộ hoá trong nền</translation>
<translation id="7310392214323165548">Thiết bị sẽ sớm khởi động lại</translation>
<translation id="7311244614769792472">Không tìm thấy kết quả nào</translation>
<translation id="7319430975418800333">A3</translation>
@@ -2744,7 +2744,7 @@ Thông tin chi tiết bổ sung:
<translation id="7740996059027112821">Chuẩn</translation>
<translation id="77424286611022110">Trang web này hiện quảng cáo xâm nhập hoặc quảng cáo gây hiểu nhầm. <ph name="LEARN_MORE_LINK_TEXT" /></translation>
<translation id="774634243536837715">Đã chặn nội dung nguy hiểm.</translation>
-<translation id="7751971323486164747">Tùy chỉnh kích thước phông chữ và kiểu chữ trong Chrome</translation>
+<translation id="7751971323486164747">Tùy chỉnh cỡ chữ và kiểu chữ trong Chrome</translation>
<translation id="7752995774971033316">Không được quản lý</translation>
<translation id="7755287808199759310">Cha mẹ của bạn có thể bỏ chặn trang web cho bạn</translation>
<translation id="7755624218968747854">Cuộn chính</translation>
@@ -3338,7 +3338,7 @@ Thông tin chi tiết bổ sung:
<translation id="961663415146723894">Đóng gáy dưới cùng</translation>
<translation id="962484866189421427">Nội dung này có thể tìm cách cài đặt ứng dụng lừa đảo giả mạo nội dung khác hoặc thu thập dữ liệu có thể được dùng để theo dõi bạn. <ph name="BEGIN_LINK" />Vẫn hiển thị<ph name="END_LINK" /></translation>
<translation id="963837307749850257">Tất cả người dùng</translation>
-<translation id="964050462028070434">Quản lý mật khẩu và mã xác thực…</translation>
+<translation id="964050462028070434">Quản lý mật khẩu và khoá đăng nhập…</translation>
<translation id="96680173638229310">Ô tô và xe cộ</translation>
<translation id="969892804517981540">Phiên bản Chính thức</translation>
<translation id="973773823069644502">Thêm địa chỉ giao hàng</translation>
diff --git a/chromium/components/strings/components_strings_zh-CN.xtb b/chromium/components/strings/components_strings_zh-CN.xtb
index 440d6898061..757b80bef49 100644
--- a/chromium/components/strings/components_strings_zh-CN.xtb
+++ b/chromium/components/strings/components_strings_zh-CN.xtb
@@ -1335,7 +1335,7 @@
<translation id="4282346679996504092">针对此商品的提醒已被关闭,相应书签已被移除</translation>
<translation id="4285498937028063278">取消固定</translation>
<translation id="428639260510061158">{NUM_CARDS,plural, =1{这张卡已保存到您的 Google 帐号中}other{这些卡已保存到您的 Google 帐号中}}</translation>
-<translation id="4287495839370498922">在 Chrome 中增强广告隐私权</translation>
+<translation id="4287495839370498922">在 Chrome 中加强广告隐私设置</translation>
<translation id="4287885627794386150">符合试用条件但处于无效状态</translation>
<translation id="4297502707443874121">第 <ph name="THUMBNAIL_PAGE" /> 页的缩略图</translation>
<translation id="4298000214066716287">投资</translation>
@@ -2100,7 +2100,7 @@
<translation id="6196640612572343990">阻止第三方 Cookie</translation>
<translation id="6197648101609735209">89 x 89 毫米</translation>
<translation id="6203231073485539293">请检查您的互联网连接是否正常</translation>
-<translation id="6205314730813004066">广告隐私设置</translation>
+<translation id="6205314730813004066">广告隐私权设置</translation>
<translation id="6212314149070368045">美国 Fanfold</translation>
<translation id="6218753634732582820">要从 Chromium 中移除地址吗?</translation>
<translation id="622039917539443112">平行折</translation>
diff --git a/chromium/components/strings/components_strings_zh-TW.xtb b/chromium/components/strings/components_strings_zh-TW.xtb
index 1fd474698b4..97c4549c546 100644
--- a/chromium/components/strings/components_strings_zh-TW.xtb
+++ b/chromium/components/strings/components_strings_zh-TW.xtb
@@ -916,7 +916,7 @@
<translation id="3259648571731540213"><ph name="CREATE_GOOGLE_CALENDAR_EVENT_FOCUSED_FRIENDLY_MATCH_TEXT" />;按下 Tab 鍵再按下 Enter 鍵即可在 Google 日曆中快速建立新活動</translation>
<translation id="3261488570342242926">瞭解虛擬卡片</translation>
<translation id="3264837738038045344">「管理 Chrome 設定」按鈕;按下 Enter 鍵即可前往 Chrome 設定</translation>
-<translation id="3266367459139339908">我們推出了多項新方法,限制網站可為放送個人化廣告取得哪些資訊,例如:</translation>
+<translation id="3266367459139339908">我們推出了一些新的機制,限制網站在放送個人化廣告時,可以取得哪些與使用者相關的資訊,例如:</translation>
<translation id="3266793032086590337">值 (衝突)</translation>
<translation id="3266972086368072861">{NUM_COOKIES,plural, =0{未封鎖任何網站 (包括相關網站)}=1{已封鎖 1 個網站 (包括相關網站)}other{已封鎖 # 個網站 (包括相關網站)}}</translation>
<translation id="3268451620468152448">開啟的分頁</translation>
@@ -1093,7 +1093,7 @@
<translation id="3678342917559046352">副檔名無效:副檔名的格式必須為 &lt;extension_id&gt;、&lt;extension_id&gt; 或 &lt;update_url&gt; 其中之一。</translation>
<translation id="3678529606614285348">在新的無痕式視窗中開啟網頁 (Ctrl + Shift + N 鍵)</translation>
<translation id="3681007416295224113">憑證資訊</translation>
-<translation id="3681421644246505351">Chrome 會根據你近期的瀏覽記錄記下感興趣的主題。</translation>
+<translation id="3681421644246505351">Chrome 會根據你近期的瀏覽記錄,記下你感興趣的主題。</translation>
<translation id="3693327506115126094">選擇身分驗證方式</translation>
<translation id="3701427423622901115">已確認重設。</translation>
<translation id="3704162925118123524">您可能需要造訪目前所使用網路的登入網頁。</translation>
@@ -1208,7 +1208,7 @@
<translation id="3987940399970879459">不到 1 MB</translation>
<translation id="3990250421422698716">撞頁偏移</translation>
<translation id="3992684624889376114">為何顯示此頁</translation>
-<translation id="399952081411886534">其他讓廣告更有隱私的功能</translation>
+<translation id="399952081411886534">其他有助於保障使用者隱私的廣告控管機制</translation>
<translation id="4000598935132966791">進一步瞭解受管理瀏覽器中的網站限制</translation>
<translation id="4006465311664329701">儲存在 Google Pay 的付款方式、優惠和地址資訊</translation>
<translation id="4009243425692662128">你列印的頁面內容會傳送給 Google Cloud 或第三方進行分析。舉例來說,Google Cloud 或第三方可能會掃描文字,檢查是否含有機密資料。</translation>
@@ -1464,7 +1464,7 @@
<translation id="4607603470419975064">查看 Chrome 提示的按鈕;按下 Enter 鍵即可瞭解 Chrome 功能</translation>
<translation id="4607608436550361748">查看 Chrome 提示</translation>
<translation id="460848736049414407">已遭管理員封鎖</translation>
-<translation id="4610279718074907952">這個網站屬於由 <ph name="SET_OWNER" /> 定義的群組,因此可以查看你的活動</translation>
+<translation id="4610279718074907952">這個網站屬於由 <ph name="SET_OWNER" /> 定義的群組,群組擁有者可以查看你的活動</translation>
<translation id="4617273035598175554">繪圖與動畫軟體</translation>
<translation id="4622292761762557753">仍要轉移</translation>
<translation id="4627675673814409125">這項政策無法在 Chrome 設定檔層級設定,因此將遭到忽略。</translation>
@@ -2551,7 +2551,7 @@
<translation id="7365849542400970216">知道你的裝置使用狀態嗎?</translation>
<translation id="7366117520888504990">198 x 275 公釐</translation>
<translation id="7366362069757178916">付款處理常式</translation>
-<translation id="7367985555340314048">Chrome 會根據你最近的瀏覽記錄推測感興趣的主題,做為網站放送個人化廣告的依據</translation>
+<translation id="7367985555340314048">Chrome 會根據你最近的瀏覽記錄推測你感興趣的主題,做為網站放送個人化廣告的依據</translation>
<translation id="7372973238305370288">搜尋結果</translation>
<translation id="7374461526650987610">通訊協定處理常式</translation>
<translation id="7374733840632556089">發生這個問題是因為你或其他人在裝置上安裝了具有風險的憑證。已知這個憑證是用於監控及攔截網路資訊,且不受 Chrome 信任。雖然有部分監控活動屬於正當行為 (例如學校或公司網路上的監控機制),Chrome 仍想確保你知曉此一情況,即使你無法阻止這類監控活動。任何存取網路的瀏覽器或應用程式都可能受到監控。</translation>
@@ -2765,7 +2765,7 @@
<translation id="7791543448312431591">新增</translation>
<translation id="7798389633136518089">由於這個政策並非透過雲端來源設定,因此遭到忽略。</translation>
<translation id="7800304661137206267">連線採用 <ph name="CIPHER" /> 加密,並設有 <ph name="MAC" /> 訊息驗證及 <ph name="KX" /> 金鑰交換機制。</translation>
-<translation id="7800977246388195491">Chrome 會根據你近期的瀏覽記錄記下感興趣的主題。此外,你造訪的網站可以判斷你喜歡的內容。在此之後,網站就能要求取得這項資訊,據此向你放送個人化廣告。你可以選擇要根據哪些主題和網站顯示廣告。</translation>
+<translation id="7800977246388195491">Chrome 會根據你近期的瀏覽記錄,記下你感興趣的主題。此外,你造訪的網站可以判斷你喜歡的內容。在此之後,網站就能要求取得這項資訊,據此向你放送個人化廣告。你可以選擇要根據哪些主題和網站顯示廣告。</translation>
<translation id="7802523362929240268">網站合法</translation>
<translation id="7802989406998618639">請輸入<ph name="SIDE_OF_CARD" />的 <ph name="NUMBER_OF_DIGITS" /> 位數安全碼,讓銀行驗證你的身分</translation>
<translation id="780301667611848630">不用了,謝謝</translation>
@@ -2966,7 +2966,7 @@
<translation id="829335040383910391">音訊</translation>
<translation id="8294431847097064396">來源</translation>
<translation id="8296205692406981542">地區公園與花園</translation>
-<translation id="8297545700510100061">系統會使用 Cookie 和其他網站資料來記住你,以便將你登入帳戶或是提供個人化廣告等服務。如要管理所有網站的 Cookie,請查看<ph name="SETTINGS" />。</translation>
+<translation id="8297545700510100061">系統會使用 Cookie 和其他網站資料來記住你,用於登入帳戶或是放送個人化廣告等服務。如要管理所有網站的 Cookie,請查看<ph name="SETTINGS" />。</translation>
<translation id="8298115750975731693">目前使用的 Wi-Fi 網路 (<ph name="WIFI_NAME" />) 可能會要求您造訪 <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />。</translation>
<translation id="8299269255470343364">日文</translation>
<translation id="8303854710873047864">已顯示「<ph name="SECTION" />」區段</translation>
@@ -3074,7 +3074,7 @@
<translation id="860043288473659153">持卡人姓名</translation>
<translation id="8601027005147870853"><ph name="BEGIN_BOLD" />我們使用的資料:<ph name="END_BOLD" />你在這部裝置上透過 Chrome 造訪的網站活動。</translation>
<translation id="8606726445206553943">使用您的 MIDI 裝置</translation>
-<translation id="8606988009912891950">廣告主題可協助網站向你顯示相關廣告,同時保護你的瀏覽記錄和身分。Chrome 可以根據你近期的瀏覽記錄,記下感興趣的主題。在此之後,你造訪的網站就可以要求 Chrome 提供相關主題,據此向你放送個人化廣告。</translation>
+<translation id="8606988009912891950">廣告主題可協助網站向你顯示相關廣告,同時保護你的瀏覽記錄和身分。Chrome 可以根據你近期的瀏覽記錄,記下你感興趣的主題。在此之後,你造訪的網站就可以要求 Chrome 提供相關主題,據此向你放送個人化廣告。</translation>
<translation id="8617269623452051934">你的裝置使用狀態</translation>
<translation id="861775596732816396">粗細:4</translation>
<translation id="8620276786115098679">Envelope Kaku 7</translation>
diff --git a/chromium/components/webapps/browser/android/translations/android_webapps_strings_am.xtb b/chromium/components/webapps/browser/android/translations/android_webapps_strings_am.xtb
index f34fc81b138..a96fa4c168a 100644
--- a/chromium/components/webapps/browser/android/translations/android_webapps_strings_am.xtb
+++ b/chromium/components/webapps/browser/android/translations/android_webapps_strings_am.xtb
@@ -1,13 +1,13 @@
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="am">
-<translation id="2139186145475833000">ወደ መነሻ ማያ ገጽ አክል</translation>
+<translation id="2139186145475833000">ወደ መነሻ ማያ ገፅ አክል</translation>
<translation id="2478076885740497414">መተግበሪያ ይጫኑ</translation>
<translation id="3789841737615482174">ጫን </translation>
<translation id="3910402514791813257">መጫን አልተሳካም</translation>
-<translation id="4250229828105606438">ቅጽበታዊ ገጽ እይታ</translation>
+<translation id="4250229828105606438">ቅጽበታዊ ገፅ እይታ</translation>
<translation id="4665282149850138822"><ph name="NAME" /> ወደ እርስዎ መነሻ ገፅ ታክሏል</translation>
-<translation id="5250483651202458397">ቅጽበታዊ ገጽ እይታ። ለመዝጋት መታ ያድርጉ።</translation>
+<translation id="5250483651202458397">ቅጽበታዊ ገፅ እይታ። ለመዝጋት መታ ያድርጉ።</translation>
<translation id="6990079615885386641">መተግበሪያውን ከGoogle Play መደብር ያግኙ፦ <ph name="APP_ACTION" /></translation>
<translation id="7333031090786104871">አሁንም ቀዳሚ ጣቢያን በማከል ላይ</translation>
<translation id="962979164594783469">ይህን መተግበሪያ ይጫኑ</translation>
diff --git a/chromium/content/browser/browser_plugin/browser_plugin_guest.cc b/chromium/content/browser/browser_plugin/browser_plugin_guest.cc
index a7501a57c51..2e47c128f4d 100644
--- a/chromium/content/browser/browser_plugin/browser_plugin_guest.cc
+++ b/chromium/content/browser/browser_plugin/browser_plugin_guest.cc
@@ -25,9 +25,10 @@ namespace content {
BrowserPluginGuest::BrowserPluginGuest(WebContentsImpl* web_contents,
BrowserPluginGuestDelegate* delegate)
- : WebContentsObserver(web_contents), delegate_(delegate) {
- DCHECK(web_contents);
- DCHECK(delegate);
+ : WebContentsObserver(web_contents),
+ delegate_(delegate->GetGuestDelegateWeakPtr()) {
+ CHECK(web_contents);
+ CHECK(delegate_);
RecordAction(base::UserMetricsAction("BrowserPlugin.Guest.Create"));
}
@@ -97,6 +98,11 @@ WebContentsImpl* BrowserPluginGuest::GetWebContents() const {
}
RenderFrameHostImpl* BrowserPluginGuest::GetProspectiveOuterDocument() {
+ if (!delegate_) {
+ // The guest delegate may only be null during some destruction scenarios.
+ CHECK(web_contents()->IsBeingDestroyed());
+ return nullptr;
+ }
return static_cast<RenderFrameHostImpl*>(
delegate_->GetProspectiveOuterDocument());
}
diff --git a/chromium/content/browser/browser_plugin/browser_plugin_guest.h b/chromium/content/browser/browser_plugin/browser_plugin_guest.h
index 17e98b60e8f..7f3083029d4 100644
--- a/chromium/content/browser/browser_plugin/browser_plugin_guest.h
+++ b/chromium/content/browser/browser_plugin/browser_plugin_guest.h
@@ -7,7 +7,7 @@
#include <vector>
-#include "base/memory/raw_ptr.h"
+#include "base/memory/weak_ptr.h"
#include "build/build_config.h"
#include "content/public/browser/browser_plugin_guest_delegate.h"
#include "content/public/browser/web_contents_observer.h"
@@ -78,7 +78,8 @@ class BrowserPluginGuest : public WebContentsObserver {
void InitInternal(WebContentsImpl* owner_web_contents);
- const raw_ptr<BrowserPluginGuestDelegate, DanglingUntriaged> delegate_;
+ // May be null during guest destruction.
+ const base::WeakPtr<BrowserPluginGuestDelegate> delegate_;
};
} // namespace content
diff --git a/chromium/content/browser/renderer_host/navigation_request.cc b/chromium/content/browser/renderer_host/navigation_request.cc
index d979fc0def5..74ead3b0943 100644
--- a/chromium/content/browser/renderer_host/navigation_request.cc
+++ b/chromium/content/browser/renderer_host/navigation_request.cc
@@ -5174,7 +5174,13 @@ void NavigationRequest::CommitErrorPage(
}
}
+ base::WeakPtr<NavigationRequest> weak_self(weak_factory_.GetWeakPtr());
ReadyToCommitNavigation(true /* is_error */);
+ // The caller above might result in the deletion of `this`. Return immediately
+ // if so.
+ if (!weak_self) {
+ return;
+ }
PopulateDocumentTokenForCrossDocumentNavigation();
// Use a separate cache shard, and no cookies, for error pages.
diff --git a/chromium/content/browser/renderer_host/navigation_request_browsertest.cc b/chromium/content/browser/renderer_host/navigation_request_browsertest.cc
index 931a901a0dc..db355a727d4 100644
--- a/chromium/content/browser/renderer_host/navigation_request_browsertest.cc
+++ b/chromium/content/browser/renderer_host/navigation_request_browsertest.cc
@@ -45,6 +45,7 @@
#include "content/public/test/prerender_test_util.h"
#include "content/public/test/test_frame_navigation_observer.h"
#include "content/public/test/test_navigation_observer.h"
+#include "content/public/test/test_service.mojom.h"
#include "content/public/test/test_utils.h"
#include "content/public/test/url_loader_interceptor.h"
#include "content/shell/browser/shell.h"
@@ -4309,4 +4310,84 @@ IN_PROC_BROWSER_TEST_P(NavigationRequestMPArchBrowserTest,
}
}
+// Tests that when trying to commit an error page for a failed navigation, but
+// the renderer process of the, the navigation won't commit and won't crash.
+// Regression test for https://crbug.com/1444360.
+IN_PROC_BROWSER_TEST_F(NavigationRequestBrowserTest,
+ RendererCrashedBeforeCommitErrorPage) {
+ // Navigate to `url_a` first.
+ GURL url_a(embedded_test_server()->GetURL("a.com", "/title1.html"));
+ ASSERT_TRUE(NavigateToURL(shell(), url_a));
+
+ // Set up an URLLoaderInterceptor which will cause future navigations to fail.
+ auto url_loader_interceptor = std::make_unique<URLLoaderInterceptor>(
+ base::BindRepeating([](URLLoaderInterceptor::RequestParams* params) {
+ network::URLLoaderCompletionStatus status;
+ status.error_code = net::ERR_NOT_IMPLEMENTED;
+ params->client->OnComplete(status);
+ return true;
+ }));
+
+ // Do a navigation to `url_b1` that will fail and commit an error page. This
+ // is important so that the next error page navigation won't need to create a
+ // speculative RenderFrameHost (unless RenderDocument is enabled) and won't
+ // get cancelled earlier than commit time due to speculative RFH deletion.
+ GURL url_b1(embedded_test_server()->GetURL("b.com", "/title1.html"));
+ EXPECT_FALSE(NavigateToURL(shell(), url_b1));
+ EXPECT_EQ(shell()->web_contents()->GetLastCommittedURL(), url_b1);
+ EXPECT_TRUE(
+ shell()->web_contents()->GetPrimaryMainFrame()->IsErrorDocument());
+
+ // For the next navigation, set up a throttle that will be used to wait for
+ // WillFailRequest() and then defer the navigation, so that we can crash the
+ // error page process first.
+ TestNavigationThrottleInstaller installer(
+ shell()->web_contents(),
+ NavigationThrottle::PROCEED /* will_start_result */,
+ NavigationThrottle::PROCEED /* will_redirect_result */,
+ NavigationThrottle::DEFER /* will_fail_result */,
+ NavigationThrottle::PROCEED /* will_process_result */,
+ NavigationThrottle::PROCEED /* will_commit_without_url_loader_result */);
+
+ // Start a navigation to `url_b2` that will also fail, but before it commits
+ // an error page, cause the error page process to crash.
+ GURL url_b2(embedded_test_server()->GetURL("b.com", "/title2.html"));
+ TestNavigationManager manager(shell()->web_contents(), url_b2);
+ shell()->LoadURL(url_b2);
+ EXPECT_TRUE(manager.WaitForRequestStart());
+
+ // Resume the navigation and wait for WillFailRequest(). After this point, we
+ // will have picked the final RenderFrameHost & RenderProcessHost for the
+ // failed navigation.
+ manager.ResumeNavigation();
+ installer.WaitForThrottleWillFail();
+
+ // Kill the error page process. This will cause for the navigation to `url_b2`
+ // to return early in `NavigationRequest::ReadyToCommitNavigation()` and not
+ // commit a new error page.
+ RenderProcessHost* process_to_kill =
+ manager.GetNavigationHandle()->GetRenderFrameHost()->GetProcess();
+ ASSERT_TRUE(process_to_kill->IsInitializedAndNotDead());
+ {
+ // Trigger a renderer kill by calling DoSomething() which will cause a bad
+ // message to be reported.
+ RenderProcessHostBadIpcMessageWaiter kill_waiter(process_to_kill);
+ mojo::Remote<mojom::TestService> service;
+ process_to_kill->BindReceiver(service.BindNewPipeAndPassReceiver());
+ service->DoSomething(base::DoNothing());
+ EXPECT_EQ(bad_message::RPH_MOJO_PROCESS_ERROR, kill_waiter.Wait());
+ }
+ ASSERT_FALSE(process_to_kill->IsInitializedAndNotDead());
+
+ // Resume the navigation, which won't commit.
+ if (!ShouldCreateNewHostForAllFrames()) {
+ installer.navigation_throttle()->ResumeNavigation();
+ }
+ EXPECT_TRUE(manager.WaitForNavigationFinished());
+ EXPECT_FALSE(WaitForLoadStop(shell()->web_contents()));
+
+ // The tab stayed at `url_b1` as the `url_b2` navigation didn't commit.
+ EXPECT_EQ(shell()->web_contents()->GetLastCommittedURL(), url_b1);
+}
+
} // namespace content
diff --git a/chromium/content/public/browser/browser_plugin_guest_delegate.cc b/chromium/content/public/browser/browser_plugin_guest_delegate.cc
index 62cbad15002..040d36ae694 100644
--- a/chromium/content/public/browser/browser_plugin_guest_delegate.cc
+++ b/chromium/content/public/browser/browser_plugin_guest_delegate.cc
@@ -20,4 +20,10 @@ RenderFrameHost* BrowserPluginGuestDelegate::GetProspectiveOuterDocument() {
return nullptr;
}
+base::WeakPtr<BrowserPluginGuestDelegate>
+BrowserPluginGuestDelegate::GetGuestDelegateWeakPtr() {
+ NOTREACHED();
+ return nullptr;
+}
+
} // namespace content
diff --git a/chromium/content/public/browser/browser_plugin_guest_delegate.h b/chromium/content/public/browser/browser_plugin_guest_delegate.h
index 51a4efa8163..d588b4d3993 100644
--- a/chromium/content/public/browser/browser_plugin_guest_delegate.h
+++ b/chromium/content/public/browser/browser_plugin_guest_delegate.h
@@ -5,6 +5,7 @@
#ifndef CONTENT_PUBLIC_BROWSER_BROWSER_PLUGIN_GUEST_DELEGATE_H_
#define CONTENT_PUBLIC_BROWSER_BROWSER_PLUGIN_GUEST_DELEGATE_H_
+#include "base/memory/weak_ptr.h"
#include "content/common/content_export.h"
#include "content/public/browser/web_contents.h"
@@ -28,6 +29,8 @@ class CONTENT_EXPORT BrowserPluginGuestDelegate {
// TODO(crbug.com/769461): Have all guest types return the specific owner
// RenderFrameHost and not assume it's the owner's main frame.
virtual RenderFrameHost* GetProspectiveOuterDocument();
+
+ virtual base::WeakPtr<BrowserPluginGuestDelegate> GetGuestDelegateWeakPtr();
};
} // namespace content
diff --git a/chromium/device/bluetooth/strings/bluetooth_strings_eu.xtb b/chromium/device/bluetooth/strings/bluetooth_strings_eu.xtb
index 794636ee521..0e4ddf4e7d3 100644
--- a/chromium/device/bluetooth/strings/bluetooth_strings_eu.xtb
+++ b/chromium/device/bluetooth/strings/bluetooth_strings_eu.xtb
@@ -5,7 +5,7 @@
<translation id="2616803374438260326">Teklatua eta sagua (<ph name="ADDRESS" />)</translation>
<translation id="3273951168350045122">Teklatua (<ph name="ADDRESS" />)</translation>
<translation id="4287283380557401002">Autorako audioa (<ph name="ADDRESS" />)</translation>
-<translation id="430326050669417502">Joystick-a (<ph name="ADDRESS" />)</translation>
+<translation id="430326050669417502">Joko-palanka (<ph name="ADDRESS" />)</translation>
<translation id="5271696982761495740">Tableta (<ph name="ADDRESS" />)</translation>
<translation id="5376363957846771741">Gailu ezezaguna edo bateraezina (<ph name="ADDRESS" />)</translation>
<translation id="654594702871184195">Audioa (<ph name="ADDRESS" />)</translation>
diff --git a/chromium/device/fido/strings/fido_strings_da.xtb b/chromium/device/fido/strings/fido_strings_da.xtb
index 5d86e402974..6b0adf4fe81 100644
--- a/chromium/device/fido/strings/fido_strings_da.xtb
+++ b/chromium/device/fido/strings/fido_strings_da.xtb
@@ -1,5 +1,5 @@
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="da">
-<translation id="6082592655150610743">bekræfte din identitet i <ph name="APP_NAME" /></translation>
+<translation id="6082592655150610743">verificere din identitet i <ph name="APP_NAME" /></translation>
</translationbundle> \ No newline at end of file
diff --git a/chromium/extensions/strings/extensions_strings_am.xtb b/chromium/extensions/strings/extensions_strings_am.xtb
index 5a0ecf35700..b9cac3f5b13 100644
--- a/chromium/extensions/strings/extensions_strings_am.xtb
+++ b/chromium/extensions/strings/extensions_strings_am.xtb
@@ -8,7 +8,7 @@
<translation id="1420684932347524586">አይይ! RSA የግል ኩልፍ በዘፈቀደ ለመፍጠር አልተቻለም።</translation>
<translation id="1445572445564823378">ይህ ቅጥያ <ph name="PRODUCT_NAME" /> እያንቀራፈፈው ነው። የ<ph name="PRODUCT_NAME" /> አፈጻጸም ወደነበረበት ለመመለስ ቅጥያውን ማሰናከል አለብዎት።</translation>
<translation id="1468038450257740950">WebGL አይደገፍም።</translation>
-<translation id="1803557475693955505">የጀርባ ገጽ «<ph name="BACKGROUND_PAGE" />»ን መጫን አልተቻለም።</translation>
+<translation id="1803557475693955505">የጀርባ ገፅ «<ph name="BACKGROUND_PAGE" />»ን መጫን አልተቻለም።</translation>
<translation id="2159915644201199628">የዚህ ምስል ስውሩን መግለጥ አልተቻለም፦ «<ph name="IMAGE_NAME" />»</translation>
<translation id="2350172092385603347">አካባቢያዊነት ተጠቅሟል ነገር ግን በማኒፌስት ወስጥ default_locale አልተገለጸም።</translation>
<translation id="2576842806987913196">ይህን ስም የያዘ የCRX ፋይል አስቀድሞ ነበር።</translation>
@@ -23,7 +23,7 @@
<translation id="3393440416772303020"><ph name="PRODUCT_NAME" /> (ተከታታይ ቁጥር <ph name="SERIAL_NUMBER" />)</translation>
<translation id="3466070586188012397"><ph name="PRODUCT_NAME" /> ከ<ph name="VENDOR_ID" /> ሻጭ (ተከታታይ ቁጥር <ph name="SERIAL_NUMBER" />)</translation>
<translation id="3561217442734750519">ለግላዊ ቁልፍ የሚገባ እሴት ትክክለኛ ዱካ መሆን አለበት።</translation>
-<translation id="388442998277590542">የአማራጮች ገጽ «<ph name="OPTIONS_PAGE" />»ን መጫን አልተቻለም።</translation>
+<translation id="388442998277590542">የአማራጮች ገፅ «<ph name="OPTIONS_PAGE" />»ን መጫን አልተቻለም።</translation>
<translation id="3984413272403535372">ቅጥያዎችን በመፈረም ጊዜ ስህተት።</translation>
<translation id="39964277676607559">ለይዘት ስክሪፕት ጃቫስክሪፕት «<ph name="RELATIVE_PATH" />»ን መጫን አልተቻለም።</translation>
<translation id="4115165561519362854">የዚህ ማሽን አስተዳዳሪ <ph name="EXTENSION_NAME" /> ቢያንስ የ<ph name="EXTENSION_VERSION" /> ስሪት እንዲሆን ይፈልጋሉል። ወደዚያ ስሪት (ወይም ከዚያ በላይ) ካልተዘመነ በስተቀር ሊነቃ አይችልም።</translation>
diff --git a/chromium/extensions/strings/extensions_strings_mr.xtb b/chromium/extensions/strings/extensions_strings_mr.xtb
index 247e79a9f6a..433a78f64a4 100644
--- a/chromium/extensions/strings/extensions_strings_mr.xtb
+++ b/chromium/extensions/strings/extensions_strings_mr.xtb
@@ -8,7 +8,7 @@
<translation id="1420684932347524586">अरेरे! यादृच्छिक RSA खासगी की व्युत्पन्न करण्यात अयशस्वी.</translation>
<translation id="1445572445564823378">हे एक्स्टेंशन <ph name="PRODUCT_NAME" /> हळू चालत आहे. <ph name="PRODUCT_NAME" /> चे काम रिस्टोअर करण्‍यासाठी तुम्ही ते ‍अक्षम करणे आवश्‍यक आहे.</translation>
<translation id="1468038450257740950">WebGL ला सपोर्ट नाही.</translation>
-<translation id="1803557475693955505">'पार्श्वभूमी पृष्ठ '<ph name="BACKGROUND_PAGE" />' लोड करणे शक्य नाही.</translation>
+<translation id="1803557475693955505">'बॅकग्राउंड पेज '<ph name="BACKGROUND_PAGE" />' लोड करता आले नाही.</translation>
<translation id="2159915644201199628">इमेज डीकोड करणे शक्य झाले नाही: '<ph name="IMAGE_NAME" />'</translation>
<translation id="2350172092385603347">भाषांतर वापरले, परंतु मॅनिफेस्टमध्ये डीफॉल्ट_लोकॅल नमूद नाही.</translation>
<translation id="2576842806987913196">या नावाने आधीपासूनच CRX फाइल उपस्थित आहे.</translation>
@@ -23,7 +23,7 @@
<translation id="3393440416772303020"><ph name="PRODUCT_NAME" /> (सिरीअल नंबर <ph name="SERIAL_NUMBER" />)</translation>
<translation id="3466070586188012397"><ph name="VENDOR_ID" /> विक्रेत्याकडील <ph name="PRODUCT_NAME" /> (सिरीअल नंबर <ph name="SERIAL_NUMBER" />)</translation>
<translation id="3561217442734750519">खासगी की साठी इनपुट मूल्य वैध पथ असावा.</translation>
-<translation id="388442998277590542">पर्याय पृष्ठ '<ph name="OPTIONS_PAGE" />' लोड करणे शक्य नाही.</translation>
+<translation id="388442998277590542">पर्याय पेज '<ph name="OPTIONS_PAGE" />' लोड करणे शक्य नाही.</translation>
<translation id="3984413272403535372">एक्स्टेंशनमध्ये साइन करताना एरर.</translation>
<translation id="39964277676607559">आशय स्क्रिप्टसाठी javascript '<ph name="RELATIVE_PATH" />' लोड करणे शक्य नाही.</translation>
<translation id="4115165561519362854">या मशीनच्या ॲडमिनिस्ट्रेटरला <ph name="EXTENSION_NAME" /> कडे <ph name="EXTENSION_VERSION" /> ची किमान आवृत्ती असणे आवश्यक आहे. ही त्या आवृत्तीवर (किंवा उच्च) अपडेट करेपर्यंत हे सक्षम होऊ शकत नाही.</translation>
diff --git a/chromium/extensions/strings/extensions_strings_te.xtb b/chromium/extensions/strings/extensions_strings_te.xtb
index 12ba3911e1e..9788f20ae7d 100644
--- a/chromium/extensions/strings/extensions_strings_te.xtb
+++ b/chromium/extensions/strings/extensions_strings_te.xtb
@@ -29,7 +29,7 @@
<translation id="4115165561519362854"><ph name="EXTENSION_NAME" /> యొక్క వెర్షన్ కనీసం <ph name="EXTENSION_VERSION" /> ఉండాలని ఈ మెషీన్ నిర్వాహకుడు నిర్బంధించారు. ఇది ఆ వెర్షన్‌కు (లేదా తర్వాతి వెర్షన్‌కు) అప్‌డేట్ చేసే వరకు దీనిని ప్రారంభించడం సాధ్యపడదు.</translation>
<translation id="4233778200880751280">'<ph name="ABOUT_PAGE" />' పరిచయ పేజీని లోడ్ చేయడం సాధ్యపడలేదు.</translation>
<translation id="471800408830181311">ప్రైవేట్ కీని అవుట్‌పుట్ చేయడంలో విఫలమైంది.</translation>
-<translation id="4811956658694082538">వినియోగ ప్రాసెస్ క్రాష్ అయినందున ప్యాకేజీని ఇన్‌స్టాల్ చేయలేకపోయింది. Chromeను పునఃప్రారంభించి, మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="4811956658694082538">వినియోగ ప్రాసెస్ క్రాష్ అయినందున ప్యాకేజీని ఇన్‌స్టాల్ చేయలేకపోయింది. Chromeను పునఃప్రారంభించి, మళ్లీ ట్రై చేయండి.</translation>
<translation id="4988792151665380515">పబ్లిక్ కీని ఎగుమతి చేయడానికి విఫలమైంది.</translation>
<translation id="5026754133087629784">వెబ్ వీక్షణ: <ph name="WEBVIEW_TAG_NAME" /></translation>
<translation id="5098647635849512368">ప్యాక్ చేయడానికి డైరెక్టరీకి ఖచ్చితమైన పాథ్‌ను కనుగొనడం సాధ్యపడదు.</translation>
diff --git a/chromium/gpu/config/gpu_lists_version.h b/chromium/gpu/config/gpu_lists_version.h
index b72782d4aae..d25e375e00d 100644
--- a/chromium/gpu/config/gpu_lists_version.h
+++ b/chromium/gpu/config/gpu_lists_version.h
@@ -3,6 +3,6 @@
#ifndef GPU_CONFIG_GPU_LISTS_VERSION_H_
#define GPU_CONFIG_GPU_LISTS_VERSION_H_
-#define GPU_LISTS_VERSION "ff31347a6f4dc4b829c8c47e04cb84e29290d1f5"
+#define GPU_LISTS_VERSION "3bd7c498c6d8c90fafb56211b896e34bd4308ca0"
#endif // GPU_CONFIG_GPU_LISTS_VERSION_H_
diff --git a/chromium/infra/config/generated/builders/ci/Cast Linux Debug/properties.json b/chromium/infra/config/generated/builders/ci/Cast Linux Debug/properties.json
deleted file mode 100644
index 789fcda4c02..00000000000
--- a/chromium/infra/config/generated/builders/ci/Cast Linux Debug/properties.json
+++ /dev/null
@@ -1,63 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Cast Linux Debug",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-linux-archive",
- "builder_group": "chromium.linux",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Debug",
- "config": "chromium_clang",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "Cast Linux Debug",
- "project": "chromium-m112"
- }
- ],
- "mirroring_builder_group_and_names": [
- {
- "builder": "linux-x64-castos-dbg",
- "group": "tryserver.chromium.linux"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-trusted",
- "jobs": 500,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium.linux",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ]
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/Cast Linux/properties.json b/chromium/infra/config/generated/builders/ci/Cast Linux/properties.json
deleted file mode 100644
index 5a9d1e42e4c..00000000000
--- a/chromium/infra/config/generated/builders/ci/Cast Linux/properties.json
+++ /dev/null
@@ -1,63 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Cast Linux",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-linux-archive",
- "builder_group": "chromium.linux",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium_clang",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "Cast Linux",
- "project": "chromium-m112"
- }
- ],
- "mirroring_builder_group_and_names": [
- {
- "builder": "linux-x64-castos",
- "group": "tryserver.chromium.linux"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-trusted",
- "jobs": 500,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium.linux",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ]
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/Dawn Linux x64 DEPS Builder/properties.json b/chromium/infra/config/generated/builders/ci/Dawn Linux x64 DEPS Builder/properties.json
deleted file mode 100644
index a0bdef6746c..00000000000
--- a/chromium/infra/config/generated/builders/ci/Dawn Linux x64 DEPS Builder/properties.json
+++ /dev/null
@@ -1,137 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Dawn Linux x64 DEPS Builder",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-dawn-archive",
- "builder_group": "chromium.dawn",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64,
- "target_platform": "linux"
- },
- "legacy_gclient_config": {
- "config": "chromium"
- },
- "run_tests_serially": true
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Dawn Linux x64 DEPS Release (Intel UHD 630)",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-dawn-archive",
- "builder_group": "chromium.dawn",
- "execution_mode": "TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64,
- "target_platform": "linux"
- },
- "legacy_gclient_config": {
- "config": "chromium"
- },
- "parent": {
- "bucket": "ci",
- "builder": "Dawn Linux x64 DEPS Builder",
- "project": "chromium-m112"
- },
- "run_tests_serially": true
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Dawn Linux x64 DEPS Release (NVIDIA)",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-dawn-archive",
- "builder_group": "chromium.dawn",
- "execution_mode": "TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64,
- "target_platform": "linux"
- },
- "legacy_gclient_config": {
- "config": "chromium"
- },
- "parent": {
- "bucket": "ci",
- "builder": "Dawn Linux x64 DEPS Builder",
- "project": "chromium-m112"
- },
- "run_tests_serially": true
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "Dawn Linux x64 DEPS Builder",
- "project": "chromium-m112"
- }
- ],
- "builder_ids_in_scope_for_testing": [
- {
- "bucket": "ci",
- "builder": "Dawn Linux x64 DEPS Release (Intel UHD 630)",
- "project": "chromium-m112"
- },
- {
- "bucket": "ci",
- "builder": "Dawn Linux x64 DEPS Release (NVIDIA)",
- "project": "chromium-m112"
- }
- ],
- "mirroring_builder_group_and_names": [
- {
- "builder": "dawn-linux-x64-deps-rel",
- "group": "tryserver.chromium.dawn"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-trusted",
- "jobs": 250,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium.dawn",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ]
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/Dawn Linux x64 DEPS Release (Intel UHD 630)/properties.json b/chromium/infra/config/generated/builders/ci/Dawn Linux x64 DEPS Release (Intel UHD 630)/properties.json
deleted file mode 100644
index 0126bb10be1..00000000000
--- a/chromium/infra/config/generated/builders/ci/Dawn Linux x64 DEPS Release (Intel UHD 630)/properties.json
+++ /dev/null
@@ -1,90 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Dawn Linux x64 DEPS Builder",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-dawn-archive",
- "builder_group": "chromium.dawn",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64,
- "target_platform": "linux"
- },
- "legacy_gclient_config": {
- "config": "chromium"
- },
- "run_tests_serially": true
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Dawn Linux x64 DEPS Release (Intel UHD 630)",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-dawn-archive",
- "builder_group": "chromium.dawn",
- "execution_mode": "TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64,
- "target_platform": "linux"
- },
- "legacy_gclient_config": {
- "config": "chromium"
- },
- "parent": {
- "bucket": "ci",
- "builder": "Dawn Linux x64 DEPS Builder",
- "project": "chromium-m112"
- },
- "run_tests_serially": true
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "Dawn Linux x64 DEPS Release (Intel UHD 630)",
- "project": "chromium-m112"
- }
- ],
- "mirroring_builder_group_and_names": [
- {
- "builder": "dawn-linux-x64-deps-rel",
- "group": "tryserver.chromium.dawn"
- }
- ]
- }
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium.dawn",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ]
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/Dawn Linux x64 DEPS Release (NVIDIA)/properties.json b/chromium/infra/config/generated/builders/ci/Dawn Linux x64 DEPS Release (NVIDIA)/properties.json
deleted file mode 100644
index b152050b022..00000000000
--- a/chromium/infra/config/generated/builders/ci/Dawn Linux x64 DEPS Release (NVIDIA)/properties.json
+++ /dev/null
@@ -1,90 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Dawn Linux x64 DEPS Builder",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-dawn-archive",
- "builder_group": "chromium.dawn",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64,
- "target_platform": "linux"
- },
- "legacy_gclient_config": {
- "config": "chromium"
- },
- "run_tests_serially": true
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Dawn Linux x64 DEPS Release (NVIDIA)",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-dawn-archive",
- "builder_group": "chromium.dawn",
- "execution_mode": "TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64,
- "target_platform": "linux"
- },
- "legacy_gclient_config": {
- "config": "chromium"
- },
- "parent": {
- "bucket": "ci",
- "builder": "Dawn Linux x64 DEPS Builder",
- "project": "chromium-m112"
- },
- "run_tests_serially": true
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "Dawn Linux x64 DEPS Release (NVIDIA)",
- "project": "chromium-m112"
- }
- ],
- "mirroring_builder_group_and_names": [
- {
- "builder": "dawn-linux-x64-deps-rel",
- "group": "tryserver.chromium.dawn"
- }
- ]
- }
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium.dawn",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ]
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/GPU Linux Builder/properties.json b/chromium/infra/config/generated/builders/ci/GPU Linux Builder/properties.json
deleted file mode 100644
index a71c8b66cfa..00000000000
--- a/chromium/infra/config/generated/builders/ci/GPU Linux Builder/properties.json
+++ /dev/null
@@ -1,104 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "GPU Linux Builder",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-gpu-archive",
- "builder_group": "chromium.gpu",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "use_clang_coverage"
- ],
- "config": "chromium"
- }
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux Release (NVIDIA)",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-gpu-archive",
- "builder_group": "chromium.gpu",
- "execution_mode": "TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "use_clang_coverage"
- ],
- "config": "chromium"
- },
- "parent": {
- "bucket": "ci",
- "builder": "GPU Linux Builder",
- "project": "chromium-m112"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "GPU Linux Builder",
- "project": "chromium-m112"
- }
- ],
- "builder_ids_in_scope_for_testing": [
- {
- "bucket": "ci",
- "builder": "Linux Release (NVIDIA)",
- "project": "chromium-m112"
- }
- ],
- "mirroring_builder_group_and_names": [
- {
- "builder": "linux-rel",
- "group": "tryserver.chromium.linux"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-trusted",
- "jobs": 250,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium.gpu",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ]
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/GPU Mac Builder/properties.json b/chromium/infra/config/generated/builders/ci/GPU Mac Builder/properties.json
index fb11d0a2120..67be6d3bcf2 100644
--- a/chromium/infra/config/generated/builders/ci/GPU Mac Builder/properties.json
+++ b/chromium/infra/config/generated/builders/ci/GPU Mac Builder/properties.json
@@ -15,8 +15,7 @@
"execution_mode": "COMPILE_AND_TEST",
"legacy_chromium_config": {
"apply_configs": [
- "mb",
- "goma_use_local"
+ "mb"
],
"build_config": "Release",
"config": "chromium",
@@ -43,8 +42,7 @@
"execution_mode": "TEST",
"legacy_chromium_config": {
"apply_configs": [
- "mb",
- "goma_use_local"
+ "mb"
],
"build_config": "Release",
"config": "chromium",
@@ -73,8 +71,7 @@
"execution_mode": "TEST",
"legacy_chromium_config": {
"apply_configs": [
- "mb",
- "goma_use_local"
+ "mb"
],
"build_config": "Release",
"config": "chromium",
diff --git a/chromium/infra/config/generated/builders/ci/Linux ASan LSan Builder/properties.json b/chromium/infra/config/generated/builders/ci/Linux ASan LSan Builder/properties.json
deleted file mode 100644
index 7428e7b56e5..00000000000
--- a/chromium/infra/config/generated/builders/ci/Linux ASan LSan Builder/properties.json
+++ /dev/null
@@ -1,133 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux ASan LSan Builder",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-memory-archive",
- "builder_group": "chromium.memory",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "lsan",
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium_asan",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "config": "chromium"
- }
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux ASan LSan Tests (1)",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-memory-archive",
- "builder_group": "chromium.memory",
- "execution_mode": "TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "lsan",
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium_asan",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "config": "chromium"
- },
- "parent": {
- "bucket": "ci",
- "builder": "Linux ASan LSan Builder",
- "project": "chromium-m112"
- }
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux ASan Tests (sandboxed)",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-memory-archive",
- "builder_group": "chromium.memory",
- "execution_mode": "TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium_asan",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "config": "chromium"
- },
- "parent": {
- "bucket": "ci",
- "builder": "Linux ASan LSan Builder",
- "project": "chromium-m112"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "Linux ASan LSan Builder",
- "project": "chromium-m112"
- }
- ],
- "builder_ids_in_scope_for_testing": [
- {
- "bucket": "ci",
- "builder": "Linux ASan LSan Tests (1)",
- "project": "chromium-m112"
- },
- {
- "bucket": "ci",
- "builder": "Linux ASan Tests (sandboxed)",
- "project": "chromium-m112"
- }
- ],
- "mirroring_builder_group_and_names": [
- {
- "builder": "linux_chromium_asan_rel_ng",
- "group": "tryserver.chromium.linux"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-trusted",
- "jobs": 500,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium.memory",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ]
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/Linux ASan LSan Tests (1)/properties.json b/chromium/infra/config/generated/builders/ci/Linux ASan LSan Tests (1)/properties.json
deleted file mode 100644
index f551dc1a50a..00000000000
--- a/chromium/infra/config/generated/builders/ci/Linux ASan LSan Tests (1)/properties.json
+++ /dev/null
@@ -1,88 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux ASan LSan Builder",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-memory-archive",
- "builder_group": "chromium.memory",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "lsan",
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium_asan",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "config": "chromium"
- }
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux ASan LSan Tests (1)",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-memory-archive",
- "builder_group": "chromium.memory",
- "execution_mode": "TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "lsan",
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium_asan",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "config": "chromium"
- },
- "parent": {
- "bucket": "ci",
- "builder": "Linux ASan LSan Builder",
- "project": "chromium-m112"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "Linux ASan LSan Tests (1)",
- "project": "chromium-m112"
- }
- ],
- "mirroring_builder_group_and_names": [
- {
- "builder": "linux_chromium_asan_rel_ng",
- "group": "tryserver.chromium.linux"
- }
- ]
- }
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium.memory",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ]
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/Linux ASan Tests (sandboxed)/properties.json b/chromium/infra/config/generated/builders/ci/Linux ASan Tests (sandboxed)/properties.json
deleted file mode 100644
index 9dae3801f56..00000000000
--- a/chromium/infra/config/generated/builders/ci/Linux ASan Tests (sandboxed)/properties.json
+++ /dev/null
@@ -1,81 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux ASan LSan Builder",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-memory-archive",
- "builder_group": "chromium.memory",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "lsan",
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium_asan",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "config": "chromium"
- }
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux ASan Tests (sandboxed)",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-memory-archive",
- "builder_group": "chromium.memory",
- "execution_mode": "TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium_asan",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "config": "chromium"
- },
- "parent": {
- "bucket": "ci",
- "builder": "Linux ASan LSan Builder",
- "project": "chromium-m112"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "Linux ASan Tests (sandboxed)",
- "project": "chromium-m112"
- }
- ]
- }
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium.memory",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ]
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/Linux Builder (Wayland)/properties.json b/chromium/infra/config/generated/builders/ci/Linux Builder (Wayland)/properties.json
deleted file mode 100644
index ac6729177fa..00000000000
--- a/chromium/infra/config/generated/builders/ci/Linux Builder (Wayland)/properties.json
+++ /dev/null
@@ -1,104 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux Builder (Wayland)",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-linux-archive",
- "builder_group": "chromium.linux",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "use_clang_coverage"
- ],
- "config": "chromium"
- }
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux Tests (Wayland)",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-linux-archive",
- "builder_group": "chromium.linux",
- "execution_mode": "TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "use_clang_coverage"
- ],
- "config": "chromium"
- },
- "parent": {
- "bucket": "ci",
- "builder": "Linux Builder (Wayland)",
- "project": "chromium-m112"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "Linux Builder (Wayland)",
- "project": "chromium-m112"
- }
- ],
- "builder_ids_in_scope_for_testing": [
- {
- "bucket": "ci",
- "builder": "Linux Tests (Wayland)",
- "project": "chromium-m112"
- }
- ],
- "mirroring_builder_group_and_names": [
- {
- "builder": "linux-wayland-rel",
- "group": "tryserver.chromium.linux"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-trusted",
- "jobs": 250,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium.linux",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ]
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/Linux Builder (dbg)/properties.json b/chromium/infra/config/generated/builders/ci/Linux Builder (dbg)/properties.json
deleted file mode 100644
index 55b9ebd9e4b..00000000000
--- a/chromium/infra/config/generated/builders/ci/Linux Builder (dbg)/properties.json
+++ /dev/null
@@ -1,102 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux Builder (dbg)",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-linux-archive",
- "builder_group": "chromium.linux",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Debug",
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "config": "chromium"
- }
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux Tests (dbg)(1)",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-linux-archive",
- "builder_group": "chromium.linux",
- "execution_mode": "TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Debug",
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "config": "chromium"
- },
- "parent": {
- "bucket": "ci",
- "builder": "Linux Builder (dbg)",
- "project": "chromium-m112"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "Linux Builder (dbg)",
- "project": "chromium-m112"
- }
- ],
- "builder_ids_in_scope_for_testing": [
- {
- "bucket": "ci",
- "builder": "Linux Tests (dbg)(1)",
- "project": "chromium-m112"
- }
- ],
- "mirroring_builder_group_and_names": [
- {
- "builder": "linux_chromium_compile_dbg_ng",
- "group": "tryserver.chromium.linux"
- },
- {
- "builder": "linux_chromium_dbg_ng",
- "group": "tryserver.chromium.linux"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-trusted",
- "jobs": 250,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium.linux",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ]
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/Linux Builder/properties.json b/chromium/infra/config/generated/builders/ci/Linux Builder/properties.json
deleted file mode 100644
index a586a01e96d..00000000000
--- a/chromium/infra/config/generated/builders/ci/Linux Builder/properties.json
+++ /dev/null
@@ -1,104 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux Builder",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-linux-archive",
- "builder_group": "chromium.linux",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "use_clang_coverage"
- ],
- "config": "chromium"
- }
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux Tests",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-linux-archive",
- "builder_group": "chromium.linux",
- "execution_mode": "TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "use_clang_coverage"
- ],
- "config": "chromium"
- },
- "parent": {
- "bucket": "ci",
- "builder": "Linux Builder",
- "project": "chromium-m112"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "Linux Builder",
- "project": "chromium-m112"
- }
- ],
- "builder_ids_in_scope_for_testing": [
- {
- "bucket": "ci",
- "builder": "Linux Tests",
- "project": "chromium-m112"
- }
- ],
- "mirroring_builder_group_and_names": [
- {
- "builder": "linux-rel",
- "group": "tryserver.chromium.linux"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-trusted",
- "jobs": 500,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium.linux",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ]
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/Linux Release (NVIDIA)/properties.json b/chromium/infra/config/generated/builders/ci/Linux Release (NVIDIA)/properties.json
deleted file mode 100644
index 26117a214ad..00000000000
--- a/chromium/infra/config/generated/builders/ci/Linux Release (NVIDIA)/properties.json
+++ /dev/null
@@ -1,92 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "GPU Linux Builder",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-gpu-archive",
- "builder_group": "chromium.gpu",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "use_clang_coverage"
- ],
- "config": "chromium"
- }
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux Release (NVIDIA)",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-gpu-archive",
- "builder_group": "chromium.gpu",
- "execution_mode": "TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "use_clang_coverage"
- ],
- "config": "chromium"
- },
- "parent": {
- "bucket": "ci",
- "builder": "GPU Linux Builder",
- "project": "chromium-m112"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "Linux Release (NVIDIA)",
- "project": "chromium-m112"
- }
- ],
- "mirroring_builder_group_and_names": [
- {
- "builder": "linux-rel",
- "group": "tryserver.chromium.linux"
- }
- ]
- }
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium.gpu",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ]
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/Linux TSan Builder/properties.json b/chromium/infra/config/generated/builders/ci/Linux TSan Builder/properties.json
deleted file mode 100644
index a69db02f0ea..00000000000
--- a/chromium/infra/config/generated/builders/ci/Linux TSan Builder/properties.json
+++ /dev/null
@@ -1,98 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux TSan Builder",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-memory-archive",
- "builder_group": "chromium.memory",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium_tsan2",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "config": "chromium"
- }
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux TSan Tests",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-memory-archive",
- "builder_group": "chromium.memory",
- "execution_mode": "TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium_tsan2",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "config": "chromium"
- },
- "parent": {
- "bucket": "ci",
- "builder": "Linux TSan Builder",
- "project": "chromium-m112"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "Linux TSan Builder",
- "project": "chromium-m112"
- }
- ],
- "builder_ids_in_scope_for_testing": [
- {
- "bucket": "ci",
- "builder": "Linux TSan Tests",
- "project": "chromium-m112"
- }
- ],
- "mirroring_builder_group_and_names": [
- {
- "builder": "linux_chromium_tsan_rel_ng",
- "group": "tryserver.chromium.linux"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-trusted",
- "jobs": 500,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium.memory",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ]
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/Linux TSan Tests/properties.json b/chromium/infra/config/generated/builders/ci/Linux TSan Tests/properties.json
deleted file mode 100644
index eff12277394..00000000000
--- a/chromium/infra/config/generated/builders/ci/Linux TSan Tests/properties.json
+++ /dev/null
@@ -1,91 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux TSan Builder",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-memory-archive",
- "builder_group": "chromium.memory",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium_tsan2",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "config": "chromium"
- }
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux TSan Tests",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-memory-archive",
- "builder_group": "chromium.memory",
- "execution_mode": "TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium_tsan2",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "config": "chromium"
- },
- "parent": {
- "bucket": "ci",
- "builder": "Linux TSan Builder",
- "project": "chromium-m112"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "Linux TSan Tests",
- "project": "chromium-m112"
- }
- ],
- "mirroring_builder_group_and_names": [
- {
- "builder": "linux_chromium_tsan_rel_ng",
- "group": "tryserver.chromium.linux"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-trusted",
- "jobs": 80,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium.memory",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ]
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/Linux Tests (Wayland)/properties.json b/chromium/infra/config/generated/builders/ci/Linux Tests (Wayland)/properties.json
deleted file mode 100644
index b68b6378114..00000000000
--- a/chromium/infra/config/generated/builders/ci/Linux Tests (Wayland)/properties.json
+++ /dev/null
@@ -1,92 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux Builder (Wayland)",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-linux-archive",
- "builder_group": "chromium.linux",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "use_clang_coverage"
- ],
- "config": "chromium"
- }
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux Tests (Wayland)",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-linux-archive",
- "builder_group": "chromium.linux",
- "execution_mode": "TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "use_clang_coverage"
- ],
- "config": "chromium"
- },
- "parent": {
- "bucket": "ci",
- "builder": "Linux Builder (Wayland)",
- "project": "chromium-m112"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "Linux Tests (Wayland)",
- "project": "chromium-m112"
- }
- ],
- "mirroring_builder_group_and_names": [
- {
- "builder": "linux-wayland-rel",
- "group": "tryserver.chromium.linux"
- }
- ]
- }
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium.linux",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ]
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/Linux Tests (dbg)(1)/properties.json b/chromium/infra/config/generated/builders/ci/Linux Tests (dbg)(1)/properties.json
deleted file mode 100644
index b58b9e358e3..00000000000
--- a/chromium/infra/config/generated/builders/ci/Linux Tests (dbg)(1)/properties.json
+++ /dev/null
@@ -1,90 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux Builder (dbg)",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-linux-archive",
- "builder_group": "chromium.linux",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Debug",
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "config": "chromium"
- }
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux Tests (dbg)(1)",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-linux-archive",
- "builder_group": "chromium.linux",
- "execution_mode": "TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Debug",
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "config": "chromium"
- },
- "parent": {
- "bucket": "ci",
- "builder": "Linux Builder (dbg)",
- "project": "chromium-m112"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "Linux Tests (dbg)(1)",
- "project": "chromium-m112"
- }
- ],
- "mirroring_builder_group_and_names": [
- {
- "builder": "linux_chromium_compile_dbg_ng",
- "group": "tryserver.chromium.linux"
- },
- {
- "builder": "linux_chromium_dbg_ng",
- "group": "tryserver.chromium.linux"
- }
- ]
- }
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium.linux",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ]
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/Linux Tests/properties.json b/chromium/infra/config/generated/builders/ci/Linux Tests/properties.json
deleted file mode 100644
index 7ea6d1e3d1b..00000000000
--- a/chromium/infra/config/generated/builders/ci/Linux Tests/properties.json
+++ /dev/null
@@ -1,92 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux Builder",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-linux-archive",
- "builder_group": "chromium.linux",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "use_clang_coverage"
- ],
- "config": "chromium"
- }
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux Tests",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-linux-archive",
- "builder_group": "chromium.linux",
- "execution_mode": "TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "use_clang_coverage"
- ],
- "config": "chromium"
- },
- "parent": {
- "bucket": "ci",
- "builder": "Linux Builder",
- "project": "chromium-m112"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "Linux Tests",
- "project": "chromium-m112"
- }
- ],
- "mirroring_builder_group_and_names": [
- {
- "builder": "linux-rel",
- "group": "tryserver.chromium.linux"
- }
- ]
- }
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium.linux",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ]
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/Mac Builder/properties.json b/chromium/infra/config/generated/builders/ci/Mac Builder/properties.json
index b1327d69a76..3c136215a36 100644
--- a/chromium/infra/config/generated/builders/ci/Mac Builder/properties.json
+++ b/chromium/infra/config/generated/builders/ci/Mac Builder/properties.json
@@ -15,8 +15,7 @@
"execution_mode": "COMPILE_AND_TEST",
"legacy_chromium_config": {
"apply_configs": [
- "mb",
- "goma_use_local"
+ "mb"
],
"build_config": "Release",
"config": "chromium",
@@ -43,8 +42,7 @@
"execution_mode": "TEST",
"legacy_chromium_config": {
"apply_configs": [
- "mb",
- "goma_use_local"
+ "mb"
],
"build_config": "Release",
"config": "chromium",
@@ -76,8 +74,7 @@
"execution_mode": "TEST",
"legacy_chromium_config": {
"apply_configs": [
- "mb",
- "goma_use_local"
+ "mb"
],
"build_config": "Release",
"config": "chromium",
@@ -106,8 +103,7 @@
"execution_mode": "TEST",
"legacy_chromium_config": {
"apply_configs": [
- "mb",
- "goma_use_local"
+ "mb"
],
"build_config": "Release",
"config": "chromium",
@@ -135,8 +131,7 @@
"execution_mode": "TEST",
"legacy_chromium_config": {
"apply_configs": [
- "mb",
- "goma_use_local"
+ "mb"
],
"build_config": "Release",
"config": "chromium",
@@ -164,8 +159,7 @@
"execution_mode": "TEST",
"legacy_chromium_config": {
"apply_configs": [
- "mb",
- "goma_use_local"
+ "mb"
],
"build_config": "Release",
"config": "chromium",
diff --git a/chromium/infra/config/generated/builders/ci/Mac Release (Intel)/properties.json b/chromium/infra/config/generated/builders/ci/Mac Release (Intel)/properties.json
index 646ec816e16..5ef39fcebb9 100644
--- a/chromium/infra/config/generated/builders/ci/Mac Release (Intel)/properties.json
+++ b/chromium/infra/config/generated/builders/ci/Mac Release (Intel)/properties.json
@@ -15,8 +15,7 @@
"execution_mode": "COMPILE_AND_TEST",
"legacy_chromium_config": {
"apply_configs": [
- "mb",
- "goma_use_local"
+ "mb"
],
"build_config": "Release",
"config": "chromium",
@@ -43,8 +42,7 @@
"execution_mode": "TEST",
"legacy_chromium_config": {
"apply_configs": [
- "mb",
- "goma_use_local"
+ "mb"
],
"build_config": "Release",
"config": "chromium",
diff --git a/chromium/infra/config/generated/builders/ci/Mac Retina Release (AMD)/properties.json b/chromium/infra/config/generated/builders/ci/Mac Retina Release (AMD)/properties.json
index 5920583e126..9bba6249938 100644
--- a/chromium/infra/config/generated/builders/ci/Mac Retina Release (AMD)/properties.json
+++ b/chromium/infra/config/generated/builders/ci/Mac Retina Release (AMD)/properties.json
@@ -15,8 +15,7 @@
"execution_mode": "COMPILE_AND_TEST",
"legacy_chromium_config": {
"apply_configs": [
- "mb",
- "goma_use_local"
+ "mb"
],
"build_config": "Release",
"config": "chromium",
@@ -43,8 +42,7 @@
"execution_mode": "TEST",
"legacy_chromium_config": {
"apply_configs": [
- "mb",
- "goma_use_local"
+ "mb"
],
"build_config": "Release",
"config": "chromium",
diff --git a/chromium/infra/config/generated/builders/ci/Mac10.13 Tests/properties.json b/chromium/infra/config/generated/builders/ci/Mac10.13 Tests/properties.json
index 1d74f0c0d95..640a541ee08 100644
--- a/chromium/infra/config/generated/builders/ci/Mac10.13 Tests/properties.json
+++ b/chromium/infra/config/generated/builders/ci/Mac10.13 Tests/properties.json
@@ -15,8 +15,7 @@
"execution_mode": "COMPILE_AND_TEST",
"legacy_chromium_config": {
"apply_configs": [
- "mb",
- "goma_use_local"
+ "mb"
],
"build_config": "Release",
"config": "chromium",
@@ -43,8 +42,7 @@
"execution_mode": "TEST",
"legacy_chromium_config": {
"apply_configs": [
- "mb",
- "goma_use_local"
+ "mb"
],
"build_config": "Release",
"config": "chromium",
diff --git a/chromium/infra/config/generated/builders/ci/Mac10.14 Tests/properties.json b/chromium/infra/config/generated/builders/ci/Mac10.14 Tests/properties.json
index 687df744606..3f158b7e934 100644
--- a/chromium/infra/config/generated/builders/ci/Mac10.14 Tests/properties.json
+++ b/chromium/infra/config/generated/builders/ci/Mac10.14 Tests/properties.json
@@ -15,8 +15,7 @@
"execution_mode": "COMPILE_AND_TEST",
"legacy_chromium_config": {
"apply_configs": [
- "mb",
- "goma_use_local"
+ "mb"
],
"build_config": "Release",
"config": "chromium",
@@ -43,8 +42,7 @@
"execution_mode": "TEST",
"legacy_chromium_config": {
"apply_configs": [
- "mb",
- "goma_use_local"
+ "mb"
],
"build_config": "Release",
"config": "chromium",
diff --git a/chromium/infra/config/generated/builders/ci/Mac10.15 Tests/properties.json b/chromium/infra/config/generated/builders/ci/Mac10.15 Tests/properties.json
index 4e6dcc08ea5..85ee7bb687a 100644
--- a/chromium/infra/config/generated/builders/ci/Mac10.15 Tests/properties.json
+++ b/chromium/infra/config/generated/builders/ci/Mac10.15 Tests/properties.json
@@ -15,8 +15,7 @@
"execution_mode": "COMPILE_AND_TEST",
"legacy_chromium_config": {
"apply_configs": [
- "mb",
- "goma_use_local"
+ "mb"
],
"build_config": "Release",
"config": "chromium",
@@ -43,8 +42,7 @@
"execution_mode": "TEST",
"legacy_chromium_config": {
"apply_configs": [
- "mb",
- "goma_use_local"
+ "mb"
],
"build_config": "Release",
"config": "chromium",
diff --git a/chromium/infra/config/generated/builders/ci/Mac11 Tests/properties.json b/chromium/infra/config/generated/builders/ci/Mac11 Tests/properties.json
index 4e61334c565..85e28fb3419 100644
--- a/chromium/infra/config/generated/builders/ci/Mac11 Tests/properties.json
+++ b/chromium/infra/config/generated/builders/ci/Mac11 Tests/properties.json
@@ -15,8 +15,7 @@
"execution_mode": "COMPILE_AND_TEST",
"legacy_chromium_config": {
"apply_configs": [
- "mb",
- "goma_use_local"
+ "mb"
],
"build_config": "Release",
"config": "chromium",
@@ -42,8 +41,7 @@
"execution_mode": "TEST",
"legacy_chromium_config": {
"apply_configs": [
- "mb",
- "goma_use_local"
+ "mb"
],
"build_config": "Release",
"config": "chromium",
diff --git a/chromium/infra/config/generated/builders/ci/Mac12 Tests/properties.json b/chromium/infra/config/generated/builders/ci/Mac12 Tests/properties.json
index 2953e1b6121..cd1531a320c 100644
--- a/chromium/infra/config/generated/builders/ci/Mac12 Tests/properties.json
+++ b/chromium/infra/config/generated/builders/ci/Mac12 Tests/properties.json
@@ -15,8 +15,7 @@
"execution_mode": "COMPILE_AND_TEST",
"legacy_chromium_config": {
"apply_configs": [
- "mb",
- "goma_use_local"
+ "mb"
],
"build_config": "Release",
"config": "chromium",
@@ -42,8 +41,7 @@
"execution_mode": "TEST",
"legacy_chromium_config": {
"apply_configs": [
- "mb",
- "goma_use_local"
+ "mb"
],
"build_config": "Release",
"config": "chromium",
diff --git a/chromium/infra/config/generated/builders/ci/VR Linux/properties.json b/chromium/infra/config/generated/builders/ci/VR Linux/properties.json
deleted file mode 100644
index 426b5d83583..00000000000
--- a/chromium/infra/config/generated/builders/ci/VR Linux/properties.json
+++ /dev/null
@@ -1,63 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "VR Linux",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-fyi-archive",
- "builder_group": "chromium.fyi",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "VR Linux",
- "project": "chromium-m112"
- }
- ],
- "mirroring_builder_group_and_names": [
- {
- "builder": "linux_vr",
- "group": "tryserver.chromium.linux"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-trusted",
- "jobs": 500,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium.fyi",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ]
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/Win Builder/properties.json b/chromium/infra/config/generated/builders/ci/Win Builder/properties.json
index 3a9ab117d88..daae51ba6a5 100644
--- a/chromium/infra/config/generated/builders/ci/Win Builder/properties.json
+++ b/chromium/infra/config/generated/builders/ci/Win Builder/properties.json
@@ -15,7 +15,6 @@
"execution_mode": "COMPILE_AND_TEST",
"legacy_chromium_config": {
"apply_configs": [
- "goma_enable_global_file_stat_cache",
"mb"
],
"build_config": "Release",
diff --git a/chromium/infra/config/generated/builders/ci/chromeos-amd64-generic-dbg/properties.json b/chromium/infra/config/generated/builders/ci/chromeos-amd64-generic-dbg/properties.json
deleted file mode 100644
index dfdfac6c220..00000000000
--- a/chromium/infra/config/generated/builders/ci/chromeos-amd64-generic-dbg/properties.json
+++ /dev/null
@@ -1,71 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "chromeos-amd64-generic-dbg",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-chromiumos-archive",
- "builder_group": "chromium.chromiumos",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Debug",
- "config": "chromium",
- "target_arch": "intel",
- "target_bits": 64,
- "target_cros_boards": [
- "amd64-generic"
- ],
- "target_platform": "chromeos"
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "chromeos"
- ],
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "chromeos-amd64-generic-dbg",
- "project": "chromium-m112"
- }
- ],
- "mirroring_builder_group_and_names": [
- {
- "builder": "chromeos-amd64-generic-dbg",
- "group": "tryserver.chromium.chromiumos"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-trusted",
- "jobs": 500,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium.chromiumos",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ]
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/chromeos-amd64-generic-lacros-dbg/properties.json b/chromium/infra/config/generated/builders/ci/chromeos-amd64-generic-lacros-dbg/properties.json
deleted file mode 100644
index e81e7f6096e..00000000000
--- a/chromium/infra/config/generated/builders/ci/chromeos-amd64-generic-lacros-dbg/properties.json
+++ /dev/null
@@ -1,72 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "chromeos-amd64-generic-lacros-dbg",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-chromiumos-archive",
- "builder_group": "chromium.chromiumos",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Debug",
- "config": "chromium",
- "target_arch": "intel",
- "target_bits": 64,
- "target_cros_boards": [
- "amd64-generic"
- ],
- "target_platform": "chromeos"
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "checkout_lacros_sdk",
- "chromeos"
- ],
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "chromeos-amd64-generic-lacros-dbg",
- "project": "chromium-m112"
- }
- ],
- "mirroring_builder_group_and_names": [
- {
- "builder": "chromeos-amd64-generic-lacros-dbg",
- "group": "tryserver.chromium.chromiumos"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-trusted",
- "jobs": 500,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium.chromiumos",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ]
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/chromeos-amd64-generic-rel/properties.json b/chromium/infra/config/generated/builders/ci/chromeos-amd64-generic-rel/properties.json
deleted file mode 100644
index cb776fe5087..00000000000
--- a/chromium/infra/config/generated/builders/ci/chromeos-amd64-generic-rel/properties.json
+++ /dev/null
@@ -1,75 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "chromeos-amd64-generic-rel",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-chromiumos-archive",
- "builder_group": "chromium.chromiumos",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "cros_boards_with_qemu_images": [
- "amd64-generic-vm"
- ],
- "target_arch": "intel",
- "target_bits": 64,
- "target_cros_boards": [
- "amd64-generic"
- ],
- "target_platform": "chromeos"
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "chromeos",
- "checkout_lacros_sdk"
- ],
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "chromeos-amd64-generic-rel",
- "project": "chromium-m112"
- }
- ],
- "mirroring_builder_group_and_names": [
- {
- "builder": "chromeos-amd64-generic-rel",
- "group": "tryserver.chromium.chromiumos"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-trusted",
- "jobs": 500,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium.chromiumos",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ]
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/chromeos-arm-generic-rel/properties.json b/chromium/infra/config/generated/builders/ci/chromeos-arm-generic-rel/properties.json
deleted file mode 100644
index d1ed79b82bb..00000000000
--- a/chromium/infra/config/generated/builders/ci/chromeos-arm-generic-rel/properties.json
+++ /dev/null
@@ -1,70 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "chromeos-arm-generic-rel",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "builder_group": "chromium.chromiumos",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_arch": "arm",
- "target_bits": 32,
- "target_cros_boards": [
- "arm-generic"
- ],
- "target_platform": "chromeos"
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "chromeos"
- ],
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "chromeos-arm-generic-rel",
- "project": "chromium-m112"
- }
- ],
- "mirroring_builder_group_and_names": [
- {
- "builder": "chromeos-arm-generic-rel",
- "group": "tryserver.chromium.chromiumos"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-trusted",
- "jobs": 500,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium.chromiumos",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ]
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/chromeos-arm64-generic-rel/properties.json b/chromium/infra/config/generated/builders/ci/chromeos-arm64-generic-rel/properties.json
deleted file mode 100644
index 4c451d1e6c1..00000000000
--- a/chromium/infra/config/generated/builders/ci/chromeos-arm64-generic-rel/properties.json
+++ /dev/null
@@ -1,70 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "chromeos-arm64-generic-rel",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "builder_group": "chromium.chromiumos",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_arch": "arm",
- "target_bits": 64,
- "target_cros_boards": [
- "arm64-generic"
- ],
- "target_platform": "chromeos"
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "chromeos"
- ],
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "chromeos-arm64-generic-rel",
- "project": "chromium-m112"
- }
- ],
- "mirroring_builder_group_and_names": [
- {
- "builder": "chromeos-arm64-generic-rel",
- "group": "tryserver.chromium.chromiumos"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-trusted",
- "jobs": 250,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium.chromiumos",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ]
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/chromeos-jacuzzi-rel/properties.json b/chromium/infra/config/generated/builders/ci/chromeos-jacuzzi-rel/properties.json
deleted file mode 100644
index 75ac1c77fb8..00000000000
--- a/chromium/infra/config/generated/builders/ci/chromeos-jacuzzi-rel/properties.json
+++ /dev/null
@@ -1,72 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "chromeos-jacuzzi-rel",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-chromiumos-archive",
- "builder_group": "chromium.chromiumos",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_arch": "arm",
- "target_bits": 32,
- "target_cros_boards": [
- "jacuzzi"
- ],
- "target_platform": "chromeos"
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "arm",
- "chromeos"
- ],
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "chromeos-jacuzzi-rel",
- "project": "chromium-m112"
- }
- ],
- "mirroring_builder_group_and_names": [
- {
- "builder": "chromeos-jacuzzi-rel",
- "group": "tryserver.chromium.chromiumos"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-trusted",
- "jobs": 500,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium.chromiumos",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ]
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/chromeos-octopus-rel/properties.json b/chromium/infra/config/generated/builders/ci/chromeos-octopus-rel/properties.json
deleted file mode 100644
index 54c4a8e0437..00000000000
--- a/chromium/infra/config/generated/builders/ci/chromeos-octopus-rel/properties.json
+++ /dev/null
@@ -1,71 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "chromeos-octopus-rel",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-chromiumos-archive",
- "builder_group": "chromium.chromiumos",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_arch": "intel",
- "target_bits": 64,
- "target_cros_boards": [
- "octopus"
- ],
- "target_platform": "chromeos"
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "chromeos"
- ],
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "chromeos-octopus-rel",
- "project": "chromium-m112"
- }
- ],
- "mirroring_builder_group_and_names": [
- {
- "builder": "chromeos-octopus-rel",
- "group": "tryserver.chromium.chromiumos"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-trusted",
- "jobs": 500,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium.chromiumos",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ]
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/fuchsia-arm64-cast-receiver-rel/properties.json b/chromium/infra/config/generated/builders/ci/fuchsia-arm64-cast-receiver-rel/properties.json
index 89694b0fb15..8120cdc407d 100644
--- a/chromium/infra/config/generated/builders/ci/fuchsia-arm64-cast-receiver-rel/properties.json
+++ b/chromium/infra/config/generated/builders/ci/fuchsia-arm64-cast-receiver-rel/properties.json
@@ -64,6 +64,6 @@
"builder_group": "chromium.fuchsia",
"recipe": "chromium",
"sheriff_rotations": [
- "chrome_browser_release"
+ "fuchsia"
]
} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/fuchsia-arm64-rel/properties.json b/chromium/infra/config/generated/builders/ci/fuchsia-arm64-rel/properties.json
index bb744a1da24..b57b24315ae 100644
--- a/chromium/infra/config/generated/builders/ci/fuchsia-arm64-rel/properties.json
+++ b/chromium/infra/config/generated/builders/ci/fuchsia-arm64-rel/properties.json
@@ -64,6 +64,6 @@
"builder_group": "chromium.fuchsia",
"recipe": "chromium",
"sheriff_rotations": [
- "chrome_browser_release"
+ "fuchsia"
]
} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/fuchsia-official/properties.json b/chromium/infra/config/generated/builders/ci/fuchsia-official/properties.json
index 857c1da278c..e4d97e31398 100644
--- a/chromium/infra/config/generated/builders/ci/fuchsia-official/properties.json
+++ b/chromium/infra/config/generated/builders/ci/fuchsia-official/properties.json
@@ -61,6 +61,6 @@
"builder_group": "chromium",
"recipe": "chromium",
"sheriff_rotations": [
- "chrome_browser_release"
+ "fuchsia"
]
} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/fuchsia-x64-cast-receiver-rel/properties.json b/chromium/infra/config/generated/builders/ci/fuchsia-x64-cast-receiver-rel/properties.json
index 2199ae01e99..6daa0292391 100644
--- a/chromium/infra/config/generated/builders/ci/fuchsia-x64-cast-receiver-rel/properties.json
+++ b/chromium/infra/config/generated/builders/ci/fuchsia-x64-cast-receiver-rel/properties.json
@@ -62,6 +62,6 @@
"builder_group": "chromium.fuchsia",
"recipe": "chromium",
"sheriff_rotations": [
- "chrome_browser_release"
+ "fuchsia"
]
} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/fuchsia-x64-rel/properties.json b/chromium/infra/config/generated/builders/ci/fuchsia-x64-rel/properties.json
index bfae830e1d4..b40c5e70066 100644
--- a/chromium/infra/config/generated/builders/ci/fuchsia-x64-rel/properties.json
+++ b/chromium/infra/config/generated/builders/ci/fuchsia-x64-rel/properties.json
@@ -62,6 +62,6 @@
"builder_group": "chromium.fuchsia",
"recipe": "chromium",
"sheriff_rotations": [
- "chrome_browser_release"
+ "fuchsia"
]
} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/ios-simulator-cronet/properties.json b/chromium/infra/config/generated/builders/ci/ios-simulator-cronet/properties.json
deleted file mode 100644
index ad89bc907f4..00000000000
--- a/chromium/infra/config/generated/builders/ci/ios-simulator-cronet/properties.json
+++ /dev/null
@@ -1,67 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "ios-simulator-cronet",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-fyi-archive",
- "builder_group": "chromium.fyi",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb",
- "mac_toolchain"
- ],
- "build_config": "Debug",
- "config": "chromium",
- "target_bits": 64,
- "target_platform": "ios"
- },
- "legacy_gclient_config": {
- "config": "ios"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "ios-simulator-cronet",
- "project": "chromium-m112"
- }
- ],
- "mirroring_builder_group_and_names": [
- {
- "builder": "ios-simulator-cronet",
- "group": "tryserver.chromium.mac"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-trusted",
- "jobs": 250,
- "metrics_project": "chromium-reclient-metrics",
- "scandeps_server": true
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium.fyi",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ],
- "xcode_build_version": "14c18"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/ios-simulator-full-configs/properties.json b/chromium/infra/config/generated/builders/ci/ios-simulator-full-configs/properties.json
deleted file mode 100644
index be1f41b0dae..00000000000
--- a/chromium/infra/config/generated/builders/ci/ios-simulator-full-configs/properties.json
+++ /dev/null
@@ -1,70 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "ios-simulator-full-configs",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-mac-archive",
- "builder_group": "chromium.mac",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb",
- "mac_toolchain"
- ],
- "build_config": "Debug",
- "config": "chromium",
- "target_bits": 64,
- "target_platform": "ios"
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "use_clang_coverage"
- ],
- "config": "ios"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "ios-simulator-full-configs",
- "project": "chromium-m112"
- }
- ],
- "mirroring_builder_group_and_names": [
- {
- "builder": "ios-simulator-full-configs",
- "group": "tryserver.chromium.mac"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-trusted",
- "jobs": 250,
- "metrics_project": "chromium-reclient-metrics",
- "scandeps_server": true
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium.mac",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ],
- "xcode_build_version": "14c18"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/ios-simulator/properties.json b/chromium/infra/config/generated/builders/ci/ios-simulator/properties.json
deleted file mode 100644
index 9e16b0a026f..00000000000
--- a/chromium/infra/config/generated/builders/ci/ios-simulator/properties.json
+++ /dev/null
@@ -1,70 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "ios-simulator",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-mac-archive",
- "builder_group": "chromium.mac",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb",
- "mac_toolchain"
- ],
- "build_config": "Debug",
- "config": "chromium",
- "target_bits": 64,
- "target_platform": "ios"
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "use_clang_coverage"
- ],
- "config": "ios"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "ios-simulator",
- "project": "chromium-m112"
- }
- ],
- "mirroring_builder_group_and_names": [
- {
- "builder": "ios-simulator",
- "group": "tryserver.chromium.mac"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-trusted",
- "jobs": 250,
- "metrics_project": "chromium-reclient-metrics",
- "scandeps_server": true
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium.mac",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ],
- "xcode_build_version": "14c18"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/lacros-amd64-generic-rel/properties.json b/chromium/infra/config/generated/builders/ci/lacros-amd64-generic-rel/properties.json
deleted file mode 100644
index a4b25588913..00000000000
--- a/chromium/infra/config/generated/builders/ci/lacros-amd64-generic-rel/properties.json
+++ /dev/null
@@ -1,79 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "lacros-amd64-generic-rel",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-chromiumos-archive",
- "builder_group": "chromium.chromiumos",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "cros_boards_with_qemu_images": [
- "amd64-generic"
- ],
- "target_arch": "intel",
- "target_bits": 64,
- "target_cros_boards": [
- "eve"
- ],
- "target_platform": "chromeos"
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "checkout_lacros_sdk",
- "chromeos"
- ],
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "lacros-amd64-generic-rel",
- "project": "chromium-m112"
- }
- ],
- "mirroring_builder_group_and_names": [
- {
- "builder": "lacros-amd64-generic-rel",
- "group": "tryserver.chromium.chromiumos"
- },
- {
- "builder": "lacros-amd64-generic-rel-orchestrator",
- "group": "tryserver.chromium.chromiumos"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-trusted",
- "jobs": 500,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium.chromiumos",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ]
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/lacros-arm-generic-rel/properties.json b/chromium/infra/config/generated/builders/ci/lacros-arm-generic-rel/properties.json
deleted file mode 100644
index c8e8e0db968..00000000000
--- a/chromium/infra/config/generated/builders/ci/lacros-arm-generic-rel/properties.json
+++ /dev/null
@@ -1,73 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "lacros-arm-generic-rel",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-chromiumos-archive",
- "builder_group": "chromium.chromiumos",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_arch": "intel",
- "target_bits": 64,
- "target_cros_boards": [
- "arm-generic",
- "jacuzzi"
- ],
- "target_platform": "chromeos"
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "checkout_lacros_sdk",
- "chromeos"
- ],
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "lacros-arm-generic-rel",
- "project": "chromium-m112"
- }
- ],
- "mirroring_builder_group_and_names": [
- {
- "builder": "lacros-arm-generic-rel",
- "group": "tryserver.chromium.chromiumos"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-trusted",
- "jobs": 500,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium.chromiumos",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ]
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/lacros-arm64-generic-rel/properties.json b/chromium/infra/config/generated/builders/ci/lacros-arm64-generic-rel/properties.json
deleted file mode 100644
index e0462e927e6..00000000000
--- a/chromium/infra/config/generated/builders/ci/lacros-arm64-generic-rel/properties.json
+++ /dev/null
@@ -1,72 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "lacros-arm64-generic-rel",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-chromiumos-archive",
- "builder_group": "chromium.chromiumos",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_arch": "arm",
- "target_bits": 64,
- "target_cros_boards": [
- "arm64-generic"
- ],
- "target_platform": "chromeos"
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "checkout_lacros_sdk",
- "chromeos"
- ],
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "lacros-arm64-generic-rel",
- "project": "chromium-m112"
- }
- ],
- "mirroring_builder_group_and_names": [
- {
- "builder": "lacros-arm64-generic-rel",
- "group": "tryserver.chromium.chromiumos"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-trusted",
- "jobs": 500,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium.chromiumos",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ]
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/linux-chromeos-dbg/properties.json b/chromium/infra/config/generated/builders/ci/linux-chromeos-dbg/properties.json
deleted file mode 100644
index 7d8a62c5176..00000000000
--- a/chromium/infra/config/generated/builders/ci/linux-chromeos-dbg/properties.json
+++ /dev/null
@@ -1,71 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "linux-chromeos-dbg",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-chromiumos-archive",
- "builder_group": "chromium.chromiumos",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Debug",
- "config": "chromium",
- "target_arch": "intel",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "chromeos"
- ],
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "linux-chromeos-dbg",
- "project": "chromium-m112"
- }
- ],
- "mirroring_builder_group_and_names": [
- {
- "builder": "linux-chromeos-compile-dbg",
- "group": "tryserver.chromium.chromiumos"
- },
- {
- "builder": "linux-chromeos-dbg",
- "group": "tryserver.chromium.chromiumos"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-trusted",
- "jobs": 500,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium.chromiumos",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ]
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/linux-chromeos-rel/properties.json b/chromium/infra/config/generated/builders/ci/linux-chromeos-rel/properties.json
deleted file mode 100644
index 15974acd907..00000000000
--- a/chromium/infra/config/generated/builders/ci/linux-chromeos-rel/properties.json
+++ /dev/null
@@ -1,68 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "linux-chromeos-rel",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-chromiumos-archive",
- "builder_group": "chromium.chromiumos",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_arch": "intel",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "use_clang_coverage",
- "chromeos"
- ],
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "linux-chromeos-rel",
- "project": "chromium-m112"
- }
- ],
- "mirroring_builder_group_and_names": [
- {
- "builder": "linux-chromeos-rel",
- "group": "tryserver.chromium.chromiumos"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-trusted",
- "jobs": 500,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium.chromiumos",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ]
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/linux-lacros-builder-rel/properties.json b/chromium/infra/config/generated/builders/ci/linux-lacros-builder-rel/properties.json
deleted file mode 100644
index f62044b2322..00000000000
--- a/chromium/infra/config/generated/builders/ci/linux-lacros-builder-rel/properties.json
+++ /dev/null
@@ -1,107 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "linux-lacros-builder-rel",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-chromiumos-archive",
- "builder_group": "chromium.chromiumos",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_arch": "intel",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "chromeos"
- ],
- "config": "chromium_no_telemetry_dependencies"
- }
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "linux-lacros-tester-rel",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-chromiumos-archive",
- "builder_group": "chromium.chromiumos",
- "execution_mode": "TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_arch": "intel",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "use_clang_coverage",
- "chromeos"
- ],
- "config": "chromium_no_telemetry_dependencies"
- },
- "parent": {
- "bucket": "ci",
- "builder": "linux-lacros-builder-rel",
- "project": "chromium-m112"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "linux-lacros-builder-rel",
- "project": "chromium-m112"
- }
- ],
- "builder_ids_in_scope_for_testing": [
- {
- "bucket": "ci",
- "builder": "linux-lacros-tester-rel",
- "project": "chromium-m112"
- }
- ],
- "mirroring_builder_group_and_names": [
- {
- "builder": "linux-lacros-rel",
- "group": "tryserver.chromium.chromiumos"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-trusted",
- "jobs": 500,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium.chromiumos",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ]
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/linux-lacros-dbg/properties.json b/chromium/infra/config/generated/builders/ci/linux-lacros-dbg/properties.json
deleted file mode 100644
index 9e1130344e9..00000000000
--- a/chromium/infra/config/generated/builders/ci/linux-lacros-dbg/properties.json
+++ /dev/null
@@ -1,61 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "linux-lacros-dbg",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-chromiumos-archive",
- "builder_group": "chromium.chromiumos",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Debug",
- "config": "chromium",
- "target_arch": "intel",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "chromeos"
- ],
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "linux-lacros-dbg",
- "project": "chromium-m112"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-trusted",
- "jobs": 500,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium.chromiumos",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ]
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/linux-lacros-tester-rel/properties.json b/chromium/infra/config/generated/builders/ci/linux-lacros-tester-rel/properties.json
deleted file mode 100644
index 1e6d9f6676e..00000000000
--- a/chromium/infra/config/generated/builders/ci/linux-lacros-tester-rel/properties.json
+++ /dev/null
@@ -1,95 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "linux-lacros-builder-rel",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-chromiumos-archive",
- "builder_group": "chromium.chromiumos",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_arch": "intel",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "chromeos"
- ],
- "config": "chromium_no_telemetry_dependencies"
- }
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "linux-lacros-tester-rel",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-chromiumos-archive",
- "builder_group": "chromium.chromiumos",
- "execution_mode": "TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_arch": "intel",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "use_clang_coverage",
- "chromeos"
- ],
- "config": "chromium_no_telemetry_dependencies"
- },
- "parent": {
- "bucket": "ci",
- "builder": "linux-lacros-builder-rel",
- "project": "chromium-m112"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "linux-lacros-tester-rel",
- "project": "chromium-m112"
- }
- ],
- "mirroring_builder_group_and_names": [
- {
- "builder": "linux-lacros-rel",
- "group": "tryserver.chromium.chromiumos"
- }
- ]
- }
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium.chromiumos",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ]
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/ci/linux-official/properties.json b/chromium/infra/config/generated/builders/ci/linux-official/properties.json
deleted file mode 100644
index 0b9c3fb358d..00000000000
--- a/chromium/infra/config/generated/builders/ci/linux-official/properties.json
+++ /dev/null
@@ -1,64 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "linux-official",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "builder_group": "chromium",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "checkout_pgo_profiles"
- ],
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "linux-official",
- "project": "chromium-m112"
- }
- ],
- "mirroring_builder_group_and_names": [
- {
- "builder": "linux-official",
- "group": "tryserver.chromium"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-trusted",
- "jobs": 250,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "chromium",
- "recipe": "chromium",
- "sheriff_rotations": [
- "chrome_browser_release"
- ]
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/chromeos-amd64-generic-dbg/properties.json b/chromium/infra/config/generated/builders/try/chromeos-amd64-generic-dbg/properties.json
deleted file mode 100644
index 4447d931473..00000000000
--- a/chromium/infra/config/generated/builders/try/chromeos-amd64-generic-dbg/properties.json
+++ /dev/null
@@ -1,62 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "chromeos-amd64-generic-dbg",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-chromiumos-archive",
- "builder_group": "chromium.chromiumos",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Debug",
- "config": "chromium",
- "target_arch": "intel",
- "target_bits": 64,
- "target_cros_boards": [
- "amd64-generic"
- ],
- "target_platform": "chromeos"
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "chromeos"
- ],
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "chromeos-amd64-generic-dbg",
- "project": "chromium-m112"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-untrusted",
- "jobs": 150,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.chromiumos",
- "recipe": "chromium_trybot"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/chromeos-amd64-generic-lacros-dbg/properties.json b/chromium/infra/config/generated/builders/try/chromeos-amd64-generic-lacros-dbg/properties.json
deleted file mode 100644
index 2aed8d0006b..00000000000
--- a/chromium/infra/config/generated/builders/try/chromeos-amd64-generic-lacros-dbg/properties.json
+++ /dev/null
@@ -1,63 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "chromeos-amd64-generic-lacros-dbg",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-chromiumos-archive",
- "builder_group": "chromium.chromiumos",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Debug",
- "config": "chromium",
- "target_arch": "intel",
- "target_bits": 64,
- "target_cros_boards": [
- "amd64-generic"
- ],
- "target_platform": "chromeos"
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "checkout_lacros_sdk",
- "chromeos"
- ],
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "chromeos-amd64-generic-lacros-dbg",
- "project": "chromium-m112"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-untrusted",
- "jobs": 150,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.chromiumos",
- "recipe": "chromium_trybot"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/chromeos-amd64-generic-rel-compilator/properties.json b/chromium/infra/config/generated/builders/try/chromeos-amd64-generic-rel-compilator/properties.json
deleted file mode 100644
index 6d4b90f7503..00000000000
--- a/chromium/infra/config/generated/builders/try/chromeos-amd64-generic-rel-compilator/properties.json
+++ /dev/null
@@ -1,66 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "chromeos-amd64-generic-rel",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-chromiumos-archive",
- "builder_group": "chromium.chromiumos",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "cros_boards_with_qemu_images": [
- "amd64-generic-vm"
- ],
- "target_arch": "intel",
- "target_bits": 64,
- "target_cros_boards": [
- "amd64-generic"
- ],
- "target_platform": "chromeos"
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "chromeos",
- "checkout_lacros_sdk"
- ],
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "chromeos-amd64-generic-rel",
- "project": "chromium-m112"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-untrusted",
- "jobs": 300,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.chromiumos",
- "recipe": "chromium/compilator"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/chromeos-amd64-generic-rel/properties.json b/chromium/infra/config/generated/builders/try/chromeos-amd64-generic-rel/properties.json
deleted file mode 100644
index a82dff34e54..00000000000
--- a/chromium/infra/config/generated/builders/try/chromeos-amd64-generic-rel/properties.json
+++ /dev/null
@@ -1,65 +0,0 @@
-{
- "$build/chromium_orchestrator": {
- "compilator": "chromeos-amd64-generic-rel-compilator",
- "compilator_watcher_git_revision": "e6d08be3fd589d4f222dae5d18dbc972e6117b23"
- },
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "chromeos-amd64-generic-rel",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-chromiumos-archive",
- "builder_group": "chromium.chromiumos",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "cros_boards_with_qemu_images": [
- "amd64-generic-vm"
- ],
- "target_arch": "intel",
- "target_bits": 64,
- "target_cros_boards": [
- "amd64-generic"
- ],
- "target_platform": "chromeos"
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "chromeos",
- "checkout_lacros_sdk"
- ],
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "chromeos-amd64-generic-rel",
- "project": "chromium-m112"
- }
- ]
- }
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.chromiumos",
- "recipe": "chromium/orchestrator"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/chromeos-arm-generic-rel/properties.json b/chromium/infra/config/generated/builders/try/chromeos-arm-generic-rel/properties.json
deleted file mode 100644
index fdf7a12d193..00000000000
--- a/chromium/infra/config/generated/builders/try/chromeos-arm-generic-rel/properties.json
+++ /dev/null
@@ -1,61 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "chromeos-arm-generic-rel",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "builder_group": "chromium.chromiumos",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_arch": "arm",
- "target_bits": 32,
- "target_cros_boards": [
- "arm-generic"
- ],
- "target_platform": "chromeos"
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "chromeos"
- ],
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "chromeos-arm-generic-rel",
- "project": "chromium-m112"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-untrusted",
- "jobs": 150,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.chromiumos",
- "recipe": "chromium_trybot"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/chromeos-arm64-generic-rel/properties.json b/chromium/infra/config/generated/builders/try/chromeos-arm64-generic-rel/properties.json
deleted file mode 100644
index d4749780d69..00000000000
--- a/chromium/infra/config/generated/builders/try/chromeos-arm64-generic-rel/properties.json
+++ /dev/null
@@ -1,61 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "chromeos-arm64-generic-rel",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "builder_group": "chromium.chromiumos",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_arch": "arm",
- "target_bits": 64,
- "target_cros_boards": [
- "arm64-generic"
- ],
- "target_platform": "chromeos"
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "chromeos"
- ],
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "chromeos-arm64-generic-rel",
- "project": "chromium-m112"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-untrusted",
- "jobs": 150,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.chromiumos",
- "recipe": "chromium_trybot"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/chromeos-jacuzzi-rel/properties.json b/chromium/infra/config/generated/builders/try/chromeos-jacuzzi-rel/properties.json
deleted file mode 100644
index 84fa7267b7d..00000000000
--- a/chromium/infra/config/generated/builders/try/chromeos-jacuzzi-rel/properties.json
+++ /dev/null
@@ -1,68 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "chromeos-jacuzzi-rel",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-chromiumos-archive",
- "builder_group": "chromium.chromiumos",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_arch": "arm",
- "target_bits": 32,
- "target_cros_boards": [
- "jacuzzi"
- ],
- "target_platform": "chromeos"
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "arm",
- "chromeos"
- ],
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "chromeos-jacuzzi-rel",
- "project": "chromium-m112"
- }
- ]
- }
- },
- "$build/goma": {
- "enable_ats": true,
- "rpc_extra_params": "?prod",
- "server_host": "goma.chromium.org"
- },
- "$build/reclient": {
- "instance": "rbe-chromium-untrusted",
- "jobs": 150,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.chromiumos",
- "recipe": "chromium_trybot"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/chromeos-octopus-rel/properties.json b/chromium/infra/config/generated/builders/try/chromeos-octopus-rel/properties.json
deleted file mode 100644
index 0b4b76f859a..00000000000
--- a/chromium/infra/config/generated/builders/try/chromeos-octopus-rel/properties.json
+++ /dev/null
@@ -1,67 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "chromeos-octopus-rel",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-chromiumos-archive",
- "builder_group": "chromium.chromiumos",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_arch": "intel",
- "target_bits": 64,
- "target_cros_boards": [
- "octopus"
- ],
- "target_platform": "chromeos"
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "chromeos"
- ],
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "chromeos-octopus-rel",
- "project": "chromium-m112"
- }
- ]
- }
- },
- "$build/goma": {
- "enable_ats": true,
- "rpc_extra_params": "?prod",
- "server_host": "goma.chromium.org"
- },
- "$build/reclient": {
- "instance": "rbe-chromium-untrusted",
- "jobs": 150,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.chromiumos",
- "recipe": "chromium_trybot"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/dawn-linux-x64-deps-rel/properties.json b/chromium/infra/config/generated/builders/try/dawn-linux-x64-deps-rel/properties.json
deleted file mode 100644
index 611684f4181..00000000000
--- a/chromium/infra/config/generated/builders/try/dawn-linux-x64-deps-rel/properties.json
+++ /dev/null
@@ -1,129 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Dawn Linux x64 DEPS Builder",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-dawn-archive",
- "builder_group": "chromium.dawn",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64,
- "target_platform": "linux"
- },
- "legacy_gclient_config": {
- "config": "chromium"
- },
- "run_tests_serially": true
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Dawn Linux x64 DEPS Release (Intel UHD 630)",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-dawn-archive",
- "builder_group": "chromium.dawn",
- "execution_mode": "TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64,
- "target_platform": "linux"
- },
- "legacy_gclient_config": {
- "config": "chromium"
- },
- "parent": {
- "bucket": "ci",
- "builder": "Dawn Linux x64 DEPS Builder",
- "project": "chromium-m112"
- },
- "run_tests_serially": true
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Dawn Linux x64 DEPS Release (NVIDIA)",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-dawn-archive",
- "builder_group": "chromium.dawn",
- "execution_mode": "TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64,
- "target_platform": "linux"
- },
- "legacy_gclient_config": {
- "config": "chromium"
- },
- "parent": {
- "bucket": "ci",
- "builder": "Dawn Linux x64 DEPS Builder",
- "project": "chromium-m112"
- },
- "run_tests_serially": true
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "Dawn Linux x64 DEPS Builder",
- "project": "chromium-m112"
- }
- ],
- "builder_ids_in_scope_for_testing": [
- {
- "bucket": "ci",
- "builder": "Dawn Linux x64 DEPS Release (Intel UHD 630)",
- "project": "chromium-m112"
- },
- {
- "bucket": "ci",
- "builder": "Dawn Linux x64 DEPS Release (NVIDIA)",
- "project": "chromium-m112"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-untrusted",
- "jobs": 150,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite",
- "v.gpu"
- ]
- },
- "builder_group": "tryserver.chromium.dawn",
- "recipe": "chromium_trybot"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/ios-simulator-compilator/properties.json b/chromium/infra/config/generated/builders/try/ios-simulator-compilator/properties.json
deleted file mode 100644
index f8ae46c8bc5..00000000000
--- a/chromium/infra/config/generated/builders/try/ios-simulator-compilator/properties.json
+++ /dev/null
@@ -1,72 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "ios-simulator",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-mac-archive",
- "builder_group": "chromium.mac",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb",
- "mac_toolchain"
- ],
- "build_config": "Debug",
- "config": "chromium",
- "target_bits": 64,
- "target_platform": "ios"
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "use_clang_coverage"
- ],
- "config": "ios"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "ios-simulator",
- "project": "chromium-m112"
- }
- ]
- }
- },
- "$build/code_coverage": {
- "coverage_exclude_sources": "ios_test_files_and_test_utils",
- "coverage_test_types": [
- "overall",
- "unit"
- ],
- "use_clang_coverage": true
- },
- "$build/flakiness": {
- "check_for_flakiness": true
- },
- "$build/reclient": {
- "instance": "rbe-chromium-untrusted",
- "jobs": 300,
- "metrics_project": "chromium-reclient-metrics",
- "scandeps_server": true
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.mac",
- "recipe": "chromium/compilator",
- "xcode_build_version": "14c18"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/ios-simulator-cronet/properties.json b/chromium/infra/config/generated/builders/try/ios-simulator-cronet/properties.json
deleted file mode 100644
index 7b959c464fd..00000000000
--- a/chromium/infra/config/generated/builders/try/ios-simulator-cronet/properties.json
+++ /dev/null
@@ -1,61 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "ios-simulator-cronet",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-fyi-archive",
- "builder_group": "chromium.fyi",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb",
- "mac_toolchain"
- ],
- "build_config": "Debug",
- "config": "chromium",
- "target_bits": 64,
- "target_platform": "ios"
- },
- "legacy_gclient_config": {
- "config": "ios"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "ios-simulator-cronet",
- "project": "chromium-m112"
- }
- ]
- }
- },
- "$build/flakiness": {
- "check_for_flakiness": true
- },
- "$build/reclient": {
- "instance": "rbe-chromium-untrusted",
- "jobs": 300,
- "metrics_project": "chromium-reclient-metrics",
- "scandeps_server": true
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.mac",
- "recipe": "chromium_trybot",
- "xcode_build_version": "14c18"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/ios-simulator-full-configs/properties.json b/chromium/infra/config/generated/builders/try/ios-simulator-full-configs/properties.json
deleted file mode 100644
index 6dddda7260e..00000000000
--- a/chromium/infra/config/generated/builders/try/ios-simulator-full-configs/properties.json
+++ /dev/null
@@ -1,75 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "ios-simulator-full-configs",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-mac-archive",
- "builder_group": "chromium.mac",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb",
- "mac_toolchain"
- ],
- "build_config": "Debug",
- "config": "chromium",
- "target_bits": 64,
- "target_platform": "ios"
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "use_clang_coverage"
- ],
- "config": "ios"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "ios-simulator-full-configs",
- "project": "chromium-m112"
- }
- ]
- }
- },
- "$build/code_coverage": {
- "coverage_exclude_sources": "ios_test_files_and_test_utils",
- "coverage_test_types": [
- "overall",
- "unit"
- ],
- "use_clang_coverage": true
- },
- "$build/flakiness": {
- "check_for_flakiness": true
- },
- "$build/goma": {
- "rpc_extra_params": "?prod",
- "server_host": "goma.chromium.org"
- },
- "$build/reclient": {
- "instance": "rbe-chromium-untrusted",
- "metrics_project": "chromium-reclient-metrics",
- "scandeps_server": true
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.mac",
- "recipe": "chromium_trybot",
- "xcode_build_version": "14c18"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/ios-simulator/properties.json b/chromium/infra/config/generated/builders/try/ios-simulator/properties.json
deleted file mode 100644
index ff4de847e21..00000000000
--- a/chromium/infra/config/generated/builders/try/ios-simulator/properties.json
+++ /dev/null
@@ -1,69 +0,0 @@
-{
- "$build/chromium_orchestrator": {
- "compilator": "ios-simulator-compilator",
- "compilator_watcher_git_revision": "e6d08be3fd589d4f222dae5d18dbc972e6117b23"
- },
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "ios-simulator",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-mac-archive",
- "builder_group": "chromium.mac",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb",
- "mac_toolchain"
- ],
- "build_config": "Debug",
- "config": "chromium",
- "target_bits": 64,
- "target_platform": "ios"
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "use_clang_coverage"
- ],
- "config": "ios"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "ios-simulator",
- "project": "chromium-m112"
- }
- ]
- }
- },
- "$build/code_coverage": {
- "coverage_exclude_sources": "ios_test_files_and_test_utils",
- "coverage_test_types": [
- "overall",
- "unit"
- ],
- "use_clang_coverage": true
- },
- "$build/flakiness": {
- "check_for_flakiness": true
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.mac",
- "recipe": "chromium/orchestrator"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/lacros-amd64-generic-rel-compilator/properties.json b/chromium/infra/config/generated/builders/try/lacros-amd64-generic-rel-compilator/properties.json
deleted file mode 100644
index d36ac1e77a8..00000000000
--- a/chromium/infra/config/generated/builders/try/lacros-amd64-generic-rel-compilator/properties.json
+++ /dev/null
@@ -1,71 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "lacros-amd64-generic-rel",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-chromiumos-archive",
- "builder_group": "chromium.chromiumos",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "cros_boards_with_qemu_images": [
- "amd64-generic"
- ],
- "target_arch": "intel",
- "target_bits": 64,
- "target_cros_boards": [
- "eve"
- ],
- "target_platform": "chromeos"
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "checkout_lacros_sdk",
- "chromeos"
- ],
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "lacros-amd64-generic-rel",
- "project": "chromium-m112"
- }
- ]
- }
- },
- "$build/goma": {
- "enable_ats": true,
- "rpc_extra_params": "?prod",
- "server_host": "goma.chromium.org"
- },
- "$build/reclient": {
- "instance": "rbe-chromium-untrusted",
- "jobs": 300,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.chromiumos",
- "recipe": "chromium/compilator"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/lacros-amd64-generic-rel-orchestrator/properties.json b/chromium/infra/config/generated/builders/try/lacros-amd64-generic-rel-orchestrator/properties.json
deleted file mode 100644
index 506aaafa94f..00000000000
--- a/chromium/infra/config/generated/builders/try/lacros-amd64-generic-rel-orchestrator/properties.json
+++ /dev/null
@@ -1,65 +0,0 @@
-{
- "$build/chromium_orchestrator": {
- "compilator": "lacros-amd64-generic-rel-compilator",
- "compilator_watcher_git_revision": "e6d08be3fd589d4f222dae5d18dbc972e6117b23"
- },
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "lacros-amd64-generic-rel",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-chromiumos-archive",
- "builder_group": "chromium.chromiumos",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "cros_boards_with_qemu_images": [
- "amd64-generic"
- ],
- "target_arch": "intel",
- "target_bits": 64,
- "target_cros_boards": [
- "eve"
- ],
- "target_platform": "chromeos"
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "checkout_lacros_sdk",
- "chromeos"
- ],
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "lacros-amd64-generic-rel",
- "project": "chromium-m112"
- }
- ]
- }
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.chromiumos",
- "recipe": "chromium/orchestrator"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/lacros-amd64-generic-rel-skylab-fyi/properties.json b/chromium/infra/config/generated/builders/try/lacros-amd64-generic-rel-skylab-fyi/properties.json
deleted file mode 100644
index 23e0458d676..00000000000
--- a/chromium/infra/config/generated/builders/try/lacros-amd64-generic-rel-skylab-fyi/properties.json
+++ /dev/null
@@ -1,73 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "try",
- "builder": "lacros-amd64-generic-rel-skylab-fyi",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-fyi-archive",
- "builder_group": "tryserver.chromium.chromiumos",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb",
- "mb_no_luci_auth"
- ],
- "config": "chromium",
- "cros_boards_with_qemu_images": [
- "amd64-generic"
- ],
- "target_bits": 64,
- "target_cros_boards": [
- "eve"
- ],
- "target_platform": "chromeos"
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "chromeos",
- "checkout_lacros_sdk"
- ],
- "config": "chromium"
- },
- "skylab_upload_location": {
- "gs_bucket": "gs://lacros-amd64-generic-rel-skylab-try"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "try",
- "builder": "lacros-amd64-generic-rel-skylab-fyi",
- "project": "chromium-m112"
- }
- ]
- }
- },
- "$build/goma": {
- "enable_ats": true,
- "rpc_extra_params": "?prod",
- "server_host": "goma.chromium.org"
- },
- "$build/reclient": {
- "instance": "rbe-chromium-untrusted",
- "jobs": 150,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.chromiumos",
- "recipe": "chromium_trybot"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/lacros-amd64-generic-rel-skylab/properties.json b/chromium/infra/config/generated/builders/try/lacros-amd64-generic-rel-skylab/properties.json
deleted file mode 100644
index 74aee167b7f..00000000000
--- a/chromium/infra/config/generated/builders/try/lacros-amd64-generic-rel-skylab/properties.json
+++ /dev/null
@@ -1,66 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "try",
- "builder": "lacros-amd64-generic-rel-skylab",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-chromiumos-archive",
- "builder_group": "tryserver.chromium.chromiumos",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_arch": "intel",
- "target_bits": 64,
- "target_cros_boards": [
- "amd64-generic"
- ],
- "target_platform": "chromeos"
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "checkout_lacros_sdk",
- "chromeos"
- ],
- "config": "chromium"
- },
- "skylab_upload_location": {
- "gs_bucket": "chromium-try-skylab"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "try",
- "builder": "lacros-amd64-generic-rel-skylab",
- "project": "chromium-m112"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-untrusted",
- "jobs": 150,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.chromiumos",
- "recipe": "chromium_trybot"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/lacros-amd64-generic-rel/properties.json b/chromium/infra/config/generated/builders/try/lacros-amd64-generic-rel/properties.json
deleted file mode 100644
index 0ff95e3ae1f..00000000000
--- a/chromium/infra/config/generated/builders/try/lacros-amd64-generic-rel/properties.json
+++ /dev/null
@@ -1,66 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "lacros-amd64-generic-rel",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-chromiumos-archive",
- "builder_group": "chromium.chromiumos",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "cros_boards_with_qemu_images": [
- "amd64-generic"
- ],
- "target_arch": "intel",
- "target_bits": 64,
- "target_cros_boards": [
- "eve"
- ],
- "target_platform": "chromeos"
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "checkout_lacros_sdk",
- "chromeos"
- ],
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "lacros-amd64-generic-rel",
- "project": "chromium-m112"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-untrusted",
- "jobs": 150,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.chromiumos",
- "recipe": "chromium_trybot"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/lacros-arm-generic-rel/properties.json b/chromium/infra/config/generated/builders/try/lacros-arm-generic-rel/properties.json
deleted file mode 100644
index a03609ad75c..00000000000
--- a/chromium/infra/config/generated/builders/try/lacros-arm-generic-rel/properties.json
+++ /dev/null
@@ -1,64 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "lacros-arm-generic-rel",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-chromiumos-archive",
- "builder_group": "chromium.chromiumos",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_arch": "intel",
- "target_bits": 64,
- "target_cros_boards": [
- "arm-generic",
- "jacuzzi"
- ],
- "target_platform": "chromeos"
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "checkout_lacros_sdk",
- "chromeos"
- ],
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "lacros-arm-generic-rel",
- "project": "chromium-m112"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-untrusted",
- "jobs": 150,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.chromiumos",
- "recipe": "chromium_trybot"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/lacros-arm64-generic-rel/properties.json b/chromium/infra/config/generated/builders/try/lacros-arm64-generic-rel/properties.json
deleted file mode 100644
index 9ca3bd7e91c..00000000000
--- a/chromium/infra/config/generated/builders/try/lacros-arm64-generic-rel/properties.json
+++ /dev/null
@@ -1,68 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "lacros-arm64-generic-rel",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-chromiumos-archive",
- "builder_group": "chromium.chromiumos",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_arch": "arm",
- "target_bits": 64,
- "target_cros_boards": [
- "arm64-generic"
- ],
- "target_platform": "chromeos"
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "checkout_lacros_sdk",
- "chromeos"
- ],
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "lacros-arm64-generic-rel",
- "project": "chromium-m112"
- }
- ]
- }
- },
- "$build/goma": {
- "enable_ats": true,
- "rpc_extra_params": "?prod",
- "server_host": "goma.chromium.org"
- },
- "$build/reclient": {
- "instance": "rbe-chromium-untrusted",
- "jobs": 150,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.chromiumos",
- "recipe": "chromium_trybot"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/linux-blink-rel/properties.json b/chromium/infra/config/generated/builders/try/linux-blink-rel/properties.json
deleted file mode 100644
index e0f426845e9..00000000000
--- a/chromium/infra/config/generated/builders/try/linux-blink-rel/properties.json
+++ /dev/null
@@ -1,54 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "try",
- "builder": "linux-blink-rel",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "builder_group": "tryserver.blink",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "try",
- "builder": "linux-blink-rel",
- "project": "chromium-m112"
- }
- ],
- "retry_failed_shards": false
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-untrusted",
- "jobs": 150,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.blink",
- "recipe": "chromium_trybot"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/linux-chromeos-compile-dbg/properties.json b/chromium/infra/config/generated/builders/try/linux-chromeos-compile-dbg/properties.json
deleted file mode 100644
index 645486e035d..00000000000
--- a/chromium/infra/config/generated/builders/try/linux-chromeos-compile-dbg/properties.json
+++ /dev/null
@@ -1,59 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "linux-chromeos-dbg",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-chromiumos-archive",
- "builder_group": "chromium.chromiumos",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Debug",
- "config": "chromium",
- "target_arch": "intel",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "chromeos"
- ],
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "linux-chromeos-dbg",
- "project": "chromium-m112"
- }
- ],
- "is_compile_only": true
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-untrusted",
- "jobs": 300,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.chromiumos",
- "recipe": "chromium_trybot"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/linux-chromeos-dbg/properties.json b/chromium/infra/config/generated/builders/try/linux-chromeos-dbg/properties.json
deleted file mode 100644
index 92d714d93ee..00000000000
--- a/chromium/infra/config/generated/builders/try/linux-chromeos-dbg/properties.json
+++ /dev/null
@@ -1,58 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "linux-chromeos-dbg",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-chromiumos-archive",
- "builder_group": "chromium.chromiumos",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Debug",
- "config": "chromium",
- "target_arch": "intel",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "chromeos"
- ],
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "linux-chromeos-dbg",
- "project": "chromium-m112"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-untrusted",
- "jobs": 150,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.chromiumos",
- "recipe": "chromium_trybot"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/linux-chromeos-rel-compilator/properties.json b/chromium/infra/config/generated/builders/try/linux-chromeos-rel-compilator/properties.json
deleted file mode 100644
index 54469d7c1ec..00000000000
--- a/chromium/infra/config/generated/builders/try/linux-chromeos-rel-compilator/properties.json
+++ /dev/null
@@ -1,66 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "linux-chromeos-rel",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-chromiumos-archive",
- "builder_group": "chromium.chromiumos",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_arch": "intel",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "use_clang_coverage",
- "chromeos"
- ],
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "linux-chromeos-rel",
- "project": "chromium-m112"
- }
- ]
- }
- },
- "$build/code_coverage": {
- "coverage_test_types": [
- "unit",
- "overall"
- ],
- "use_clang_coverage": true
- },
- "$build/reclient": {
- "instance": "rbe-chromium-untrusted",
- "jobs": 300,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.chromiumos",
- "recipe": "chromium/compilator"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/linux-chromeos-rel/properties.json b/chromium/infra/config/generated/builders/try/linux-chromeos-rel/properties.json
deleted file mode 100644
index ebaddd873ce..00000000000
--- a/chromium/infra/config/generated/builders/try/linux-chromeos-rel/properties.json
+++ /dev/null
@@ -1,65 +0,0 @@
-{
- "$build/chromium_orchestrator": {
- "compilator": "linux-chromeos-rel-compilator",
- "compilator_watcher_git_revision": "e6d08be3fd589d4f222dae5d18dbc972e6117b23"
- },
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "linux-chromeos-rel",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-chromiumos-archive",
- "builder_group": "chromium.chromiumos",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_arch": "intel",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "use_clang_coverage",
- "chromeos"
- ],
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "linux-chromeos-rel",
- "project": "chromium-m112"
- }
- ]
- }
- },
- "$build/code_coverage": {
- "coverage_test_types": [
- "unit",
- "overall"
- ],
- "use_clang_coverage": true
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.chromiumos",
- "recipe": "chromium/orchestrator"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/linux-lacros-rel-compilator/properties.json b/chromium/infra/config/generated/builders/try/linux-lacros-rel-compilator/properties.json
deleted file mode 100644
index be56acf02f2..00000000000
--- a/chromium/infra/config/generated/builders/try/linux-lacros-rel-compilator/properties.json
+++ /dev/null
@@ -1,101 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "linux-lacros-builder-rel",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-chromiumos-archive",
- "builder_group": "chromium.chromiumos",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_arch": "intel",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "chromeos"
- ],
- "config": "chromium_no_telemetry_dependencies"
- }
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "linux-lacros-tester-rel",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-chromiumos-archive",
- "builder_group": "chromium.chromiumos",
- "execution_mode": "TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_arch": "intel",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "use_clang_coverage",
- "chromeos"
- ],
- "config": "chromium_no_telemetry_dependencies"
- },
- "parent": {
- "bucket": "ci",
- "builder": "linux-lacros-builder-rel",
- "project": "chromium-m112"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "linux-lacros-builder-rel",
- "project": "chromium-m112"
- }
- ],
- "builder_ids_in_scope_for_testing": [
- {
- "bucket": "ci",
- "builder": "linux-lacros-tester-rel",
- "project": "chromium-m112"
- }
- ]
- }
- },
- "$build/flakiness": {
- "check_for_flakiness": true
- },
- "$build/reclient": {
- "instance": "rbe-chromium-untrusted",
- "jobs": 300,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.chromiumos",
- "recipe": "chromium/compilator"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/linux-lacros-rel/properties.json b/chromium/infra/config/generated/builders/try/linux-lacros-rel/properties.json
deleted file mode 100644
index 97e96efe471..00000000000
--- a/chromium/infra/config/generated/builders/try/linux-lacros-rel/properties.json
+++ /dev/null
@@ -1,100 +0,0 @@
-{
- "$build/chromium_orchestrator": {
- "compilator": "linux-lacros-rel-compilator",
- "compilator_watcher_git_revision": "e6d08be3fd589d4f222dae5d18dbc972e6117b23"
- },
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "linux-lacros-builder-rel",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-chromiumos-archive",
- "builder_group": "chromium.chromiumos",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_arch": "intel",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "chromeos"
- ],
- "config": "chromium_no_telemetry_dependencies"
- }
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "linux-lacros-tester-rel",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-chromiumos-archive",
- "builder_group": "chromium.chromiumos",
- "execution_mode": "TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_arch": "intel",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "use_clang_coverage",
- "chromeos"
- ],
- "config": "chromium_no_telemetry_dependencies"
- },
- "parent": {
- "bucket": "ci",
- "builder": "linux-lacros-builder-rel",
- "project": "chromium-m112"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "linux-lacros-builder-rel",
- "project": "chromium-m112"
- }
- ],
- "builder_ids_in_scope_for_testing": [
- {
- "bucket": "ci",
- "builder": "linux-lacros-tester-rel",
- "project": "chromium-m112"
- }
- ]
- }
- },
- "$build/flakiness": {
- "check_for_flakiness": true
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.chromiumos",
- "recipe": "chromium/orchestrator"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/linux-official/properties.json b/chromium/infra/config/generated/builders/try/linux-official/properties.json
deleted file mode 100644
index 8525d0bd5d6..00000000000
--- a/chromium/infra/config/generated/builders/try/linux-official/properties.json
+++ /dev/null
@@ -1,55 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "linux-official",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "builder_group": "chromium",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "checkout_pgo_profiles"
- ],
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "linux-official",
- "project": "chromium-m112"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-untrusted",
- "jobs": 300,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium",
- "recipe": "chromium_trybot"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/linux-rel-compilator/properties.json b/chromium/infra/config/generated/builders/try/linux-rel-compilator/properties.json
deleted file mode 100644
index d4985d7ee9c..00000000000
--- a/chromium/infra/config/generated/builders/try/linux-rel-compilator/properties.json
+++ /dev/null
@@ -1,175 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "GPU Linux Builder",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-gpu-archive",
- "builder_group": "chromium.gpu",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "use_clang_coverage"
- ],
- "config": "chromium"
- }
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux Builder",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-linux-archive",
- "builder_group": "chromium.linux",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "use_clang_coverage"
- ],
- "config": "chromium"
- }
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux Release (NVIDIA)",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-gpu-archive",
- "builder_group": "chromium.gpu",
- "execution_mode": "TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "use_clang_coverage"
- ],
- "config": "chromium"
- },
- "parent": {
- "bucket": "ci",
- "builder": "GPU Linux Builder",
- "project": "chromium-m112"
- }
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux Tests",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-linux-archive",
- "builder_group": "chromium.linux",
- "execution_mode": "TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "use_clang_coverage"
- ],
- "config": "chromium"
- },
- "parent": {
- "bucket": "ci",
- "builder": "Linux Builder",
- "project": "chromium-m112"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "GPU Linux Builder",
- "project": "chromium-m112"
- },
- {
- "bucket": "ci",
- "builder": "Linux Builder",
- "project": "chromium-m112"
- }
- ],
- "builder_ids_in_scope_for_testing": [
- {
- "bucket": "ci",
- "builder": "Linux Release (NVIDIA)",
- "project": "chromium-m112"
- },
- {
- "bucket": "ci",
- "builder": "Linux Tests",
- "project": "chromium-m112"
- }
- ],
- "rts_config": {
- "condition": "QUICK_RUN_ONLY"
- }
- }
- },
- "$build/code_coverage": {
- "coverage_test_types": [
- "unit",
- "overall"
- ],
- "use_clang_coverage": true
- },
- "$build/flakiness": {
- "check_for_flakiness": true
- },
- "$build/reclient": {
- "instance": "rbe-chromium-untrusted",
- "jobs": 300,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.linux",
- "recipe": "chromium/compilator"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/linux-rel/properties.json b/chromium/infra/config/generated/builders/try/linux-rel/properties.json
deleted file mode 100644
index 99619578cbb..00000000000
--- a/chromium/infra/config/generated/builders/try/linux-rel/properties.json
+++ /dev/null
@@ -1,174 +0,0 @@
-{
- "$build/chromium_orchestrator": {
- "compilator": "linux-rel-compilator",
- "compilator_watcher_git_revision": "e6d08be3fd589d4f222dae5d18dbc972e6117b23"
- },
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "GPU Linux Builder",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-gpu-archive",
- "builder_group": "chromium.gpu",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "use_clang_coverage"
- ],
- "config": "chromium"
- }
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux Builder",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-linux-archive",
- "builder_group": "chromium.linux",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "use_clang_coverage"
- ],
- "config": "chromium"
- }
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux Release (NVIDIA)",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-gpu-archive",
- "builder_group": "chromium.gpu",
- "execution_mode": "TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "use_clang_coverage"
- ],
- "config": "chromium"
- },
- "parent": {
- "bucket": "ci",
- "builder": "GPU Linux Builder",
- "project": "chromium-m112"
- }
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux Tests",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-linux-archive",
- "builder_group": "chromium.linux",
- "execution_mode": "TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "use_clang_coverage"
- ],
- "config": "chromium"
- },
- "parent": {
- "bucket": "ci",
- "builder": "Linux Builder",
- "project": "chromium-m112"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "GPU Linux Builder",
- "project": "chromium-m112"
- },
- {
- "bucket": "ci",
- "builder": "Linux Builder",
- "project": "chromium-m112"
- }
- ],
- "builder_ids_in_scope_for_testing": [
- {
- "bucket": "ci",
- "builder": "Linux Release (NVIDIA)",
- "project": "chromium-m112"
- },
- {
- "bucket": "ci",
- "builder": "Linux Tests",
- "project": "chromium-m112"
- }
- ],
- "rts_config": {
- "condition": "QUICK_RUN_ONLY"
- }
- }
- },
- "$build/code_coverage": {
- "coverage_test_types": [
- "unit",
- "overall"
- ],
- "use_clang_coverage": true
- },
- "$build/flakiness": {
- "check_for_flakiness": true
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.linux",
- "recipe": "chromium/orchestrator"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/linux-wayland-rel-compilator/properties.json b/chromium/infra/config/generated/builders/try/linux-wayland-rel-compilator/properties.json
deleted file mode 100644
index bf46e4b708d..00000000000
--- a/chromium/infra/config/generated/builders/try/linux-wayland-rel-compilator/properties.json
+++ /dev/null
@@ -1,98 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux Builder (Wayland)",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-linux-archive",
- "builder_group": "chromium.linux",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "use_clang_coverage"
- ],
- "config": "chromium"
- }
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux Tests (Wayland)",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-linux-archive",
- "builder_group": "chromium.linux",
- "execution_mode": "TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "use_clang_coverage"
- ],
- "config": "chromium"
- },
- "parent": {
- "bucket": "ci",
- "builder": "Linux Builder (Wayland)",
- "project": "chromium-m112"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "Linux Builder (Wayland)",
- "project": "chromium-m112"
- }
- ],
- "builder_ids_in_scope_for_testing": [
- {
- "bucket": "ci",
- "builder": "Linux Tests (Wayland)",
- "project": "chromium-m112"
- }
- ],
- "rts_config": {
- "condition": "QUICK_RUN_ONLY"
- }
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-untrusted",
- "jobs": 300,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.linux",
- "recipe": "chromium/compilator"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/linux-wayland-rel/properties.json b/chromium/infra/config/generated/builders/try/linux-wayland-rel/properties.json
deleted file mode 100644
index 82efffc12cc..00000000000
--- a/chromium/infra/config/generated/builders/try/linux-wayland-rel/properties.json
+++ /dev/null
@@ -1,97 +0,0 @@
-{
- "$build/chromium_orchestrator": {
- "compilator": "linux-wayland-rel-compilator",
- "compilator_watcher_git_revision": "e6d08be3fd589d4f222dae5d18dbc972e6117b23"
- },
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux Builder (Wayland)",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-linux-archive",
- "builder_group": "chromium.linux",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "use_clang_coverage"
- ],
- "config": "chromium"
- }
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux Tests (Wayland)",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-linux-archive",
- "builder_group": "chromium.linux",
- "execution_mode": "TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "use_clang_coverage"
- ],
- "config": "chromium"
- },
- "parent": {
- "bucket": "ci",
- "builder": "Linux Builder (Wayland)",
- "project": "chromium-m112"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "Linux Builder (Wayland)",
- "project": "chromium-m112"
- }
- ],
- "builder_ids_in_scope_for_testing": [
- {
- "bucket": "ci",
- "builder": "Linux Tests (Wayland)",
- "project": "chromium-m112"
- }
- ],
- "rts_config": {
- "condition": "QUICK_RUN_ONLY"
- }
- }
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.linux",
- "recipe": "chromium/orchestrator"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/linux-x64-castos-dbg/properties.json b/chromium/infra/config/generated/builders/try/linux-x64-castos-dbg/properties.json
deleted file mode 100644
index c749c2c9ca6..00000000000
--- a/chromium/infra/config/generated/builders/try/linux-x64-castos-dbg/properties.json
+++ /dev/null
@@ -1,54 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Cast Linux Debug",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-linux-archive",
- "builder_group": "chromium.linux",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Debug",
- "config": "chromium_clang",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "Cast Linux Debug",
- "project": "chromium-m112"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-untrusted",
- "jobs": 150,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.linux",
- "recipe": "chromium_trybot"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/linux-x64-castos/properties.json b/chromium/infra/config/generated/builders/try/linux-x64-castos/properties.json
deleted file mode 100644
index ce1e4415cb9..00000000000
--- a/chromium/infra/config/generated/builders/try/linux-x64-castos/properties.json
+++ /dev/null
@@ -1,54 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Cast Linux",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-linux-archive",
- "builder_group": "chromium.linux",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium_clang",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "Cast Linux",
- "project": "chromium-m112"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-untrusted",
- "jobs": 150,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.linux",
- "recipe": "chromium_trybot"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/linux_chromium_asan_rel_ng-compilator/properties.json b/chromium/infra/config/generated/builders/try/linux_chromium_asan_rel_ng-compilator/properties.json
deleted file mode 100644
index 438b4cb05d1..00000000000
--- a/chromium/infra/config/generated/builders/try/linux_chromium_asan_rel_ng-compilator/properties.json
+++ /dev/null
@@ -1,94 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux ASan LSan Builder",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-memory-archive",
- "builder_group": "chromium.memory",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "lsan",
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium_asan",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "config": "chromium"
- }
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux ASan LSan Tests (1)",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-memory-archive",
- "builder_group": "chromium.memory",
- "execution_mode": "TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "lsan",
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium_asan",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "config": "chromium"
- },
- "parent": {
- "bucket": "ci",
- "builder": "Linux ASan LSan Builder",
- "project": "chromium-m112"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "Linux ASan LSan Builder",
- "project": "chromium-m112"
- }
- ],
- "builder_ids_in_scope_for_testing": [
- {
- "bucket": "ci",
- "builder": "Linux ASan LSan Tests (1)",
- "project": "chromium-m112"
- }
- ],
- "rts_config": {
- "condition": "QUICK_RUN_ONLY"
- }
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-untrusted",
- "jobs": 300,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.linux",
- "recipe": "chromium/compilator"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/linux_chromium_asan_rel_ng/properties.json b/chromium/infra/config/generated/builders/try/linux_chromium_asan_rel_ng/properties.json
deleted file mode 100644
index e2cb0ea7054..00000000000
--- a/chromium/infra/config/generated/builders/try/linux_chromium_asan_rel_ng/properties.json
+++ /dev/null
@@ -1,93 +0,0 @@
-{
- "$build/chromium_orchestrator": {
- "compilator": "linux_chromium_asan_rel_ng-compilator",
- "compilator_watcher_git_revision": "e6d08be3fd589d4f222dae5d18dbc972e6117b23"
- },
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux ASan LSan Builder",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-memory-archive",
- "builder_group": "chromium.memory",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "lsan",
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium_asan",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "config": "chromium"
- }
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux ASan LSan Tests (1)",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-memory-archive",
- "builder_group": "chromium.memory",
- "execution_mode": "TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "lsan",
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium_asan",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "config": "chromium"
- },
- "parent": {
- "bucket": "ci",
- "builder": "Linux ASan LSan Builder",
- "project": "chromium-m112"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "Linux ASan LSan Builder",
- "project": "chromium-m112"
- }
- ],
- "builder_ids_in_scope_for_testing": [
- {
- "bucket": "ci",
- "builder": "Linux ASan LSan Tests (1)",
- "project": "chromium-m112"
- }
- ],
- "rts_config": {
- "condition": "QUICK_RUN_ONLY"
- }
- }
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.linux",
- "recipe": "chromium/orchestrator"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/linux_chromium_compile_dbg_ng/properties.json b/chromium/infra/config/generated/builders/try/linux_chromium_compile_dbg_ng/properties.json
deleted file mode 100644
index 301773eb79c..00000000000
--- a/chromium/infra/config/generated/builders/try/linux_chromium_compile_dbg_ng/properties.json
+++ /dev/null
@@ -1,90 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux Builder (dbg)",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-linux-archive",
- "builder_group": "chromium.linux",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Debug",
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "config": "chromium"
- }
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux Tests (dbg)(1)",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-linux-archive",
- "builder_group": "chromium.linux",
- "execution_mode": "TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Debug",
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "config": "chromium"
- },
- "parent": {
- "bucket": "ci",
- "builder": "Linux Builder (dbg)",
- "project": "chromium-m112"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "Linux Builder (dbg)",
- "project": "chromium-m112"
- }
- ],
- "builder_ids_in_scope_for_testing": [
- {
- "bucket": "ci",
- "builder": "Linux Tests (dbg)(1)",
- "project": "chromium-m112"
- }
- ],
- "is_compile_only": true
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-untrusted",
- "jobs": 300,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.linux",
- "recipe": "chromium_trybot"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/linux_chromium_dbg_ng/properties.json b/chromium/infra/config/generated/builders/try/linux_chromium_dbg_ng/properties.json
deleted file mode 100644
index 6ac2b7291cb..00000000000
--- a/chromium/infra/config/generated/builders/try/linux_chromium_dbg_ng/properties.json
+++ /dev/null
@@ -1,89 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux Builder (dbg)",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-linux-archive",
- "builder_group": "chromium.linux",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Debug",
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "config": "chromium"
- }
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux Tests (dbg)(1)",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-linux-archive",
- "builder_group": "chromium.linux",
- "execution_mode": "TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Debug",
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "config": "chromium"
- },
- "parent": {
- "bucket": "ci",
- "builder": "Linux Builder (dbg)",
- "project": "chromium-m112"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "Linux Builder (dbg)",
- "project": "chromium-m112"
- }
- ],
- "builder_ids_in_scope_for_testing": [
- {
- "bucket": "ci",
- "builder": "Linux Tests (dbg)(1)",
- "project": "chromium-m112"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-untrusted",
- "jobs": 150,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.linux",
- "recipe": "chromium_trybot"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/linux_chromium_tsan_rel_ng-compilator/properties.json b/chromium/infra/config/generated/builders/try/linux_chromium_tsan_rel_ng-compilator/properties.json
deleted file mode 100644
index 686aacb0aa4..00000000000
--- a/chromium/infra/config/generated/builders/try/linux_chromium_tsan_rel_ng-compilator/properties.json
+++ /dev/null
@@ -1,92 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux TSan Builder",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-memory-archive",
- "builder_group": "chromium.memory",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium_tsan2",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "config": "chromium"
- }
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux TSan Tests",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-memory-archive",
- "builder_group": "chromium.memory",
- "execution_mode": "TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium_tsan2",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "config": "chromium"
- },
- "parent": {
- "bucket": "ci",
- "builder": "Linux TSan Builder",
- "project": "chromium-m112"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "Linux TSan Builder",
- "project": "chromium-m112"
- }
- ],
- "builder_ids_in_scope_for_testing": [
- {
- "bucket": "ci",
- "builder": "Linux TSan Tests",
- "project": "chromium-m112"
- }
- ],
- "rts_config": {
- "condition": "QUICK_RUN_ONLY"
- }
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-untrusted",
- "jobs": 300,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.linux",
- "recipe": "chromium/compilator"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/linux_chromium_tsan_rel_ng/properties.json b/chromium/infra/config/generated/builders/try/linux_chromium_tsan_rel_ng/properties.json
deleted file mode 100644
index 0a1c3afc400..00000000000
--- a/chromium/infra/config/generated/builders/try/linux_chromium_tsan_rel_ng/properties.json
+++ /dev/null
@@ -1,91 +0,0 @@
-{
- "$build/chromium_orchestrator": {
- "compilator": "linux_chromium_tsan_rel_ng-compilator",
- "compilator_watcher_git_revision": "e6d08be3fd589d4f222dae5d18dbc972e6117b23"
- },
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux TSan Builder",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-memory-archive",
- "builder_group": "chromium.memory",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium_tsan2",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "config": "chromium"
- }
- }
- },
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "Linux TSan Tests",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-memory-archive",
- "builder_group": "chromium.memory",
- "execution_mode": "TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium_tsan2",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "config": "chromium"
- },
- "parent": {
- "bucket": "ci",
- "builder": "Linux TSan Builder",
- "project": "chromium-m112"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "Linux TSan Builder",
- "project": "chromium-m112"
- }
- ],
- "builder_ids_in_scope_for_testing": [
- {
- "bucket": "ci",
- "builder": "Linux TSan Tests",
- "project": "chromium-m112"
- }
- ],
- "rts_config": {
- "condition": "QUICK_RUN_ONLY"
- }
- }
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.linux",
- "recipe": "chromium/orchestrator"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/linux_optional_gpu_tests_rel/properties.json b/chromium/infra/config/generated/builders/try/linux_optional_gpu_tests_rel/properties.json
deleted file mode 100644
index c3e51dee477..00000000000
--- a/chromium/infra/config/generated/builders/try/linux_optional_gpu_tests_rel/properties.json
+++ /dev/null
@@ -1,57 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "try",
- "builder": "linux_optional_gpu_tests_rel",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-gpu-fyi-archive",
- "builder_group": "tryserver.chromium.linux",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "angle_internal"
- ],
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "try",
- "builder": "linux_optional_gpu_tests_rel",
- "project": "chromium-m112"
- }
- ],
- "retry_failed_shards": false
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-untrusted",
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.linux",
- "recipe": "chromium_trybot"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/linux_vr/properties.json b/chromium/infra/config/generated/builders/try/linux_vr/properties.json
deleted file mode 100644
index b96883568bf..00000000000
--- a/chromium/infra/config/generated/builders/try/linux_vr/properties.json
+++ /dev/null
@@ -1,54 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "ci",
- "builder": "VR Linux",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-fyi-archive",
- "builder_group": "chromium.fyi",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "ci",
- "builder": "VR Linux",
- "project": "chromium-m112"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-untrusted",
- "jobs": 150,
- "metrics_project": "chromium-reclient-metrics"
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.linux",
- "recipe": "chromium_trybot"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/builders/try/mac-rel-compilator/properties.json b/chromium/infra/config/generated/builders/try/mac-rel-compilator/properties.json
index 193c61e41bd..ec92c2b3728 100644
--- a/chromium/infra/config/generated/builders/try/mac-rel-compilator/properties.json
+++ b/chromium/infra/config/generated/builders/try/mac-rel-compilator/properties.json
@@ -15,8 +15,7 @@
"execution_mode": "COMPILE_AND_TEST",
"legacy_chromium_config": {
"apply_configs": [
- "mb",
- "goma_use_local"
+ "mb"
],
"build_config": "Release",
"config": "chromium",
@@ -43,8 +42,7 @@
"execution_mode": "COMPILE_AND_TEST",
"legacy_chromium_config": {
"apply_configs": [
- "mb",
- "goma_use_local"
+ "mb"
],
"build_config": "Release",
"config": "chromium",
@@ -71,8 +69,7 @@
"execution_mode": "TEST",
"legacy_chromium_config": {
"apply_configs": [
- "mb",
- "goma_use_local"
+ "mb"
],
"build_config": "Release",
"config": "chromium",
@@ -100,8 +97,7 @@
"execution_mode": "TEST",
"legacy_chromium_config": {
"apply_configs": [
- "mb",
- "goma_use_local"
+ "mb"
],
"build_config": "Release",
"config": "chromium",
diff --git a/chromium/infra/config/generated/builders/try/mac-rel/properties.json b/chromium/infra/config/generated/builders/try/mac-rel/properties.json
index c798ff37f40..479154d8bfc 100644
--- a/chromium/infra/config/generated/builders/try/mac-rel/properties.json
+++ b/chromium/infra/config/generated/builders/try/mac-rel/properties.json
@@ -19,8 +19,7 @@
"execution_mode": "COMPILE_AND_TEST",
"legacy_chromium_config": {
"apply_configs": [
- "mb",
- "goma_use_local"
+ "mb"
],
"build_config": "Release",
"config": "chromium",
@@ -47,8 +46,7 @@
"execution_mode": "COMPILE_AND_TEST",
"legacy_chromium_config": {
"apply_configs": [
- "mb",
- "goma_use_local"
+ "mb"
],
"build_config": "Release",
"config": "chromium",
@@ -75,8 +73,7 @@
"execution_mode": "TEST",
"legacy_chromium_config": {
"apply_configs": [
- "mb",
- "goma_use_local"
+ "mb"
],
"build_config": "Release",
"config": "chromium",
@@ -104,8 +101,7 @@
"execution_mode": "TEST",
"legacy_chromium_config": {
"apply_configs": [
- "mb",
- "goma_use_local"
+ "mb"
],
"build_config": "Release",
"config": "chromium",
diff --git a/chromium/infra/config/generated/builders/try/mac_optional_gpu_tests_rel/properties.json b/chromium/infra/config/generated/builders/try/mac_optional_gpu_tests_rel/properties.json
deleted file mode 100644
index 12203aac9a6..00000000000
--- a/chromium/infra/config/generated/builders/try/mac_optional_gpu_tests_rel/properties.json
+++ /dev/null
@@ -1,57 +0,0 @@
-{
- "$build/chromium_tests_builder_config": {
- "builder_config": {
- "builder_db": {
- "entries": [
- {
- "builder_id": {
- "bucket": "try",
- "builder": "mac_optional_gpu_tests_rel",
- "project": "chromium-m112"
- },
- "builder_spec": {
- "build_gs_bucket": "chromium-gpu-fyi-archive",
- "builder_group": "tryserver.chromium.mac",
- "execution_mode": "COMPILE_AND_TEST",
- "legacy_chromium_config": {
- "apply_configs": [
- "mb"
- ],
- "build_config": "Release",
- "config": "chromium",
- "target_bits": 64
- },
- "legacy_gclient_config": {
- "apply_configs": [
- "angle_internal"
- ],
- "config": "chromium"
- }
- }
- }
- ]
- },
- "builder_ids": [
- {
- "bucket": "try",
- "builder": "mac_optional_gpu_tests_rel",
- "project": "chromium-m112"
- }
- ]
- }
- },
- "$build/reclient": {
- "instance": "rbe-chromium-untrusted",
- "metrics_project": "chromium-reclient-metrics",
- "scandeps_server": true
- },
- "$recipe_engine/resultdb/test_presentation": {
- "column_keys": [],
- "grouping_keys": [
- "status",
- "v.test_suite"
- ]
- },
- "builder_group": "tryserver.chromium.mac",
- "recipe": "chromium_trybot"
-} \ No newline at end of file
diff --git a/chromium/infra/config/generated/cq-usage/default.cfg b/chromium/infra/config/generated/cq-usage/default.cfg
index 440dc03e435..169a87d3667 100644
--- a/chromium/infra/config/generated/cq-usage/default.cfg
+++ b/chromium/infra/config/generated/cq-usage/default.cfg
@@ -37,12 +37,6 @@ config_groups {
name: "chromium-m112/try/android_cronet"
}
builders {
- name: "chromium-m112/try/chromeos-amd64-generic-rel"
- }
- builders {
- name: "chromium-m112/try/chromeos-arm-generic-rel"
- }
- builders {
name: "chromium-m112/try/chromium_presubmit"
disable_reuse: true
}
@@ -56,45 +50,6 @@ config_groups {
name: "chromium-m112/try/fuchsia-x64-cast-receiver-rel"
}
builders {
- name: "chromium-m112/try/ios-simulator"
- }
- builders {
- name: "chromium-m112/try/lacros-amd64-generic-rel"
- }
- builders {
- name: "chromium-m112/try/lacros-arm-generic-rel"
- }
- builders {
- name: "chromium-m112/try/linux-chromeos-compile-dbg"
- }
- builders {
- name: "chromium-m112/try/linux-chromeos-rel"
- }
- builders {
- name: "chromium-m112/try/linux-lacros-rel"
- }
- builders {
- name: "chromium-m112/try/linux-libfuzzer-asan-rel"
- }
- builders {
- name: "chromium-m112/try/linux-rel"
- }
- builders {
- name: "chromium-m112/try/linux-wayland-rel"
- }
- builders {
- name: "chromium-m112/try/linux-x64-castos"
- }
- builders {
- name: "chromium-m112/try/linux_chromium_asan_rel_ng"
- }
- builders {
- name: "chromium-m112/try/linux_chromium_compile_dbg_ng"
- }
- builders {
- name: "chromium-m112/try/linux_chromium_tsan_rel_ng"
- }
- builders {
name: "chromium-m112/try/mac-rel"
}
builders {
diff --git a/chromium/infra/config/generated/cq-usage/full.cfg b/chromium/infra/config/generated/cq-usage/full.cfg
index ab47c304c02..8a8f1075636 100644
--- a/chromium/infra/config/generated/cq-usage/full.cfg
+++ b/chromium/infra/config/generated/cq-usage/full.cfg
@@ -578,76 +578,6 @@ config_groups {
}
}
builders {
- name: "chromium-m112/try/chromeos-amd64-generic-dbg"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "content/gpu/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "media/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/chromeos-amd64-generic-dbg/.+"
- }
- }
- builders {
- name: "chromium-m112/try/chromeos-amd64-generic-rel"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/chromeos-amd64-generic-rel/.+"
- }
- }
- builders {
- name: "chromium-m112/try/chromeos-arm-generic-rel"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/chromeos-arm-generic-rel/.+"
- }
- }
- builders {
name: "chromium-m112/try/chromium_presubmit"
disable_reuse: true
}
@@ -727,81 +657,6 @@ config_groups {
}
}
builders {
- name: "chromium-m112/try/dawn-linux-x64-deps-rel"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "content/test/gpu/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "gpu/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "testing/buildbot/chromium.dawn.json"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "third_party/blink/renderer/modules/webgpu/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "third_party/blink/web_tests/external/wpt/webgpu/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "third_party/blink/web_tests/wpt_internal/webgpu/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "third_party/blink/web_tests/WebGPUExpectations"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "third_party/dawn/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "third_party/webgpu-cts/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "tools/clang/scripts/update.py"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "ui/gl/features.gni"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/dawn-linux-x64-deps-rel/.+"
- }
- }
- builders {
name: "chromium-m112/try/dawn-mac-x64-deps-rel"
location_filters {
gerrit_host_regexp: ".*"
@@ -1112,577 +967,6 @@ config_groups {
}
}
builders {
- name: "chromium-m112/try/ios-simulator"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/ios-simulator/.+"
- }
- }
- builders {
- name: "chromium-m112/try/ios-simulator-cronet"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "components/cronet/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "components/grpc_support/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "ios/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "components/cronet/android/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/ios-simulator-cronet/.+"
- }
- }
- builders {
- name: "chromium-m112/try/ios-simulator-full-configs"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "ios/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/ios-simulator-full-configs/.+"
- }
- }
- builders {
- name: "chromium-m112/try/lacros-amd64-generic-rel"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/lacros-amd64-generic-rel/.+"
- }
- }
- builders {
- name: "chromium-m112/try/lacros-arm-generic-rel"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/lacros-arm-generic-rel/.+"
- }
- }
- builders {
- name: "chromium-m112/try/linux-blink-rel"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "cc/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "third_party/blink/renderer/core/paint/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "third_party/blink/renderer/core/svg/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "third_party/blink/renderer/platform/graphics/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/linux-blink-rel/.+"
- }
- }
- builders {
- name: "chromium-m112/try/linux-chromeos-compile-dbg"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/linux-chromeos-compile-dbg/.+"
- }
- }
- builders {
- name: "chromium-m112/try/linux-chromeos-rel"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/linux-chromeos-rel/.+"
- }
- }
- builders {
- name: "chromium-m112/try/linux-lacros-rel"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/linux-lacros-rel/.+"
- }
- }
- builders {
- name: "chromium-m112/try/linux-libfuzzer-asan-rel"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/linux-libfuzzer-asan-rel/.+"
- }
- }
- builders {
- name: "chromium-m112/try/linux-rel"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/linux-rel/.+"
- }
- }
- builders {
- name: "chromium-m112/try/linux-wayland-rel"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/linux-wayland-rel/.+"
- }
- }
- builders {
- name: "chromium-m112/try/linux-x64-castos"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/linux-x64-castos/.+"
- }
- }
- builders {
- name: "chromium-m112/try/linux-x64-castos-dbg"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "chromecast/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/linux-x64-castos-dbg/.+"
- }
- }
- builders {
- name: "chromium-m112/try/linux_chromium_asan_rel_ng"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/linux_chromium_asan_rel_ng/.+"
- }
- }
- builders {
- name: "chromium-m112/try/linux_chromium_compile_dbg_ng"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/linux_chromium_compile_dbg_ng/.+"
- }
- }
- builders {
- name: "chromium-m112/try/linux_chromium_dbg_ng"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "build/.*check_gn_headers.*"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/linux_chromium_dbg_ng/.+"
- }
- }
- builders {
- name: "chromium-m112/try/linux_chromium_tsan_rel_ng"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/linux_chromium_tsan_rel_ng/.+"
- }
- }
- builders {
- name: "chromium-m112/try/linux_optional_gpu_tests_rel"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "chrome/browser/vr/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "content/browser/xr/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "content/test/gpu/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "gpu/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "media/audio/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "media/base/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "media/capture/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "media/filters/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "media/gpu/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "media/mojo/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "media/renderers/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "media/video/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "testing/buildbot/tryserver.chromium.linux.json"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "testing/trigger_scripts/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "third_party/blink/renderer/modules/mediastream/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "third_party/blink/renderer/modules/webcodecs/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "third_party/blink/renderer/modules/webgl/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "third_party/blink/renderer/platform/graphics/gpu/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "tools/clang/scripts/update.py"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "tools/mb/mb_config_expectations/tryserver.chromium.linux.json"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "ui/gl/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/linux_optional_gpu_tests_rel/.+"
- }
- }
- builders {
- name: "chromium-m112/try/linux_vr"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "chrome/browser/vr/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "content/browser/xr/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/linux_vr/.+"
- }
- }
- builders {
name: "chromium-m112/try/mac-rel"
location_filters {
gerrit_host_regexp: ".*"
@@ -1723,136 +1007,6 @@ config_groups {
}
}
builders {
- name: "chromium-m112/try/mac_optional_gpu_tests_rel"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "chrome/browser/vr/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "content/browser/xr/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "content/test/gpu/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "gpu/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "media/audio/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "media/base/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "media/capture/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "media/filters/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "media/gpu/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "media/mojo/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "media/renderers/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "media/video/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "services/shape_detection/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "testing/buildbot/tryserver.chromium.mac.json"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "testing/trigger_scripts/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "third_party/blink/renderer/modules/mediastream/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "third_party/blink/renderer/modules/webcodecs/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "third_party/blink/renderer/modules/webgl/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "third_party/blink/renderer/platform/graphics/gpu/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "tools/clang/scripts/update.py"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "tools/mb/mb_config_expectations/tryserver.chromium.mac.json"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "ui/gl/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/mac_optional_gpu_tests_rel/.+"
- }
- }
- builders {
name: "chromium-m112/try/win-libfuzzer-asan-rel"
location_filters {
gerrit_host_regexp: ".*"
diff --git a/chromium/infra/config/generated/health-specs/health-specs.json b/chromium/infra/config/generated/health-specs/health-specs.json
index 8bffc365409..173e94a7415 100644
--- a/chromium/infra/config/generated/health-specs/health-specs.json
+++ b/chromium/infra/config/generated/health-specs/health-specs.json
@@ -21,75 +21,5 @@
"p95_mins": 20,
"p99_mins": 30
}
- },
- "ci": {
- "chromeos-amd64-generic-dbg": {
- "_default": "_default"
- },
- "chromeos-amd64-generic-lacros-dbg": {
- "_default": "_default"
- },
- "chromeos-amd64-generic-rel": {
- "_default": "_default"
- },
- "chromeos-arm-generic-rel": {
- "_default": "_default"
- },
- "chromeos-arm64-generic-rel": {
- "_default": "_default"
- },
- "chromeos-jacuzzi-rel": {
- "_default": "_default"
- },
- "chromeos-octopus-rel": {
- "_default": "_default"
- },
- "lacros-amd64-generic-rel": {
- "_default": "_default"
- },
- "lacros-arm-generic-rel": {
- "_default": "_default"
- },
- "lacros-arm64-generic-rel": {
- "_default": "_default"
- },
- "linux-chromeos-dbg": {
- "_default": "_default"
- },
- "linux-chromeos-rel": {
- "_default": "_default"
- },
- "linux-lacros-builder-rel": {
- "_default": "_default"
- },
- "linux-lacros-dbg": {
- "_default": "_default"
- },
- "linux-lacros-tester-rel": {
- "_default": "_default"
- },
- "linux-official": {
- "build_time": {
- "p50_mins": 240,
- "p95_mins": 300,
- "p99_mins": 360
- },
- "fail_rate": {
- "average": 0.2
- },
- "infra_fail_rate": {
- "average": 0.05
- },
- "pending_time": {
- "p50_mins": 10,
- "p95_mins": 20,
- "p99_mins": 30
- },
- "test_pending_time": {
- "p50_mins": 10,
- "p95_mins": 20,
- "p99_mins": 30
- }
- }
}
} \ No newline at end of file
diff --git a/chromium/infra/config/generated/luci/commit-queue.cfg b/chromium/infra/config/generated/luci/commit-queue.cfg
index c2a130743a7..8cab1111563 100644
--- a/chromium/infra/config/generated/luci/commit-queue.cfg
+++ b/chromium/infra/config/generated/luci/commit-queue.cfg
@@ -27,27 +27,6 @@ config_groups {
}
tryjob {
builders {
- name: "chrome-m112/try/lacros-amd64-generic-chrome-skylab"
- includable_only: true
- result_visibility: COMMENT_LEVEL_RESTRICTED
- owner_whitelist_group: "googlers"
- owner_whitelist_group: "project-chromium-robot-committers"
- }
- builders {
- name: "chrome-m112/try/linux-chrome"
- includable_only: true
- result_visibility: COMMENT_LEVEL_RESTRICTED
- owner_whitelist_group: "googlers"
- owner_whitelist_group: "project-chromium-robot-committers"
- }
- builders {
- name: "chrome-m112/try/linux-pgo"
- includable_only: true
- result_visibility: COMMENT_LEVEL_RESTRICTED
- owner_whitelist_group: "googlers"
- owner_whitelist_group: "project-chromium-robot-committers"
- }
- builders {
name: "chrome-m112/try/mac-arm-pgo"
includable_only: true
result_visibility: COMMENT_LEVEL_RESTRICTED
@@ -679,96 +658,6 @@ config_groups {
}
}
builders {
- name: "chromium-m112/try/chromeos-amd64-generic-dbg"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "content/gpu/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "media/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/chromeos-amd64-generic-dbg/.+"
- }
- }
- builders {
- name: "chromium-m112/try/chromeos-amd64-generic-lacros-dbg"
- includable_only: true
- }
- builders {
- name: "chromium-m112/try/chromeos-amd64-generic-rel"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/chromeos-amd64-generic-rel/.+"
- }
- }
- builders {
- name: "chromium-m112/try/chromeos-amd64-generic-rel-compilator"
- includable_only: true
- }
- builders {
- name: "chromium-m112/try/chromeos-arm-generic-rel"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/chromeos-arm-generic-rel/.+"
- }
- }
- builders {
- name: "chromium-m112/try/chromeos-arm64-generic-rel"
- includable_only: true
- }
- builders {
- name: "chromium-m112/try/chromeos-jacuzzi-rel"
- includable_only: true
- }
- builders {
- name: "chromium-m112/try/chromeos-octopus-rel"
- includable_only: true
- }
- builders {
name: "chromium-m112/try/chromium_presubmit"
disable_reuse: true
}
@@ -848,81 +737,6 @@ config_groups {
}
}
builders {
- name: "chromium-m112/try/dawn-linux-x64-deps-rel"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "content/test/gpu/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "gpu/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "testing/buildbot/chromium.dawn.json"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "third_party/blink/renderer/modules/webgpu/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "third_party/blink/web_tests/external/wpt/webgpu/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "third_party/blink/web_tests/wpt_internal/webgpu/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "third_party/blink/web_tests/WebGPUExpectations"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "third_party/dawn/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "third_party/webgpu-cts/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "tools/clang/scripts/update.py"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "ui/gl/features.gni"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/dawn-linux-x64-deps-rel/.+"
- }
- }
- builders {
name: "chromium-m112/try/dawn-mac-x64-deps-rel"
location_filters {
gerrit_host_regexp: ".*"
@@ -1249,633 +1063,6 @@ config_groups {
includable_only: true
}
builders {
- name: "chromium-m112/try/ios-simulator"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/ios-simulator/.+"
- }
- }
- builders {
- name: "chromium-m112/try/ios-simulator-compilator"
- includable_only: true
- }
- builders {
- name: "chromium-m112/try/ios-simulator-cronet"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "components/cronet/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "components/grpc_support/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "ios/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "components/cronet/android/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/ios-simulator-cronet/.+"
- }
- }
- builders {
- name: "chromium-m112/try/ios-simulator-full-configs"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "ios/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/ios-simulator-full-configs/.+"
- }
- }
- builders {
- name: "chromium-m112/try/lacros-amd64-generic-rel"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/lacros-amd64-generic-rel/.+"
- }
- }
- builders {
- name: "chromium-m112/try/lacros-amd64-generic-rel-compilator"
- includable_only: true
- }
- builders {
- name: "chromium-m112/try/lacros-amd64-generic-rel-orchestrator"
- includable_only: true
- }
- builders {
- name: "chromium-m112/try/lacros-amd64-generic-rel-skylab"
- includable_only: true
- }
- builders {
- name: "chromium-m112/try/lacros-amd64-generic-rel-skylab-fyi"
- includable_only: true
- }
- builders {
- name: "chromium-m112/try/lacros-arm-generic-rel"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/lacros-arm-generic-rel/.+"
- }
- }
- builders {
- name: "chromium-m112/try/lacros-arm64-generic-rel"
- includable_only: true
- }
- builders {
- name: "chromium-m112/try/linux-blink-rel"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "cc/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "third_party/blink/renderer/core/paint/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "third_party/blink/renderer/core/svg/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "third_party/blink/renderer/platform/graphics/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/linux-blink-rel/.+"
- }
- }
- builders {
- name: "chromium-m112/try/linux-chromeos-compile-dbg"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/linux-chromeos-compile-dbg/.+"
- }
- }
- builders {
- name: "chromium-m112/try/linux-chromeos-dbg"
- includable_only: true
- }
- builders {
- name: "chromium-m112/try/linux-chromeos-rel"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/linux-chromeos-rel/.+"
- }
- }
- builders {
- name: "chromium-m112/try/linux-chromeos-rel-compilator"
- includable_only: true
- }
- builders {
- name: "chromium-m112/try/linux-lacros-rel"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/linux-lacros-rel/.+"
- }
- }
- builders {
- name: "chromium-m112/try/linux-lacros-rel-compilator"
- includable_only: true
- }
- builders {
- name: "chromium-m112/try/linux-libfuzzer-asan-rel"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/linux-libfuzzer-asan-rel/.+"
- }
- }
- builders {
- name: "chromium-m112/try/linux-official"
- includable_only: true
- }
- builders {
- name: "chromium-m112/try/linux-rel"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/linux-rel/.+"
- }
- }
- builders {
- name: "chromium-m112/try/linux-rel-compilator"
- includable_only: true
- }
- builders {
- name: "chromium-m112/try/linux-wayland-rel"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/linux-wayland-rel/.+"
- }
- }
- builders {
- name: "chromium-m112/try/linux-wayland-rel-compilator"
- includable_only: true
- }
- builders {
- name: "chromium-m112/try/linux-x64-castos"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/linux-x64-castos/.+"
- }
- }
- builders {
- name: "chromium-m112/try/linux-x64-castos-dbg"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "chromecast/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/linux-x64-castos-dbg/.+"
- }
- }
- builders {
- name: "chromium-m112/try/linux_chromium_asan_rel_ng"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/linux_chromium_asan_rel_ng/.+"
- }
- }
- builders {
- name: "chromium-m112/try/linux_chromium_asan_rel_ng-compilator"
- includable_only: true
- }
- builders {
- name: "chromium-m112/try/linux_chromium_compile_dbg_ng"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/linux_chromium_compile_dbg_ng/.+"
- }
- }
- builders {
- name: "chromium-m112/try/linux_chromium_dbg_ng"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "build/.*check_gn_headers.*"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/linux_chromium_dbg_ng/.+"
- }
- }
- builders {
- name: "chromium-m112/try/linux_chromium_tsan_rel_ng"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/linux_chromium_tsan_rel_ng/.+"
- }
- }
- builders {
- name: "chromium-m112/try/linux_chromium_tsan_rel_ng-compilator"
- includable_only: true
- }
- builders {
- name: "chromium-m112/try/linux_optional_gpu_tests_rel"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "chrome/browser/vr/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "content/browser/xr/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "content/test/gpu/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "gpu/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "media/audio/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "media/base/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "media/capture/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "media/filters/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "media/gpu/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "media/mojo/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "media/renderers/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "media/video/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "testing/buildbot/tryserver.chromium.linux.json"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "testing/trigger_scripts/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "third_party/blink/renderer/modules/mediastream/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "third_party/blink/renderer/modules/webcodecs/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "third_party/blink/renderer/modules/webgl/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "third_party/blink/renderer/platform/graphics/gpu/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "tools/clang/scripts/update.py"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "tools/mb/mb_config_expectations/tryserver.chromium.linux.json"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "ui/gl/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/linux_optional_gpu_tests_rel/.+"
- }
- }
- builders {
- name: "chromium-m112/try/linux_vr"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "chrome/browser/vr/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "content/browser/xr/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/linux_vr/.+"
- }
- }
- builders {
name: "chromium-m112/try/mac-official"
includable_only: true
}
@@ -1960,136 +1147,6 @@ config_groups {
}
}
builders {
- name: "chromium-m112/try/mac_optional_gpu_tests_rel"
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "chrome/browser/vr/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "content/browser/xr/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "content/test/gpu/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "gpu/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "media/audio/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "media/base/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "media/capture/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "media/filters/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "media/gpu/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "media/mojo/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "media/renderers/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "media/video/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "services/shape_detection/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "testing/buildbot/tryserver.chromium.mac.json"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "testing/trigger_scripts/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "third_party/blink/renderer/modules/mediastream/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "third_party/blink/renderer/modules/webcodecs/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "third_party/blink/renderer/modules/webgl/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "third_party/blink/renderer/platform/graphics/gpu/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "tools/clang/scripts/update.py"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "tools/mb/mb_config_expectations/tryserver.chromium.mac.json"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "ui/gl/.+"
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "docs/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/.+"
- exclude: true
- }
- location_filters {
- gerrit_host_regexp: ".*"
- gerrit_project_regexp: ".*"
- path_regexp: "infra/config/generated/builders/try/mac_optional_gpu_tests_rel/.+"
- }
- }
- builders {
name: "chromium-m112/try/try-nougat-phone-tester"
includable_only: true
}
diff --git a/chromium/infra/config/generated/luci/cr-buildbucket.cfg b/chromium/infra/config/generated/luci/cr-buildbucket.cfg
index 97a6d15bb10..2ce917e87c3 100644
--- a/chromium/infra/config/generated/luci/cr-buildbucket.cfg
+++ b/chromium/infra/config/generated/luci/cr-buildbucket.cfg
@@ -959,180 +959,6 @@ buckets {
}
}
builders {
- name: "Cast Linux"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "free_space:standard"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.ci"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/Cast Linux/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium.linux",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- execution_timeout_secs: 10800
- build_numbers: YES
- service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "Cast Linux Debug"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "free_space:standard"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.ci"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/Cast Linux Debug/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium.linux",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- execution_timeout_secs: 10800
- build_numbers: YES
- service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
name: "Dawn Android arm DEPS Release (Pixel 4)"
swarming_host: "chromium-swarm.appspot.com"
dimensions: "builderless:1"
@@ -1220,267 +1046,6 @@ buckets {
}
}
builders {
- name: "Dawn Linux x64 DEPS Builder"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "free_space:standard"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.gpu.ci"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/Dawn Linux x64 DEPS Builder/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium.dawn",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- execution_timeout_secs: 10800
- build_numbers: YES
- service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "Dawn Linux x64 DEPS Release (Intel UHD 630)"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:2"
- dimensions: "cpu:x86-64"
- dimensions: "free_space:standard"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.gpu.ci"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/Dawn Linux x64 DEPS Release (Intel UHD 630)/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium.dawn",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- execution_timeout_secs: 10800
- build_numbers: YES
- service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "Dawn Linux x64 DEPS Release (NVIDIA)"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:2"
- dimensions: "cpu:x86-64"
- dimensions: "free_space:standard"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.gpu.ci"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/Dawn Linux x64 DEPS Release (NVIDIA)/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium.dawn",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- execution_timeout_secs: 10800
- build_numbers: YES
- service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
name: "Dawn Mac x64 DEPS Builder"
swarming_host: "chromium-swarm.appspot.com"
dimensions: "builderless:1"
@@ -2262,93 +1827,6 @@ buckets {
}
}
builders {
- name: "GPU Linux Builder"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "free_space:standard"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.gpu.ci"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/GPU Linux Builder/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium.gpu",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- execution_timeout_secs: 10800
- build_numbers: YES
- service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
name: "GPU Mac Builder"
swarming_host: "chromium-swarm.appspot.com"
dimensions: "builderless:1"
@@ -2521,1060 +1999,6 @@ buckets {
}
}
builders {
- name: "Linux ASan LSan Builder"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "free_space:standard"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.ci"
- dimensions: "ssd:1"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/Linux ASan LSan Builder/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium.memory",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- execution_timeout_secs: 10800
- build_numbers: YES
- service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "Linux ASan LSan Tests (1)"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "free_space:standard"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.ci"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/Linux ASan LSan Tests (1)/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium.memory",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- execution_timeout_secs: 10800
- build_numbers: YES
- service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "Linux ASan Tests (sandboxed)"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "free_space:standard"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.ci"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/Linux ASan Tests (sandboxed)/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium.memory",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- execution_timeout_secs: 10800
- build_numbers: YES
- service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "Linux Builder"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "free_space:standard"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.ci"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/Linux Builder/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium.linux",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- execution_timeout_secs: 10800
- build_numbers: YES
- service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "Linux Builder (Wayland)"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "free_space:standard"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.ci"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/Linux Builder (Wayland)/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium.linux",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- execution_timeout_secs: 10800
- build_numbers: YES
- service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "Linux Builder (dbg)"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "free_space:standard"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.ci"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/Linux Builder (dbg)/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium.linux",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- execution_timeout_secs: 10800
- build_numbers: YES
- service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "Linux Release (NVIDIA)"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:2"
- dimensions: "cpu:x86-64"
- dimensions: "free_space:standard"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.gpu.ci"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/Linux Release (NVIDIA)/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium.gpu",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- execution_timeout_secs: 10800
- build_numbers: YES
- service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "Linux TSan Builder"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "free_space:standard"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.ci"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/Linux TSan Builder/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium.memory",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- execution_timeout_secs: 10800
- build_numbers: YES
- service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "Linux TSan Tests"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "free_space:standard"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.ci"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/Linux TSan Tests/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium.memory",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- execution_timeout_secs: 10800
- build_numbers: YES
- service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "Linux Tests"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "free_space:standard"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.ci"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/Linux Tests/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium.linux",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- execution_timeout_secs: 10800
- build_numbers: YES
- service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_text_artifacts"
- text_artifacts {
- predicate {
- content_type_regexp: "snippet"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "Linux Tests (Wayland)"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "free_space:standard"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.ci"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/Linux Tests (Wayland)/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium.linux",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- execution_timeout_secs: 10800
- build_numbers: YES
- service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "Linux Tests (dbg)(1)"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "free_space:standard"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.ci"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/Linux Tests (dbg)(1)/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium.linux",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- execution_timeout_secs: 10800
- build_numbers: YES
- service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
name: "Mac Builder"
swarming_host: "chromium-swarm.appspot.com"
dimensions: "builder:Mac Builder"
@@ -4613,94 +3037,6 @@ buckets {
}
}
builders {
- name: "VR Linux"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "free_space:standard"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.ci"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/VR Linux/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium.fyi",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- priority: 35
- execution_timeout_secs: 36000
- build_numbers: YES
- service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
name: "Win Builder"
swarming_host: "chromium-swarm.appspot.com"
dimensions: "builder:Win Builder"
@@ -5909,615 +4245,6 @@ buckets {
}
}
builders {
- name: "chromeos-amd64-generic-dbg"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "free_space:standard"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.ci"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/chromeos-amd64-generic-dbg/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium.chromiumos",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- execution_timeout_secs: 10800
- build_numbers: YES
- service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "chromeos-amd64-generic-lacros-dbg"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "free_space:standard"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.ci"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/chromeos-amd64-generic-lacros-dbg/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium.chromiumos",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- execution_timeout_secs: 10800
- build_numbers: YES
- service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "chromeos-amd64-generic-rel"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "free_space:standard"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.ci"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/chromeos-amd64-generic-rel/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium.chromiumos",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- execution_timeout_secs: 10800
- build_numbers: YES
- service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "chromeos-arm-generic-rel"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "free_space:standard"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.ci"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/chromeos-arm-generic-rel/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium.chromiumos",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- execution_timeout_secs: 10800
- build_numbers: YES
- service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "chromeos-arm64-generic-rel"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "free_space:standard"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.ci"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/chromeos-arm64-generic-rel/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium.chromiumos",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- execution_timeout_secs: 10800
- build_numbers: YES
- service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "chromeos-jacuzzi-rel"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "free_space:standard"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.ci"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/chromeos-jacuzzi-rel/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium.chromiumos",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- execution_timeout_secs: 10800
- build_numbers: YES
- service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "chromeos-octopus-rel"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "free_space:standard"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.ci"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/chromeos-octopus-rel/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium.chromiumos",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- execution_timeout_secs: 10800
- build_numbers: YES
- service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
name: "fuchsia-arm64-cast-receiver-rel"
swarming_host: "chromium-swarm.appspot.com"
dimensions: "builderless:1"
@@ -6557,7 +4284,7 @@ buckets {
' "led_builder_is_bootstrapped": true,'
' "recipe": "chromium",'
' "sheriff_rotations": ['
- ' "chrome_browser_release"'
+ ' "fuchsia"'
' ]'
'}'
execution_timeout_secs: 10800
@@ -6644,7 +4371,7 @@ buckets {
' "led_builder_is_bootstrapped": true,'
' "recipe": "chromium",'
' "sheriff_rotations": ['
- ' "chrome_browser_release"'
+ ' "fuchsia"'
' ]'
'}'
execution_timeout_secs: 10800
@@ -6729,7 +4456,7 @@ buckets {
' "led_builder_is_bootstrapped": true,'
' "recipe": "chromium",'
' "sheriff_rotations": ['
- ' "chrome_browser_release"'
+ ' "fuchsia"'
' ]'
'}'
execution_timeout_secs: 36000
@@ -6816,7 +4543,7 @@ buckets {
' "led_builder_is_bootstrapped": true,'
' "recipe": "chromium",'
' "sheriff_rotations": ['
- ' "chrome_browser_release"'
+ ' "fuchsia"'
' ]'
'}'
execution_timeout_secs: 10800
@@ -6903,961 +4630,7 @@ buckets {
' "led_builder_is_bootstrapped": true,'
' "recipe": "chromium",'
' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- execution_timeout_secs: 10800
- build_numbers: YES
- service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "ios-simulator"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builder:ios-simulator"
- dimensions: "cpu:x86-64"
- dimensions: "os:Mac-12"
- dimensions: "pool:luci.chromium.ci"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/ios-simulator/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium.mac",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- execution_timeout_secs: 10800
- caches {
- name: "xcode_ios_14c18"
- path: "xcode_ios_14c18.app"
- }
- build_numbers: YES
- service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "ios-simulator-cronet"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builder:ios-simulator-cronet"
- dimensions: "cpu:x86-64"
- dimensions: "pool:luci.chromium.ci"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/ios-simulator-cronet/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium.fyi",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- priority: 35
- execution_timeout_secs: 36000
- caches {
- name: "xcode_ios_14c18"
- path: "xcode_ios_14c18.app"
- }
- build_numbers: YES
- service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "ios-simulator-full-configs"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builder:ios-simulator-full-configs"
- dimensions: "cpu:x86-64"
- dimensions: "os:Mac-12"
- dimensions: "pool:luci.chromium.ci"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/ios-simulator-full-configs/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium.mac",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- execution_timeout_secs: 10800
- caches {
- name: "xcode_ios_14c18"
- path: "xcode_ios_14c18.app"
- }
- build_numbers: YES
- service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "lacros-amd64-generic-rel"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "free_space:standard"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.ci"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/lacros-amd64-generic-rel/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium.chromiumos",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- execution_timeout_secs: 10800
- build_numbers: YES
- service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "lacros-arm-generic-rel"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "free_space:standard"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.ci"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/lacros-arm-generic-rel/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium.chromiumos",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- execution_timeout_secs: 10800
- build_numbers: YES
- service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "lacros-arm64-generic-rel"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "free_space:standard"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.ci"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/lacros-arm64-generic-rel/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium.chromiumos",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- execution_timeout_secs: 10800
- build_numbers: YES
- service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "linux-chromeos-dbg"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "free_space:standard"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.ci"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/linux-chromeos-dbg/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium.chromiumos",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- execution_timeout_secs: 10800
- build_numbers: YES
- service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "linux-chromeos-rel"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builder:linux-chromeos-rel"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.ci"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/linux-chromeos-rel/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium.chromiumos",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- execution_timeout_secs: 10800
- build_numbers: YES
- service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "linux-lacros-builder-rel"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builder:linux-lacros-builder-rel"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.ci"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/linux-lacros-builder-rel/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium.chromiumos",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- execution_timeout_secs: 10800
- build_numbers: YES
- service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "linux-lacros-dbg"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builder:linux-lacros-dbg"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.ci"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/linux-lacros-dbg/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium.chromiumos",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- execution_timeout_secs: 10800
- build_numbers: YES
- service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "linux-lacros-tester-rel"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "free_space:standard"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.ci"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/linux-lacros-tester-rel/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium.chromiumos",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
+ ' "fuchsia"'
' ]'
'}'
execution_timeout_secs: 10800
@@ -7905,91 +4678,6 @@ buckets {
}
}
builders {
- name: "linux-official"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builder:linux-official"
- dimensions: "cores:32"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.ci"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/ci/linux-official/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "chromium",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium",'
- ' "sheriff_rotations": ['
- ' "chrome_browser_release"'
- ' ]'
- '}'
- execution_timeout_secs: 25200
- build_numbers: YES
- service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "ci_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_ci_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
name: "mac-arm64-rel"
swarming_host: "chromium-swarm.appspot.com"
dimensions: "builder:mac-arm64-rel"
@@ -10146,727 +6834,6 @@ buckets {
}
}
builders {
- name: "chromeos-amd64-generic-dbg"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/chromeos-amd64-generic-dbg/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.chromiumos",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium_trybot"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "chromeos-amd64-generic-lacros-dbg"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/chromeos-amd64-generic-lacros-dbg/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.chromiumos",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium_trybot"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "chromeos-amd64-generic-rel"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:2"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/chromeos-amd64-generic-rel/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.chromiumos",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium/orchestrator"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-orchestrator@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- description_html: "This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium-m112/builders/try/chromeos-amd64-generic-rel-compilator\">chromeos-amd64-generic-rel-compilator</a>."
- }
- builders {
- name: "chromeos-amd64-generic-rel-compilator"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- dimensions: "ssd:1"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/chromeos-amd64-generic-rel-compilator/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.chromiumos",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium/compilator"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- description_html: "This is the compilator half of an orchestrator + compilator pair of builders. The orchestrator is <a href=\"https://ci.chromium.org/p/chromium-m112/builders/try/chromeos-amd64-generic-rel\">chromeos-amd64-generic-rel</a>."
- }
- builders {
- name: "chromeos-arm-generic-rel"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/chromeos-arm-generic-rel/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.chromiumos",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium_trybot"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "chromeos-arm64-generic-rel"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/chromeos-arm64-generic-rel/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.chromiumos",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium_trybot"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "chromeos-jacuzzi-rel"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/chromeos-jacuzzi-rel/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.chromiumos",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium_trybot"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "chromeos-octopus-rel"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/chromeos-octopus-rel/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.chromiumos",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium_trybot"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
name: "chromium_presubmit"
swarming_host: "chromium-swarm.appspot.com"
dimensions: "builderless:1"
@@ -11037,94 +7004,6 @@ buckets {
}
}
builders {
- name: "dawn-linux-x64-deps-rel"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builder:dawn-linux-x64-deps-rel"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/dawn-linux-x64-deps-rel/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.dawn",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium_trybot"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
name: "dawn-mac-x64-deps-rel"
swarming_host: "chromium-swarm.appspot.com"
dimensions: "builder:dawn-mac-x64-deps-rel"
@@ -12146,3095 +8025,6 @@ buckets {
}
}
builders {
- name: "ios-simulator"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:2"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/ios-simulator/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.mac",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium/orchestrator"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-orchestrator@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- description_html: "This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium-m112/builders/try/ios-simulator-compilator\">ios-simulator-compilator</a>."
- }
- builders {
- name: "ios-simulator-compilator"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builder:ios-simulator-compilator"
- dimensions: "cpu:x86-64"
- dimensions: "os:Mac-12"
- dimensions: "pool:luci.chromium.try"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/ios-simulator-compilator/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.mac",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium/compilator"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- caches {
- name: "xcode_ios_14c18"
- path: "xcode_ios_14c18.app"
- }
- build_numbers: YES
- service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- description_html: "This is the compilator half of an orchestrator + compilator pair of builders. The orchestrator is <a href=\"https://ci.chromium.org/p/chromium-m112/builders/try/ios-simulator\">ios-simulator</a>."
- }
- builders {
- name: "ios-simulator-cronet"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builder:ios-simulator-cronet"
- dimensions: "cpu:x86-64"
- dimensions: "os:Mac-12"
- dimensions: "pool:luci.chromium.try"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/ios-simulator-cronet/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.mac",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium_trybot"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- caches {
- name: "xcode_ios_14c18"
- path: "xcode_ios_14c18.app"
- }
- build_numbers: YES
- service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "ios-simulator-full-configs"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builder:ios-simulator-full-configs"
- dimensions: "cpu:x86-64"
- dimensions: "os:Mac-12"
- dimensions: "pool:luci.chromium.try"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/ios-simulator-full-configs/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.mac",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium_trybot"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- caches {
- name: "xcode_ios_14c18"
- path: "xcode_ios_14c18.app"
- }
- build_numbers: YES
- service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "lacros-amd64-generic-rel"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/lacros-amd64-generic-rel/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.chromiumos",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium_trybot"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "lacros-amd64-generic-rel-compilator"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/lacros-amd64-generic-rel-compilator/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.chromiumos",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium/compilator"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- description_html: "This is the compilator half of an orchestrator + compilator pair of builders. The orchestrator is <a href=\"https://ci.chromium.org/p/chromium-m112/builders/try/lacros-amd64-generic-rel-orchestrator\">lacros-amd64-generic-rel-orchestrator</a>."
- }
- builders {
- name: "lacros-amd64-generic-rel-orchestrator"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "cores:2"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try.orchestrator"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/lacros-amd64-generic-rel-orchestrator/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.chromiumos",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium/orchestrator"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- caches {
- name: "unused_builder_cache"
- path: "builder"
- }
- build_numbers: YES
- service_account: "chromium-orchestrator@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- description_html: "This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium-m112/builders/try/lacros-amd64-generic-rel-compilator\">lacros-amd64-generic-rel-compilator</a>."
- }
- builders {
- name: "lacros-amd64-generic-rel-skylab"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/lacros-amd64-generic-rel-skylab/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.chromiumos",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium_trybot"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "lacros-amd64-generic-rel-skylab-fyi"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/lacros-amd64-generic-rel-skylab-fyi/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.chromiumos",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium_trybot"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "lacros-arm-generic-rel"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/lacros-arm-generic-rel/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.chromiumos",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium_trybot"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "lacros-arm64-generic-rel"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/lacros-arm64-generic-rel/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.chromiumos",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium_trybot"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "linux-blink-rel"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/linux-blink-rel/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.blink",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium_trybot"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "linux-chromeos-compile-dbg"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/linux-chromeos-compile-dbg/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.chromiumos",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium_trybot"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "linux-chromeos-dbg"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/linux-chromeos-dbg/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.chromiumos",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium_trybot"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "linux-chromeos-rel"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:2"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/linux-chromeos-rel/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.chromiumos",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium/orchestrator"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-orchestrator@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- description_html: "This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium-m112/builders/try/linux-chromeos-rel-compilator\">linux-chromeos-rel-compilator</a>."
- }
- builders {
- name: "linux-chromeos-rel-compilator"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:16"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- dimensions: "ssd:1"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/linux-chromeos-rel-compilator/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.chromiumos",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium/compilator"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- description_html: "This is the compilator half of an orchestrator + compilator pair of builders. The orchestrator is <a href=\"https://ci.chromium.org/p/chromium-m112/builders/try/linux-chromeos-rel\">linux-chromeos-rel</a>."
- }
- builders {
- name: "linux-lacros-rel"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:2"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/linux-lacros-rel/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.chromiumos",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium/orchestrator"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-orchestrator@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- description_html: "This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium-m112/builders/try/linux-lacros-rel-compilator\">linux-lacros-rel-compilator</a>."
- }
- builders {
- name: "linux-lacros-rel-compilator"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:32"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- dimensions: "ssd:1"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/linux-lacros-rel-compilator/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.chromiumos",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium/compilator"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- description_html: "This is the compilator half of an orchestrator + compilator pair of builders. The orchestrator is <a href=\"https://ci.chromium.org/p/chromium-m112/builders/try/linux-lacros-rel\">linux-lacros-rel</a>."
- }
- builders {
- name: "linux-libfuzzer-asan-rel"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
- cipd_version: "refs/heads/main"
- cmd: "luciexe"
- }
- properties:
- '{'
- ' "$build/reclient": {'
- ' "instance": "rbe-chromium-untrusted",'
- ' "metrics_project": "chromium-reclient-metrics"'
- ' },'
- ' "$recipe_engine/resultdb/test_presentation": {'
- ' "column_keys": [],'
- ' "grouping_keys": ['
- ' "status",'
- ' "v.test_suite"'
- ' ]'
- ' },'
- ' "builder_group": "tryserver.chromium.linux",'
- ' "recipe": "chromium_libfuzzer_trybot"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "linux-official"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:32"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/linux-official/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium_trybot"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "linux-rel"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:2"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/linux-rel/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.linux",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium/orchestrator"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-orchestrator@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_rts.inverted_rts"
- value: 100
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- description_html: "This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium-m112/builders/try/linux-rel-compilator\">linux-rel-compilator</a>."
- }
- builders {
- name: "linux-rel-compilator"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- dimensions: "ssd:1"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/linux-rel-compilator/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.linux",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium/compilator"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- description_html: "This is the compilator half of an orchestrator + compilator pair of builders. The orchestrator is <a href=\"https://ci.chromium.org/p/chromium-m112/builders/try/linux-rel\">linux-rel</a>."
- }
- builders {
- name: "linux-wayland-rel"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:2"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/linux-wayland-rel/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.linux",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium/orchestrator"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-orchestrator@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_rts.inverted_rts"
- value: 100
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- description_html: "This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium-m112/builders/try/linux-wayland-rel-compilator\">linux-wayland-rel-compilator</a>."
- }
- builders {
- name: "linux-wayland-rel-compilator"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- dimensions: "ssd:1"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/linux-wayland-rel-compilator/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.linux",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium/compilator"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- description_html: "This is the compilator half of an orchestrator + compilator pair of builders. The orchestrator is <a href=\"https://ci.chromium.org/p/chromium-m112/builders/try/linux-wayland-rel\">linux-wayland-rel</a>."
- }
- builders {
- name: "linux-x64-castos"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/linux-x64-castos/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.linux",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium_trybot"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "linux-x64-castos-dbg"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/linux-x64-castos-dbg/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.linux",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium_trybot"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "linux_chromium_asan_rel_ng"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:2"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/linux_chromium_asan_rel_ng/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.linux",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium/orchestrator"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-orchestrator@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_rts.inverted_rts"
- value: 100
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- description_html: "This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium-m112/builders/try/linux_chromium_asan_rel_ng-compilator\">linux_chromium_asan_rel_ng-compilator</a>."
- }
- builders {
- name: "linux_chromium_asan_rel_ng-compilator"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- dimensions: "ssd:1"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/linux_chromium_asan_rel_ng-compilator/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.linux",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium/compilator"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- description_html: "This is the compilator half of an orchestrator + compilator pair of builders. The orchestrator is <a href=\"https://ci.chromium.org/p/chromium-m112/builders/try/linux_chromium_asan_rel_ng\">linux_chromium_asan_rel_ng</a>."
- }
- builders {
- name: "linux_chromium_compile_dbg_ng"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/linux_chromium_compile_dbg_ng/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.linux",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium_trybot"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- caches {
- name: "builder"
- path: "linux_debug"
- }
- build_numbers: YES
- service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "linux_chromium_dbg_ng"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/linux_chromium_dbg_ng/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.linux",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium_trybot"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- caches {
- name: "builder"
- path: "linux_debug"
- }
- build_numbers: YES
- service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "linux_chromium_tsan_rel_ng"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:2"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/linux_chromium_tsan_rel_ng/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.linux",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium/orchestrator"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-orchestrator@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_rts.inverted_rts"
- value: 100
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- description_html: "This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium-m112/builders/try/linux_chromium_tsan_rel_ng-compilator\">linux_chromium_tsan_rel_ng-compilator</a>."
- }
- builders {
- name: "linux_chromium_tsan_rel_ng-compilator"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- dimensions: "ssd:1"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/linux_chromium_tsan_rel_ng-compilator/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.linux",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium/compilator"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- description_html: "This is the compilator half of an orchestrator + compilator pair of builders. The orchestrator is <a href=\"https://ci.chromium.org/p/chromium-m112/builders/try/linux_chromium_tsan_rel_ng\">linux_chromium_tsan_rel_ng</a>."
- }
- builders {
- name: "linux_optional_gpu_tests_rel"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builder:linux_optional_gpu_tests_rel"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/linux_optional_gpu_tests_rel/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.linux",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium_trybot"'
- '}'
- execution_timeout_secs: 21600
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
- name: "linux_vr"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builderless:1"
- dimensions: "cores:8"
- dimensions: "cpu:x86-64"
- dimensions: "os:Ubuntu-18.04"
- dimensions: "pool:luci.chromium.try"
- dimensions: "ssd:0"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/linux_vr/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.linux",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium_trybot"'
- '}'
- execution_timeout_secs: 14400
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
name: "mac-official"
swarming_host: "chromium-swarm.appspot.com"
dimensions: "builderless:1"
@@ -16397,94 +9187,6 @@ buckets {
}
}
builders {
- name: "mac_optional_gpu_tests_rel"
- swarming_host: "chromium-swarm.appspot.com"
- dimensions: "builder:mac_optional_gpu_tests_rel"
- dimensions: "cpu:x86-64"
- dimensions: "os:Mac"
- dimensions: "pool:luci.chromium.try"
- exe {
- cipd_package: "infra/chromium/bootstrapper/${platform}"
- cipd_version: "latest"
- cmd: "bootstrapper"
- }
- properties:
- '{'
- ' "$bootstrap/exe": {'
- ' "exe": {'
- ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
- ' "cipd_version": "refs/heads/main",'
- ' "cmd": ['
- ' "luciexe"'
- ' ]'
- ' }'
- ' },'
- ' "$bootstrap/properties": {'
- ' "properties_file": "infra/config/generated/builders/try/mac_optional_gpu_tests_rel/properties.json",'
- ' "top_level_project": {'
- ' "ref": "refs/branch-heads/5615",'
- ' "repo": {'
- ' "host": "chromium.googlesource.com",'
- ' "project": "chromium/src"'
- ' }'
- ' }'
- ' },'
- ' "builder_group": "tryserver.chromium.mac",'
- ' "led_builder_is_bootstrapped": true,'
- ' "recipe": "chromium_trybot"'
- '}'
- execution_timeout_secs: 21600
- expiration_secs: 7200
- grace_period {
- seconds: 120
- }
- build_numbers: YES
- service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
- task_template_canary_percentage {
- value: 5
- }
- experiments {
- key: "chromium_swarming.expose_merge_script_failures"
- value: 100
- }
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- resultdb {
- enable: true
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "try_test_results"
- test_results {}
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "gpu_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
- }
- }
- }
- bq_exports {
- project: "chrome-luci-data"
- dataset: "chromium"
- table: "blink_web_tests_try_test_results"
- test_results {
- predicate {
- test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)"
- }
- }
- }
- history_options {
- use_invocation_timestamp: true
- }
- }
- }
- builders {
name: "try-nougat-phone-tester"
swarming_host: "chromium-swarm.appspot.com"
dimensions: "builderless:1"
diff --git a/chromium/infra/config/generated/luci/luci-milo.cfg b/chromium/infra/config/generated/luci/luci-milo.cfg
index 6de67c7b590..c61d843f75b 100644
--- a/chromium/infra/config/generated/luci/luci-milo.cfg
+++ b/chromium/infra/config/generated/luci/luci-milo.cfg
@@ -21,11 +21,6 @@ consoles {
short_name: "off"
}
builders {
- name: "buildbucket/luci.chromium-m112.ci/linux-official"
- category: "chromium|linux"
- short_name: "off"
- }
- builders {
name: "buildbucket/luci.chromium-m112.ci/mac-official"
category: "chromium|mac"
short_name: "off"
@@ -106,16 +101,6 @@ consoles {
short_name: "12"
}
builders {
- name: "buildbucket/luci.chromium-m112.ci/ios-simulator"
- category: "chromium.mac|ios|default"
- short_name: "sim"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/ios-simulator-full-configs"
- category: "chromium.mac|ios|default"
- short_name: "ful"
- }
- builders {
name: "buildbucket/luci.chromium-m112.ci/Mac11 Tests"
category: "chromium.mac|mac"
short_name: "11"
@@ -126,121 +111,6 @@ consoles {
short_name: "12"
}
builders {
- name: "buildbucket/luci.chromium-m112.ci/Linux Builder"
- category: "chromium.linux|release"
- short_name: "bld"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Linux Tests"
- category: "chromium.linux|release"
- short_name: "tst"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Linux Builder (Wayland)"
- category: "chromium.linux|release"
- short_name: "bld-wl"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Linux Tests (Wayland)"
- category: "chromium.linux|release"
- short_name: "tst-wl"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Linux Builder (dbg)"
- category: "chromium.linux|debug|builder"
- short_name: "64"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Linux Tests (dbg)(1)"
- category: "chromium.linux|debug|tester"
- short_name: "64"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Cast Linux"
- category: "chromium.linux|cast"
- short_name: "vid"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Cast Linux Debug"
- category: "chromium.linux|cast"
- short_name: "dbg"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/linux-chromeos-rel"
- category: "chromium.chromiumos|default"
- short_name: "rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/linux-chromeos-dbg"
- category: "chromium.chromiumos|default"
- short_name: "dbg"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/linux-lacros-builder-rel"
- category: "chromium.chromiumos|default"
- short_name: "lcr"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/linux-lacros-tester-rel"
- category: "chromium.chromiumos|default"
- short_name: "lcr"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/linux-lacros-dbg"
- category: "chromium.chromiumos|debug"
- short_name: "lcr"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/lacros-arm-generic-rel"
- category: "chromium.chromiumos|lacros|arm"
- short_name: "arm"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/lacros-arm64-generic-rel"
- category: "chromium.chromiumos|lacros|arm64"
- short_name: "arm64"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/chromeos-amd64-generic-lacros-dbg"
- category: "chromium.chromiumos|lacros|x64"
- short_name: "dbg"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/lacros-amd64-generic-rel"
- category: "chromium.chromiumos|lacros|x64"
- short_name: "rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/chromeos-arm64-generic-rel"
- category: "chromium.chromiumos|simple|release"
- short_name: "a64"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/chromeos-arm-generic-rel"
- category: "chromium.chromiumos|simple|release"
- short_name: "arm"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/chromeos-jacuzzi-rel"
- category: "chromium.chromiumos|simple|release"
- short_name: "jcz"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/chromeos-octopus-rel"
- category: "chromium.chromiumos|simple|release"
- short_name: "oct"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/chromeos-amd64-generic-rel"
- category: "chromium.chromiumos|simple|release|x64"
- short_name: "rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/chromeos-amd64-generic-dbg"
- category: "chromium.chromiumos|simple|debug|x64"
- short_name: "dbg"
- }
- builders {
name: "buildbucket/luci.chromium-m112.ci/android-cronet-arm-dbg"
category: "chromium.android|cronet|arm"
short_name: "dbg"
@@ -361,51 +231,11 @@ consoles {
short_name: "x64"
}
builders {
- name: "buildbucket/luci.chromium-m112.ci/Linux TSan Builder"
- category: "chromium.memory|linux|TSan v2"
- short_name: "bld"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Linux TSan Tests"
- category: "chromium.memory|linux|TSan v2"
- short_name: "tst"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Linux ASan LSan Builder"
- category: "chromium.memory|linux|asan lsan"
- short_name: "bld"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Linux ASan LSan Tests (1)"
- category: "chromium.memory|linux|asan lsan"
- short_name: "tst"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Linux ASan Tests (sandboxed)"
- category: "chromium.memory|linux|asan lsan"
- short_name: "sbx"
- }
- builders {
name: "buildbucket/luci.chromium-m112.ci/Dawn Android arm DEPS Release (Pixel 4)"
category: "chromium.dawn|DEPS|Android"
short_name: "p4"
}
builders {
- name: "buildbucket/luci.chromium-m112.ci/Dawn Linux x64 DEPS Builder"
- category: "chromium.dawn|DEPS|Linux|Builder"
- short_name: "x64"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Dawn Linux x64 DEPS Release (Intel UHD 630)"
- category: "chromium.dawn|DEPS|Linux|Intel"
- short_name: "x64"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Dawn Linux x64 DEPS Release (NVIDIA)"
- category: "chromium.dawn|DEPS|Linux|Nvidia"
- short_name: "x64"
- }
- builders {
name: "buildbucket/luci.chromium-m112.ci/Dawn Mac x64 DEPS Builder"
category: "chromium.dawn|DEPS|Mac|Builder"
short_name: "x64"
@@ -471,26 +301,9 @@ consoles {
category: "chromium.gpu|Mac"
}
builders {
- name: "buildbucket/luci.chromium-m112.ci/GPU Linux Builder"
- category: "chromium.gpu|Linux"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Linux Release (NVIDIA)"
- category: "chromium.gpu|Linux"
- }
- builders {
name: "buildbucket/luci.chromium-m112.ci/Android Release (Nexus 5X)"
category: "chromium.gpu|Android"
}
- builders {
- name: "buildbucket/luci.chromium-m112.ci/ios-simulator-cronet"
- category: "chromium.fyi|cronet"
- short_name: "intel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/VR Linux"
- category: "chromium.fyi|linux"
- }
header {
oncalls {
name: "Chromium Branches"
@@ -505,9 +318,6 @@ consoles {
console_ids: "chromium-m112/chromium"
console_ids: "chromium-m112/chromium.win"
console_ids: "chromium-m112/chromium.mac"
- console_ids: "chromium-m112/chromium.linux"
- console_ids: "chromium-m112/chromium.chromiumos"
- console_ids: "chromium-m112/chromium.memory"
console_ids: "chromium-m112/chromium.gpu"
console_ids: "chromium-m112/chromium.android"
}
@@ -565,116 +375,6 @@ consoles {
short_name: "12"
}
builders {
- name: "buildbucket/luci.chromium-m112.ci/ios-simulator"
- category: "chromium.mac|ios|default"
- short_name: "sim"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/ios-simulator-full-configs"
- category: "chromium.mac|ios|default"
- short_name: "ful"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Linux Builder"
- category: "chromium.linux|release"
- short_name: "bld"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Linux Tests"
- category: "chromium.linux|release"
- short_name: "tst"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Linux Builder (Wayland)"
- category: "chromium.linux|release"
- short_name: "bld-wl"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Linux Tests (Wayland)"
- category: "chromium.linux|release"
- short_name: "tst-wl"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Linux Builder (dbg)"
- category: "chromium.linux|debug|builder"
- short_name: "64"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Linux Tests (dbg)(1)"
- category: "chromium.linux|debug|tester"
- short_name: "64"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Cast Linux"
- category: "chromium.linux|cast"
- short_name: "vid"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Cast Linux Debug"
- category: "chromium.linux|cast"
- short_name: "dbg"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/linux-chromeos-rel"
- category: "chromium.chromiumos|default"
- short_name: "rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/linux-chromeos-dbg"
- category: "chromium.chromiumos|default"
- short_name: "dbg"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/linux-lacros-builder-rel"
- category: "chromium.chromiumos|default"
- short_name: "lcr"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/linux-lacros-tester-rel"
- category: "chromium.chromiumos|default"
- short_name: "lcr"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/linux-lacros-dbg"
- category: "chromium.chromiumos|debug"
- short_name: "lcr"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/lacros-arm-generic-rel"
- category: "chromium.chromiumos|lacros|arm"
- short_name: "arm"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/lacros-arm64-generic-rel"
- category: "chromium.chromiumos|lacros|arm64"
- short_name: "arm64"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/chromeos-amd64-generic-lacros-dbg"
- category: "chromium.chromiumos|lacros|x64"
- short_name: "dbg"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/lacros-amd64-generic-rel"
- category: "chromium.chromiumos|lacros|x64"
- short_name: "rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/chromeos-arm-generic-rel"
- category: "chromium.chromiumos|simple|release"
- short_name: "arm"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/chromeos-amd64-generic-rel"
- category: "chromium.chromiumos|simple|release|x64"
- short_name: "rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/chromeos-amd64-generic-dbg"
- category: "chromium.chromiumos|simple|debug|x64"
- short_name: "dbg"
- }
- builders {
name: "buildbucket/luci.chromium-m112.ci/android-cronet-arm-dbg"
category: "chromium.android|cronet|arm"
short_name: "dbg"
@@ -775,46 +475,6 @@ consoles {
short_name: "x64"
}
builders {
- name: "buildbucket/luci.chromium-m112.ci/Linux TSan Builder"
- category: "chromium.memory|linux|TSan v2"
- short_name: "bld"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Linux TSan Tests"
- category: "chromium.memory|linux|TSan v2"
- short_name: "tst"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Linux ASan LSan Builder"
- category: "chromium.memory|linux|asan lsan"
- short_name: "bld"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Linux ASan LSan Tests (1)"
- category: "chromium.memory|linux|asan lsan"
- short_name: "tst"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Linux ASan Tests (sandboxed)"
- category: "chromium.memory|linux|asan lsan"
- short_name: "sbx"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Dawn Linux x64 DEPS Builder"
- category: "chromium.dawn|DEPS|Linux|Builder"
- short_name: "x64"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Dawn Linux x64 DEPS Release (Intel UHD 630)"
- category: "chromium.dawn|DEPS|Linux|Intel"
- short_name: "x64"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Dawn Linux x64 DEPS Release (NVIDIA)"
- category: "chromium.dawn|DEPS|Linux|Nvidia"
- short_name: "x64"
- }
- builders {
name: "buildbucket/luci.chromium-m112.ci/Dawn Mac x64 DEPS Builder"
category: "chromium.dawn|DEPS|Mac|Builder"
short_name: "x64"
@@ -880,26 +540,9 @@ consoles {
category: "chromium.gpu|Mac"
}
builders {
- name: "buildbucket/luci.chromium-m112.ci/GPU Linux Builder"
- category: "chromium.gpu|Linux"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Linux Release (NVIDIA)"
- category: "chromium.gpu|Linux"
- }
- builders {
name: "buildbucket/luci.chromium-m112.ci/Android Release (Nexus 5X)"
category: "chromium.gpu|Android"
}
- builders {
- name: "buildbucket/luci.chromium-m112.ci/ios-simulator-cronet"
- category: "chromium.fyi|cronet"
- short_name: "intel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/VR Linux"
- category: "chromium.fyi|linux"
- }
header {
oncalls {
name: "Chromium Branches"
@@ -914,9 +557,6 @@ consoles {
console_ids: "chromium-m112/chromium"
console_ids: "chromium-m112/chromium.win"
console_ids: "chromium-m112/chromium.mac"
- console_ids: "chromium-m112/chromium.linux"
- console_ids: "chromium-m112/chromium.chromiumos"
- console_ids: "chromium-m112/chromium.memory"
console_ids: "chromium-m112/chromium.gpu"
console_ids: "chromium-m112/chromium.android"
}
@@ -982,33 +622,12 @@ consoles {
name: "buildbucket/luci.chromium-m112.try/android_optional_gpu_tests_rel"
}
builders {
- name: "buildbucket/luci.chromium-m112.try/chromeos-amd64-generic-dbg"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/chromeos-amd64-generic-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/chromeos-amd64-generic-rel-compilator"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/chromeos-arm-generic-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/chromeos-jacuzzi-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/chromeos-octopus-rel"
- }
- builders {
name: "buildbucket/luci.chromium-m112.try/chromium_presubmit"
}
builders {
name: "buildbucket/luci.chromium-m112.try/dawn-android-arm-deps-rel"
}
builders {
- name: "buildbucket/luci.chromium-m112.try/dawn-linux-x64-deps-rel"
- }
- builders {
name: "buildbucket/luci.chromium-m112.try/dawn-mac-x64-deps-rel"
}
builders {
@@ -1036,99 +655,6 @@ consoles {
name: "buildbucket/luci.chromium-m112.try/fuchsia-x64-rel"
}
builders {
- name: "buildbucket/luci.chromium-m112.try/ios-simulator"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/ios-simulator-compilator"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/ios-simulator-cronet"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/ios-simulator-full-configs"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/lacros-amd64-generic-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/lacros-amd64-generic-rel-compilator"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/lacros-amd64-generic-rel-orchestrator"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/lacros-amd64-generic-rel-skylab-fyi"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/lacros-arm-generic-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/lacros-arm64-generic-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-blink-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-chromeos-compile-dbg"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-chromeos-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-chromeos-rel-compilator"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-lacros-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-lacros-rel-compilator"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-libfuzzer-asan-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-rel-compilator"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-wayland-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-wayland-rel-compilator"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-x64-castos"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-x64-castos-dbg"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux_chromium_asan_rel_ng"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux_chromium_asan_rel_ng-compilator"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux_chromium_compile_dbg_ng"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux_chromium_dbg_ng"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux_chromium_tsan_rel_ng"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux_chromium_tsan_rel_ng-compilator"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux_optional_gpu_tests_rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux_vr"
- }
- builders {
name: "buildbucket/luci.chromium-m112.try/mac-rel"
}
builders {
@@ -1138,9 +664,6 @@ consoles {
name: "buildbucket/luci.chromium-m112.try/mac_chromium_compile_dbg_ng"
}
builders {
- name: "buildbucket/luci.chromium-m112.try/mac_optional_gpu_tests_rel"
- }
- builders {
name: "buildbucket/luci.chromium-m112.try/win-libfuzzer-asan-rel"
}
builders {
@@ -1174,11 +697,6 @@ consoles {
short_name: "off"
}
builders {
- name: "buildbucket/luci.chromium-m112.ci/linux-official"
- category: "linux"
- short_name: "off"
- }
- builders {
name: "buildbucket/luci.chromium-m112.ci/mac-official"
category: "mac"
short_name: "off"
@@ -1207,9 +725,6 @@ consoles {
console_ids: "chromium-m112/chromium"
console_ids: "chromium-m112/chromium.win"
console_ids: "chromium-m112/chromium.mac"
- console_ids: "chromium-m112/chromium.linux"
- console_ids: "chromium-m112/chromium.chromiumos"
- console_ids: "chromium-m112/chromium.memory"
console_ids: "chromium-m112/chromium.gpu"
console_ids: "chromium-m112/chromium.android"
}
@@ -1336,112 +851,6 @@ consoles {
console_ids: "chromium-m112/chromium"
console_ids: "chromium-m112/chromium.win"
console_ids: "chromium-m112/chromium.mac"
- console_ids: "chromium-m112/chromium.linux"
- console_ids: "chromium-m112/chromium.chromiumos"
- console_ids: "chromium-m112/chromium.memory"
- console_ids: "chromium-m112/chromium.gpu"
- console_ids: "chromium-m112/chromium.android"
- }
- }
-}
-consoles {
- id: "chromium.chromiumos"
- name: "chromium.chromiumos"
- repo_url: "https://chromium.googlesource.com/chromium/src"
- refs: "regexp:refs/branch-heads/5615"
- manifest_name: "REVISION"
- builders {
- name: "buildbucket/luci.chromium-m112.ci/linux-chromeos-rel"
- category: "default"
- short_name: "rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/linux-chromeos-dbg"
- category: "default"
- short_name: "dbg"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/linux-lacros-builder-rel"
- category: "default"
- short_name: "lcr"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/linux-lacros-tester-rel"
- category: "default"
- short_name: "lcr"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/linux-lacros-dbg"
- category: "debug"
- short_name: "lcr"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/lacros-arm-generic-rel"
- category: "lacros|arm"
- short_name: "arm"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/lacros-arm64-generic-rel"
- category: "lacros|arm64"
- short_name: "arm64"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/chromeos-amd64-generic-lacros-dbg"
- category: "lacros|x64"
- short_name: "dbg"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/lacros-amd64-generic-rel"
- category: "lacros|x64"
- short_name: "rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/chromeos-arm64-generic-rel"
- category: "simple|release"
- short_name: "a64"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/chromeos-arm-generic-rel"
- category: "simple|release"
- short_name: "arm"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/chromeos-jacuzzi-rel"
- category: "simple|release"
- short_name: "jcz"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/chromeos-octopus-rel"
- category: "simple|release"
- short_name: "oct"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/chromeos-amd64-generic-rel"
- category: "simple|release|x64"
- short_name: "rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/chromeos-amd64-generic-dbg"
- category: "simple|debug|x64"
- short_name: "dbg"
- }
- header {
- oncalls {
- name: "Chromium Branches"
- url: "https://chrome-ops-rotation-proxy.appspot.com/current/oncallator:chrome-branch-sheriff"
- }
- oncalls {
- name: "Trooper"
- url: "https://chrome-ops-rotation-proxy.appspot.com/current/oncallator:chrome-ops-client-infra"
- show_primary_secondary_labels: true
- }
- console_groups {
- console_ids: "chromium-m112/chromium"
- console_ids: "chromium-m112/chromium.win"
- console_ids: "chromium-m112/chromium.mac"
- console_ids: "chromium-m112/chromium.linux"
- console_ids: "chromium-m112/chromium.chromiumos"
- console_ids: "chromium-m112/chromium.memory"
console_ids: "chromium-m112/chromium.gpu"
console_ids: "chromium-m112/chromium.android"
}
@@ -1459,21 +868,6 @@ consoles {
short_name: "p4"
}
builders {
- name: "buildbucket/luci.chromium-m112.ci/Dawn Linux x64 DEPS Builder"
- category: "DEPS|Linux|Builder"
- short_name: "x64"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Dawn Linux x64 DEPS Release (Intel UHD 630)"
- category: "DEPS|Linux|Intel"
- short_name: "x64"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Dawn Linux x64 DEPS Release (NVIDIA)"
- category: "DEPS|Linux|Nvidia"
- short_name: "x64"
- }
- builders {
name: "buildbucket/luci.chromium-m112.ci/Dawn Mac x64 DEPS Builder"
category: "DEPS|Mac|Builder"
short_name: "x64"
@@ -1532,9 +926,6 @@ consoles {
console_ids: "chromium-m112/chromium"
console_ids: "chromium-m112/chromium.win"
console_ids: "chromium-m112/chromium.mac"
- console_ids: "chromium-m112/chromium.linux"
- console_ids: "chromium-m112/chromium.chromiumos"
- console_ids: "chromium-m112/chromium.memory"
console_ids: "chromium-m112/chromium.gpu"
console_ids: "chromium-m112/chromium.android"
}
@@ -1580,46 +971,6 @@ consoles {
console_ids: "chromium-m112/chromium"
console_ids: "chromium-m112/chromium.win"
console_ids: "chromium-m112/chromium.mac"
- console_ids: "chromium-m112/chromium.linux"
- console_ids: "chromium-m112/chromium.chromiumos"
- console_ids: "chromium-m112/chromium.memory"
- console_ids: "chromium-m112/chromium.gpu"
- console_ids: "chromium-m112/chromium.android"
- }
- }
-}
-consoles {
- id: "chromium.fyi"
- name: "chromium.fyi"
- repo_url: "https://chromium.googlesource.com/chromium/src"
- refs: "regexp:refs/branch-heads/5615"
- manifest_name: "REVISION"
- builders {
- name: "buildbucket/luci.chromium-m112.ci/ios-simulator-cronet"
- category: "cronet"
- short_name: "intel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/VR Linux"
- category: "linux"
- }
- header {
- oncalls {
- name: "Chromium Branches"
- url: "https://chrome-ops-rotation-proxy.appspot.com/current/oncallator:chrome-branch-sheriff"
- }
- oncalls {
- name: "Trooper"
- url: "https://chrome-ops-rotation-proxy.appspot.com/current/oncallator:chrome-ops-client-infra"
- show_primary_secondary_labels: true
- }
- console_groups {
- console_ids: "chromium-m112/chromium"
- console_ids: "chromium-m112/chromium.win"
- console_ids: "chromium-m112/chromium.mac"
- console_ids: "chromium-m112/chromium.linux"
- console_ids: "chromium-m112/chromium.chromiumos"
- console_ids: "chromium-m112/chromium.memory"
console_ids: "chromium-m112/chromium.gpu"
console_ids: "chromium-m112/chromium.android"
}
@@ -1652,14 +1003,6 @@ consoles {
category: "Mac"
}
builders {
- name: "buildbucket/luci.chromium-m112.ci/GPU Linux Builder"
- category: "Linux"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Linux Release (NVIDIA)"
- category: "Linux"
- }
- builders {
name: "buildbucket/luci.chromium-m112.ci/Android Release (Nexus 5X)"
category: "Android"
}
@@ -1677,77 +1020,6 @@ consoles {
console_ids: "chromium-m112/chromium"
console_ids: "chromium-m112/chromium.win"
console_ids: "chromium-m112/chromium.mac"
- console_ids: "chromium-m112/chromium.linux"
- console_ids: "chromium-m112/chromium.chromiumos"
- console_ids: "chromium-m112/chromium.memory"
- console_ids: "chromium-m112/chromium.gpu"
- console_ids: "chromium-m112/chromium.android"
- }
- }
-}
-consoles {
- id: "chromium.linux"
- name: "chromium.linux"
- repo_url: "https://chromium.googlesource.com/chromium/src"
- refs: "regexp:refs/branch-heads/5615"
- manifest_name: "REVISION"
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Linux Builder"
- category: "release"
- short_name: "bld"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Linux Tests"
- category: "release"
- short_name: "tst"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Linux Builder (Wayland)"
- category: "release"
- short_name: "bld-wl"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Linux Tests (Wayland)"
- category: "release"
- short_name: "tst-wl"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Linux Builder (dbg)"
- category: "debug|builder"
- short_name: "64"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Linux Tests (dbg)(1)"
- category: "debug|tester"
- short_name: "64"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Cast Linux"
- category: "cast"
- short_name: "vid"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Cast Linux Debug"
- category: "cast"
- short_name: "dbg"
- }
- header {
- oncalls {
- name: "Chromium Branches"
- url: "https://chrome-ops-rotation-proxy.appspot.com/current/oncallator:chrome-branch-sheriff"
- }
- oncalls {
- name: "Trooper"
- url: "https://chrome-ops-rotation-proxy.appspot.com/current/oncallator:chrome-ops-client-infra"
- show_primary_secondary_labels: true
- }
- console_groups {
- console_ids: "chromium-m112/chromium"
- console_ids: "chromium-m112/chromium.win"
- console_ids: "chromium-m112/chromium.mac"
- console_ids: "chromium-m112/chromium.linux"
- console_ids: "chromium-m112/chromium.chromiumos"
- console_ids: "chromium-m112/chromium.memory"
console_ids: "chromium-m112/chromium.gpu"
console_ids: "chromium-m112/chromium.android"
}
@@ -1805,16 +1077,6 @@ consoles {
short_name: "12"
}
builders {
- name: "buildbucket/luci.chromium-m112.ci/ios-simulator"
- category: "ios|default"
- short_name: "sim"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/ios-simulator-full-configs"
- category: "ios|default"
- short_name: "ful"
- }
- builders {
name: "buildbucket/luci.chromium-m112.ci/Mac11 Tests"
category: "mac"
short_name: "11"
@@ -1838,62 +1100,6 @@ consoles {
console_ids: "chromium-m112/chromium"
console_ids: "chromium-m112/chromium.win"
console_ids: "chromium-m112/chromium.mac"
- console_ids: "chromium-m112/chromium.linux"
- console_ids: "chromium-m112/chromium.chromiumos"
- console_ids: "chromium-m112/chromium.memory"
- console_ids: "chromium-m112/chromium.gpu"
- console_ids: "chromium-m112/chromium.android"
- }
- }
-}
-consoles {
- id: "chromium.memory"
- name: "chromium.memory"
- repo_url: "https://chromium.googlesource.com/chromium/src"
- refs: "regexp:refs/branch-heads/5615"
- manifest_name: "REVISION"
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Linux TSan Builder"
- category: "linux|TSan v2"
- short_name: "bld"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Linux TSan Tests"
- category: "linux|TSan v2"
- short_name: "tst"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Linux ASan LSan Builder"
- category: "linux|asan lsan"
- short_name: "bld"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Linux ASan LSan Tests (1)"
- category: "linux|asan lsan"
- short_name: "tst"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.ci/Linux ASan Tests (sandboxed)"
- category: "linux|asan lsan"
- short_name: "sbx"
- }
- header {
- oncalls {
- name: "Chromium Branches"
- url: "https://chrome-ops-rotation-proxy.appspot.com/current/oncallator:chrome-branch-sheriff"
- }
- oncalls {
- name: "Trooper"
- url: "https://chrome-ops-rotation-proxy.appspot.com/current/oncallator:chrome-ops-client-infra"
- show_primary_secondary_labels: true
- }
- console_groups {
- console_ids: "chromium-m112/chromium"
- console_ids: "chromium-m112/chromium.win"
- console_ids: "chromium-m112/chromium.mac"
- console_ids: "chromium-m112/chromium.linux"
- console_ids: "chromium-m112/chromium.chromiumos"
- console_ids: "chromium-m112/chromium.memory"
console_ids: "chromium-m112/chromium.gpu"
console_ids: "chromium-m112/chromium.android"
}
@@ -1939,9 +1145,6 @@ consoles {
console_ids: "chromium-m112/chromium"
console_ids: "chromium-m112/chromium.win"
console_ids: "chromium-m112/chromium.mac"
- console_ids: "chromium-m112/chromium.linux"
- console_ids: "chromium-m112/chromium.chromiumos"
- console_ids: "chromium-m112/chromium.memory"
console_ids: "chromium-m112/chromium.gpu"
console_ids: "chromium-m112/chromium.android"
}
@@ -2005,39 +1208,12 @@ consoles {
name: "buildbucket/luci.chromium-m112.try/android_optional_gpu_tests_rel"
}
builders {
- name: "buildbucket/luci.chromium-m112.try/chromeos-amd64-generic-dbg"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/chromeos-amd64-generic-lacros-dbg"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/chromeos-amd64-generic-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/chromeos-amd64-generic-rel-compilator"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/chromeos-arm-generic-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/chromeos-arm64-generic-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/chromeos-jacuzzi-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/chromeos-octopus-rel"
- }
- builders {
name: "buildbucket/luci.chromium-m112.try/chromium_presubmit"
}
builders {
name: "buildbucket/luci.chromium-m112.try/dawn-android-arm-deps-rel"
}
builders {
- name: "buildbucket/luci.chromium-m112.try/dawn-linux-x64-deps-rel"
- }
- builders {
name: "buildbucket/luci.chromium-m112.try/dawn-mac-x64-deps-rel"
}
builders {
@@ -2071,108 +1247,6 @@ consoles {
name: "buildbucket/luci.chromium-m112.try/fuchsia-x64-rel"
}
builders {
- name: "buildbucket/luci.chromium-m112.try/ios-simulator"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/ios-simulator-compilator"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/ios-simulator-cronet"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/ios-simulator-full-configs"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/lacros-amd64-generic-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/lacros-amd64-generic-rel-compilator"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/lacros-amd64-generic-rel-orchestrator"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/lacros-amd64-generic-rel-skylab"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/lacros-amd64-generic-rel-skylab-fyi"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/lacros-arm-generic-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/lacros-arm64-generic-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-blink-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-chromeos-compile-dbg"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-chromeos-dbg"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-chromeos-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-chromeos-rel-compilator"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-lacros-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-lacros-rel-compilator"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-libfuzzer-asan-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-official"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-rel-compilator"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-wayland-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-wayland-rel-compilator"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-x64-castos"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-x64-castos-dbg"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux_chromium_asan_rel_ng"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux_chromium_asan_rel_ng-compilator"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux_chromium_compile_dbg_ng"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux_chromium_dbg_ng"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux_chromium_tsan_rel_ng"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux_chromium_tsan_rel_ng-compilator"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux_optional_gpu_tests_rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux_vr"
- }
- builders {
name: "buildbucket/luci.chromium-m112.try/mac-official"
}
builders {
@@ -2212,9 +1286,6 @@ consoles {
name: "buildbucket/luci.chromium-m112.try/mac_chromium_compile_dbg_ng"
}
builders {
- name: "buildbucket/luci.chromium-m112.try/mac_optional_gpu_tests_rel"
- }
- builders {
name: "buildbucket/luci.chromium-m112.try/try-nougat-phone-tester"
}
builders {
@@ -2250,9 +1321,6 @@ consoles {
id: "tryserver.blink"
name: "tryserver.blink"
builders {
- name: "buildbucket/luci.chromium-m112.try/linux-blink-rel"
- }
- builders {
name: "buildbucket/luci.chromium-m112.try/mac10.13-blink-rel"
}
builders {
@@ -2297,9 +1365,6 @@ consoles {
name: "buildbucket/luci.chromium-m112.try/fuchsia-official"
}
builders {
- name: "buildbucket/luci.chromium-m112.try/linux-official"
- }
- builders {
name: "buildbucket/luci.chromium-m112.try/mac-official"
}
builders {
@@ -2370,83 +1435,12 @@ consoles {
builder_view_only: true
}
consoles {
- id: "tryserver.chromium.chromiumos"
- name: "tryserver.chromium.chromiumos"
- builders {
- name: "buildbucket/luci.chromium-m112.try/chromeos-amd64-generic-dbg"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/chromeos-amd64-generic-lacros-dbg"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/chromeos-amd64-generic-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/chromeos-amd64-generic-rel-compilator"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/chromeos-arm-generic-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/chromeos-arm64-generic-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/chromeos-jacuzzi-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/chromeos-octopus-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/lacros-amd64-generic-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/lacros-amd64-generic-rel-compilator"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/lacros-amd64-generic-rel-orchestrator"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/lacros-amd64-generic-rel-skylab"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/lacros-amd64-generic-rel-skylab-fyi"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/lacros-arm-generic-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/lacros-arm64-generic-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-chromeos-compile-dbg"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-chromeos-dbg"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-chromeos-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-chromeos-rel-compilator"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-lacros-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-lacros-rel-compilator"
- }
- builder_view_only: true
-}
-consoles {
id: "tryserver.chromium.dawn"
name: "tryserver.chromium.dawn"
builders {
name: "buildbucket/luci.chromium-m112.try/dawn-android-arm-deps-rel"
}
builders {
- name: "buildbucket/luci.chromium-m112.try/dawn-linux-x64-deps-rel"
- }
- builders {
name: "buildbucket/luci.chromium-m112.try/dawn-mac-x64-deps-rel"
}
builders {
@@ -2484,71 +1478,9 @@ consoles {
builder_view_only: true
}
consoles {
- id: "tryserver.chromium.linux"
- name: "tryserver.chromium.linux"
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-libfuzzer-asan-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-rel-compilator"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-wayland-rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-wayland-rel-compilator"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-x64-castos"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux-x64-castos-dbg"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux_chromium_asan_rel_ng"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux_chromium_asan_rel_ng-compilator"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux_chromium_compile_dbg_ng"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux_chromium_dbg_ng"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux_chromium_tsan_rel_ng"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux_chromium_tsan_rel_ng-compilator"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux_optional_gpu_tests_rel"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/linux_vr"
- }
- builder_view_only: true
-}
-consoles {
id: "tryserver.chromium.mac"
name: "tryserver.chromium.mac"
builders {
- name: "buildbucket/luci.chromium-m112.try/ios-simulator"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/ios-simulator-compilator"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/ios-simulator-cronet"
- }
- builders {
- name: "buildbucket/luci.chromium-m112.try/ios-simulator-full-configs"
- }
- builders {
name: "buildbucket/luci.chromium-m112.try/mac-rel"
}
builders {
@@ -2557,9 +1489,6 @@ consoles {
builders {
name: "buildbucket/luci.chromium-m112.try/mac_chromium_compile_dbg_ng"
}
- builders {
- name: "buildbucket/luci.chromium-m112.try/mac_optional_gpu_tests_rel"
- }
builder_view_only: true
}
consoles {
diff --git a/chromium/infra/config/generated/luci/luci-notify.cfg b/chromium/infra/config/generated/luci/luci-notify.cfg
index e6585c32922..240cc3934f1 100644
--- a/chromium/infra/config/generated/luci/luci-notify.cfg
+++ b/chromium/infra/config/generated/luci/luci-notify.cfg
@@ -71,48 +71,6 @@ notifiers {
}
builders {
bucket: "ci"
- name: "Cast Linux"
- repository: "https://chromium.googlesource.com/chromium/src"
- }
-}
-notifiers {
- notifications {
- on_new_status: INFRA_FAILURE
- }
- builders {
- bucket: "ci"
- name: "Cast Linux Debug"
- repository: "https://chromium.googlesource.com/chromium/src"
- }
-}
-notifiers {
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- builders {
- bucket: "ci"
- name: "GPU Linux Builder"
- repository: "https://chromium.googlesource.com/chromium/src"
- }
-}
-notifiers {
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- builders {
- bucket: "ci"
name: "GPU Mac Builder"
repository: "https://chromium.googlesource.com/chromium/src"
}
@@ -140,191 +98,6 @@ notifiers {
notifications {
on_new_status: INFRA_FAILURE
}
- notifications {
- on_new_status: INFRA_FAILURE
- }
- builders {
- bucket: "ci"
- name: "Linux ASan LSan Builder"
- repository: "https://chromium.googlesource.com/chromium/src"
- }
-}
-notifiers {
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- builders {
- bucket: "ci"
- name: "Linux ASan LSan Tests (1)"
- }
-}
-notifiers {
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- builders {
- bucket: "ci"
- name: "Linux ASan Tests (sandboxed)"
- }
-}
-notifiers {
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- builders {
- bucket: "ci"
- name: "Linux Builder"
- repository: "https://chromium.googlesource.com/chromium/src"
- }
-}
-notifiers {
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- builders {
- bucket: "ci"
- name: "Linux Builder (Wayland)"
- repository: "https://chromium.googlesource.com/chromium/src"
- }
-}
-notifiers {
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- builders {
- bucket: "ci"
- name: "Linux Builder (dbg)"
- repository: "https://chromium.googlesource.com/chromium/src"
- }
-}
-notifiers {
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- builders {
- bucket: "ci"
- name: "Linux Release (NVIDIA)"
- }
-}
-notifiers {
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- builders {
- bucket: "ci"
- name: "Linux TSan Builder"
- repository: "https://chromium.googlesource.com/chromium/src"
- }
-}
-notifiers {
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- builders {
- bucket: "ci"
- name: "Linux TSan Tests"
- }
-}
-notifiers {
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- builders {
- bucket: "ci"
- name: "Linux Tests"
- }
-}
-notifiers {
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- builders {
- bucket: "ci"
- name: "Linux Tests (Wayland)"
- }
-}
-notifiers {
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- builders {
- bucket: "ci"
- name: "Linux Tests (dbg)(1)"
- }
-}
-notifiers {
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
builders {
bucket: "ci"
name: "Mac Builder"
@@ -617,97 +390,6 @@ notifiers {
notifications {
on_new_status: INFRA_FAILURE
}
- builders {
- bucket: "ci"
- name: "chromeos-amd64-generic-dbg"
- repository: "https://chromium.googlesource.com/chromium/src"
- }
-}
-notifiers {
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- builders {
- bucket: "ci"
- name: "chromeos-amd64-generic-lacros-dbg"
- repository: "https://chromium.googlesource.com/chromium/src"
- }
-}
-notifiers {
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- builders {
- bucket: "ci"
- name: "chromeos-amd64-generic-rel"
- repository: "https://chromium.googlesource.com/chromium/src"
- }
-}
-notifiers {
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- builders {
- bucket: "ci"
- name: "chromeos-arm-generic-rel"
- repository: "https://chromium.googlesource.com/chromium/src"
- }
-}
-notifiers {
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- builders {
- bucket: "ci"
- name: "chromeos-arm64-generic-rel"
- repository: "https://chromium.googlesource.com/chromium/src"
- }
-}
-notifiers {
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- builders {
- bucket: "ci"
- name: "chromeos-jacuzzi-rel"
- repository: "https://chromium.googlesource.com/chromium/src"
- }
-}
-notifiers {
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- builders {
- bucket: "ci"
- name: "chromeos-octopus-rel"
- repository: "https://chromium.googlesource.com/chromium/src"
- }
-}
-notifiers {
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
notifications {
on_change: true
email {
@@ -786,112 +468,6 @@ notifiers {
}
builders {
bucket: "ci"
- name: "ios-simulator"
- repository: "https://chromium.googlesource.com/chromium/src"
- }
-}
-notifiers {
- notifications {
- on_new_status: FAILURE
- on_new_status: INFRA_FAILURE
- on_new_status: SUCCESS
- email {
- recipients: "cronet-sheriff@grotations.appspotmail.com"
- }
- }
- builders {
- bucket: "ci"
- name: "ios-simulator-cronet"
- repository: "https://chromium.googlesource.com/chromium/src"
- }
-}
-notifiers {
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- builders {
- bucket: "ci"
- name: "ios-simulator-full-configs"
- repository: "https://chromium.googlesource.com/chromium/src"
- }
-}
-notifiers {
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- builders {
- bucket: "ci"
- name: "lacros-amd64-generic-rel"
- repository: "https://chromium.googlesource.com/chromium/src"
- }
-}
-notifiers {
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- builders {
- bucket: "ci"
- name: "linux-chromeos-dbg"
- repository: "https://chromium.googlesource.com/chromium/src"
- }
-}
-notifiers {
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- builders {
- bucket: "ci"
- name: "linux-chromeos-rel"
- repository: "https://chromium.googlesource.com/chromium/src"
- }
-}
-notifiers {
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- builders {
- bucket: "ci"
- name: "linux-lacros-builder-rel"
- repository: "https://chromium.googlesource.com/chromium/src"
- }
-}
-notifiers {
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- builders {
- bucket: "ci"
- name: "linux-lacros-dbg"
- repository: "https://chromium.googlesource.com/chromium/src"
- }
-}
-notifiers {
- notifications {
- on_new_status: INFRA_FAILURE
- }
- notifications {
- on_new_status: INFRA_FAILURE
- }
- builders {
- bucket: "ci"
name: "mac-arm64-rel"
repository: "https://chromium.googlesource.com/chromium/src"
}
diff --git a/chromium/infra/config/generated/luci/luci-scheduler.cfg b/chromium/infra/config/generated/luci/luci-scheduler.cfg
index b0b6eacfcb2..0365319f731 100644
--- a/chromium/infra/config/generated/luci/luci-scheduler.cfg
+++ b/chromium/infra/config/generated/luci/luci-scheduler.cfg
@@ -104,24 +104,6 @@ job {
}
}
job {
- id: "Cast Linux"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "Cast Linux"
- }
-}
-job {
- id: "Cast Linux Debug"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "Cast Linux Debug"
- }
-}
-job {
id: "Dawn Android arm DEPS Release (Pixel 4)"
realm: "ci"
buildbucket {
@@ -131,33 +113,6 @@ job {
}
}
job {
- id: "Dawn Linux x64 DEPS Builder"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "Dawn Linux x64 DEPS Builder"
- }
-}
-job {
- id: "Dawn Linux x64 DEPS Release (Intel UHD 630)"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "Dawn Linux x64 DEPS Release (Intel UHD 630)"
- }
-}
-job {
- id: "Dawn Linux x64 DEPS Release (NVIDIA)"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "Dawn Linux x64 DEPS Release (NVIDIA)"
- }
-}
-job {
id: "Dawn Mac x64 DEPS Builder"
realm: "ci"
buildbucket {
@@ -239,15 +194,6 @@ job {
}
}
job {
- id: "GPU Linux Builder"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "GPU Linux Builder"
- }
-}
-job {
id: "GPU Mac Builder"
realm: "ci"
buildbucket {
@@ -266,114 +212,6 @@ job {
}
}
job {
- id: "Linux ASan LSan Builder"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "Linux ASan LSan Builder"
- }
-}
-job {
- id: "Linux ASan LSan Tests (1)"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "Linux ASan LSan Tests (1)"
- }
-}
-job {
- id: "Linux ASan Tests (sandboxed)"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "Linux ASan Tests (sandboxed)"
- }
-}
-job {
- id: "Linux Builder"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "Linux Builder"
- }
-}
-job {
- id: "Linux Builder (Wayland)"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "Linux Builder (Wayland)"
- }
-}
-job {
- id: "Linux Builder (dbg)"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "Linux Builder (dbg)"
- }
-}
-job {
- id: "Linux Release (NVIDIA)"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "Linux Release (NVIDIA)"
- }
-}
-job {
- id: "Linux TSan Builder"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "Linux TSan Builder"
- }
-}
-job {
- id: "Linux TSan Tests"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "Linux TSan Tests"
- }
-}
-job {
- id: "Linux Tests"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "Linux Tests"
- }
-}
-job {
- id: "Linux Tests (Wayland)"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "Linux Tests (Wayland)"
- }
-}
-job {
- id: "Linux Tests (dbg)(1)"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "Linux Tests (dbg)(1)"
- }
-}
-job {
id: "Mac Builder"
realm: "ci"
buildbucket {
@@ -482,15 +320,6 @@ job {
}
}
job {
- id: "VR Linux"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "VR Linux"
- }
-}
-job {
id: "Win Builder"
realm: "ci"
buildbucket {
@@ -617,69 +446,6 @@ job {
}
}
job {
- id: "chromeos-amd64-generic-dbg"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "chromeos-amd64-generic-dbg"
- }
-}
-job {
- id: "chromeos-amd64-generic-lacros-dbg"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "chromeos-amd64-generic-lacros-dbg"
- }
-}
-job {
- id: "chromeos-amd64-generic-rel"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "chromeos-amd64-generic-rel"
- }
-}
-job {
- id: "chromeos-arm-generic-rel"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "chromeos-arm-generic-rel"
- }
-}
-job {
- id: "chromeos-arm64-generic-rel"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "chromeos-arm64-generic-rel"
- }
-}
-job {
- id: "chromeos-jacuzzi-rel"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "chromeos-jacuzzi-rel"
- }
-}
-job {
- id: "chromeos-octopus-rel"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "chromeos-octopus-rel"
- }
-}
-job {
id: "fuchsia-arm64-cast-receiver-rel"
realm: "ci"
buildbucket {
@@ -725,114 +491,6 @@ job {
}
}
job {
- id: "ios-simulator"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "ios-simulator"
- }
-}
-job {
- id: "ios-simulator-cronet"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "ios-simulator-cronet"
- }
-}
-job {
- id: "ios-simulator-full-configs"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "ios-simulator-full-configs"
- }
-}
-job {
- id: "lacros-amd64-generic-rel"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "lacros-amd64-generic-rel"
- }
-}
-job {
- id: "lacros-arm-generic-rel"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "lacros-arm-generic-rel"
- }
-}
-job {
- id: "lacros-arm64-generic-rel"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "lacros-arm64-generic-rel"
- }
-}
-job {
- id: "linux-chromeos-dbg"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "linux-chromeos-dbg"
- }
-}
-job {
- id: "linux-chromeos-rel"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "linux-chromeos-rel"
- }
-}
-job {
- id: "linux-lacros-builder-rel"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "linux-lacros-builder-rel"
- }
-}
-job {
- id: "linux-lacros-dbg"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "linux-lacros-dbg"
- }
-}
-job {
- id: "linux-lacros-tester-rel"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "linux-lacros-tester-rel"
- }
-}
-job {
- id: "linux-official"
- realm: "ci"
- buildbucket {
- server: "cr-buildbucket.appspot.com"
- bucket: "ci"
- builder: "linux-official"
- }
-}
-job {
id: "mac-arm64-rel"
realm: "ci"
buildbucket {
@@ -897,24 +555,14 @@ trigger {
triggers: "Android x64 Builder All Targets (dbg)"
triggers: "Android x86 Builder (dbg)"
triggers: "Cast Android (dbg)"
- triggers: "Cast Linux"
- triggers: "Cast Linux Debug"
triggers: "Dawn Android arm DEPS Release (Pixel 4)"
- triggers: "Dawn Linux x64 DEPS Builder"
triggers: "Dawn Mac x64 DEPS Builder"
triggers: "Dawn Win10 x64 DEPS Builder"
triggers: "Dawn Win10 x86 DEPS Builder"
- triggers: "GPU Linux Builder"
triggers: "GPU Mac Builder"
triggers: "GPU Win x64 Builder"
- triggers: "Linux ASan LSan Builder"
- triggers: "Linux Builder"
- triggers: "Linux Builder (Wayland)"
- triggers: "Linux Builder (dbg)"
- triggers: "Linux TSan Builder"
triggers: "Mac Builder"
triggers: "Mac Builder (dbg)"
- triggers: "VR Linux"
triggers: "Win Builder"
triggers: "Win Builder (dbg)"
triggers: "Win x64 Builder"
@@ -925,29 +573,11 @@ trigger {
triggers: "android-nougat-x86-rel"
triggers: "android-official"
triggers: "android-pie-arm64-rel"
- triggers: "chromeos-amd64-generic-dbg"
- triggers: "chromeos-amd64-generic-lacros-dbg"
- triggers: "chromeos-amd64-generic-rel"
- triggers: "chromeos-arm-generic-rel"
- triggers: "chromeos-arm64-generic-rel"
- triggers: "chromeos-jacuzzi-rel"
- triggers: "chromeos-octopus-rel"
triggers: "fuchsia-arm64-cast-receiver-rel"
triggers: "fuchsia-arm64-rel"
triggers: "fuchsia-official"
triggers: "fuchsia-x64-cast-receiver-rel"
triggers: "fuchsia-x64-rel"
- triggers: "ios-simulator"
- triggers: "ios-simulator-cronet"
- triggers: "ios-simulator-full-configs"
- triggers: "lacros-amd64-generic-rel"
- triggers: "lacros-arm-generic-rel"
- triggers: "lacros-arm64-generic-rel"
- triggers: "linux-chromeos-dbg"
- triggers: "linux-chromeos-rel"
- triggers: "linux-lacros-builder-rel"
- triggers: "linux-lacros-dbg"
- triggers: "linux-official"
triggers: "mac-arm64-rel"
triggers: "mac-official"
triggers: "win-official"
diff --git a/chromium/infra/config/generated/luci/project.cfg b/chromium/infra/config/generated/luci/project.cfg
index 1f8c13a6c5f..fa2c71a7cb4 100644
--- a/chromium/infra/config/generated/luci/project.cfg
+++ b/chromium/infra/config/generated/luci/project.cfg
@@ -7,7 +7,7 @@
name: "chromium-m112"
access: "group:all"
lucicfg {
- version: "1.39.4"
+ version: "1.39.8"
package_dir: "../.."
config_dir: "generated/luci"
entry_point: "main.star"
diff --git a/chromium/infra/config/generated/luci/realms.cfg b/chromium/infra/config/generated/luci/realms.cfg
index 3d5db3ceb3b..2228cee54e9 100644
--- a/chromium/infra/config/generated/luci/realms.cfg
+++ b/chromium/infra/config/generated/luci/realms.cfg
@@ -97,13 +97,6 @@ realms {
values: "Android WebView N (dbg)"
values: "Android WebView O (dbg)"
values: "Android WebView P (dbg)"
- values: "Linux ASan LSan Tests (1)"
- values: "Linux ASan Tests (sandboxed)"
- values: "Linux Release (NVIDIA)"
- values: "Linux TSan Tests"
- values: "Linux Tests"
- values: "Linux Tests (Wayland)"
- values: "Linux Tests (dbg)(1)"
values: "Mac Release (Intel)"
values: "Mac Retina Release (AMD)"
values: "Mac10.13 Tests"
@@ -118,7 +111,6 @@ realms {
values: "Win10 x64 Release (NVIDIA)"
values: "android-cronet-x86-dbg-10-tests"
values: "android-pie-arm64-dbg"
- values: "linux-lacros-tester-rel"
values: "mac11-arm64-rel-tests"
values: "mac12-arm64-rel-tests"
}
@@ -130,8 +122,6 @@ realms {
conditions {
restrict {
attribute: "scheduler.job.name"
- values: "Dawn Linux x64 DEPS Release (Intel UHD 630)"
- values: "Dawn Linux x64 DEPS Release (NVIDIA)"
values: "Dawn Mac x64 DEPS Release (AMD)"
values: "Dawn Mac x64 DEPS Release (Intel)"
values: "Dawn Win10 x64 DEPS Release (Intel)"
@@ -174,6 +164,7 @@ realms {
principals: "group:project-chromium-tryjob-access"
principals: "group:service-account-chromeperf"
principals: "group:service-account-cq"
+ principals: "project:dawn"
principals: "user:findit-for-me@appspot.gserviceaccount.com"
principals: "user:tricium-prod@appspot.gserviceaccount.com"
}
diff --git a/chromium/infra/config/settings.json b/chromium/infra/config/settings.json
index 1562771ca34..a986834fef8 100644
--- a/chromium/infra/config/settings.json
+++ b/chromium/infra/config/settings.json
@@ -5,33 +5,21 @@
"chrome_project": "chrome-m112",
"is_main": false,
"platforms": {
- "android": {
- "description": "beta/stable",
- "sheriff_rotation": "chrome_browser_release"
+ "android": {
+ "description": "webview stable",
+ "sheriff_rotation": "chrome_browser_release"
},
- "cros": {
- "description": "beta/stable",
- "sheriff_rotation": "chrome_browser_release"
- },
- "fuchsia": {
- "description": "beta/stable",
- "sheriff_rotation": "chrome_browser_release"
- },
- "ios": {
- "description": "beta/stable",
- "sheriff_rotation": "chrome_browser_release"
- },
- "linux": {
- "description": "beta/stable",
- "sheriff_rotation": "chrome_browser_release"
- },
- "mac": {
- "description": "beta/stable",
- "sheriff_rotation": "chrome_browser_release"
- },
- "windows": {
- "description": "beta/stable",
- "sheriff_rotation": "chrome_browser_release"
- }
- }
+ "fuchsia": {
+ "description": "fuchsia F11",
+ "sheriff_rotation": "fuchsia"
+ },
+ "mac": {
+ "description": "extended stable",
+ "sheriff_rotation": "chrome_browser_release"
+ },
+ "windows": {
+ "description": "extended stable",
+ "sheriff_rotation": "chrome_browser_release"
+ }
+ }
}
diff --git a/chromium/infra/config/subprojects/chromium/ci/chromium.clang.star b/chromium/infra/config/subprojects/chromium/ci/chromium.clang.star
index a4304ea7456..1578ae957c9 100644
--- a/chromium/infra/config/subprojects/chromium/ci/chromium.clang.star
+++ b/chromium/infra/config/subprojects/chromium/ci/chromium.clang.star
@@ -393,7 +393,7 @@ ci.builder(
name = "ToTiOS",
builderless = False,
cores = None,
- os = os.MAC_12,
+ os = os.MAC_DEFAULT,
ssd = True,
console_view_entry = consoles.console_view_entry(
category = "iOS|public",
@@ -406,7 +406,7 @@ ci.builder(
name = "ToTiOSDevice",
builderless = False,
cores = None,
- os = os.MAC_12,
+ os = os.MAC_DEFAULT,
ssd = True,
console_view_entry = consoles.console_view_entry(
category = "iOS|public",
diff --git a/chromium/infra/config/subprojects/chromium/ci/chromium.fyi.star b/chromium/infra/config/subprojects/chromium/ci/chromium.fyi.star
index 6970c09042f..178b0f3d41c 100644
--- a/chromium/infra/config/subprojects/chromium/ci/chromium.fyi.star
+++ b/chromium/infra/config/subprojects/chromium/ci/chromium.fyi.star
@@ -876,7 +876,6 @@ ci.thin_tester(
config = "chromium",
apply_configs = [
"mb",
- "goma_use_local", # to mitigate compile step timeout (crbug.com/1056935)
],
build_config = builder_config.build_config.RELEASE,
target_bits = 64,
diff --git a/chromium/infra/config/subprojects/chromium/ci/chromium.gpu.star b/chromium/infra/config/subprojects/chromium/ci/chromium.gpu.star
index 91ee2579f00..ca04175b7d4 100644
--- a/chromium/infra/config/subprojects/chromium/ci/chromium.gpu.star
+++ b/chromium/infra/config/subprojects/chromium/ci/chromium.gpu.star
@@ -129,7 +129,6 @@ ci.gpu.mac_builder(
config = "chromium",
apply_configs = [
"mb",
- "goma_use_local", # to mitigate compile step timeout (crbug.com/1056935)
],
build_config = builder_config.build_config.RELEASE,
target_bits = 64,
@@ -311,7 +310,6 @@ ci.thin_tester(
config = "chromium",
apply_configs = [
"mb",
- "goma_use_local", # to mitigate compile step timeout (crbug.com/1056935)
],
build_config = builder_config.build_config.RELEASE,
target_bits = 64,
@@ -363,7 +361,6 @@ ci.thin_tester(
config = "chromium",
apply_configs = [
"mb",
- "goma_use_local", # to mitigate compile step timeout (crbug.com/1056935)
],
build_config = builder_config.build_config.RELEASE,
target_bits = 64,
diff --git a/chromium/infra/config/subprojects/chromium/ci/chromium.mac.star b/chromium/infra/config/subprojects/chromium/ci/chromium.mac.star
index 6f36aac9a33..0eaeffc87dd 100644
--- a/chromium/infra/config/subprojects/chromium/ci/chromium.mac.star
+++ b/chromium/infra/config/subprojects/chromium/ci/chromium.mac.star
@@ -69,7 +69,6 @@ ci.builder(
config = "chromium",
apply_configs = [
"mb",
- "goma_use_local", # to mitigate compile step timeout (crbug.com/1056935)
],
build_config = builder_config.build_config.RELEASE,
target_bits = 64,
@@ -235,7 +234,6 @@ ci.thin_tester(
config = "chromium",
apply_configs = [
"mb",
- "goma_use_local", # to mitigate compile step timeout (crbug.com/1056935)
],
build_config = builder_config.build_config.RELEASE,
target_bits = 64,
@@ -263,7 +261,6 @@ ci.thin_tester(
config = "chromium",
apply_configs = [
"mb",
- "goma_use_local", # to mitigate compile step timeout (crbug.com/1056935)
],
build_config = builder_config.build_config.RELEASE,
target_bits = 64,
@@ -291,7 +288,6 @@ ci.thin_tester(
config = "chromium",
apply_configs = [
"mb",
- "goma_use_local", # to mitigate compile step timeout (crbug.com/1056935)
],
build_config = builder_config.build_config.RELEASE,
target_bits = 64,
@@ -319,7 +315,6 @@ ci.thin_tester(
config = "chromium",
apply_configs = [
"mb",
- "goma_use_local", # to mitigate compile step timeout (crbug.com/1056935)
],
build_config = builder_config.build_config.RELEASE,
target_bits = 64,
@@ -345,7 +340,6 @@ ci.thin_tester(
config = "chromium",
apply_configs = [
"mb",
- "goma_use_local", # to mitigate compile step timeout (crbug.com/1056935)
],
build_config = builder_config.build_config.RELEASE,
target_bits = 64,
diff --git a/chromium/infra/config/subprojects/chromium/ci/chromium.memory.star b/chromium/infra/config/subprojects/chromium/ci/chromium.memory.star
index 307c4edfd9a..d025adf60f3 100644
--- a/chromium/infra/config/subprojects/chromium/ci/chromium.memory.star
+++ b/chromium/infra/config/subprojects/chromium/ci/chromium.memory.star
@@ -646,7 +646,7 @@ ci.builder(
),
),
cores = None,
- os = os.MAC_12,
+ os = os.MAC_DEFAULT,
sheriff_rotations = args.ignore_default(sheriff_rotations.IOS),
console_view_entry = consoles.console_view_entry(
category = "iOS",
diff --git a/chromium/infra/config/subprojects/chromium/ci/chromium.star b/chromium/infra/config/subprojects/chromium/ci/chromium.star
index 141fafbfe84..55ee20a04c7 100644
--- a/chromium/infra/config/subprojects/chromium/ci/chromium.star
+++ b/chromium/infra/config/subprojects/chromium/ci/chromium.star
@@ -551,7 +551,6 @@ ci.builder(
apply_configs = [
"clobber",
"mb",
- "goma_use_local", # to mitigate compile step timeout (crbug.com/1056935).
],
build_config = builder_config.build_config.RELEASE,
target_bits = 64,
@@ -613,7 +612,6 @@ ci.builder(
apply_configs = [
"clobber",
"mb",
- "goma_use_local", # to mitigate compile step timeout (crbug.com/1056935).
],
build_config = builder_config.build_config.RELEASE,
target_bits = 64,
diff --git a/chromium/infra/config/subprojects/chromium/ci/chromium.win.star b/chromium/infra/config/subprojects/chromium/ci/chromium.win.star
index b2bd02ed9af..441724cb3d8 100644
--- a/chromium/infra/config/subprojects/chromium/ci/chromium.win.star
+++ b/chromium/infra/config/subprojects/chromium/ci/chromium.win.star
@@ -49,7 +49,6 @@ ci.builder(
chromium_config = builder_config.chromium_config(
config = "chromium",
apply_configs = [
- "goma_enable_global_file_stat_cache",
"mb",
],
build_config = builder_config.build_config.RELEASE,
@@ -73,7 +72,6 @@ ci.builder(
chromium_config = builder_config.chromium_config(
config = "chromium",
apply_configs = [
- "goma_enable_global_file_stat_cache",
"mb",
],
build_config = builder_config.build_config.RELEASE,
diff --git a/chromium/infra/config/subprojects/chromium/try.star b/chromium/infra/config/subprojects/chromium/try.star
index 4746adc2104..308c92ddc7f 100644
--- a/chromium/infra/config/subprojects/chromium/try.star
+++ b/chromium/infra/config/subprojects/chromium/try.star
@@ -41,13 +41,13 @@ luci.bucket(
"findit-for-me@appspot.gserviceaccount.com",
"tricium-prod@appspot.gserviceaccount.com",
],
- projects = [
- "angle",
- "dawn",
- "skia",
- "swiftshader",
- "v8",
- ] if settings.is_main else None,
+ projects = [p for p in [
+ branches.value(branch_selector = branches.selector.MAIN, value = "angle"),
+ branches.value(branch_selector = branches.selector.DESKTOP_BRANCHES, value = "dawn"),
+ branches.value(branch_selector = branches.selector.MAIN, value = "skia"),
+ branches.value(branch_selector = branches.selector.MAIN, value = "swiftshader"),
+ branches.value(branch_selector = branches.selector.MAIN, value = "v8"),
+ ] if p != None],
),
acl.entry(
roles = acl.BUILDBUCKET_OWNER,
diff --git a/chromium/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star b/chromium/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star
index 40c9c1a90c4..a36c1e48d10 100644
--- a/chromium/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star
+++ b/chromium/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star
@@ -182,7 +182,7 @@ try_.orchestrator_builder(
try_.compilator_builder(
name = "mac12-arm64-rel-compilator",
- os = os.MAC_12,
+ os = os.MAC_DEFAULT,
check_for_flakiness = True,
# TODO (crbug.com/1245171): Revert when root issue is fixed
grace_period = 4 * time.minute,
diff --git a/chromium/ios/features.gni b/chromium/ios/features.gni
index 7ddf02f88a7..8baf3f04f0f 100644
--- a/chromium/ios/features.gni
+++ b/chromium/ios/features.gni
@@ -8,8 +8,8 @@ declare_args() {
is_webkit_only_build = false
# Control whether iOS builds with PartitionAlloc.
- # Temporarily enable for rollout -- see crbug.com/1412190 for details.
- ios_partition_alloc_enabled = true
+ # Temporarily disable for rollout -- see crbug.com/1412190 for details.
+ ios_partition_alloc_enabled = false
# Control whether //ios/chrome and //ios/web targets are build. This
# is used by bots from projects based on top of Chromium that want to
diff --git a/chromium/media/capture/video/mac/video_capture_device_mac.mm b/chromium/media/capture/video/mac/video_capture_device_mac.mm
index 74e310ed911..82eac2c7bfa 100644
--- a/chromium/media/capture/video/mac/video_capture_device_mac.mm
+++ b/chromium/media/capture/video/mac/video_capture_device_mac.mm
@@ -50,6 +50,10 @@ namespace media {
namespace {
+BASE_FEATURE(kExposeAllUvcControls,
+ "ExposeAllUvcControls",
+ base::FEATURE_DISABLED_BY_DEFAULT);
+
// Mac specific limits for minimum and maximum frame rate.
const float kMinFrameRate = 1.0f;
const float kMaxFrameRate = 60.0f;
@@ -242,7 +246,8 @@ void VideoCaptureDeviceMac::GetPhotoState(GetPhotoStateCallback callback) {
const std::string device_model = GetDeviceModelId(
device_descriptor_.device_id, device_descriptor_.capture_api,
device_descriptor_.transport_type);
- if (UvcControl uvc(device_model, uvc::kVcInputTerminal); uvc.Good()) {
+ if (UvcControl uvc(device_model, uvc::kVcInputTerminal);
+ uvc.Good() && base::FeatureList::IsEnabled(kExposeAllUvcControls)) {
photo_state->current_focus_mode = mojom::MeteringMode::NONE;
uvc.MaybeUpdateControlRange<uint16_t>(uvc::kCtFocusAbsoluteControl,
photo_state->focus_distance.get(),
@@ -282,14 +287,16 @@ void VideoCaptureDeviceMac::GetPhotoState(GetPhotoStateCallback callback) {
photo_state->supported_exposure_modes.push_back(
mojom::MeteringMode::CONTINUOUS);
}
-
+ }
+ if (UvcControl uvc(device_model, uvc::kVcInputTerminal); uvc.Good()) {
MaybeUpdatePanTiltControlRange(uvc, photo_state->pan.get(),
photo_state->tilt.get());
uvc.MaybeUpdateControlRange<uint16_t>(uvc::kCtZoomAbsoluteControl,
photo_state->zoom.get(), "zoom");
}
- if (UvcControl uvc(device_model, uvc::kVcProcessingUnit); uvc.Good()) {
+ if (UvcControl uvc(device_model, uvc::kVcProcessingUnit);
+ uvc.Good() && base::FeatureList::IsEnabled(kExposeAllUvcControls)) {
uvc.MaybeUpdateControlRange<int16_t>(uvc::kPuBrightnessAbsoluteControl,
photo_state->brightness.get(),
"brightness");
@@ -362,7 +369,8 @@ void VideoCaptureDeviceMac::SetPhotoOptions(mojom::PhotoSettingsPtr settings,
const std::string device_model = GetDeviceModelId(
device_descriptor_.device_id, device_descriptor_.capture_api,
device_descriptor_.transport_type);
- if (UvcControl uvc(device_model, uvc::kVcInputTerminal); uvc.Good()) {
+ if (UvcControl uvc(device_model, uvc::kVcInputTerminal);
+ uvc.Good() && base::FeatureList::IsEnabled(kExposeAllUvcControls)) {
if (settings->has_focus_mode &&
(settings->focus_mode == mojom::MeteringMode::CONTINUOUS ||
settings->focus_mode == mojom::MeteringMode::MANUAL)) {
@@ -389,6 +397,8 @@ void VideoCaptureDeviceMac::SetPhotoOptions(mojom::PhotoSettingsPtr settings,
uvc.SetControlCurrent<uint16_t>(uvc::kCtExposureTimeAbsoluteControl,
settings->exposure_time, "exposure time");
}
+ }
+ if (UvcControl uvc(device_model, uvc::kVcInputTerminal); uvc.Good()) {
if (settings->has_pan || settings->has_tilt) {
SetPanTiltCurrent(uvc,
settings->has_pan ? absl::make_optional(settings->pan)
@@ -401,7 +411,8 @@ void VideoCaptureDeviceMac::SetPhotoOptions(mojom::PhotoSettingsPtr settings,
settings->zoom, "zoom");
}
}
- if (UvcControl uvc(device_model, uvc::kVcProcessingUnit); uvc.Good()) {
+ if (UvcControl uvc(device_model, uvc::kVcProcessingUnit);
+ uvc.Good() && base::FeatureList::IsEnabled(kExposeAllUvcControls)) {
if (settings->has_brightness) {
uvc.SetControlCurrent<int16_t>(uvc::kPuBrightnessAbsoluteControl,
settings->brightness, "brightness");
diff --git a/chromium/net/http/http_cache_unittest.cc b/chromium/net/http/http_cache_unittest.cc
index 5d0d3ca0afd..b661c881277 100644
--- a/chromium/net/http/http_cache_unittest.cc
+++ b/chromium/net/http/http_cache_unittest.cc
@@ -9052,47 +9052,6 @@ TEST_F(HttpCacheTest, UnknownRangeGET_2) {
RemoveMockTransaction(&transaction);
}
-// Similar to UnknownRangeGET_2, except that the resource size is empty.
-// Regression test for crbug.com/813061, and probably https://crbug.com/1375128
-TEST_F(HttpCacheTest, UnknownRangeGET_3) {
- MockHttpCache cache;
- std::string headers;
-
- ScopedMockTransaction transaction(kSimpleGET_Transaction);
- transaction.response_headers =
- "Cache-Control: max-age=10000\n"
- "Content-Length: 0\n",
- transaction.data = "";
- transaction.test_mode = TEST_MODE_SYNC_CACHE_START |
- TEST_MODE_SYNC_CACHE_READ |
- TEST_MODE_SYNC_CACHE_WRITE;
-
- // Write the empty resource to the cache.
- RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers);
-
- EXPECT_EQ(
- "HTTP/1.1 200 OK\nCache-Control: max-age=10000\nContent-Length: 0\n",
- headers);
- EXPECT_EQ(1, cache.network_layer()->transaction_count());
- EXPECT_EQ(0, cache.disk_cache()->open_count());
- EXPECT_EQ(1, cache.disk_cache()->create_count());
-
- // Make sure we are done with the previous transaction.
- base::RunLoop().RunUntilIdle();
-
- // Write and read from the cache. This used to trigger a DCHECK
- // (or loop infinitely with it off).
- transaction.request_headers = "Range: bytes = -20\r\n" EXTRA_HEADER;
- RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers);
-
- EXPECT_EQ(
- "HTTP/1.1 200 OK\nCache-Control: max-age=10000\nContent-Length: 0\n",
- headers);
- EXPECT_EQ(1, cache.network_layer()->transaction_count());
- EXPECT_EQ(1, cache.disk_cache()->open_count());
- EXPECT_EQ(1, cache.disk_cache()->create_count());
-}
-
// Tests that receiving Not Modified when asking for an open range doesn't mess
// up things.
TEST_F(HttpCacheTest, UnknownRangeGET_304) {
diff --git a/chromium/net/http/partial_data.cc b/chromium/net/http/partial_data.cc
index f58ef987317..7b3bc39af92 100644
--- a/chromium/net/http/partial_data.cc
+++ b/chromium/net/http/partial_data.cc
@@ -354,21 +354,20 @@ void PartialData::FixResponseHeaders(HttpResponseHeaders* headers,
if (truncated_)
return;
- if (!success) {
+ if (byte_range_.IsValid() && success) {
+ headers->UpdateWithNewRange(byte_range_, resource_size_, !sparse_entry_);
+ return;
+ }
+
+ if (byte_range_.IsValid()) {
headers->ReplaceStatusLine("HTTP/1.1 416 Requested Range Not Satisfiable");
headers->SetHeader(
kRangeHeader, base::StringPrintf("bytes 0-0/%" PRId64, resource_size_));
headers->SetHeader(kLengthHeader, "0");
- return;
- }
-
- if (byte_range_.IsValid() && resource_size_) {
- headers->UpdateWithNewRange(byte_range_, resource_size_, !sparse_entry_);
} else {
- if (headers->response_code() == net::HTTP_PARTIAL_CONTENT) {
- // TODO(rvargas): Is it safe to change the protocol version?
- headers->ReplaceStatusLine("HTTP/1.1 200 OK");
- }
+ // TODO(rvargas): Is it safe to change the protocol version?
+ headers->ReplaceStatusLine("HTTP/1.1 200 OK");
+ DCHECK_NE(resource_size_, 0);
headers->RemoveHeader(kRangeHeader);
headers->SetHeader(kLengthHeader,
base::StringPrintf("%" PRId64, resource_size_));
@@ -434,9 +433,6 @@ void PartialData::OnNetworkReadCompleted(int result) {
}
int PartialData::GetNextRangeLen() {
- if (!resource_size_) {
- return 0;
- }
int64_t range_len =
byte_range_.HasLastBytePosition()
? byte_range_.last_byte_position() - current_range_start_ + 1
diff --git a/chromium/net/http/transport_security_state_static.pins b/chromium/net/http/transport_security_state_static.pins
index e39adae5c75..39d5f33e70a 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: 2023-04-13 12:54 UTC
+# Last updated: 2023-04-17 12:55 UTC
PinsListTimestamp
-1681390459
+1681736112
TestSPKI
sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
diff --git a/chromium/skia/ext/skia_commit_hash.h b/chromium/skia/ext/skia_commit_hash.h
index badcbe2a5f4..b681c6b9ded 100644
--- a/chromium/skia/ext/skia_commit_hash.h
+++ b/chromium/skia/ext/skia_commit_hash.h
@@ -3,6 +3,6 @@
#ifndef SKIA_EXT_SKIA_COMMIT_HASH_H_
#define SKIA_EXT_SKIA_COMMIT_HASH_H_
-#define SKIA_COMMIT_HASH "f5715362aac554ff3108b9e2a56b8ac8a6ef1acb"
+#define SKIA_COMMIT_HASH "4dc670a8c5575180caa3d4d03f1e05da0177240d"
#endif // SKIA_EXT_SKIA_COMMIT_HASH_H_
diff --git a/chromium/third_party/angle/src/compiler/translator/ValidateTypeSizeLimitations.cpp b/chromium/third_party/angle/src/compiler/translator/ValidateTypeSizeLimitations.cpp
index 6097b6d236b..2a033ad9d94 100644
--- a/chromium/third_party/angle/src/compiler/translator/ValidateTypeSizeLimitations.cpp
+++ b/chromium/third_party/angle/src/compiler/translator/ValidateTypeSizeLimitations.cpp
@@ -35,7 +35,9 @@ class ValidateTypeSizeLimitationsTraverser : public TIntermTraverser
{
public:
ValidateTypeSizeLimitationsTraverser(TSymbolTable *symbolTable, TDiagnostics *diagnostics)
- : TIntermTraverser(true, false, false, symbolTable), mDiagnostics(diagnostics)
+ : TIntermTraverser(true, false, false, symbolTable),
+ mDiagnostics(diagnostics),
+ mTotalPrivateVariablesSize(0)
{
ASSERT(diagnostics);
}
@@ -93,18 +95,33 @@ class ValidateTypeSizeLimitationsTraverser : public TIntermTraverser
const bool isPrivate = variableType.getQualifier() == EvqTemporary ||
variableType.getQualifier() == EvqGlobal ||
variableType.getQualifier() == EvqConst;
- if (layoutEncoder.getCurrentOffset() > kMaxPrivateVariableSizeInBytes && isPrivate)
+ if (isPrivate)
{
- error(asSymbol->getLine(),
- "Size of declared private variable exceeds implementation-defined limit",
- asSymbol->getName());
- return false;
+ if (layoutEncoder.getCurrentOffset() > kMaxPrivateVariableSizeInBytes)
+ {
+ error(asSymbol->getLine(),
+ "Size of declared private variable exceeds implementation-defined limit",
+ asSymbol->getName());
+ return false;
+ }
+ mTotalPrivateVariablesSize += layoutEncoder.getCurrentOffset();
}
}
return true;
}
+ void validateTotalPrivateVariableSize()
+ {
+ if (mTotalPrivateVariablesSize > kMaxPrivateVariableSizeInBytes)
+ {
+ mDiagnostics->error(
+ TSourceLoc{},
+ "Total size of declared private variables exceeds implementation-defined limit",
+ "");
+ }
+ }
+
private:
void error(TSourceLoc loc, const char *reason, const ImmutableString &token)
{
@@ -213,6 +230,8 @@ class ValidateTypeSizeLimitationsTraverser : public TIntermTraverser
TDiagnostics *mDiagnostics;
std::vector<int> mLoopSymbolIds;
+
+ size_t mTotalPrivateVariablesSize;
};
} // namespace
@@ -223,6 +242,7 @@ bool ValidateTypeSizeLimitations(TIntermNode *root,
{
ValidateTypeSizeLimitationsTraverser validate(symbolTable, diagnostics);
root->traverse(&validate);
+ validate.validateTotalPrivateVariableSize();
return diagnostics->numErrors() == 0;
}
diff --git a/chromium/third_party/angle/src/libANGLE/formatutils.cpp b/chromium/third_party/angle/src/libANGLE/formatutils.cpp
index fc41b9d0653..0b8d4eeb537 100644
--- a/chromium/third_party/angle/src/libANGLE/formatutils.cpp
+++ b/chromium/third_party/angle/src/libANGLE/formatutils.cpp
@@ -549,6 +549,21 @@ bool InternalFormat::isDepthOrStencil() const
return depthBits != 0 || stencilBits != 0;
}
+GLuint InternalFormat::getEGLConfigBufferSize() const
+{
+ // EGL config's EGL_BUFFER_SIZE is measured in bits and is the sum of all the color channels for
+ // color formats or the luma channels for luma formats. It ignores unused bits so compute the
+ // bit count by summing instead of using pixelBytes.
+ if (isLUMA())
+ {
+ return luminanceBits + alphaBits;
+ }
+ else
+ {
+ return redBits + greenBits + blueBits + alphaBits;
+ }
+}
+
Format::Format(GLenum internalFormat) : Format(GetSizedInternalFormatInfo(internalFormat)) {}
Format::Format(const InternalFormat &internalFormat) : info(&internalFormat) {}
@@ -1141,10 +1156,10 @@ static InternalFormatInfoMap BuildInternalFormatInfoMap()
AddRGBAFormat(&map, GL_BGR10_A2_ANGLEX, true, 10, 10, 10, 2, 0, GL_BGRA_EXT, GL_UNSIGNED_INT_2_10_10_10_REV, GL_UNSIGNED_NORMALIZED, false, NeverSupported, NeverSupported, NeverSupported, NeverSupported, NeverSupported);
// Special format to emulate RGB8 with RGBA8 within ANGLE.
- AddRGBAFormat(&map, GL_RGBX8_ANGLE, true, 8, 8, 8, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, false, AlwaysSupported, AlwaysSupported, AlwaysSupported, AlwaysSupported, NeverSupported);
+ AddRGBAXFormat(&map, GL_RGBX8_ANGLE, true, FB< 8, 8, 8, 0, 8, 0>(), GL_RGB, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, false, AlwaysSupported, AlwaysSupported, AlwaysSupported, AlwaysSupported, NeverSupported);
// Special format to emulate BGR8 with BGRA8 within ANGLE.
- AddRGBAFormat(&map, GL_BGRX8_ANGLEX, true, 8, 8, 8, 0, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, false, NeverSupported, AlwaysSupported, NeverSupported, NeverSupported, NeverSupported);
+ AddRGBAXFormat(&map, GL_BGRX8_ANGLEX, true, FB< 8, 8, 8, 0, 8, 0>(), GL_BGRA_EXT, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, false, NeverSupported, AlwaysSupported, NeverSupported, NeverSupported, NeverSupported);
// This format is supported on ES 2.0 with two extensions, so keep it out-of-line to not widen the table above even more.
// | Internal format |sized| R | G | B | A |S | Format | Type | Component type | SRGB | Texture supported | Filterable | Texture attachment | Renderbuffer | Blend
diff --git a/chromium/third_party/angle/src/libANGLE/formatutils.h b/chromium/third_party/angle/src/libANGLE/formatutils.h
index af7f6df09ef..a651ab8ffc4 100644
--- a/chromium/third_party/angle/src/libANGLE/formatutils.h
+++ b/chromium/third_party/angle/src/libANGLE/formatutils.h
@@ -205,6 +205,8 @@ struct InternalFormat
bool isInt() const;
bool isDepthOrStencil() const;
+ GLuint getEGLConfigBufferSize() const;
+
bool operator==(const InternalFormat &other) const;
bool operator!=(const InternalFormat &other) const;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
index cf3c53ec00f..abd3d5fa2a4 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
@@ -1263,7 +1263,7 @@ egl::ConfigSet Renderer11::generateConfigs()
egl::Config config;
config.renderTargetFormat = colorBufferInternalFormat;
config.depthStencilFormat = depthStencilBufferInternalFormat;
- config.bufferSize = colorBufferFormatInfo.pixelBytes * 8;
+ config.bufferSize = colorBufferFormatInfo.getEGLConfigBufferSize();
config.redSize = colorBufferFormatInfo.redBits;
config.greenSize = colorBufferFormatInfo.greenBits;
config.blueSize = colorBufferFormatInfo.blueBits;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp
index cfe6ef850d9..66950965fde 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/d3d/d3d9/Renderer9.cpp
@@ -523,7 +523,7 @@ egl::ConfigSet Renderer9::generateConfigs()
egl::Config config;
config.renderTargetFormat = colorBufferInternalFormat;
config.depthStencilFormat = depthStencilBufferInternalFormat;
- config.bufferSize = colorBufferFormatInfo.pixelBytes * 8;
+ config.bufferSize = colorBufferFormatInfo.getEGLConfigBufferSize();
config.redSize = colorBufferFormatInfo.redBits;
config.greenSize = colorBufferFormatInfo.greenBits;
config.blueSize = colorBufferFormatInfo.blueBits;
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_caps_utils.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_caps_utils.cpp
index 84a02d8b7c7..a4100d9ff78 100644
--- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_caps_utils.cpp
+++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_caps_utils.cpp
@@ -1264,7 +1264,7 @@ egl::Config GenerateDefaultConfig(DisplayVk *display,
config.renderTargetFormat = colorFormat.internalFormat;
config.depthStencilFormat = depthStencilFormat.internalFormat;
- config.bufferSize = colorFormat.pixelBytes * 8;
+ config.bufferSize = colorFormat.getEGLConfigBufferSize();
config.redSize = colorFormat.redBits;
config.greenSize = colorFormat.greenBits;
config.blueSize = colorFormat.blueBits;
diff --git a/chromium/third_party/blink/public/strings/translations/blink_accessibility_strings_am.xtb b/chromium/third_party/blink/public/strings/translations/blink_accessibility_strings_am.xtb
index f634b7c5f3e..b2bb578195e 100644
--- a/chromium/third_party/blink/public/strings/translations/blink_accessibility_strings_am.xtb
+++ b/chromium/third_party/blink/public/strings/translations/blink_accessibility_strings_am.xtb
@@ -33,7 +33,7 @@
<translation id="3904695548697879411">የTwitter አዶ</translation>
<translation id="405782047075994056">የግራ ቀስት አዶ ተመለስ ማለት ሊሆን ይችላል</translation>
<translation id="4302299849305494927">የድምፅ ማጉያ አዶ ድምፅ ማለት ሊሆን ይችላል</translation>
-<translation id="4363712632243441817">የCast አዶ ቪዲዮን ወደ ርቀት ማያ ገጽ cast ማድረግ ማለት ሊሆን ይችላል</translation>
+<translation id="4363712632243441817">የCast አዶ ቪዲዮን ወደ ርቀት ማያ ገፅ cast ማድረግ ማለት ሊሆን ይችላል</translation>
<translation id="4384249794467006333">ይህ ምስል አልተሰየመም። የምስል መግለጫዎችን ለማግኘት ከላይ በቀኝ በኩል ያለውን ተጨማሪ አማራጮች ምናሌን ይክፈቱ።</translation>
<translation id="4436211924730548766">የግራ ቼቭሮን አዶ</translation>
<translation id="4444765639179266822">እንዲህ የሚል ይመስላል፦ <ph name="OCR_TEXT" /></translation>
diff --git a/chromium/third_party/blink/public/strings/translations/blink_strings_am.xtb b/chromium/third_party/blink/public/strings/translations/blink_strings_am.xtb
index 65423fc90ce..33ed8acc0e3 100644
--- a/chromium/third_party/blink/public/strings/translations/blink_strings_am.xtb
+++ b/chromium/third_party/blink/public/strings/translations/blink_strings_am.xtb
@@ -88,7 +88,7 @@
<translation id="5378437566635403538">ተዘርግቷል፣ መገናኛ ተከፍቷል።</translation>
<translation id="5425179576310518467">የአሁኑ ቀን</translation>
<translation id="5466621249238537318">እባክዎ አንድ ወይም ተጨማሪ ፋይሎችን ይምረጡ።</translation>
-<translation id="5468998798572797635">ከሙሉ ማያ ገጽ ውጣ</translation>
+<translation id="5468998798572797635">ከሙሉ ማያ ገፅ ውጣ</translation>
<translation id="5516235301412634559">0.75</translation>
<translation id="5537725057119320332">Cast</translation>
<translation id="5546461542133609677">ድምፅ-ከልን አንሳ</translation>
@@ -98,7 +98,7 @@
<translation id="5786442179789148008">የመልሶ ማጫወት ፍጥነት ምናሌን አሳይ</translation>
<translation id="5787939484346677755">ተዘርግቷል፣ የራስ-ማጠናቀቅ አማራጮች አሉ።</translation>
<translation id="5860033963881614850">አጥፋ</translation>
-<translation id="588258955323874662">ሙሉ ገጽ ዕይታ</translation>
+<translation id="588258955323874662">ሙሉ ገፅ ዕይታ</translation>
<translation id="5888666972993069672">አሁን ወደ <ph name="DEVICE_FRIENDLY_NAME" /> cast በማድረግ ላይ</translation>
<translation id="5916664084637901428">በርቷል</translation>
<translation id="5939518447894949180">ዳግም አስጀምር</translation>
@@ -107,7 +107,7 @@
<translation id="6011459053400940133">የድምጽ ተንሸራታች</translation>
<translation id="6015796118275082299">ዓመት</translation>
<translation id="6165053282446038410">ተዘርግቷል፣ <ph name="COUNT" /> የራስ-ማጠናቀቅ አማራጮች አሉ።</translation>
-<translation id="6212595056017402527">የአሁኑ ገጽ</translation>
+<translation id="6212595056017402527">የአሁኑ ገፅ</translation>
<translation id="6281588256137006900">ፍካት</translation>
<translation id="6310801910862476708">ከሥዕል-ውስጥ-ሥዕል ውጣ</translation>
<translation id="6398862346408813489">የወር መምረጫ ፓነል አሳይ</translation>
@@ -115,7 +115,7 @@
<translation id="6443871981718447451">የተዘጉ የመግለጫ ጽሁፎችን ምናሌ አሳይ</translation>
<translation id="6550675742724504774">አማራጮች</translation>
<translation id="6572309429103589720">ልክ ያልኾነ ሰዋሰው</translation>
-<translation id="658823671542763450">ወደ ሙሉ ገጽ ዕይታ ግባ</translation>
+<translation id="658823671542763450">ወደ ሙሉ ገፅ ዕይታ ግባ</translation>
<translation id="6606094904835912297">የስርዓት ቀለሞች</translation>
<translation id="6643016212128521049">አጽዳ</translation>
<translation id="668171684555832681">ሌላ…</translation>
diff --git a/chromium/third_party/blink/public/strings/translations/blink_strings_es.xtb b/chromium/third_party/blink/public/strings/translations/blink_strings_es.xtb
index c936fdb8b8f..0adb98641a9 100644
--- a/chromium/third_party/blink/public/strings/translations/blink_strings_es.xtb
+++ b/chromium/third_party/blink/public/strings/translations/blink_strings_es.xtb
@@ -97,7 +97,7 @@
<translation id="57838592816432529">Silenciar</translation>
<translation id="5786442179789148008">mostrar menú de velocidad de reproducción</translation>
<translation id="5787939484346677755">desplegado, opciones de autocompletado disponibles.</translation>
-<translation id="5860033963881614850">Desactivado</translation>
+<translation id="5860033963881614850">Desactivada</translation>
<translation id="588258955323874662">Pantalla completa</translation>
<translation id="5888666972993069672">Enviando a <ph name="DEVICE_FRIENDLY_NAME" /> en este momento</translation>
<translation id="5916664084637901428">Activado</translation>
diff --git a/chromium/third_party/blink/public/strings/translations/blink_strings_hi.xtb b/chromium/third_party/blink/public/strings/translations/blink_strings_hi.xtb
index a2ab461b87c..d63e9263ad8 100644
--- a/chromium/third_party/blink/public/strings/translations/blink_strings_hi.xtb
+++ b/chromium/third_party/blink/public/strings/translations/blink_strings_hi.xtb
@@ -60,7 +60,7 @@
<translation id="4103419683916926126">मिलीसेकंड</translation>
<translation id="4201051445878709314">पिछला महीना दिखाएं</translation>
<translation id="4360991593054037559">कृपया कोई मान्य मान डालें. दो निकटतम मान्य मान <ph name="VALID_VALUE_LOW" /> और <ph name="VALID_VALUE_HIGHER" /> हैं.</translation>
-<translation id="4522570452068850558">विवरण</translation>
+<translation id="4522570452068850558">ब्यौरा</translation>
<translation id="4664250907885839816">'<ph name="ATSIGN" />' के बाद आने वाले भाग में '<ph name="INVALIDCHARACTER" />' प्रतीक शामिल नहीं होना चाहिए.</translation>
<translation id="4718048029184481307">वीडियो को 'पिक्चर में पिक्चर' सुविधा में चलाया जा रहा है</translation>
<translation id="4748357248530471599">डिसप्ले कटआउट फ़ुलस्क्रीन टॉगल करें</translation>
diff --git a/chromium/third_party/blink/public/strings/translations/blink_strings_it.xtb b/chromium/third_party/blink/public/strings/translations/blink_strings_it.xtb
index e546a75cf8b..16d695e0494 100644
--- a/chromium/third_party/blink/public/strings/translations/blink_strings_it.xtb
+++ b/chromium/third_party/blink/public/strings/translations/blink_strings_it.xtb
@@ -74,7 +74,7 @@
<translation id="4975562563186953947">Elementi selezionati: <ph name="SELECTED_COUNT" /></translation>
<translation id="4992066212339426712">Riattiva audio</translation>
<translation id="49969490063480558">Inserisci una parte dopo "<ph name="ATSIGN" />". Il valore "<ph name="INVALIDADDRESS" />" è incompleto.</translation>
-<translation id="5090250355906949916">dispositivo di scorrimento durata video</translation>
+<translation id="5090250355906949916">cursore durata video</translation>
<translation id="509897012892853729">Canale blu</translation>
<translation id="5117590920725113268">Mostra mese successivo</translation>
<translation id="5164977714490026579">Il valore deve essere superiore o uguale a <ph name="MINIMUM" />.</translation>
@@ -104,14 +104,14 @@
<translation id="5939518447894949180">Reimposta</translation>
<translation id="5966707198760109579">Settimana</translation>
<translation id="5985507339671257014">0,5</translation>
-<translation id="6011459053400940133">dispositivo di scorrimento del volume</translation>
+<translation id="6011459053400940133">Cursore del volume</translation>
<translation id="6015796118275082299">Anno</translation>
<translation id="6165053282446038410">espanso, <ph name="COUNT" /> opzioni di completamento automatico disponibili.</translation>
<translation id="6212595056017402527">pagina attuale</translation>
<translation id="6281588256137006900">Luminosità</translation>
<translation id="6310801910862476708">Esci da Picture in picture</translation>
<translation id="6398862346408813489">Mostra il riquadro di selezione del mese</translation>
-<translation id="6404546809543547843">dispositivo di scorrimento durata audio</translation>
+<translation id="6404546809543547843">cursore durata audio</translation>
<translation id="6443871981718447451">mostra menu sottotitoli codificati</translation>
<translation id="6550675742724504774">Opzioni</translation>
<translation id="6572309429103589720">Grammatica non valida</translation>
@@ -124,7 +124,7 @@
<translation id="6719914554879143100">Pulsante di opzione selezionato. Nel gruppo, l'opzione <ph name="INDEX" /> di <ph name="COUNT" /></translation>
<translation id="6790428901817661496">Riproduci</translation>
<translation id="6820355525329141109">Impossibile caricare il plug-in</translation>
-<translation id="6831465880655513317">Selettore colori con dispositivo di scorrimento bidimensionale per selezionare saturazione e luminosità</translation>
+<translation id="6831465880655513317">Selettore colori con cursore bidimensionale per selezionare saturazione e luminosità</translation>
<translation id="6843725295806269523">disattiva audio</translation>
<translation id="6919891270253167948">1,5</translation>
<translation id="6941933287844615239">scarica contenuti multimediali</translation>
@@ -144,7 +144,7 @@
<translation id="775297008183122718">Valore non valido</translation>
<translation id="7782515065589691344">1.25</translation>
<translation id="7789962463072032349">pausa</translation>
-<translation id="7852167693871241274">Dispositivo di scorrimento tonalità</translation>
+<translation id="7852167693871241274">Cursore tonalità</translation>
<translation id="7888071071722539607">Aggiungi un simbolo "<ph name="ATSIGN" />" nell'indirizzo email. In "<ph name="INVALIDADDRESS" />" manca un simbolo "<ph name="ATSIGN" />".</translation>
<translation id="795667975304826397">Nessun file selezionato</translation>
<translation id="7962328325860248200">Elemento <ph name="ACCNAME" /> non selezionato</translation>
diff --git a/chromium/third_party/blink/public/strings/translations/blink_strings_ja.xtb b/chromium/third_party/blink/public/strings/translations/blink_strings_ja.xtb
index 32e1cdafc8f..f6d4103e598 100644
--- a/chromium/third_party/blink/public/strings/translations/blink_strings_ja.xtb
+++ b/chromium/third_party/blink/public/strings/translations/blink_strings_ja.xtb
@@ -97,10 +97,10 @@
<translation id="57838592816432529">ミュート</translation>
<translation id="5786442179789148008">再生速度メニューを表示します</translation>
<translation id="5787939484346677755">展開表示されています。オートコンプリート候補があります。</translation>
-<translation id="5860033963881614850">オフ</translation>
+<translation id="5860033963881614850">OFF</translation>
<translation id="588258955323874662">全画面表示</translation>
<translation id="5888666972993069672">現在 <ph name="DEVICE_FRIENDLY_NAME" /> にキャストしています</translation>
-<translation id="5916664084637901428">オン</translation>
+<translation id="5916664084637901428">ON</translation>
<translation id="5939518447894949180">リセット</translation>
<translation id="5966707198760109579">週</translation>
<translation id="5985507339671257014">0.5</translation>
diff --git a/chromium/third_party/blink/public/strings/translations/blink_strings_my.xtb b/chromium/third_party/blink/public/strings/translations/blink_strings_my.xtb
index 9705b784cb8..3032047b993 100644
--- a/chromium/third_party/blink/public/strings/translations/blink_strings_my.xtb
+++ b/chromium/third_party/blink/public/strings/translations/blink_strings_my.xtb
@@ -5,7 +5,7 @@
<translation id="1142001580032786438">ရက်သတ္တပတ် ရွေးချယ်ရေးစနစ် ပြရန်</translation>
<translation id="1171774979989969504">ကျေးဇူးပြုပြီး အီးမေးလ် လိပ်စာကို ထည့်ပေးပါ</translation>
<translation id="1178581264944972037">ဆိုင်းငံ့ထားရန်</translation>
-<translation id="1306460908038601864">ပိတ်ထားသည်</translation>
+<translation id="1306460908038601864">ပိတ်</translation>
<translation id="1311894908970423688">တန်ဖိုးမှာ <ph name="VALUE_DATE_OR_TIME" /> ဖြစ်ရမည်။</translation>
<translation id="1480676835519562650">အများအပြားရွေးချယ်၍ရသည်၊ <ph name="COUNT" /> မှ <ph name="SELECTED" /> ခု ရွေးချယ်ထားသည်။</translation>
<translation id="1588438908519853928">ပုံမှန်</translation>
diff --git a/chromium/third_party/blink/public/strings/translations/blink_strings_pt-BR.xtb b/chromium/third_party/blink/public/strings/translations/blink_strings_pt-BR.xtb
index e2e81a6a049..7a4f3566f25 100644
--- a/chromium/third_party/blink/public/strings/translations/blink_strings_pt-BR.xtb
+++ b/chromium/third_party/blink/public/strings/translations/blink_strings_pt-BR.xtb
@@ -97,7 +97,7 @@
<translation id="57838592816432529">Desativar som</translation>
<translation id="5786442179789148008">mostrar menu de velocidade da reprodução</translation>
<translation id="5787939484346677755">expandido, opções de preenchimento automático disponíveis.</translation>
-<translation id="5860033963881614850">Desativado</translation>
+<translation id="5860033963881614850">Desativada</translation>
<translation id="588258955323874662">Tela inteira</translation>
<translation id="5888666972993069672">Transmitindo agora para <ph name="DEVICE_FRIENDLY_NAME" /></translation>
<translation id="5916664084637901428">Ativado</translation>
diff --git a/chromium/third_party/blink/public/strings/translations/blink_strings_te.xtb b/chromium/third_party/blink/public/strings/translations/blink_strings_te.xtb
index 2ea58053297..5a45708b318 100644
--- a/chromium/third_party/blink/public/strings/translations/blink_strings_te.xtb
+++ b/chromium/third_party/blink/public/strings/translations/blink_strings_te.xtb
@@ -76,7 +76,7 @@
<translation id="49969490063480558">దయచేసి '<ph name="ATSIGN" />'కి తర్వాత ఉన్న భాగాన్ని నమోదు చేయండి. '<ph name="INVALIDADDRESS" />' అసంపూర్ణంగా ఉంది.</translation>
<translation id="5090250355906949916">వీడియో సమయ స్క్రబ్బర్</translation>
<translation id="509897012892853729">బ్లూ ఛానెల్</translation>
-<translation id="5117590920725113268">తరువాత నెలను చూపుతుంది</translation>
+<translation id="5117590920725113268">తర్వాత నెలను చూపుతుంది</translation>
<translation id="5164977714490026579">విలువ ఖచ్చితంగా <ph name="MINIMUM" /> కంటే ఎక్కువగా లేదా సమానంగా ఉండాలి.</translation>
<translation id="5196716972587102051">2</translation>
<translation id="5199514351668672591">తిరిగి ఆప్షన్‌లకు</translation>
@@ -93,7 +93,7 @@
<translation id="5537725057119320332">Cast</translation>
<translation id="5546461542133609677">అన్‌మ్యూట్ చేయి</translation>
<translation id="5630795885300617244">10సె దాటవేయడానికి రెండుసార్లు ఎడమ లేదా కుడివైపుకి నొక్కండి</translation>
-<translation id="5677946354068040947">మరిన్ని ఎంపికలు</translation>
+<translation id="5677946354068040947">మరిన్ని ఆప్షన్‌లు</translation>
<translation id="57838592816432529">మ్యూట్ చేయి</translation>
<translation id="5786442179789148008">ప్లేబ్యాక్ వేగం మెనూను చూడండి</translation>
<translation id="5787939484346677755">విస్తరించబడింది, ఆటోకంప్లీట్ ఆప్షన్‌లు అందుబాటులో ఉన్నాయి.</translation>
@@ -101,7 +101,7 @@
<translation id="588258955323874662">పూర్తితెర</translation>
<translation id="5888666972993069672">ఇప్పుడు <ph name="DEVICE_FRIENDLY_NAME" />కి ప్రసారం చేస్తోంది</translation>
<translation id="5916664084637901428">ఆన్ చేయి</translation>
-<translation id="5939518447894949180">రీసెట్ చేయి</translation>
+<translation id="5939518447894949180">రీసెట్ చేయండి</translation>
<translation id="5966707198760109579">వారం</translation>
<translation id="5985507339671257014">0.5</translation>
<translation id="6011459053400940133">వాల్యూమ్ స్లయిడర్</translation>
diff --git a/chromium/third_party/blink/renderer/core/editing/editing_utilities.cc b/chromium/third_party/blink/renderer/core/editing/editing_utilities.cc
index 6a08550fd84..f50d527b229 100644
--- a/chromium/third_party/blink/renderer/core/editing/editing_utilities.cc
+++ b/chromium/third_party/blink/renderer/core/editing/editing_utilities.cc
@@ -1129,7 +1129,7 @@ bool IsTabHTMLSpanElement(const Node* node) {
// See crbug.com/590369 for details.
node->GetDocument().UpdateStyleAndLayoutTree();
const ComputedStyle* style = node->GetComputedStyle();
- return style && !style->IsCollapsibleWhiteSpace('\t');
+ return style && style->WhiteSpace() == EWhiteSpace::kPre;
}
bool IsTabHTMLSpanElementTextNode(const Node* node) {
diff --git a/chromium/third_party/blink/renderer/core/loader/mixed_content_checker.cc b/chromium/third_party/blink/renderer/core/loader/mixed_content_checker.cc
index f47fd530d54..fffd8ea8e58 100644
--- a/chromium/third_party/blink/renderer/core/loader/mixed_content_checker.cc
+++ b/chromium/third_party/blink/renderer/core/loader/mixed_content_checker.cc
@@ -32,6 +32,8 @@
#include "base/feature_list.h"
#include "base/features.h"
#include "base/metrics/field_trial_params.h"
+#include "build/build_config.h"
+#include "build/chromecast_buildflags.h"
#include "services/network/public/cpp/is_potentially_trustworthy.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "third_party/blink/public/common/features.h"
@@ -452,15 +454,24 @@ bool MixedContentChecker::ShouldBlockFetch(
mojom::blink::InsecureRequestPolicy::kLeaveInsecureRequestsAlone ||
settings->GetStrictMixedContentChecking();
- const bool is_ip_address = GURL(url).HostIsIPAddress();
-
mojom::blink::MixedContentContextType context_type =
MixedContent::ContextTypeFromRequestContext(
request_context, DecideCheckModeForPlugin(settings));
switch (context_type) {
case mojom::blink::MixedContentContextType::kOptionallyBlockable:
- allowed = !strict_mode && !is_ip_address;
+
+#if BUILDFLAG(IS_FUCHSIA) && BUILDFLAG(ENABLE_CAST_RECEIVER)
+ // Fuchsia WebEngine can be configured to allow loading Mixed Content from
+ // an insecure IP address. This is a workaround to revert Fuchsia Cast
+ // Receivers to the behavior before crrev.com/c/4032146.
+ // TODO(crbug.com/1434440): Remove this workaround when there is a better
+ // way to disable blocking Mixed Content with an IP address.
+ allowed = !strict_mode;
+#else
+ allowed = !strict_mode && !GURL(url).HostIsIPAddress();
+#endif // BUILDFLAG(IS_FUCHSIA) && BUILDFLAG(ENABLE_CAST_RECEIVER)
+
if (allowed) {
if (content_settings_client)
content_settings_client->PassiveInsecureContentFound(url);
diff --git a/chromium/third_party/blink/renderer/core/loader/mixed_content_checker_test.cc b/chromium/third_party/blink/renderer/core/loader/mixed_content_checker_test.cc
index d68a8be5c95..4767ae7bc0b 100644
--- a/chromium/third_party/blink/renderer/core/loader/mixed_content_checker_test.cc
+++ b/chromium/third_party/blink/renderer/core/loader/mixed_content_checker_test.cc
@@ -7,6 +7,8 @@
#include <memory>
#include "base/memory/scoped_refptr.h"
+#include "build/build_config.h"
+#include "build/chromecast_buildflags.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h"
@@ -257,12 +259,20 @@ TEST(MixedContentCheckerTest, DetectUpgradeableMixedContent) {
mojo::Remote<mojom::blink::ContentSecurityNotifier> notifier_remote;
notifier_remote.Bind(mock_notifier.BindNewPipeAndPassRemote());
- EXPECT_TRUE(MixedContentChecker::ShouldBlockFetch(
+ const bool blocked = MixedContentChecker::ShouldBlockFetch(
&dummy_page_holder->GetFrame(), mojom::blink::RequestContextType::AUDIO,
network::mojom::blink::IPAddressSpace::kPublic, http_ip_address_audio_url,
ResourceRequest::RedirectStatus::kNoRedirect, http_ip_address_audio_url,
absl::optional<String>(), ReportingDisposition::kSuppressReporting,
- *notifier_remote));
+ *notifier_remote);
+
+#if BUILDFLAG(IS_FUCHSIA) && BUILDFLAG(ENABLE_CAST_RECEIVER)
+ // Mixed Content from an insecure IP address is not blocked for Fuchsia Cast
+ // Receivers.
+ EXPECT_FALSE(blocked);
+#else
+ EXPECT_TRUE(blocked);
+#endif // BUILDFLAG(IS_FUCHSIA) && BUILDFLAG(ENABLE_CAST_RECEIVER)
}
class TestFetchClientSettingsObject : public FetchClientSettingsObject {
diff --git a/chromium/third_party/dawn/src/dawn/native/d3d12/ShaderVisibleDescriptorAllocatorD3D12.cpp b/chromium/third_party/dawn/src/dawn/native/d3d12/ShaderVisibleDescriptorAllocatorD3D12.cpp
index fe99a63ac9d..aedb28ad58a 100644
--- a/chromium/third_party/dawn/src/dawn/native/d3d12/ShaderVisibleDescriptorAllocatorD3D12.cpp
+++ b/chromium/third_party/dawn/src/dawn/native/d3d12/ShaderVisibleDescriptorAllocatorD3D12.cpp
@@ -237,9 +237,11 @@ bool ShaderVisibleDescriptorAllocator::IsLastShaderVisibleHeapInLRUForTesting()
bool ShaderVisibleDescriptorAllocator::IsAllocationStillValid(
const GPUDescriptorHeapAllocation& allocation) const {
- // Consider valid if allocated for the pending submit and the shader visible heaps
- // have not switched over.
- return (allocation.GetLastUsageSerial() > mDevice->GetCompletedCommandSerial() &&
+ // Descriptor allocations are only valid for the serial they were created for and are
+ // re-allocated every submit. For this reason, we view any descriptors allocated prior to the
+ // pending submit as invalid. We must also verify the descriptor heap has not switched (because
+ // a larger descriptor heap was needed).
+ return (allocation.GetLastUsageSerial() == mDevice->GetPendingCommandSerial() &&
allocation.GetHeapSerial() == mHeapSerial);
}
diff --git a/chromium/third_party/devtools-frontend/src/third_party/image_diff/README.chromium b/chromium/third_party/devtools-frontend/src/third_party/image_diff/README.chromium
deleted file mode 100644
index 8451b8e35b7..00000000000
--- a/chromium/third_party/devtools-frontend/src/third_party/image_diff/README.chromium
+++ /dev/null
@@ -1,12 +0,0 @@
-Name: image_diff
-Short Name: image_diff
-URL: https://source.chromium.org/chromium/chromium/src/+/main:tools/imagediff/
-Version: 0
-License: Chromium
-Security Critical: No
-
-Description:
-The image_diff binaries as built by Chromium in `tools/imagediff`.
-
-Local Modifications:
-n/a
diff --git a/chromium/third_party/devtools-frontend/src/third_party/image_diff/linux/image_diff b/chromium/third_party/devtools-frontend/src/third_party/image_diff/linux/image_diff
deleted file mode 100755
index 5417dae0bc3..00000000000
--- a/chromium/third_party/devtools-frontend/src/third_party/image_diff/linux/image_diff
+++ /dev/null
Binary files differ
diff --git a/chromium/third_party/devtools-frontend/src/third_party/image_diff/linux/libbase.so b/chromium/third_party/devtools-frontend/src/third_party/image_diff/linux/libbase.so
deleted file mode 100755
index 26efb69cce1..00000000000
--- a/chromium/third_party/devtools-frontend/src/third_party/image_diff/linux/libbase.so
+++ /dev/null
Binary files differ
diff --git a/chromium/third_party/devtools-frontend/src/third_party/image_diff/linux/libboringssl.so b/chromium/third_party/devtools-frontend/src/third_party/image_diff/linux/libboringssl.so
deleted file mode 100755
index 7851301a35e..00000000000
--- a/chromium/third_party/devtools-frontend/src/third_party/image_diff/linux/libboringssl.so
+++ /dev/null
Binary files differ
diff --git a/chromium/third_party/devtools-frontend/src/third_party/image_diff/linux/libc++.so b/chromium/third_party/devtools-frontend/src/third_party/image_diff/linux/libc++.so
deleted file mode 100755
index 73f0eb090ca..00000000000
--- a/chromium/third_party/devtools-frontend/src/third_party/image_diff/linux/libc++.so
+++ /dev/null
Binary files differ
diff --git a/chromium/third_party/devtools-frontend/src/third_party/image_diff/linux/libchrome_zlib.so b/chromium/third_party/devtools-frontend/src/third_party/image_diff/linux/libchrome_zlib.so
deleted file mode 100755
index 28d77810e92..00000000000
--- a/chromium/third_party/devtools-frontend/src/third_party/image_diff/linux/libchrome_zlib.so
+++ /dev/null
Binary files differ
diff --git a/chromium/third_party/devtools-frontend/src/third_party/image_diff/mac/image_diff b/chromium/third_party/devtools-frontend/src/third_party/image_diff/mac/image_diff
deleted file mode 100755
index 407b65ab987..00000000000
--- a/chromium/third_party/devtools-frontend/src/third_party/image_diff/mac/image_diff
+++ /dev/null
Binary files differ
diff --git a/chromium/third_party/devtools-frontend/src/third_party/image_diff/mac/libc++.dylib b/chromium/third_party/devtools-frontend/src/third_party/image_diff/mac/libc++.dylib
deleted file mode 100755
index 6d45625a791..00000000000
--- a/chromium/third_party/devtools-frontend/src/third_party/image_diff/mac/libc++.dylib
+++ /dev/null
Binary files differ
diff --git a/chromium/third_party/devtools-frontend/src/third_party/image_diff/mac/libchrome_zlib.dylib b/chromium/third_party/devtools-frontend/src/third_party/image_diff/mac/libchrome_zlib.dylib
deleted file mode 100755
index bfef73d7138..00000000000
--- a/chromium/third_party/devtools-frontend/src/third_party/image_diff/mac/libchrome_zlib.dylib
+++ /dev/null
Binary files differ
diff --git a/chromium/third_party/devtools-frontend/src/third_party/image_diff/win32/image_diff.exe b/chromium/third_party/devtools-frontend/src/third_party/image_diff/win32/image_diff.exe
deleted file mode 100644
index e4085f0636c..00000000000
--- a/chromium/third_party/devtools-frontend/src/third_party/image_diff/win32/image_diff.exe
+++ /dev/null
Binary files differ
diff --git a/chromium/third_party/libxml/README.chromium b/chromium/third_party/libxml/README.chromium
index 6d0a1facabe..d1002e2a08e 100644
--- a/chromium/third_party/libxml/README.chromium
+++ b/chromium/third_party/libxml/README.chromium
@@ -19,5 +19,6 @@ Modifications:
in chromium's copy of maldoca. See https://github.com/google/maldoca/issues/87
- Add helper classes in the chromium/ subdirectory.
- Delete various unused files, see chromium/roll.py
+- Cherry picked fix for CVE-2023-29469
This import was generated by the chromium/roll.py script.
diff --git a/chromium/third_party/libxml/linux/doc/Makefile b/chromium/third_party/libxml/linux/doc/Makefile
index 4ab8a0eb13b..b2859bd28a5 100644
--- a/chromium/third_party/libxml/linux/doc/Makefile
+++ b/chromium/third_party/libxml/linux/doc/Makefile
@@ -308,7 +308,7 @@ PYTHON_VERSION = 3.10
RANLIB = ranlib
RDL_CFLAGS =
RDL_LIBS =
-RELDATE = Wed Feb 22 2023
+RELDATE = Thu Apr 20 2023
SED = /usr/bin/sed
SET_MAKE =
SHELL = /bin/sh
diff --git a/chromium/third_party/libxml/linux/doc/devhelp/Makefile b/chromium/third_party/libxml/linux/doc/devhelp/Makefile
index 09140c4cd67..35157eba6d3 100644
--- a/chromium/third_party/libxml/linux/doc/devhelp/Makefile
+++ b/chromium/third_party/libxml/linux/doc/devhelp/Makefile
@@ -247,7 +247,7 @@ PYTHON_VERSION = 3.10
RANLIB = ranlib
RDL_CFLAGS =
RDL_LIBS =
-RELDATE = Wed Feb 22 2023
+RELDATE = Thu Apr 20 2023
SED = /usr/bin/sed
SET_MAKE =
SHELL = /bin/sh
diff --git a/chromium/third_party/libxml/linux/doc/examples/Makefile b/chromium/third_party/libxml/linux/doc/examples/Makefile
index de49a6e20c5..fc3112d9e13 100644
--- a/chromium/third_party/libxml/linux/doc/examples/Makefile
+++ b/chromium/third_party/libxml/linux/doc/examples/Makefile
@@ -339,7 +339,7 @@ PYTHON_VERSION = 3.10
RANLIB = ranlib
RDL_CFLAGS =
RDL_LIBS =
-RELDATE = Wed Feb 22 2023
+RELDATE = Thu Apr 20 2023
SED = /usr/bin/sed
SET_MAKE =
SHELL = /bin/sh
diff --git a/chromium/third_party/libxml/linux/example/Makefile b/chromium/third_party/libxml/linux/example/Makefile
index 64704cce138..12da414dc30 100644
--- a/chromium/third_party/libxml/linux/example/Makefile
+++ b/chromium/third_party/libxml/linux/example/Makefile
@@ -264,7 +264,7 @@ PYTHON_VERSION = 3.10
RANLIB = ranlib
RDL_CFLAGS =
RDL_LIBS =
-RELDATE = Wed Feb 22 2023
+RELDATE = Thu Apr 20 2023
SED = /usr/bin/sed
SET_MAKE =
SHELL = /bin/sh
diff --git a/chromium/third_party/libxml/linux/include/private/Makefile b/chromium/third_party/libxml/linux/include/private/Makefile
index f510bae409b..99296fc2296 100644
--- a/chromium/third_party/libxml/linux/include/private/Makefile
+++ b/chromium/third_party/libxml/linux/include/private/Makefile
@@ -216,7 +216,7 @@ PYTHON_VERSION = 3.10
RANLIB = ranlib
RDL_CFLAGS =
RDL_LIBS =
-RELDATE = Wed Feb 22 2023
+RELDATE = Thu Apr 20 2023
SED = /usr/bin/sed
SET_MAKE =
SHELL = /bin/sh
diff --git a/chromium/third_party/libxml/linux/python/Makefile b/chromium/third_party/libxml/linux/python/Makefile
index e8a0aa098fe..cd842b78e6d 100644
--- a/chromium/third_party/libxml/linux/python/Makefile
+++ b/chromium/third_party/libxml/linux/python/Makefile
@@ -355,7 +355,7 @@ PYTHON_VERSION = 3.10
RANLIB = ranlib
RDL_CFLAGS =
RDL_LIBS =
-RELDATE = Wed Feb 22 2023
+RELDATE = Thu Apr 20 2023
SED = /usr/bin/sed
SET_MAKE =
SHELL = /bin/sh
diff --git a/chromium/third_party/libxml/linux/xstc/Makefile b/chromium/third_party/libxml/linux/xstc/Makefile
index ccb07dc0209..51c32e7a2ef 100644
--- a/chromium/third_party/libxml/linux/xstc/Makefile
+++ b/chromium/third_party/libxml/linux/xstc/Makefile
@@ -216,7 +216,7 @@ PYTHON_VERSION = 3.10
RANLIB = ranlib
RDL_CFLAGS =
RDL_LIBS =
-RELDATE = Wed Feb 22 2023
+RELDATE = Thu Apr 20 2023
SED = /usr/bin/sed
SET_MAKE =
SHELL = /bin/sh
diff --git a/chromium/third_party/libxml/src/dict.c b/chromium/third_party/libxml/src/dict.c
index 13353872434..d0208da1f40 100644
--- a/chromium/third_party/libxml/src/dict.c
+++ b/chromium/third_party/libxml/src/dict.c
@@ -431,7 +431,8 @@ static unsigned long
xmlDictComputeFastKey(const xmlChar *name, int namelen, int seed) {
unsigned long value = seed;
- if (name == NULL) return(0);
+ if ((name == NULL) || (namelen <= 0))
+ return(value);
value += *name;
value <<= 5;
if (namelen > 10) {
diff --git a/chromium/third_party/node/node_modules.tar.gz.sha1 b/chromium/third_party/node/node_modules.tar.gz.sha1
index c6f0b37eddb..b72ff192388 100644
--- a/chromium/third_party/node/node_modules.tar.gz.sha1
+++ b/chromium/third_party/node/node_modules.tar.gz.sha1
@@ -1 +1 @@
-1d482d084b5c76480d40647c4dfab3bbbb68448d
+b70bef7a4f78c27d9e996e6b9c06bfc21d2ec4df
diff --git a/chromium/third_party/node/node_modules/@jridgewell/gen-mapping/LICENSE b/chromium/third_party/node/node_modules/@jridgewell/gen-mapping/LICENSE
new file mode 100644
index 00000000000..352f0715f39
--- /dev/null
+++ b/chromium/third_party/node/node_modules/@jridgewell/gen-mapping/LICENSE
@@ -0,0 +1,19 @@
+Copyright 2022 Justin Ridgewell <jridgewell@google.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/chromium/third_party/node/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.mjs b/chromium/third_party/node/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.mjs
new file mode 100644
index 00000000000..5aeb5ccc98f
--- /dev/null
+++ b/chromium/third_party/node/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.mjs
@@ -0,0 +1,230 @@
+import { SetArray, put } from '@jridgewell/set-array';
+import { encode } from '@jridgewell/sourcemap-codec';
+import { TraceMap, decodedMappings } from '@jridgewell/trace-mapping';
+
+const COLUMN = 0;
+const SOURCES_INDEX = 1;
+const SOURCE_LINE = 2;
+const SOURCE_COLUMN = 3;
+const NAMES_INDEX = 4;
+
+const NO_NAME = -1;
+/**
+ * A low-level API to associate a generated position with an original source position. Line and
+ * column here are 0-based, unlike `addMapping`.
+ */
+let addSegment;
+/**
+ * A high-level API to associate a generated position with an original source position. Line is
+ * 1-based, but column is 0-based, due to legacy behavior in `source-map` library.
+ */
+let addMapping;
+/**
+ * Same as `addSegment`, but will only add the segment if it generates useful information in the
+ * resulting map. This only works correctly if segments are added **in order**, meaning you should
+ * not add a segment with a lower generated line/column than one that came before.
+ */
+let maybeAddSegment;
+/**
+ * Same as `addMapping`, but will only add the mapping if it generates useful information in the
+ * resulting map. This only works correctly if mappings are added **in order**, meaning you should
+ * not add a mapping with a lower generated line/column than one that came before.
+ */
+let maybeAddMapping;
+/**
+ * Adds/removes the content of the source file to the source map.
+ */
+let setSourceContent;
+/**
+ * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects
+ * a sourcemap, or to JSON.stringify.
+ */
+let toDecodedMap;
+/**
+ * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects
+ * a sourcemap, or to JSON.stringify.
+ */
+let toEncodedMap;
+/**
+ * Constructs a new GenMapping, using the already present mappings of the input.
+ */
+let fromMap;
+/**
+ * Returns an array of high-level mapping objects for every recorded segment, which could then be
+ * passed to the `source-map` library.
+ */
+let allMappings;
+// This split declaration is only so that terser can elminiate the static initialization block.
+let addSegmentInternal;
+/**
+ * Provides the state to generate a sourcemap.
+ */
+class GenMapping {
+ constructor({ file, sourceRoot } = {}) {
+ this._names = new SetArray();
+ this._sources = new SetArray();
+ this._sourcesContent = [];
+ this._mappings = [];
+ this.file = file;
+ this.sourceRoot = sourceRoot;
+ }
+}
+(() => {
+ addSegment = (map, genLine, genColumn, source, sourceLine, sourceColumn, name, content) => {
+ return addSegmentInternal(false, map, genLine, genColumn, source, sourceLine, sourceColumn, name, content);
+ };
+ maybeAddSegment = (map, genLine, genColumn, source, sourceLine, sourceColumn, name, content) => {
+ return addSegmentInternal(true, map, genLine, genColumn, source, sourceLine, sourceColumn, name, content);
+ };
+ addMapping = (map, mapping) => {
+ return addMappingInternal(false, map, mapping);
+ };
+ maybeAddMapping = (map, mapping) => {
+ return addMappingInternal(true, map, mapping);
+ };
+ setSourceContent = (map, source, content) => {
+ const { _sources: sources, _sourcesContent: sourcesContent } = map;
+ sourcesContent[put(sources, source)] = content;
+ };
+ toDecodedMap = (map) => {
+ const { file, sourceRoot, _mappings: mappings, _sources: sources, _sourcesContent: sourcesContent, _names: names, } = map;
+ removeEmptyFinalLines(mappings);
+ return {
+ version: 3,
+ file: file || undefined,
+ names: names.array,
+ sourceRoot: sourceRoot || undefined,
+ sources: sources.array,
+ sourcesContent,
+ mappings,
+ };
+ };
+ toEncodedMap = (map) => {
+ const decoded = toDecodedMap(map);
+ return Object.assign(Object.assign({}, decoded), { mappings: encode(decoded.mappings) });
+ };
+ allMappings = (map) => {
+ const out = [];
+ const { _mappings: mappings, _sources: sources, _names: names } = map;
+ for (let i = 0; i < mappings.length; i++) {
+ const line = mappings[i];
+ for (let j = 0; j < line.length; j++) {
+ const seg = line[j];
+ const generated = { line: i + 1, column: seg[COLUMN] };
+ let source = undefined;
+ let original = undefined;
+ let name = undefined;
+ if (seg.length !== 1) {
+ source = sources.array[seg[SOURCES_INDEX]];
+ original = { line: seg[SOURCE_LINE] + 1, column: seg[SOURCE_COLUMN] };
+ if (seg.length === 5)
+ name = names.array[seg[NAMES_INDEX]];
+ }
+ out.push({ generated, source, original, name });
+ }
+ }
+ return out;
+ };
+ fromMap = (input) => {
+ const map = new TraceMap(input);
+ const gen = new GenMapping({ file: map.file, sourceRoot: map.sourceRoot });
+ putAll(gen._names, map.names);
+ putAll(gen._sources, map.sources);
+ gen._sourcesContent = map.sourcesContent || map.sources.map(() => null);
+ gen._mappings = decodedMappings(map);
+ return gen;
+ };
+ // Internal helpers
+ addSegmentInternal = (skipable, map, genLine, genColumn, source, sourceLine, sourceColumn, name, content) => {
+ const { _mappings: mappings, _sources: sources, _sourcesContent: sourcesContent, _names: names, } = map;
+ const line = getLine(mappings, genLine);
+ const index = getColumnIndex(line, genColumn);
+ if (!source) {
+ if (skipable && skipSourceless(line, index))
+ return;
+ return insert(line, index, [genColumn]);
+ }
+ const sourcesIndex = put(sources, source);
+ const namesIndex = name ? put(names, name) : NO_NAME;
+ if (sourcesIndex === sourcesContent.length)
+ sourcesContent[sourcesIndex] = content !== null && content !== void 0 ? content : null;
+ if (skipable && skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex)) {
+ return;
+ }
+ return insert(line, index, name
+ ? [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex]
+ : [genColumn, sourcesIndex, sourceLine, sourceColumn]);
+ };
+})();
+function getLine(mappings, index) {
+ for (let i = mappings.length; i <= index; i++) {
+ mappings[i] = [];
+ }
+ return mappings[index];
+}
+function getColumnIndex(line, genColumn) {
+ let index = line.length;
+ for (let i = index - 1; i >= 0; index = i--) {
+ const current = line[i];
+ if (genColumn >= current[COLUMN])
+ break;
+ }
+ return index;
+}
+function insert(array, index, value) {
+ for (let i = array.length; i > index; i--) {
+ array[i] = array[i - 1];
+ }
+ array[index] = value;
+}
+function removeEmptyFinalLines(mappings) {
+ const { length } = mappings;
+ let len = length;
+ for (let i = len - 1; i >= 0; len = i, i--) {
+ if (mappings[i].length > 0)
+ break;
+ }
+ if (len < length)
+ mappings.length = len;
+}
+function putAll(strarr, array) {
+ for (let i = 0; i < array.length; i++)
+ put(strarr, array[i]);
+}
+function skipSourceless(line, index) {
+ // The start of a line is already sourceless, so adding a sourceless segment to the beginning
+ // doesn't generate any useful information.
+ if (index === 0)
+ return true;
+ const prev = line[index - 1];
+ // If the previous segment is also sourceless, then adding another sourceless segment doesn't
+ // genrate any new information. Else, this segment will end the source/named segment and point to
+ // a sourceless position, which is useful.
+ return prev.length === 1;
+}
+function skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex) {
+ // A source/named segment at the start of a line gives position at that genColumn
+ if (index === 0)
+ return false;
+ const prev = line[index - 1];
+ // If the previous segment is sourceless, then we're transitioning to a source.
+ if (prev.length === 1)
+ return false;
+ // If the previous segment maps to the exact same source position, then this segment doesn't
+ // provide any new position information.
+ return (sourcesIndex === prev[SOURCES_INDEX] &&
+ sourceLine === prev[SOURCE_LINE] &&
+ sourceColumn === prev[SOURCE_COLUMN] &&
+ namesIndex === (prev.length === 5 ? prev[NAMES_INDEX] : NO_NAME));
+}
+function addMappingInternal(skipable, map, mapping) {
+ const { generated, source, original, name, content } = mapping;
+ if (!source) {
+ return addSegmentInternal(skipable, map, generated.line - 1, generated.column, null, null, null, null, null);
+ }
+ const s = source;
+ return addSegmentInternal(skipable, map, generated.line - 1, generated.column, s, original.line - 1, original.column, name, content);
+}
+
+export { GenMapping, addMapping, addSegment, allMappings, fromMap, maybeAddMapping, maybeAddSegment, setSourceContent, toDecodedMap, toEncodedMap };
+//# sourceMappingURL=gen-mapping.mjs.map
diff --git a/chromium/third_party/node/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.umd.js b/chromium/third_party/node/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.umd.js
new file mode 100644
index 00000000000..d9fcf5cff59
--- /dev/null
+++ b/chromium/third_party/node/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.umd.js
@@ -0,0 +1,236 @@
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@jridgewell/set-array'), require('@jridgewell/sourcemap-codec'), require('@jridgewell/trace-mapping')) :
+ typeof define === 'function' && define.amd ? define(['exports', '@jridgewell/set-array', '@jridgewell/sourcemap-codec', '@jridgewell/trace-mapping'], factory) :
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.genMapping = {}, global.setArray, global.sourcemapCodec, global.traceMapping));
+})(this, (function (exports, setArray, sourcemapCodec, traceMapping) { 'use strict';
+
+ const COLUMN = 0;
+ const SOURCES_INDEX = 1;
+ const SOURCE_LINE = 2;
+ const SOURCE_COLUMN = 3;
+ const NAMES_INDEX = 4;
+
+ const NO_NAME = -1;
+ /**
+ * A low-level API to associate a generated position with an original source position. Line and
+ * column here are 0-based, unlike `addMapping`.
+ */
+ exports.addSegment = void 0;
+ /**
+ * A high-level API to associate a generated position with an original source position. Line is
+ * 1-based, but column is 0-based, due to legacy behavior in `source-map` library.
+ */
+ exports.addMapping = void 0;
+ /**
+ * Same as `addSegment`, but will only add the segment if it generates useful information in the
+ * resulting map. This only works correctly if segments are added **in order**, meaning you should
+ * not add a segment with a lower generated line/column than one that came before.
+ */
+ exports.maybeAddSegment = void 0;
+ /**
+ * Same as `addMapping`, but will only add the mapping if it generates useful information in the
+ * resulting map. This only works correctly if mappings are added **in order**, meaning you should
+ * not add a mapping with a lower generated line/column than one that came before.
+ */
+ exports.maybeAddMapping = void 0;
+ /**
+ * Adds/removes the content of the source file to the source map.
+ */
+ exports.setSourceContent = void 0;
+ /**
+ * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects
+ * a sourcemap, or to JSON.stringify.
+ */
+ exports.toDecodedMap = void 0;
+ /**
+ * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects
+ * a sourcemap, or to JSON.stringify.
+ */
+ exports.toEncodedMap = void 0;
+ /**
+ * Constructs a new GenMapping, using the already present mappings of the input.
+ */
+ exports.fromMap = void 0;
+ /**
+ * Returns an array of high-level mapping objects for every recorded segment, which could then be
+ * passed to the `source-map` library.
+ */
+ exports.allMappings = void 0;
+ // This split declaration is only so that terser can elminiate the static initialization block.
+ let addSegmentInternal;
+ /**
+ * Provides the state to generate a sourcemap.
+ */
+ class GenMapping {
+ constructor({ file, sourceRoot } = {}) {
+ this._names = new setArray.SetArray();
+ this._sources = new setArray.SetArray();
+ this._sourcesContent = [];
+ this._mappings = [];
+ this.file = file;
+ this.sourceRoot = sourceRoot;
+ }
+ }
+ (() => {
+ exports.addSegment = (map, genLine, genColumn, source, sourceLine, sourceColumn, name, content) => {
+ return addSegmentInternal(false, map, genLine, genColumn, source, sourceLine, sourceColumn, name, content);
+ };
+ exports.maybeAddSegment = (map, genLine, genColumn, source, sourceLine, sourceColumn, name, content) => {
+ return addSegmentInternal(true, map, genLine, genColumn, source, sourceLine, sourceColumn, name, content);
+ };
+ exports.addMapping = (map, mapping) => {
+ return addMappingInternal(false, map, mapping);
+ };
+ exports.maybeAddMapping = (map, mapping) => {
+ return addMappingInternal(true, map, mapping);
+ };
+ exports.setSourceContent = (map, source, content) => {
+ const { _sources: sources, _sourcesContent: sourcesContent } = map;
+ sourcesContent[setArray.put(sources, source)] = content;
+ };
+ exports.toDecodedMap = (map) => {
+ const { file, sourceRoot, _mappings: mappings, _sources: sources, _sourcesContent: sourcesContent, _names: names, } = map;
+ removeEmptyFinalLines(mappings);
+ return {
+ version: 3,
+ file: file || undefined,
+ names: names.array,
+ sourceRoot: sourceRoot || undefined,
+ sources: sources.array,
+ sourcesContent,
+ mappings,
+ };
+ };
+ exports.toEncodedMap = (map) => {
+ const decoded = exports.toDecodedMap(map);
+ return Object.assign(Object.assign({}, decoded), { mappings: sourcemapCodec.encode(decoded.mappings) });
+ };
+ exports.allMappings = (map) => {
+ const out = [];
+ const { _mappings: mappings, _sources: sources, _names: names } = map;
+ for (let i = 0; i < mappings.length; i++) {
+ const line = mappings[i];
+ for (let j = 0; j < line.length; j++) {
+ const seg = line[j];
+ const generated = { line: i + 1, column: seg[COLUMN] };
+ let source = undefined;
+ let original = undefined;
+ let name = undefined;
+ if (seg.length !== 1) {
+ source = sources.array[seg[SOURCES_INDEX]];
+ original = { line: seg[SOURCE_LINE] + 1, column: seg[SOURCE_COLUMN] };
+ if (seg.length === 5)
+ name = names.array[seg[NAMES_INDEX]];
+ }
+ out.push({ generated, source, original, name });
+ }
+ }
+ return out;
+ };
+ exports.fromMap = (input) => {
+ const map = new traceMapping.TraceMap(input);
+ const gen = new GenMapping({ file: map.file, sourceRoot: map.sourceRoot });
+ putAll(gen._names, map.names);
+ putAll(gen._sources, map.sources);
+ gen._sourcesContent = map.sourcesContent || map.sources.map(() => null);
+ gen._mappings = traceMapping.decodedMappings(map);
+ return gen;
+ };
+ // Internal helpers
+ addSegmentInternal = (skipable, map, genLine, genColumn, source, sourceLine, sourceColumn, name, content) => {
+ const { _mappings: mappings, _sources: sources, _sourcesContent: sourcesContent, _names: names, } = map;
+ const line = getLine(mappings, genLine);
+ const index = getColumnIndex(line, genColumn);
+ if (!source) {
+ if (skipable && skipSourceless(line, index))
+ return;
+ return insert(line, index, [genColumn]);
+ }
+ const sourcesIndex = setArray.put(sources, source);
+ const namesIndex = name ? setArray.put(names, name) : NO_NAME;
+ if (sourcesIndex === sourcesContent.length)
+ sourcesContent[sourcesIndex] = content !== null && content !== void 0 ? content : null;
+ if (skipable && skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex)) {
+ return;
+ }
+ return insert(line, index, name
+ ? [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex]
+ : [genColumn, sourcesIndex, sourceLine, sourceColumn]);
+ };
+ })();
+ function getLine(mappings, index) {
+ for (let i = mappings.length; i <= index; i++) {
+ mappings[i] = [];
+ }
+ return mappings[index];
+ }
+ function getColumnIndex(line, genColumn) {
+ let index = line.length;
+ for (let i = index - 1; i >= 0; index = i--) {
+ const current = line[i];
+ if (genColumn >= current[COLUMN])
+ break;
+ }
+ return index;
+ }
+ function insert(array, index, value) {
+ for (let i = array.length; i > index; i--) {
+ array[i] = array[i - 1];
+ }
+ array[index] = value;
+ }
+ function removeEmptyFinalLines(mappings) {
+ const { length } = mappings;
+ let len = length;
+ for (let i = len - 1; i >= 0; len = i, i--) {
+ if (mappings[i].length > 0)
+ break;
+ }
+ if (len < length)
+ mappings.length = len;
+ }
+ function putAll(strarr, array) {
+ for (let i = 0; i < array.length; i++)
+ setArray.put(strarr, array[i]);
+ }
+ function skipSourceless(line, index) {
+ // The start of a line is already sourceless, so adding a sourceless segment to the beginning
+ // doesn't generate any useful information.
+ if (index === 0)
+ return true;
+ const prev = line[index - 1];
+ // If the previous segment is also sourceless, then adding another sourceless segment doesn't
+ // genrate any new information. Else, this segment will end the source/named segment and point to
+ // a sourceless position, which is useful.
+ return prev.length === 1;
+ }
+ function skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex) {
+ // A source/named segment at the start of a line gives position at that genColumn
+ if (index === 0)
+ return false;
+ const prev = line[index - 1];
+ // If the previous segment is sourceless, then we're transitioning to a source.
+ if (prev.length === 1)
+ return false;
+ // If the previous segment maps to the exact same source position, then this segment doesn't
+ // provide any new position information.
+ return (sourcesIndex === prev[SOURCES_INDEX] &&
+ sourceLine === prev[SOURCE_LINE] &&
+ sourceColumn === prev[SOURCE_COLUMN] &&
+ namesIndex === (prev.length === 5 ? prev[NAMES_INDEX] : NO_NAME));
+ }
+ function addMappingInternal(skipable, map, mapping) {
+ const { generated, source, original, name, content } = mapping;
+ if (!source) {
+ return addSegmentInternal(skipable, map, generated.line - 1, generated.column, null, null, null, null, null);
+ }
+ const s = source;
+ return addSegmentInternal(skipable, map, generated.line - 1, generated.column, s, original.line - 1, original.column, name, content);
+ }
+
+ exports.GenMapping = GenMapping;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+}));
+//# sourceMappingURL=gen-mapping.umd.js.map
diff --git a/chromium/third_party/node/node_modules/@jridgewell/gen-mapping/package.json b/chromium/third_party/node/node_modules/@jridgewell/gen-mapping/package.json
new file mode 100644
index 00000000000..4934de5c7b0
--- /dev/null
+++ b/chromium/third_party/node/node_modules/@jridgewell/gen-mapping/package.json
@@ -0,0 +1,78 @@
+{
+ "name": "@jridgewell/gen-mapping",
+ "version": "0.3.2",
+ "description": "Generate source maps",
+ "keywords": [
+ "source",
+ "map"
+ ],
+ "author": "Justin Ridgewell <justin@ridgewell.name>",
+ "license": "MIT",
+ "repository": "https://github.com/jridgewell/gen-mapping",
+ "main": "dist/gen-mapping.umd.js",
+ "module": "dist/gen-mapping.mjs",
+ "typings": "dist/types/gen-mapping.d.ts",
+ "exports": {
+ ".": [
+ {
+ "types": "./dist/types/gen-mapping.d.ts",
+ "browser": "./dist/gen-mapping.umd.js",
+ "require": "./dist/gen-mapping.umd.js",
+ "import": "./dist/gen-mapping.mjs"
+ },
+ "./dist/gen-mapping.umd.js"
+ ],
+ "./package.json": "./package.json"
+ },
+ "files": [
+ "dist",
+ "src"
+ ],
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "scripts": {
+ "benchmark": "run-s build:rollup benchmark:*",
+ "benchmark:install": "cd benchmark && npm install",
+ "benchmark:only": "node benchmark/index.mjs",
+ "prebuild": "rm -rf dist",
+ "build": "run-s -n build:*",
+ "build:rollup": "rollup -c rollup.config.js",
+ "build:ts": "tsc --project tsconfig.build.json",
+ "lint": "run-s -n lint:*",
+ "lint:prettier": "npm run test:lint:prettier -- --write",
+ "lint:ts": "npm run test:lint:ts -- --fix",
+ "pretest": "run-s build:rollup",
+ "test": "run-s -n test:lint test:coverage",
+ "test:debug": "mocha --inspect-brk",
+ "test:lint": "run-s -n test:lint:*",
+ "test:lint:prettier": "prettier --check '{src,test}/**/*.ts'",
+ "test:lint:ts": "eslint '{src,test}/**/*.ts'",
+ "test:only": "mocha",
+ "test:coverage": "c8 mocha",
+ "test:watch": "run-p 'build:rollup -- --watch' 'test:only -- --watch'",
+ "prepublishOnly": "npm run preversion",
+ "preversion": "run-s test build"
+ },
+ "devDependencies": {
+ "@rollup/plugin-typescript": "8.3.2",
+ "@types/mocha": "9.1.1",
+ "@types/node": "17.0.29",
+ "@typescript-eslint/eslint-plugin": "5.21.0",
+ "@typescript-eslint/parser": "5.21.0",
+ "benchmark": "2.1.4",
+ "c8": "7.11.2",
+ "eslint": "8.14.0",
+ "eslint-config-prettier": "8.5.0",
+ "mocha": "9.2.2",
+ "npm-run-all": "4.1.5",
+ "prettier": "2.6.2",
+ "rollup": "2.70.2",
+ "typescript": "4.6.3"
+ },
+ "dependencies": {
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+}
diff --git a/chromium/third_party/node/node_modules/@jridgewell/resolve-uri/LICENSE b/chromium/third_party/node/node_modules/@jridgewell/resolve-uri/LICENSE
new file mode 100644
index 00000000000..0a81b2ade1c
--- /dev/null
+++ b/chromium/third_party/node/node_modules/@jridgewell/resolve-uri/LICENSE
@@ -0,0 +1,19 @@
+Copyright 2019 Justin Ridgewell <jridgewell@google.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE. \ No newline at end of file
diff --git a/chromium/third_party/node/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.mjs b/chromium/third_party/node/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.mjs
new file mode 100644
index 00000000000..94d8dceb931
--- /dev/null
+++ b/chromium/third_party/node/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.mjs
@@ -0,0 +1,242 @@
+// Matches the scheme of a URL, eg "http://"
+const schemeRegex = /^[\w+.-]+:\/\//;
+/**
+ * Matches the parts of a URL:
+ * 1. Scheme, including ":", guaranteed.
+ * 2. User/password, including "@", optional.
+ * 3. Host, guaranteed.
+ * 4. Port, including ":", optional.
+ * 5. Path, including "/", optional.
+ * 6. Query, including "?", optional.
+ * 7. Hash, including "#", optional.
+ */
+const urlRegex = /^([\w+.-]+:)\/\/([^@/#?]*@)?([^:/#?]*)(:\d+)?(\/[^#?]*)?(\?[^#]*)?(#.*)?/;
+/**
+ * File URLs are weird. They dont' need the regular `//` in the scheme, they may or may not start
+ * with a leading `/`, they can have a domain (but only if they don't start with a Windows drive).
+ *
+ * 1. Host, optional.
+ * 2. Path, which may include "/", guaranteed.
+ * 3. Query, including "?", optional.
+ * 4. Hash, including "#", optional.
+ */
+const fileRegex = /^file:(?:\/\/((?![a-z]:)[^/#?]*)?)?(\/?[^#?]*)(\?[^#]*)?(#.*)?/i;
+var UrlType;
+(function (UrlType) {
+ UrlType[UrlType["Empty"] = 1] = "Empty";
+ UrlType[UrlType["Hash"] = 2] = "Hash";
+ UrlType[UrlType["Query"] = 3] = "Query";
+ UrlType[UrlType["RelativePath"] = 4] = "RelativePath";
+ UrlType[UrlType["AbsolutePath"] = 5] = "AbsolutePath";
+ UrlType[UrlType["SchemeRelative"] = 6] = "SchemeRelative";
+ UrlType[UrlType["Absolute"] = 7] = "Absolute";
+})(UrlType || (UrlType = {}));
+function isAbsoluteUrl(input) {
+ return schemeRegex.test(input);
+}
+function isSchemeRelativeUrl(input) {
+ return input.startsWith('//');
+}
+function isAbsolutePath(input) {
+ return input.startsWith('/');
+}
+function isFileUrl(input) {
+ return input.startsWith('file:');
+}
+function isRelative(input) {
+ return /^[.?#]/.test(input);
+}
+function parseAbsoluteUrl(input) {
+ const match = urlRegex.exec(input);
+ return makeUrl(match[1], match[2] || '', match[3], match[4] || '', match[5] || '/', match[6] || '', match[7] || '');
+}
+function parseFileUrl(input) {
+ const match = fileRegex.exec(input);
+ const path = match[2];
+ return makeUrl('file:', '', match[1] || '', '', isAbsolutePath(path) ? path : '/' + path, match[3] || '', match[4] || '');
+}
+function makeUrl(scheme, user, host, port, path, query, hash) {
+ return {
+ scheme,
+ user,
+ host,
+ port,
+ path,
+ query,
+ hash,
+ type: UrlType.Absolute,
+ };
+}
+function parseUrl(input) {
+ if (isSchemeRelativeUrl(input)) {
+ const url = parseAbsoluteUrl('http:' + input);
+ url.scheme = '';
+ url.type = UrlType.SchemeRelative;
+ return url;
+ }
+ if (isAbsolutePath(input)) {
+ const url = parseAbsoluteUrl('http://foo.com' + input);
+ url.scheme = '';
+ url.host = '';
+ url.type = UrlType.AbsolutePath;
+ return url;
+ }
+ if (isFileUrl(input))
+ return parseFileUrl(input);
+ if (isAbsoluteUrl(input))
+ return parseAbsoluteUrl(input);
+ const url = parseAbsoluteUrl('http://foo.com/' + input);
+ url.scheme = '';
+ url.host = '';
+ url.type = input
+ ? input.startsWith('?')
+ ? UrlType.Query
+ : input.startsWith('#')
+ ? UrlType.Hash
+ : UrlType.RelativePath
+ : UrlType.Empty;
+ return url;
+}
+function stripPathFilename(path) {
+ // If a path ends with a parent directory "..", then it's a relative path with excess parent
+ // paths. It's not a file, so we can't strip it.
+ if (path.endsWith('/..'))
+ return path;
+ const index = path.lastIndexOf('/');
+ return path.slice(0, index + 1);
+}
+function mergePaths(url, base) {
+ normalizePath(base, base.type);
+ // If the path is just a "/", then it was an empty path to begin with (remember, we're a relative
+ // path).
+ if (url.path === '/') {
+ url.path = base.path;
+ }
+ else {
+ // Resolution happens relative to the base path's directory, not the file.
+ url.path = stripPathFilename(base.path) + url.path;
+ }
+}
+/**
+ * The path can have empty directories "//", unneeded parents "foo/..", or current directory
+ * "foo/.". We need to normalize to a standard representation.
+ */
+function normalizePath(url, type) {
+ const rel = type <= UrlType.RelativePath;
+ const pieces = url.path.split('/');
+ // We need to preserve the first piece always, so that we output a leading slash. The item at
+ // pieces[0] is an empty string.
+ let pointer = 1;
+ // Positive is the number of real directories we've output, used for popping a parent directory.
+ // Eg, "foo/bar/.." will have a positive 2, and we can decrement to be left with just "foo".
+ let positive = 0;
+ // We need to keep a trailing slash if we encounter an empty directory (eg, splitting "foo/" will
+ // generate `["foo", ""]` pieces). And, if we pop a parent directory. But once we encounter a
+ // real directory, we won't need to append, unless the other conditions happen again.
+ let addTrailingSlash = false;
+ for (let i = 1; i < pieces.length; i++) {
+ const piece = pieces[i];
+ // An empty directory, could be a trailing slash, or just a double "//" in the path.
+ if (!piece) {
+ addTrailingSlash = true;
+ continue;
+ }
+ // If we encounter a real directory, then we don't need to append anymore.
+ addTrailingSlash = false;
+ // A current directory, which we can always drop.
+ if (piece === '.')
+ continue;
+ // A parent directory, we need to see if there are any real directories we can pop. Else, we
+ // have an excess of parents, and we'll need to keep the "..".
+ if (piece === '..') {
+ if (positive) {
+ addTrailingSlash = true;
+ positive--;
+ pointer--;
+ }
+ else if (rel) {
+ // If we're in a relativePath, then we need to keep the excess parents. Else, in an absolute
+ // URL, protocol relative URL, or an absolute path, we don't need to keep excess.
+ pieces[pointer++] = piece;
+ }
+ continue;
+ }
+ // We've encountered a real directory. Move it to the next insertion pointer, which accounts for
+ // any popped or dropped directories.
+ pieces[pointer++] = piece;
+ positive++;
+ }
+ let path = '';
+ for (let i = 1; i < pointer; i++) {
+ path += '/' + pieces[i];
+ }
+ if (!path || (addTrailingSlash && !path.endsWith('/..'))) {
+ path += '/';
+ }
+ url.path = path;
+}
+/**
+ * Attempts to resolve `input` URL/path relative to `base`.
+ */
+function resolve(input, base) {
+ if (!input && !base)
+ return '';
+ const url = parseUrl(input);
+ let inputType = url.type;
+ if (base && inputType !== UrlType.Absolute) {
+ const baseUrl = parseUrl(base);
+ const baseType = baseUrl.type;
+ switch (inputType) {
+ case UrlType.Empty:
+ url.hash = baseUrl.hash;
+ // fall through
+ case UrlType.Hash:
+ url.query = baseUrl.query;
+ // fall through
+ case UrlType.Query:
+ case UrlType.RelativePath:
+ mergePaths(url, baseUrl);
+ // fall through
+ case UrlType.AbsolutePath:
+ // The host, user, and port are joined, you can't copy one without the others.
+ url.user = baseUrl.user;
+ url.host = baseUrl.host;
+ url.port = baseUrl.port;
+ // fall through
+ case UrlType.SchemeRelative:
+ // The input doesn't have a schema at least, so we need to copy at least that over.
+ url.scheme = baseUrl.scheme;
+ }
+ if (baseType > inputType)
+ inputType = baseType;
+ }
+ normalizePath(url, inputType);
+ const queryHash = url.query + url.hash;
+ switch (inputType) {
+ // This is impossible, because of the empty checks at the start of the function.
+ // case UrlType.Empty:
+ case UrlType.Hash:
+ case UrlType.Query:
+ return queryHash;
+ case UrlType.RelativePath: {
+ // The first char is always a "/", and we need it to be relative.
+ const path = url.path.slice(1);
+ if (!path)
+ return queryHash || '.';
+ if (isRelative(base || input) && !isRelative(path)) {
+ // If base started with a leading ".", or there is no base and input started with a ".",
+ // then we need to ensure that the relative path starts with a ".". We don't know if
+ // relative starts with a "..", though, so check before prepending.
+ return './' + path + queryHash;
+ }
+ return path + queryHash;
+ }
+ case UrlType.AbsolutePath:
+ return url.path + queryHash;
+ default:
+ return url.scheme + '//' + url.user + url.host + url.port + url.path + queryHash;
+ }
+}
+
+export { resolve as default };
+//# sourceMappingURL=resolve-uri.mjs.map
diff --git a/chromium/third_party/node/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js b/chromium/third_party/node/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js
new file mode 100644
index 00000000000..0700a2d60ce
--- /dev/null
+++ b/chromium/third_party/node/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js
@@ -0,0 +1,250 @@
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+ typeof define === 'function' && define.amd ? define(factory) :
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.resolveURI = factory());
+})(this, (function () { 'use strict';
+
+ // Matches the scheme of a URL, eg "http://"
+ const schemeRegex = /^[\w+.-]+:\/\//;
+ /**
+ * Matches the parts of a URL:
+ * 1. Scheme, including ":", guaranteed.
+ * 2. User/password, including "@", optional.
+ * 3. Host, guaranteed.
+ * 4. Port, including ":", optional.
+ * 5. Path, including "/", optional.
+ * 6. Query, including "?", optional.
+ * 7. Hash, including "#", optional.
+ */
+ const urlRegex = /^([\w+.-]+:)\/\/([^@/#?]*@)?([^:/#?]*)(:\d+)?(\/[^#?]*)?(\?[^#]*)?(#.*)?/;
+ /**
+ * File URLs are weird. They dont' need the regular `//` in the scheme, they may or may not start
+ * with a leading `/`, they can have a domain (but only if they don't start with a Windows drive).
+ *
+ * 1. Host, optional.
+ * 2. Path, which may include "/", guaranteed.
+ * 3. Query, including "?", optional.
+ * 4. Hash, including "#", optional.
+ */
+ const fileRegex = /^file:(?:\/\/((?![a-z]:)[^/#?]*)?)?(\/?[^#?]*)(\?[^#]*)?(#.*)?/i;
+ var UrlType;
+ (function (UrlType) {
+ UrlType[UrlType["Empty"] = 1] = "Empty";
+ UrlType[UrlType["Hash"] = 2] = "Hash";
+ UrlType[UrlType["Query"] = 3] = "Query";
+ UrlType[UrlType["RelativePath"] = 4] = "RelativePath";
+ UrlType[UrlType["AbsolutePath"] = 5] = "AbsolutePath";
+ UrlType[UrlType["SchemeRelative"] = 6] = "SchemeRelative";
+ UrlType[UrlType["Absolute"] = 7] = "Absolute";
+ })(UrlType || (UrlType = {}));
+ function isAbsoluteUrl(input) {
+ return schemeRegex.test(input);
+ }
+ function isSchemeRelativeUrl(input) {
+ return input.startsWith('//');
+ }
+ function isAbsolutePath(input) {
+ return input.startsWith('/');
+ }
+ function isFileUrl(input) {
+ return input.startsWith('file:');
+ }
+ function isRelative(input) {
+ return /^[.?#]/.test(input);
+ }
+ function parseAbsoluteUrl(input) {
+ const match = urlRegex.exec(input);
+ return makeUrl(match[1], match[2] || '', match[3], match[4] || '', match[5] || '/', match[6] || '', match[7] || '');
+ }
+ function parseFileUrl(input) {
+ const match = fileRegex.exec(input);
+ const path = match[2];
+ return makeUrl('file:', '', match[1] || '', '', isAbsolutePath(path) ? path : '/' + path, match[3] || '', match[4] || '');
+ }
+ function makeUrl(scheme, user, host, port, path, query, hash) {
+ return {
+ scheme,
+ user,
+ host,
+ port,
+ path,
+ query,
+ hash,
+ type: UrlType.Absolute,
+ };
+ }
+ function parseUrl(input) {
+ if (isSchemeRelativeUrl(input)) {
+ const url = parseAbsoluteUrl('http:' + input);
+ url.scheme = '';
+ url.type = UrlType.SchemeRelative;
+ return url;
+ }
+ if (isAbsolutePath(input)) {
+ const url = parseAbsoluteUrl('http://foo.com' + input);
+ url.scheme = '';
+ url.host = '';
+ url.type = UrlType.AbsolutePath;
+ return url;
+ }
+ if (isFileUrl(input))
+ return parseFileUrl(input);
+ if (isAbsoluteUrl(input))
+ return parseAbsoluteUrl(input);
+ const url = parseAbsoluteUrl('http://foo.com/' + input);
+ url.scheme = '';
+ url.host = '';
+ url.type = input
+ ? input.startsWith('?')
+ ? UrlType.Query
+ : input.startsWith('#')
+ ? UrlType.Hash
+ : UrlType.RelativePath
+ : UrlType.Empty;
+ return url;
+ }
+ function stripPathFilename(path) {
+ // If a path ends with a parent directory "..", then it's a relative path with excess parent
+ // paths. It's not a file, so we can't strip it.
+ if (path.endsWith('/..'))
+ return path;
+ const index = path.lastIndexOf('/');
+ return path.slice(0, index + 1);
+ }
+ function mergePaths(url, base) {
+ normalizePath(base, base.type);
+ // If the path is just a "/", then it was an empty path to begin with (remember, we're a relative
+ // path).
+ if (url.path === '/') {
+ url.path = base.path;
+ }
+ else {
+ // Resolution happens relative to the base path's directory, not the file.
+ url.path = stripPathFilename(base.path) + url.path;
+ }
+ }
+ /**
+ * The path can have empty directories "//", unneeded parents "foo/..", or current directory
+ * "foo/.". We need to normalize to a standard representation.
+ */
+ function normalizePath(url, type) {
+ const rel = type <= UrlType.RelativePath;
+ const pieces = url.path.split('/');
+ // We need to preserve the first piece always, so that we output a leading slash. The item at
+ // pieces[0] is an empty string.
+ let pointer = 1;
+ // Positive is the number of real directories we've output, used for popping a parent directory.
+ // Eg, "foo/bar/.." will have a positive 2, and we can decrement to be left with just "foo".
+ let positive = 0;
+ // We need to keep a trailing slash if we encounter an empty directory (eg, splitting "foo/" will
+ // generate `["foo", ""]` pieces). And, if we pop a parent directory. But once we encounter a
+ // real directory, we won't need to append, unless the other conditions happen again.
+ let addTrailingSlash = false;
+ for (let i = 1; i < pieces.length; i++) {
+ const piece = pieces[i];
+ // An empty directory, could be a trailing slash, or just a double "//" in the path.
+ if (!piece) {
+ addTrailingSlash = true;
+ continue;
+ }
+ // If we encounter a real directory, then we don't need to append anymore.
+ addTrailingSlash = false;
+ // A current directory, which we can always drop.
+ if (piece === '.')
+ continue;
+ // A parent directory, we need to see if there are any real directories we can pop. Else, we
+ // have an excess of parents, and we'll need to keep the "..".
+ if (piece === '..') {
+ if (positive) {
+ addTrailingSlash = true;
+ positive--;
+ pointer--;
+ }
+ else if (rel) {
+ // If we're in a relativePath, then we need to keep the excess parents. Else, in an absolute
+ // URL, protocol relative URL, or an absolute path, we don't need to keep excess.
+ pieces[pointer++] = piece;
+ }
+ continue;
+ }
+ // We've encountered a real directory. Move it to the next insertion pointer, which accounts for
+ // any popped or dropped directories.
+ pieces[pointer++] = piece;
+ positive++;
+ }
+ let path = '';
+ for (let i = 1; i < pointer; i++) {
+ path += '/' + pieces[i];
+ }
+ if (!path || (addTrailingSlash && !path.endsWith('/..'))) {
+ path += '/';
+ }
+ url.path = path;
+ }
+ /**
+ * Attempts to resolve `input` URL/path relative to `base`.
+ */
+ function resolve(input, base) {
+ if (!input && !base)
+ return '';
+ const url = parseUrl(input);
+ let inputType = url.type;
+ if (base && inputType !== UrlType.Absolute) {
+ const baseUrl = parseUrl(base);
+ const baseType = baseUrl.type;
+ switch (inputType) {
+ case UrlType.Empty:
+ url.hash = baseUrl.hash;
+ // fall through
+ case UrlType.Hash:
+ url.query = baseUrl.query;
+ // fall through
+ case UrlType.Query:
+ case UrlType.RelativePath:
+ mergePaths(url, baseUrl);
+ // fall through
+ case UrlType.AbsolutePath:
+ // The host, user, and port are joined, you can't copy one without the others.
+ url.user = baseUrl.user;
+ url.host = baseUrl.host;
+ url.port = baseUrl.port;
+ // fall through
+ case UrlType.SchemeRelative:
+ // The input doesn't have a schema at least, so we need to copy at least that over.
+ url.scheme = baseUrl.scheme;
+ }
+ if (baseType > inputType)
+ inputType = baseType;
+ }
+ normalizePath(url, inputType);
+ const queryHash = url.query + url.hash;
+ switch (inputType) {
+ // This is impossible, because of the empty checks at the start of the function.
+ // case UrlType.Empty:
+ case UrlType.Hash:
+ case UrlType.Query:
+ return queryHash;
+ case UrlType.RelativePath: {
+ // The first char is always a "/", and we need it to be relative.
+ const path = url.path.slice(1);
+ if (!path)
+ return queryHash || '.';
+ if (isRelative(base || input) && !isRelative(path)) {
+ // If base started with a leading ".", or there is no base and input started with a ".",
+ // then we need to ensure that the relative path starts with a ".". We don't know if
+ // relative starts with a "..", though, so check before prepending.
+ return './' + path + queryHash;
+ }
+ return path + queryHash;
+ }
+ case UrlType.AbsolutePath:
+ return url.path + queryHash;
+ default:
+ return url.scheme + '//' + url.user + url.host + url.port + url.path + queryHash;
+ }
+ }
+
+ return resolve;
+
+}));
+//# sourceMappingURL=resolve-uri.umd.js.map
diff --git a/chromium/third_party/node/node_modules/@jridgewell/resolve-uri/package.json b/chromium/third_party/node/node_modules/@jridgewell/resolve-uri/package.json
new file mode 100644
index 00000000000..114937a0067
--- /dev/null
+++ b/chromium/third_party/node/node_modules/@jridgewell/resolve-uri/package.json
@@ -0,0 +1,69 @@
+{
+ "name": "@jridgewell/resolve-uri",
+ "version": "3.1.0",
+ "description": "Resolve a URI relative to an optional base URI",
+ "keywords": [
+ "resolve",
+ "uri",
+ "url",
+ "path"
+ ],
+ "author": "Justin Ridgewell <justin@ridgewell.name>",
+ "license": "MIT",
+ "repository": "https://github.com/jridgewell/resolve-uri",
+ "main": "dist/resolve-uri.umd.js",
+ "module": "dist/resolve-uri.mjs",
+ "typings": "dist/types/resolve-uri.d.ts",
+ "exports": {
+ ".": [
+ {
+ "types": "./dist/types/resolve-uri.d.ts",
+ "browser": "./dist/resolve-uri.umd.js",
+ "require": "./dist/resolve-uri.umd.js",
+ "import": "./dist/resolve-uri.mjs"
+ },
+ "./dist/resolve-uri.umd.js"
+ ],
+ "./package.json": "./package.json"
+ },
+ "files": [
+ "dist"
+ ],
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "scripts": {
+ "prebuild": "rm -rf dist",
+ "build": "run-s -n build:*",
+ "build:rollup": "rollup -c rollup.config.js",
+ "build:ts": "tsc --project tsconfig.build.json",
+ "lint": "run-s -n lint:*",
+ "lint:prettier": "npm run test:lint:prettier -- --write",
+ "lint:ts": "npm run test:lint:ts -- --fix",
+ "pretest": "run-s build:rollup",
+ "test": "run-s -n test:lint test:only",
+ "test:debug": "mocha --inspect-brk",
+ "test:lint": "run-s -n test:lint:*",
+ "test:lint:prettier": "prettier --check '{src,test}/**/*.ts'",
+ "test:lint:ts": "eslint '{src,test}/**/*.ts'",
+ "test:only": "mocha",
+ "test:coverage": "c8 mocha",
+ "test:watch": "mocha --watch",
+ "prepublishOnly": "npm run preversion",
+ "preversion": "run-s test build"
+ },
+ "devDependencies": {
+ "@jridgewell/resolve-uri-latest": "npm:@jridgewell/resolve-uri@*",
+ "@rollup/plugin-typescript": "8.3.0",
+ "@typescript-eslint/eslint-plugin": "5.10.0",
+ "@typescript-eslint/parser": "5.10.0",
+ "c8": "7.11.0",
+ "eslint": "8.7.0",
+ "eslint-config-prettier": "8.3.0",
+ "mocha": "9.2.0",
+ "npm-run-all": "4.1.5",
+ "prettier": "2.5.1",
+ "rollup": "2.66.0",
+ "typescript": "4.5.5"
+ }
+}
diff --git a/chromium/third_party/node/node_modules/@jridgewell/set-array/LICENSE b/chromium/third_party/node/node_modules/@jridgewell/set-array/LICENSE
new file mode 100644
index 00000000000..352f0715f39
--- /dev/null
+++ b/chromium/third_party/node/node_modules/@jridgewell/set-array/LICENSE
@@ -0,0 +1,19 @@
+Copyright 2022 Justin Ridgewell <jridgewell@google.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/chromium/third_party/node/node_modules/@jridgewell/set-array/dist/set-array.mjs b/chromium/third_party/node/node_modules/@jridgewell/set-array/dist/set-array.mjs
new file mode 100644
index 00000000000..b7f1a9cc688
--- /dev/null
+++ b/chromium/third_party/node/node_modules/@jridgewell/set-array/dist/set-array.mjs
@@ -0,0 +1,48 @@
+/**
+ * Gets the index associated with `key` in the backing array, if it is already present.
+ */
+let get;
+/**
+ * Puts `key` into the backing array, if it is not already present. Returns
+ * the index of the `key` in the backing array.
+ */
+let put;
+/**
+ * Pops the last added item out of the SetArray.
+ */
+let pop;
+/**
+ * SetArray acts like a `Set` (allowing only one occurrence of a string `key`), but provides the
+ * index of the `key` in the backing array.
+ *
+ * This is designed to allow synchronizing a second array with the contents of the backing array,
+ * like how in a sourcemap `sourcesContent[i]` is the source content associated with `source[i]`,
+ * and there are never duplicates.
+ */
+class SetArray {
+ constructor() {
+ this._indexes = { __proto__: null };
+ this.array = [];
+ }
+}
+(() => {
+ get = (strarr, key) => strarr._indexes[key];
+ put = (strarr, key) => {
+ // The key may or may not be present. If it is present, it's a number.
+ const index = get(strarr, key);
+ if (index !== undefined)
+ return index;
+ const { array, _indexes: indexes } = strarr;
+ return (indexes[key] = array.push(key) - 1);
+ };
+ pop = (strarr) => {
+ const { array, _indexes: indexes } = strarr;
+ if (array.length === 0)
+ return;
+ const last = array.pop();
+ indexes[last] = undefined;
+ };
+})();
+
+export { SetArray, get, pop, put };
+//# sourceMappingURL=set-array.mjs.map
diff --git a/chromium/third_party/node/node_modules/@jridgewell/set-array/dist/set-array.umd.js b/chromium/third_party/node/node_modules/@jridgewell/set-array/dist/set-array.umd.js
new file mode 100644
index 00000000000..a1c200a1cb7
--- /dev/null
+++ b/chromium/third_party/node/node_modules/@jridgewell/set-array/dist/set-array.umd.js
@@ -0,0 +1,58 @@
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+ typeof define === 'function' && define.amd ? define(['exports'], factory) :
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.setArray = {}));
+})(this, (function (exports) { 'use strict';
+
+ /**
+ * Gets the index associated with `key` in the backing array, if it is already present.
+ */
+ exports.get = void 0;
+ /**
+ * Puts `key` into the backing array, if it is not already present. Returns
+ * the index of the `key` in the backing array.
+ */
+ exports.put = void 0;
+ /**
+ * Pops the last added item out of the SetArray.
+ */
+ exports.pop = void 0;
+ /**
+ * SetArray acts like a `Set` (allowing only one occurrence of a string `key`), but provides the
+ * index of the `key` in the backing array.
+ *
+ * This is designed to allow synchronizing a second array with the contents of the backing array,
+ * like how in a sourcemap `sourcesContent[i]` is the source content associated with `source[i]`,
+ * and there are never duplicates.
+ */
+ class SetArray {
+ constructor() {
+ this._indexes = { __proto__: null };
+ this.array = [];
+ }
+ }
+ (() => {
+ exports.get = (strarr, key) => strarr._indexes[key];
+ exports.put = (strarr, key) => {
+ // The key may or may not be present. If it is present, it's a number.
+ const index = exports.get(strarr, key);
+ if (index !== undefined)
+ return index;
+ const { array, _indexes: indexes } = strarr;
+ return (indexes[key] = array.push(key) - 1);
+ };
+ exports.pop = (strarr) => {
+ const { array, _indexes: indexes } = strarr;
+ if (array.length === 0)
+ return;
+ const last = array.pop();
+ indexes[last] = undefined;
+ };
+ })();
+
+ exports.SetArray = SetArray;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+}));
+//# sourceMappingURL=set-array.umd.js.map
diff --git a/chromium/third_party/node/node_modules/@jridgewell/set-array/package.json b/chromium/third_party/node/node_modules/@jridgewell/set-array/package.json
new file mode 100644
index 00000000000..aec4ee029ef
--- /dev/null
+++ b/chromium/third_party/node/node_modules/@jridgewell/set-array/package.json
@@ -0,0 +1,66 @@
+{
+ "name": "@jridgewell/set-array",
+ "version": "1.1.2",
+ "description": "Like a Set, but provides the index of the `key` in the backing array",
+ "keywords": [],
+ "author": "Justin Ridgewell <justin@ridgewell.name>",
+ "license": "MIT",
+ "repository": "https://github.com/jridgewell/set-array",
+ "main": "dist/set-array.umd.js",
+ "module": "dist/set-array.mjs",
+ "typings": "dist/types/set-array.d.ts",
+ "exports": {
+ ".": [
+ {
+ "types": "./dist/types/set-array.d.ts",
+ "browser": "./dist/set-array.umd.js",
+ "require": "./dist/set-array.umd.js",
+ "import": "./dist/set-array.mjs"
+ },
+ "./dist/set-array.umd.js"
+ ],
+ "./package.json": "./package.json"
+ },
+ "files": [
+ "dist",
+ "src"
+ ],
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "scripts": {
+ "prebuild": "rm -rf dist",
+ "build": "run-s -n build:*",
+ "build:rollup": "rollup -c rollup.config.js",
+ "build:ts": "tsc --project tsconfig.build.json",
+ "lint": "run-s -n lint:*",
+ "lint:prettier": "npm run test:lint:prettier -- --write",
+ "lint:ts": "npm run test:lint:ts -- --fix",
+ "pretest": "run-s build:rollup",
+ "test": "run-s -n test:lint test:only",
+ "test:debug": "mocha --inspect-brk",
+ "test:lint": "run-s -n test:lint:*",
+ "test:lint:prettier": "prettier --check '{src,test}/**/*.ts'",
+ "test:lint:ts": "eslint '{src,test}/**/*.ts'",
+ "test:only": "mocha",
+ "test:coverage": "c8 mocha",
+ "test:watch": "mocha --watch",
+ "prepublishOnly": "npm run preversion",
+ "preversion": "run-s test build"
+ },
+ "devDependencies": {
+ "@rollup/plugin-typescript": "8.3.0",
+ "@types/mocha": "9.1.1",
+ "@types/node": "17.0.29",
+ "@typescript-eslint/eslint-plugin": "5.10.0",
+ "@typescript-eslint/parser": "5.10.0",
+ "c8": "7.11.0",
+ "eslint": "8.7.0",
+ "eslint-config-prettier": "8.3.0",
+ "mocha": "9.2.0",
+ "npm-run-all": "4.1.5",
+ "prettier": "2.5.1",
+ "rollup": "2.66.0",
+ "typescript": "4.5.5"
+ }
+}
diff --git a/chromium/third_party/node/node_modules/@jridgewell/source-map/LICENSE b/chromium/third_party/node/node_modules/@jridgewell/source-map/LICENSE
new file mode 100644
index 00000000000..0a81b2ade1c
--- /dev/null
+++ b/chromium/third_party/node/node_modules/@jridgewell/source-map/LICENSE
@@ -0,0 +1,19 @@
+Copyright 2019 Justin Ridgewell <jridgewell@google.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE. \ No newline at end of file
diff --git a/chromium/third_party/node/node_modules/@jridgewell/source-map/dist/source-map.mjs b/chromium/third_party/node/node_modules/@jridgewell/source-map/dist/source-map.mjs
new file mode 100644
index 00000000000..aa1bc2cbe43
--- /dev/null
+++ b/chromium/third_party/node/node_modules/@jridgewell/source-map/dist/source-map.mjs
@@ -0,0 +1,928 @@
+const comma = ','.charCodeAt(0);
+const semicolon = ';'.charCodeAt(0);
+const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
+const intToChar = new Uint8Array(64); // 64 possible chars.
+const charToInteger = new Uint8Array(128); // z is 122 in ASCII
+for (let i = 0; i < chars.length; i++) {
+ const c = chars.charCodeAt(i);
+ charToInteger[c] = i;
+ intToChar[i] = c;
+}
+// Provide a fallback for older environments.
+const td = typeof TextDecoder !== 'undefined'
+ ? new TextDecoder()
+ : typeof Buffer !== 'undefined'
+ ? {
+ decode(buf) {
+ const out = Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength);
+ return out.toString();
+ },
+ }
+ : {
+ decode(buf) {
+ let out = '';
+ for (let i = 0; i < buf.length; i++) {
+ out += String.fromCharCode(buf[i]);
+ }
+ return out;
+ },
+ };
+function decode(mappings) {
+ const state = new Int32Array(5);
+ const decoded = [];
+ let line = [];
+ let sorted = true;
+ let lastCol = 0;
+ for (let i = 0; i < mappings.length;) {
+ const c = mappings.charCodeAt(i);
+ if (c === comma) {
+ i++;
+ }
+ else if (c === semicolon) {
+ state[0] = lastCol = 0;
+ if (!sorted)
+ sort(line);
+ sorted = true;
+ decoded.push(line);
+ line = [];
+ i++;
+ }
+ else {
+ i = decodeInteger(mappings, i, state, 0); // generatedCodeColumn
+ const col = state[0];
+ if (col < lastCol)
+ sorted = false;
+ lastCol = col;
+ if (!hasMoreSegments(mappings, i)) {
+ line.push([col]);
+ continue;
+ }
+ i = decodeInteger(mappings, i, state, 1); // sourceFileIndex
+ i = decodeInteger(mappings, i, state, 2); // sourceCodeLine
+ i = decodeInteger(mappings, i, state, 3); // sourceCodeColumn
+ if (!hasMoreSegments(mappings, i)) {
+ line.push([col, state[1], state[2], state[3]]);
+ continue;
+ }
+ i = decodeInteger(mappings, i, state, 4); // nameIndex
+ line.push([col, state[1], state[2], state[3], state[4]]);
+ }
+ }
+ if (!sorted)
+ sort(line);
+ decoded.push(line);
+ return decoded;
+}
+function decodeInteger(mappings, pos, state, j) {
+ let value = 0;
+ let shift = 0;
+ let integer = 0;
+ do {
+ const c = mappings.charCodeAt(pos++);
+ integer = charToInteger[c];
+ value |= (integer & 31) << shift;
+ shift += 5;
+ } while (integer & 32);
+ const shouldNegate = value & 1;
+ value >>>= 1;
+ if (shouldNegate) {
+ value = -0x80000000 | -value;
+ }
+ state[j] += value;
+ return pos;
+}
+function hasMoreSegments(mappings, i) {
+ if (i >= mappings.length)
+ return false;
+ const c = mappings.charCodeAt(i);
+ if (c === comma || c === semicolon)
+ return false;
+ return true;
+}
+function sort(line) {
+ line.sort(sortComparator$1);
+}
+function sortComparator$1(a, b) {
+ return a[0] - b[0];
+}
+function encode(decoded) {
+ const state = new Int32Array(5);
+ let buf = new Uint8Array(1024);
+ let pos = 0;
+ for (let i = 0; i < decoded.length; i++) {
+ const line = decoded[i];
+ if (i > 0) {
+ buf = reserve(buf, pos, 1);
+ buf[pos++] = semicolon;
+ }
+ if (line.length === 0)
+ continue;
+ state[0] = 0;
+ for (let j = 0; j < line.length; j++) {
+ const segment = line[j];
+ // We can push up to 5 ints, each int can take at most 7 chars, and we
+ // may push a comma.
+ buf = reserve(buf, pos, 36);
+ if (j > 0)
+ buf[pos++] = comma;
+ pos = encodeInteger(buf, pos, state, segment, 0); // generatedCodeColumn
+ if (segment.length === 1)
+ continue;
+ pos = encodeInteger(buf, pos, state, segment, 1); // sourceFileIndex
+ pos = encodeInteger(buf, pos, state, segment, 2); // sourceCodeLine
+ pos = encodeInteger(buf, pos, state, segment, 3); // sourceCodeColumn
+ if (segment.length === 4)
+ continue;
+ pos = encodeInteger(buf, pos, state, segment, 4); // nameIndex
+ }
+ }
+ return td.decode(buf.subarray(0, pos));
+}
+function reserve(buf, pos, count) {
+ if (buf.length > pos + count)
+ return buf;
+ const swap = new Uint8Array(buf.length * 2);
+ swap.set(buf);
+ return swap;
+}
+function encodeInteger(buf, pos, state, segment, j) {
+ const next = segment[j];
+ let num = next - state[j];
+ state[j] = next;
+ num = num < 0 ? (-num << 1) | 1 : num << 1;
+ do {
+ let clamped = num & 0b011111;
+ num >>>= 5;
+ if (num > 0)
+ clamped |= 0b100000;
+ buf[pos++] = intToChar[clamped];
+ } while (num > 0);
+ return pos;
+}
+
+// Matches the scheme of a URL, eg "http://"
+const schemeRegex = /^[\w+.-]+:\/\//;
+/**
+ * Matches the parts of a URL:
+ * 1. Scheme, including ":", guaranteed.
+ * 2. User/password, including "@", optional.
+ * 3. Host, guaranteed.
+ * 4. Port, including ":", optional.
+ * 5. Path, including "/", optional.
+ */
+const urlRegex = /^([\w+.-]+:)\/\/([^@/#?]*@)?([^:/#?]*)(:\d+)?(\/[^#?]*)?/;
+/**
+ * File URLs are weird. They dont' need the regular `//` in the scheme, they may or may not start
+ * with a leading `/`, they can have a domain (but only if they don't start with a Windows drive).
+ *
+ * 1. Host, optional.
+ * 2. Path, which may inclue "/", guaranteed.
+ */
+const fileRegex = /^file:(?:\/\/((?![a-z]:)[^/]*)?)?(\/?.*)/i;
+function isAbsoluteUrl(input) {
+ return schemeRegex.test(input);
+}
+function isSchemeRelativeUrl(input) {
+ return input.startsWith('//');
+}
+function isAbsolutePath(input) {
+ return input.startsWith('/');
+}
+function isFileUrl(input) {
+ return input.startsWith('file:');
+}
+function parseAbsoluteUrl(input) {
+ const match = urlRegex.exec(input);
+ return makeUrl(match[1], match[2] || '', match[3], match[4] || '', match[5] || '/');
+}
+function parseFileUrl(input) {
+ const match = fileRegex.exec(input);
+ const path = match[2];
+ return makeUrl('file:', '', match[1] || '', '', isAbsolutePath(path) ? path : '/' + path);
+}
+function makeUrl(scheme, user, host, port, path) {
+ return {
+ scheme,
+ user,
+ host,
+ port,
+ path,
+ relativePath: false,
+ };
+}
+function parseUrl(input) {
+ if (isSchemeRelativeUrl(input)) {
+ const url = parseAbsoluteUrl('http:' + input);
+ url.scheme = '';
+ return url;
+ }
+ if (isAbsolutePath(input)) {
+ const url = parseAbsoluteUrl('http://foo.com' + input);
+ url.scheme = '';
+ url.host = '';
+ return url;
+ }
+ if (isFileUrl(input))
+ return parseFileUrl(input);
+ if (isAbsoluteUrl(input))
+ return parseAbsoluteUrl(input);
+ const url = parseAbsoluteUrl('http://foo.com/' + input);
+ url.scheme = '';
+ url.host = '';
+ url.relativePath = true;
+ return url;
+}
+function stripPathFilename(path) {
+ // If a path ends with a parent directory "..", then it's a relative path with excess parent
+ // paths. It's not a file, so we can't strip it.
+ if (path.endsWith('/..'))
+ return path;
+ const index = path.lastIndexOf('/');
+ return path.slice(0, index + 1);
+}
+function mergePaths(url, base) {
+ // If we're not a relative path, then we're an absolute path, and it doesn't matter what base is.
+ if (!url.relativePath)
+ return;
+ normalizePath(base);
+ // If the path is just a "/", then it was an empty path to begin with (remember, we're a relative
+ // path).
+ if (url.path === '/') {
+ url.path = base.path;
+ }
+ else {
+ // Resolution happens relative to the base path's directory, not the file.
+ url.path = stripPathFilename(base.path) + url.path;
+ }
+ // If the base path is absolute, then our path is now absolute too.
+ url.relativePath = base.relativePath;
+}
+/**
+ * The path can have empty directories "//", unneeded parents "foo/..", or current directory
+ * "foo/.". We need to normalize to a standard representation.
+ */
+function normalizePath(url) {
+ const { relativePath } = url;
+ const pieces = url.path.split('/');
+ // We need to preserve the first piece always, so that we output a leading slash. The item at
+ // pieces[0] is an empty string.
+ let pointer = 1;
+ // Positive is the number of real directories we've output, used for popping a parent directory.
+ // Eg, "foo/bar/.." will have a positive 2, and we can decrement to be left with just "foo".
+ let positive = 0;
+ // We need to keep a trailing slash if we encounter an empty directory (eg, splitting "foo/" will
+ // generate `["foo", ""]` pieces). And, if we pop a parent directory. But once we encounter a
+ // real directory, we won't need to append, unless the other conditions happen again.
+ let addTrailingSlash = false;
+ for (let i = 1; i < pieces.length; i++) {
+ const piece = pieces[i];
+ // An empty directory, could be a trailing slash, or just a double "//" in the path.
+ if (!piece) {
+ addTrailingSlash = true;
+ continue;
+ }
+ // If we encounter a real directory, then we don't need to append anymore.
+ addTrailingSlash = false;
+ // A current directory, which we can always drop.
+ if (piece === '.')
+ continue;
+ // A parent directory, we need to see if there are any real directories we can pop. Else, we
+ // have an excess of parents, and we'll need to keep the "..".
+ if (piece === '..') {
+ if (positive) {
+ addTrailingSlash = true;
+ positive--;
+ pointer--;
+ }
+ else if (relativePath) {
+ // If we're in a relativePath, then we need to keep the excess parents. Else, in an absolute
+ // URL, protocol relative URL, or an absolute path, we don't need to keep excess.
+ pieces[pointer++] = piece;
+ }
+ continue;
+ }
+ // We've encountered a real directory. Move it to the next insertion pointer, which accounts for
+ // any popped or dropped directories.
+ pieces[pointer++] = piece;
+ positive++;
+ }
+ let path = '';
+ for (let i = 1; i < pointer; i++) {
+ path += '/' + pieces[i];
+ }
+ if (!path || (addTrailingSlash && !path.endsWith('/..'))) {
+ path += '/';
+ }
+ url.path = path;
+}
+/**
+ * Attempts to resolve `input` URL/path relative to `base`.
+ */
+function resolve$1(input, base) {
+ if (!input && !base)
+ return '';
+ const url = parseUrl(input);
+ // If we have a base, and the input isn't already an absolute URL, then we need to merge.
+ if (base && !url.scheme) {
+ const baseUrl = parseUrl(base);
+ url.scheme = baseUrl.scheme;
+ // If there's no host, then we were just a path.
+ if (!url.host) {
+ // The host, user, and port are joined, you can't copy one without the others.
+ url.user = baseUrl.user;
+ url.host = baseUrl.host;
+ url.port = baseUrl.port;
+ }
+ mergePaths(url, baseUrl);
+ }
+ normalizePath(url);
+ // If the input (and base, if there was one) are both relative, then we need to output a relative.
+ if (url.relativePath) {
+ // The first char is always a "/".
+ const path = url.path.slice(1);
+ if (!path)
+ return '.';
+ // If base started with a leading ".", or there is no base and input started with a ".", then we
+ // need to ensure that the relative path starts with a ".". We don't know if relative starts
+ // with a "..", though, so check before prepending.
+ const keepRelative = (base || input).startsWith('.');
+ return !keepRelative || path.startsWith('.') ? path : './' + path;
+ }
+ // If there's no host (and no scheme/user/port), then we need to output an absolute path.
+ if (!url.scheme && !url.host)
+ return url.path;
+ // We're outputting either an absolute URL, or a protocol relative one.
+ return `${url.scheme}//${url.user}${url.host}${url.port}${url.path}`;
+}
+
+function resolve(input, base) {
+ // The base is always treated as a directory, if it's not empty.
+ // https://github.com/mozilla/source-map/blob/8cb3ee57/lib/util.js#L327
+ // https://github.com/chromium/chromium/blob/da4adbb3/third_party/blink/renderer/devtools/front_end/sdk/SourceMap.js#L400-L401
+ if (base && !base.endsWith('/'))
+ base += '/';
+ return resolve$1(input, base);
+}
+
+/**
+ * Removes everything after the last "/", but leaves the slash.
+ */
+function stripFilename(path) {
+ if (!path)
+ return '';
+ const index = path.lastIndexOf('/');
+ return path.slice(0, index + 1);
+}
+
+const COLUMN$1 = 0;
+const SOURCES_INDEX$1 = 1;
+const SOURCE_LINE$1 = 2;
+const SOURCE_COLUMN$1 = 3;
+const NAMES_INDEX$1 = 4;
+
+function maybeSort(mappings, owned) {
+ const unsortedIndex = nextUnsortedSegmentLine(mappings, 0);
+ if (unsortedIndex === mappings.length)
+ return mappings;
+ // If we own the array (meaning we parsed it from JSON), then we're free to directly mutate it. If
+ // not, we do not want to modify the consumer's input array.
+ if (!owned)
+ mappings = mappings.slice();
+ for (let i = unsortedIndex; i < mappings.length; i = nextUnsortedSegmentLine(mappings, i + 1)) {
+ mappings[i] = sortSegments(mappings[i], owned);
+ }
+ return mappings;
+}
+function nextUnsortedSegmentLine(mappings, start) {
+ for (let i = start; i < mappings.length; i++) {
+ if (!isSorted(mappings[i]))
+ return i;
+ }
+ return mappings.length;
+}
+function isSorted(line) {
+ for (let j = 1; j < line.length; j++) {
+ if (line[j][COLUMN$1] < line[j - 1][COLUMN$1]) {
+ return false;
+ }
+ }
+ return true;
+}
+function sortSegments(line, owned) {
+ if (!owned)
+ line = line.slice();
+ return line.sort(sortComparator);
+}
+function sortComparator(a, b) {
+ return a[COLUMN$1] - b[COLUMN$1];
+}
+
+let found = false;
+/**
+ * A binary search implementation that returns the index if a match is found.
+ * If no match is found, then the left-index (the index associated with the item that comes just
+ * before the desired index) is returned. To maintain proper sort order, a splice would happen at
+ * the next index:
+ *
+ * ```js
+ * const array = [1, 3];
+ * const needle = 2;
+ * const index = binarySearch(array, needle, (item, needle) => item - needle);
+ *
+ * assert.equal(index, 0);
+ * array.splice(index + 1, 0, needle);
+ * assert.deepEqual(array, [1, 2, 3]);
+ * ```
+ */
+function binarySearch(haystack, needle, low, high) {
+ while (low <= high) {
+ const mid = low + ((high - low) >> 1);
+ const cmp = haystack[mid][COLUMN$1] - needle;
+ if (cmp === 0) {
+ found = true;
+ return mid;
+ }
+ if (cmp < 0) {
+ low = mid + 1;
+ }
+ else {
+ high = mid - 1;
+ }
+ }
+ found = false;
+ return low - 1;
+}
+function upperBound(haystack, needle, index) {
+ for (let i = index + 1; i < haystack.length; i++, index++) {
+ if (haystack[i][COLUMN$1] !== needle)
+ break;
+ }
+ return index;
+}
+function lowerBound(haystack, needle, index) {
+ for (let i = index - 1; i >= 0; i--, index--) {
+ if (haystack[i][COLUMN$1] !== needle)
+ break;
+ }
+ return index;
+}
+function memoizedState() {
+ return {
+ lastKey: -1,
+ lastNeedle: -1,
+ lastIndex: -1,
+ };
+}
+/**
+ * This overly complicated beast is just to record the last tested line/column and the resulting
+ * index, allowing us to skip a few tests if mappings are monotonically increasing.
+ */
+function memoizedBinarySearch(haystack, needle, state, key) {
+ const { lastKey, lastNeedle, lastIndex } = state;
+ let low = 0;
+ let high = haystack.length - 1;
+ if (key === lastKey) {
+ if (needle === lastNeedle) {
+ found = lastIndex !== -1 && haystack[lastIndex][COLUMN$1] === needle;
+ return lastIndex;
+ }
+ if (needle >= lastNeedle) {
+ // lastIndex may be -1 if the previous needle was not found.
+ low = lastIndex === -1 ? 0 : lastIndex;
+ }
+ else {
+ high = lastIndex;
+ }
+ }
+ state.lastKey = key;
+ state.lastNeedle = needle;
+ return (state.lastIndex = binarySearch(haystack, needle, low, high));
+}
+
+const AnyMap = function (map, mapUrl) {
+ const parsed = typeof map === 'string' ? JSON.parse(map) : map;
+ if (!('sections' in parsed))
+ return new TraceMap(parsed, mapUrl);
+ const mappings = [];
+ const sources = [];
+ const sourcesContent = [];
+ const names = [];
+ const { sections } = parsed;
+ let i = 0;
+ for (; i < sections.length - 1; i++) {
+ const no = sections[i + 1].offset;
+ addSection(sections[i], mapUrl, mappings, sources, sourcesContent, names, no.line, no.column);
+ }
+ if (sections.length > 0) {
+ addSection(sections[i], mapUrl, mappings, sources, sourcesContent, names, Infinity, Infinity);
+ }
+ const joined = {
+ version: 3,
+ file: parsed.file,
+ names,
+ sources,
+ sourcesContent,
+ mappings,
+ };
+ return presortedDecodedMap(joined);
+};
+function addSection(section, mapUrl, mappings, sources, sourcesContent, names, stopLine, stopColumn) {
+ const map = AnyMap(section.map, mapUrl);
+ const { line: lineOffset, column: columnOffset } = section.offset;
+ const sourcesOffset = sources.length;
+ const namesOffset = names.length;
+ const decoded = decodedMappings(map);
+ const { resolvedSources } = map;
+ append(sources, resolvedSources);
+ append(sourcesContent, map.sourcesContent || fillSourcesContent(resolvedSources.length));
+ append(names, map.names);
+ // If this section jumps forwards several lines, we need to add lines to the output mappings catch up.
+ for (let i = mappings.length; i <= lineOffset; i++)
+ mappings.push([]);
+ // We can only add so many lines before we step into the range that the next section's map
+ // controls. When we get to the last line, then we'll start checking the segments to see if
+ // they've crossed into the column range.
+ const stopI = stopLine - lineOffset;
+ const len = Math.min(decoded.length, stopI + 1);
+ for (let i = 0; i < len; i++) {
+ const line = decoded[i];
+ // On the 0th loop, the line will already exist due to a previous section, or the line catch up
+ // loop above.
+ const out = i === 0 ? mappings[lineOffset] : (mappings[lineOffset + i] = []);
+ // On the 0th loop, the section's column offset shifts us forward. On all other lines (since the
+ // map can be multiple lines), it doesn't.
+ const cOffset = i === 0 ? columnOffset : 0;
+ for (let j = 0; j < line.length; j++) {
+ const seg = line[j];
+ const column = cOffset + seg[COLUMN$1];
+ // If this segment steps into the column range that the next section's map controls, we need
+ // to stop early.
+ if (i === stopI && column >= stopColumn)
+ break;
+ if (seg.length === 1) {
+ out.push([column]);
+ continue;
+ }
+ const sourcesIndex = sourcesOffset + seg[SOURCES_INDEX$1];
+ const sourceLine = seg[SOURCE_LINE$1];
+ const sourceColumn = seg[SOURCE_COLUMN$1];
+ if (seg.length === 4) {
+ out.push([column, sourcesIndex, sourceLine, sourceColumn]);
+ continue;
+ }
+ out.push([column, sourcesIndex, sourceLine, sourceColumn, namesOffset + seg[NAMES_INDEX$1]]);
+ }
+ }
+}
+function append(arr, other) {
+ for (let i = 0; i < other.length; i++)
+ arr.push(other[i]);
+}
+// Sourcemaps don't need to have sourcesContent, and if they don't, we need to create an array of
+// equal length to the sources. This is because the sources and sourcesContent are paired arrays,
+// where `sourcesContent[i]` is the content of the `sources[i]` file. If we didn't, then joined
+// sourcemap would desynchronize the sources/contents.
+function fillSourcesContent(len) {
+ const sourcesContent = [];
+ for (let i = 0; i < len; i++)
+ sourcesContent[i] = null;
+ return sourcesContent;
+}
+
+const INVALID_ORIGINAL_MAPPING = Object.freeze({
+ source: null,
+ line: null,
+ column: null,
+ name: null,
+});
+Object.freeze({
+ line: null,
+ column: null,
+});
+const LINE_GTR_ZERO = '`line` must be greater than 0 (lines start at line 1)';
+const COL_GTR_EQ_ZERO = '`column` must be greater than or equal to 0 (columns start at column 0)';
+const LEAST_UPPER_BOUND = -1;
+const GREATEST_LOWER_BOUND = 1;
+/**
+ * Returns the decoded (array of lines of segments) form of the SourceMap's mappings field.
+ */
+let decodedMappings;
+/**
+ * A higher-level API to find the source/line/column associated with a generated line/column
+ * (think, from a stack trace). Line is 1-based, but column is 0-based, due to legacy behavior in
+ * `source-map` library.
+ */
+let originalPositionFor;
+/**
+ * A helper that skips sorting of the input map's mappings array, which can be expensive for larger
+ * maps.
+ */
+let presortedDecodedMap;
+class TraceMap {
+ constructor(map, mapUrl) {
+ this._decodedMemo = memoizedState();
+ this._bySources = undefined;
+ this._bySourceMemos = undefined;
+ const isString = typeof map === 'string';
+ if (!isString && map.constructor === TraceMap)
+ return map;
+ const parsed = (isString ? JSON.parse(map) : map);
+ const { version, file, names, sourceRoot, sources, sourcesContent } = parsed;
+ this.version = version;
+ this.file = file;
+ this.names = names;
+ this.sourceRoot = sourceRoot;
+ this.sources = sources;
+ this.sourcesContent = sourcesContent;
+ if (sourceRoot || mapUrl) {
+ const from = resolve(sourceRoot || '', stripFilename(mapUrl));
+ this.resolvedSources = sources.map((s) => resolve(s || '', from));
+ }
+ else {
+ this.resolvedSources = sources.map((s) => s || '');
+ }
+ const { mappings } = parsed;
+ if (typeof mappings === 'string') {
+ this._encoded = mappings;
+ this._decoded = undefined;
+ }
+ else {
+ this._encoded = undefined;
+ this._decoded = maybeSort(mappings, isString);
+ }
+ }
+}
+(() => {
+ decodedMappings = (map) => {
+ return (map._decoded || (map._decoded = decode(map._encoded)));
+ };
+ originalPositionFor = (map, { line, column, bias }) => {
+ line--;
+ if (line < 0)
+ throw new Error(LINE_GTR_ZERO);
+ if (column < 0)
+ throw new Error(COL_GTR_EQ_ZERO);
+ const decoded = decodedMappings(map);
+ // It's common for parent source maps to have pointers to lines that have no
+ // mapping (like a "//# sourceMappingURL=") at the end of the child file.
+ if (line >= decoded.length)
+ return INVALID_ORIGINAL_MAPPING;
+ const segment = traceSegmentInternal(decoded[line], map._decodedMemo, line, column, bias || GREATEST_LOWER_BOUND);
+ if (segment == null)
+ return INVALID_ORIGINAL_MAPPING;
+ if (segment.length == 1)
+ return INVALID_ORIGINAL_MAPPING;
+ const { names, resolvedSources } = map;
+ return {
+ source: resolvedSources[segment[SOURCES_INDEX$1]],
+ line: segment[SOURCE_LINE$1] + 1,
+ column: segment[SOURCE_COLUMN$1],
+ name: segment.length === 5 ? names[segment[NAMES_INDEX$1]] : null,
+ };
+ };
+ presortedDecodedMap = (map, mapUrl) => {
+ const clone = Object.assign({}, map);
+ clone.mappings = [];
+ const tracer = new TraceMap(clone, mapUrl);
+ tracer._decoded = map.mappings;
+ return tracer;
+ };
+})();
+function traceSegmentInternal(segments, memo, line, column, bias) {
+ let index = memoizedBinarySearch(segments, column, memo, line);
+ if (found) {
+ index = (bias === LEAST_UPPER_BOUND ? upperBound : lowerBound)(segments, column, index);
+ }
+ else if (bias === LEAST_UPPER_BOUND)
+ index++;
+ if (index === -1 || index === segments.length)
+ return null;
+ return segments[index];
+}
+
+/**
+ * Gets the index associated with `key` in the backing array, if it is already present.
+ */
+let get;
+/**
+ * Puts `key` into the backing array, if it is not already present. Returns
+ * the index of the `key` in the backing array.
+ */
+let put;
+/**
+ * SetArray acts like a `Set` (allowing only one occurrence of a string `key`), but provides the
+ * index of the `key` in the backing array.
+ *
+ * This is designed to allow synchronizing a second array with the contents of the backing array,
+ * like how in a sourcemap `sourcesContent[i]` is the source content associated with `source[i]`,
+ * and there are never duplicates.
+ */
+class SetArray {
+ constructor() {
+ this._indexes = { __proto__: null };
+ this.array = [];
+ }
+}
+(() => {
+ get = (strarr, key) => strarr._indexes[key];
+ put = (strarr, key) => {
+ // The key may or may not be present. If it is present, it's a number.
+ const index = get(strarr, key);
+ if (index !== undefined)
+ return index;
+ const { array, _indexes: indexes } = strarr;
+ return (indexes[key] = array.push(key) - 1);
+ };
+})();
+
+const COLUMN = 0;
+const SOURCES_INDEX = 1;
+const SOURCE_LINE = 2;
+const SOURCE_COLUMN = 3;
+const NAMES_INDEX = 4;
+
+const NO_NAME = -1;
+/**
+ * Same as `addMapping`, but will only add the mapping if it generates useful information in the
+ * resulting map. This only works correctly if mappings are added **in order**, meaning you should
+ * not add a mapping with a lower generated line/column than one that came before.
+ */
+let maybeAddMapping;
+/**
+ * Adds/removes the content of the source file to the source map.
+ */
+let setSourceContent;
+/**
+ * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects
+ * a sourcemap, or to JSON.stringify.
+ */
+let toDecodedMap;
+/**
+ * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects
+ * a sourcemap, or to JSON.stringify.
+ */
+let toEncodedMap;
+// This split declaration is only so that terser can elminiate the static initialization block.
+let addSegmentInternal;
+/**
+ * Provides the state to generate a sourcemap.
+ */
+class GenMapping {
+ constructor({ file, sourceRoot } = {}) {
+ this._names = new SetArray();
+ this._sources = new SetArray();
+ this._sourcesContent = [];
+ this._mappings = [];
+ this.file = file;
+ this.sourceRoot = sourceRoot;
+ }
+}
+(() => {
+ maybeAddMapping = (map, mapping) => {
+ return addMappingInternal(true, map, mapping);
+ };
+ setSourceContent = (map, source, content) => {
+ const { _sources: sources, _sourcesContent: sourcesContent } = map;
+ sourcesContent[put(sources, source)] = content;
+ };
+ toDecodedMap = (map) => {
+ const { file, sourceRoot, _mappings: mappings, _sources: sources, _sourcesContent: sourcesContent, _names: names, } = map;
+ removeEmptyFinalLines(mappings);
+ return {
+ version: 3,
+ file: file || undefined,
+ names: names.array,
+ sourceRoot: sourceRoot || undefined,
+ sources: sources.array,
+ sourcesContent,
+ mappings,
+ };
+ };
+ toEncodedMap = (map) => {
+ const decoded = toDecodedMap(map);
+ return Object.assign(Object.assign({}, decoded), { mappings: encode(decoded.mappings) });
+ };
+ // Internal helpers
+ addSegmentInternal = (skipable, map, genLine, genColumn, source, sourceLine, sourceColumn, name) => {
+ const { _mappings: mappings, _sources: sources, _sourcesContent: sourcesContent, _names: names, } = map;
+ const line = getLine(mappings, genLine);
+ const index = getColumnIndex(line, genColumn);
+ if (!source) {
+ if (skipable && skipSourceless(line, index))
+ return;
+ return insert(line, index, [genColumn]);
+ }
+ const sourcesIndex = put(sources, source);
+ const namesIndex = name ? put(names, name) : NO_NAME;
+ if (sourcesIndex === sourcesContent.length)
+ sourcesContent[sourcesIndex] = null;
+ if (skipable && skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex)) {
+ return;
+ }
+ return insert(line, index, name
+ ? [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex]
+ : [genColumn, sourcesIndex, sourceLine, sourceColumn]);
+ };
+})();
+function getLine(mappings, index) {
+ for (let i = mappings.length; i <= index; i++) {
+ mappings[i] = [];
+ }
+ return mappings[index];
+}
+function getColumnIndex(line, genColumn) {
+ let index = line.length;
+ for (let i = index - 1; i >= 0; index = i--) {
+ const current = line[i];
+ if (genColumn >= current[COLUMN])
+ break;
+ }
+ return index;
+}
+function insert(array, index, value) {
+ for (let i = array.length; i > index; i--) {
+ array[i] = array[i - 1];
+ }
+ array[index] = value;
+}
+function removeEmptyFinalLines(mappings) {
+ const { length } = mappings;
+ let len = length;
+ for (let i = len - 1; i >= 0; len = i, i--) {
+ if (mappings[i].length > 0)
+ break;
+ }
+ if (len < length)
+ mappings.length = len;
+}
+function skipSourceless(line, index) {
+ // The start of a line is already sourceless, so adding a sourceless segment to the beginning
+ // doesn't generate any useful information.
+ if (index === 0)
+ return true;
+ const prev = line[index - 1];
+ // If the previous segment is also sourceless, then adding another sourceless segment doesn't
+ // genrate any new information. Else, this segment will end the source/named segment and point to
+ // a sourceless position, which is useful.
+ return prev.length === 1;
+}
+function skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex) {
+ // A source/named segment at the start of a line gives position at that genColumn
+ if (index === 0)
+ return false;
+ const prev = line[index - 1];
+ // If the previous segment is sourceless, then we're transitioning to a source.
+ if (prev.length === 1)
+ return false;
+ // If the previous segment maps to the exact same source position, then this segment doesn't
+ // provide any new position information.
+ return (sourcesIndex === prev[SOURCES_INDEX] &&
+ sourceLine === prev[SOURCE_LINE] &&
+ sourceColumn === prev[SOURCE_COLUMN] &&
+ namesIndex === (prev.length === 5 ? prev[NAMES_INDEX] : NO_NAME));
+}
+function addMappingInternal(skipable, map, mapping) {
+ const { generated, source, original, name } = mapping;
+ if (!source) {
+ return addSegmentInternal(skipable, map, generated.line - 1, generated.column, null, null, null, null);
+ }
+ const s = source;
+ return addSegmentInternal(skipable, map, generated.line - 1, generated.column, s, original.line - 1, original.column, name);
+}
+
+class SourceMapConsumer {
+ constructor(map, mapUrl) {
+ const trace = (this._map = new AnyMap(map, mapUrl));
+ this.file = trace.file;
+ this.names = trace.names;
+ this.sourceRoot = trace.sourceRoot;
+ this.sources = trace.resolvedSources;
+ this.sourcesContent = trace.sourcesContent;
+ }
+ originalPositionFor(needle) {
+ return originalPositionFor(this._map, needle);
+ }
+ destroy() {
+ // noop.
+ }
+}
+class SourceMapGenerator {
+ constructor(opts) {
+ this._map = new GenMapping(opts);
+ }
+ addMapping(mapping) {
+ maybeAddMapping(this._map, mapping);
+ }
+ setSourceContent(source, content) {
+ setSourceContent(this._map, source, content);
+ }
+ toJSON() {
+ return toEncodedMap(this._map);
+ }
+ toDecodedMap() {
+ return toDecodedMap(this._map);
+ }
+}
+
+export { SourceMapConsumer, SourceMapGenerator };
+//# sourceMappingURL=source-map.mjs.map
diff --git a/chromium/third_party/node/node_modules/@jridgewell/source-map/dist/source-map.umd.js b/chromium/third_party/node/node_modules/@jridgewell/source-map/dist/source-map.umd.js
new file mode 100644
index 00000000000..77ec63b243d
--- /dev/null
+++ b/chromium/third_party/node/node_modules/@jridgewell/source-map/dist/source-map.umd.js
@@ -0,0 +1,939 @@
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+ typeof define === 'function' && define.amd ? define(['exports'], factory) :
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.sourceMap = {}));
+})(this, (function (exports) { 'use strict';
+
+ const comma = ','.charCodeAt(0);
+ const semicolon = ';'.charCodeAt(0);
+ const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
+ const intToChar = new Uint8Array(64); // 64 possible chars.
+ const charToInteger = new Uint8Array(128); // z is 122 in ASCII
+ for (let i = 0; i < chars.length; i++) {
+ const c = chars.charCodeAt(i);
+ charToInteger[c] = i;
+ intToChar[i] = c;
+ }
+ // Provide a fallback for older environments.
+ const td = typeof TextDecoder !== 'undefined'
+ ? new TextDecoder()
+ : typeof Buffer !== 'undefined'
+ ? {
+ decode(buf) {
+ const out = Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength);
+ return out.toString();
+ },
+ }
+ : {
+ decode(buf) {
+ let out = '';
+ for (let i = 0; i < buf.length; i++) {
+ out += String.fromCharCode(buf[i]);
+ }
+ return out;
+ },
+ };
+ function decode(mappings) {
+ const state = new Int32Array(5);
+ const decoded = [];
+ let line = [];
+ let sorted = true;
+ let lastCol = 0;
+ for (let i = 0; i < mappings.length;) {
+ const c = mappings.charCodeAt(i);
+ if (c === comma) {
+ i++;
+ }
+ else if (c === semicolon) {
+ state[0] = lastCol = 0;
+ if (!sorted)
+ sort(line);
+ sorted = true;
+ decoded.push(line);
+ line = [];
+ i++;
+ }
+ else {
+ i = decodeInteger(mappings, i, state, 0); // generatedCodeColumn
+ const col = state[0];
+ if (col < lastCol)
+ sorted = false;
+ lastCol = col;
+ if (!hasMoreSegments(mappings, i)) {
+ line.push([col]);
+ continue;
+ }
+ i = decodeInteger(mappings, i, state, 1); // sourceFileIndex
+ i = decodeInteger(mappings, i, state, 2); // sourceCodeLine
+ i = decodeInteger(mappings, i, state, 3); // sourceCodeColumn
+ if (!hasMoreSegments(mappings, i)) {
+ line.push([col, state[1], state[2], state[3]]);
+ continue;
+ }
+ i = decodeInteger(mappings, i, state, 4); // nameIndex
+ line.push([col, state[1], state[2], state[3], state[4]]);
+ }
+ }
+ if (!sorted)
+ sort(line);
+ decoded.push(line);
+ return decoded;
+ }
+ function decodeInteger(mappings, pos, state, j) {
+ let value = 0;
+ let shift = 0;
+ let integer = 0;
+ do {
+ const c = mappings.charCodeAt(pos++);
+ integer = charToInteger[c];
+ value |= (integer & 31) << shift;
+ shift += 5;
+ } while (integer & 32);
+ const shouldNegate = value & 1;
+ value >>>= 1;
+ if (shouldNegate) {
+ value = -0x80000000 | -value;
+ }
+ state[j] += value;
+ return pos;
+ }
+ function hasMoreSegments(mappings, i) {
+ if (i >= mappings.length)
+ return false;
+ const c = mappings.charCodeAt(i);
+ if (c === comma || c === semicolon)
+ return false;
+ return true;
+ }
+ function sort(line) {
+ line.sort(sortComparator$1);
+ }
+ function sortComparator$1(a, b) {
+ return a[0] - b[0];
+ }
+ function encode(decoded) {
+ const state = new Int32Array(5);
+ let buf = new Uint8Array(1024);
+ let pos = 0;
+ for (let i = 0; i < decoded.length; i++) {
+ const line = decoded[i];
+ if (i > 0) {
+ buf = reserve(buf, pos, 1);
+ buf[pos++] = semicolon;
+ }
+ if (line.length === 0)
+ continue;
+ state[0] = 0;
+ for (let j = 0; j < line.length; j++) {
+ const segment = line[j];
+ // We can push up to 5 ints, each int can take at most 7 chars, and we
+ // may push a comma.
+ buf = reserve(buf, pos, 36);
+ if (j > 0)
+ buf[pos++] = comma;
+ pos = encodeInteger(buf, pos, state, segment, 0); // generatedCodeColumn
+ if (segment.length === 1)
+ continue;
+ pos = encodeInteger(buf, pos, state, segment, 1); // sourceFileIndex
+ pos = encodeInteger(buf, pos, state, segment, 2); // sourceCodeLine
+ pos = encodeInteger(buf, pos, state, segment, 3); // sourceCodeColumn
+ if (segment.length === 4)
+ continue;
+ pos = encodeInteger(buf, pos, state, segment, 4); // nameIndex
+ }
+ }
+ return td.decode(buf.subarray(0, pos));
+ }
+ function reserve(buf, pos, count) {
+ if (buf.length > pos + count)
+ return buf;
+ const swap = new Uint8Array(buf.length * 2);
+ swap.set(buf);
+ return swap;
+ }
+ function encodeInteger(buf, pos, state, segment, j) {
+ const next = segment[j];
+ let num = next - state[j];
+ state[j] = next;
+ num = num < 0 ? (-num << 1) | 1 : num << 1;
+ do {
+ let clamped = num & 0b011111;
+ num >>>= 5;
+ if (num > 0)
+ clamped |= 0b100000;
+ buf[pos++] = intToChar[clamped];
+ } while (num > 0);
+ return pos;
+ }
+
+ // Matches the scheme of a URL, eg "http://"
+ const schemeRegex = /^[\w+.-]+:\/\//;
+ /**
+ * Matches the parts of a URL:
+ * 1. Scheme, including ":", guaranteed.
+ * 2. User/password, including "@", optional.
+ * 3. Host, guaranteed.
+ * 4. Port, including ":", optional.
+ * 5. Path, including "/", optional.
+ */
+ const urlRegex = /^([\w+.-]+:)\/\/([^@/#?]*@)?([^:/#?]*)(:\d+)?(\/[^#?]*)?/;
+ /**
+ * File URLs are weird. They dont' need the regular `//` in the scheme, they may or may not start
+ * with a leading `/`, they can have a domain (but only if they don't start with a Windows drive).
+ *
+ * 1. Host, optional.
+ * 2. Path, which may inclue "/", guaranteed.
+ */
+ const fileRegex = /^file:(?:\/\/((?![a-z]:)[^/]*)?)?(\/?.*)/i;
+ function isAbsoluteUrl(input) {
+ return schemeRegex.test(input);
+ }
+ function isSchemeRelativeUrl(input) {
+ return input.startsWith('//');
+ }
+ function isAbsolutePath(input) {
+ return input.startsWith('/');
+ }
+ function isFileUrl(input) {
+ return input.startsWith('file:');
+ }
+ function parseAbsoluteUrl(input) {
+ const match = urlRegex.exec(input);
+ return makeUrl(match[1], match[2] || '', match[3], match[4] || '', match[5] || '/');
+ }
+ function parseFileUrl(input) {
+ const match = fileRegex.exec(input);
+ const path = match[2];
+ return makeUrl('file:', '', match[1] || '', '', isAbsolutePath(path) ? path : '/' + path);
+ }
+ function makeUrl(scheme, user, host, port, path) {
+ return {
+ scheme,
+ user,
+ host,
+ port,
+ path,
+ relativePath: false,
+ };
+ }
+ function parseUrl(input) {
+ if (isSchemeRelativeUrl(input)) {
+ const url = parseAbsoluteUrl('http:' + input);
+ url.scheme = '';
+ return url;
+ }
+ if (isAbsolutePath(input)) {
+ const url = parseAbsoluteUrl('http://foo.com' + input);
+ url.scheme = '';
+ url.host = '';
+ return url;
+ }
+ if (isFileUrl(input))
+ return parseFileUrl(input);
+ if (isAbsoluteUrl(input))
+ return parseAbsoluteUrl(input);
+ const url = parseAbsoluteUrl('http://foo.com/' + input);
+ url.scheme = '';
+ url.host = '';
+ url.relativePath = true;
+ return url;
+ }
+ function stripPathFilename(path) {
+ // If a path ends with a parent directory "..", then it's a relative path with excess parent
+ // paths. It's not a file, so we can't strip it.
+ if (path.endsWith('/..'))
+ return path;
+ const index = path.lastIndexOf('/');
+ return path.slice(0, index + 1);
+ }
+ function mergePaths(url, base) {
+ // If we're not a relative path, then we're an absolute path, and it doesn't matter what base is.
+ if (!url.relativePath)
+ return;
+ normalizePath(base);
+ // If the path is just a "/", then it was an empty path to begin with (remember, we're a relative
+ // path).
+ if (url.path === '/') {
+ url.path = base.path;
+ }
+ else {
+ // Resolution happens relative to the base path's directory, not the file.
+ url.path = stripPathFilename(base.path) + url.path;
+ }
+ // If the base path is absolute, then our path is now absolute too.
+ url.relativePath = base.relativePath;
+ }
+ /**
+ * The path can have empty directories "//", unneeded parents "foo/..", or current directory
+ * "foo/.". We need to normalize to a standard representation.
+ */
+ function normalizePath(url) {
+ const { relativePath } = url;
+ const pieces = url.path.split('/');
+ // We need to preserve the first piece always, so that we output a leading slash. The item at
+ // pieces[0] is an empty string.
+ let pointer = 1;
+ // Positive is the number of real directories we've output, used for popping a parent directory.
+ // Eg, "foo/bar/.." will have a positive 2, and we can decrement to be left with just "foo".
+ let positive = 0;
+ // We need to keep a trailing slash if we encounter an empty directory (eg, splitting "foo/" will
+ // generate `["foo", ""]` pieces). And, if we pop a parent directory. But once we encounter a
+ // real directory, we won't need to append, unless the other conditions happen again.
+ let addTrailingSlash = false;
+ for (let i = 1; i < pieces.length; i++) {
+ const piece = pieces[i];
+ // An empty directory, could be a trailing slash, or just a double "//" in the path.
+ if (!piece) {
+ addTrailingSlash = true;
+ continue;
+ }
+ // If we encounter a real directory, then we don't need to append anymore.
+ addTrailingSlash = false;
+ // A current directory, which we can always drop.
+ if (piece === '.')
+ continue;
+ // A parent directory, we need to see if there are any real directories we can pop. Else, we
+ // have an excess of parents, and we'll need to keep the "..".
+ if (piece === '..') {
+ if (positive) {
+ addTrailingSlash = true;
+ positive--;
+ pointer--;
+ }
+ else if (relativePath) {
+ // If we're in a relativePath, then we need to keep the excess parents. Else, in an absolute
+ // URL, protocol relative URL, or an absolute path, we don't need to keep excess.
+ pieces[pointer++] = piece;
+ }
+ continue;
+ }
+ // We've encountered a real directory. Move it to the next insertion pointer, which accounts for
+ // any popped or dropped directories.
+ pieces[pointer++] = piece;
+ positive++;
+ }
+ let path = '';
+ for (let i = 1; i < pointer; i++) {
+ path += '/' + pieces[i];
+ }
+ if (!path || (addTrailingSlash && !path.endsWith('/..'))) {
+ path += '/';
+ }
+ url.path = path;
+ }
+ /**
+ * Attempts to resolve `input` URL/path relative to `base`.
+ */
+ function resolve$1(input, base) {
+ if (!input && !base)
+ return '';
+ const url = parseUrl(input);
+ // If we have a base, and the input isn't already an absolute URL, then we need to merge.
+ if (base && !url.scheme) {
+ const baseUrl = parseUrl(base);
+ url.scheme = baseUrl.scheme;
+ // If there's no host, then we were just a path.
+ if (!url.host) {
+ // The host, user, and port are joined, you can't copy one without the others.
+ url.user = baseUrl.user;
+ url.host = baseUrl.host;
+ url.port = baseUrl.port;
+ }
+ mergePaths(url, baseUrl);
+ }
+ normalizePath(url);
+ // If the input (and base, if there was one) are both relative, then we need to output a relative.
+ if (url.relativePath) {
+ // The first char is always a "/".
+ const path = url.path.slice(1);
+ if (!path)
+ return '.';
+ // If base started with a leading ".", or there is no base and input started with a ".", then we
+ // need to ensure that the relative path starts with a ".". We don't know if relative starts
+ // with a "..", though, so check before prepending.
+ const keepRelative = (base || input).startsWith('.');
+ return !keepRelative || path.startsWith('.') ? path : './' + path;
+ }
+ // If there's no host (and no scheme/user/port), then we need to output an absolute path.
+ if (!url.scheme && !url.host)
+ return url.path;
+ // We're outputting either an absolute URL, or a protocol relative one.
+ return `${url.scheme}//${url.user}${url.host}${url.port}${url.path}`;
+ }
+
+ function resolve(input, base) {
+ // The base is always treated as a directory, if it's not empty.
+ // https://github.com/mozilla/source-map/blob/8cb3ee57/lib/util.js#L327
+ // https://github.com/chromium/chromium/blob/da4adbb3/third_party/blink/renderer/devtools/front_end/sdk/SourceMap.js#L400-L401
+ if (base && !base.endsWith('/'))
+ base += '/';
+ return resolve$1(input, base);
+ }
+
+ /**
+ * Removes everything after the last "/", but leaves the slash.
+ */
+ function stripFilename(path) {
+ if (!path)
+ return '';
+ const index = path.lastIndexOf('/');
+ return path.slice(0, index + 1);
+ }
+
+ const COLUMN$1 = 0;
+ const SOURCES_INDEX$1 = 1;
+ const SOURCE_LINE$1 = 2;
+ const SOURCE_COLUMN$1 = 3;
+ const NAMES_INDEX$1 = 4;
+
+ function maybeSort(mappings, owned) {
+ const unsortedIndex = nextUnsortedSegmentLine(mappings, 0);
+ if (unsortedIndex === mappings.length)
+ return mappings;
+ // If we own the array (meaning we parsed it from JSON), then we're free to directly mutate it. If
+ // not, we do not want to modify the consumer's input array.
+ if (!owned)
+ mappings = mappings.slice();
+ for (let i = unsortedIndex; i < mappings.length; i = nextUnsortedSegmentLine(mappings, i + 1)) {
+ mappings[i] = sortSegments(mappings[i], owned);
+ }
+ return mappings;
+ }
+ function nextUnsortedSegmentLine(mappings, start) {
+ for (let i = start; i < mappings.length; i++) {
+ if (!isSorted(mappings[i]))
+ return i;
+ }
+ return mappings.length;
+ }
+ function isSorted(line) {
+ for (let j = 1; j < line.length; j++) {
+ if (line[j][COLUMN$1] < line[j - 1][COLUMN$1]) {
+ return false;
+ }
+ }
+ return true;
+ }
+ function sortSegments(line, owned) {
+ if (!owned)
+ line = line.slice();
+ return line.sort(sortComparator);
+ }
+ function sortComparator(a, b) {
+ return a[COLUMN$1] - b[COLUMN$1];
+ }
+
+ let found = false;
+ /**
+ * A binary search implementation that returns the index if a match is found.
+ * If no match is found, then the left-index (the index associated with the item that comes just
+ * before the desired index) is returned. To maintain proper sort order, a splice would happen at
+ * the next index:
+ *
+ * ```js
+ * const array = [1, 3];
+ * const needle = 2;
+ * const index = binarySearch(array, needle, (item, needle) => item - needle);
+ *
+ * assert.equal(index, 0);
+ * array.splice(index + 1, 0, needle);
+ * assert.deepEqual(array, [1, 2, 3]);
+ * ```
+ */
+ function binarySearch(haystack, needle, low, high) {
+ while (low <= high) {
+ const mid = low + ((high - low) >> 1);
+ const cmp = haystack[mid][COLUMN$1] - needle;
+ if (cmp === 0) {
+ found = true;
+ return mid;
+ }
+ if (cmp < 0) {
+ low = mid + 1;
+ }
+ else {
+ high = mid - 1;
+ }
+ }
+ found = false;
+ return low - 1;
+ }
+ function upperBound(haystack, needle, index) {
+ for (let i = index + 1; i < haystack.length; i++, index++) {
+ if (haystack[i][COLUMN$1] !== needle)
+ break;
+ }
+ return index;
+ }
+ function lowerBound(haystack, needle, index) {
+ for (let i = index - 1; i >= 0; i--, index--) {
+ if (haystack[i][COLUMN$1] !== needle)
+ break;
+ }
+ return index;
+ }
+ function memoizedState() {
+ return {
+ lastKey: -1,
+ lastNeedle: -1,
+ lastIndex: -1,
+ };
+ }
+ /**
+ * This overly complicated beast is just to record the last tested line/column and the resulting
+ * index, allowing us to skip a few tests if mappings are monotonically increasing.
+ */
+ function memoizedBinarySearch(haystack, needle, state, key) {
+ const { lastKey, lastNeedle, lastIndex } = state;
+ let low = 0;
+ let high = haystack.length - 1;
+ if (key === lastKey) {
+ if (needle === lastNeedle) {
+ found = lastIndex !== -1 && haystack[lastIndex][COLUMN$1] === needle;
+ return lastIndex;
+ }
+ if (needle >= lastNeedle) {
+ // lastIndex may be -1 if the previous needle was not found.
+ low = lastIndex === -1 ? 0 : lastIndex;
+ }
+ else {
+ high = lastIndex;
+ }
+ }
+ state.lastKey = key;
+ state.lastNeedle = needle;
+ return (state.lastIndex = binarySearch(haystack, needle, low, high));
+ }
+
+ const AnyMap = function (map, mapUrl) {
+ const parsed = typeof map === 'string' ? JSON.parse(map) : map;
+ if (!('sections' in parsed))
+ return new TraceMap(parsed, mapUrl);
+ const mappings = [];
+ const sources = [];
+ const sourcesContent = [];
+ const names = [];
+ const { sections } = parsed;
+ let i = 0;
+ for (; i < sections.length - 1; i++) {
+ const no = sections[i + 1].offset;
+ addSection(sections[i], mapUrl, mappings, sources, sourcesContent, names, no.line, no.column);
+ }
+ if (sections.length > 0) {
+ addSection(sections[i], mapUrl, mappings, sources, sourcesContent, names, Infinity, Infinity);
+ }
+ const joined = {
+ version: 3,
+ file: parsed.file,
+ names,
+ sources,
+ sourcesContent,
+ mappings,
+ };
+ return presortedDecodedMap(joined);
+ };
+ function addSection(section, mapUrl, mappings, sources, sourcesContent, names, stopLine, stopColumn) {
+ const map = AnyMap(section.map, mapUrl);
+ const { line: lineOffset, column: columnOffset } = section.offset;
+ const sourcesOffset = sources.length;
+ const namesOffset = names.length;
+ const decoded = decodedMappings(map);
+ const { resolvedSources } = map;
+ append(sources, resolvedSources);
+ append(sourcesContent, map.sourcesContent || fillSourcesContent(resolvedSources.length));
+ append(names, map.names);
+ // If this section jumps forwards several lines, we need to add lines to the output mappings catch up.
+ for (let i = mappings.length; i <= lineOffset; i++)
+ mappings.push([]);
+ // We can only add so many lines before we step into the range that the next section's map
+ // controls. When we get to the last line, then we'll start checking the segments to see if
+ // they've crossed into the column range.
+ const stopI = stopLine - lineOffset;
+ const len = Math.min(decoded.length, stopI + 1);
+ for (let i = 0; i < len; i++) {
+ const line = decoded[i];
+ // On the 0th loop, the line will already exist due to a previous section, or the line catch up
+ // loop above.
+ const out = i === 0 ? mappings[lineOffset] : (mappings[lineOffset + i] = []);
+ // On the 0th loop, the section's column offset shifts us forward. On all other lines (since the
+ // map can be multiple lines), it doesn't.
+ const cOffset = i === 0 ? columnOffset : 0;
+ for (let j = 0; j < line.length; j++) {
+ const seg = line[j];
+ const column = cOffset + seg[COLUMN$1];
+ // If this segment steps into the column range that the next section's map controls, we need
+ // to stop early.
+ if (i === stopI && column >= stopColumn)
+ break;
+ if (seg.length === 1) {
+ out.push([column]);
+ continue;
+ }
+ const sourcesIndex = sourcesOffset + seg[SOURCES_INDEX$1];
+ const sourceLine = seg[SOURCE_LINE$1];
+ const sourceColumn = seg[SOURCE_COLUMN$1];
+ if (seg.length === 4) {
+ out.push([column, sourcesIndex, sourceLine, sourceColumn]);
+ continue;
+ }
+ out.push([column, sourcesIndex, sourceLine, sourceColumn, namesOffset + seg[NAMES_INDEX$1]]);
+ }
+ }
+ }
+ function append(arr, other) {
+ for (let i = 0; i < other.length; i++)
+ arr.push(other[i]);
+ }
+ // Sourcemaps don't need to have sourcesContent, and if they don't, we need to create an array of
+ // equal length to the sources. This is because the sources and sourcesContent are paired arrays,
+ // where `sourcesContent[i]` is the content of the `sources[i]` file. If we didn't, then joined
+ // sourcemap would desynchronize the sources/contents.
+ function fillSourcesContent(len) {
+ const sourcesContent = [];
+ for (let i = 0; i < len; i++)
+ sourcesContent[i] = null;
+ return sourcesContent;
+ }
+
+ const INVALID_ORIGINAL_MAPPING = Object.freeze({
+ source: null,
+ line: null,
+ column: null,
+ name: null,
+ });
+ Object.freeze({
+ line: null,
+ column: null,
+ });
+ const LINE_GTR_ZERO = '`line` must be greater than 0 (lines start at line 1)';
+ const COL_GTR_EQ_ZERO = '`column` must be greater than or equal to 0 (columns start at column 0)';
+ const LEAST_UPPER_BOUND = -1;
+ const GREATEST_LOWER_BOUND = 1;
+ /**
+ * Returns the decoded (array of lines of segments) form of the SourceMap's mappings field.
+ */
+ let decodedMappings;
+ /**
+ * A higher-level API to find the source/line/column associated with a generated line/column
+ * (think, from a stack trace). Line is 1-based, but column is 0-based, due to legacy behavior in
+ * `source-map` library.
+ */
+ let originalPositionFor;
+ /**
+ * A helper that skips sorting of the input map's mappings array, which can be expensive for larger
+ * maps.
+ */
+ let presortedDecodedMap;
+ class TraceMap {
+ constructor(map, mapUrl) {
+ this._decodedMemo = memoizedState();
+ this._bySources = undefined;
+ this._bySourceMemos = undefined;
+ const isString = typeof map === 'string';
+ if (!isString && map.constructor === TraceMap)
+ return map;
+ const parsed = (isString ? JSON.parse(map) : map);
+ const { version, file, names, sourceRoot, sources, sourcesContent } = parsed;
+ this.version = version;
+ this.file = file;
+ this.names = names;
+ this.sourceRoot = sourceRoot;
+ this.sources = sources;
+ this.sourcesContent = sourcesContent;
+ if (sourceRoot || mapUrl) {
+ const from = resolve(sourceRoot || '', stripFilename(mapUrl));
+ this.resolvedSources = sources.map((s) => resolve(s || '', from));
+ }
+ else {
+ this.resolvedSources = sources.map((s) => s || '');
+ }
+ const { mappings } = parsed;
+ if (typeof mappings === 'string') {
+ this._encoded = mappings;
+ this._decoded = undefined;
+ }
+ else {
+ this._encoded = undefined;
+ this._decoded = maybeSort(mappings, isString);
+ }
+ }
+ }
+ (() => {
+ decodedMappings = (map) => {
+ return (map._decoded || (map._decoded = decode(map._encoded)));
+ };
+ originalPositionFor = (map, { line, column, bias }) => {
+ line--;
+ if (line < 0)
+ throw new Error(LINE_GTR_ZERO);
+ if (column < 0)
+ throw new Error(COL_GTR_EQ_ZERO);
+ const decoded = decodedMappings(map);
+ // It's common for parent source maps to have pointers to lines that have no
+ // mapping (like a "//# sourceMappingURL=") at the end of the child file.
+ if (line >= decoded.length)
+ return INVALID_ORIGINAL_MAPPING;
+ const segment = traceSegmentInternal(decoded[line], map._decodedMemo, line, column, bias || GREATEST_LOWER_BOUND);
+ if (segment == null)
+ return INVALID_ORIGINAL_MAPPING;
+ if (segment.length == 1)
+ return INVALID_ORIGINAL_MAPPING;
+ const { names, resolvedSources } = map;
+ return {
+ source: resolvedSources[segment[SOURCES_INDEX$1]],
+ line: segment[SOURCE_LINE$1] + 1,
+ column: segment[SOURCE_COLUMN$1],
+ name: segment.length === 5 ? names[segment[NAMES_INDEX$1]] : null,
+ };
+ };
+ presortedDecodedMap = (map, mapUrl) => {
+ const clone = Object.assign({}, map);
+ clone.mappings = [];
+ const tracer = new TraceMap(clone, mapUrl);
+ tracer._decoded = map.mappings;
+ return tracer;
+ };
+ })();
+ function traceSegmentInternal(segments, memo, line, column, bias) {
+ let index = memoizedBinarySearch(segments, column, memo, line);
+ if (found) {
+ index = (bias === LEAST_UPPER_BOUND ? upperBound : lowerBound)(segments, column, index);
+ }
+ else if (bias === LEAST_UPPER_BOUND)
+ index++;
+ if (index === -1 || index === segments.length)
+ return null;
+ return segments[index];
+ }
+
+ /**
+ * Gets the index associated with `key` in the backing array, if it is already present.
+ */
+ let get;
+ /**
+ * Puts `key` into the backing array, if it is not already present. Returns
+ * the index of the `key` in the backing array.
+ */
+ let put;
+ /**
+ * SetArray acts like a `Set` (allowing only one occurrence of a string `key`), but provides the
+ * index of the `key` in the backing array.
+ *
+ * This is designed to allow synchronizing a second array with the contents of the backing array,
+ * like how in a sourcemap `sourcesContent[i]` is the source content associated with `source[i]`,
+ * and there are never duplicates.
+ */
+ class SetArray {
+ constructor() {
+ this._indexes = { __proto__: null };
+ this.array = [];
+ }
+ }
+ (() => {
+ get = (strarr, key) => strarr._indexes[key];
+ put = (strarr, key) => {
+ // The key may or may not be present. If it is present, it's a number.
+ const index = get(strarr, key);
+ if (index !== undefined)
+ return index;
+ const { array, _indexes: indexes } = strarr;
+ return (indexes[key] = array.push(key) - 1);
+ };
+ })();
+
+ const COLUMN = 0;
+ const SOURCES_INDEX = 1;
+ const SOURCE_LINE = 2;
+ const SOURCE_COLUMN = 3;
+ const NAMES_INDEX = 4;
+
+ const NO_NAME = -1;
+ /**
+ * Same as `addMapping`, but will only add the mapping if it generates useful information in the
+ * resulting map. This only works correctly if mappings are added **in order**, meaning you should
+ * not add a mapping with a lower generated line/column than one that came before.
+ */
+ let maybeAddMapping;
+ /**
+ * Adds/removes the content of the source file to the source map.
+ */
+ let setSourceContent;
+ /**
+ * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects
+ * a sourcemap, or to JSON.stringify.
+ */
+ let toDecodedMap;
+ /**
+ * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects
+ * a sourcemap, or to JSON.stringify.
+ */
+ let toEncodedMap;
+ // This split declaration is only so that terser can elminiate the static initialization block.
+ let addSegmentInternal;
+ /**
+ * Provides the state to generate a sourcemap.
+ */
+ class GenMapping {
+ constructor({ file, sourceRoot } = {}) {
+ this._names = new SetArray();
+ this._sources = new SetArray();
+ this._sourcesContent = [];
+ this._mappings = [];
+ this.file = file;
+ this.sourceRoot = sourceRoot;
+ }
+ }
+ (() => {
+ maybeAddMapping = (map, mapping) => {
+ return addMappingInternal(true, map, mapping);
+ };
+ setSourceContent = (map, source, content) => {
+ const { _sources: sources, _sourcesContent: sourcesContent } = map;
+ sourcesContent[put(sources, source)] = content;
+ };
+ toDecodedMap = (map) => {
+ const { file, sourceRoot, _mappings: mappings, _sources: sources, _sourcesContent: sourcesContent, _names: names, } = map;
+ removeEmptyFinalLines(mappings);
+ return {
+ version: 3,
+ file: file || undefined,
+ names: names.array,
+ sourceRoot: sourceRoot || undefined,
+ sources: sources.array,
+ sourcesContent,
+ mappings,
+ };
+ };
+ toEncodedMap = (map) => {
+ const decoded = toDecodedMap(map);
+ return Object.assign(Object.assign({}, decoded), { mappings: encode(decoded.mappings) });
+ };
+ // Internal helpers
+ addSegmentInternal = (skipable, map, genLine, genColumn, source, sourceLine, sourceColumn, name) => {
+ const { _mappings: mappings, _sources: sources, _sourcesContent: sourcesContent, _names: names, } = map;
+ const line = getLine(mappings, genLine);
+ const index = getColumnIndex(line, genColumn);
+ if (!source) {
+ if (skipable && skipSourceless(line, index))
+ return;
+ return insert(line, index, [genColumn]);
+ }
+ const sourcesIndex = put(sources, source);
+ const namesIndex = name ? put(names, name) : NO_NAME;
+ if (sourcesIndex === sourcesContent.length)
+ sourcesContent[sourcesIndex] = null;
+ if (skipable && skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex)) {
+ return;
+ }
+ return insert(line, index, name
+ ? [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex]
+ : [genColumn, sourcesIndex, sourceLine, sourceColumn]);
+ };
+ })();
+ function getLine(mappings, index) {
+ for (let i = mappings.length; i <= index; i++) {
+ mappings[i] = [];
+ }
+ return mappings[index];
+ }
+ function getColumnIndex(line, genColumn) {
+ let index = line.length;
+ for (let i = index - 1; i >= 0; index = i--) {
+ const current = line[i];
+ if (genColumn >= current[COLUMN])
+ break;
+ }
+ return index;
+ }
+ function insert(array, index, value) {
+ for (let i = array.length; i > index; i--) {
+ array[i] = array[i - 1];
+ }
+ array[index] = value;
+ }
+ function removeEmptyFinalLines(mappings) {
+ const { length } = mappings;
+ let len = length;
+ for (let i = len - 1; i >= 0; len = i, i--) {
+ if (mappings[i].length > 0)
+ break;
+ }
+ if (len < length)
+ mappings.length = len;
+ }
+ function skipSourceless(line, index) {
+ // The start of a line is already sourceless, so adding a sourceless segment to the beginning
+ // doesn't generate any useful information.
+ if (index === 0)
+ return true;
+ const prev = line[index - 1];
+ // If the previous segment is also sourceless, then adding another sourceless segment doesn't
+ // genrate any new information. Else, this segment will end the source/named segment and point to
+ // a sourceless position, which is useful.
+ return prev.length === 1;
+ }
+ function skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex) {
+ // A source/named segment at the start of a line gives position at that genColumn
+ if (index === 0)
+ return false;
+ const prev = line[index - 1];
+ // If the previous segment is sourceless, then we're transitioning to a source.
+ if (prev.length === 1)
+ return false;
+ // If the previous segment maps to the exact same source position, then this segment doesn't
+ // provide any new position information.
+ return (sourcesIndex === prev[SOURCES_INDEX] &&
+ sourceLine === prev[SOURCE_LINE] &&
+ sourceColumn === prev[SOURCE_COLUMN] &&
+ namesIndex === (prev.length === 5 ? prev[NAMES_INDEX] : NO_NAME));
+ }
+ function addMappingInternal(skipable, map, mapping) {
+ const { generated, source, original, name } = mapping;
+ if (!source) {
+ return addSegmentInternal(skipable, map, generated.line - 1, generated.column, null, null, null, null);
+ }
+ const s = source;
+ return addSegmentInternal(skipable, map, generated.line - 1, generated.column, s, original.line - 1, original.column, name);
+ }
+
+ class SourceMapConsumer {
+ constructor(map, mapUrl) {
+ const trace = (this._map = new AnyMap(map, mapUrl));
+ this.file = trace.file;
+ this.names = trace.names;
+ this.sourceRoot = trace.sourceRoot;
+ this.sources = trace.resolvedSources;
+ this.sourcesContent = trace.sourcesContent;
+ }
+ originalPositionFor(needle) {
+ return originalPositionFor(this._map, needle);
+ }
+ destroy() {
+ // noop.
+ }
+ }
+ class SourceMapGenerator {
+ constructor(opts) {
+ this._map = new GenMapping(opts);
+ }
+ addMapping(mapping) {
+ maybeAddMapping(this._map, mapping);
+ }
+ setSourceContent(source, content) {
+ setSourceContent(this._map, source, content);
+ }
+ toJSON() {
+ return toEncodedMap(this._map);
+ }
+ toDecodedMap() {
+ return toDecodedMap(this._map);
+ }
+ }
+
+ exports.SourceMapConsumer = SourceMapConsumer;
+ exports.SourceMapGenerator = SourceMapGenerator;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+}));
+//# sourceMappingURL=source-map.umd.js.map
diff --git a/chromium/third_party/node/node_modules/@jridgewell/source-map/package.json b/chromium/third_party/node/node_modules/@jridgewell/source-map/package.json
new file mode 100644
index 00000000000..6eecc5cc12b
--- /dev/null
+++ b/chromium/third_party/node/node_modules/@jridgewell/source-map/package.json
@@ -0,0 +1,67 @@
+{
+ "name": "@jridgewell/source-map",
+ "version": "0.3.2",
+ "description": "Packages @jridgewell/trace-mapping and @jridgewell/gen-mapping into the familiar source-map API",
+ "keywords": [
+ "sourcemap",
+ "source",
+ "map"
+ ],
+ "author": "Justin Ridgewell <justin@ridgewell.name>",
+ "license": "MIT",
+ "repository": "https://github.com/jridgewell/source-map",
+ "main": "dist/source-map.umd.js",
+ "module": "dist/source-map.mjs",
+ "typings": "dist/types/source-map.d.ts",
+ "exports": {
+ ".": {
+ "browser": "./dist/source-map.umd.js",
+ "require": "./dist/source-map.umd.js",
+ "import": "./dist/source-map.mjs"
+ },
+ "./package.json": "./package.json"
+ },
+ "files": [
+ "dist"
+ ],
+ "scripts": {
+ "prebuild": "rm -rf dist",
+ "build": "run-s -n build:*",
+ "build:rollup": "rollup -c rollup.config.js",
+ "build:ts": "tsc --project tsconfig.build.json",
+ "lint": "run-s -n lint:*",
+ "lint:prettier": "npm run test:lint:prettier -- --write",
+ "lint:ts": "npm run test:lint:ts -- --fix",
+ "pretest": "run-s build:rollup",
+ "test": "run-s -n test:lint test:only",
+ "test:debug": "mocha --inspect-brk",
+ "test:lint": "run-s -n test:lint:*",
+ "test:lint:prettier": "prettier --check '{src,test}/**/*.ts'",
+ "test:lint:ts": "eslint '{src,test}/**/*.ts'",
+ "test:only": "mocha",
+ "test:coverage": "c8 mocha",
+ "test:watch": "mocha --watch",
+ "prepublishOnly": "npm run preversion",
+ "preversion": "run-s test build"
+ },
+ "devDependencies": {
+ "@rollup/plugin-node-resolve": "13.2.1",
+ "@rollup/plugin-typescript": "8.3.0",
+ "@types/mocha": "9.1.1",
+ "@types/node": "17.0.30",
+ "@typescript-eslint/eslint-plugin": "5.10.0",
+ "@typescript-eslint/parser": "5.10.0",
+ "c8": "7.11.0",
+ "eslint": "8.7.0",
+ "eslint-config-prettier": "8.3.0",
+ "mocha": "9.2.0",
+ "npm-run-all": "4.1.5",
+ "prettier": "2.5.1",
+ "rollup": "2.66.0",
+ "typescript": "4.5.5"
+ },
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+}
diff --git a/chromium/third_party/node/node_modules/@jridgewell/sourcemap-codec/LICENSE b/chromium/third_party/node/node_modules/@jridgewell/sourcemap-codec/LICENSE
new file mode 100644
index 00000000000..a331065a46b
--- /dev/null
+++ b/chromium/third_party/node/node_modules/@jridgewell/sourcemap-codec/LICENSE
@@ -0,0 +1,21 @@
+The MIT License
+
+Copyright (c) 2015 Rich Harris
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/chromium/third_party/node/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs b/chromium/third_party/node/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs
new file mode 100644
index 00000000000..3dff372170b
--- /dev/null
+++ b/chromium/third_party/node/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs
@@ -0,0 +1,164 @@
+const comma = ','.charCodeAt(0);
+const semicolon = ';'.charCodeAt(0);
+const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
+const intToChar = new Uint8Array(64); // 64 possible chars.
+const charToInt = new Uint8Array(128); // z is 122 in ASCII
+for (let i = 0; i < chars.length; i++) {
+ const c = chars.charCodeAt(i);
+ intToChar[i] = c;
+ charToInt[c] = i;
+}
+// Provide a fallback for older environments.
+const td = typeof TextDecoder !== 'undefined'
+ ? /* #__PURE__ */ new TextDecoder()
+ : typeof Buffer !== 'undefined'
+ ? {
+ decode(buf) {
+ const out = Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength);
+ return out.toString();
+ },
+ }
+ : {
+ decode(buf) {
+ let out = '';
+ for (let i = 0; i < buf.length; i++) {
+ out += String.fromCharCode(buf[i]);
+ }
+ return out;
+ },
+ };
+function decode(mappings) {
+ const state = new Int32Array(5);
+ const decoded = [];
+ let index = 0;
+ do {
+ const semi = indexOf(mappings, index);
+ const line = [];
+ let sorted = true;
+ let lastCol = 0;
+ state[0] = 0;
+ for (let i = index; i < semi; i++) {
+ let seg;
+ i = decodeInteger(mappings, i, state, 0); // genColumn
+ const col = state[0];
+ if (col < lastCol)
+ sorted = false;
+ lastCol = col;
+ if (hasMoreVlq(mappings, i, semi)) {
+ i = decodeInteger(mappings, i, state, 1); // sourcesIndex
+ i = decodeInteger(mappings, i, state, 2); // sourceLine
+ i = decodeInteger(mappings, i, state, 3); // sourceColumn
+ if (hasMoreVlq(mappings, i, semi)) {
+ i = decodeInteger(mappings, i, state, 4); // namesIndex
+ seg = [col, state[1], state[2], state[3], state[4]];
+ }
+ else {
+ seg = [col, state[1], state[2], state[3]];
+ }
+ }
+ else {
+ seg = [col];
+ }
+ line.push(seg);
+ }
+ if (!sorted)
+ sort(line);
+ decoded.push(line);
+ index = semi + 1;
+ } while (index <= mappings.length);
+ return decoded;
+}
+function indexOf(mappings, index) {
+ const idx = mappings.indexOf(';', index);
+ return idx === -1 ? mappings.length : idx;
+}
+function decodeInteger(mappings, pos, state, j) {
+ let value = 0;
+ let shift = 0;
+ let integer = 0;
+ do {
+ const c = mappings.charCodeAt(pos++);
+ integer = charToInt[c];
+ value |= (integer & 31) << shift;
+ shift += 5;
+ } while (integer & 32);
+ const shouldNegate = value & 1;
+ value >>>= 1;
+ if (shouldNegate) {
+ value = -0x80000000 | -value;
+ }
+ state[j] += value;
+ return pos;
+}
+function hasMoreVlq(mappings, i, length) {
+ if (i >= length)
+ return false;
+ return mappings.charCodeAt(i) !== comma;
+}
+function sort(line) {
+ line.sort(sortComparator);
+}
+function sortComparator(a, b) {
+ return a[0] - b[0];
+}
+function encode(decoded) {
+ const state = new Int32Array(5);
+ const bufLength = 1024 * 16;
+ const subLength = bufLength - 36;
+ const buf = new Uint8Array(bufLength);
+ const sub = buf.subarray(0, subLength);
+ let pos = 0;
+ let out = '';
+ for (let i = 0; i < decoded.length; i++) {
+ const line = decoded[i];
+ if (i > 0) {
+ if (pos === bufLength) {
+ out += td.decode(buf);
+ pos = 0;
+ }
+ buf[pos++] = semicolon;
+ }
+ if (line.length === 0)
+ continue;
+ state[0] = 0;
+ for (let j = 0; j < line.length; j++) {
+ const segment = line[j];
+ // We can push up to 5 ints, each int can take at most 7 chars, and we
+ // may push a comma.
+ if (pos > subLength) {
+ out += td.decode(sub);
+ buf.copyWithin(0, subLength, pos);
+ pos -= subLength;
+ }
+ if (j > 0)
+ buf[pos++] = comma;
+ pos = encodeInteger(buf, pos, state, segment, 0); // genColumn
+ if (segment.length === 1)
+ continue;
+ pos = encodeInteger(buf, pos, state, segment, 1); // sourcesIndex
+ pos = encodeInteger(buf, pos, state, segment, 2); // sourceLine
+ pos = encodeInteger(buf, pos, state, segment, 3); // sourceColumn
+ if (segment.length === 4)
+ continue;
+ pos = encodeInteger(buf, pos, state, segment, 4); // namesIndex
+ }
+ }
+ return out + td.decode(buf.subarray(0, pos));
+}
+function encodeInteger(buf, pos, state, segment, j) {
+ const next = segment[j];
+ let num = next - state[j];
+ state[j] = next;
+ num = num < 0 ? (-num << 1) | 1 : num << 1;
+ do {
+ let clamped = num & 0b011111;
+ num >>>= 5;
+ if (num > 0)
+ clamped |= 0b100000;
+ buf[pos++] = intToChar[clamped];
+ } while (num > 0);
+ return pos;
+}
+
+export { decode, encode };
+//# sourceMappingURL=sourcemap-codec.mjs.map
diff --git a/chromium/third_party/node/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js b/chromium/third_party/node/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js
new file mode 100644
index 00000000000..bec92a9c61a
--- /dev/null
+++ b/chromium/third_party/node/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js
@@ -0,0 +1,175 @@
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+ typeof define === 'function' && define.amd ? define(['exports'], factory) :
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.sourcemapCodec = {}));
+})(this, (function (exports) { 'use strict';
+
+ const comma = ','.charCodeAt(0);
+ const semicolon = ';'.charCodeAt(0);
+ const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
+ const intToChar = new Uint8Array(64); // 64 possible chars.
+ const charToInt = new Uint8Array(128); // z is 122 in ASCII
+ for (let i = 0; i < chars.length; i++) {
+ const c = chars.charCodeAt(i);
+ intToChar[i] = c;
+ charToInt[c] = i;
+ }
+ // Provide a fallback for older environments.
+ const td = typeof TextDecoder !== 'undefined'
+ ? /* #__PURE__ */ new TextDecoder()
+ : typeof Buffer !== 'undefined'
+ ? {
+ decode(buf) {
+ const out = Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength);
+ return out.toString();
+ },
+ }
+ : {
+ decode(buf) {
+ let out = '';
+ for (let i = 0; i < buf.length; i++) {
+ out += String.fromCharCode(buf[i]);
+ }
+ return out;
+ },
+ };
+ function decode(mappings) {
+ const state = new Int32Array(5);
+ const decoded = [];
+ let index = 0;
+ do {
+ const semi = indexOf(mappings, index);
+ const line = [];
+ let sorted = true;
+ let lastCol = 0;
+ state[0] = 0;
+ for (let i = index; i < semi; i++) {
+ let seg;
+ i = decodeInteger(mappings, i, state, 0); // genColumn
+ const col = state[0];
+ if (col < lastCol)
+ sorted = false;
+ lastCol = col;
+ if (hasMoreVlq(mappings, i, semi)) {
+ i = decodeInteger(mappings, i, state, 1); // sourcesIndex
+ i = decodeInteger(mappings, i, state, 2); // sourceLine
+ i = decodeInteger(mappings, i, state, 3); // sourceColumn
+ if (hasMoreVlq(mappings, i, semi)) {
+ i = decodeInteger(mappings, i, state, 4); // namesIndex
+ seg = [col, state[1], state[2], state[3], state[4]];
+ }
+ else {
+ seg = [col, state[1], state[2], state[3]];
+ }
+ }
+ else {
+ seg = [col];
+ }
+ line.push(seg);
+ }
+ if (!sorted)
+ sort(line);
+ decoded.push(line);
+ index = semi + 1;
+ } while (index <= mappings.length);
+ return decoded;
+ }
+ function indexOf(mappings, index) {
+ const idx = mappings.indexOf(';', index);
+ return idx === -1 ? mappings.length : idx;
+ }
+ function decodeInteger(mappings, pos, state, j) {
+ let value = 0;
+ let shift = 0;
+ let integer = 0;
+ do {
+ const c = mappings.charCodeAt(pos++);
+ integer = charToInt[c];
+ value |= (integer & 31) << shift;
+ shift += 5;
+ } while (integer & 32);
+ const shouldNegate = value & 1;
+ value >>>= 1;
+ if (shouldNegate) {
+ value = -0x80000000 | -value;
+ }
+ state[j] += value;
+ return pos;
+ }
+ function hasMoreVlq(mappings, i, length) {
+ if (i >= length)
+ return false;
+ return mappings.charCodeAt(i) !== comma;
+ }
+ function sort(line) {
+ line.sort(sortComparator);
+ }
+ function sortComparator(a, b) {
+ return a[0] - b[0];
+ }
+ function encode(decoded) {
+ const state = new Int32Array(5);
+ const bufLength = 1024 * 16;
+ const subLength = bufLength - 36;
+ const buf = new Uint8Array(bufLength);
+ const sub = buf.subarray(0, subLength);
+ let pos = 0;
+ let out = '';
+ for (let i = 0; i < decoded.length; i++) {
+ const line = decoded[i];
+ if (i > 0) {
+ if (pos === bufLength) {
+ out += td.decode(buf);
+ pos = 0;
+ }
+ buf[pos++] = semicolon;
+ }
+ if (line.length === 0)
+ continue;
+ state[0] = 0;
+ for (let j = 0; j < line.length; j++) {
+ const segment = line[j];
+ // We can push up to 5 ints, each int can take at most 7 chars, and we
+ // may push a comma.
+ if (pos > subLength) {
+ out += td.decode(sub);
+ buf.copyWithin(0, subLength, pos);
+ pos -= subLength;
+ }
+ if (j > 0)
+ buf[pos++] = comma;
+ pos = encodeInteger(buf, pos, state, segment, 0); // genColumn
+ if (segment.length === 1)
+ continue;
+ pos = encodeInteger(buf, pos, state, segment, 1); // sourcesIndex
+ pos = encodeInteger(buf, pos, state, segment, 2); // sourceLine
+ pos = encodeInteger(buf, pos, state, segment, 3); // sourceColumn
+ if (segment.length === 4)
+ continue;
+ pos = encodeInteger(buf, pos, state, segment, 4); // namesIndex
+ }
+ }
+ return out + td.decode(buf.subarray(0, pos));
+ }
+ function encodeInteger(buf, pos, state, segment, j) {
+ const next = segment[j];
+ let num = next - state[j];
+ state[j] = next;
+ num = num < 0 ? (-num << 1) | 1 : num << 1;
+ do {
+ let clamped = num & 0b011111;
+ num >>>= 5;
+ if (num > 0)
+ clamped |= 0b100000;
+ buf[pos++] = intToChar[clamped];
+ } while (num > 0);
+ return pos;
+ }
+
+ exports.decode = decode;
+ exports.encode = encode;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+}));
+//# sourceMappingURL=sourcemap-codec.umd.js.map
diff --git a/chromium/third_party/node/node_modules/@jridgewell/sourcemap-codec/package.json b/chromium/third_party/node/node_modules/@jridgewell/sourcemap-codec/package.json
new file mode 100644
index 00000000000..59450728782
--- /dev/null
+++ b/chromium/third_party/node/node_modules/@jridgewell/sourcemap-codec/package.json
@@ -0,0 +1,75 @@
+{
+ "name": "@jridgewell/sourcemap-codec",
+ "version": "1.4.14",
+ "description": "Encode/decode sourcemap mappings",
+ "keywords": [
+ "sourcemap",
+ "vlq"
+ ],
+ "main": "dist/sourcemap-codec.umd.js",
+ "module": "dist/sourcemap-codec.mjs",
+ "typings": "dist/types/sourcemap-codec.d.ts",
+ "files": [
+ "dist",
+ "src"
+ ],
+ "exports": {
+ ".": [
+ {
+ "types": "./dist/types/sourcemap-codec.d.ts",
+ "browser": "./dist/sourcemap-codec.umd.js",
+ "import": "./dist/sourcemap-codec.mjs",
+ "require": "./dist/sourcemap-codec.umd.js"
+ },
+ "./dist/sourcemap-codec.umd.js"
+ ],
+ "./package.json": "./package.json"
+ },
+ "scripts": {
+ "benchmark": "run-s build:rollup benchmark:*",
+ "benchmark:install": "cd benchmark && npm install",
+ "benchmark:only": "node --expose-gc benchmark/index.js",
+ "build": "run-s -n build:*",
+ "build:rollup": "rollup -c rollup.config.js",
+ "build:ts": "tsc --project tsconfig.build.json",
+ "lint": "run-s -n lint:*",
+ "lint:prettier": "npm run test:lint:prettier -- --write",
+ "lint:ts": "npm run test:lint:ts -- --fix",
+ "prebuild": "rm -rf dist",
+ "prepublishOnly": "npm run preversion",
+ "preversion": "run-s test build",
+ "pretest": "run-s build:rollup",
+ "test": "run-s -n test:lint test:only",
+ "test:debug": "mocha --inspect-brk",
+ "test:lint": "run-s -n test:lint:*",
+ "test:lint:prettier": "prettier --check '{src,test}/**/*.ts'",
+ "test:lint:ts": "eslint '{src,test}/**/*.ts'",
+ "test:only": "mocha",
+ "test:coverage": "c8 mocha",
+ "test:watch": "mocha --watch"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/jridgewell/sourcemap-codec.git"
+ },
+ "author": "Rich Harris",
+ "license": "MIT",
+ "devDependencies": {
+ "@rollup/plugin-typescript": "8.3.0",
+ "@types/node": "17.0.15",
+ "@typescript-eslint/eslint-plugin": "5.10.0",
+ "@typescript-eslint/parser": "5.10.0",
+ "benchmark": "2.1.4",
+ "c8": "7.11.2",
+ "eslint": "8.7.0",
+ "eslint-config-prettier": "8.3.0",
+ "mocha": "9.2.0",
+ "npm-run-all": "4.1.5",
+ "prettier": "2.5.1",
+ "rollup": "2.64.0",
+ "source-map": "0.6.1",
+ "source-map-js": "1.0.2",
+ "sourcemap-codec": "1.4.8",
+ "typescript": "4.5.4"
+ }
+}
diff --git a/chromium/third_party/node/node_modules/@jridgewell/trace-mapping/LICENSE b/chromium/third_party/node/node_modules/@jridgewell/trace-mapping/LICENSE
new file mode 100644
index 00000000000..37bb488f08a
--- /dev/null
+++ b/chromium/third_party/node/node_modules/@jridgewell/trace-mapping/LICENSE
@@ -0,0 +1,19 @@
+Copyright 2022 Justin Ridgewell <justin@ridgewell.name>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/chromium/third_party/node/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs b/chromium/third_party/node/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs
new file mode 100644
index 00000000000..917a3303abd
--- /dev/null
+++ b/chromium/third_party/node/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs
@@ -0,0 +1,552 @@
+import { encode, decode } from '@jridgewell/sourcemap-codec';
+import resolveUri from '@jridgewell/resolve-uri';
+
+function resolve(input, base) {
+ // The base is always treated as a directory, if it's not empty.
+ // https://github.com/mozilla/source-map/blob/8cb3ee57/lib/util.js#L327
+ // https://github.com/chromium/chromium/blob/da4adbb3/third_party/blink/renderer/devtools/front_end/sdk/SourceMap.js#L400-L401
+ if (base && !base.endsWith('/'))
+ base += '/';
+ return resolveUri(input, base);
+}
+
+/**
+ * Removes everything after the last "/", but leaves the slash.
+ */
+function stripFilename(path) {
+ if (!path)
+ return '';
+ const index = path.lastIndexOf('/');
+ return path.slice(0, index + 1);
+}
+
+const COLUMN = 0;
+const SOURCES_INDEX = 1;
+const SOURCE_LINE = 2;
+const SOURCE_COLUMN = 3;
+const NAMES_INDEX = 4;
+const REV_GENERATED_LINE = 1;
+const REV_GENERATED_COLUMN = 2;
+
+function maybeSort(mappings, owned) {
+ const unsortedIndex = nextUnsortedSegmentLine(mappings, 0);
+ if (unsortedIndex === mappings.length)
+ return mappings;
+ // If we own the array (meaning we parsed it from JSON), then we're free to directly mutate it. If
+ // not, we do not want to modify the consumer's input array.
+ if (!owned)
+ mappings = mappings.slice();
+ for (let i = unsortedIndex; i < mappings.length; i = nextUnsortedSegmentLine(mappings, i + 1)) {
+ mappings[i] = sortSegments(mappings[i], owned);
+ }
+ return mappings;
+}
+function nextUnsortedSegmentLine(mappings, start) {
+ for (let i = start; i < mappings.length; i++) {
+ if (!isSorted(mappings[i]))
+ return i;
+ }
+ return mappings.length;
+}
+function isSorted(line) {
+ for (let j = 1; j < line.length; j++) {
+ if (line[j][COLUMN] < line[j - 1][COLUMN]) {
+ return false;
+ }
+ }
+ return true;
+}
+function sortSegments(line, owned) {
+ if (!owned)
+ line = line.slice();
+ return line.sort(sortComparator);
+}
+function sortComparator(a, b) {
+ return a[COLUMN] - b[COLUMN];
+}
+
+let found = false;
+/**
+ * A binary search implementation that returns the index if a match is found.
+ * If no match is found, then the left-index (the index associated with the item that comes just
+ * before the desired index) is returned. To maintain proper sort order, a splice would happen at
+ * the next index:
+ *
+ * ```js
+ * const array = [1, 3];
+ * const needle = 2;
+ * const index = binarySearch(array, needle, (item, needle) => item - needle);
+ *
+ * assert.equal(index, 0);
+ * array.splice(index + 1, 0, needle);
+ * assert.deepEqual(array, [1, 2, 3]);
+ * ```
+ */
+function binarySearch(haystack, needle, low, high) {
+ while (low <= high) {
+ const mid = low + ((high - low) >> 1);
+ const cmp = haystack[mid][COLUMN] - needle;
+ if (cmp === 0) {
+ found = true;
+ return mid;
+ }
+ if (cmp < 0) {
+ low = mid + 1;
+ }
+ else {
+ high = mid - 1;
+ }
+ }
+ found = false;
+ return low - 1;
+}
+function upperBound(haystack, needle, index) {
+ for (let i = index + 1; i < haystack.length; index = i++) {
+ if (haystack[i][COLUMN] !== needle)
+ break;
+ }
+ return index;
+}
+function lowerBound(haystack, needle, index) {
+ for (let i = index - 1; i >= 0; index = i--) {
+ if (haystack[i][COLUMN] !== needle)
+ break;
+ }
+ return index;
+}
+function memoizedState() {
+ return {
+ lastKey: -1,
+ lastNeedle: -1,
+ lastIndex: -1,
+ };
+}
+/**
+ * This overly complicated beast is just to record the last tested line/column and the resulting
+ * index, allowing us to skip a few tests if mappings are monotonically increasing.
+ */
+function memoizedBinarySearch(haystack, needle, state, key) {
+ const { lastKey, lastNeedle, lastIndex } = state;
+ let low = 0;
+ let high = haystack.length - 1;
+ if (key === lastKey) {
+ if (needle === lastNeedle) {
+ found = lastIndex !== -1 && haystack[lastIndex][COLUMN] === needle;
+ return lastIndex;
+ }
+ if (needle >= lastNeedle) {
+ // lastIndex may be -1 if the previous needle was not found.
+ low = lastIndex === -1 ? 0 : lastIndex;
+ }
+ else {
+ high = lastIndex;
+ }
+ }
+ state.lastKey = key;
+ state.lastNeedle = needle;
+ return (state.lastIndex = binarySearch(haystack, needle, low, high));
+}
+
+// Rebuilds the original source files, with mappings that are ordered by source line/column instead
+// of generated line/column.
+function buildBySources(decoded, memos) {
+ const sources = memos.map(buildNullArray);
+ for (let i = 0; i < decoded.length; i++) {
+ const line = decoded[i];
+ for (let j = 0; j < line.length; j++) {
+ const seg = line[j];
+ if (seg.length === 1)
+ continue;
+ const sourceIndex = seg[SOURCES_INDEX];
+ const sourceLine = seg[SOURCE_LINE];
+ const sourceColumn = seg[SOURCE_COLUMN];
+ const originalSource = sources[sourceIndex];
+ const originalLine = (originalSource[sourceLine] || (originalSource[sourceLine] = []));
+ const memo = memos[sourceIndex];
+ // The binary search either found a match, or it found the left-index just before where the
+ // segment should go. Either way, we want to insert after that. And there may be multiple
+ // generated segments associated with an original location, so there may need to move several
+ // indexes before we find where we need to insert.
+ const index = upperBound(originalLine, sourceColumn, memoizedBinarySearch(originalLine, sourceColumn, memo, sourceLine));
+ insert(originalLine, (memo.lastIndex = index + 1), [sourceColumn, i, seg[COLUMN]]);
+ }
+ }
+ return sources;
+}
+function insert(array, index, value) {
+ for (let i = array.length; i > index; i--) {
+ array[i] = array[i - 1];
+ }
+ array[index] = value;
+}
+// Null arrays allow us to use ordered index keys without actually allocating contiguous memory like
+// a real array. We use a null-prototype object to avoid prototype pollution and deoptimizations.
+// Numeric properties on objects are magically sorted in ascending order by the engine regardless of
+// the insertion order. So, by setting any numeric keys, even out of order, we'll get ascending
+// order when iterating with for-in.
+function buildNullArray() {
+ return { __proto__: null };
+}
+
+const AnyMap = function (map, mapUrl) {
+ const parsed = typeof map === 'string' ? JSON.parse(map) : map;
+ if (!('sections' in parsed))
+ return new TraceMap(parsed, mapUrl);
+ const mappings = [];
+ const sources = [];
+ const sourcesContent = [];
+ const names = [];
+ recurse(parsed, mapUrl, mappings, sources, sourcesContent, names, 0, 0, Infinity, Infinity);
+ const joined = {
+ version: 3,
+ file: parsed.file,
+ names,
+ sources,
+ sourcesContent,
+ mappings,
+ };
+ return presortedDecodedMap(joined);
+};
+function recurse(input, mapUrl, mappings, sources, sourcesContent, names, lineOffset, columnOffset, stopLine, stopColumn) {
+ const { sections } = input;
+ for (let i = 0; i < sections.length; i++) {
+ const { map, offset } = sections[i];
+ let sl = stopLine;
+ let sc = stopColumn;
+ if (i + 1 < sections.length) {
+ const nextOffset = sections[i + 1].offset;
+ sl = Math.min(stopLine, lineOffset + nextOffset.line);
+ if (sl === stopLine) {
+ sc = Math.min(stopColumn, columnOffset + nextOffset.column);
+ }
+ else if (sl < stopLine) {
+ sc = columnOffset + nextOffset.column;
+ }
+ }
+ addSection(map, mapUrl, mappings, sources, sourcesContent, names, lineOffset + offset.line, columnOffset + offset.column, sl, sc);
+ }
+}
+function addSection(input, mapUrl, mappings, sources, sourcesContent, names, lineOffset, columnOffset, stopLine, stopColumn) {
+ if ('sections' in input)
+ return recurse(...arguments);
+ const map = new TraceMap(input, mapUrl);
+ const sourcesOffset = sources.length;
+ const namesOffset = names.length;
+ const decoded = decodedMappings(map);
+ const { resolvedSources, sourcesContent: contents } = map;
+ append(sources, resolvedSources);
+ append(names, map.names);
+ if (contents)
+ append(sourcesContent, contents);
+ else
+ for (let i = 0; i < resolvedSources.length; i++)
+ sourcesContent.push(null);
+ for (let i = 0; i < decoded.length; i++) {
+ const lineI = lineOffset + i;
+ // We can only add so many lines before we step into the range that the next section's map
+ // controls. When we get to the last line, then we'll start checking the segments to see if
+ // they've crossed into the column range. But it may not have any columns that overstep, so we
+ // still need to check that we don't overstep lines, too.
+ if (lineI > stopLine)
+ return;
+ // The out line may already exist in mappings (if we're continuing the line started by a
+ // previous section). Or, we may have jumped ahead several lines to start this section.
+ const out = getLine(mappings, lineI);
+ // On the 0th loop, the section's column offset shifts us forward. On all other lines (since the
+ // map can be multiple lines), it doesn't.
+ const cOffset = i === 0 ? columnOffset : 0;
+ const line = decoded[i];
+ for (let j = 0; j < line.length; j++) {
+ const seg = line[j];
+ const column = cOffset + seg[COLUMN];
+ // If this segment steps into the column range that the next section's map controls, we need
+ // to stop early.
+ if (lineI === stopLine && column >= stopColumn)
+ return;
+ if (seg.length === 1) {
+ out.push([column]);
+ continue;
+ }
+ const sourcesIndex = sourcesOffset + seg[SOURCES_INDEX];
+ const sourceLine = seg[SOURCE_LINE];
+ const sourceColumn = seg[SOURCE_COLUMN];
+ out.push(seg.length === 4
+ ? [column, sourcesIndex, sourceLine, sourceColumn]
+ : [column, sourcesIndex, sourceLine, sourceColumn, namesOffset + seg[NAMES_INDEX]]);
+ }
+ }
+}
+function append(arr, other) {
+ for (let i = 0; i < other.length; i++)
+ arr.push(other[i]);
+}
+function getLine(arr, index) {
+ for (let i = arr.length; i <= index; i++)
+ arr[i] = [];
+ return arr[index];
+}
+
+const LINE_GTR_ZERO = '`line` must be greater than 0 (lines start at line 1)';
+const COL_GTR_EQ_ZERO = '`column` must be greater than or equal to 0 (columns start at column 0)';
+const LEAST_UPPER_BOUND = -1;
+const GREATEST_LOWER_BOUND = 1;
+/**
+ * Returns the encoded (VLQ string) form of the SourceMap's mappings field.
+ */
+let encodedMappings;
+/**
+ * Returns the decoded (array of lines of segments) form of the SourceMap's mappings field.
+ */
+let decodedMappings;
+/**
+ * A low-level API to find the segment associated with a generated line/column (think, from a
+ * stack trace). Line and column here are 0-based, unlike `originalPositionFor`.
+ */
+let traceSegment;
+/**
+ * A higher-level API to find the source/line/column associated with a generated line/column
+ * (think, from a stack trace). Line is 1-based, but column is 0-based, due to legacy behavior in
+ * `source-map` library.
+ */
+let originalPositionFor;
+/**
+ * Finds the generated line/column position of the provided source/line/column source position.
+ */
+let generatedPositionFor;
+/**
+ * Finds all generated line/column positions of the provided source/line/column source position.
+ */
+let allGeneratedPositionsFor;
+/**
+ * Iterates each mapping in generated position order.
+ */
+let eachMapping;
+/**
+ * Retrieves the source content for a particular source, if its found. Returns null if not.
+ */
+let sourceContentFor;
+/**
+ * A helper that skips sorting of the input map's mappings array, which can be expensive for larger
+ * maps.
+ */
+let presortedDecodedMap;
+/**
+ * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects
+ * a sourcemap, or to JSON.stringify.
+ */
+let decodedMap;
+/**
+ * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects
+ * a sourcemap, or to JSON.stringify.
+ */
+let encodedMap;
+class TraceMap {
+ constructor(map, mapUrl) {
+ const isString = typeof map === 'string';
+ if (!isString && map._decodedMemo)
+ return map;
+ const parsed = (isString ? JSON.parse(map) : map);
+ const { version, file, names, sourceRoot, sources, sourcesContent } = parsed;
+ this.version = version;
+ this.file = file;
+ this.names = names;
+ this.sourceRoot = sourceRoot;
+ this.sources = sources;
+ this.sourcesContent = sourcesContent;
+ const from = resolve(sourceRoot || '', stripFilename(mapUrl));
+ this.resolvedSources = sources.map((s) => resolve(s || '', from));
+ const { mappings } = parsed;
+ if (typeof mappings === 'string') {
+ this._encoded = mappings;
+ this._decoded = undefined;
+ }
+ else {
+ this._encoded = undefined;
+ this._decoded = maybeSort(mappings, isString);
+ }
+ this._decodedMemo = memoizedState();
+ this._bySources = undefined;
+ this._bySourceMemos = undefined;
+ }
+}
+(() => {
+ encodedMappings = (map) => {
+ var _a;
+ return ((_a = map._encoded) !== null && _a !== void 0 ? _a : (map._encoded = encode(map._decoded)));
+ };
+ decodedMappings = (map) => {
+ return (map._decoded || (map._decoded = decode(map._encoded)));
+ };
+ traceSegment = (map, line, column) => {
+ const decoded = decodedMappings(map);
+ // It's common for parent source maps to have pointers to lines that have no
+ // mapping (like a "//# sourceMappingURL=") at the end of the child file.
+ if (line >= decoded.length)
+ return null;
+ const segments = decoded[line];
+ const index = traceSegmentInternal(segments, map._decodedMemo, line, column, GREATEST_LOWER_BOUND);
+ return index === -1 ? null : segments[index];
+ };
+ originalPositionFor = (map, { line, column, bias }) => {
+ line--;
+ if (line < 0)
+ throw new Error(LINE_GTR_ZERO);
+ if (column < 0)
+ throw new Error(COL_GTR_EQ_ZERO);
+ const decoded = decodedMappings(map);
+ // It's common for parent source maps to have pointers to lines that have no
+ // mapping (like a "//# sourceMappingURL=") at the end of the child file.
+ if (line >= decoded.length)
+ return OMapping(null, null, null, null);
+ const segments = decoded[line];
+ const index = traceSegmentInternal(segments, map._decodedMemo, line, column, bias || GREATEST_LOWER_BOUND);
+ if (index === -1)
+ return OMapping(null, null, null, null);
+ const segment = segments[index];
+ if (segment.length === 1)
+ return OMapping(null, null, null, null);
+ const { names, resolvedSources } = map;
+ return OMapping(resolvedSources[segment[SOURCES_INDEX]], segment[SOURCE_LINE] + 1, segment[SOURCE_COLUMN], segment.length === 5 ? names[segment[NAMES_INDEX]] : null);
+ };
+ allGeneratedPositionsFor = (map, { source, line, column, bias }) => {
+ // SourceMapConsumer uses LEAST_UPPER_BOUND for some reason, so we follow suit.
+ return generatedPosition(map, source, line, column, bias || LEAST_UPPER_BOUND, true);
+ };
+ generatedPositionFor = (map, { source, line, column, bias }) => {
+ return generatedPosition(map, source, line, column, bias || GREATEST_LOWER_BOUND, false);
+ };
+ eachMapping = (map, cb) => {
+ const decoded = decodedMappings(map);
+ const { names, resolvedSources } = map;
+ for (let i = 0; i < decoded.length; i++) {
+ const line = decoded[i];
+ for (let j = 0; j < line.length; j++) {
+ const seg = line[j];
+ const generatedLine = i + 1;
+ const generatedColumn = seg[0];
+ let source = null;
+ let originalLine = null;
+ let originalColumn = null;
+ let name = null;
+ if (seg.length !== 1) {
+ source = resolvedSources[seg[1]];
+ originalLine = seg[2] + 1;
+ originalColumn = seg[3];
+ }
+ if (seg.length === 5)
+ name = names[seg[4]];
+ cb({
+ generatedLine,
+ generatedColumn,
+ source,
+ originalLine,
+ originalColumn,
+ name,
+ });
+ }
+ }
+ };
+ sourceContentFor = (map, source) => {
+ const { sources, resolvedSources, sourcesContent } = map;
+ if (sourcesContent == null)
+ return null;
+ let index = sources.indexOf(source);
+ if (index === -1)
+ index = resolvedSources.indexOf(source);
+ return index === -1 ? null : sourcesContent[index];
+ };
+ presortedDecodedMap = (map, mapUrl) => {
+ const tracer = new TraceMap(clone(map, []), mapUrl);
+ tracer._decoded = map.mappings;
+ return tracer;
+ };
+ decodedMap = (map) => {
+ return clone(map, decodedMappings(map));
+ };
+ encodedMap = (map) => {
+ return clone(map, encodedMappings(map));
+ };
+ function generatedPosition(map, source, line, column, bias, all) {
+ line--;
+ if (line < 0)
+ throw new Error(LINE_GTR_ZERO);
+ if (column < 0)
+ throw new Error(COL_GTR_EQ_ZERO);
+ const { sources, resolvedSources } = map;
+ let sourceIndex = sources.indexOf(source);
+ if (sourceIndex === -1)
+ sourceIndex = resolvedSources.indexOf(source);
+ if (sourceIndex === -1)
+ return all ? [] : GMapping(null, null);
+ const generated = (map._bySources || (map._bySources = buildBySources(decodedMappings(map), (map._bySourceMemos = sources.map(memoizedState)))));
+ const segments = generated[sourceIndex][line];
+ if (segments == null)
+ return all ? [] : GMapping(null, null);
+ const memo = map._bySourceMemos[sourceIndex];
+ if (all)
+ return sliceGeneratedPositions(segments, memo, line, column, bias);
+ const index = traceSegmentInternal(segments, memo, line, column, bias);
+ if (index === -1)
+ return GMapping(null, null);
+ const segment = segments[index];
+ return GMapping(segment[REV_GENERATED_LINE] + 1, segment[REV_GENERATED_COLUMN]);
+ }
+})();
+function clone(map, mappings) {
+ return {
+ version: map.version,
+ file: map.file,
+ names: map.names,
+ sourceRoot: map.sourceRoot,
+ sources: map.sources,
+ sourcesContent: map.sourcesContent,
+ mappings,
+ };
+}
+function OMapping(source, line, column, name) {
+ return { source, line, column, name };
+}
+function GMapping(line, column) {
+ return { line, column };
+}
+function traceSegmentInternal(segments, memo, line, column, bias) {
+ let index = memoizedBinarySearch(segments, column, memo, line);
+ if (found) {
+ index = (bias === LEAST_UPPER_BOUND ? upperBound : lowerBound)(segments, column, index);
+ }
+ else if (bias === LEAST_UPPER_BOUND)
+ index++;
+ if (index === -1 || index === segments.length)
+ return -1;
+ return index;
+}
+function sliceGeneratedPositions(segments, memo, line, column, bias) {
+ let min = traceSegmentInternal(segments, memo, line, column, GREATEST_LOWER_BOUND);
+ // We ignored the bias when tracing the segment so that we're guarnateed to find the first (in
+ // insertion order) segment that matched. Even if we did respect the bias when tracing, we would
+ // still need to call `lowerBound()` to find the first segment, which is slower than just looking
+ // for the GREATEST_LOWER_BOUND to begin with. The only difference that matters for us is when the
+ // binary search didn't match, in which case GREATEST_LOWER_BOUND just needs to increment to
+ // match LEAST_UPPER_BOUND.
+ if (!found && bias === LEAST_UPPER_BOUND)
+ min++;
+ if (min === -1 || min === segments.length)
+ return [];
+ // We may have found the segment that started at an earlier column. If this is the case, then we
+ // need to slice all generated segments that match _that_ column, because all such segments span
+ // to our desired column.
+ const matchedColumn = found ? column : segments[min][COLUMN];
+ // The binary search is not guaranteed to find the lower bound when a match wasn't found.
+ if (!found)
+ min = lowerBound(segments, matchedColumn, min);
+ const max = upperBound(segments, matchedColumn, min);
+ const result = [];
+ for (; min <= max; min++) {
+ const segment = segments[min];
+ result.push(GMapping(segment[REV_GENERATED_LINE] + 1, segment[REV_GENERATED_COLUMN]));
+ }
+ return result;
+}
+
+export { AnyMap, GREATEST_LOWER_BOUND, LEAST_UPPER_BOUND, TraceMap, allGeneratedPositionsFor, decodedMap, decodedMappings, eachMapping, encodedMap, encodedMappings, generatedPositionFor, originalPositionFor, presortedDecodedMap, sourceContentFor, traceSegment };
+//# sourceMappingURL=trace-mapping.mjs.map
diff --git a/chromium/third_party/node/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js b/chromium/third_party/node/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js
new file mode 100644
index 00000000000..a3251f166ba
--- /dev/null
+++ b/chromium/third_party/node/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js
@@ -0,0 +1,566 @@
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@jridgewell/sourcemap-codec'), require('@jridgewell/resolve-uri')) :
+ typeof define === 'function' && define.amd ? define(['exports', '@jridgewell/sourcemap-codec', '@jridgewell/resolve-uri'], factory) :
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.traceMapping = {}, global.sourcemapCodec, global.resolveURI));
+})(this, (function (exports, sourcemapCodec, resolveUri) { 'use strict';
+
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
+
+ var resolveUri__default = /*#__PURE__*/_interopDefaultLegacy(resolveUri);
+
+ function resolve(input, base) {
+ // The base is always treated as a directory, if it's not empty.
+ // https://github.com/mozilla/source-map/blob/8cb3ee57/lib/util.js#L327
+ // https://github.com/chromium/chromium/blob/da4adbb3/third_party/blink/renderer/devtools/front_end/sdk/SourceMap.js#L400-L401
+ if (base && !base.endsWith('/'))
+ base += '/';
+ return resolveUri__default["default"](input, base);
+ }
+
+ /**
+ * Removes everything after the last "/", but leaves the slash.
+ */
+ function stripFilename(path) {
+ if (!path)
+ return '';
+ const index = path.lastIndexOf('/');
+ return path.slice(0, index + 1);
+ }
+
+ const COLUMN = 0;
+ const SOURCES_INDEX = 1;
+ const SOURCE_LINE = 2;
+ const SOURCE_COLUMN = 3;
+ const NAMES_INDEX = 4;
+ const REV_GENERATED_LINE = 1;
+ const REV_GENERATED_COLUMN = 2;
+
+ function maybeSort(mappings, owned) {
+ const unsortedIndex = nextUnsortedSegmentLine(mappings, 0);
+ if (unsortedIndex === mappings.length)
+ return mappings;
+ // If we own the array (meaning we parsed it from JSON), then we're free to directly mutate it. If
+ // not, we do not want to modify the consumer's input array.
+ if (!owned)
+ mappings = mappings.slice();
+ for (let i = unsortedIndex; i < mappings.length; i = nextUnsortedSegmentLine(mappings, i + 1)) {
+ mappings[i] = sortSegments(mappings[i], owned);
+ }
+ return mappings;
+ }
+ function nextUnsortedSegmentLine(mappings, start) {
+ for (let i = start; i < mappings.length; i++) {
+ if (!isSorted(mappings[i]))
+ return i;
+ }
+ return mappings.length;
+ }
+ function isSorted(line) {
+ for (let j = 1; j < line.length; j++) {
+ if (line[j][COLUMN] < line[j - 1][COLUMN]) {
+ return false;
+ }
+ }
+ return true;
+ }
+ function sortSegments(line, owned) {
+ if (!owned)
+ line = line.slice();
+ return line.sort(sortComparator);
+ }
+ function sortComparator(a, b) {
+ return a[COLUMN] - b[COLUMN];
+ }
+
+ let found = false;
+ /**
+ * A binary search implementation that returns the index if a match is found.
+ * If no match is found, then the left-index (the index associated with the item that comes just
+ * before the desired index) is returned. To maintain proper sort order, a splice would happen at
+ * the next index:
+ *
+ * ```js
+ * const array = [1, 3];
+ * const needle = 2;
+ * const index = binarySearch(array, needle, (item, needle) => item - needle);
+ *
+ * assert.equal(index, 0);
+ * array.splice(index + 1, 0, needle);
+ * assert.deepEqual(array, [1, 2, 3]);
+ * ```
+ */
+ function binarySearch(haystack, needle, low, high) {
+ while (low <= high) {
+ const mid = low + ((high - low) >> 1);
+ const cmp = haystack[mid][COLUMN] - needle;
+ if (cmp === 0) {
+ found = true;
+ return mid;
+ }
+ if (cmp < 0) {
+ low = mid + 1;
+ }
+ else {
+ high = mid - 1;
+ }
+ }
+ found = false;
+ return low - 1;
+ }
+ function upperBound(haystack, needle, index) {
+ for (let i = index + 1; i < haystack.length; index = i++) {
+ if (haystack[i][COLUMN] !== needle)
+ break;
+ }
+ return index;
+ }
+ function lowerBound(haystack, needle, index) {
+ for (let i = index - 1; i >= 0; index = i--) {
+ if (haystack[i][COLUMN] !== needle)
+ break;
+ }
+ return index;
+ }
+ function memoizedState() {
+ return {
+ lastKey: -1,
+ lastNeedle: -1,
+ lastIndex: -1,
+ };
+ }
+ /**
+ * This overly complicated beast is just to record the last tested line/column and the resulting
+ * index, allowing us to skip a few tests if mappings are monotonically increasing.
+ */
+ function memoizedBinarySearch(haystack, needle, state, key) {
+ const { lastKey, lastNeedle, lastIndex } = state;
+ let low = 0;
+ let high = haystack.length - 1;
+ if (key === lastKey) {
+ if (needle === lastNeedle) {
+ found = lastIndex !== -1 && haystack[lastIndex][COLUMN] === needle;
+ return lastIndex;
+ }
+ if (needle >= lastNeedle) {
+ // lastIndex may be -1 if the previous needle was not found.
+ low = lastIndex === -1 ? 0 : lastIndex;
+ }
+ else {
+ high = lastIndex;
+ }
+ }
+ state.lastKey = key;
+ state.lastNeedle = needle;
+ return (state.lastIndex = binarySearch(haystack, needle, low, high));
+ }
+
+ // Rebuilds the original source files, with mappings that are ordered by source line/column instead
+ // of generated line/column.
+ function buildBySources(decoded, memos) {
+ const sources = memos.map(buildNullArray);
+ for (let i = 0; i < decoded.length; i++) {
+ const line = decoded[i];
+ for (let j = 0; j < line.length; j++) {
+ const seg = line[j];
+ if (seg.length === 1)
+ continue;
+ const sourceIndex = seg[SOURCES_INDEX];
+ const sourceLine = seg[SOURCE_LINE];
+ const sourceColumn = seg[SOURCE_COLUMN];
+ const originalSource = sources[sourceIndex];
+ const originalLine = (originalSource[sourceLine] || (originalSource[sourceLine] = []));
+ const memo = memos[sourceIndex];
+ // The binary search either found a match, or it found the left-index just before where the
+ // segment should go. Either way, we want to insert after that. And there may be multiple
+ // generated segments associated with an original location, so there may need to move several
+ // indexes before we find where we need to insert.
+ const index = upperBound(originalLine, sourceColumn, memoizedBinarySearch(originalLine, sourceColumn, memo, sourceLine));
+ insert(originalLine, (memo.lastIndex = index + 1), [sourceColumn, i, seg[COLUMN]]);
+ }
+ }
+ return sources;
+ }
+ function insert(array, index, value) {
+ for (let i = array.length; i > index; i--) {
+ array[i] = array[i - 1];
+ }
+ array[index] = value;
+ }
+ // Null arrays allow us to use ordered index keys without actually allocating contiguous memory like
+ // a real array. We use a null-prototype object to avoid prototype pollution and deoptimizations.
+ // Numeric properties on objects are magically sorted in ascending order by the engine regardless of
+ // the insertion order. So, by setting any numeric keys, even out of order, we'll get ascending
+ // order when iterating with for-in.
+ function buildNullArray() {
+ return { __proto__: null };
+ }
+
+ const AnyMap = function (map, mapUrl) {
+ const parsed = typeof map === 'string' ? JSON.parse(map) : map;
+ if (!('sections' in parsed))
+ return new TraceMap(parsed, mapUrl);
+ const mappings = [];
+ const sources = [];
+ const sourcesContent = [];
+ const names = [];
+ recurse(parsed, mapUrl, mappings, sources, sourcesContent, names, 0, 0, Infinity, Infinity);
+ const joined = {
+ version: 3,
+ file: parsed.file,
+ names,
+ sources,
+ sourcesContent,
+ mappings,
+ };
+ return exports.presortedDecodedMap(joined);
+ };
+ function recurse(input, mapUrl, mappings, sources, sourcesContent, names, lineOffset, columnOffset, stopLine, stopColumn) {
+ const { sections } = input;
+ for (let i = 0; i < sections.length; i++) {
+ const { map, offset } = sections[i];
+ let sl = stopLine;
+ let sc = stopColumn;
+ if (i + 1 < sections.length) {
+ const nextOffset = sections[i + 1].offset;
+ sl = Math.min(stopLine, lineOffset + nextOffset.line);
+ if (sl === stopLine) {
+ sc = Math.min(stopColumn, columnOffset + nextOffset.column);
+ }
+ else if (sl < stopLine) {
+ sc = columnOffset + nextOffset.column;
+ }
+ }
+ addSection(map, mapUrl, mappings, sources, sourcesContent, names, lineOffset + offset.line, columnOffset + offset.column, sl, sc);
+ }
+ }
+ function addSection(input, mapUrl, mappings, sources, sourcesContent, names, lineOffset, columnOffset, stopLine, stopColumn) {
+ if ('sections' in input)
+ return recurse(...arguments);
+ const map = new TraceMap(input, mapUrl);
+ const sourcesOffset = sources.length;
+ const namesOffset = names.length;
+ const decoded = exports.decodedMappings(map);
+ const { resolvedSources, sourcesContent: contents } = map;
+ append(sources, resolvedSources);
+ append(names, map.names);
+ if (contents)
+ append(sourcesContent, contents);
+ else
+ for (let i = 0; i < resolvedSources.length; i++)
+ sourcesContent.push(null);
+ for (let i = 0; i < decoded.length; i++) {
+ const lineI = lineOffset + i;
+ // We can only add so many lines before we step into the range that the next section's map
+ // controls. When we get to the last line, then we'll start checking the segments to see if
+ // they've crossed into the column range. But it may not have any columns that overstep, so we
+ // still need to check that we don't overstep lines, too.
+ if (lineI > stopLine)
+ return;
+ // The out line may already exist in mappings (if we're continuing the line started by a
+ // previous section). Or, we may have jumped ahead several lines to start this section.
+ const out = getLine(mappings, lineI);
+ // On the 0th loop, the section's column offset shifts us forward. On all other lines (since the
+ // map can be multiple lines), it doesn't.
+ const cOffset = i === 0 ? columnOffset : 0;
+ const line = decoded[i];
+ for (let j = 0; j < line.length; j++) {
+ const seg = line[j];
+ const column = cOffset + seg[COLUMN];
+ // If this segment steps into the column range that the next section's map controls, we need
+ // to stop early.
+ if (lineI === stopLine && column >= stopColumn)
+ return;
+ if (seg.length === 1) {
+ out.push([column]);
+ continue;
+ }
+ const sourcesIndex = sourcesOffset + seg[SOURCES_INDEX];
+ const sourceLine = seg[SOURCE_LINE];
+ const sourceColumn = seg[SOURCE_COLUMN];
+ out.push(seg.length === 4
+ ? [column, sourcesIndex, sourceLine, sourceColumn]
+ : [column, sourcesIndex, sourceLine, sourceColumn, namesOffset + seg[NAMES_INDEX]]);
+ }
+ }
+ }
+ function append(arr, other) {
+ for (let i = 0; i < other.length; i++)
+ arr.push(other[i]);
+ }
+ function getLine(arr, index) {
+ for (let i = arr.length; i <= index; i++)
+ arr[i] = [];
+ return arr[index];
+ }
+
+ const LINE_GTR_ZERO = '`line` must be greater than 0 (lines start at line 1)';
+ const COL_GTR_EQ_ZERO = '`column` must be greater than or equal to 0 (columns start at column 0)';
+ const LEAST_UPPER_BOUND = -1;
+ const GREATEST_LOWER_BOUND = 1;
+ /**
+ * Returns the encoded (VLQ string) form of the SourceMap's mappings field.
+ */
+ exports.encodedMappings = void 0;
+ /**
+ * Returns the decoded (array of lines of segments) form of the SourceMap's mappings field.
+ */
+ exports.decodedMappings = void 0;
+ /**
+ * A low-level API to find the segment associated with a generated line/column (think, from a
+ * stack trace). Line and column here are 0-based, unlike `originalPositionFor`.
+ */
+ exports.traceSegment = void 0;
+ /**
+ * A higher-level API to find the source/line/column associated with a generated line/column
+ * (think, from a stack trace). Line is 1-based, but column is 0-based, due to legacy behavior in
+ * `source-map` library.
+ */
+ exports.originalPositionFor = void 0;
+ /**
+ * Finds the generated line/column position of the provided source/line/column source position.
+ */
+ exports.generatedPositionFor = void 0;
+ /**
+ * Finds all generated line/column positions of the provided source/line/column source position.
+ */
+ exports.allGeneratedPositionsFor = void 0;
+ /**
+ * Iterates each mapping in generated position order.
+ */
+ exports.eachMapping = void 0;
+ /**
+ * Retrieves the source content for a particular source, if its found. Returns null if not.
+ */
+ exports.sourceContentFor = void 0;
+ /**
+ * A helper that skips sorting of the input map's mappings array, which can be expensive for larger
+ * maps.
+ */
+ exports.presortedDecodedMap = void 0;
+ /**
+ * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects
+ * a sourcemap, or to JSON.stringify.
+ */
+ exports.decodedMap = void 0;
+ /**
+ * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects
+ * a sourcemap, or to JSON.stringify.
+ */
+ exports.encodedMap = void 0;
+ class TraceMap {
+ constructor(map, mapUrl) {
+ const isString = typeof map === 'string';
+ if (!isString && map._decodedMemo)
+ return map;
+ const parsed = (isString ? JSON.parse(map) : map);
+ const { version, file, names, sourceRoot, sources, sourcesContent } = parsed;
+ this.version = version;
+ this.file = file;
+ this.names = names;
+ this.sourceRoot = sourceRoot;
+ this.sources = sources;
+ this.sourcesContent = sourcesContent;
+ const from = resolve(sourceRoot || '', stripFilename(mapUrl));
+ this.resolvedSources = sources.map((s) => resolve(s || '', from));
+ const { mappings } = parsed;
+ if (typeof mappings === 'string') {
+ this._encoded = mappings;
+ this._decoded = undefined;
+ }
+ else {
+ this._encoded = undefined;
+ this._decoded = maybeSort(mappings, isString);
+ }
+ this._decodedMemo = memoizedState();
+ this._bySources = undefined;
+ this._bySourceMemos = undefined;
+ }
+ }
+ (() => {
+ exports.encodedMappings = (map) => {
+ var _a;
+ return ((_a = map._encoded) !== null && _a !== void 0 ? _a : (map._encoded = sourcemapCodec.encode(map._decoded)));
+ };
+ exports.decodedMappings = (map) => {
+ return (map._decoded || (map._decoded = sourcemapCodec.decode(map._encoded)));
+ };
+ exports.traceSegment = (map, line, column) => {
+ const decoded = exports.decodedMappings(map);
+ // It's common for parent source maps to have pointers to lines that have no
+ // mapping (like a "//# sourceMappingURL=") at the end of the child file.
+ if (line >= decoded.length)
+ return null;
+ const segments = decoded[line];
+ const index = traceSegmentInternal(segments, map._decodedMemo, line, column, GREATEST_LOWER_BOUND);
+ return index === -1 ? null : segments[index];
+ };
+ exports.originalPositionFor = (map, { line, column, bias }) => {
+ line--;
+ if (line < 0)
+ throw new Error(LINE_GTR_ZERO);
+ if (column < 0)
+ throw new Error(COL_GTR_EQ_ZERO);
+ const decoded = exports.decodedMappings(map);
+ // It's common for parent source maps to have pointers to lines that have no
+ // mapping (like a "//# sourceMappingURL=") at the end of the child file.
+ if (line >= decoded.length)
+ return OMapping(null, null, null, null);
+ const segments = decoded[line];
+ const index = traceSegmentInternal(segments, map._decodedMemo, line, column, bias || GREATEST_LOWER_BOUND);
+ if (index === -1)
+ return OMapping(null, null, null, null);
+ const segment = segments[index];
+ if (segment.length === 1)
+ return OMapping(null, null, null, null);
+ const { names, resolvedSources } = map;
+ return OMapping(resolvedSources[segment[SOURCES_INDEX]], segment[SOURCE_LINE] + 1, segment[SOURCE_COLUMN], segment.length === 5 ? names[segment[NAMES_INDEX]] : null);
+ };
+ exports.allGeneratedPositionsFor = (map, { source, line, column, bias }) => {
+ // SourceMapConsumer uses LEAST_UPPER_BOUND for some reason, so we follow suit.
+ return generatedPosition(map, source, line, column, bias || LEAST_UPPER_BOUND, true);
+ };
+ exports.generatedPositionFor = (map, { source, line, column, bias }) => {
+ return generatedPosition(map, source, line, column, bias || GREATEST_LOWER_BOUND, false);
+ };
+ exports.eachMapping = (map, cb) => {
+ const decoded = exports.decodedMappings(map);
+ const { names, resolvedSources } = map;
+ for (let i = 0; i < decoded.length; i++) {
+ const line = decoded[i];
+ for (let j = 0; j < line.length; j++) {
+ const seg = line[j];
+ const generatedLine = i + 1;
+ const generatedColumn = seg[0];
+ let source = null;
+ let originalLine = null;
+ let originalColumn = null;
+ let name = null;
+ if (seg.length !== 1) {
+ source = resolvedSources[seg[1]];
+ originalLine = seg[2] + 1;
+ originalColumn = seg[3];
+ }
+ if (seg.length === 5)
+ name = names[seg[4]];
+ cb({
+ generatedLine,
+ generatedColumn,
+ source,
+ originalLine,
+ originalColumn,
+ name,
+ });
+ }
+ }
+ };
+ exports.sourceContentFor = (map, source) => {
+ const { sources, resolvedSources, sourcesContent } = map;
+ if (sourcesContent == null)
+ return null;
+ let index = sources.indexOf(source);
+ if (index === -1)
+ index = resolvedSources.indexOf(source);
+ return index === -1 ? null : sourcesContent[index];
+ };
+ exports.presortedDecodedMap = (map, mapUrl) => {
+ const tracer = new TraceMap(clone(map, []), mapUrl);
+ tracer._decoded = map.mappings;
+ return tracer;
+ };
+ exports.decodedMap = (map) => {
+ return clone(map, exports.decodedMappings(map));
+ };
+ exports.encodedMap = (map) => {
+ return clone(map, exports.encodedMappings(map));
+ };
+ function generatedPosition(map, source, line, column, bias, all) {
+ line--;
+ if (line < 0)
+ throw new Error(LINE_GTR_ZERO);
+ if (column < 0)
+ throw new Error(COL_GTR_EQ_ZERO);
+ const { sources, resolvedSources } = map;
+ let sourceIndex = sources.indexOf(source);
+ if (sourceIndex === -1)
+ sourceIndex = resolvedSources.indexOf(source);
+ if (sourceIndex === -1)
+ return all ? [] : GMapping(null, null);
+ const generated = (map._bySources || (map._bySources = buildBySources(exports.decodedMappings(map), (map._bySourceMemos = sources.map(memoizedState)))));
+ const segments = generated[sourceIndex][line];
+ if (segments == null)
+ return all ? [] : GMapping(null, null);
+ const memo = map._bySourceMemos[sourceIndex];
+ if (all)
+ return sliceGeneratedPositions(segments, memo, line, column, bias);
+ const index = traceSegmentInternal(segments, memo, line, column, bias);
+ if (index === -1)
+ return GMapping(null, null);
+ const segment = segments[index];
+ return GMapping(segment[REV_GENERATED_LINE] + 1, segment[REV_GENERATED_COLUMN]);
+ }
+ })();
+ function clone(map, mappings) {
+ return {
+ version: map.version,
+ file: map.file,
+ names: map.names,
+ sourceRoot: map.sourceRoot,
+ sources: map.sources,
+ sourcesContent: map.sourcesContent,
+ mappings,
+ };
+ }
+ function OMapping(source, line, column, name) {
+ return { source, line, column, name };
+ }
+ function GMapping(line, column) {
+ return { line, column };
+ }
+ function traceSegmentInternal(segments, memo, line, column, bias) {
+ let index = memoizedBinarySearch(segments, column, memo, line);
+ if (found) {
+ index = (bias === LEAST_UPPER_BOUND ? upperBound : lowerBound)(segments, column, index);
+ }
+ else if (bias === LEAST_UPPER_BOUND)
+ index++;
+ if (index === -1 || index === segments.length)
+ return -1;
+ return index;
+ }
+ function sliceGeneratedPositions(segments, memo, line, column, bias) {
+ let min = traceSegmentInternal(segments, memo, line, column, GREATEST_LOWER_BOUND);
+ // We ignored the bias when tracing the segment so that we're guarnateed to find the first (in
+ // insertion order) segment that matched. Even if we did respect the bias when tracing, we would
+ // still need to call `lowerBound()` to find the first segment, which is slower than just looking
+ // for the GREATEST_LOWER_BOUND to begin with. The only difference that matters for us is when the
+ // binary search didn't match, in which case GREATEST_LOWER_BOUND just needs to increment to
+ // match LEAST_UPPER_BOUND.
+ if (!found && bias === LEAST_UPPER_BOUND)
+ min++;
+ if (min === -1 || min === segments.length)
+ return [];
+ // We may have found the segment that started at an earlier column. If this is the case, then we
+ // need to slice all generated segments that match _that_ column, because all such segments span
+ // to our desired column.
+ const matchedColumn = found ? column : segments[min][COLUMN];
+ // The binary search is not guaranteed to find the lower bound when a match wasn't found.
+ if (!found)
+ min = lowerBound(segments, matchedColumn, min);
+ const max = upperBound(segments, matchedColumn, min);
+ const result = [];
+ for (; min <= max; min++) {
+ const segment = segments[min];
+ result.push(GMapping(segment[REV_GENERATED_LINE] + 1, segment[REV_GENERATED_COLUMN]));
+ }
+ return result;
+ }
+
+ exports.AnyMap = AnyMap;
+ exports.GREATEST_LOWER_BOUND = GREATEST_LOWER_BOUND;
+ exports.LEAST_UPPER_BOUND = LEAST_UPPER_BOUND;
+ exports.TraceMap = TraceMap;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+}));
+//# sourceMappingURL=trace-mapping.umd.js.map
diff --git a/chromium/third_party/node/node_modules/@jridgewell/trace-mapping/package.json b/chromium/third_party/node/node_modules/@jridgewell/trace-mapping/package.json
new file mode 100644
index 00000000000..db3f8ac4853
--- /dev/null
+++ b/chromium/third_party/node/node_modules/@jridgewell/trace-mapping/package.json
@@ -0,0 +1,75 @@
+{
+ "name": "@jridgewell/trace-mapping",
+ "version": "0.3.17",
+ "description": "Trace the original position through a source map",
+ "keywords": [
+ "source",
+ "map"
+ ],
+ "main": "dist/trace-mapping.umd.js",
+ "module": "dist/trace-mapping.mjs",
+ "typings": "dist/types/trace-mapping.d.ts",
+ "files": [
+ "dist"
+ ],
+ "exports": {
+ ".": [
+ {
+ "types": "./dist/types/trace-mapping.d.ts",
+ "browser": "./dist/trace-mapping.umd.js",
+ "require": "./dist/trace-mapping.umd.js",
+ "import": "./dist/trace-mapping.mjs"
+ },
+ "./dist/trace-mapping.umd.js"
+ ],
+ "./package.json": "./package.json"
+ },
+ "author": "Justin Ridgewell <justin@ridgewell.name>",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/jridgewell/trace-mapping.git"
+ },
+ "license": "MIT",
+ "scripts": {
+ "benchmark": "run-s build:rollup benchmark:*",
+ "benchmark:install": "cd benchmark && npm install",
+ "benchmark:only": "node --expose-gc benchmark/index.mjs",
+ "build": "run-s -n build:*",
+ "build:rollup": "rollup -c rollup.config.js",
+ "build:ts": "tsc --project tsconfig.build.json",
+ "lint": "run-s -n lint:*",
+ "lint:prettier": "npm run test:lint:prettier -- --write",
+ "lint:ts": "npm run test:lint:ts -- --fix",
+ "prebuild": "rm -rf dist",
+ "prepublishOnly": "npm run preversion",
+ "preversion": "run-s test build",
+ "test": "run-s -n test:lint test:only",
+ "test:debug": "ava debug",
+ "test:lint": "run-s -n test:lint:*",
+ "test:lint:prettier": "prettier --check '{src,test}/**/*.ts' '**/*.md'",
+ "test:lint:ts": "eslint '{src,test}/**/*.ts'",
+ "test:only": "c8 ava",
+ "test:watch": "ava --watch"
+ },
+ "devDependencies": {
+ "@rollup/plugin-typescript": "8.5.0",
+ "@typescript-eslint/eslint-plugin": "5.39.0",
+ "@typescript-eslint/parser": "5.39.0",
+ "ava": "4.3.3",
+ "benchmark": "2.1.4",
+ "c8": "7.12.0",
+ "esbuild": "0.15.10",
+ "eslint": "8.25.0",
+ "eslint-config-prettier": "8.5.0",
+ "eslint-plugin-no-only-tests": "3.0.0",
+ "npm-run-all": "4.1.5",
+ "prettier": "2.7.1",
+ "rollup": "2.79.1",
+ "tsx": "3.10.1",
+ "typescript": "4.8.4"
+ },
+ "dependencies": {
+ "@jridgewell/resolve-uri": "3.1.0",
+ "@jridgewell/sourcemap-codec": "1.4.14"
+ }
+}
diff --git a/chromium/third_party/skia/gn/sksl_tests.gni b/chromium/third_party/skia/gn/sksl_tests.gni
index 2ac52e543d4..3cc680bbe51 100644
--- a/chromium/third_party/skia/gn/sksl_tests.gni
+++ b/chromium/third_party/skia/gn/sksl_tests.gni
@@ -199,7 +199,9 @@ sksl_error_tests = [
"errors/PrivateTypes.rts",
"errors/PrivateVariables.rts",
"errors/ProgramTooLarge_Globals.rts",
+ "errors/ProgramTooLarge_Parameters.rts",
"errors/ProgramTooLarge_Stack.rts",
+ "errors/ProgramTooLarge_Struct.rts",
"errors/PrototypeInFuncBody.rts",
"errors/RTAdjustType.sksl",
"errors/ReadonlyWriteonly.compute",
diff --git a/chromium/third_party/skia/resources/sksl/BUILD.bazel b/chromium/third_party/skia/resources/sksl/BUILD.bazel
index e74be90d6aa..5c204f321f4 100644
--- a/chromium/third_party/skia/resources/sksl/BUILD.bazel
+++ b/chromium/third_party/skia/resources/sksl/BUILD.bazel
@@ -350,7 +350,9 @@ skia_filegroup(
"errors/PrivateTypes.rts",
"errors/PrivateVariables.rts",
"errors/ProgramTooLarge_Globals.rts",
+ "errors/ProgramTooLarge_Parameters.rts",
"errors/ProgramTooLarge_Stack.rts",
+ "errors/ProgramTooLarge_Struct.rts",
"errors/PrototypeInFuncBody.rts",
"errors/RTAdjustType.sksl",
"errors/ReadonlyWriteonly.compute",
diff --git a/chromium/third_party/skia/resources/sksl/errors/ProgramTooLarge_Globals.rts b/chromium/third_party/skia/resources/sksl/errors/ProgramTooLarge_Globals.rts
index af0ad17ce7a..ee2556bb1a9 100644
--- a/chromium/third_party/skia/resources/sksl/errors/ProgramTooLarge_Globals.rts
+++ b/chromium/third_party/skia/resources/sksl/errors/ProgramTooLarge_Globals.rts
@@ -6,11 +6,10 @@ struct S {
};
int small;
-S medium;
-S large[10];
-S extra_large[100];
-S xxl[50000];
-
+S medium[30];
+S large[50];
+S extra_large[70];
+S xxl[90];
/*%%*
global variable 'extra_large' exceeds the size limit
diff --git a/chromium/third_party/skia/resources/sksl/errors/ProgramTooLarge_Parameters.rts b/chromium/third_party/skia/resources/sksl/errors/ProgramTooLarge_Parameters.rts
new file mode 100644
index 00000000000..cb1225d2442
--- /dev/null
+++ b/chromium/third_party/skia/resources/sksl/errors/ProgramTooLarge_Parameters.rts
@@ -0,0 +1,17 @@
+struct S {
+ half4 ah4[1];
+ half ah[99990];
+ half4 h4;
+ half h;
+};
+
+void func(int small,
+ int parameters,
+ int are,
+ int allowed,
+ S big_chungus,
+ S no_report /*we don't need to report overflows past the first*/) {}
+
+/*%%*
+variable 'big_chungus' exceeds the stack size limit
+*%%*/ \ No newline at end of file
diff --git a/chromium/third_party/skia/resources/sksl/errors/ProgramTooLarge_Stack.rts b/chromium/third_party/skia/resources/sksl/errors/ProgramTooLarge_Stack.rts
index 4f004368a17..a8f5217359a 100644
--- a/chromium/third_party/skia/resources/sksl/errors/ProgramTooLarge_Stack.rts
+++ b/chromium/third_party/skia/resources/sksl/errors/ProgramTooLarge_Stack.rts
@@ -1,12 +1,12 @@
struct S {
half4 ah4[1];
- half ah[99999];
+ half ah[99990];
half4 h4;
half h;
};
void func() {
- int small;
+ int small, variables, are, allowed;
S big_chungus;
S no_report; // we don't need to report overflows past the first
}
diff --git a/chromium/third_party/skia/resources/sksl/errors/ProgramTooLarge_Struct.rts b/chromium/third_party/skia/resources/sksl/errors/ProgramTooLarge_Struct.rts
new file mode 100644
index 00000000000..690e1d37311
--- /dev/null
+++ b/chromium/third_party/skia/resources/sksl/errors/ProgramTooLarge_Struct.rts
@@ -0,0 +1,24 @@
+struct A {
+ int4 big[25001]; // 100,004 slots
+};
+
+struct B {
+ int4 a[12500]; // 50,000 slots
+ int b[49999]; // 99,999 slots
+ int c; // 100,000 slots
+};
+
+struct C {
+ int a[99999]; // 99,999 slots (safe)
+};
+
+struct D {
+ C a; // 99,999 slots
+ int b; // 100,000 slots
+};
+
+/*%%*
+array size is too large
+struct is too large
+struct is too large
+*%%*/
diff --git a/chromium/third_party/skia/src/sksl/dsl/DSLType.cpp b/chromium/third_party/skia/src/sksl/dsl/DSLType.cpp
index 6250795ed1e..d27c5c8bc6d 100644
--- a/chromium/third_party/skia/src/sksl/dsl/DSLType.cpp
+++ b/chromium/third_party/skia/src/sksl/dsl/DSLType.cpp
@@ -270,7 +270,7 @@ DSLExpression DSLType::Construct(DSLType type, SkSpan<DSLExpression> argArray) {
DSLType Array(const DSLType& base, int count, Position pos) {
count = base.skslType().convertArraySize(ThreadContext::Context(), pos,
- DSLExpression(count, pos).release());
+ DSLExpression(count, pos).release());
if (!count) {
return DSLType(kPoison_Type);
}
@@ -282,7 +282,7 @@ DSLType UnsizedArray(const DSLType& base, Position pos) {
return DSLType(kPoison_Type);
}
return ThreadContext::SymbolTable()->addArrayDimension(&base.skslType(),
- SkSL::Type::kUnsizedArray);
+ SkSL::Type::kUnsizedArray);
}
DSLType StructType(std::string_view name,
diff --git a/chromium/third_party/skia/src/sksl/ir/SkSLFunctionDefinition.cpp b/chromium/third_party/skia/src/sksl/ir/SkSLFunctionDefinition.cpp
index f5ff4f94114..b33a4352a62 100644
--- a/chromium/third_party/skia/src/sksl/ir/SkSLFunctionDefinition.cpp
+++ b/chromium/third_party/skia/src/sksl/ir/SkSLFunctionDefinition.cpp
@@ -37,6 +37,7 @@
#include <cstddef>
#include <forward_list>
#include <string_view>
+#include <vector>
namespace SkSL {
@@ -88,9 +89,29 @@ std::unique_ptr<FunctionDefinition> FunctionDefinition::Convert(const Context& c
bool builtin) {
class Finalizer : public ProgramWriter {
public:
- Finalizer(const Context& context, const FunctionDeclaration& function)
+ Finalizer(const Context& context, const FunctionDeclaration& function, Position pos)
: fContext(context)
- , fFunction(function) {}
+ , fFunction(function) {
+ // Function parameters count as local variables.
+ for (const Variable* var : function.parameters()) {
+ this->addLocalVariable(var, pos);
+ }
+ }
+
+ void addLocalVariable(const Variable* var, Position pos) {
+ // We count the number of slots used, but don't consider the precision of the base type.
+ // In practice, this reflects what GPUs actually do pretty well. (i.e., RelaxedPrecision
+ // math doesn't mean your variable takes less space.) We also don't attempt to reclaim
+ // slots at the end of a Block.
+ size_t prevSlotsUsed = fSlotsUsed;
+ fSlotsUsed = SkSafeMath::Add(fSlotsUsed, var->type().slotCount());
+ // To avoid overzealous error reporting, only trigger the error at the first
+ // place where the stack limit is exceeded.
+ if (prevSlotsUsed < kVariableSlotLimit && fSlotsUsed >= kVariableSlotLimit) {
+ fContext.fErrors->error(pos, "variable '" + std::string(var->name()) +
+ "' exceeds the stack size limit");
+ }
+ }
~Finalizer() override {
SkASSERT(fBreakableLevel == 0);
@@ -109,24 +130,12 @@ std::unique_ptr<FunctionDefinition> FunctionDefinition::Convert(const Context& c
bool visitStatement(Statement& stmt) override {
switch (stmt.kind()) {
case Statement::Kind::kVarDeclaration: {
- // We count the number of slots used, but don't consider the precision of the
- // base type. In practice, this reflects what GPUs really do pretty well.
- // (i.e., RelaxedPrecision math doesn't mean your variable takes less space.)
- // We also don't attempt to reclaim slots at the end of a Block.
- size_t prevSlotsUsed = fSlotsUsed;
const Variable* var = stmt.as<VarDeclaration>().var();
if (var->type().isOrContainsUnsizedArray()) {
fContext.fErrors->error(stmt.fPosition,
"unsized arrays are not permitted here");
- break;
- }
- fSlotsUsed = SkSafeMath::Add(fSlotsUsed, var->type().slotCount());
- // To avoid overzealous error reporting, only trigger the error at the first
- // place where the stack limit is exceeded.
- if (prevSlotsUsed < kVariableSlotLimit && fSlotsUsed >= kVariableSlotLimit) {
- fContext.fErrors->error(stmt.fPosition,
- "variable '" + std::string(var->name()) +
- "' exceeds the stack size limit");
+ } else {
+ this->addLocalVariable(var, stmt.fPosition);
}
break;
}
@@ -219,7 +228,7 @@ std::unique_ptr<FunctionDefinition> FunctionDefinition::Convert(const Context& c
using INHERITED = ProgramWriter;
};
- Finalizer(context, function).visitStatement(*body);
+ Finalizer(context, function, pos).visitStatement(*body);
if (function.isMain() && ProgramConfig::IsVertex(context.fConfig->fKind)) {
append_rtadjust_fixup_to_vertex_main(context, function, body->as<Block>());
}
diff --git a/chromium/third_party/skia/src/sksl/ir/SkSLType.cpp b/chromium/third_party/skia/src/sksl/ir/SkSLType.cpp
index a909b5118bd..265d49dcc8a 100644
--- a/chromium/third_party/skia/src/sksl/ir/SkSLType.cpp
+++ b/chromium/third_party/skia/src/sksl/ir/SkSLType.cpp
@@ -9,9 +9,9 @@
#include "include/private/SkSLLayout.h"
#include "include/private/SkSLString.h"
-#include "include/private/base/SkTFitsIn.h"
#include "include/sksl/SkSLErrorReporter.h"
#include "src/base/SkMathPriv.h"
+#include "src/base/SkSafeMath.h"
#include "src/sksl/SkSLBuiltinTypes.h"
#include "src/sksl/SkSLConstantFolder.h"
#include "src/sksl/SkSLContext.h"
@@ -694,6 +694,17 @@ std::unique_ptr<Type> Type::MakeStructType(const Context& context,
break;
}
}
+ size_t slots = 0;
+ for (const Field& field : fields) {
+ if (field.fType->isUnsizedArray()) {
+ continue;
+ }
+ slots = SkSafeMath::Add(slots, field.fType->slotCount());
+ if (slots >= kVariableSlotLimit) {
+ context.fErrors->error(pos, "struct is too large");
+ break;
+ }
+ }
return std::make_unique<StructType>(pos, name, std::move(fields), interfaceBlock);
}
@@ -1164,8 +1175,9 @@ bool Type::checkIfUsableInArray(const Context& context, Position arrayPos) const
return true;
}
-SKSL_INT Type::convertArraySize(const Context& context, Position arrayPos,
- std::unique_ptr<Expression> size) const {
+SKSL_INT Type::convertArraySize(const Context& context,
+ Position arrayPos,
+ std::unique_ptr<Expression> size) const {
size = context.fTypes.fInt->coerceExpression(std::move(size), context);
if (!size) {
return 0;
@@ -1182,7 +1194,7 @@ SKSL_INT Type::convertArraySize(const Context& context, Position arrayPos,
context.fErrors->error(size->fPosition, "array size must be positive");
return 0;
}
- if (!SkTFitsIn<int32_t>(count)) {
+ if (SkSafeMath::Mul(this->slotCount(), count) > kVariableSlotLimit) {
context.fErrors->error(size->fPosition, "array size is too large");
return 0;
}
diff --git a/chromium/tools/mb/mb_config.pyl b/chromium/tools/mb/mb_config.pyl
index 308f780c81e..a7753ceb0b8 100644
--- a/chromium/tools/mb/mb_config.pyl
+++ b/chromium/tools/mb/mb_config.pyl
@@ -940,25 +940,25 @@
'lacros-arm-generic-chrome-skylab': 'chromeos_arm-generic_lacros_official_skylab',
'lacros-arm64-generic-chrome': 'chromeos_arm64-generic_lacros_official',
'lacros-arm64-generic-chrome-skylab': 'chromeos_arm64-generic_lacros_official_skylab',
- 'linux-chrome': 'official_goma',
- 'linux-chrome-beta': 'official_goma',
- 'linux-chrome-stable': 'official_goma',
- 'linux-chromeos-chrome': 'official_goma_chromeos_include_unwind_tables',
- 'linux-chromeos-compile-chrome': 'official_goma_chromeos_include_unwind_tables',
- 'linux-finch-smoke-chrome': 'official_goma',
- 'mac-arm64-finch-smoke-chrome': 'official_goma_mac_arm',
- 'mac-chrome': 'official_goma_mac',
- 'mac-chrome-beta': 'official_goma_mac',
- 'mac-chrome-stable': 'official_goma_mac',
- 'win-branded-rel': 'chrome_branded_goma_minimal_symbols',
+ 'linux-chrome': 'official_reclient',
+ 'linux-chrome-beta': 'official_reclient',
+ 'linux-chrome-stable': 'official_reclient',
+ 'linux-chromeos-chrome': 'official_reclient_chromeos_include_unwind_tables',
+ 'linux-chromeos-compile-chrome': 'official_reclient_chromeos_include_unwind_tables',
+ 'linux-finch-smoke-chrome': 'official_reclient',
+ 'mac-arm64-finch-smoke-chrome': 'official_reclient_mac_arm',
+ 'mac-chrome': 'official_reclient_mac',
+ 'mac-chrome-beta': 'official_reclient_mac',
+ 'mac-chrome-stable': 'official_reclient_mac',
+ 'win-branded-compile-rel': 'chrome_branded_reclient_minimal_symbols',
'win-celab-try-rel': 'official_celab_release_bot',
- 'win-chrome': 'official_goma_x86',
- 'win-chrome-beta': 'official_goma_x86',
- 'win-chrome-stable': 'official_goma_x86',
- 'win-finch-smoke-chrome': 'official_goma',
- 'win64-chrome': 'official_goma_x64',
- 'win64-chrome-beta': 'official_goma_x64',
- 'win64-chrome-stable': 'official_goma_x64',
+ 'win-chrome': 'official_reclient_x86',
+ 'win-chrome-beta': 'official_reclient_x86',
+ 'win-chrome-stable': 'official_reclient_x86',
+ 'win-finch-smoke-chrome': 'official_reclient',
+ 'win64-chrome': 'official_reclient_x64',
+ 'win64-chrome-beta': 'official_reclient_x64',
+ 'win64-chrome-stable': 'official_reclient_x64',
},
'tryserver.chrome.captured-sites': {
@@ -1263,7 +1263,7 @@
'ios-simulator-code-coverage': 'clang_code_coverage_ios_xctest_sim_reclient',
'ios-simulator-cr-recipe': 'ios_simulator_debug_static_bot_xctest',
'ios-simulator-cronet': 'ios_cronet_xctest_reclient',
- 'ios-simulator-full-configs': 'ios_simulator_code_coverage_partial_instrumentation_xctest',
+ 'ios-simulator-full-configs': 'ios_simulator_code_coverage_partial_instrumentation_xctest_reclient',
'ios-simulator-inverse-fieldtrials-fyi': 'ios_simulator_debug_static_bot_invert_fieldtrials_xctest_reclient',
'ios-simulator-multi-window': 'ios_simulator_debug_static_bot_xctest_reclient',
'ios-simulator-noncq': 'ios_simulator_debug_static_bot_xctest_reclient',
@@ -1278,7 +1278,7 @@
'mac-inverse-fieldtrials-fyi-rel': 'gpu_tests_release_trybot_invert_fieldtrials',
'mac-osxbeta-rel': 'gpu_tests_debug_trybot_reclient',
'mac-perfetto-rel': 'perfetto_release_trybot_reclient',
- 'mac-rel': 'gpu_tests_release_trybot_no_symbols_mac_code_coverage',
+ 'mac-rel': 'gpu_tests_release_trybot_no_symbols_mac_code_coverage_reclient',
'mac10.15-wpt-content-shell-fyi-rel': 'release_trybot_minimal_symbols_reclient',
'mac11-arm64-rel': 'mac_arm64_gpu_tests_release_trybot_no_symbols_reclient',
'mac11-wpt-content-shell-fyi-rel': 'release_trybot_minimal_symbols_reclient',
@@ -1294,7 +1294,7 @@
'mac_chromium_11.0_rel_ng': 'release_trybot_reclient',
'mac_chromium_archive_rel_ng': 'release_bot_mac_strip_minimal_symbols_reclient',
'mac_chromium_asan_rel_ng': 'asan_dcheck_disable_nacl_release_bot_reclient',
- 'mac_chromium_compile_dbg_ng': 'gpu_tests_debug_bot',
+ 'mac_chromium_compile_dbg_ng': 'gpu_tests_debug_bot_reclient',
'mac_chromium_compile_rel_ng': 'gpu_tests_release_trybot_reclient',
'mac_chromium_dbg_ng': 'gpu_tests_debug_bot_reclient',
'mac_optional_gpu_tests_rel': 'gpu_fyi_tests_release_trybot_reclient',
@@ -1943,10 +1943,6 @@
'cfi_full', 'cfi_icall', 'cfi_diag', 'thin_lto', 'release', 'static', 'dcheck_always_on', 'reclient',
],
- 'chrome_branded_goma_minimal_symbols': [
- 'chrome_branded', 'goma', 'minimal_symbols', 'release_bot',
- ],
-
'chrome_branded_reclient_minimal_symbols': [
'chrome_branded', 'minimal_symbols', 'release_bot_reclient',
],
@@ -2757,8 +2753,8 @@
'chrome_for_testing',
],
- 'gpu_tests_release_trybot_no_symbols_mac_code_coverage': [
- 'gpu_tests', 'release_trybot', 'no_symbols',
+ 'gpu_tests_release_trybot_no_symbols_mac_code_coverage_reclient': [
+ 'gpu_tests', 'release_trybot_reclient', 'no_symbols',
'use_clang_coverage', 'partial_code_coverage_instrumentation'
],
@@ -2898,10 +2894,6 @@
'ios', 'ios_simulator', 'debug', 'use_blink', 'xctest'
],
- 'ios_simulator_code_coverage_partial_instrumentation_xctest': [
- 'use_clang_coverage', 'debug_static_bot', 'x64', 'ios', 'ios_simulator', 'partial_code_coverage_instrumentation', 'xctest',
- ],
-
'ios_simulator_code_coverage_partial_instrumentation_xctest_reclient': [
'use_clang_coverage', 'debug_static_bot_reclient', 'x64', 'ios', 'ios_simulator', 'partial_code_coverage_instrumentation', 'xctest',
],
@@ -3137,10 +3129,6 @@
'fuchsia', 'official', 'x64', 'custom_args',
],
- 'official_goma': [
- 'official', 'goma',
- ],
-
'official_goma_android_arm32_pgo': [
'official', 'goma', 'android', 'arm', 'minimal_symbols', 'no_default_afdo', 'pgo_phase_1',
],
@@ -3149,10 +3137,6 @@
'official', 'goma', 'android', 'arm64', 'minimal_symbols', 'no_default_afdo', 'pgo_phase_1',
],
- 'official_goma_chromeos_include_unwind_tables': [
- 'official', 'goma', 'chromeos', 'minimal_symbols', 'include_unwind_tables',
- ],
-
'official_goma_fuchsia_arm64_perf': [
'cast_receiver_size_optimized_internal', 'official', 'goma', 'minimal_symbols', 'fuchsia', 'fuchsia_include_sd_images', 'arm64', 'ffmpeg_branding_chrome', 'proprietary_codecs', 'test_isolate_no_emulator'
],
@@ -3173,14 +3157,6 @@
'official', 'goma', 'no_symbols', 'pgo_phase_1', 'release'
],
- 'official_goma_mac': [
- 'official', 'goma', 'no_widevine_cdm_host_verification',
- ],
-
- 'official_goma_mac_arm': [
- 'official', 'goma', 'no_widevine_cdm_host_verification', 'arm64',
- ],
-
'official_goma_mac_arm_perf': [
'official', 'goma', 'no_keystone_registration_framework', 'no_widevine_cdm_host_verification', 'minimal_symbols', 'arm64', 'pgo_phase_0',
],
@@ -3237,18 +3213,10 @@
'official', 'goma', 'minimal_symbols',
],
- 'official_goma_x64': [
- 'official', 'goma', 'x64',
- ],
-
'official_goma_x64_pgo': [
'official', 'goma', 'x64', 'no_symbols', 'pgo_phase_1', 'release'
],
- 'official_goma_x86': [
- 'official', 'goma', 'x86',
- ],
-
'official_goma_x86_pgo': [
'official', 'goma', 'x86', 'no_symbols', 'pgo_phase_1', 'release'
],
diff --git a/chromium/tools/mb/mb_config_expectations/tryserver.chrome.json b/chromium/tools/mb/mb_config_expectations/tryserver.chrome.json
index 7b117e5f6a7..b3a4e1eabc4 100644
--- a/chromium/tools/mb/mb_config_expectations/tryserver.chrome.json
+++ b/chromium/tools/mb/mb_config_expectations/tryserver.chrome.json
@@ -359,21 +359,21 @@
"gn_args": {
"is_chrome_branded": true,
"is_official_build": true,
- "use_goma": true
+ "use_remoteexec": true
}
},
"linux-chrome-beta": {
"gn_args": {
"is_chrome_branded": true,
"is_official_build": true,
- "use_goma": true
+ "use_remoteexec": true
}
},
"linux-chrome-stable": {
"gn_args": {
"is_chrome_branded": true,
"is_official_build": true,
- "use_goma": true
+ "use_remoteexec": true
}
},
"linux-chromeos-chrome": {
@@ -383,7 +383,7 @@
"is_official_build": true,
"symbol_level": 1,
"target_os": "chromeos",
- "use_goma": true
+ "use_remoteexec": true
}
},
"linux-chromeos-compile-chrome": {
@@ -393,14 +393,14 @@
"is_official_build": true,
"symbol_level": 1,
"target_os": "chromeos",
- "use_goma": true
+ "use_remoteexec": true
}
},
"linux-finch-smoke-chrome": {
"gn_args": {
"is_chrome_branded": true,
"is_official_build": true,
- "use_goma": true
+ "use_remoteexec": true
}
},
"mac-arm64-finch-smoke-chrome": {
@@ -409,7 +409,7 @@
"is_chrome_branded": true,
"is_official_build": true,
"target_cpu": "arm64",
- "use_goma": true
+ "use_remoteexec": true
}
},
"mac-chrome": {
@@ -417,7 +417,7 @@
"ignore_missing_widevine_signing_cert": true,
"is_chrome_branded": true,
"is_official_build": true,
- "use_goma": true
+ "use_remoteexec": true
}
},
"mac-chrome-beta": {
@@ -425,7 +425,7 @@
"ignore_missing_widevine_signing_cert": true,
"is_chrome_branded": true,
"is_official_build": true,
- "use_goma": true
+ "use_remoteexec": true
}
},
"mac-chrome-stable": {
@@ -433,17 +433,17 @@
"ignore_missing_widevine_signing_cert": true,
"is_chrome_branded": true,
"is_official_build": true,
- "use_goma": true
+ "use_remoteexec": true
}
},
- "win-branded-rel": {
+ "win-branded-compile-rel": {
"gn_args": {
"dcheck_always_on": false,
"is_chrome_branded": true,
"is_component_build": false,
"is_debug": false,
"symbol_level": 1,
- "use_goma": true
+ "use_remoteexec": true
}
},
"win-celab-try-rel": {
@@ -462,7 +462,7 @@
"is_chrome_branded": true,
"is_official_build": true,
"target_cpu": "x86",
- "use_goma": true
+ "use_remoteexec": true
}
},
"win-chrome-beta": {
@@ -470,7 +470,7 @@
"is_chrome_branded": true,
"is_official_build": true,
"target_cpu": "x86",
- "use_goma": true
+ "use_remoteexec": true
}
},
"win-chrome-stable": {
@@ -478,14 +478,14 @@
"is_chrome_branded": true,
"is_official_build": true,
"target_cpu": "x86",
- "use_goma": true
+ "use_remoteexec": true
}
},
"win-finch-smoke-chrome": {
"gn_args": {
"is_chrome_branded": true,
"is_official_build": true,
- "use_goma": true
+ "use_remoteexec": true
}
},
"win64-chrome": {
@@ -493,7 +493,7 @@
"is_chrome_branded": true,
"is_official_build": true,
"target_cpu": "x64",
- "use_goma": true
+ "use_remoteexec": true
}
},
"win64-chrome-beta": {
@@ -501,7 +501,7 @@
"is_chrome_branded": true,
"is_official_build": true,
"target_cpu": "x64",
- "use_goma": true
+ "use_remoteexec": true
}
},
"win64-chrome-stable": {
@@ -509,7 +509,7 @@
"is_chrome_branded": true,
"is_official_build": true,
"target_cpu": "x64",
- "use_goma": true
+ "use_remoteexec": true
}
}
} \ No newline at end of file
diff --git a/chromium/tools/mb/mb_config_expectations/tryserver.chromium.mac.json b/chromium/tools/mb/mb_config_expectations/tryserver.chromium.mac.json
index 5d0daf66aee..cb35cadcfff 100644
--- a/chromium/tools/mb/mb_config_expectations/tryserver.chromium.mac.json
+++ b/chromium/tools/mb/mb_config_expectations/tryserver.chromium.mac.json
@@ -341,7 +341,7 @@
"target_environment": "simulator",
"target_os": "ios",
"use_clang_coverage": true,
- "use_goma": true
+ "use_remoteexec": true
}
},
"ios-simulator-inverse-fieldtrials-fyi": {
@@ -521,7 +521,7 @@
"proprietary_codecs": true,
"symbol_level": 0,
"use_clang_coverage": true,
- "use_goma": true
+ "use_remoteexec": true
}
},
"mac10.15-wpt-content-shell-fyi-rel": {
@@ -675,7 +675,7 @@
"is_debug": true,
"proprietary_codecs": true,
"symbol_level": 1,
- "use_goma": true
+ "use_remoteexec": true
}
},
"mac_chromium_compile_rel_ng": {
diff --git a/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_am.xtb b/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_am.xtb
index 2f932069e67..b8216289e13 100644
--- a/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_am.xtb
+++ b/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_am.xtb
@@ -14,10 +14,10 @@
<translation id="2079545284768500474">ቀልብስ</translation>
<translation id="2179565792157161713">ረዥም ማብራሪያን በአዲስ ትር ክፈት</translation>
<translation id="2223143012868735942">የቀለም አቀባበልን ለማሻሻል ብጁ የሆነ የቀለም ማጣሪያ ወደ የድር ገጾች ላይ ተፈጻሚ ሆኗል።</translation>
-<translation id="2394933097471027016">አሁኑኑ ይሞክሩት - Caret Browsing በዚህ ገጽ ላይ ሁልጊዜ እንደነቃ ነው!</translation>
+<translation id="2394933097471027016">አሁኑኑ ይሞክሩት - Caret Browsing በዚህ ገፅ ላይ ሁልጊዜ እንደነቃ ነው!</translation>
<translation id="2471847333270902538">የቀለም ገጽታ ለ<ph name="SITE" />፦</translation>
<translation id="2648340354586434750">ቃል በቃል ለማንቀሳቀስ &lt;span class='key'&gt;አማራጭ&lt;/span&gt; የሚለውን ይዘው ይቆዩ።</translation>
-<translation id="2795227192542594043">ይህ ቅጥያ በቁልፍ ሰሌዳው ላይ ጽሑፍን መመረጥ የሚያስችልዎትን በድር ገጽ ላይ ተንቀሳቃሽ የሆነ ጠቋሚን ይሰጥዎታል።</translation>
+<translation id="2795227192542594043">ይህ ቅጥያ በቁልፍ ሰሌዳው ላይ ጽሑፍን መመረጥ የሚያስችልዎትን በድር ገፅ ላይ ተንቀሳቃሽ የሆነ ጠቋሚን ይሰጥዎታል።</translation>
<translation id="2808027189040546825">እርምጃ 1፦ በጣም ፈዘዝ ካሉ ኮከቦች ጋር ረድፉን ይምረጡ፦</translation>
<translation id="2965611304828530558">&lt;p&gt;አገናኝ ወይም መቆጣጠሪያ ላይ በሚደርሱበት ጊዜ፣ በራስ-ሰር እንዲያተኩር ይሆናል። አገናኝን ወይም አዝራርን ጠቅ ለማድረግ &lt;span class='key'&gt;Enter&lt;/span&gt;ን ይጫኑ። &lt;/p&gt; &lt;p&gt; ትኩረት የተደረገበት መቆጣጠሪያ (እንደ የጽሑፍ ሳጥን ወይም የዝርዝር ሳጥን ያለ) የቀስት ቁልፎችን በሚያነሳበት ጊዜ፣ &lt;span class='key'&gt;Esc&lt;/span&gt;ን ይጫኑ እና በማስከተል የግራ ወይም የቀኝ ቀስትን ወደ Caret Browsing ለመቀጠል ይጫኑ። &lt;/p&gt; &lt;p&gt; በአማራጭነት፣ &lt;span class='key'&gt;Tab&lt;/span&gt;ን ወደሚቀጥለው ሊተኮርበት የሚችል መቆጣጠሪያ ለማንቀሳቀስ ይጫኑ። &lt;/p&gt;</translation>
<translation id="3252573918265662711">አዋቅር</translation>
diff --git a/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_it.xtb b/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_it.xtb
index f80861d36d7..1c66283d313 100644
--- a/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_it.xtb
+++ b/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_it.xtb
@@ -58,7 +58,7 @@
<translation id="6965382102122355670">OK</translation>
<translation id="7379645913608427028">Livello</translation>
<translation id="7384431257964758081">L'estensione Contrasto elevato è attiva</translation>
-<translation id="7586636300921797327">Passaggio 2. Regola il dispositivo di scorrimento fino a visualizzare tutte le stelle nella riga selezionata.</translation>
+<translation id="7586636300921797327">Passaggio 2. Regola il cursore fino a visualizzare tutte le stelle nella riga selezionata.</translation>
<translation id="7658239707568436148">Annulla</translation>
<translation id="786423340267544509">Aggiungi bordo a elementi con attributi aria-describedat o longdesc.</translation>
<translation id="7942349550061667556">Rosso</translation>
diff --git a/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_te.xtb b/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_te.xtb
index c521198cd2f..70f7387d340 100644
--- a/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_te.xtb
+++ b/chromium/ui/accessibility/extensions/strings/accessibility_extensions_strings_te.xtb
@@ -45,7 +45,7 @@
<translation id="5631241868147802353">డిఫాల్ట్ రంగు స్కీమ్:</translation>
<translation id="5650358096585648000">దృశ్య అభిప్రాయం</translation>
<translation id="5710185147685935461">వెబ్‌పేజీలను చదవడం సులభం చేయడానికి రంగు స్కీమ్‌ను మార్చండి లేదా విలోమీకరించండి.</translation>
-<translation id="5939518447894949180">రీసెట్ చేయి</translation>
+<translation id="5939518447894949180">రీసెట్ చేయండి</translation>
<translation id="595639123821853262">విలోమ బూడిద రంగు ప్రమాణం</translation>
<translation id="6017514345406065928">ఆకుపచ్చ</translation>
<translation id="6050189528197190982">బూడిద రంగు ప్రమాణం</translation>
diff --git a/chromium/ui/base/ime/ash/input_method_ash.cc b/chromium/ui/base/ime/ash/input_method_ash.cc
index 9ea56d46205..8cc636c7da0 100644
--- a/chromium/ui/base/ime/ash/input_method_ash.cc
+++ b/chromium/ui/base/ime/ash/input_method_ash.cc
@@ -29,6 +29,7 @@
#include "ui/base/ime/ime_key_event_dispatcher.h"
#include "ui/base/ime/text_input_client.h"
#include "ui/base/ime/text_input_flags.h"
+#include "ui/base/ime/text_input_type.h"
#include "ui/events/event.h"
#include "ui/events/keycodes/dom/keycode_converter.h"
#include "ui/gfx/geometry/rect.h"
@@ -886,9 +887,12 @@ TextInputMethod::InputContext InputMethodAsh::GetInputContext() const {
return TextInputMethod::InputContext(ui::TEXT_INPUT_TYPE_NONE);
}
- TextInputMethod::InputContext input_context(client->GetTextInputType());
- input_context.mode = client->GetTextInputMode();
const int flags = client->GetTextInputFlags();
+ TextInputMethod::InputContext input_context(
+ flags & ui::TEXT_INPUT_FLAG_HAS_BEEN_PASSWORD
+ ? ui::TEXT_INPUT_TYPE_PASSWORD
+ : client->GetTextInputType());
+ input_context.mode = client->GetTextInputMode();
input_context.autocompletion_mode =
ConvertTextInputFlagToEnum<AutocompletionMode>(
flags, ui::TEXT_INPUT_FLAG_AUTOCOMPLETE_ON,
diff --git a/chromium/ui/base/ime/ash/input_method_ash_unittest.cc b/chromium/ui/base/ime/ash/input_method_ash_unittest.cc
index dc9c33fd8f7..1dcfaaa5ed2 100644
--- a/chromium/ui/base/ime/ash/input_method_ash_unittest.cc
+++ b/chromium/ui/base/ime/ash/input_method_ash_unittest.cc
@@ -29,6 +29,7 @@
#include "ui/base/ime/fake_text_input_client.h"
#include "ui/base/ime/ime_key_event_dispatcher.h"
#include "ui/base/ime/text_input_client.h"
+#include "ui/base/ime/text_input_flags.h"
#include "ui/events/event.h"
#include "ui/events/event_utils.h"
#include "ui/events/keycodes/dom/dom_code.h"
@@ -417,6 +418,19 @@ TEST_F(InputMethodAshTest, OnTextInputTypeChangedChangesInputType) {
ime.SetFocusedTextInputClient(nullptr);
}
+TEST_F(InputMethodAshTest, HasBeenPasswordShouldTriggerPassowrd) {
+ InputMethodAsh ime(this);
+ FakeTextInputClient fake_text_input_client(ui::TEXT_INPUT_TYPE_TEXT);
+ fake_text_input_client.SetFlags(ui::TEXT_INPUT_FLAG_HAS_BEEN_PASSWORD);
+
+ ime.SetFocusedTextInputClient(&fake_text_input_client);
+
+ EXPECT_EQ(mock_ime_engine_handler_->last_text_input_context().type,
+ ui::TEXT_INPUT_TYPE_PASSWORD);
+
+ ime.SetFocusedTextInputClient(nullptr);
+}
+
TEST_F(InputMethodAshTest, GetTextInputClient) {
EXPECT_EQ(this, input_method_ash_->GetTextInputClient());
input_method_ash_->SetFocusedTextInputClient(nullptr);
diff --git a/chromium/ui/base/ime/ash/text_input_method.h b/chromium/ui/base/ime/ash/text_input_method.h
index a476a9b5f51..e2b2aa5c07d 100644
--- a/chromium/ui/base/ime/ash/text_input_method.h
+++ b/chromium/ui/base/ime/ash/text_input_method.h
@@ -90,7 +90,6 @@ class COMPONENT_EXPORT(UI_BASE_IME_ASH) TextInputMethod {
SpellcheckMode spellcheck_mode = SpellcheckMode::kUnspecified;
AutocapitalizationMode autocapitalization_mode =
AutocapitalizationMode::kUnspecified;
- bool has_been_password = false;
// How this input field was focused.
ui::TextInputClient::FocusReason focus_reason =
ui::TextInputClient::FOCUS_REASON_NONE;
diff --git a/chromium/ui/base/ime/fake_text_input_client.cc b/chromium/ui/base/ime/fake_text_input_client.cc
index 9f9d4ac0339..79e1967c684 100644
--- a/chromium/ui/base/ime/fake_text_input_client.cc
+++ b/chromium/ui/base/ime/fake_text_input_client.cc
@@ -78,7 +78,11 @@ base::i18n::TextDirection FakeTextInputClient::GetTextDirection() const {
}
int FakeTextInputClient::GetTextInputFlags() const {
- return EF_NONE;
+ return flags_;
+}
+
+void FakeTextInputClient::SetFlags(const int flags) {
+ flags_ = flags;
}
bool FakeTextInputClient::CanComposeInline() const {
diff --git a/chromium/ui/base/ime/fake_text_input_client.h b/chromium/ui/base/ime/fake_text_input_client.h
index e3d2b47d166..538e0ba71a5 100644
--- a/chromium/ui/base/ime/fake_text_input_client.h
+++ b/chromium/ui/base/ime/fake_text_input_client.h
@@ -11,6 +11,7 @@
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "ui/base/ime/text_input_client.h"
+#include "ui/base/ime/text_input_flags.h"
namespace ui {
@@ -26,6 +27,7 @@ class FakeTextInputClient : public TextInputClient {
void set_text_input_type(TextInputType text_input_type);
void set_source_id(ukm::SourceId source_id);
void SetTextAndSelection(const std::u16string& text, gfx::Range selection);
+ void SetFlags(const int flags);
const std::u16string& text() const { return text_; }
const gfx::Range& selection() const { return selection_; }
@@ -101,6 +103,7 @@ class FakeTextInputClient : public TextInputClient {
std::vector<ui::ImeTextSpan> ime_text_spans_;
gfx::Range autocorrect_range_;
ukm::SourceId source_id_ = ukm::kInvalidSourceId;
+ int flags_ = TEXT_INPUT_FLAG_NONE;
};
} // namespace ui
diff --git a/chromium/ui/base/ime/input_method_base.cc b/chromium/ui/base/ime/input_method_base.cc
index e854c1da390..bb429ca5fe2 100644
--- a/chromium/ui/base/ime/input_method_base.cc
+++ b/chromium/ui/base/ime/input_method_base.cc
@@ -15,6 +15,7 @@
#include "ui/base/ime/ime_key_event_dispatcher.h"
#include "ui/base/ime/input_method_observer.h"
#include "ui/base/ime/text_input_client.h"
+#include "ui/base/ime/text_input_flags.h"
#include "ui/base/ime/virtual_keyboard_controller_stub.h"
#include "ui/events/event.h"
@@ -76,7 +77,11 @@ void InputMethodBase::OnTextInputTypeChanged(TextInputClient* client) {
TextInputType InputMethodBase::GetTextInputType() const {
TextInputClient* client = GetTextInputClient();
- return client ? client->GetTextInputType() : TEXT_INPUT_TYPE_NONE;
+ return client
+ ? (client->GetTextInputFlags() & TEXT_INPUT_FLAG_HAS_BEEN_PASSWORD
+ ? TEXT_INPUT_TYPE_PASSWORD
+ : client->GetTextInputType())
+ : TEXT_INPUT_TYPE_NONE;
}
void InputMethodBase::SetVirtualKeyboardVisibilityIfEnabled(bool should_show) {
diff --git a/chromium/ui/base/ime/input_method_base_unittest.cc b/chromium/ui/base/ime/input_method_base_unittest.cc
index aa3c7fd0e4e..a78ac9c103a 100644
--- a/chromium/ui/base/ime/input_method_base_unittest.cc
+++ b/chromium/ui/base/ime/input_method_base_unittest.cc
@@ -296,5 +296,19 @@ TEST_F(InputMethodBaseTest, DetachTextInputClient) {
}
}
+TEST_F(InputMethodBaseTest, SetsPasswordWhenHasBeenPassword) {
+ FakeTextInputClient fake_text_input_client(ui::TEXT_INPUT_TYPE_TEXT);
+
+ ClientChangeVerifier verifier;
+ verifier.ExpectClientChange(nullptr, &fake_text_input_client);
+ MockInputMethodBase input_method(&verifier);
+
+ fake_text_input_client.SetFlags(ui::TEXT_INPUT_FLAG_HAS_BEEN_PASSWORD);
+
+ input_method.SetFocusedTextInputClient(&fake_text_input_client);
+
+ EXPECT_EQ(TEXT_INPUT_TYPE_PASSWORD, input_method.GetTextInputType());
+}
+
} // namespace
} // namespace ui
diff --git a/chromium/ui/strings/translations/ax_strings_am.xtb b/chromium/ui/strings/translations/ax_strings_am.xtb
index dee51556976..d6643266641 100644
--- a/chromium/ui/strings/translations/ax_strings_am.xtb
+++ b/chromium/ui/strings/translations/ax_strings_am.xtb
@@ -14,7 +14,7 @@
<translation id="1589122976691792535">ክልል</translation>
<translation id="1650423536718072820">ጥቅስ</translation>
<translation id="1821985195704844674">የዛፍ ፍርግርግ</translation>
-<translation id="1823704031293214298">ገጽ ግርጌ</translation>
+<translation id="1823704031293214298">ገፅ ግርጌ</translation>
<translation id="1838681052457320736">የማንቂያ መገናኛ</translation>
<translation id="1842960171412779397">ምረጥ</translation>
<translation id="190587075670221089">ስረዛ</translation>
@@ -22,7 +22,7 @@
<translation id="1930711995431081526">ሁኔታ</translation>
<translation id="2158401438286456825">የገጽ ዝርዝር</translation>
<translation id="2291999235780842123">አመልካች ሳጥን</translation>
-<translation id="2311842470354187719">ገጽ ከፋይ</translation>
+<translation id="2311842470354187719">ገፅ ከፋይ</translation>
<translation id="2335594187091864976">የቀን እና የሰዓት መራጭ</translation>
<translation id="2508569020611168319">የትር ዝርዝር</translation>
<translation id="2657045182931379222">ግራፊካዊ ነገር</translation>
diff --git a/chromium/ui/strings/translations/ax_strings_it.xtb b/chromium/ui/strings/translations/ax_strings_it.xtb
index 023863c6791..0b51fca06ae 100644
--- a/chromium/ui/strings/translations/ax_strings_it.xtb
+++ b/chromium/ui/strings/translations/ax_strings_it.xtb
@@ -5,7 +5,7 @@
<translation id="10623998915015855">pulsante di attivazione o disattivazione</translation>
<translation id="1188858454923323853">elementi complementari</translation>
<translation id="1206619573307042055">marquee</translation>
-<translation id="1206693055195146388">dispositivo di scorrimento</translation>
+<translation id="1206693055195146388">cursore</translation>
<translation id="1211441953136645838">nota finale</translation>
<translation id="1281252709823657822">finestra di dialogo</translation>
<translation id="1335095011850992622">ringraziamenti</translation>
diff --git a/chromium/ui/strings/translations/ax_strings_ja.xtb b/chromium/ui/strings/translations/ax_strings_ja.xtb
index b31cb2aaa92..a21a9d4bca0 100644
--- a/chromium/ui/strings/translations/ax_strings_ja.xtb
+++ b/chromium/ui/strings/translations/ax_strings_ja.xtb
@@ -11,7 +11,7 @@
<translation id="1335095011850992622">クレジット</translation>
<translation id="1342835525016946179">記事</translation>
<translation id="1359897965706325498">バナー</translation>
-<translation id="1589122976691792535">地域</translation>
+<translation id="1589122976691792535">セクション</translation>
<translation id="1650423536718072820">引用</translation>
<translation id="1821985195704844674">ツリーグリッド</translation>
<translation id="1823704031293214298">ページフッター</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_am.xtb b/chromium/ui/strings/translations/ui_strings_am.xtb
index 37331514e9f..9482c99d7e3 100644
--- a/chromium/ui/strings/translations/ui_strings_am.xtb
+++ b/chromium/ui/strings/translations/ui_strings_am.xtb
@@ -131,7 +131,7 @@
<translation id="5789643057113097023">.</translation>
<translation id="5843690142429128814">ምስል።</translation>
<translation id="5866104238061687188">{YEARS,plural, =1{በ 1ዓ ውስጥ}one{በ #ዓ ውስጥ}other{በ #ዓ ውስጥ}}</translation>
-<translation id="588258955323874662">ሙሉ ገጽ ዕይታ</translation>
+<translation id="588258955323874662">ሙሉ ገፅ ዕይታ</translation>
<translation id="5906667377645263094">{SECONDS,plural, =1{1 ሰከንድ ቀርቷል}one{# ሰከንዶች ቀርቷል}other{# ሰከንዶች ቀርቷል}}</translation>
<translation id="5941711191222866238">አሳንስ</translation>
<translation id="5943826764092288734">{HOURS,plural, =1{1 ሰዓት}one{# ሰዓቶች}other{# ሰዓቶች}}</translation>
@@ -158,7 +158,7 @@
<translation id="6808150112686056157">ሚዲያ አቁም</translation>
<translation id="6845383723252244143">አቃፊ ምረጥ</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 ሰዓት ቀርቷል}one{# ሰዓቶች ቀርቷል}other{# ሰዓቶች ቀርተዋል}}</translation>
-<translation id="688711909580084195">ርዕስ-አልባ ድረ-ገጽ</translation>
+<translation id="688711909580084195">ርዕስ-አልባ ድረ-ገፅ</translation>
<translation id="6902419395050653510">የኤች ቲ ኤም ኤል ይዘት</translation>
<translation id="6907759265145635167"><ph name="QUANTITY" /> ፔባ/ሰ</translation>
<translation id="6917971086528278418">{YEARS,plural, =1{1 ዓመት ቀርቷል}one{# ዓመቶች ቀርተዋል}other{# ዓመቶች ቀርተዋል}}</translation>
@@ -188,7 +188,7 @@
<translation id="8090736967111090568">ቁጥር ከ<ph name="ORIGIN" /></translation>
<translation id="8106081041558092062">{HOURS,plural, =1{1 ሰዓት በፊት}one{# ሰዓቶች በፊት}other{# ሰዓቶች በፊት}}</translation>
<translation id="8131263257437993507">{SECONDS,plural, =1{1 ሰከንድ ቀርቷል}one{# ሰከንዶች ቀርቷል}other{# ሰከንዶች ቀርተዋል}}</translation>
-<translation id="8134065097954893699">ይህን ገጽ ዳግም በመጫን ላይ</translation>
+<translation id="8134065097954893699">ይህን ገፅ ዳግም በመጫን ላይ</translation>
<translation id="815598010540052116">ወደ ታች ሸብልል</translation>
<translation id="8179976553408161302">አስገባ</translation>
<translation id="8210608804940886430">ወደታች አንቀሳቅስ</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_da.xtb b/chromium/ui/strings/translations/ui_strings_da.xtb
index 7f744d315e6..f5cb877cb68 100644
--- a/chromium/ui/strings/translations/ui_strings_da.xtb
+++ b/chromium/ui/strings/translations/ui_strings_da.xtb
@@ -3,7 +3,7 @@
<translationbundle lang="da">
<translation id="1028699632127661925">Sender til <ph name="DEVICE_NAME" />...</translation>
<translation id="111910763555783249">Notifikationsindstillinger</translation>
-<translation id="1127811143501539442">{DAYS,plural, =1{for 1 dag siden}one{for # dag siden}other{for # dage siden}}</translation>
+<translation id="1127811143501539442">{DAYS,plural, =1{1 dag siden}one{# dag siden}other{# dage siden}}</translation>
<translation id="1156623771253174079">{SECONDS,plural, =1{For 1 minut siden}one{For # minut siden}other{For # minutter siden}}</translation>
<translation id="1169783199079129864">{MINUTES,plural, =1{1 min.}one{# min.}other{# min.}}</translation>
<translation id="1181037720776840403">Fjern</translation>
@@ -65,7 +65,7 @@
<translation id="2666092431469916601">Top</translation>
<translation id="2701330563083355633">Delt fra <ph name="DEVICE_NAME" /></translation>
<translation id="271033894570825754">Nyt</translation>
-<translation id="2824719307700604149">{YEARS,plural, =1{For 1 år siden}one{For # år siden}other{For # år siden}}</translation>
+<translation id="2824719307700604149">{YEARS,plural, =1{1 år siden}one{# år siden}other{# år siden}}</translation>
<translation id="2878511608894704031">Slet alt</translation>
<translation id="2907671656515444832">{DAYS,plural, =1{om 1 dag}one{om # dag}other{om # dage}}</translation>
<translation id="2922712708897119705">Kolonnen <ph name="COLUMN_NAME" /> sorteres i faldende rækkefølge.</translation>
@@ -101,7 +101,7 @@
<translation id="3994749195054421561">Kolonnen <ph name="COLUMN_NAME" /> sorteres i stigende rækkefølge.</translation>
<translation id="4031910098617850788">F5</translation>
<translation id="40579289237549812">{UNREAD_NOTIFICATIONS,plural, =1{1 ulæst notifikation}one{# ulæst notifikation}other{# ulæste notifikationer}}</translation>
-<translation id="4266252015790371705">{MONTHS,plural, =1{For 1 måned siden}one{For # måned siden}other{For # måneder siden}}</translation>
+<translation id="4266252015790371705">{MONTHS,plural, =1{1 måned siden}one{# måned siden}other{# måneder siden}}</translation>
<translation id="4289300219472526559">Start indtaling</translation>
<translation id="4289540628985791613">Oversigt</translation>
<translation id="4306392492252714209">Fjern fra udklipsholder.</translation>
@@ -186,7 +186,7 @@
<translation id="8086866675552927481">{MINUTES,plural, =1{om 1 min}one{om # min}other{om # min}}</translation>
<translation id="8087772101393322318"><ph name="KEY_MODIFIER_NAME" />+<ph name="KEY_COMBO_NAME" /></translation>
<translation id="8090736967111090568">Nummer fra <ph name="ORIGIN" /></translation>
-<translation id="8106081041558092062">{HOURS,plural, =1{for 1 time siden}one{for # time siden}other{for # timer siden}}</translation>
+<translation id="8106081041558092062">{HOURS,plural, =1{1 time siden}one{# time siden}other{# timer siden}}</translation>
<translation id="8131263257437993507">{SECONDS,plural, =1{1 sek. tilbage}one{# sek. tilbage}other{# sek. tilbage}}</translation>
<translation id="8134065097954893699">Genindlæs siden</translation>
<translation id="815598010540052116">Scroll Down</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_fi.xtb b/chromium/ui/strings/translations/ui_strings_fi.xtb
index 8650e6e7e45..bc5737bfb94 100644
--- a/chromium/ui/strings/translations/ui_strings_fi.xtb
+++ b/chromium/ui/strings/translations/ui_strings_fi.xtb
@@ -22,7 +22,7 @@
<translation id="1710340000377843106">nyt</translation>
<translation id="1752946267035950200">{MINUTES,plural, =1{1 minuutti}other{# minuuttia}}</translation>
<translation id="1761785978543082658"><ph name="QUANTITY" /> t</translation>
-<translation id="1801827354178857021">Jakso</translation>
+<translation id="1801827354178857021">Piste</translation>
<translation id="1803208670097017349">{MONTHS,plural, =1{1 kuukausi}other{# kuukautta}}</translation>
<translation id="1809410197924942083"><ph name="QUANTITY" /> Mb/s</translation>
<translation id="1830179671306812954">{HOURS,plural, =1{1 tunti ja }other{# tuntia ja }}</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ja.xtb b/chromium/ui/strings/translations/ui_strings_ja.xtb
index d168b2b0c8e..f6c141812fe 100644
--- a/chromium/ui/strings/translations/ui_strings_ja.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ja.xtb
@@ -63,7 +63,7 @@
<translation id="2586657967955657006">クリップボード</translation>
<translation id="2653844658857826081">新規</translation>
<translation id="2666092431469916601">一番上</translation>
-<translation id="2701330563083355633"><ph name="DEVICE_NAME" /> から共有しました</translation>
+<translation id="2701330563083355633"><ph name="DEVICE_NAME" /> から共有されました</translation>
<translation id="271033894570825754">New</translation>
<translation id="2824719307700604149">{YEARS,plural, =1{1 年前}other{# 年前}}</translation>
<translation id="2878511608894704031">すべて削除</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_mk.xtb b/chromium/ui/strings/translations/ui_strings_mk.xtb
index 5a4c499e6dc..30c6bee8941 100644
--- a/chromium/ui/strings/translations/ui_strings_mk.xtb
+++ b/chromium/ui/strings/translations/ui_strings_mk.xtb
@@ -106,7 +106,7 @@
<translation id="4289540628985791613">Преглед</translation>
<translation id="4306392492252714209">Отстранете од привремената меморија.</translation>
<translation id="4491109536499578614">Слика</translation>
-<translation id="4565377596337484307">Сокриј ја лозинката</translation>
+<translation id="4565377596337484307">Скриј ја лозинката</translation>
<translation id="4588090240171750605">Лизгај надесно</translation>
<translation id="4724120544754982507">Центар за известувања, <ph name="UNREAD_NOTIFICATION_COUNT" /> непрочитани известувања</translation>
<translation id="4746179598275229723">Екстензијата е откачена</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_ne.xtb b/chromium/ui/strings/translations/ui_strings_ne.xtb
index 707e6fdb01f..07ecf753e65 100644
--- a/chromium/ui/strings/translations/ui_strings_ne.xtb
+++ b/chromium/ui/strings/translations/ui_strings_ne.xtb
@@ -150,7 +150,7 @@
<translation id="6430678249303439055">यो एपका सबै सूचनाहरूमाथि रोक लगाउनुहोस्</translation>
<translation id="6483402905448010557">{SECONDS,plural, =1{१ सेकेन्ड अघि}other{# सेकेन्ड अघि}}</translation>
<translation id="6503257047630241175">RTF फाइलको सामग्री</translation>
-<translation id="6539092367496845964">केही चिज गडबड भयो। पछि फेरि प्रयास गर्नुहोस्।</translation>
+<translation id="6539092367496845964">कुनै समस्या आयो। पछि फेरि प्रयास गर्नुहोस्।</translation>
<translation id="654149438358937226">सबै सूचनाहरूमाथि रोक लगाउनुहोस्</translation>
<translation id="6612467943526193239">क्यालिब्रेसनबाट बाहिर निस्कन Esc थिच्नुहोस्।</translation>
<translation id="6620110761915583480">फाइल बचत गर्नुहोस्</translation>
@@ -198,7 +198,7 @@
<translation id="8328145009876646418">बायाँ छेउ</translation>
<translation id="8331626408530291785">माथि स्क्रोल गर्नुहोस्</translation>
<translation id="8352146631962686268">{YEARS,plural, =1{१ बर्ष}other{ # वर्ष}}</translation>
-<translation id="8393700583063109961">सन्देश पठाउनुहोस्</translation>
+<translation id="8393700583063109961">म्यासेज पठाउनुहोस्</translation>
<translation id="8394908167088220973">मिडिया प्ले/पज</translation>
<translation id="8458811141851741261">{YEARS,plural, =1{१ वर्ष}other{# वर्ष}}</translation>
<translation id="8602707065186045623"><ph name="SAVEAS_EXTENSION_TYPE" /> फाइल (। <ph name="SAVEAS_EXTENSION_NAME" /> )</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_no.xtb b/chromium/ui/strings/translations/ui_strings_no.xtb
index 02bb56bb0dd..844aaedbdd0 100644
--- a/chromium/ui/strings/translations/ui_strings_no.xtb
+++ b/chromium/ui/strings/translations/ui_strings_no.xtb
@@ -186,7 +186,7 @@
<translation id="8086866675552927481">{MINUTES,plural, =1{om 1 m}other{om # m}}</translation>
<translation id="8087772101393322318"><ph name="KEY_MODIFIER_NAME" /> + <ph name="KEY_COMBO_NAME" /></translation>
<translation id="8090736967111090568">Nummer fra <ph name="ORIGIN" /></translation>
-<translation id="8106081041558092062">{HOURS,plural, =1{For 1 time siden}other{For # timer siden}}</translation>
+<translation id="8106081041558092062">{HOURS,plural, =1{For 1 time siden}other{# timer siden}}</translation>
<translation id="8131263257437993507">{SECONDS,plural, =1{1 sek igjen}other{# sek igjen}}</translation>
<translation id="8134065097954893699">Laster inn denne siden på nytt</translation>
<translation id="815598010540052116">Rull ned</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_sq.xtb b/chromium/ui/strings/translations/ui_strings_sq.xtb
index 9eab361556f..32acb0fd852 100644
--- a/chromium/ui/strings/translations/ui_strings_sq.xtb
+++ b/chromium/ui/strings/translations/ui_strings_sq.xtb
@@ -57,7 +57,7 @@
<translation id="2515586267016047495">Alt</translation>
<translation id="2522350507219695259">Kalibrimi përfundoi</translation>
<translation id="252373100621549798">Ekran i panjohur</translation>
-<translation id="2545651323591713692">Shty alarmin</translation>
+<translation id="2545651323591713692">Shtyje</translation>
<translation id="2573731672208488250">{HOURS,plural, =1{në 1 orë}other{në # orë}}</translation>
<translation id="2583543531130364912">Kalibro ekranin me prekje</translation>
<translation id="2586657967955657006">Kujtesa e fragmenteve</translation>
diff --git a/chromium/ui/strings/translations/ui_strings_te.xtb b/chromium/ui/strings/translations/ui_strings_te.xtb
index 5f927369d28..145288d30b3 100644
--- a/chromium/ui/strings/translations/ui_strings_te.xtb
+++ b/chromium/ui/strings/translations/ui_strings_te.xtb
@@ -35,7 +35,7 @@
<translation id="1901303067676059328">&amp;అన్నీ ఎంచుకోండి</translation>
<translation id="19085484004813472">ఇది కొత్త ఫీచర్</translation>
<translation id="2006524834898217237">ఈ పరికరం ఇంటర్నెట్‌కు కనెక్ట్ చేయబడి ఉందని నిర్ధారించుకోండి.</translation>
-<translation id="208586643495776849">దయచేసి మళ్లీ ప్రయత్నించండి</translation>
+<translation id="208586643495776849">దయచేసి మళ్లీ ట్రై చేయండి</translation>
<translation id="2141853158323869627">{DAYS,plural, =1{1రో}other{#రో}}</translation>
<translation id="2148716181193084225">ఈ రోజు</translation>
<translation id="2161656808144014275">వచనం</translation>
@@ -150,11 +150,11 @@
<translation id="6430678249303439055">ఈ యాప్ నుండి నోటిఫికేషన్‌లు అన్ని బ్లాక్ చేయండి</translation>
<translation id="6483402905448010557">{SECONDS,plural, =1{1 సెకను క్రితం}other{# సెకన్ల క్రితం}}</translation>
<translation id="6503257047630241175">RTF కంటెంట్</translation>
-<translation id="6539092367496845964">ఏదో తప్పు జరిగింది. తర్వాత మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="6539092367496845964">ఏదో తప్పు జరిగింది. తర్వాత మళ్లీ ట్రై చేయండి.</translation>
<translation id="654149438358937226">అన్ని నోటిఫికేషన్‌లను బ్లాక్ చేయండి</translation>
<translation id="6612467943526193239">క్రమాంకనం నుండి నిష్క్రమించేందుకు, Esc నొక్కండి.</translation>
<translation id="6620110761915583480">ఫైల్‌ను సేవ్ చేయండి</translation>
-<translation id="6699343763173986273">మీడియా తరువాత ట్రాక్</translation>
+<translation id="6699343763173986273">మీడియా తర్వాత ట్రాక్</translation>
<translation id="6808150112686056157">మీడియా ఆపివేయి</translation>
<translation id="6845383723252244143">ఫోల్డర్‌ను ఎంచుకో</translation>
<translation id="6863590663815976734">{HOURS,plural, =1{1 గంట మిగిలి ఉంది}other{# గంటలు మిగిలి ఉన్నాయి}}</translation>
diff --git a/chromium/ui/views/bubble/bubble_dialog_delegate_view.cc b/chromium/ui/views/bubble/bubble_dialog_delegate_view.cc
index fea3d6b66ab..8561f40a5dc 100644
--- a/chromium/ui/views/bubble/bubble_dialog_delegate_view.cc
+++ b/chromium/ui/views/bubble/bubble_dialog_delegate_view.cc
@@ -308,6 +308,13 @@ class BubbleDialogDelegate::AnchorWidgetObserver : public WidgetObserver,
owner_->OnAnchorBoundsChanged();
}
}
+
+ // If the native window is closed by the OS, OnWidgetDestroying() won't
+ // fire. Instead, OnWindowDestroying() will fire before aura::Window
+ // destruction. See //docs/ui/views/widget_destruction.md.
+ void OnWindowDestroying(aura::Window* window) override {
+ window_observation_.Reset();
+ }
#endif
private:
diff --git a/chromium/v8/include/v8-object.h b/chromium/v8/include/v8-object.h
index 6f3025e3adf..4c78060c132 100644
--- a/chromium/v8/include/v8-object.h
+++ b/chromium/v8/include/v8-object.h
@@ -247,13 +247,16 @@ class V8_EXPORT Object : public Value {
V8_WARN_UNUSED_RESULT Maybe<bool> Set(Local<Context> context, uint32_t index,
Local<Value> value);
- // Implements CreateDataProperty (ECMA-262, 7.3.4).
- //
- // Defines a configurable, writable, enumerable property with the given value
- // on the object unless the property already exists and is not configurable
- // or the object is not extensible.
- //
- // Returns true on success.
+ /**
+ * Implements CreateDataProperty(O, P, V), see
+ * https://tc39.es/ecma262/#sec-createdataproperty.
+ *
+ * Defines a configurable, writable, enumerable property with the given value
+ * on the object unless the property already exists and is not configurable
+ * or the object is not extensible.
+ *
+ * Returns true on success.
+ */
V8_WARN_UNUSED_RESULT Maybe<bool> CreateDataProperty(Local<Context> context,
Local<Name> key,
Local<Value> value);
@@ -261,29 +264,35 @@ class V8_EXPORT Object : public Value {
uint32_t index,
Local<Value> value);
- // Implements DefineOwnProperty.
- //
- // In general, CreateDataProperty will be faster, however, does not allow
- // for specifying attributes.
- //
- // Returns true on success.
+ /**
+ * Implements [[DefineOwnProperty]] for data property case, see
+ * https://tc39.es/ecma262/#table-essential-internal-methods.
+ *
+ * In general, CreateDataProperty will be faster, however, does not allow
+ * for specifying attributes.
+ *
+ * Returns true on success.
+ */
V8_WARN_UNUSED_RESULT Maybe<bool> DefineOwnProperty(
Local<Context> context, Local<Name> key, Local<Value> value,
PropertyAttribute attributes = None);
- // Implements Object.DefineProperty(O, P, Attributes), see Ecma-262 19.1.2.4.
- //
- // The defineProperty function is used to add an own property or
- // update the attributes of an existing own property of an object.
- //
- // Both data and accessor descriptors can be used.
- //
- // In general, CreateDataProperty is faster, however, does not allow
- // for specifying attributes or an accessor descriptor.
- //
- // The PropertyDescriptor can change when redefining a property.
- //
- // Returns true on success.
+ /**
+ * Implements Object.defineProperty(O, P, Attributes), see
+ * https://tc39.es/ecma262/#sec-object.defineproperty.
+ *
+ * The defineProperty function is used to add an own property or
+ * update the attributes of an existing own property of an object.
+ *
+ * Both data and accessor descriptors can be used.
+ *
+ * In general, CreateDataProperty is faster, however, does not allow
+ * for specifying attributes or an accessor descriptor.
+ *
+ * The PropertyDescriptor can change when redefining a property.
+ *
+ * Returns true on success.
+ */
V8_WARN_UNUSED_RESULT Maybe<bool> DefineProperty(
Local<Context> context, Local<Name> key, PropertyDescriptor& descriptor);
@@ -302,14 +311,15 @@ class V8_EXPORT Object : public Value {
Local<Context> context, Local<Value> key);
/**
- * Returns Object.getOwnPropertyDescriptor as per ES2016 section 19.1.2.6.
+ * Implements Object.getOwnPropertyDescriptor(O, P), see
+ * https://tc39.es/ecma262/#sec-object.getownpropertydescriptor.
*/
V8_WARN_UNUSED_RESULT MaybeLocal<Value> GetOwnPropertyDescriptor(
Local<Context> context, Local<Name> key);
/**
- * Object::Has() calls the abstract operation HasProperty(O, P) described
- * in ECMA-262, 7.3.10. Has() returns
+ * Object::Has() calls the abstract operation HasProperty(O, P), see
+ * https://tc39.es/ecma262/#sec-hasproperty. Has() returns
* true, if the object has the property, either own or on the prototype chain.
* Interceptors, i.e., PropertyQueryCallbacks, are called if present.
*
@@ -347,7 +357,7 @@ class V8_EXPORT Object : public Value {
void SetAccessorProperty(Local<Name> name, Local<Function> getter,
Local<Function> setter = Local<Function>(),
- PropertyAttribute attribute = None,
+ PropertyAttribute attributes = None,
AccessControl settings = DEFAULT);
/**
diff --git a/chromium/v8/include/v8-version.h b/chromium/v8/include/v8-version.h
index 66a62f75276..14ebf5f4943 100644
--- a/chromium/v8/include/v8-version.h
+++ b/chromium/v8/include/v8-version.h
@@ -11,7 +11,7 @@
#define V8_MAJOR_VERSION 11
#define V8_MINOR_VERSION 2
#define V8_BUILD_NUMBER 214
-#define V8_PATCH_LEVEL 14
+#define V8_PATCH_LEVEL 22
// Use 1 for candidates and 0 otherwise.
// (Boolean macro values are not supported by all preprocessors.)
diff --git a/chromium/v8/src/api/api-natives.cc b/chromium/v8/src/api/api-natives.cc
index 05a883f2d56..905f29bf253 100644
--- a/chromium/v8/src/api/api-natives.cc
+++ b/chromium/v8/src/api/api-natives.cc
@@ -96,10 +96,10 @@ MaybeHandle<Object> DefineAccessorProperty(Isolate* isolate,
Handle<Code> trampoline = BUILTIN_CODE(isolate, DebugBreakTrampoline);
Handle<JSFunction>::cast(setter)->set_code(*trampoline);
}
- RETURN_ON_EXCEPTION(
- isolate,
- JSObject::DefineAccessor(object, name, getter, setter, attributes),
- Object);
+ RETURN_ON_EXCEPTION(isolate,
+ JSObject::DefineOwnAccessorIgnoreAttributes(
+ object, name, getter, setter, attributes),
+ Object);
return object;
}
diff --git a/chromium/v8/src/api/api.cc b/chromium/v8/src/api/api.cc
index fac24bae124..a8c89cafbf8 100644
--- a/chromium/v8/src/api/api.cc
+++ b/chromium/v8/src/api/api.cc
@@ -5060,7 +5060,7 @@ Maybe<bool> Object::SetAccessor(Local<Context> context, Local<Name> name,
void Object::SetAccessorProperty(Local<Name> name, Local<Function> getter,
Local<Function> setter,
- PropertyAttribute attribute,
+ PropertyAttribute attributes,
AccessControl settings) {
// TODO(verwaest): Remove |settings|.
DCHECK_EQ(v8::DEFAULT, settings);
@@ -5072,9 +5072,20 @@ void Object::SetAccessorProperty(Local<Name> name, Local<Function> getter,
i::Handle<i::Object> getter_i = v8::Utils::OpenHandle(*getter);
i::Handle<i::Object> setter_i = v8::Utils::OpenHandle(*setter, true);
if (setter_i.is_null()) setter_i = i_isolate->factory()->null_value();
- i::JSObject::DefineAccessor(i::Handle<i::JSObject>::cast(self),
- v8::Utils::OpenHandle(*name), getter_i, setter_i,
- static_cast<i::PropertyAttributes>(attribute));
+
+ i::PropertyDescriptor desc;
+ desc.set_enumerable(!(attributes & v8::DontEnum));
+ desc.set_configurable(!(attributes & v8::DontDelete));
+ desc.set_get(getter_i);
+ desc.set_set(setter_i);
+
+ i::Handle<i::Name> name_i = v8::Utils::OpenHandle(*name);
+ // DefineOwnProperty might still throw if the receiver is a JSProxy and it
+ // might fail if the receiver is non-extensible or already has this property
+ // as non-configurable.
+ Maybe<bool> success = i::JSReceiver::DefineOwnProperty(
+ i_isolate, self, name_i, &desc, Just(i::kDontThrow));
+ USE(success);
}
Maybe<bool> Object::SetNativeDataProperty(
diff --git a/chromium/v8/src/compiler/backend/loong64/instruction-selector-loong64.cc b/chromium/v8/src/compiler/backend/loong64/instruction-selector-loong64.cc
index 6f7841be976..ad1f63babac 100644
--- a/chromium/v8/src/compiler/backend/loong64/instruction-selector-loong64.cc
+++ b/chromium/v8/src/compiler/backend/loong64/instruction-selector-loong64.cc
@@ -2979,6 +2979,19 @@ void InstructionSelector::VisitI64x2RelaxedLaneSelect(Node* node) {
VisitS128Select(node);
}
+#define SIMD_UNIMP_OP_LIST(V) \
+ V(F64x2Qfma) \
+ V(F64x2Qfms) \
+ V(F32x4Qfma) \
+ V(F32x4Qfms)
+
+#define SIMD_VISIT_UNIMP_OP(Name) \
+ void InstructionSelector::Visit##Name(Node* node) { UNIMPLEMENTED(); }
+SIMD_UNIMP_OP_LIST(SIMD_VISIT_UNIMP_OP)
+
+#undef SIMD_VISIT_UNIMP_OP
+#undef SIMD_UNIMP_OP_LIST
+
#if V8_ENABLE_WEBASSEMBLY
namespace {
diff --git a/chromium/v8/src/compiler/backend/mips64/instruction-selector-mips64.cc b/chromium/v8/src/compiler/backend/mips64/instruction-selector-mips64.cc
index 825bfc1ba00..15c7582920b 100644
--- a/chromium/v8/src/compiler/backend/mips64/instruction-selector-mips64.cc
+++ b/chromium/v8/src/compiler/backend/mips64/instruction-selector-mips64.cc
@@ -3218,6 +3218,19 @@ void InstructionSelector::VisitS128Select(Node* node) {
VisitRRRR(this, kMips64S128Select, node);
}
+#define SIMD_UNIMP_OP_LIST(V) \
+ V(F64x2Qfma) \
+ V(F64x2Qfms) \
+ V(F32x4Qfma) \
+ V(F32x4Qfms)
+
+#define SIMD_VISIT_UNIMP_OP(Name) \
+ void InstructionSelector::Visit##Name(Node* node) { UNIMPLEMENTED(); }
+SIMD_UNIMP_OP_LIST(SIMD_VISIT_UNIMP_OP)
+
+#undef SIMD_VISIT_UNIMP_OP
+#undef SIMD_UNIMP_OP_LIST
+
#if V8_ENABLE_WEBASSEMBLY
namespace {
diff --git a/chromium/v8/src/init/bootstrapper.cc b/chromium/v8/src/init/bootstrapper.cc
index 4c5e30a26dc..86be77e485e 100644
--- a/chromium/v8/src/init/bootstrapper.cc
+++ b/chromium/v8/src/init/bootstrapper.cc
@@ -632,7 +632,9 @@ V8_NOINLINE void SimpleInstallGetterSetter(Isolate* isolate,
Handle<JSFunction> setter =
SimpleCreateFunction(isolate, setter_name, call_setter, 1, true);
- JSObject::DefineAccessor(base, name, getter, setter, DONT_ENUM).Check();
+ JSObject::DefineOwnAccessorIgnoreAttributes(base, name, getter, setter,
+ DONT_ENUM)
+ .Check();
}
void SimpleInstallGetterSetter(Isolate* isolate, Handle<JSObject> base,
@@ -656,7 +658,8 @@ V8_NOINLINE Handle<JSFunction> SimpleInstallGetter(Isolate* isolate,
Handle<Object> setter = isolate->factory()->undefined_value();
- JSObject::DefineAccessor(base, property_name, getter, setter, DONT_ENUM)
+ JSObject::DefineOwnAccessorIgnoreAttributes(base, property_name, getter,
+ setter, DONT_ENUM)
.Check();
return getter;
diff --git a/chromium/v8/src/objects/js-objects.cc b/chromium/v8/src/objects/js-objects.cc
index 7bb2558cec6..8e11fb4ac24 100644
--- a/chromium/v8/src/objects/js-objects.cc
+++ b/chromium/v8/src/objects/js-objects.cc
@@ -1531,7 +1531,8 @@ Maybe<bool> JSReceiver::ValidateAndApplyPropertyDescriptor(
? desc->set()
: Handle<Object>::cast(isolate->factory()->null_value()));
MaybeHandle<Object> result =
- JSObject::DefineAccessor(it, getter, setter, desc->ToAttributes());
+ JSObject::DefineOwnAccessorIgnoreAttributes(it, getter, setter,
+ desc->ToAttributes());
if (result.is_null()) return Nothing<bool>();
}
}
@@ -1715,8 +1716,8 @@ Maybe<bool> JSReceiver::ValidateAndApplyPropertyDescriptor(
: current->has_set()
? current->set()
: Handle<Object>::cast(isolate->factory()->null_value()));
- MaybeHandle<Object> result =
- JSObject::DefineAccessor(it, getter, setter, attrs);
+ MaybeHandle<Object> result = JSObject::DefineOwnAccessorIgnoreAttributes(
+ it, getter, setter, attrs);
if (result.is_null()) return Nothing<bool>();
}
}
@@ -4683,22 +4684,19 @@ bool JSObject::HasEnumerableElements() {
UNREACHABLE();
}
-MaybeHandle<Object> JSObject::DefineAccessor(Handle<JSObject> object,
- Handle<Name> name,
- Handle<Object> getter,
- Handle<Object> setter,
- PropertyAttributes attributes) {
+MaybeHandle<Object> JSObject::DefineOwnAccessorIgnoreAttributes(
+ Handle<JSObject> object, Handle<Name> name, Handle<Object> getter,
+ Handle<Object> setter, PropertyAttributes attributes) {
Isolate* isolate = object->GetIsolate();
PropertyKey key(isolate, name);
LookupIterator it(isolate, object, key, LookupIterator::OWN_SKIP_INTERCEPTOR);
- return DefineAccessor(&it, getter, setter, attributes);
+ return DefineOwnAccessorIgnoreAttributes(&it, getter, setter, attributes);
}
-MaybeHandle<Object> JSObject::DefineAccessor(LookupIterator* it,
- Handle<Object> getter,
- Handle<Object> setter,
- PropertyAttributes attributes) {
+MaybeHandle<Object> JSObject::DefineOwnAccessorIgnoreAttributes(
+ LookupIterator* it, Handle<Object> getter, Handle<Object> setter,
+ PropertyAttributes attributes) {
Isolate* isolate = it->isolate();
it->UpdateProtector();
diff --git a/chromium/v8/src/objects/js-objects.h b/chromium/v8/src/objects/js-objects.h
index f83083cdbc9..db154b56e2c 100644
--- a/chromium/v8/src/objects/js-objects.h
+++ b/chromium/v8/src/objects/js-objects.h
@@ -536,13 +536,14 @@ class JSObject : public TorqueGeneratedJSObject<JSObject, JSReceiver> {
GetPropertyAttributesWithFailedAccessCheck(LookupIterator* it);
// Defines an AccessorPair property on the given object.
- V8_EXPORT_PRIVATE static MaybeHandle<Object> DefineAccessor(
- Handle<JSObject> object, Handle<Name> name, Handle<Object> getter,
- Handle<Object> setter, PropertyAttributes attributes);
- static MaybeHandle<Object> DefineAccessor(LookupIterator* it,
- Handle<Object> getter,
- Handle<Object> setter,
- PropertyAttributes attributes);
+ V8_EXPORT_PRIVATE static MaybeHandle<Object>
+ DefineOwnAccessorIgnoreAttributes(Handle<JSObject> object, Handle<Name> name,
+ Handle<Object> getter,
+ Handle<Object> setter,
+ PropertyAttributes attributes);
+ static MaybeHandle<Object> DefineOwnAccessorIgnoreAttributes(
+ LookupIterator* it, Handle<Object> getter, Handle<Object> setter,
+ PropertyAttributes attributes);
// Defines an AccessorInfo property on the given object.
V8_WARN_UNUSED_RESULT static MaybeHandle<Object> SetAccessor(
diff --git a/chromium/v8/src/regexp/arm/regexp-macro-assembler-arm.cc b/chromium/v8/src/regexp/arm/regexp-macro-assembler-arm.cc
index 46ae0aaa7fe..8aa815db2ac 100644
--- a/chromium/v8/src/regexp/arm/regexp-macro-assembler-arm.cc
+++ b/chromium/v8/src/regexp/arm/regexp-macro-assembler-arm.cc
@@ -892,19 +892,18 @@ Handle<HeapObject> RegExpMacroAssemblerARM::GetCode(Handle<String> source) {
__ add(r2, r2, Operand(num_saved_registers_ * kSystemPointerSize));
__ str(r2, MemOperand(frame_pointer(), kRegisterOutputOffset));
- // Prepare r0 to initialize registers with its value in the next run.
- __ ldr(r0, MemOperand(frame_pointer(), kStringStartMinusOneOffset));
-
// Restore the original regexp stack pointer value (effectively, pop the
// stored base pointer).
PopRegExpBasePointer(backtrack_stackpointer(), r2);
+ Label reload_string_start_minus_one;
+
if (global_with_zero_length_check()) {
// Special case for zero-length matches.
// r4: capture start index
__ cmp(current_input_offset(), r4);
// Not a zero-length match, restart.
- __ b(ne, &load_char_start_regexp);
+ __ b(ne, &reload_string_start_minus_one);
// Offset from the end is zero if we already reached the end.
__ cmp(current_input_offset(), Operand::Zero());
__ b(eq, &exit_label_);
@@ -916,6 +915,11 @@ Handle<HeapObject> RegExpMacroAssemblerARM::GetCode(Handle<String> source) {
if (global_unicode()) CheckNotInSurrogatePair(0, &advance);
}
+ __ bind(&reload_string_start_minus_one);
+ // Prepare r0 to initialize registers with its value in the next run.
+ // Must be immediately before the jump to avoid clobbering.
+ __ ldr(r0, MemOperand(frame_pointer(), kStringStartMinusOneOffset));
+
__ b(&load_char_start_regexp);
} else {
__ mov(r0, Operand(SUCCESS));
diff --git a/chromium/v8/src/regexp/ia32/regexp-macro-assembler-ia32.cc b/chromium/v8/src/regexp/ia32/regexp-macro-assembler-ia32.cc
index 0d448569fa6..6370e7e57da 100644
--- a/chromium/v8/src/regexp/ia32/regexp-macro-assembler-ia32.cc
+++ b/chromium/v8/src/regexp/ia32/regexp-macro-assembler-ia32.cc
@@ -937,19 +937,18 @@ Handle<HeapObject> RegExpMacroAssemblerIA32::GetCode(Handle<String> source) {
__ add(Operand(ebp, kRegisterOutputOffset),
Immediate(num_saved_registers_ * kSystemPointerSize));
- // Prepare eax to initialize registers with its value in the next run.
- __ mov(eax, Operand(ebp, kStringStartMinusOneOffset));
-
// Restore the original regexp stack pointer value (effectively, pop the
// stored base pointer).
PopRegExpBasePointer(backtrack_stackpointer(), ebx);
+ Label reload_string_start_minus_one;
+
if (global_with_zero_length_check()) {
// Special case for zero-length matches.
// edx: capture start index
__ cmp(edi, edx);
// Not a zero-length match, restart.
- __ j(not_equal, &load_char_start_regexp);
+ __ j(not_equal, &reload_string_start_minus_one);
// edi (offset from the end) is zero if we already reached the end.
__ test(edi, edi);
__ j(zero, &exit_label_, Label::kNear);
@@ -963,6 +962,12 @@ Handle<HeapObject> RegExpMacroAssemblerIA32::GetCode(Handle<String> source) {
}
if (global_unicode()) CheckNotInSurrogatePair(0, &advance);
}
+
+ __ bind(&reload_string_start_minus_one);
+ // Prepare eax to initialize registers with its value in the next run.
+ // Must be immediately before the jump to avoid clobbering.
+ __ mov(eax, Operand(ebp, kStringStartMinusOneOffset));
+
__ jmp(&load_char_start_regexp);
} else {
__ mov(eax, Immediate(SUCCESS));
diff --git a/chromium/v8/src/regexp/loong64/regexp-macro-assembler-loong64.cc b/chromium/v8/src/regexp/loong64/regexp-macro-assembler-loong64.cc
index bb9964e1267..7c1d96e4d50 100644
--- a/chromium/v8/src/regexp/loong64/regexp-macro-assembler-loong64.cc
+++ b/chromium/v8/src/regexp/loong64/regexp-macro-assembler-loong64.cc
@@ -864,18 +864,17 @@ Handle<HeapObject> RegExpMacroAssemblerLOONG64::GetCode(Handle<String> source) {
__ Add_d(a2, a2, num_saved_registers_ * kIntSize);
__ St_d(a2, MemOperand(frame_pointer(), kRegisterOutputOffset));
- // Prepare a0 to initialize registers with its value in the next run.
- __ Ld_d(a0, MemOperand(frame_pointer(), kStringStartMinusOneOffset));
-
// Restore the original regexp stack pointer value (effectively, pop the
// stored base pointer).
PopRegExpBasePointer(backtrack_stackpointer(), a2);
+ Label reload_string_start_minus_one;
+
if (global_with_zero_length_check()) {
// Special case for zero-length matches.
// t3: capture start index
// Not a zero-length match, restart.
- __ Branch(&load_char_start_regexp, ne, current_input_offset(),
+ __ Branch(&reload_string_start_minus_one, ne, current_input_offset(),
Operand(t3));
// Offset from the end is zero if we already reached the end.
__ Branch(&exit_label_, eq, current_input_offset(),
@@ -888,6 +887,11 @@ Handle<HeapObject> RegExpMacroAssemblerLOONG64::GetCode(Handle<String> source) {
if (global_unicode()) CheckNotInSurrogatePair(0, &advance);
}
+ __ bind(&reload_string_start_minus_one);
+ // Prepare a0 to initialize registers with its value in the next run.
+ // Must be immediately before the jump to avoid clobbering.
+ __ Ld_d(a0, MemOperand(frame_pointer(), kStringStartMinusOneOffset));
+
__ Branch(&load_char_start_regexp);
} else {
__ li(a0, Operand(SUCCESS));
diff --git a/chromium/v8/src/regexp/mips64/regexp-macro-assembler-mips64.cc b/chromium/v8/src/regexp/mips64/regexp-macro-assembler-mips64.cc
index 3260e84dfc8..f0c9f1d1eeb 100644
--- a/chromium/v8/src/regexp/mips64/regexp-macro-assembler-mips64.cc
+++ b/chromium/v8/src/regexp/mips64/regexp-macro-assembler-mips64.cc
@@ -911,19 +911,18 @@ Handle<HeapObject> RegExpMacroAssemblerMIPS::GetCode(Handle<String> source) {
__ Daddu(a2, a2, num_saved_registers_ * kIntSize);
__ Sd(a2, MemOperand(frame_pointer(), kRegisterOutputOffset));
- // Prepare a0 to initialize registers with its value in the next run.
- __ Ld(a0, MemOperand(frame_pointer(), kStringStartMinusOneOffset));
-
// Restore the original regexp stack pointer value (effectively, pop the
// stored base pointer).
PopRegExpBasePointer(backtrack_stackpointer(), a2);
+ Label reload_string_start_minus_one;
+
if (global_with_zero_length_check()) {
// Special case for zero-length matches.
// t3: capture start index
// Not a zero-length match, restart.
- __ Branch(
- &load_char_start_regexp, ne, current_input_offset(), Operand(t3));
+ __ Branch(&reload_string_start_minus_one, ne, current_input_offset(),
+ Operand(t3));
// Offset from the end is zero if we already reached the end.
__ Branch(&exit_label_, eq, current_input_offset(),
Operand(zero_reg));
@@ -935,6 +934,11 @@ Handle<HeapObject> RegExpMacroAssemblerMIPS::GetCode(Handle<String> source) {
if (global_unicode()) CheckNotInSurrogatePair(0, &advance);
}
+ __ bind(&reload_string_start_minus_one);
+ // Prepare a0 to initialize registers with its value in the next run.
+ // Must be immediately before the jump to avoid clobbering.
+ __ Ld(a0, MemOperand(frame_pointer(), kStringStartMinusOneOffset));
+
__ Branch(&load_char_start_regexp);
} else {
__ li(v0, Operand(SUCCESS));
diff --git a/chromium/v8/src/regexp/regexp-parser.cc b/chromium/v8/src/regexp/regexp-parser.cc
index f7707e80a10..5c77a94dc45 100644
--- a/chromium/v8/src/regexp/regexp-parser.cc
+++ b/chromium/v8/src/regexp/regexp-parser.cc
@@ -2816,6 +2816,14 @@ RegExpTree* RegExpParserImpl<CharT>::ParseClassUnion(
return ReportError(RegExpError::kNegatedCharacterClassWithStrings);
}
+ if (operands->is_empty()) {
+ // Return empty expression if no operands were added (e.g. [\P{Any}]
+ // produces an empty range).
+ DCHECK(ranges->is_empty());
+ DCHECK(strings->empty());
+ return RegExpClassSetExpression::Empty(zone(), is_negated);
+ }
+
return zone()->template New<RegExpClassSetExpression>(
RegExpClassSetExpression::OperationType::kUnion, is_negated,
may_contain_strings, operands);
diff --git a/chromium/v8/src/regexp/riscv/regexp-macro-assembler-riscv.cc b/chromium/v8/src/regexp/riscv/regexp-macro-assembler-riscv.cc
index 2e6df50c60a..5bf630d6200 100644
--- a/chromium/v8/src/regexp/riscv/regexp-macro-assembler-riscv.cc
+++ b/chromium/v8/src/regexp/riscv/regexp-macro-assembler-riscv.cc
@@ -876,19 +876,17 @@ Handle<HeapObject> RegExpMacroAssemblerRISCV::GetCode(Handle<String> source) {
__ AddWord(a2, a2, num_saved_registers_ * kIntSize);
__ StoreWord(a2, MemOperand(frame_pointer(), kRegisterOutputOffset));
- // Prepare a0 to initialize registers with its value in the next run.
- __ LoadWord(a0,
- MemOperand(frame_pointer(), kStringStartMinusOneOffset));
-
// Restore the original regexp stack pointer value (effectively, pop the
// stored base pointer).
PopRegExpBasePointer(backtrack_stackpointer(), a2);
+ Label reload_string_start_minus_one;
+
if (global_with_zero_length_check()) {
// Special case for zero-length matches.
// s3: capture start index
// Not a zero-length match, restart.
- __ Branch(&load_char_start_regexp, ne, current_input_offset(),
+ __ Branch(&reload_string_start_minus_one, ne, current_input_offset(),
Operand(s3));
// Offset from the end is zero if we already reached the end.
__ Branch(&exit_label_, eq, current_input_offset(),
@@ -901,6 +899,12 @@ Handle<HeapObject> RegExpMacroAssemblerRISCV::GetCode(Handle<String> source) {
if (global_unicode()) CheckNotInSurrogatePair(0, &advance);
}
+ __ bind(&reload_string_start_minus_one);
+ // Prepare a0 to initialize registers with its value in the next run.
+ // Must be immediately before the jump to avoid clobbering.
+ __ LoadWord(a0,
+ MemOperand(frame_pointer(), kStringStartMinusOneOffset));
+
__ Branch(&load_char_start_regexp);
} else {
__ li(a0, Operand(SUCCESS));
diff --git a/chromium/v8/src/regexp/s390/regexp-macro-assembler-s390.cc b/chromium/v8/src/regexp/s390/regexp-macro-assembler-s390.cc
index 929ad3dd1c9..a3a866b6f70 100644
--- a/chromium/v8/src/regexp/s390/regexp-macro-assembler-s390.cc
+++ b/chromium/v8/src/regexp/s390/regexp-macro-assembler-s390.cc
@@ -953,19 +953,18 @@ Handle<HeapObject> RegExpMacroAssemblerS390::GetCode(Handle<String> source) {
__ AddS64(r4, Operand(num_saved_registers_ * kIntSize));
__ StoreU64(r4, MemOperand(frame_pointer(), kRegisterOutputOffset));
- // Prepare r2 to initialize registers with its value in the next run.
- __ LoadU64(r2, MemOperand(frame_pointer(), kStringStartMinusOneOffset));
-
// Restore the original regexp stack pointer value (effectively, pop the
// stored base pointer).
PopRegExpBasePointer(backtrack_stackpointer(), r4);
+ Label reload_string_start_minus_one;
+
if (global_with_zero_length_check()) {
// Special case for zero-length matches.
// r6: capture start index
__ CmpS64(current_input_offset(), r6);
// Not a zero-length match, restart.
- __ bne(&load_char_start_regexp);
+ __ bne(&reload_string_start_minus_one);
// Offset from the end is zero if we already reached the end.
__ CmpS64(current_input_offset(), Operand::Zero());
__ beq(&exit_label_);
@@ -976,6 +975,11 @@ Handle<HeapObject> RegExpMacroAssemblerS390::GetCode(Handle<String> source) {
if (global_unicode()) CheckNotInSurrogatePair(0, &advance);
}
+ __ bind(&reload_string_start_minus_one);
+ // Prepare r2 to initialize registers with its value in the next run.
+ // Must be immediately before the jump to avoid clobbering.
+ __ LoadU64(r2, MemOperand(frame_pointer(), kStringStartMinusOneOffset));
+
__ b(&load_char_start_regexp);
} else {
__ mov(r2, Operand(SUCCESS));
diff --git a/chromium/v8/src/regexp/x64/regexp-macro-assembler-x64.cc b/chromium/v8/src/regexp/x64/regexp-macro-assembler-x64.cc
index 3377858ee22..b6b2f5f5606 100644
--- a/chromium/v8/src/regexp/x64/regexp-macro-assembler-x64.cc
+++ b/chromium/v8/src/regexp/x64/regexp-macro-assembler-x64.cc
@@ -976,19 +976,18 @@ Handle<HeapObject> RegExpMacroAssemblerX64::GetCode(Handle<String> source) {
__ addq(Operand(rbp, kRegisterOutputOffset),
Immediate(num_saved_registers_ * kIntSize));
- // Prepare rax to initialize registers with its value in the next run.
- __ movq(rax, Operand(rbp, kStringStartMinusOneOffset));
-
// Restore the original regexp stack pointer value (effectively, pop the
// stored base pointer).
PopRegExpBasePointer(backtrack_stackpointer(), kScratchRegister);
+ Label reload_string_start_minus_one;
+
if (global_with_zero_length_check()) {
// Special case for zero-length matches.
// rdx: capture start index
__ cmpq(rdi, rdx);
// Not a zero-length match, restart.
- __ j(not_equal, &load_char_start_regexp);
+ __ j(not_equal, &reload_string_start_minus_one);
// rdi (offset from the end) is zero if we already reached the end.
__ testq(rdi, rdi);
__ j(zero, &exit_label_, Label::kNear);
@@ -1003,6 +1002,11 @@ Handle<HeapObject> RegExpMacroAssemblerX64::GetCode(Handle<String> source) {
if (global_unicode()) CheckNotInSurrogatePair(0, &advance);
}
+ __ bind(&reload_string_start_minus_one);
+ // Prepare rax to initialize registers with its value in the next run.
+ // Must be immediately before the jump to avoid clobbering.
+ __ movq(rax, Operand(rbp, kStringStartMinusOneOffset));
+
__ jmp(&load_char_start_regexp);
} else {
__ Move(rax, SUCCESS);
diff --git a/chromium/v8/src/runtime/runtime-object.cc b/chromium/v8/src/runtime/runtime-object.cc
index ff1f1d0c9a5..2d4965549b2 100644
--- a/chromium/v8/src/runtime/runtime-object.cc
+++ b/chromium/v8/src/runtime/runtime-object.cc
@@ -1086,7 +1086,8 @@ RUNTIME_FUNCTION(Runtime_DefineAccessorPropertyUnchecked) {
auto attrs = PropertyAttributesFromInt(args.smi_value_at(4));
RETURN_FAILURE_ON_EXCEPTION(
- isolate, JSObject::DefineAccessor(obj, name, getter, setter, attrs));
+ isolate, JSObject::DefineOwnAccessorIgnoreAttributes(obj, name, getter,
+ setter, attrs));
return ReadOnlyRoots(isolate).undefined_value();
}
@@ -1213,8 +1214,8 @@ RUNTIME_FUNCTION(Runtime_DefineGetterPropertyUnchecked) {
RETURN_FAILURE_ON_EXCEPTION(
isolate,
- JSObject::DefineAccessor(object, name, getter,
- isolate->factory()->null_value(), attrs));
+ JSObject::DefineOwnAccessorIgnoreAttributes(
+ object, name, getter, isolate->factory()->null_value(), attrs));
return ReadOnlyRoots(isolate).undefined_value();
}
@@ -1358,8 +1359,8 @@ RUNTIME_FUNCTION(Runtime_DefineSetterPropertyUnchecked) {
RETURN_FAILURE_ON_EXCEPTION(
isolate,
- JSObject::DefineAccessor(object, name, isolate->factory()->null_value(),
- setter, attrs));
+ JSObject::DefineOwnAccessorIgnoreAttributes(
+ object, name, isolate->factory()->null_value(), setter, attrs));
return ReadOnlyRoots(isolate).undefined_value();
}
diff --git a/chromium/v8/src/sandbox/testing.cc b/chromium/v8/src/sandbox/testing.cc
index fead4aa222c..aab72a18015 100644
--- a/chromium/v8/src/sandbox/testing.cc
+++ b/chromium/v8/src/sandbox/testing.cc
@@ -156,7 +156,8 @@ void InstallGetter(Isolate* isolate, Handle<JSObject> object,
Handle<String> property_name = factory->NewStringFromAsciiChecked(name);
Handle<JSFunction> getter = CreateFunc(isolate, func, property_name, false);
Handle<Object> setter = factory->null_value();
- JSObject::DefineAccessor(object, property_name, getter, setter, FROZEN);
+ JSObject::DefineOwnAccessorIgnoreAttributes(object, property_name, getter,
+ setter, FROZEN);
}
void InstallFunction(Isolate* isolate, Handle<JSObject> holder,