diff --git a/DEPS b/DEPS index 96627636..2528f2e7 100644 --- a/DEPS +++ b/DEPS
@@ -204,11 +204,11 @@ # 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': '01cb243b5e8cb31cbba5f9ce854fcd0b02a992d9', + 'skia_revision': '0408afc573a86ccf7541aa3fdcf255bca6afc432', # 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': 'af560a8bf8228e4c3ec67af7a567370c75ff17bc', + 'v8_revision': 'b3b47599bf78d3b7869f92c17edc5cd0ec216acf', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling swarming_client # and whatever else without interference from each other. @@ -216,7 +216,7 @@ # 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': '2d07b04d5a2635ccf4527eb644e8b0ed1fd92b4c', + 'angle_revision': '2b7fdb62837eb5de4fede39f62c2d554b16cdbd5', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -283,7 +283,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling devtools-frontend # and whatever else without interference from each other. - 'devtools_frontend_revision': '20ce25246086287e32b4d174433959af6d2cb7e5', + 'devtools_frontend_revision': '0e6a2814d734938d50d372695df0391cab88e6ae', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libprotobuf-mutator # and whatever else without interference from each other. @@ -323,7 +323,7 @@ # 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': '7fe018c06578ff04d0e4ec2a0ada2c34a82ef6b0', + 'dawn_revision': '6d4617a2d28d8d3d4aa946abdbabb368d025b6b7', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -363,7 +363,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'tint_revision': 'fe2ceb9b5d7c1d173d8d9831a29547e221ebdaa3', + 'tint_revision': '6ce58becd2d541e84cfad59ec60addbfff004f26', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -697,7 +697,7 @@ 'packages': [ { 'package': 'chromium/third_party/androidx', - 'version': '0cXqPd9UzaimlGKD6A5oVclporrOAC3RznyC7ICXQ9UC', + 'version': 'oreM1nhI2BN_p04o3Ghzwh57VhwOPKaXhpFBJG3PbbUC', }, ], 'condition': 'checkout_android', @@ -930,7 +930,7 @@ }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'd071f2a8a941d8f7e05eb43319c7b2ab81fc8fdd', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '0e8b3107e056f22f04ed82d6906560e7dd83baae', 'src/third_party/devtools-frontend/src': Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'), @@ -1070,7 +1070,7 @@ Var('chromium_git') + '/chromium/deps/hunspell_dictionaries.git' + '@' + '18e09b9197a3b1d771c077c530d1a4ebad04c167', 'src/third_party/icu': - Var('chromium_git') + '/chromium/deps/icu.git' + '@' + 'e6379c8802a00952a90c4bc547171fd4827f974b', + Var('chromium_git') + '/chromium/deps/icu.git' + '@' + 'd879aac9717d15679125cfe8c26b482006f107f3', 'src/third_party/icu4j': { 'packages': [ @@ -1380,7 +1380,7 @@ 'packages': [ { 'package': 'fuchsia/third_party/aemu/linux-amd64', - 'version': '54xTthw_IjFSMlG1PKSD2hx94yCiezWKZ3cybspeGlEC' + 'version': 'oXIWsntGxFugYHN4Qb0Ve-IRPq4Rq1FxFYNiuEKnP0kC' }, ], 'condition': 'host_os == "linux" and checkout_fuchsia', @@ -1618,7 +1618,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/eche_app/app', - 'version': 'qkzc3hXN67-WIO1xipWSuWVwI7C8CYeKqnaVo2env8QC', + 'version': 'PTweRYwjxuVhQ68MR1GPXTbQt97-rWOPHlOnoJiOUjMC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/PRESUBMIT.py b/PRESUBMIT.py index f0f23c4d..827e318 100644 --- a/PRESUBMIT.py +++ b/PRESUBMIT.py
@@ -51,7 +51,11 @@ _TEST_CODE_EXCLUDED_PATHS = ( r'.*[\\/](fake_|test_|mock_).+%s' % _IMPLEMENTATION_EXTENSIONS, r'.+_test_(base|support|util)%s' % _IMPLEMENTATION_EXTENSIONS, - r'.+_(api|browser|eg|int|perf|pixel|unit|ui)?test(_[a-z]+)?%s' % + # Test suite files, like: + # foo_browsertest.cc + # bar_unittest_mac.cc (suffix) + # baz_unittests.cc (plural) + r'.+_(api|browser|eg|int|perf|pixel|unit|ui)?test(s)?(_[a-z]+)?%s' % _IMPLEMENTATION_EXTENSIONS, r'.+_(fuzz|fuzzer)(_[a-z]+)?%s' % _IMPLEMENTATION_EXTENSIONS, r'.+profile_sync_service_harness%s' % _IMPLEMENTATION_EXTENSIONS, @@ -4703,6 +4707,132 @@ return [] +def CheckForUseOfChromeAppsDeprecations(input_api, output_api): + """Check source code for use of Chrome App technologies being + deprecated. + """ + + def _CheckForDeprecatedTech(input_api, output_api, + detection_list, files_to_check = None, files_to_skip = None): + + if (files_to_check or files_to_skip): + source_file_filter = lambda f: input_api.FilterSourceFile( + f, files_to_check=files_to_check, + files_to_skip=files_to_skip) + else: + source_file_filter = None + + problems = [] + + for f in input_api.AffectedSourceFiles(source_file_filter): + if f.Action() == 'D': + continue + for _, line in f.ChangedContents(): + if any( detect in line for detect in detection_list ): + problems.append(f.LocalPath()) + + return problems + + # to avoid this presubmit script triggering warnings + files_to_skip = ['PRESUBMIT.py','PRESUBMIT_test.py'] + + problems =[] + + # NMF: any files with extensions .nmf or NMF + _NMF_FILES = r'\.(nmf|NMF)$' + problems += _CheckForDeprecatedTech(input_api, output_api, + detection_list = [''], # any change to the file will trigger warning + files_to_check = [ r'.+%s' % _NMF_FILES ]) + + # MANIFEST: any manifest.json that in its diff includes "app": + _MANIFEST_FILES = r'(manifest\.json)$' + problems += _CheckForDeprecatedTech(input_api, output_api, + detection_list = ['"app":'], + files_to_check = [ r'.*%s' % _MANIFEST_FILES ]) + + # NaCl / PNaCl: any file that in its diff contains the strings in the list + problems += _CheckForDeprecatedTech(input_api, output_api, + detection_list = ['config=nacl','enable-nacl','cpu=pnacl', 'nacl_io'], + files_to_skip = files_to_skip + [ r"^native_client_sdk[\\/]"]) + + # PPAPI: any C/C++ file that in its diff includes a ppappi library + problems += _CheckForDeprecatedTech(input_api, output_api, + detection_list = ['#include "ppapi','#include <ppapi'], + files_to_check = ( + r'.+%s' % _HEADER_EXTENSIONS, + r'.+%s' % _IMPLEMENTATION_EXTENSIONS ), + files_to_skip = [r"^ppapi[\\/]"] ) + + # Chrome Apps: any JS/TS file that references an API in the list below. + # This should include the list of Chrome Apps APIs that are not Chrome + # Extensions APIs as documented in: + # https://developer.chrome.com/docs/apps/migration/ + detection_list_chrome_apps = [ + 'chrome.accessibilityFeatures', + 'chrome.alarms', + 'chrome.app.runtime', + 'chrome.app.window', + 'chrome.audio', + 'chrome.bluetooth', + 'chrome.bluetoothLowEnergy', + 'chrome.bluetoothSocket', + 'chrome.browser', + 'chrome.commands', + 'chrome.contextMenus', + 'chrome.documentScan', + 'chrome.events', + 'chrome.extensionTypes', + 'chrome.fileSystem', + 'chrome.fileSystemProvider', + 'chrome.gcm', + 'chrome.hid', + 'chrome.i18n', + 'chrome.identity', + 'chrome.idle', + 'chrome.instanceID', + 'chrome.mdns', + 'chrome.mediaGalleries', + 'chrome.networking.onc', + 'chrome.notifications', + 'chrome.permissions', + 'chrome.power', + 'chrome.printerProvider', + 'chrome.runtime', + 'chrome.serial', + 'chrome.sockets.tcp', + 'chrome.sockets.tcpServer', + 'chrome.sockets.udp', + 'chrome.storage', + 'chrome.syncFileSystem', + 'chrome.system.cpu', + 'chrome.system.display', + 'chrome.system.memory', + 'chrome.system.network', + 'chrome.system.storage', + 'chrome.tts', + 'chrome.types', + 'chrome.usb', + 'chrome.virtualKeyboard', + 'chrome.vpnProvider', + 'chrome.wallpaper' + ] + _JS_FILES = r'\.(js|ts)$' + problems += _CheckForDeprecatedTech(input_api, output_api, + detection_list = detection_list_chrome_apps, + files_to_check = [ r'.+%s' % _JS_FILES ], + files_to_skip = files_to_skip) + + if problems: + return [output_api.PresubmitPromptWarning('You are adding/modifying code' + 'related to technologies which will soon be deprecated (Chrome Apps, NaCl,' + ' PNaCl, PPAPI). See this blog post for more details:\n' + 'https://blog.chromium.org/2020/08/changes-to-chrome-app-support-timeline.html\n' + 'and this documentation for options to replace these technologies:\n' + 'https://developer.chrome.com/docs/apps/migration/\n'+ + '\n'.join(problems))] + + return [] + def CheckSyslogUseWarningOnUpload(input_api, output_api, src_file_filter=None): """Checks that all source files use SYSLOG properly."""
diff --git a/PRESUBMIT_test.py b/PRESUBMIT_test.py index 94bae88f..379944e 100755 --- a/PRESUBMIT_test.py +++ b/PRESUBMIT_test.py
@@ -2529,6 +2529,18 @@ mock_input_api, MockOutputApi()) self.assertEqual(0, len(results)) + def testAllowedFiles(self): + mock_input_api = MockInputApi() + mock_input_api.files = [ + MockFile('path/foo_unittest.cc', ['foo_for_testing();']), + MockFile('path/bar_unittest_mac.cc', ['foo_for_testing();']), + MockFile('path/baz_unittests.cc', ['foo_for_testing();']), + ] + + results = PRESUBMIT.CheckNoProductionCodeUsingTestOnlyFunctions( + mock_input_api, MockOutputApi()) + self.assertEqual(0, len(results)) + class NoProductionJavaCodeUsingTestOnlyFunctionsTest(unittest.TestCase): def testTruePositives(self): @@ -3602,6 +3614,166 @@ ]) self.assertEqual([], errors) +class CheckForUseOfChromeAppsDeprecationsTest(unittest.TestCase): + + ERROR_MSG_PIECE = 'technologies which will soon be deprecated' + + # Each positive test is also a naive negative test for the other cases. + + def testWarningNMF(self): + mock_input_api = MockInputApi() + mock_input_api.files = [ + MockAffectedFile( + 'foo.NMF', + ['"program"', '"Z":"content"', 'B'], + ['"program"', 'B'], + scm_diff='\n'.join([ + '--- foo.NMF.old 2020-12-02 20:40:54.430676385 +0100', + '+++ foo.NMF.new 2020-12-02 20:41:02.086700197 +0100', + '@@ -1,2 +1,3 @@', + ' "program"', + '+"Z":"content"', + ' B']), + action='M') + ] + mock_output_api = MockOutputApi() + errors = PRESUBMIT.CheckForUseOfChromeAppsDeprecations(mock_input_api, + mock_output_api) + self.assertEqual(1, len(errors)) + self.assertTrue( self.ERROR_MSG_PIECE in errors[0].message) + self.assertTrue( 'foo.NMF' in errors[0].message) + + def testWarningManifest(self): + mock_input_api = MockInputApi() + mock_input_api.files = [ + MockAffectedFile( + 'manifest.json', + ['"app":', '"Z":"content"', 'B'], + ['"app":"', 'B'], + scm_diff='\n'.join([ + '--- manifest.json.old 2020-12-02 20:40:54.430676385 +0100', + '+++ manifest.json.new 2020-12-02 20:41:02.086700197 +0100', + '@@ -1,2 +1,3 @@', + ' "app"', + '+"Z":"content"', + ' B']), + action='M') + ] + mock_output_api = MockOutputApi() + errors = PRESUBMIT.CheckForUseOfChromeAppsDeprecations(mock_input_api, + mock_output_api) + self.assertEqual(1, len(errors)) + self.assertTrue( self.ERROR_MSG_PIECE in errors[0].message) + self.assertTrue( 'manifest.json' in errors[0].message) + + def testOKWarningManifestWithoutApp(self): + mock_input_api = MockInputApi() + mock_input_api.files = [ + MockAffectedFile( + 'manifest.json', + ['"name":', '"Z":"content"', 'B'], + ['"name":"', 'B'], + scm_diff='\n'.join([ + '--- manifest.json.old 2020-12-02 20:40:54.430676385 +0100', + '+++ manifest.json.new 2020-12-02 20:41:02.086700197 +0100', + '@@ -1,2 +1,3 @@', + ' "app"', + '+"Z":"content"', + ' B']), + action='M') + ] + mock_output_api = MockOutputApi() + errors = PRESUBMIT.CheckForUseOfChromeAppsDeprecations(mock_input_api, + mock_output_api) + self.assertEqual(0, len(errors)) + + def testWarningPPAPI(self): + mock_input_api = MockInputApi() + mock_input_api.files = [ + MockAffectedFile( + 'foo.hpp', + ['A', '#include <ppapi.h>', 'B'], + ['A', 'B'], + scm_diff='\n'.join([ + '--- foo.hpp.old 2020-12-02 20:40:54.430676385 +0100', + '+++ foo.hpp.new 2020-12-02 20:41:02.086700197 +0100', + '@@ -1,2 +1,3 @@', + ' A', + '+#include <ppapi.h>', + ' B']), + action='M') + ] + mock_output_api = MockOutputApi() + errors = PRESUBMIT.CheckForUseOfChromeAppsDeprecations(mock_input_api, + mock_output_api) + self.assertEqual(1, len(errors)) + self.assertTrue( self.ERROR_MSG_PIECE in errors[0].message) + self.assertTrue( 'foo.hpp' in errors[0].message) + + def testNoWarningPPAPI(self): + mock_input_api = MockInputApi() + mock_input_api.files = [ + MockAffectedFile( + 'foo.txt', + ['A', 'Peppapig', 'B'], + ['A', 'B'], + scm_diff='\n'.join([ + '--- foo.txt.old 2020-12-02 20:40:54.430676385 +0100', + '+++ foo.txt.new 2020-12-02 20:41:02.086700197 +0100', + '@@ -1,2 +1,3 @@', + ' A', + '+Peppapig', + ' B']), + action='M') + ] + mock_output_api = MockOutputApi() + errors = PRESUBMIT.CheckForUseOfChromeAppsDeprecations(mock_input_api, + mock_output_api) + self.assertEqual(0, len(errors)) + + def testWarningChromeApps(self): + mock_input_api = MockInputApi() + mock_input_api.files = [ + MockAffectedFile( + 'foo.js', + ['A', 'chrome.app.window.init()', 'B'], + ['A', 'chrome.window.init()', 'B'], + scm_diff='\n'.join([ + '--- foo.js.old 2020-12-02 20:40:54.430676385 +0100', + '+++ foo.js.new 2020-12-02 20:41:02.086700197 +0100', + '@@ -1,3 +1,3 @@', + ' A', + '+chrome.app.window.init()', + ' B']), + action='M') + ] + mock_output_api = MockOutputApi() + errors = PRESUBMIT.CheckForUseOfChromeAppsDeprecations(mock_input_api, + mock_output_api) + self.assertEqual(1, len(errors)) + self.assertTrue( self.ERROR_MSG_PIECE in errors[0].message) + self.assertTrue( 'foo.js' in errors[0].message) + + def testOKChromeAppsRemoved(self): + mock_input_api = MockInputApi() + mock_input_api.files = [ + MockAffectedFile( + 'foo.js', + ['A', 'B'], + ['A', 'chrome.app.window.init()', 'B'], + scm_diff='\n'.join([ + '--- foo.js.old 2020-12-02 20:40:54.430676385 +0100', + '+++ foo.js.new 2020-12-02 20:41:02.086700197 +0100', + '@@ -1,3 +1,2 @@', + ' A', + '-chrome.app.window.init()', + ' B']), + action='D') + ] + mock_output_api = MockOutputApi() + errors = PRESUBMIT.CheckForUseOfChromeAppsDeprecations(mock_input_api, + mock_output_api) + self.assertEqual(0, len(errors)) class CheckDeprecationOfPreferencesTest(unittest.TestCase): # Test that a warning is generated if a preference registration is removed
diff --git a/android_webview/browser/BUILD.gn b/android_webview/browser/BUILD.gn index 33fc2f4c..9d6ffa9 100644 --- a/android_webview/browser/BUILD.gn +++ b/android_webview/browser/BUILD.gn
@@ -217,7 +217,6 @@ "//components/page_load_metrics/browser", "//components/policy/content/", "//components/policy/core/browser", - "//components/power_metrics", "//components/pref_registry", "//components/prefs", "//components/printing/browser",
diff --git a/android_webview/browser/aw_browser_process.cc b/android_webview/browser/aw_browser_process.cc index e2b7a5a..208d7c1 100644 --- a/android_webview/browser/aw_browser_process.cc +++ b/android_webview/browser/aw_browser_process.cc
@@ -96,15 +96,8 @@ if (!visibility_metrics_logger_) { visibility_metrics_logger_ = std::make_unique<VisibilityMetricsLogger>(); - // Now that we may become visible, also initialize AndroidBatteryMetrics. - battery_metrics_ = std::make_unique<power_metrics::AndroidBatteryMetrics>(); visibility_metrics_logger_->SetOnVisibilityChangedCallback( base::BindRepeating([](bool visible) { - // TODO(crbug.com/1177542): make AndroidBatteryMetrics an observer of - // ProcessVisibilityTracker and remove this. - AwBrowserProcess::GetInstance() - ->battery_metrics_->OnAppVisibilityChanged(visible); - content::OnBrowserVisibilityChanged(visible); })); }
diff --git a/android_webview/browser/aw_browser_process.h b/android_webview/browser/aw_browser_process.h index 1224954..48b0dd5 100644 --- a/android_webview/browser/aw_browser_process.h +++ b/android_webview/browser/aw_browser_process.h
@@ -14,7 +14,6 @@ #include "android_webview/browser/safe_browsing/aw_safe_browsing_allowlist_manager.h" #include "android_webview/browser/safe_browsing/aw_safe_browsing_ui_manager.h" #include "base/feature_list.h" -#include "components/power_metrics/android_battery_metrics.h" #include "components/prefs/pref_change_registrar.h" #include "components/prefs/pref_service.h" #include "components/safe_browsing/android/remote_database_manager.h" @@ -113,7 +112,6 @@ safe_browsing_allowlist_manager_; std::unique_ptr<VisibilityMetricsLogger> visibility_metrics_logger_; - std::unique_ptr<power_metrics::AndroidBatteryMetrics> battery_metrics_; std::unique_ptr<AwContentsLifecycleNotifier> aw_contents_lifecycle_notifier_; DISALLOW_COPY_AND_ASSIGN(AwBrowserProcess);
diff --git a/android_webview/nonembedded/component_updater/aw_component_update_service.cc b/android_webview/nonembedded/component_updater/aw_component_update_service.cc index d01b136..f8a10027 100644 --- a/android_webview/nonembedded/component_updater/aw_component_update_service.cc +++ b/android_webview/nonembedded/component_updater/aw_component_update_service.cc
@@ -11,6 +11,8 @@ #include "android_webview/nonembedded/component_updater/registration.h" #include "android_webview/nonembedded/nonembedded_jni_headers/AwComponentUpdateService_jni.h" #include "android_webview/nonembedded/webview_apk_process.h" +#include "base/android/callback_android.h" +#include "base/android/scoped_java_ref.h" #include "base/callback_helpers.h" #include "base/check.h" #include "base/command_line.h" @@ -44,8 +46,11 @@ } // static -void JNI_AwComponentUpdateService_StartComponentUpdateService(JNIEnv* env) { - AwComponentUpdateService::GetInstance()->StartComponentUpdateService(); +void JNI_AwComponentUpdateService_StartComponentUpdateService( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& j_finished_callback) { + AwComponentUpdateService::GetInstance()->StartComponentUpdateService( + j_finished_callback); } AwComponentUpdateService::AwComponentUpdateService() @@ -66,7 +71,8 @@ } // Start ComponentUpdateService once. -void AwComponentUpdateService::StartComponentUpdateService() { +void AwComponentUpdateService::StartComponentUpdateService( + const base::android::JavaParamRef<jobject>& j_finished_callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); // All dirs point to the webview component root dir. Has to be called after @@ -81,7 +87,10 @@ base::Unretained(this)), base::BindOnce( &AwComponentUpdateService::ScheduleUpdatesOfRegisteredComponents, - weak_ptr_factory_.GetWeakPtr())); + weak_ptr_factory_.GetWeakPtr(), + base::BindOnce(base::android::RunRunnableAndroid, + base::android::ScopedJavaGlobalRef<jobject>( + j_finished_callback)))); } bool AwComponentUpdateService::RegisterComponent( @@ -193,12 +202,11 @@ return component_updater::GetCrxComponents(components_, ids); } -void AwComponentUpdateService::ScheduleUpdatesOfRegisteredComponents() { +void AwComponentUpdateService::ScheduleUpdatesOfRegisteredComponents( + base::OnceClosure on_finished_updates) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - // TODO(crbug.com/1183497): Notify Java AwComponentUpdateService once - // components have been registered and updated. - CheckForUpdates(base::DoNothing()); + CheckForUpdates(std::move(on_finished_updates)); } } // namespace android_webview
diff --git a/android_webview/nonembedded/component_updater/aw_component_update_service.h b/android_webview/nonembedded/component_updater/aw_component_update_service.h index 61af91c..0bb50e45 100644 --- a/android_webview/nonembedded/component_updater/aw_component_update_service.h +++ b/android_webview/nonembedded/component_updater/aw_component_update_service.h
@@ -9,6 +9,7 @@ #include <string> #include <vector> +#include "base/android/scoped_java_ref.h" #include "base/callback_forward.h" #include "base/containers/flat_map.h" #include "base/memory/scoped_refptr.h" @@ -31,7 +32,8 @@ class AwComponentUpdateService { public: static AwComponentUpdateService* GetInstance(); - void StartComponentUpdateService(); + void StartComponentUpdateService( + const base::android::JavaParamRef<jobject>& j_finished_callback); virtual bool NotifyNewVersion(const std::string& component_id, const base::FilePath& install_dir, @@ -54,7 +56,8 @@ const std::string& id) const; std::vector<base::Optional<update_client::CrxComponent>> GetCrxComponents( const std::vector<std::string>& ids); - void ScheduleUpdatesOfRegisteredComponents(); + void ScheduleUpdatesOfRegisteredComponents( + base::OnceClosure on_finished_updates); scoped_refptr<update_client::UpdateClient> update_client_;
diff --git a/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/AwComponentUpdateService.java b/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/AwComponentUpdateService.java index 7fd36bb..68a139fb 100644 --- a/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/AwComponentUpdateService.java +++ b/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/AwComponentUpdateService.java
@@ -24,7 +24,8 @@ // TODO(http://crbug.com/1179297) look at doing this in a task on a background thread // instead of the main thread. if (WebViewApkApplication.initializeNative()) { - AwComponentUpdateServiceJni.get().startComponentUpdateService(); + AwComponentUpdateServiceJni.get().startComponentUpdateService( + () -> { jobFinished(params, /* needReschedule= */ false); }); return true; } Log.e(TAG, "couldn't init native, aborting starting AwComponentUpdaterService"); @@ -33,15 +34,13 @@ @Override public boolean onStopJob(JobParameters params) { - // TODO(crbug.com/1177393) call jobFinished when component_updater::ComponentUpdateService - // finishes checking for updates. We are leaving scheduling of the recurring update job for - // the native service for now. Always return true for now because we don't know if the - // native update service has finished or not. - return true; + // This should only be called if the service needs to be shut down before we've called + // jobFinished. Request reschedule so we can finish downloading component updates. + return /*reschedule= */ true; } @NativeMethods interface Natives { - void startComponentUpdateService(); + void startComponentUpdateService(Runnable finishedCallback); } }
diff --git a/ash/BUILD.gn b/ash/BUILD.gn index ad417e7..c903b52 100644 --- a/ash/BUILD.gn +++ b/ash/BUILD.gn
@@ -725,6 +725,8 @@ "policy/policy_recommendation_restorer.h", "power/hid_battery_util.cc", "power/hid_battery_util.h", + "projector/model/projector_session_impl.cc", + "projector/model/projector_session_impl.h", "projector/model/projector_ui_model.cc", "projector/model/projector_ui_model.h", "projector/projector_controller_impl.cc", @@ -2181,6 +2183,7 @@ "multi_device_setup/multi_device_notification_presenter_unittest.cc", "policy/policy_recommendation_restorer_unittest.cc", "power/hid_battery_util_unittest.cc", + "projector/model/projector_session_impl_unittest.cc", "projector/projector_controller_unittest.cc", "projector/projector_metadata_model_unittest.cc", "quick_answers/quick_answers_controller_unittest.cc",
diff --git a/ash/app_list/app_list_presenter_delegate_impl.cc b/ash/app_list/app_list_presenter_delegate_impl.cc index f7803c10..1710b0d8 100644 --- a/ash/app_list/app_list_presenter_delegate_impl.cc +++ b/ash/app_list/app_list_presenter_delegate_impl.cc
@@ -96,12 +96,6 @@ void AppListPresenterDelegateImpl::Init(AppListView* view, int64_t display_id) { view_ = view; view->InitView(controller_->GetContainerForDisplayId(display_id)); - - // By setting us as DnD recipient, the app list knows that we can - // handle items. - Shelf* shelf = Shelf::ForWindow(Shell::GetRootWindowForDisplayId(display_id)); - view->SetDragAndDropHostOfCurrentAppList( - shelf->shelf_widget()->GetDragAndDropHostForAppList()); } void AppListPresenterDelegateImpl::ShowForDisplay( @@ -122,6 +116,12 @@ if (!shelf_observation_.IsObservingSource(shelf)) shelf_observation_.AddObservation(shelf); + // By setting us as a drag-and-drop recipient, the app list knows that we can + // handle items. Do this on every show because |view_| can be reused after a + // monitor is disconnected but that monitor's ShelfView and + // ScrollableShelfView are deleted. https://crbug.com/1163332 + view_->SetDragAndDropHostOfCurrentAppList( + shelf->shelf_widget()->GetDragAndDropHostForAppList()); view_->SetShelfHasRoundedCorners( IsShelfBackgroundTypeWithRoundedCorners(shelf->GetBackgroundType())); view_->Show(preferred_state, IsSideShelf(shelf));
diff --git a/ash/app_list/app_list_presenter_delegate_unittest.cc b/ash/app_list/app_list_presenter_delegate_unittest.cc index 23702bf..0463ea08 100644 --- a/ash/app_list/app_list_presenter_delegate_unittest.cc +++ b/ash/app_list/app_list_presenter_delegate_unittest.cc
@@ -212,6 +212,14 @@ ->search_results_page_view(); } + AppsGridView* apps_grid_view() { + return GetAppListView() + ->app_list_main_view() + ->contents_view() + ->apps_container_view() + ->apps_grid_view(); + } + void ShowZeroStateSearchInHalfState() { GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId()); GetEventGenerator()->GestureTapAt(GetPointInsideSearchbox()); @@ -2356,6 +2364,42 @@ GetAppListTestHelper()->CheckVisibility(false); } +// Regression test for crash due to use-after-free. https://crbug.com/1163332 +TEST_F(AppListPresenterDelegateTest, + ShouldNotCrashOnItemClickAfterMonitorDisconnect) { + // Set up two displays. + UpdateDisplay("1024x768,1200x900"); + AppListModel* model = Shell::Get()->app_list_controller()->GetModel(); + model->AddItem(std::make_unique<AppListItem>("item 0")); + model->AddItem(std::make_unique<AppListItem>("item 1")); + + // Open and close app list on secondary display. + AppListTestHelper* helper = GetAppListTestHelper(); + helper->ShowAndRunLoop(GetSecondaryDisplay().id()); + helper->DismissAndRunLoop(); + + // Open and close app list on primary display. + helper->ShowAndRunLoop(GetPrimaryDisplayId()); + helper->DismissAndRunLoop(); + + // Disconnect secondary display. + UpdateDisplay("1024x768"); + + // Open app list to fullscreen. + helper->ShowAndRunLoop(GetPrimaryDisplayId()); + helper->GetAppListView()->SetState(AppListViewState::kFullscreenAllApps); + helper->WaitUntilIdle(); + + // Click on an item. + AppListItemView* item_view = apps_grid_view()->GetItemViewAt(0); + gfx::Point item_center = item_view->GetBoundsInScreen().CenterPoint(); + ui::test::EventGenerator* generator = GetEventGenerator(); + generator->MoveMouseTo(item_center); + generator->ClickLeftButton(); + + // No crash. No use-after-free detected by ASAN. +} + // Tests that the app list window's bounds height (from the shelf) in kPeeking // state is the same whether the app list is shown on the primary display // or the secondary display fir different display placements. @@ -3182,14 +3226,6 @@ return GetAppListView()->app_list_main_view()->contents_view(); } - AppsGridView* apps_grid_view() { - return GetAppListView() - ->app_list_main_view() - ->contents_view() - ->apps_container_view() - ->apps_grid_view(); - } - private: base::test::ScopedFeatureList scoped_feature_list_; };
diff --git a/ash/app_list/views/apps_grid_view.h b/ash/app_list/views/apps_grid_view.h index 2a45579..d0db0e8 100644 --- a/ash/app_list/views/apps_grid_view.h +++ b/ash/app_list/views/apps_grid_view.h
@@ -836,6 +836,7 @@ base::OneShotTimer host_drag_start_timer_; // An application target drag and drop host which accepts dnd operations. + // Usually the shelf (e.g. ShelfView or ScrollableShelfView). ApplicationDragAndDropHost* drag_and_drop_host_ = nullptr; // The drag operation is currently inside the dnd host and events get
diff --git a/ash/app_list/views/apps_grid_view_unittest.cc b/ash/app_list/views/apps_grid_view_unittest.cc index 4f7cc45be..30b8485e 100644 --- a/ash/app_list/views/apps_grid_view_unittest.cc +++ b/ash/app_list/views/apps_grid_view_unittest.cc
@@ -1927,7 +1927,8 @@ EXPECT_TRUE(folder_item->FindChildItem(second_item_id)); } -TEST_P(AppsGridViewTest, MouseDragFlipPage) { +// Flaky: crbug.com/1156634 +TEST_P(AppsGridViewTest, DISABLED_MouseDragFlipPage) { apps_grid_view_->set_page_flip_delay_for_testing( base::TimeDelta::FromMilliseconds(10)); GetPaginationModel()->SetTransitionDurations(
diff --git a/ash/app_list/views/search_box_view_unittest.cc b/ash/app_list/views/search_box_view_unittest.cc index 188bfb3..151a3e6 100644 --- a/ash/app_list/views/search_box_view_unittest.cc +++ b/ash/app_list/views/search_box_view_unittest.cc
@@ -121,7 +121,7 @@ view()->search_box()->OnKeyEvent(&event); // Emulates the input method. if (::isalnum(static_cast<int>(key_code))) { - base::char16 character = ::tolower(static_cast<int>(key_code)); + char16_t character = ::tolower(static_cast<int>(key_code)); view()->search_box()->InsertText( base::string16(1, character), ui::TextInputClient::InsertTextCursorBehavior::kMoveCursorAfterText);
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd index fc413df..43e37c5 100644 --- a/ash/ash_strings.grd +++ b/ash/ash_strings.grd
@@ -3527,6 +3527,12 @@ <message name="IDS_ASH_PCIE_PERIPHERAL_NOTIFICATION_GUEST_MODE_NOT_SUPPORTED" desc="Notification body text that explains to the user that their peripheral is not supported in Guest mode due to security reasons."> Peripheral not supported in Guest mode for security reasons </message> + <message name="IDS_ASH_PCIE_PERIPHERAL_NOTIFICATION_DEVICE_BLOCKED_TITLE" translateable="false" desc="Notification title that indicates to the user that their peripheral is not supported due to security reasons."> + Peripheral not supported for security reasons + </message> + <message name="IDS_ASH_PCIE_PERIPHERAL_NOTIFICATION_DEVICE_BLOCKED_BODY" translateable="false" desc="Notification body text that explains to the user that their peripheral is not supported because it is not part of the approved peripherals list."> + Only approved Thunderbolt devices are compatible with your Chromebook + </message> </messages> </release> </grit>
diff --git a/ash/components/pcie_peripheral/pcie_peripheral_manager.cc b/ash/components/pcie_peripheral/pcie_peripheral_manager.cc index 219f25f..252b33e 100644 --- a/ash/components/pcie_peripheral/pcie_peripheral_manager.cc +++ b/ash/components/pcie_peripheral/pcie_peripheral_manager.cc
@@ -57,6 +57,11 @@ observer.OnGuestModeNotificationReceived(is_thunderbolt_only); } +void PciePeripheralManager::NotifyPeripheralBlockedReceived() { + for (auto& observer : observer_list_) + observer.OnPeripheralBlockedReceived(); +} + void PciePeripheralManager::OnThunderboltDeviceConnected( bool is_thunderbolt_only) { if (is_guest_profile_) {
diff --git a/ash/components/pcie_peripheral/pcie_peripheral_manager.h b/ash/components/pcie_peripheral/pcie_peripheral_manager.h index be1b064..66ff4d9b 100644 --- a/ash/components/pcie_peripheral/pcie_peripheral_manager.h +++ b/ash/components/pcie_peripheral/pcie_peripheral_manager.h
@@ -34,6 +34,11 @@ // Thunderbolt/USB4 device has been plugged in during a guest session. Can // be called multiple times. virtual void OnGuestModeNotificationReceived(bool is_thunderbolt_only) = 0; + + // Called to notify observers, primarily notification controllers, that the + // recently plugged in Thunderbolt/USB4 device is in the block list. The + // block list is specified by the Pciguard Daemon. + virtual void OnPeripheralBlockedReceived() = 0; }; // These values are persisted to logs. Entries should not be renumbered and @@ -78,6 +83,7 @@ // Call to notify observers that a new notification is needed. void NotifyLimitedPerformancePeripheralReceived(); void NotifyGuestModeNotificationReceived(bool is_thunderbolt_only); + void NotifyPeripheralBlockedReceived(); const bool is_guest_profile_; // Pcie tunneling refers to allowing Thunderbolt/USB4 peripherals to run at
diff --git a/ash/components/pcie_peripheral/pcie_peripheral_manager_unittest.cc b/ash/components/pcie_peripheral/pcie_peripheral_manager_unittest.cc index b08609b..c48a310 100644 --- a/ash/components/pcie_peripheral/pcie_peripheral_manager_unittest.cc +++ b/ash/components/pcie_peripheral/pcie_peripheral_manager_unittest.cc
@@ -26,6 +26,10 @@ return num_guest_notification_calls_; } + size_t num_peripheral_blocked_notification_calls() const { + return num_peripheral_blocked_notification_calls_; + } + bool is_current_guest_device_tbt_only() const { return is_current_guest_device_tbt_only_; } @@ -40,9 +44,14 @@ ++num_guest_notification_calls_; } + void OnPeripheralBlockedReceived() override { + ++num_peripheral_blocked_notification_calls_; + } + private: size_t num_limited_performance_notification_calls_ = 0u; size_t num_guest_notification_calls_ = 0u; + size_t num_peripheral_blocked_notification_calls_ = 0u; bool is_current_guest_device_tbt_only_ = false; };
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc index 2677fb3..37ec611 100644 --- a/ash/constants/ash_features.cc +++ b/ash/constants/ash_features.cc
@@ -595,6 +595,10 @@ const base::Feature kReleaseNotesSuggestionChip{ "ReleaseNotesSuggestionChip", base::FEATURE_ENABLED_BY_DEFAULT}; +// Enables or disables showing a link to the Media app in the Scan app. +const base::Feature kScanAppMediaLink{"ScanAppMediaLink", + base::FEATURE_DISABLED_BY_DEFAULT}; + // Enables or disables a scanning UI on Chrome OS. const base::Feature kScanningUI{"ScanningUI", base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h index 9c98216..dbebc80 100644 --- a/ash/constants/ash_features.h +++ b/ash/constants/ash_features.h
@@ -276,6 +276,8 @@ extern const base::Feature kReleaseNotesSuggestionChip; COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kFiltersInRecents; +COMPONENT_EXPORT(ASH_CONSTANTS) +extern const base::Feature kScanAppMediaLink; COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kScanningUI; COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kSessionManagerLongKillTimeout;
diff --git a/ash/login/ui/login_base_bubble_view.cc b/ash/login/ui/login_base_bubble_view.cc index 8a94c3d..1989fb3 100644 --- a/ash/login/ui/login_base_bubble_view.cc +++ b/ash/login/ui/login_base_bubble_view.cc
@@ -75,8 +75,12 @@ if (!bubble_->GetVisible()) return; - if (bubble_->GetBubbleOpener() && bubble_->GetBubbleOpener()->HasFocus()) + // Hide the bubble if the bubble opener is about to lose focus from tab + // traversal. + if (bubble_->GetBubbleOpener() && bubble_->GetBubbleOpener()->HasFocus() && + event->key_code() != ui::VKEY_TAB) { return; + } if (login_views_utils::HasFocusInAnyChildView(bubble_)) return;
diff --git a/ash/projector/model/projector_session_impl.cc b/ash/projector/model/projector_session_impl.cc new file mode 100644 index 0000000..e76ad45c9 --- /dev/null +++ b/ash/projector/model/projector_session_impl.cc
@@ -0,0 +1,42 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/projector/model/projector_session_impl.h" + +namespace ash { + +ProjectorSessionImpl::ProjectorSessionImpl() = default; + +ProjectorSessionImpl::~ProjectorSessionImpl() = default; + +void ProjectorSessionImpl::Start(SourceType preset_source_type) { + DCHECK(!active_); + + preset_source_type_ = preset_source_type; + active_ = true; + NotifySessionActiveStateChanged(active_); +} + +void ProjectorSessionImpl::Stop() { + DCHECK(active_); + + preset_source_type_ = SourceType::kUnset; + active_ = false; + NotifySessionActiveStateChanged(active_); +} + +void ProjectorSessionImpl::AddObserver(ProjectorSessionObserver* observer) { + observers_.AddObserver(observer); +} + +void ProjectorSessionImpl::RemoveObserver(ProjectorSessionObserver* observer) { + observers_.RemoveObserver(observer); +} + +void ProjectorSessionImpl::NotifySessionActiveStateChanged(bool active) { + for (ProjectorSessionObserver& observer : observers_) + observer.OnProjectorSessionActiveStateChanged(active); +} + +} // namespace ash \ No newline at end of file
diff --git a/ash/projector/model/projector_session_impl.h b/ash/projector/model/projector_session_impl.h new file mode 100644 index 0000000..6b1efd7 --- /dev/null +++ b/ash/projector/model/projector_session_impl.h
@@ -0,0 +1,38 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_PROJECTOR_MODEL_PROJECTOR_SESSION_IMPL_H_ +#define ASH_PROJECTOR_MODEL_PROJECTOR_SESSION_IMPL_H_ + +#include "ash/ash_export.h" +#include "ash/public/cpp/projector/projector_session.h" +#include "base/observer_list.h" +#include "base/observer_list_types.h" + +namespace ash { + +class ASH_EXPORT ProjectorSessionImpl : public ProjectorSession { + public: + ProjectorSessionImpl(); + ProjectorSessionImpl(const ProjectorSessionImpl&) = delete; + ProjectorSessionImpl& operator=(const ProjectorSessionImpl&) = delete; + ~ProjectorSessionImpl() override; + + // Starts or stops the projector session. + void Start(SourceType preset_source_type = SourceType::kUnset); + void Stop(); + + // ProjectorSession: + void AddObserver(ProjectorSessionObserver* observer) override; + void RemoveObserver(ProjectorSessionObserver* observer) override; + + private: + void NotifySessionActiveStateChanged(bool active); + + base::ObserverList<ProjectorSessionObserver> observers_; +}; + +} // namespace ash + +#endif // ASH_PROJECTOR_MODEL_PROJECTOR_SESSION_IMPL_H_
diff --git a/ash/projector/model/projector_session_impl_unittest.cc b/ash/projector/model/projector_session_impl_unittest.cc new file mode 100644 index 0000000..2f5b01da --- /dev/null +++ b/ash/projector/model/projector_session_impl_unittest.cc
@@ -0,0 +1,53 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/projector/model/projector_session_impl.h" + +#include "base/dcheck_is_on.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace ash { + +class ProjectorSessionImplTest : public testing::Test { + public: + ProjectorSessionImplTest() = default; + + ProjectorSessionImplTest(const ProjectorSessionImplTest&) = delete; + ProjectorSessionImplTest& operator=(const ProjectorSessionImplTest&) = delete; + + // Testing::Test: + void SetUp() override { session_ = std::make_unique<ProjectorSessionImpl>(); } + + protected: + std::unique_ptr<ProjectorSessionImpl> session_; +}; + +TEST_F(ProjectorSessionImplTest, Start) { + session_->Start(); + EXPECT_TRUE(session_->is_active()); + ASSERT_EQ(SourceType::kUnset, session_->preset_source_type()); + + session_->Stop(); + EXPECT_FALSE(session_->is_active()); + ASSERT_EQ(SourceType::kUnset, session_->preset_source_type()); +} + +TEST_F(ProjectorSessionImplTest, StartWithPresetSourceType) { + session_->Start(SourceType::kWindow); + EXPECT_TRUE(session_->is_active()); + ASSERT_EQ(SourceType::kWindow, session_->preset_source_type()); + + session_->Stop(); + EXPECT_FALSE(session_->is_active()); + ASSERT_EQ(SourceType::kUnset, session_->preset_source_type()); +} + +#if DCHECK_IS_ON() +TEST_F(ProjectorSessionImplTest, OnlyOneProjectorSessionAllowed) { + session_->Start(); + EXPECT_DEATH_IF_SUPPORTED(session_->Start(), ""); +} +#endif + +} // namespace ash \ No newline at end of file
diff --git a/ash/projector/projector_controller_impl.cc b/ash/projector/projector_controller_impl.cc index aadc7f585..a09d15e 100644 --- a/ash/projector/projector_controller_impl.cc +++ b/ash/projector/projector_controller_impl.cc
@@ -15,7 +15,8 @@ ProjectorControllerImpl::ProjectorControllerImpl() : ui_controller_(std::make_unique<ash::ProjectorUiController>(this)), metadata_controller_( - std::make_unique<ash::ProjectorMetadataController>()) {} + std::make_unique<ash::ProjectorMetadataController>()), + projector_session_(std::make_unique<ash::ProjectorSessionImpl>()) {} ProjectorControllerImpl::~ProjectorControllerImpl() = default; @@ -56,6 +57,10 @@ ui_controller_->ShowToolbar(); } +void ProjectorControllerImpl::CloseToolbar() { + ui_controller_->CloseToolbar(); +} + void ProjectorControllerImpl::SetCaptionState(bool is_on) { if (is_on == is_caption_on_) return;
diff --git a/ash/projector/projector_controller_impl.h b/ash/projector/projector_controller_impl.h index a152cbd..8724f88 100644 --- a/ash/projector/projector_controller_impl.h +++ b/ash/projector/projector_controller_impl.h
@@ -9,6 +9,7 @@ #include <vector> #include "ash/ash_export.h" +#include "ash/projector/model/projector_session_impl.h" #include "ash/public/cpp/projector/projector_controller.h" namespace base { @@ -40,6 +41,8 @@ // Shows projector toolbar. void ShowToolbar(); + // Close projector toolbar. + void CloseToolbar(); // Set caption on/off state. void SetCaptionState(bool is_on); @@ -61,6 +64,7 @@ ProjectorUiController* ui_controller() { return ui_controller_.get(); } bool is_eligible() const { return is_speech_recognition_available_; } + ProjectorSessionImpl* projector_session() { return projector_session_.get(); } private: // Starts or stops the speech recognition session. @@ -70,6 +74,7 @@ ProjectorClient* client_ = nullptr; std::unique_ptr<ProjectorUiController> ui_controller_; std::unique_ptr<ProjectorMetadataController> metadata_controller_; + std::unique_ptr<ProjectorSessionImpl> projector_session_; // Whether the caption bubble ui is being shown or not. bool is_caption_on_ = false;
diff --git a/ash/projector/projector_feature_pod_controller.cc b/ash/projector/projector_feature_pod_controller.cc index bfeaa0d..e926c366 100644 --- a/ash/projector/projector_feature_pod_controller.cc +++ b/ash/projector/projector_feature_pod_controller.cc
@@ -55,7 +55,18 @@ // Close the system tray bubble. Deletes |this|. tray_controller_->CloseBubble(); - Shell::Get()->projector_controller()->ui_controller()->ToggleToolbar(); + auto* projector_controller = Shell::Get()->projector_controller(); + auto* projector_session = projector_controller->projector_session(); + DCHECK(projector_controller); + DCHECK(projector_session); + + if (projector_session->is_active()) { + projector_session->Stop(); + projector_controller->CloseToolbar(); + } else { + projector_session->Start(); + projector_controller->ShowToolbar(); + } } SystemTrayItemUmaType ProjectorFeaturePodController::GetUmaType() const {
diff --git a/ash/projector/projector_ui_controller.cc b/ash/projector/projector_ui_controller.cc index 00711ca..362c350 100644 --- a/ash/projector/projector_ui_controller.cc +++ b/ash/projector/projector_ui_controller.cc
@@ -51,18 +51,13 @@ } void ProjectorUiController::CloseToolbar() { + if (!projector_bar_widget_) + return; + projector_bar_widget_->Close(); model_.SetBarEnabled(false); } -void ProjectorUiController::ToggleToolbar() { - if (model_.bar_enabled()) { - CloseToolbar(); - } else { - ShowToolbar(); - } -} - void ProjectorUiController::OnKeyIdeaMarked() { ShowToast(kMarkedKeyIdeaToastId, IDS_ASH_PROJECTOR_KEY_IDEA_MARKED, kToastDuration);
diff --git a/ash/projector/projector_ui_controller.h b/ash/projector/projector_ui_controller.h index 096df5c..91a14bc 100644 --- a/ash/projector/projector_ui_controller.h +++ b/ash/projector/projector_ui_controller.h
@@ -28,9 +28,6 @@ virtual void ShowToolbar(); // Close Projector toolbar. Virtual for testing. virtual void CloseToolbar(); - // Toggle Projector toolbar based on the toolbar visibility state. - // Virtual for testing. - virtual void ToggleToolbar(); // Invoked when key idea is marked to show a toast. Virtual for testing. virtual void OnKeyIdeaMarked(); // Invoked when transcription is available for rendering. Virtual for testing.
diff --git a/ash/public/cpp/BUILD.gn b/ash/public/cpp/BUILD.gn index 655315d8..7668301 100644 --- a/ash/public/cpp/BUILD.gn +++ b/ash/public/cpp/BUILD.gn
@@ -227,6 +227,8 @@ "projector/projector_client.h", "projector/projector_controller.cc", "projector/projector_controller.h", + "projector/projector_session.cc", + "projector/projector_session.h", "quick_answers/controller/quick_answers_browser_client.cc", "quick_answers/controller/quick_answers_browser_client.h", "quick_answers/controller/quick_answers_controller.cc",
diff --git a/ash/public/cpp/projector/projector_session.cc b/ash/public/cpp/projector/projector_session.cc new file mode 100644 index 0000000..2827a14 --- /dev/null +++ b/ash/public/cpp/projector/projector_session.cc
@@ -0,0 +1,30 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/public/cpp/projector/projector_session.h" + +#include "base/check_op.h" + +namespace ash { + +namespace { +ProjectorSession* g_instance = nullptr; +} + +ProjectorSession::ProjectorSession() { + DCHECK_EQ(nullptr, g_instance); + g_instance = this; +} + +ProjectorSession::~ProjectorSession() { + DCHECK_EQ(g_instance, this); + g_instance = nullptr; +} + +// static +ProjectorSession* ProjectorSession::Get() { + return g_instance; +} + +} // namespace ash \ No newline at end of file
diff --git a/ash/public/cpp/projector/projector_session.h b/ash/public/cpp/projector/projector_session.h new file mode 100644 index 0000000..ac482b07 --- /dev/null +++ b/ash/public/cpp/projector/projector_session.h
@@ -0,0 +1,53 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_PUBLIC_CPP_PROJECTOR_PROJECTOR_SESSION_H_ +#define ASH_PUBLIC_CPP_PROJECTOR_PROJECTOR_SESSION_H_ + +#include "ash/public/cpp/ash_public_export.h" +#include "base/observer_list.h" +#include "base/observer_list_types.h" + +namespace ash { + +// The recording source type. +enum class SourceType { kUnset = 0, kFullscreen = 1, kTab = 2, kWindow = 3 }; + +// A checked observer which receives notification of changes to the +// |ProjectorSession|. +class ASH_PUBLIC_EXPORT ProjectorSessionObserver + : public base::CheckedObserver { + public: + // Invoked when the session active state is changed. + virtual void OnProjectorSessionActiveStateChanged(bool active) {} +}; + +// Interface to maintain projector session in ash. +class ASH_PUBLIC_EXPORT ProjectorSession { + public: + ProjectorSession(); + ProjectorSession(const ProjectorSession&) = delete; + ProjectorSession& operator=(const ProjectorSession&) = delete; + virtual ~ProjectorSession(); + + static ProjectorSession* Get(); + + // Adds/removes the specified |observer|. + virtual void AddObserver(ProjectorSessionObserver* observer) = 0; + virtual void RemoveObserver(ProjectorSessionObserver* observer) = 0; + + bool is_active() const { return active_; } + SourceType preset_source_type() const { return preset_source_type_; } + + protected: + // Keep track of the session active state. Only one active session is allowed. + bool active_ = false; + + // The preset recording source type for some entry points (i.e: share screen). + SourceType preset_source_type_ = SourceType::kUnset; +}; + +} // namespace ash + +#endif // ASH_PUBLIC_CPP_PROJECTOR_PROJECTOR_SESSION_H_ \ No newline at end of file
diff --git a/ash/public/cpp/system_tray_client.h b/ash/public/cpp/system_tray_client.h index f2f3667..0f4d9683 100644 --- a/ash/public/cpp/system_tray_client.h +++ b/ash/public/cpp/system_tray_client.h
@@ -18,7 +18,7 @@ virtual ~SystemTrayClient() {} // Shows general settings UI. - virtual void ShowSettings() = 0; + virtual void ShowSettings(int64_t display_id) = 0; // Shows settings related to Bluetooth devices (e.g. to add a device). virtual void ShowBluetoothSettings() = 0;
diff --git a/ash/public/cpp/test/test_system_tray_client.cc b/ash/public/cpp/test/test_system_tray_client.cc index 3e0d51f5..b5de6bf 100644 --- a/ash/public/cpp/test/test_system_tray_client.cc +++ b/ash/public/cpp/test/test_system_tray_client.cc
@@ -10,7 +10,7 @@ TestSystemTrayClient::~TestSystemTrayClient() = default; -void TestSystemTrayClient::ShowSettings() {} +void TestSystemTrayClient::ShowSettings(int64_t display_id) {} void TestSystemTrayClient::ShowBluetoothSettings() { show_bluetooth_settings_count_++;
diff --git a/ash/public/cpp/test/test_system_tray_client.h b/ash/public/cpp/test/test_system_tray_client.h index f9a9484c..35f6dd5 100644 --- a/ash/public/cpp/test/test_system_tray_client.h +++ b/ash/public/cpp/test/test_system_tray_client.h
@@ -18,7 +18,7 @@ ~TestSystemTrayClient() override; // SystemTrayClient: - void ShowSettings() override; + void ShowSettings(int64_t display_id) override; void ShowBluetoothSettings() override; void ShowBluetoothPairingDialog(const std::string& address, const base::string16& name_for_display,
diff --git a/ash/shortcut_viewer/views/keyboard_shortcut_view_unittest.cc b/ash/shortcut_viewer/views/keyboard_shortcut_view_unittest.cc index dbaf348..72d5369 100644 --- a/ash/shortcut_viewer/views/keyboard_shortcut_view_unittest.cc +++ b/ash/shortcut_viewer/views/keyboard_shortcut_view_unittest.cc
@@ -71,7 +71,7 @@ // Emulates the input method. if (::isalnum(static_cast<int>(key_code))) { - base::char16 character = ::tolower(static_cast<int>(key_code)); + char16_t character = ::tolower(static_cast<int>(key_code)); GetSearchBoxView()->search_box()->InsertText( base::string16(1, character), ui::TextInputClient::InsertTextCursorBehavior::kMoveCursorAfterText);
diff --git a/ash/strings/ash_strings_es-419.xtb b/ash/strings/ash_strings_es-419.xtb index b0aa726d..29905e8 100644 --- a/ash/strings/ash_strings_es-419.xtb +++ b/ash/strings/ash_strings_es-419.xtb
@@ -111,7 +111,7 @@ <translation id="1864454756846565995">Dispositivo USB-C (puerto trasero)</translation> <translation id="1882814835921407042">Sin red móvil</translation> <translation id="1882897271359938046">Duplicando en <ph name="DISPLAY_NAME" /></translation> -<translation id="1885785240814121742">Desbloquear con huella digital</translation> +<translation id="1885785240814121742">Desbloquear con huella dactilar</translation> <translation id="1888656773939766144"><ph name="DISPLAY_NAME" /> no admite el valor de resolución <ph name="SPECIFIED_RESOLUTION" /> (<ph name="SPECIFIED_REFRESH_RATE" /> Hz), por lo que se cambió a <ph name="FALLBACK_RESOLUTION" /> (<ph name="FALLBACK_REFRESH_RATE" />). Para mantener este cambio, haz clic en Confirmar. En <ph name="TIMEOUT_SECONDS" /> se restablecerá la configuración anterior.</translation> <translation id="1919743966458266018">Se modificó el acceso directo para abrir el administrador de tareas. Utiliza <ph name="NEW_SHORTCUT" /> en vez de <ph name="OLD_SHORTCUT" />.</translation> <translation id="1923539912171292317">Clics automáticos</translation> @@ -290,7 +290,7 @@ <translation id="3428447136709161042">Desconectar de <ph name="NETWORK_NAME" /></translation> <translation id="3430396595145920809">Para volver, desliza el dedo desde la derecha</translation> <translation id="343571671045587506">Editar recordatorio</translation> -<translation id="3435967511775410570">Se reconoció la huella digital</translation> +<translation id="3435967511775410570">Se reconoció la huella dactilar</translation> <translation id="3445288400492335833"><ph name="MINUTES" /> min</translation> <translation id="3445925074670675829">Dispositivo USB-C</translation> <translation id="3454224730401036106">Tu conexión se cambió a una red más segura</translation> @@ -550,7 +550,7 @@ <translation id="5679050765726761783">Se conectó un adaptador de baja potencia</translation> <translation id="5682642926269496722">El Asistente de Google no está disponible para la Cuenta de usuario actual.</translation> <translation id="5689633613396158040">La Luz nocturna te permite ver la pantalla o leer mejor con luz tenue. Presiona para cambiar el horario en el que se activa la Luz nocturna o desactívala por completo.</translation> -<translation id="5691772641933328258">No se reconoció la huella digital</translation> +<translation id="5691772641933328258">No se reconoció la huella dactilar</translation> <translation id="5710450975648804523">"No interrumpir" activado</translation> <translation id="573413375004481890">Este dispositivo no admite tantas pantallas, por lo que se desconectó una de ellas</translation> <translation id="574392208103952083">Media</translation> @@ -803,7 +803,7 @@ <translation id="7846634333498149051">Teclado</translation> <translation id="7860671499921112077">Para ingresar a la Vista general, desliza tres dedos hacia arriba.</translation> <translation id="7866482334467279021">activado</translation> -<translation id="7868900307798234037">Desbloqueando con huella digital</translation> +<translation id="7868900307798234037">Desbloqueando con huella dactilar</translation> <translation id="7872786842639831132">No</translation> <translation id="7875575368831396199">Al parecer, tu <ph name="DEVICE_TYPE" /> tiene la conexión Bluetooth desactivada. Actívala para poder usar Phone Hub.</translation> <translation id="7886169021410746335">Ajustar la configuración de privacidad</translation> @@ -812,7 +812,7 @@ <translation id="7895348134893321514">Tote</translation> <translation id="7897375687985782769">Presionaste la combinación de teclas para girar la pantalla. ¿Quieres llevar a cabo esta acción?</translation> <translation id="7901405293566323524">Phone Hub</translation> -<translation id="7902625623987030061">Toca el sensor de huellas digitales</translation> +<translation id="7902625623987030061">Toca el sensor de huellas dactilares</translation> <translation id="7904094684485781019">El administrador de esta cuenta inhabilitó el acceso múltiple.</translation> <translation id="7933084174919150729">El Asistente de Google solo está disponible para el perfil principal.</translation> <translation id="79341161159229895">Cuenta administrada por <ph name="FIRST_PARENT_EMAIL" /> y <ph name="SECOND_PARENT_EMAIL" /></translation> @@ -821,7 +821,7 @@ <translation id="7977927628060636163">Buscando redes móviles…</translation> <translation id="7980780401175799550">Prueba nuevas formas de navegar con el Sistema operativo Chrome</translation> <translation id="7982789257301363584">Red</translation> -<translation id="7984197416080286869">Demasiados intentos con la huella digital</translation> +<translation id="7984197416080286869">Demasiados intentos con la huella dactilar</translation> <translation id="7994370417837006925">Acceso múltiple</translation> <translation id="7995804128062002838">No se pudo realizar una captura de pantalla.</translation> <translation id="8000066093800657092">Sin red</translation>
diff --git a/ash/system/holding_space/holding_space_item_chip_view.cc b/ash/system/holding_space/holding_space_item_chip_view.cc index 948ace46..47ebf77 100644 --- a/ash/system/holding_space/holding_space_item_chip_view.cc +++ b/ash/system/holding_space/holding_space_item_chip_view.cc
@@ -17,6 +17,7 @@ #include "ui/compositor/paint_recorder.h" #include "ui/gfx/scoped_canvas.h" #include "ui/gfx/skia_paint_util.h" +#include "ui/views/accessibility/view_accessibility.h" #include "ui/views/background.h" #include "ui/views/border.h" #include "ui/views/controls/button/image_button.h" @@ -107,10 +108,12 @@ layout->SetFlexForView(label_and_pin_button_container, 1); // Label. + // NOTE: A11y events for `label_` are handled by its parent. label_ = label_and_pin_button_container->AddChildView( std::make_unique<PaintCallbackLabel>( base::BindRepeating(&HoldingSpaceItemChipView::OnPaintLabelMask, base::Unretained(this)))); + label_->GetViewAccessibility().OverrideIsIgnored(true); label_->SetBorder(views::CreateEmptyBorder(kLabelMargins)); label_->SetElideBehavior(gfx::ELIDE_MIDDLE); label_->SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT);
diff --git a/ash/system/holding_space/holding_space_item_view.cc b/ash/system/holding_space/holding_space_item_view.cc index 3b221b1..7c91672 100644 --- a/ash/system/holding_space/holding_space_item_view.cc +++ b/ash/system/holding_space/holding_space_item_view.cc
@@ -8,7 +8,6 @@ #include "ash/public/cpp/holding_space/holding_space_constants.h" #include "ash/public/cpp/holding_space/holding_space_controller.h" #include "ash/public/cpp/holding_space/holding_space_item.h" -#include "ash/public/cpp/holding_space/holding_space_model.h" #include "ash/public/cpp/shelf_config.h" #include "ash/resources/vector_icons/vector_icons.h" #include "ash/style/ash_color_provider.h" @@ -99,7 +98,7 @@ // Accessibility. GetViewAccessibility().OverrideName(item->text()); - GetViewAccessibility().OverrideRole(ax::mojom::Role::kButton); + GetViewAccessibility().OverrideRole(ax::mojom::Role::kListItem); // Background. SetBackground(views::CreateRoundedRectBackground(
diff --git a/ash/system/holding_space/holding_space_item_views_section.cc b/ash/system/holding_space/holding_space_item_views_section.cc index fa66ee4..ef46fa65 100644 --- a/ash/system/holding_space/holding_space_item_views_section.cc +++ b/ash/system/holding_space/holding_space_item_views_section.cc
@@ -14,6 +14,7 @@ #include "ui/compositor/callback_layer_animation_observer.h" #include "ui/compositor/layer_animation_observer.h" #include "ui/compositor/layer_animator.h" +#include "ui/views/accessibility/view_accessibility.h" #include "ui/views/controls/scroll_view.h" #include "ui/views/layout/box_layout.h" #include "ui/views/style/platform_style.h" @@ -163,6 +164,10 @@ InitLayerForAnimations(container_); container_->SetVisible(false); + // The `container_`'s children should be announced "List item X of Y", where + // X is the 1-based child index and Y is the count of children. + container_->GetViewAccessibility().OverrideRole(ax::mojom::Role::kList); + // Placeholder. auto placeholder = CreatePlaceholder(); if (placeholder) {
diff --git a/ash/system/pcie_peripheral/pcie_peripheral_notification_controller.cc b/ash/system/pcie_peripheral/pcie_peripheral_notification_controller.cc index 7833cf1..21f6a065 100644 --- a/ash/system/pcie_peripheral/pcie_peripheral_notification_controller.cc +++ b/ash/system/pcie_peripheral/pcie_peripheral_notification_controller.cc
@@ -38,6 +38,8 @@ "cros_pcie_peripheral_limited_performance_guest_mode_notification_id"; const char kPciePeripheralGuestModeNotSupportedNotificationId[] = "cros_pcie_peripheral_guest_mode_not_supported_notifcation_id"; +const char kPciePeripheralDeviceBlockedNotificationId[] = + "cros_pcie_peripheral_device_blocked_notifcation_id"; // Represents the buttons in the notification. enum ButtonIndex { kSettings, kLearnMore }; @@ -114,6 +116,12 @@ RemoveNotification(kPciePeripheralLimitedPerformanceGuestModeNotificationId); } +void OnPeripheralBlockedNotificationClicked() { + NewWindowDelegate::GetInstance()->NewTabWithUrl( + GURL(kLearnMoreHelpUrl), /*from_user_interaction=*/true); + RemoveNotification(kPciePeripheralDeviceBlockedNotificationId); +} + // We only display notifications for active user sessions (signed-in/guest with // desktop ready). Also do not show notifications in signin or lock screen. bool ShouldDisplayNotification() { @@ -210,6 +218,29 @@ } void PciePeripheralNotificationController:: + NotifyPeripheralBlockedNotification() { + std::unique_ptr<message_center::Notification> notification = + CreateSystemNotification( + message_center::NOTIFICATION_TYPE_SIMPLE, + kPciePeripheralDeviceBlockedNotificationId, + l10n_util::GetStringUTF16( + IDS_ASH_PCIE_PERIPHERAL_NOTIFICATION_DEVICE_BLOCKED_TITLE), + l10n_util::GetStringUTF16( + IDS_ASH_PCIE_PERIPHERAL_NOTIFICATION_DEVICE_BLOCKED_BODY), + /*display_source=*/base::string16(), GURL(), + message_center::NotifierId( + message_center::NotifierType::SYSTEM_COMPONENT, + kNotifierPciePeripheral), + message_center::RichNotificationData(), + base::MakeRefCounted<message_center::HandleNotificationClickDelegate>( + base::BindRepeating(&OnPeripheralBlockedNotificationClicked)), + kSettingsIcon, + message_center::SystemNotificationWarningLevel::CRITICAL_WARNING); + + message_center_->AddNotification(std::move(notification)); +} + +void PciePeripheralNotificationController:: OnLimitedPerformancePeripheralReceived() { NotifyLimitedPerformance(); } @@ -219,6 +250,10 @@ NotifyGuestModeNotification(is_thunderbolt_only); } +void PciePeripheralNotificationController::OnPeripheralBlockedReceived() { + NotifyPeripheralBlockedNotification(); +} + // static void PciePeripheralNotificationController::RegisterProfilePrefs( PrefRegistrySimple* registry) {
diff --git a/ash/system/pcie_peripheral/pcie_peripheral_notification_controller.h b/ash/system/pcie_peripheral/pcie_peripheral_notification_controller.h index 426cd2d3..eb01248a 100644 --- a/ash/system/pcie_peripheral/pcie_peripheral_notification_controller.h +++ b/ash/system/pcie_peripheral/pcie_peripheral_notification_controller.h
@@ -42,6 +42,7 @@ // chromeos::PciePeripheral::Observer void OnLimitedPerformancePeripheralReceived() override; void OnGuestModeNotificationReceived(bool is_thunderbolt_only) override; + void OnPeripheralBlockedReceived() override; // Call to show a notification to indicate that the recently plugged in // Thunderbolt/USB4 peripheral performance is limited. @@ -51,6 +52,10 @@ // state of their Thunderbolt/USB4 peripheral. void NotifyGuestModeNotification(bool is_thunderbolt_only); + // Call to show a notification to indicate to the user that their + // Thunderbolt/USB4 peripheral is not allowed due to security reasons. + void NotifyPeripheralBlockedNotification(); + private: friend class PciePeripheralNotificationControllerTest;
diff --git a/ash/system/pcie_peripheral/pcie_peripheral_notification_controller_unittest.cc b/ash/system/pcie_peripheral/pcie_peripheral_notification_controller_unittest.cc index 1b291f4..becd3b7 100644 --- a/ash/system/pcie_peripheral/pcie_peripheral_notification_controller_unittest.cc +++ b/ash/system/pcie_peripheral/pcie_peripheral_notification_controller_unittest.cc
@@ -32,6 +32,8 @@ "cros_pcie_peripheral_limited_performance_guest_mode_notification_id"; const char kPciePeripheralGuestModeNotSupportedNotificationId[] = "cros_pcie_peripheral_guest_mode_not_supported_notifcation_id"; +const char kPciePeripheralDeviceBlockedNotificationId[] = + "cros_pcie_peripheral_device_blocked_notifcation_id"; const char kLearnMoreHelpUrl[] = "https://www.support.google.com/chromebook?p=connect_thblt_usb4_accy"; @@ -77,6 +79,11 @@ kPciePeripheralGuestModeNotSupportedNotificationId); } + message_center::Notification* GetPeripheralBlockedNotification() { + return MessageCenter::Get()->FindVisibleNotificationById( + kPciePeripheralDeviceBlockedNotificationId); + } + int GetNumOsPrivacySettingsOpened() { return GetSystemTrayClient()->show_os_settings_privacy_and_security_count(); } @@ -177,6 +184,31 @@ } TEST_F(PciePeripheralNotificationControllerTest, + PeripheralBlockedNotification) { + EXPECT_EQ(0u, MessageCenter::Get()->NotificationCount()); + + controller()->NotifyPeripheralBlockedNotification(); + EXPECT_EQ(1u, MessageCenter::Get()->NotificationCount()); + + message_center::Notification* notification = + GetPeripheralBlockedNotification(); + ASSERT_TRUE(notification); + + // This notification has no buttons. + EXPECT_EQ(0u, notification->buttons().size()); + + // Click on the notification and expect the Learn More page to page to appear. + EXPECT_CALL(new_window_delegate(), NewTabWithUrl) + .WillOnce([](const GURL& url, bool from_user_interaction) { + EXPECT_EQ(GURL(kLearnMoreHelpUrl), url); + EXPECT_TRUE(from_user_interaction); + }); + MessageCenter::Get()->ClickOnNotification( + kPciePeripheralDeviceBlockedNotificationId); + EXPECT_EQ(0u, MessageCenter::Get()->NotificationCount()); +} + +TEST_F(PciePeripheralNotificationControllerTest, LimitedPerformanceNotificationLearnMoreClick) { EXPECT_EQ(0u, MessageCenter::Get()->NotificationCount()); EXPECT_EQ(3, GetPrefNotificationCount());
diff --git a/ash/system/unified/unified_system_tray_controller.cc b/ash/system/unified/unified_system_tray_controller.cc index 03610b5..95e64811 100644 --- a/ash/system/unified/unified_system_tray_controller.cc +++ b/ash/system/unified/unified_system_tray_controller.cc
@@ -64,6 +64,7 @@ #include "base/numerics/ranges.h" #include "media/base/media_switches.h" #include "ui/accessibility/ax_enums.mojom.h" +#include "ui/display/screen.h" #include "ui/gfx/animation/slide_animation.h" #include "ui/message_center/message_center.h" #include "ui/views/widget/widget.h" @@ -156,7 +157,10 @@ void UnifiedSystemTrayController::HandleSettingsAction() { Shell::Get()->metrics()->RecordUserMetricsAction(UMA_TRAY_SETTINGS); - Shell::Get()->system_tray_model()->client()->ShowSettings(); + Shell::Get()->system_tray_model()->client()->ShowSettings( + display::Screen::GetScreen() + ->GetDisplayNearestView(unified_view_->GetWidget()->GetNativeView()) + .id()); } void UnifiedSystemTrayController::HandlePowerAction() {
diff --git a/ash/wm/desks/desk_mini_view.cc b/ash/wm/desks/desk_mini_view.cc index 2096604..f0c3fc78 100644 --- a/ash/wm/desks/desk_mini_view.cc +++ b/ash/wm/desks/desk_mini_view.cc
@@ -275,7 +275,9 @@ const int old_index = owner_bar_->GetMiniViewIndex(this); DCHECK_NE(old_index, -1); - int new_index = right ? old_index + 1 : old_index - 1; + const bool mirrored = owner_bar_->GetMirrored(); + // If mirrored, flip the swap direction. + int new_index = mirrored ^ right ? old_index + 1 : old_index - 1; if (new_index < 0 || new_index == static_cast<int>(owner_bar_->mini_views().size())) { return;
diff --git a/ash/wm/desks/desk_mini_view_animations.cc b/ash/wm/desks/desk_mini_view_animations.cc index 5f57300..37df059 100644 --- a/ash/wm/desks/desk_mini_view_animations.cc +++ b/ash/wm/desks/desk_mini_view_animations.cc
@@ -300,7 +300,8 @@ // Since |old_index| and |new_index| are unequal valid indices, there // must be at least two desks. - int shift_x = mini_views[0]->bounds().x() - mini_views[1]->bounds().x(); + int shift_x = mini_views[0]->GetMirroredBounds().x() - + mini_views[1]->GetMirroredBounds().x(); shift_x = move_right ? -shift_x : shift_x; gfx::Transform desks_transform; desks_transform.Translate(shift_x, 0); @@ -319,7 +320,9 @@ // Back to old position. gfx::Transform reorder_desk_transform; reorder_desk_transform.Translate( - mini_views[old_index]->bounds().x() - reorder_view->bounds().x(), 0); + mini_views[old_index]->GetMirroredBounds().x() - + reorder_view->GetMirroredBounds().x(), + 0); layer->SetTransform(reorder_desk_transform); // Animate movement.
diff --git a/ash/wm/desks/desks_bar_view.cc b/ash/wm/desks/desks_bar_view.cc index b05bdcc..a96ba6a5 100644 --- a/ash/wm/desks/desks_bar_view.cc +++ b/ash/wm/desks/desks_bar_view.cc
@@ -89,31 +89,6 @@ return overview_controller->overview_session()->highlight_controller(); } -int DetermineMoveIndex(const std::vector<DeskMiniView*>& views, - int old_index, - int location_screen_x) { - DCHECK_GE(old_index, 0); - - const int views_size = static_cast<int>(views.size()); - DCHECK_LT(old_index, views_size); - - for (int new_index = 0; new_index < views_size; new_index++) { - // Note that we cannot directly use |GetBoundsInScreen|. Because we may - // perform animation (transform) on mini views. The bounds gotten from - // |GetBoundsInScreen| may be the intermediate bounds during animation. - // Therefore, we transfer a mini view's origin from its parent level to - // avoid the influence of its own transform. - auto* view = views[new_index]; - gfx::Point center_in_screen = view->bounds().CenterPoint(); - views::View::ConvertPointToScreen(view->parent(), ¢er_in_screen); - - if (location_screen_x < center_in_screen.x()) - return new_index; - } - - return views_size - 1; -} - int GetSpaceBetweenMiniViews(DeskMiniView* mini_view) { return kMiniViewsSpacing - mini_view->GetPreviewBorderInsets().width(); } @@ -690,8 +665,8 @@ // Otherwise, the position is determined by the drag proxy's location. int new_index = (cursor_y < bar_bounds.origin().y() || cursor_y > bar_bounds.bottom()) - ? mini_views_.size() - 1 - : DetermineMoveIndex(mini_views_, old_index, drag_pos_in_screen.x()); + ? (GetMirrored() ? 0 : mini_views_.size() - 1) + : DetermineMoveIndex(drag_pos_in_screen.x()); if (old_index != new_index) Shell::Get()->desks_controller()->ReorderDesk(old_index, new_index); @@ -950,6 +925,36 @@ } } +int DesksBarView::DetermineMoveIndex(int location_screen_x) const { + const int views_size = static_cast<int>(mini_views_.size()); + + // We find the target position according to the x-axis coordinate of the + // desks' center positions in screen in ascending order. Therefore, if the + // desks bar is mirrored, check from right to left, otherwise check from left + // to right. + const bool mirrored = GetMirrored(); + const int start_index = mirrored ? views_size - 1 : 0; + const int end_index = mirrored ? -1 : views_size; + const int iter_step = mirrored ? -1 : 1; + + for (int new_index = start_index; new_index != end_index; + new_index += iter_step) { + auto* mini_view = mini_views_[new_index]; + + // Note that we cannot directly use |GetBoundsInScreen|. Because we may + // perform animation (transform) on mini views. The bounds gotten from + // |GetBoundsInScreen| may be the intermediate bounds during animation. + // Therefore, we transfer a mini view's origin from its parent level to + // avoid the influence of its own transform. + gfx::Point center_screen_pos = mini_view->GetMirroredBounds().CenterPoint(); + views::View::ConvertPointToScreen(mini_view->parent(), ¢er_screen_pos); + if (location_screen_x < center_screen_pos.x()) + return new_index; + } + + return end_index - iter_step; +} + DeskMiniView* DesksBarView::FindMiniViewForDesk(const Desk* desk) const { for (auto* mini_view : mini_views_) { if (mini_view->desk() == desk)
diff --git a/ash/wm/desks/desks_bar_view.h b/ash/wm/desks/desks_bar_view.h index 6d1818e..9ffff561 100644 --- a/ash/wm/desks/desks_bar_view.h +++ b/ash/wm/desks/desks_bar_view.h
@@ -198,6 +198,10 @@ friend class BentoDesksBarLayout; friend class BentoDesksBarScrollViewLayout; + // Determine the new index of the dragged desk at the position of + // |location_in_screen|. + int DetermineMoveIndex(int location_in_screen) const; + // Returns the mini_view associated with |desk| or nullptr if no mini_view // has been created for it yet. DeskMiniView* FindMiniViewForDesk(const Desk* desk) const;
diff --git a/ash/wm/desks/desks_unittests.cc b/ash/wm/desks/desks_unittests.cc index c7f6255a..590cad5 100644 --- a/ash/wm/desks/desks_unittests.cc +++ b/ash/wm/desks/desks_unittests.cc
@@ -4964,6 +4964,93 @@ VerifyDesksRestoreData(prefs, std::vector<std::string>{"1", "0", "2"}); } +// Test reordering desks in RTL mode. +TEST_F(DesksBentoTest, ReorderDesksInRTLMode) { + // Turn on RTL mode. + base::i18n::SetICUDefaultLocale("ar"); + EXPECT_TRUE(base::i18n::IsRTL()); + + auto* desks_controller = DesksController::Get(); + + auto* overview_controller = Shell::Get()->overview_controller(); + overview_controller->StartOverview(); + EXPECT_TRUE(overview_controller->InOverviewSession()); + + auto* root_window = Shell::GetPrimaryRootWindow(); + const auto* desks_bar_view = + GetOverviewGridForRoot(root_window)->desks_bar_view(); + + auto* event_generator = GetEventGenerator(); + + // Add two desks (Now we have three desks). + NewDesk(); + NewDesk(); + + // Cache the mini view and corresponding desks. + std::vector<DeskMiniView*> mini_views = desks_bar_view->mini_views(); + DeskMiniView* mini_view_0 = mini_views[0]; + Desk* desk_0 = mini_view_0->desk(); + DeskMiniView* mini_view_1 = mini_views[1]; + Desk* desk_1 = mini_view_1->desk(); + DeskMiniView* mini_view_2 = mini_views[2]; + Desk* desk_2 = mini_view_2->desk(); + + // Set desk names. Force update user prefs because `SetName()` does not + // trigger it but `DeskMiniView::OnViewBlurred`. + desk_0->SetName(base::ASCIIToUTF16("0"), /*set_by_user=*/true); + desk_1->SetName(base::ASCIIToUTF16("1"), /*set_by_user=*/true); + desk_2->SetName(base::ASCIIToUTF16("2"), /*set_by_user=*/true); + desks_restore_util::UpdatePrimaryUserDeskNamesPrefs(); + + auto* prefs = Shell::Get()->session_controller()->GetPrimaryUserPrefService(); + VerifyDesksRestoreData(prefs, std::vector<std::string>{"0", "1", "2"}); + + // Swap the positions of the |desk_1| and the |desk_2| by mouse. + StartDragDeskPreview(mini_view_1, event_generator); + EXPECT_TRUE(desks_bar_view->IsDraggingDesk()); + + gfx::Point desk_center_2 = + mini_view_2->GetPreviewBoundsInScreen().CenterPoint(); + event_generator->MoveMouseTo(desk_center_2); + + // Now, the desks order should be [0, 2, 1]: + EXPECT_EQ(0, desks_controller->GetDeskIndex(desk_0)); + EXPECT_EQ(1, desks_controller->GetDeskIndex(desk_2)); + EXPECT_EQ(2, desks_controller->GetDeskIndex(desk_1)); + VerifyDesksRestoreData(prefs, std::vector<std::string>{"0", "2", "1"}); + event_generator->ReleaseLeftButton(); + + // Swap the positions of the |desk_1| and the |desk_0| by gesture. + LongTapOnDeskPreview(mini_view_1, event_generator); + EXPECT_TRUE(desks_bar_view->IsDraggingDesk()); + + gfx::Point desk_center_0 = + mini_view_0->GetPreviewBoundsInScreen().CenterPoint(); + event_generator->MoveTouch(desk_center_0); + + // Now, the desks order should be [1, 0, 2]: + EXPECT_EQ(0, desks_controller->GetDeskIndex(desk_1)); + EXPECT_EQ(1, desks_controller->GetDeskIndex(desk_0)); + EXPECT_EQ(2, desks_controller->GetDeskIndex(desk_2)); + VerifyDesksRestoreData(prefs, std::vector<std::string>{"1", "0", "2"}); + event_generator->ReleaseTouch(); + + // Swap the positions of the |desk_0| and the |desk_2| by keyboard. + // Highlight the |desk_0|. + overview_controller->overview_session() + ->highlight_controller() + ->MoveHighlightToView(mini_view_0); + + // Swap the positions of the |desk_0| and the |desk_2| by pressing Ctrl + <-. + event_generator->PressKey(ui::VKEY_LEFT, ui::EF_CONTROL_DOWN); + + // Now, the desks order should be [1, 2, 0]: + EXPECT_EQ(0, desks_controller->GetDeskIndex(desk_1)); + EXPECT_EQ(1, desks_controller->GetDeskIndex(desk_2)); + EXPECT_EQ(2, desks_controller->GetDeskIndex(desk_0)); + VerifyDesksRestoreData(prefs, std::vector<std::string>{"1", "2", "0"}); +} + // Tests that while reordering desks by drag & drop, when a desk is snapping // back, click its target location won't cause any crashes. // Regression test of https://crbug.com/1171880.
diff --git a/base/BUILD.gn b/base/BUILD.gn index a9fb242..76a15ad 100644 --- a/base/BUILD.gn +++ b/base/BUILD.gn
@@ -3512,7 +3512,8 @@ "//third_party/fuchsia-sdk/sdk/pkg/sys_cpp", ] - manifest = "fuchsia/base_unittests.test-cmx" + additional_manifests = + [ "//build/config/fuchsia/test/test_logger_capabilities.test-cmx" ] } if (!is_fuchsia && !is_ios) {
diff --git a/base/allocator/partition_allocator/pcscan.cc b/base/allocator/partition_allocator/pcscan.cc index 534842c..21388347 100644 --- a/base/allocator/partition_allocator/pcscan.cc +++ b/base/allocator/partition_allocator/pcscan.cc
@@ -488,6 +488,122 @@ nonscannable_roots_.ClearForTesting(); // IN-TEST } +class PCScanSnapshot final { + public: + struct ScanArea { + ScanArea(uintptr_t* begin, uintptr_t* end) : begin(begin), end(end) {} + + uintptr_t* begin; + uintptr_t* end; + }; + using ScanAreas = std::vector<ScanArea, MetadataAllocator<ScanArea>>; + + // Large scan areas have their slot size recorded which allows to iterate + // based on objects, potentially skipping over objects if possible. + struct LargeScanArea : public ScanArea { + LargeScanArea(uintptr_t* begin, uintptr_t* end, size_t slot_size) + : ScanArea(begin, end), slot_size(slot_size) {} + + size_t slot_size = 0; + }; + using LargeScanAreas = + std::vector<LargeScanArea, MetadataAllocator<LargeScanArea>>; + + // Super pages only correspond to normal buckets. + using SuperPages = + std::set<uintptr_t, std::less<>, MetadataAllocator<uintptr_t>>; + + PCScanSnapshot() = default; + + void Take(size_t pcscan_epoch); + + ScanAreas& scan_areas() { return scan_areas_; } + const ScanAreas& scan_areas() const { return scan_areas_; } + + LargeScanAreas& large_scan_areas() { return large_scan_areas_; } + const LargeScanAreas& large_scan_areas() const { return large_scan_areas_; } + + SuperPages& quarantinable_super_pages() { return super_pages_; } + const SuperPages& quarantinable_super_pages() const { return super_pages_; } + + private: + ScanAreas scan_areas_; + LargeScanAreas large_scan_areas_; + SuperPages super_pages_; +}; + +void PCScanSnapshot::Take(size_t pcscan_epoch) { + using Root = PartitionRoot<ThreadSafe>; + using SlotSpan = SlotSpanMetadata<ThreadSafe>; + // Threshold for which bucket size it is worthwhile in checking whether the + // object is a quarantined object and can be skipped. + static constexpr size_t kLargeScanAreaThreshold = 8192; + // Take a snapshot of all allocated non-empty slot spans. + static constexpr size_t kScanAreasReservationSize = 128; + + scan_areas_.reserve(kScanAreasReservationSize); + + auto& pcscan_internal = PCScanInternal::Instance(); + for (Root* root : pcscan_internal.scannable_roots()) { + typename Root::ScopedGuard guard(root->lock_); + + // Take a snapshot of all super pages and scannable slot spans. + // TODO(bikineev): Consider making current_extent lock-free and moving it to + // the concurrent thread. + for (auto* super_page_extent = root->first_extent; super_page_extent; + super_page_extent = super_page_extent->next) { + for (char* super_page = super_page_extent->super_page_base; + super_page != super_page_extent->super_pages_end; + super_page += kSuperPageSize) { + // TODO(bikineev): Consider following freelists instead of slot spans. + const size_t visited_slot_spans = IterateSlotSpans<ThreadSafe>( + super_page, true /*with_quarantine*/, + [this](SlotSpan* slot_span) -> bool { + if (slot_span->is_empty() || slot_span->is_decommitted()) { + return false; + } + auto* payload_begin = static_cast<uintptr_t*>( + SlotSpan::ToSlotSpanStartPtr(slot_span)); + size_t provisioned_size = slot_span->GetProvisionedSize(); + // Free & decommitted slot spans are skipped. + PA_DCHECK(provisioned_size > 0); + auto* payload_end = + payload_begin + (provisioned_size / sizeof(uintptr_t)); + if (slot_span->bucket->slot_size >= kLargeScanAreaThreshold) { + large_scan_areas_.push_back( + {payload_begin, payload_end, slot_span->bucket->slot_size}); + } else { + scan_areas_.push_back({payload_begin, payload_end}); + } + return true; + }); + // If we haven't visited any slot spans, all the slot spans in the + // super-page are either empty or decommitted. This means that all the + // objects are freed and there are no quarantined objects. + if (LIKELY(visited_slot_spans)) { + super_pages_.insert(reinterpret_cast<uintptr_t>(super_page)); + } else { +#if DCHECK_IS_ON() + PA_CHECK(IsScannerQuarantineBitmapEmpty(super_page, pcscan_epoch)); +#endif + } + } + } + } + for (Root* root : pcscan_internal.nonscannable_roots()) { + typename Root::ScopedGuard guard(root->lock_); + // Take a snapshot of all super pages and nnonscannable slot spans. + for (auto* super_page_extent = root->first_extent; super_page_extent; + super_page_extent = super_page_extent->next) { + for (char* super_page = super_page_extent->super_page_base; + super_page != super_page_extent->super_pages_end; + super_page += kSuperPageSize) { + super_pages_.insert(reinterpret_cast<uintptr_t>(super_page)); + } + } + } +} + } // namespace // This class is responsible for performing the entire PCScan task. @@ -515,31 +631,6 @@ using SlotSpan = SlotSpanMetadata<ThreadSafe>; - struct ScanArea { - ScanArea(uintptr_t* begin, uintptr_t* end) : begin(begin), end(end) {} - - uintptr_t* begin; - uintptr_t* end; - }; - using ScanAreas = std::vector<ScanArea, MetadataAllocator<ScanArea>>; - - // Large scan areas have their slot size recorded which allows to iterate - // based on objects, potentially skipping over objects if possible. - struct LargeScanArea : public ScanArea { - LargeScanArea(uintptr_t* begin, uintptr_t* end, size_t slot_size) - : ScanArea(begin, end), slot_size(slot_size) {} - - size_t slot_size = 0; - }; - using LargeScanAreas = - std::vector<LargeScanArea, MetadataAllocator<LargeScanArea>>; - - // Super pages only correspond to normal buckets. - // TODO(bikineev): Consider flat containers since the number of elements is - // relatively small. This requires making base containers allocator-aware. - using SuperPages = - std::set<uintptr_t, std::less<>, MetadataAllocator<uintptr_t>>; - struct GigaCageLookupPolicy { ALWAYS_INLINE bool TestOnHeapPointer(uintptr_t maybe_ptr) const { #if defined(PA_HAS_64_BITS_POINTERS) @@ -553,16 +644,17 @@ reinterpret_cast<void*>(maybe_ptr)); #endif // PA_HAS_64_BITS_POINTERS } - [[maybe_unused]] const PCScanTask& task_; + [[maybe_unused]] const PCScanSnapshot& snapshot; }; struct NoGigaCageLookupPolicy { ALWAYS_INLINE bool TestOnHeapPointer(uintptr_t maybe_ptr) const { const auto super_page_base = maybe_ptr & kSuperPageBaseMask; - auto it = task_.super_pages_.lower_bound(super_page_base); - return it != task_.super_pages_.end() && *it == super_page_base; + const auto& super_pages = snapshot.quarantinable_super_pages(); + auto it = super_pages.lower_bound(super_page_base); + return it != super_pages.end() && *it == super_page_base; } - const PCScanTask& task_; + const PCScanSnapshot& snapshot; }; template <typename LookupPolicy> @@ -587,16 +679,12 @@ // objects. size_t SweepQuarantine(); - PCScan& pcscan_; // Cache the pcscan epoch to avoid the compiler loading the atomic // QuarantineData::epoch_ on each access. const size_t pcscan_epoch_; - - ScanAreas scan_areas_; - LargeScanAreas large_scan_areas_; - SuperPages super_pages_; - + PCScanSnapshot snapshot_; StatsCollector stats_; + PCScan& pcscan_; }; template <typename LookupPolicy> @@ -604,7 +692,7 @@ PCScan::PCScanTask::TryFindScannerBitmapForPointer(uintptr_t maybe_ptr) const { // First, check if |maybe_ptr| points to a valid super page or a quarantined // card. - LookupPolicy lookup{*this}; + LookupPolicy lookup{snapshot_}; if (LIKELY(!lookup.TestOnHeapPointer(maybe_ptr))) return nullptr; // Check if we are not pointing to metadata/guard pages. @@ -674,8 +762,8 @@ StatsCollector::ScannerId::kClear); const bool giga_cage_enabled = features::IsPartitionAllocGigaCageEnabled(); - SuperPages filtered_super_pages; - for (auto super_page : super_pages_) { + PCScanSnapshot::SuperPages filtered_super_pages; + for (auto super_page : snapshot_.quarantinable_super_pages()) { auto* bitmap = QuarantineBitmapFromPointer( QuarantineBitmapType::kScanner, pcscan_epoch_, reinterpret_cast<char*>(super_page)); @@ -706,7 +794,7 @@ filtered_super_pages.insert(super_page); } } - super_pages_ = std::move(filtered_super_pages); + snapshot_.quarantinable_super_pages() = std::move(filtered_super_pages); } // Class used to perform actual scanning. Dispatches at runtime based on @@ -915,7 +1003,7 @@ // For scanning large areas, it's worthwhile checking whether the range that // is scanned contains quarantined objects. - for (auto scan_area : large_scan_areas_) { + for (auto scan_area : snapshot_.large_scan_areas()) { // The bitmap is (a) always guaranteed to exist and (b) the same for all // objects in a given slot span. // TODO(chromium:1129751): Check mutator bitmap as well if performance @@ -937,7 +1025,7 @@ new_quarantine_size += scan_loop.Run(current_slot, current_slot_end); } } - for (auto scan_area : scan_areas_) { + for (auto scan_area : snapshot_.scan_areas()) { new_quarantine_size += scan_loop.Run(scan_area.begin, scan_area.end); } return new_quarantine_size; @@ -952,7 +1040,7 @@ const bool giga_cage_enabled = features::IsPartitionAllocGigaCageEnabled(); - for (auto super_page : super_pages_) { + for (auto super_page : snapshot_.quarantinable_super_pages()) { auto* bitmap = QuarantineBitmapFromPointer( QuarantineBitmapType::kScanner, pcscan_epoch_, reinterpret_cast<char*>(super_page)); @@ -983,87 +1071,22 @@ } PCScan::PCScanTask::PCScanTask(PCScan& pcscan) - : pcscan_(pcscan), - pcscan_epoch_(pcscan.quarantine_data_.epoch()), - stats_(PCScanInternal::Instance().process_name()) { - // Threshold for which bucket size it is worthwhile in checking whether the - // object is a quarantined object and can be skipped. - static constexpr size_t kLargeScanAreaThreshold = 8192; - // Take a snapshot of all allocated non-empty slot spans. - static constexpr size_t kScanAreasReservationSize = 128; - scan_areas_.reserve(kScanAreasReservationSize); - - auto& pcscan_internal = PCScanInternal::Instance(); - - for (Root* root : pcscan_internal.scannable_roots()) { - typename Root::ScopedGuard guard(root->lock_); - - // Take a snapshot of all super pages and scannable slot spans. - // TODO(bikineev): Consider making current_extent lock-free and moving it to - // the concurrent thread. - for (auto* super_page_extent = root->first_extent; super_page_extent; - super_page_extent = super_page_extent->next) { - for (char* super_page = super_page_extent->super_page_base; - super_page != super_page_extent->super_pages_end; - super_page += kSuperPageSize) { - // TODO(bikineev): Consider following freelists instead of slot spans. - const size_t visited_slot_spans = IterateSlotSpans<ThreadSafe>( - super_page, true /*with_quarantine*/, - [this](SlotSpan* slot_span) -> bool { - if (slot_span->is_empty() || slot_span->is_decommitted()) { - return false; - } - auto* payload_begin = static_cast<uintptr_t*>( - SlotSpan::ToSlotSpanStartPtr(slot_span)); - size_t provisioned_size = slot_span->GetProvisionedSize(); - // Free & decommitted slot spans are skipped. - PA_DCHECK(provisioned_size > 0); - auto* payload_end = - payload_begin + (provisioned_size / sizeof(uintptr_t)); - if (slot_span->bucket->slot_size >= kLargeScanAreaThreshold) { - large_scan_areas_.push_back( - {payload_begin, payload_end, slot_span->bucket->slot_size}); - } else { - scan_areas_.push_back({payload_begin, payload_end}); - } - return true; - }); - // If we haven't visited any slot spans, all the slot spans in the - // super-page are either empty or decommitted. This means that all the - // objects are freed and there are no quarantined objects. - if (LIKELY(visited_slot_spans)) { - super_pages_.insert(reinterpret_cast<uintptr_t>(super_page)); - } else { -#if DCHECK_IS_ON() - PA_CHECK(IsScannerQuarantineBitmapEmpty(super_page, pcscan_epoch_)); -#endif - } - } - } - } - for (Root* root : pcscan_internal.nonscannable_roots()) { - typename Root::ScopedGuard guard(root->lock_); - // Take a snapshot of all super pages and nonscannable slot spans. - for (auto* super_page_extent = root->first_extent; super_page_extent; - super_page_extent = super_page_extent->next) { - for (char* super_page = super_page_extent->super_page_base; - super_page != super_page_extent->super_pages_end; - super_page += kSuperPageSize) { - super_pages_.insert(reinterpret_cast<uintptr_t>(super_page)); - } - } - } -} + : pcscan_epoch_(pcscan.quarantine_data_.epoch()), + stats_(PCScanInternal::Instance().process_name()), + pcscan_(pcscan) {} void PCScan::PCScanTask::RunOnce() && { size_t new_quarantine_size = 0; size_t swept_bytes = 0; + // Take snapshot of partition-alloc heap. + snapshot_.Take(pcscan_epoch_); + { StatsCollector::ScannerScope overall_scope( stats_, StatsCollector::ScannerId::kOverall); - // First, clear all quarantined objects and filter out super pages that + // Clear all quarantined objects and filter out super pages that // don't contain quarantined objects. ClearQuarantinedObjectsAndFilterSuperPages();
diff --git a/base/memory/OWNERS b/base/memory/OWNERS index 714c22ea..e8568e1 100644 --- a/base/memory/OWNERS +++ b/base/memory/OWNERS
@@ -8,3 +8,5 @@ per-file madv_free*=lizeb@chromium.org per-file madv_free*=pasko@chromium.org per-file madv_free*=mthiesse@chromium.org +per-file nonscannable_memory*=bikineev@chromium.com +per-file nonscannable_memory*=mlippautz@chromium.com
diff --git a/base/message_loop/message_pump_kqueue.cc b/base/message_loop/message_pump_kqueue.cc index 9a0be64..3076a7b3 100644 --- a/base/message_loop/message_pump_kqueue.cc +++ b/base/message_loop/message_pump_kqueue.cc
@@ -148,7 +148,7 @@ while (keep_running_) { mac::ScopedNSAutoreleasePool pool; - bool do_more_work = DoInternalWork(nullptr); + bool do_more_work = DoInternalWork(delegate, nullptr); if (!keep_running_) break; @@ -167,7 +167,7 @@ if (do_more_work) continue; - DoInternalWork(&next_work_info); + DoInternalWork(delegate, &next_work_info); } } @@ -357,7 +357,8 @@ return rv >= 0; } -bool MessagePumpKqueue::DoInternalWork(Delegate::NextWorkInfo* next_work_info) { +bool MessagePumpKqueue::DoInternalWork(Delegate* delegate, + Delegate::NextWorkInfo* next_work_info) { if (events_.size() < event_count_) { events_.resize(event_count_); } @@ -385,10 +386,10 @@ } while (rv < 0 && errno == EINTR); PCHECK(rv >= 0) << "kevent64"; - return ProcessEvents(rv); + return ProcessEvents(delegate, rv); } -bool MessagePumpKqueue::ProcessEvents(int count) { +bool MessagePumpKqueue::ProcessEvents(Delegate* delegate, int count) { bool did_work = false; for (int i = 0; i < count; ++i) { @@ -402,7 +403,7 @@ // this event could be processed. continue; } - FdWatcher* delegate = controller->watcher(); + FdWatcher* fd_watcher = controller->watcher(); if (event->flags & EV_ONESHOT) { // If this was a one-shot event, the Controller needs to stop tracking @@ -413,10 +414,11 @@ --event_count_; } + auto scoped_do_native_work = delegate->BeginNativeWork(); if (event->filter == EVFILT_READ) { - delegate->OnFileCanReadWithoutBlocking(event->ident); + fd_watcher->OnFileCanReadWithoutBlocking(event->ident); } else if (event->filter == EVFILT_WRITE) { - delegate->OnFileCanWriteWithoutBlocking(event->ident); + fd_watcher->OnFileCanWriteWithoutBlocking(event->ident); } } else if (event->filter == EVFILT_MACHPORT) { mach_port_t port = KqueueNeedsPortSet() ? event->data : event->ident; @@ -443,6 +445,7 @@ // The controller could have been removed by some other work callout // before this event could be processed. if (controller) { + auto scoped_do_native_work = delegate->BeginNativeWork(); controller->watcher()->OnMachMessageReceived(port); } } else {
diff --git a/base/message_loop/message_pump_kqueue.h b/base/message_loop/message_pump_kqueue.h index 9acfcf2..8829348 100644 --- a/base/message_loop/message_pump_kqueue.h +++ b/base/message_loop/message_pump_kqueue.h
@@ -129,12 +129,13 @@ // amount of time specified by the NextWorkInfo or until an event is // triggered. Returns whether any events were dispatched, with the events // stored in |events_|. - bool DoInternalWork(Delegate::NextWorkInfo* next_work_info); + bool DoInternalWork(Delegate* delegate, + Delegate::NextWorkInfo* next_work_info); // Called by DoInternalWork() to dispatch the user events stored in |events_| // that were triggered. |count| is the number of events to process. Returns // true if work was done, or false if no work was done. - bool ProcessEvents(int count); + bool ProcessEvents(Delegate* delegate, int count); // Receive right to which an empty Mach message is sent to wake up the pump // in response to ScheduleWork().
diff --git a/base/test/launcher/OWNERS b/base/test/launcher/OWNERS deleted file mode 100644 index ad463ead..0000000 --- a/base/test/launcher/OWNERS +++ /dev/null
@@ -1 +0,0 @@ -isamsonov@google.com
diff --git a/build/android/play_services/__init__.py b/build/android/play_services/__init__.py deleted file mode 100644 index 50b23df..0000000 --- a/build/android/play_services/__init__.py +++ /dev/null
@@ -1,3 +0,0 @@ -# Copyright 2015 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file.
diff --git a/build/android/play_services/preprocess.py b/build/android/play_services/preprocess.py deleted file mode 100755 index bb3424a..0000000 --- a/build/android/play_services/preprocess.py +++ /dev/null
@@ -1,244 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2015 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -'''Prepares the Google Play services split client libraries before usage by -Chrome's build system. - -We need to preprocess Google Play services before using it in Chrome builds -mostly to remove unused resources (unsupported languages, unused drawables, -etc.) as proper resource shrinking is not yet supported by our build system. -(See https://crbug.com/636448) - -The script is meant to be used with an unpacked library repository. One can -be obtained by downloading the "extra-google-m2repository" from the Android SDK -Manager and extracting the AARs from the desired version as the following -structure: - - REPOSITORY_DIR - +-- CLIENT_1 - | +-- <content of the first AAR file> - +-- CLIENT_2 - +-- etc. - -The output will follow the same structure, with fewer resource files, in the -provided output directory. -''' - -import argparse -import glob -import itertools -import os -import shutil -import stat -import sys -import tempfile -import textwrap -import zipfile - -sys.path.append(os.path.join(os.path.dirname(__file__), os.pardir)) -from play_services import utils -from pylib.utils import argparse_utils - - -def main(): - parser = argparse.ArgumentParser(description=( - "Prepares the Google Play services split client libraries before usage " - "by Chrome's build system. See the script's documentation for more a " - "detailed help.")) - argparse_utils.CustomHelpAction.EnableFor(parser) - required_args = parser.add_argument_group('required named arguments') - required_args.add_argument('-r', - '--repository', - help=('the Google Play services repository ' - 'location'), - required=True, - metavar='FILE') - required_args.add_argument('-d', - '--root-dir', - help='the directory which GN considers the root', - required=True, - metavar='FILE') - required_args.add_argument('-o', - '--out-dir', - help='the output directory', - required=True, - metavar='FILE') - required_args.add_argument('-g', - '--gni-out-file', - help='the GN output file', - required=True, - metavar='FILE') - required_args.add_argument('-c', - '--config-file', - help='the config file path', - required=True, - metavar='FILE') - parser.add_argument('--config-help', - action='custom_help', - custom_help_text=utils.ConfigParser.__doc__, - help='show the configuration file format help') - - args = parser.parse_args() - - return ProcessGooglePlayServices(args.repository, - args.root_dir, - args.out_dir, - args.gni_out_file, - args.config_file) - - -def ProcessGooglePlayServices( - repo, root_dir, out_dir, gni_out_file, config_path): - config = utils.ConfigParser(config_path) - - tmp_root = tempfile.mkdtemp() - try: - tmp_paths = _SetupTempDir(tmp_root) - _ImportFromExtractedRepo(config, tmp_paths, repo) - _ProcessResources(config, tmp_paths, repo) - _CopyToOutput(tmp_paths, out_dir) - _EnumerateProguardFiles(root_dir, out_dir, gni_out_file) - _UpdateVersionInConfig(config, tmp_paths) - finally: - shutil.rmtree(tmp_root) - - return 0 - - -def _SetupTempDir(tmp_root): - tmp_paths = { - 'root': tmp_root, - 'imported_clients': os.path.join(tmp_root, 'imported_clients'), - 'extracted_jars': os.path.join(tmp_root, 'jar'), - 'combined_jar': os.path.join(tmp_root, 'google-play-services.jar'), - } - os.mkdir(tmp_paths['imported_clients']) - os.mkdir(tmp_paths['extracted_jars']) - - return tmp_paths - - -def _MakeWritable(dir_path): - for root, dirs, files in os.walk(dir_path): - for path in itertools.chain(dirs, files): - st = os.stat(os.path.join(root, path)) - os.chmod(os.path.join(root, path), st.st_mode | stat.S_IWUSR) - - -# E.g. turn "base_1p" into "base" -def _RemovePartySuffix(client): - return client[:-3] if client[-3:] == '_1p' else client - - -def _ImportFromExtractedRepo(config, tmp_paths, repo): - # Import the clients - try: - for client in config.clients: - client_out_dir = os.path.join(tmp_paths['imported_clients'], client) - shutil.copytree(os.path.join(repo, client), client_out_dir) - finally: - _MakeWritable(tmp_paths['imported_clients']) - - -def _ProcessResources(config, tmp_paths, repo): - LOCALIZED_VALUES_BASE_NAME = 'values-' - locale_whitelist = set(config.locale_whitelist) - - # The directory structure here is: - # <imported_clients temp dir>/<client name>_1p/res/<res type>/<res file>.xml - for client_dir in os.listdir(tmp_paths['imported_clients']): - client_prefix = _RemovePartySuffix(client_dir) + '_' - - res_path = os.path.join(tmp_paths['imported_clients'], client_dir, 'res') - if not os.path.isdir(res_path): - continue - - for res_type in os.listdir(res_path): - res_type_path = os.path.join(res_path, res_type) - - if res_type.startswith('drawable'): - shutil.rmtree(res_type_path) - continue - - if res_type.startswith(LOCALIZED_VALUES_BASE_NAME): - dir_locale = res_type[len(LOCALIZED_VALUES_BASE_NAME):] - if dir_locale not in locale_whitelist: - shutil.rmtree(res_type_path) - continue - - if res_type.startswith('values'): - # Beginning with v3, resource file names are not necessarily unique, - # and would overwrite each other when merged at build time. Prefix each - # "values" resource file with its client name. - for res_file in os.listdir(res_type_path): - os.rename(os.path.join(res_type_path, res_file), - os.path.join(res_type_path, client_prefix + res_file)) - - # Reimport files from the whitelist. - for res_path in config.resource_whitelist: - for whitelisted_file in glob.glob(os.path.join(repo, res_path)): - resolved_file = os.path.relpath(whitelisted_file, repo) - rebased_res = os.path.join(tmp_paths['imported_clients'], resolved_file) - - if not os.path.exists(os.path.dirname(rebased_res)): - os.makedirs(os.path.dirname(rebased_res)) - - try: - shutil.copy(os.path.join(repo, whitelisted_file), rebased_res) - finally: - _MakeWritable(rebased_res) - - -def _CopyToOutput(tmp_paths, out_dir): - shutil.rmtree(out_dir, ignore_errors=True) - shutil.copytree(tmp_paths['imported_clients'], out_dir) - - -# Write a GN file containing a list of each GMS client's proguard file (if any). -def _EnumerateProguardFiles(root_dir, out_dir, gni_path): - gni_dir = os.path.dirname(gni_path) - gni_template = textwrap.dedent('''\ - # Copyright 2017 The Chromium Authors. All rights reserved. - # Use of this source code is governed by a BSD-style license that can be - # found in the LICENSE file. - - # This file generated by {script} - gms_proguard_configs = [ - {body} - ] - ''') - - gni_lines = [] - for client_dir in os.listdir(out_dir): - proguard_path = os.path.join( - out_dir, client_dir, 'proguard.txt') - if os.path.exists(proguard_path): - rooted_path = os.path.relpath(proguard_path, root_dir) - gni_lines.append(' "//{}",'.format(rooted_path)) - gni_lines.sort() - - gni_text = gni_template.format( - script=os.path.relpath(sys.argv[0], gni_dir), - body='\n'.join(gni_lines)) - - with open(gni_path, 'w') as gni_file: - gni_file.write(gni_text) - - -def _UpdateVersionInConfig(config, tmp_paths): - version_xml_path = os.path.join(tmp_paths['imported_clients'], - config.version_xml_path) - play_services_full_version = utils.GetVersionNumberFromLibraryResources( - version_xml_path) - config.UpdateVersionNumber(play_services_full_version) - - -def _ExtractAll(zip_path, out_path): - with zipfile.ZipFile(zip_path, 'r') as zip_file: - zip_file.extractall(out_path) - -if __name__ == '__main__': - sys.exit(main())
diff --git a/build/android/play_services/utils.py b/build/android/play_services/utils.py deleted file mode 100644 index 76b3679..0000000 --- a/build/android/play_services/utils.py +++ /dev/null
@@ -1,144 +0,0 @@ -# Copyright 2015 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -''' -Utility functions for all things related to manipulating google play services -related files. -''' - -import argparse -import filecmp -import json -import os -import re - - -_XML_VERSION_NUMBER_PATTERN = re.compile( - r'<integer name="google_play_services_version">(\d+)<\/integer>') - - -class DefaultsRawHelpFormatter(argparse.ArgumentDefaultsHelpFormatter, - argparse.RawDescriptionHelpFormatter): - ''' - Combines the features of RawDescriptionHelpFormatter and - ArgumentDefaultsHelpFormatter, providing defaults for the arguments and raw - text for the description. - ''' - pass - - -class ConfigParser(object): - '''Reads and writes the configuration files for play services related scripts - - The configuration files are JSON files. Here is the data they are expected - to contain: - - - version_number - Number. Mirrors @integer/google_play_services_version from the library. - Example: 815000 - - - sdk_version - Version of the Play Services SDK to retrieve, when preprocessing the - library from a maven/gradle repository. - Example: "8.1.0" - - - clients - List of strings. Name of the clients (or play services modules) to - include when preprocessing the library. - Example: ["play-services-base", "play-services-cast"] - - - version_xml_path - String. Path to the version.xml string describing the current version. - Should be relative to the library base directory - Example: "res/values/version.xml" - - - locale_whitelist - List of strings. List of locales to keep from the resources. Can be - obtained by generating an android build and looking at the content of - `out/Debug/gen/chrome/java/res`; or looking at the android section in - `//chrome/app/generated_resources.grd` - Example: ["am", "ar", "bg", "ca", "cs"] - - - resource_whitelist - List of strings. List of resource files to explicitely keep in the final - output. Use it to keep drawables for example, as we currently remove them - all. - Example: ["play-services-base/res/drawables/foobar.xml"] - ''' - _VERSION_NUMBER_KEY = 'version_number' - - def __init__(self, path): - self.path = path - self._data = {} - - with open(path, 'r') as stream: - self._data = json.load(stream) - - @property - def version_number(self): - return self._data.get(self._VERSION_NUMBER_KEY) - - @property - def sdk_version(self): - return self._data.get('sdk_version') - - @property - def clients(self): - return self._data.get('clients') or [] - - @property - def version_xml_path(self): - return self._data.get('version_xml_path') - - @property - def locale_whitelist(self): - return self._data.get('locale_whitelist') or [] - - @property - def resource_whitelist(self): - return self._data.get('resource_whitelist') or [] - - def UpdateVersionNumber(self, new_version_number): - '''Updates the version number and saves it in the configuration file. ''' - - with open(self.path, 'w') as stream: - self._data[self._VERSION_NUMBER_KEY] = new_version_number - stream.write(DumpTrimmedJson(self._data)) - - -def DumpTrimmedJson(json_data): - ''' - Default formatting when dumping json to string has trailing spaces and lacks - a new line at the end. This function fixes that. - ''' - - out = json.dumps(json_data, sort_keys=True, indent=2) - out = out.replace(' ' + os.linesep, os.linesep) - return out + os.linesep - - -def FileEquals(expected_file, actual_file): - ''' - Returns whether the two files are equal. Returns False if any of the files - doesn't exist. - ''' - - if not os.path.isfile(actual_file) or not os.path.isfile(expected_file): - return False - return filecmp.cmp(expected_file, actual_file) - - -def GetVersionNumberFromLibraryResources(version_xml): - ''' - Extracts a Google Play services version number from its version.xml file. - ''' - - with open(version_xml, 'r') as version_file: - version_file_content = version_file.read() - - match = _XML_VERSION_NUMBER_PATTERN.search(version_file_content) - if not match: - raise AttributeError('A value for google_play_services_version was not ' - 'found in ' + version_xml) - return int(match.group(1))
diff --git a/build/config/fuchsia/test/OWNERS b/build/config/fuchsia/test/OWNERS new file mode 100644 index 0000000..3ebcc42 --- /dev/null +++ b/build/config/fuchsia/test/OWNERS
@@ -0,0 +1 @@ +file://build/fuchsia/OWNERS \ No newline at end of file
diff --git a/build/config/fuchsia/test/jit_capabilities.test-cmx b/build/config/fuchsia/test/jit_capabilities.test-cmx new file mode 100644 index 0000000..ff70e25 --- /dev/null +++ b/build/config/fuchsia/test/jit_capabilities.test-cmx
@@ -0,0 +1,7 @@ +{ + "sandbox": { + "features": [ + "deprecated-ambient-replace-as-executable" + ] + } +}
diff --git a/build/config/fuchsia/test/minimum_capabilities.test-cmx b/build/config/fuchsia/test/minimum_capabilities.test-cmx new file mode 100644 index 0000000..20e66bb --- /dev/null +++ b/build/config/fuchsia/test/minimum_capabilities.test-cmx
@@ -0,0 +1,28 @@ +{ + "facets": { + "fuchsia.test": { + "injected-services": { + "fuchsia.intl.PropertyProvider": "fuchsia-pkg://fuchsia.com/intl_property_manager#meta/intl_property_manager.cmx" + }, + "system-services": [ + "fuchsia.boot.ReadOnlyLog" + ] + } + }, + "sandbox": { + "dev": [ + "null", + "zero" + ], + "features": [ + "isolated-persistent-storage", + "isolated-temp" + ], + "services": [ + "fuchsia.intl.PropertyProvider", + "fuchsia.logger.LogSink", + "fuchsia.process.Launcher", + "fuchsia.sys.Loader" + ] + } +}
diff --git a/build/config/fuchsia/test/present_capabilities.test-cmx b/build/config/fuchsia/test/present_capabilities.test-cmx new file mode 100644 index 0000000..849fe70 --- /dev/null +++ b/build/config/fuchsia/test/present_capabilities.test-cmx
@@ -0,0 +1,15 @@ +{ + "facets": { + "fuchsia.test": { + "injected-services": { + "fuchsia.ui.policy.Presenter": "fuchsia-pkg://fuchsia.com/root_presenter#meta/root_presenter.cmx" + }, + + } + }, + "sandbox": { + "services": [ + "fuchsia.ui.policy.Presenter" + ] + } +} \ No newline at end of file
diff --git a/build/config/fuchsia/test/sys_launcher_capabilities.test-cmx b/build/config/fuchsia/test/sys_launcher_capabilities.test-cmx new file mode 100644 index 0000000..7eb44d2 --- /dev/null +++ b/build/config/fuchsia/test/sys_launcher_capabilities.test-cmx
@@ -0,0 +1,7 @@ +{ + "sandbox": { + "services": [ + "fuchsia.sys.Launcher" + ] + } +} \ No newline at end of file
diff --git a/build/config/fuchsia/test/test_logger_capabilities.test-cmx b/build/config/fuchsia/test/test_logger_capabilities.test-cmx new file mode 100644 index 0000000..68b2a67 --- /dev/null +++ b/build/config/fuchsia/test/test_logger_capabilities.test-cmx
@@ -0,0 +1,7 @@ +{ + "sandbox": { + "services": [ + "fuchsia.logger.Log" + ] + } +} \ No newline at end of file
diff --git a/build/config/fuchsia/test/view_creation_capabilities.test-cmx b/build/config/fuchsia/test/view_creation_capabilities.test-cmx new file mode 100644 index 0000000..4bb438a7 --- /dev/null +++ b/build/config/fuchsia/test/view_creation_capabilities.test-cmx
@@ -0,0 +1,23 @@ +{ + "facets": { + "fuchsia.test": { + "injected-services": { + "fuchsia.accessibility.semantics.SemanticsManager": "fuchsia-pkg://fuchsia.com/a11y-manager#meta/a11y-manager.cmx", + "fuchsia.sysmem.Allocator": "fuchsia-pkg://fuchsia.com/sysmem_connector#meta/sysmem_connector.cmx", + "fuchsia.ui.input.ImeService": "fuchsia-pkg://fuchsia.com/ime_service#meta/ime_service.cmx", + "fuchsia.ui.input.ImeVisibilityService": "fuchsia-pkg://fuchsia.com/ime_service#meta/ime_service.cmx", + "fuchsia.ui.scenic.Scenic": "fuchsia-pkg://fuchsia.com/scenic#meta/scenic.cmx" + }, + + } + }, + "sandbox": { + "services": [ + "fuchsia.accessibility.semantics.SemanticsManager", + "fuchsia.sysmem.Allocator", + "fuchsia.ui.input.ImeService", + "fuchsia.ui.input.ImeVisibilityService", + "fuchsia.ui.scenic.Scenic" + ] + } +} \ No newline at end of file
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1 index fcc2e2d..6c5876d9 100644 --- a/build/fuchsia/linux.sdk.sha1 +++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@ -3.20210309.2.1 +3.20210309.3.1
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1 index aca25bd..6c5876d9 100644 --- a/build/fuchsia/mac.sdk.sha1 +++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@ -3.20210309.1.1 +3.20210309.3.1
diff --git a/cc/animation/filter_animation_curve.cc b/cc/animation/filter_animation_curve.cc index 83d991c..38ee1e8d 100644 --- a/cc/animation/filter_animation_curve.cc +++ b/cc/animation/filter_animation_curve.cc
@@ -5,97 +5,10 @@ #include "cc/animation/filter_animation_curve.h" #include "base/memory/ptr_util.h" +#include "ui/gfx/animation/keyframe/keyframed_animation_curve-inl.h" namespace cc { -// TODO(crbug.com/747185): All code in this namespace duplicates code from -// ui/gfx/keyframe/animation/ unnecessarily. -namespace { - -template <class KeyframeType> -void InsertKeyframe(std::unique_ptr<KeyframeType> keyframe, - std::vector<std::unique_ptr<KeyframeType>>* keyframes) { - // Usually, the keyframes will be added in order, so this loop would be - // unnecessary and we should skip it if possible. - if (!keyframes->empty() && keyframe->Time() < keyframes->back()->Time()) { - for (size_t i = 0; i < keyframes->size(); ++i) { - if (keyframe->Time() < keyframes->at(i)->Time()) { - keyframes->insert(keyframes->begin() + i, std::move(keyframe)); - return; - } - } - } - - keyframes->push_back(std::move(keyframe)); -} - -struct TimeValues { - base::TimeDelta start_time; - base::TimeDelta duration; - double progress; -}; - -template <typename KeyframeType> -TimeValues GetTimeValues(const KeyframeType& start_frame, - const KeyframeType& end_frame, - double scaled_duration, - base::TimeDelta time) { - TimeValues values; - values.start_time = start_frame.Time() * scaled_duration; - values.duration = (end_frame.Time() * scaled_duration) - values.start_time; - const base::TimeDelta elapsed = time - values.start_time; - values.progress = (elapsed.is_inf() || values.duration.is_zero()) - ? 1.0 - : (elapsed / values.duration); - return values; -} - -template <typename KeyframeType> -base::TimeDelta TransformedAnimationTime( - const std::vector<std::unique_ptr<KeyframeType>>& keyframes, - const std::unique_ptr<gfx::TimingFunction>& timing_function, - double scaled_duration, - base::TimeDelta time) { - if (timing_function) { - const auto values = GetTimeValues(*keyframes.front(), *keyframes.back(), - scaled_duration, time); - time = (values.duration * timing_function->GetValue(values.progress)) + - values.start_time; - } - - return time; -} - -template <typename KeyframeType> -size_t GetActiveKeyframe( - const std::vector<std::unique_ptr<KeyframeType>>& keyframes, - double scaled_duration, - base::TimeDelta time) { - DCHECK_GE(keyframes.size(), 2ul); - size_t i = 0; - while ((i < keyframes.size() - 2) && // Last keyframe is never active. - (time >= (keyframes[i + 1]->Time() * scaled_duration))) - ++i; - - return i; -} - -template <typename KeyframeType> -double TransformedKeyframeProgress( - const std::vector<std::unique_ptr<KeyframeType>>& keyframes, - double scaled_duration, - base::TimeDelta time, - size_t i) { - const double progress = - GetTimeValues(*keyframes[i], *keyframes[i + 1], scaled_duration, time) - .progress; - return keyframes[i]->timing_function() - ? keyframes[i]->timing_function()->GetValue(progress) - : progress; -} - -} // namespace - void FilterAnimationCurve::Tick(base::TimeDelta t, int property_id, gfx::KeyframeModel* keyframe_model) const { @@ -151,6 +64,10 @@ return FilterKeyframe::Create(Time(), Value(), std::move(func)); } +base::TimeDelta KeyframedFilterAnimationCurve::TickInterval() const { + return ComputeTickInterval(timing_function_, scaled_duration(), keyframes_); +} + void KeyframedFilterAnimationCurve::AddKeyframe( std::unique_ptr<FilterKeyframe> keyframe) { InsertKeyframe(std::move(keyframe), &keyframes_);
diff --git a/cc/animation/filter_animation_curve.h b/cc/animation/filter_animation_curve.h index 0455d67..af8d735 100644 --- a/cc/animation/filter_animation_curve.h +++ b/cc/animation/filter_animation_curve.h
@@ -64,6 +64,7 @@ // AnimationCurve implementation base::TimeDelta Duration() const override; std::unique_ptr<gfx::AnimationCurve> Clone() const override; + base::TimeDelta TickInterval() const override; // FilterAnimationCurve implementation FilterOperations GetValue(base::TimeDelta t) const override;
diff --git a/cc/animation/filter_animation_curve_unittest.cc b/cc/animation/filter_animation_curve_unittest.cc index e7401a78..81ef211 100644 --- a/cc/animation/filter_animation_curve_unittest.cc +++ b/cc/animation/filter_animation_curve_unittest.cc
@@ -24,7 +24,7 @@ } // Tests that a filter animation with one keyframe works as expected. -TEST(KeyframedAnimationCurveTest, OneFilterKeyframe) { +TEST(FilterAnimationCurveTest, OneFilterKeyframe) { std::unique_ptr<KeyframedFilterAnimationCurve> curve( KeyframedFilterAnimationCurve::Create()); FilterOperations operations; @@ -40,7 +40,7 @@ } // Tests that a filter animation with two keyframes works as expected. -TEST(KeyframedAnimationCurveTest, TwoFilterKeyframe) { +TEST(FilterAnimationCurveTest, TwoFilterKeyframe) { std::unique_ptr<KeyframedFilterAnimationCurve> curve( KeyframedFilterAnimationCurve::Create()); FilterOperations operations1; @@ -60,7 +60,7 @@ } // Tests that a filter animation with three keyframes works as expected. -TEST(KeyframedAnimationCurveTest, ThreeFilterKeyframe) { +TEST(FilterAnimationCurveTest, ThreeFilterKeyframe) { std::unique_ptr<KeyframedFilterAnimationCurve> curve( KeyframedFilterAnimationCurve::Create()); FilterOperations operations1; @@ -86,7 +86,7 @@ // Tests that a filter animation with multiple keys at a given time works // sanely. -TEST(KeyframedAnimationCurveTest, RepeatedFilterKeyTimes) { +TEST(FilterAnimationCurveTest, RepeatedFilterKeyTimes) { std::unique_ptr<KeyframedFilterAnimationCurve> curve( KeyframedFilterAnimationCurve::Create()); // A step function.
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index 39a1e344..8dca5f0 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -198,6 +198,7 @@ "//chrome/browser/password_check/android:java_resources", "//chrome/browser/signin/services/android:java_resources", "//chrome/browser/signin/ui/android:java_resources", + "//chrome/browser/tab:java_resources", "//chrome/browser/ui/android/appmenu:java_resources", "//chrome/browser/ui/android/favicon:java_resources", "//chrome/browser/ui/android/strings:ui_strings_grd", @@ -584,8 +585,6 @@ "//components/feed/core/v2:feedv2_enums_java", "//components/ntp_tiles:ntp_tiles_enums_java", "//components/offline_pages/core:offline_page_model_enums_java", - "//components/search_engines:search_engine_type_java", - "//components/ui_metrics:ui_metrics_enums_java", "//net:effective_connection_type_java", ] @@ -706,6 +705,7 @@ "//chrome/browser/preferences:jni_headers", "//chrome/browser/privacy:jni_headers", "//chrome/browser/profiles/android:jni_headers", + "//chrome/browser/search_engines/android:jni_headers", "//chrome/browser/tab:jni_headers", "//chrome/browser/touch_to_fill/android:jni_headers", "//chrome/browser/ui/android/favicon:jni_headers", @@ -3492,7 +3492,6 @@ "java/src/org/chromium/chrome/browser/safe_browsing/SafeBrowsingPasswordReuseDialogBridge.java", "java/src/org/chromium/chrome/browser/safe_browsing/SafeBrowsingReferringAppBridge.java", "java/src/org/chromium/chrome/browser/safe_browsing/SafeBrowsingSettingsLauncher.java", - "java/src/org/chromium/chrome/browser/search_engines/TemplateUrlServiceFactory.java", "java/src/org/chromium/chrome/browser/sharing/SharingJNIBridge.java", "java/src/org/chromium/chrome/browser/sharing/SharingServiceProxy.java", "java/src/org/chromium/chrome/browser/sharing/click_to_call/ClickToCallMessageHandler.java", @@ -3526,6 +3525,7 @@ "java/src/org/chromium/chrome/browser/webapps/WebappRegistry.java", "java/src/org/chromium/chrome/browser/webauth/AuthenticatorImpl.java", "java/src/org/chromium/chrome/browser/webauth/Fido2Helper.java", + "java/src/org/chromium/chrome/browser/webauth/IsUvpaaHelper.java", ] # Used for testing only, should not be shipped to end users.
diff --git a/chrome/android/chrome_java_resources.gni b/chrome/android/chrome_java_resources.gni index 7b624d60f..bdfb503 100644 --- a/chrome/android/chrome_java_resources.gni +++ b/chrome/android/chrome_java_resources.gni
@@ -101,7 +101,6 @@ "java/res/drawable-hdpi/progress_bar_background.9.png", "java/res/drawable-hdpi/progress_bar_foreground.9.png", "java/res/drawable-hdpi/reader_mode_prefs_icon.png", - "java/res/drawable-hdpi/sad_tab.png", "java/res/drawable-hdpi/safetytip_shield.png", "java/res/drawable-hdpi/shared_clipboard_40dp.png", "java/res/drawable-hdpi/shortcut_incognito.png", @@ -229,7 +228,6 @@ "java/res/drawable-mdpi/progress_bar_background.9.png", "java/res/drawable-mdpi/progress_bar_foreground.9.png", "java/res/drawable-mdpi/reader_mode_prefs_icon.png", - "java/res/drawable-mdpi/sad_tab.png", "java/res/drawable-mdpi/safetytip_shield.png", "java/res/drawable-mdpi/shared_clipboard_40dp.png", "java/res/drawable-mdpi/shortcut_incognito.png", @@ -345,7 +343,6 @@ "java/res/drawable-xhdpi/progress_bar_background.9.png", "java/res/drawable-xhdpi/progress_bar_foreground.9.png", "java/res/drawable-xhdpi/reader_mode_prefs_icon.png", - "java/res/drawable-xhdpi/sad_tab.png", "java/res/drawable-xhdpi/safetytip_shield.png", "java/res/drawable-xhdpi/shared_clipboard_40dp.png", "java/res/drawable-xhdpi/shortcut_incognito.png", @@ -439,7 +436,6 @@ "java/res/drawable-xxhdpi/progress_bar_background.9.png", "java/res/drawable-xxhdpi/progress_bar_foreground.9.png", "java/res/drawable-xxhdpi/reader_mode_prefs_icon.png", - "java/res/drawable-xxhdpi/sad_tab.png", "java/res/drawable-xxhdpi/safetytip_shield.png", "java/res/drawable-xxhdpi/shared_clipboard_40dp.png", "java/res/drawable-xxhdpi/shortcut_incognito.png", @@ -530,7 +526,6 @@ "java/res/drawable-xxxhdpi/preview_pin_round.png", "java/res/drawable-xxxhdpi/progress_bar_background.9.png", "java/res/drawable-xxxhdpi/progress_bar_foreground.9.png", - "java/res/drawable-xxxhdpi/sad_tab.png", "java/res/drawable-xxxhdpi/safetytip_shield.png", "java/res/drawable-xxxhdpi/shared_clipboard_40dp.png", "java/res/drawable-xxxhdpi/shortcut_incognito.png", @@ -839,10 +834,7 @@ "java/res/layout/revamped_context_menu_header.xml", "java/res/layout/revamped_context_menu_row.xml", "java/res/layout/revamped_context_menu_share_row.xml", - "java/res/layout/sad_tab.xml", "java/res/layout/search_activity.xml", - "java/res/layout/search_engine.xml", - "java/res/layout/search_engine_recent_title.xml", "java/res/layout/search_widget_template.xml", "java/res/layout/send_tab_to_self_device_picker_item.xml", "java/res/layout/send_tab_to_self_device_picker_list.xml",
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni index 394ee199..85c54ca 100644 --- a/chrome/android/chrome_java_sources.gni +++ b/chrome/android/chrome_java_sources.gni
@@ -1192,11 +1192,6 @@ "java/src/org/chromium/chrome/browser/safe_browsing/SafeBrowsingReferringAppBridge.java", "java/src/org/chromium/chrome/browser/safe_browsing/SafeBrowsingSettingsLauncher.java", "java/src/org/chromium/chrome/browser/safety_check/SafetyCheckUpdatesDelegateImpl.java", - "java/src/org/chromium/chrome/browser/search_engines/SearchEngineChoiceMetrics.java", - "java/src/org/chromium/chrome/browser/search_engines/SearchEngineChoiceNotification.java", - "java/src/org/chromium/chrome/browser/search_engines/TemplateUrlServiceFactory.java", - "java/src/org/chromium/chrome/browser/search_engines/settings/SearchEngineAdapter.java", - "java/src/org/chromium/chrome/browser/search_engines/settings/SearchEngineSettings.java", "java/src/org/chromium/chrome/browser/searchwidget/SearchActivity.java", "java/src/org/chromium/chrome/browser/searchwidget/SearchActivityLocationBarLayout.java", "java/src/org/chromium/chrome/browser/searchwidget/SearchBoxDataProvider.java", @@ -1300,8 +1295,6 @@ "java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateClientImpl.java", "java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateTabHelper.java", "java/src/org/chromium/chrome/browser/tab/RedirectHandlerTabHelper.java", - "java/src/org/chromium/chrome/browser/tab/SadTab.java", - "java/src/org/chromium/chrome/browser/tab/SadTabView.java", "java/src/org/chromium/chrome/browser/tab/TabAssociatedApp.java", "java/src/org/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper.java", "java/src/org/chromium/chrome/browser/tab/TabBrowserControlsOffsetHelper.java", @@ -1456,6 +1449,7 @@ "java/src/org/chromium/chrome/browser/webauth/Fido2Helper.java", "java/src/org/chromium/chrome/browser/webauth/FidoErrorResponseCallback.java", "java/src/org/chromium/chrome/browser/webauth/GetAssertionResponseCallback.java", + "java/src/org/chromium/chrome/browser/webauth/IsUvpaaHelper.java", "java/src/org/chromium/chrome/browser/webauth/IsUvpaaResponseCallback.java", "java/src/org/chromium/chrome/browser/webauth/MakeCredentialResponseCallback.java", "java/src/org/chromium/chrome/browser/webauth/authenticator/CableAuthenticatorActivity.java",
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java index 37460392..d8ded71f 100644 --- a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java +++ b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java
@@ -60,6 +60,7 @@ import androidx.annotation.Nullable; import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.test.espresso.Espresso; import androidx.test.espresso.NoMatchingViewException; @@ -285,6 +286,28 @@ @Test @MediumTest + @CommandLineFlags.Add({BASE_PARAMS}) + public void testSwitchTabModel_ScrollToSelectedTab() throws IOException { + ChromeTabbedActivity cta = mActivityTestRule.getActivity(); + prepareTabs(10, 0, "about:blank"); + assertEquals(9, cta.getCurrentTabModel().index()); + createTabs(cta, true, 1); + CriteriaHelper.pollUiThread(() -> cta.getCurrentTabModel().isIncognito()); + enterTabSwitcher(cta); + switchTabModel(cta, false); + TabUiTestHelper.verifyAllTabsHaveThumbnail(cta.getCurrentTabModel()); + // Make sure the grid tab switcher is scrolled down to show the selected tab. + onView(withId(R.id.tab_list_view)).check((v, noMatchException) -> { + if (noMatchException != null) throw noMatchException; + assertTrue(v instanceof RecyclerView); + LinearLayoutManager layoutManager = + (LinearLayoutManager) ((RecyclerView) v).getLayoutManager(); + assertEquals(9, layoutManager.findLastVisibleItemPosition()); + }); + } + + @Test + @MediumTest @Feature({"RenderTest"}) // clang-format off @CommandLineFlags.Add({BASE_PARAMS})
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTab.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTab.java index 2ba0660..41bd97f6 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTab.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTab.java
@@ -200,6 +200,17 @@ } /** + * @return The timestamp of the {@link PseudoTab}. + */ + public long getTimestampMillis() { + if (mTab != null && mTab.get() != null && mTab.get().isInitialized()) { + return CriticalPersistedTabData.from(mTab.get()).getTimestampMillis(); + } + assert mTabId != null; + return TabAttributeCache.getTimestampMillis(mTabId); + } + + /** * @return Whether the {@link PseudoTab} is in the Incognito mode. */ public boolean isIncognito() { @@ -209,18 +220,6 @@ } /** - * @return {@link Tab#getTimestampMillis()} of the underlying real {@link Tab} - */ - public long getTimestampMillis() { - assert mTab != null - && mTab.get() != null : "getTimestampMillis can only be used with real tabs"; - if (!mTab.get().isInitialized()) { - return CriticalPersistedTabData.INVALID_TIMESTAMP; - } - return CriticalPersistedTabData.from(mTab.get()).getTimestampMillis(); - } - - /** * @return Whether an underlying real {@link Tab} is available. */ public boolean hasRealTab() {
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/pseudotab/TabAttributeCache.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/pseudotab/TabAttributeCache.java index 287e84c..ba1e240 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/pseudotab/TabAttributeCache.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/pseudotab/TabAttributeCache.java
@@ -84,6 +84,13 @@ } @Override + public void onTimestampChanged(Tab tab, long timestampMillis) { + if (tab.isIncognito()) return; + assert timestampMillis == CriticalPersistedTabData.from(tab).getTimestampMillis(); + cacheTimestampMillis(tab.getId(), timestampMillis); + } + + @Override public void onDidFinishNavigation(Tab tab, NavigationHandle navigationHandle) { if (tab.isIncognito()) return; if (!navigationHandle.isInMainFrame()) return; @@ -103,6 +110,7 @@ .remove(getUrlKey(id)) .remove(getTitleKey(id)) .remove(getRootIdKey(id)) + .remove(getTimestampMillisKey(id)) .remove(getLastSearchTermKey(id)) .apply(); } @@ -120,6 +128,8 @@ cacheUrl(tab.getId(), tab.getUrlString()); cacheTitle(tab.getId(), tab.getTitle()); cacheRootId(tab.getId(), CriticalPersistedTabData.from(tab).getRootId()); + cacheTimestampMillis( + tab.getId(), CriticalPersistedTabData.from(tab).getTimestampMillis()); } Tab currentTab = mTabModelSelector.getCurrentTab(); if (currentTab != null) cacheLastSearchTerm(currentTab); @@ -209,6 +219,34 @@ cacheRootId(id, rootId); } + private static String getTimestampMillisKey(int id) { + return id + "_timestampMillis"; + } + + /** + * Get the timestamp of a {@link PseudoTab}. + * @param id The ID of the {@link PseudoTab}. + * @return The timestamp + */ + public static long getTimestampMillis(int id) { + return getSharedPreferences().getLong( + getTimestampMillisKey(id), CriticalPersistedTabData.INVALID_TIMESTAMP); + } + + private static void cacheTimestampMillis(int id, long timestampMillis) { + getSharedPreferences().edit().putLong(getTimestampMillisKey(id), timestampMillis).apply(); + } + + /** + * Set the timestamp for a {@link PseudoTab}. + * @param id The ID of the {@link PseudoTab}. + * @param timestampMillis The timestamp + */ + @VisibleForTesting + public static void setTimestampMillisForTesting(int id, long timestampMillis) { + cacheTimestampMillis(id, timestampMillis); + } + private static String getLastSearchTermKey(int id) { return id + "_last_search_term"; }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java index b442f2d3..f65163a 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java
@@ -263,6 +263,7 @@ if (newModel.isIncognito() && newModel.getCount() == 0 && oldModel.getCount() > 0) { oldModel.getTabAt(oldModel.index()).hide(TabHidingType.CHANGED_TABS); } + setInitialScrollIndexOffset(); } }; mTabModelSelector.addObserver(mTabModelSelectorObserver); @@ -804,9 +805,6 @@ * @return whether tabs should show in MRU order */ static boolean isShowingTabsInMRUOrder() { - // TODO(crbug.com/1076449): Support MRU mode in Instant start. - if (CachedFeatureFlags.isEnabled(ChromeFeatureList.INSTANT_START)) return false; - String feature = StartSurfaceConfiguration.START_SURFACE_VARIATION.getValue(); return TextUtils.equals(feature, "twopanes"); }
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_az.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_az.xtb index 0603b2f..09873e5 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_az.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_az.xtb
@@ -21,6 +21,7 @@ <translation id="3291470810748040983">Qiymət endirildikdə açıq tabda bildiriş alacaqsınız</translation> <translation id="3328308545011660196">Təklif: <ph name="NUMBER_OF_TABS" /> tab əlaqəli görünür. Onlar qruplaşdırılsın?</translation> <translation id="3819916404117584598">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> tabını yığcamlaşdırın.}other{<ph name="TABS_COUNT_MANY" /> tab olan <ph name="TITLE_OF_GROUP" /> tab qrupunu yığcamlaşdırın.}}</translation> +<translation id="3882834874697329510">Qiymət endirildikdə açıq tabda bildiriş almaq üçün Ayarlarda bildirişləri aktiv edin.</translation> <translation id="3940195383040445971">Tablarda qiymətləri izləyin</translation> <translation id="3996880007329611795">Bildiriş alın</translation> <translation id="4133493477912226187"><ph name="NUMBER_OF_TABS" /> tab əlaqəli görünür. Onlar qruplaşdırılsın?</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_be.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_be.xtb index aed6d4be..dc32011 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_be.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_be.xtb
@@ -21,6 +21,7 @@ <translation id="3291470810748040983">Вы атрымаеце абвестку, калі цана на прадукт на адкрытай укладцы знізіцца</translation> <translation id="3328308545011660196">Прапанова: здаецца, гэтыя ўкладкі (<ph name="NUMBER_OF_TABS" />) звязаныя паміж сабой. Згрупаваць іх?</translation> <translation id="3819916404117584598">{TABS_COUNT,plural, =1{Згарнуць <ph name="TABS_COUNT_ONE" /> укладку.}one{Згарнуць групу "<ph name="TITLE_OF_GROUP" />" з <ph name="TABS_COUNT_MANY" /> укладкай.}few{Згарнуць групу "<ph name="TITLE_OF_GROUP" />" з <ph name="TABS_COUNT_MANY" /> укладкамі.}many{Згарнуць групу "<ph name="TITLE_OF_GROUP" />" з <ph name="TABS_COUNT_MANY" /> укладкамі.}other{Згарнуць групу "<ph name="TITLE_OF_GROUP" />" з <ph name="TABS_COUNT_MANY" /> укладкі.}}</translation> +<translation id="3882834874697329510">Каб атрымліваць абвесткі, калі цэны на прадукты на адкрытых укладках зніжаюцца, уключыце апавяшчэнні ў Наладах.</translation> <translation id="3940195383040445971">Адсочванне цэн на ўкладках</translation> <translation id="3996880007329611795">Атрымліваць абвесткі</translation> <translation id="4133493477912226187">Здаецца, гэтыя ўкладкі (<ph name="NUMBER_OF_TABS" />) звязаныя паміж сабой. Згрупаваць іх?</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_et.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_et.xtb index 966d1b1..f55eb603 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_et.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_et.xtb
@@ -21,6 +21,7 @@ <translation id="3291470810748040983">Kui avatud vahelehel on soodsam hind, saate selle kohta märguande</translation> <translation id="3328308545011660196">Soovitus: <ph name="NUMBER_OF_TABS" /> vahelehte näivad olevat seotud. Kas soovite need grupeerida?</translation> <translation id="3819916404117584598">{TABS_COUNT,plural, =1{Ahenda <ph name="TABS_COUNT_ONE" /> vaheleht.}other{Ahenda <ph name="TABS_COUNT_MANY" /> vahelehega vahelehegrupp <ph name="TITLE_OF_GROUP" />.}}</translation> +<translation id="3882834874697329510">Kui soovite avatud vahelehel oleva soodsama hinna kohta märguannet saada, lülitage märguanded seadetes sisse.</translation> <translation id="3940195383040445971">Jälgige vahelehtedel hindu</translation> <translation id="3996880007329611795">Hankige märguandeid</translation> <translation id="4133493477912226187"><ph name="NUMBER_OF_TABS" /> vahelehte näivad olevat seotud. Kas soovite need grupeerida?</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_eu.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_eu.xtb index e9d8ed32a..3394dd12 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_eu.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_eu.xtb
@@ -21,6 +21,7 @@ <translation id="3291470810748040983">Alerta bat jasoko duzu irekita daukazun fitxa bateko produkturen baten prezioa jaisten denean</translation> <translation id="3328308545011660196">Iradokizuna: <ph name="NUMBER_OF_TABS" /> fitxa erlazionatuta daude. Taldekatu nahi al dituzu?</translation> <translation id="3819916404117584598">{TABS_COUNT,plural, =1{Tolestu <ph name="TABS_COUNT_ONE" /> fitxa.}other{Tolestu <ph name="TABS_COUNT_MANY" /> fitxa dituen <ph name="TITLE_OF_GROUP" /> fitxa taldea.}}</translation> +<translation id="3882834874697329510">Irekita daukazun fitxa bateko produkturen baten prezioa jaisten denean alerta bat jaso nahi baduzu, aktibatu jakinarazpenak Ezarpenak atalean.</translation> <translation id="3940195383040445971">Egin prezioen jarraipena fitxetan</translation> <translation id="3996880007329611795">Jaso alertak</translation> <translation id="4133493477912226187"><ph name="NUMBER_OF_TABS" /> fitxa erlazionatuta daude. Taldekatu nahi al dituzu?</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fi.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fi.xtb index 20855d98..d57a4c88 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fi.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fi.xtb
@@ -21,6 +21,7 @@ <translation id="3291470810748040983">Saat ilmoituksen, kun avoimella välilehdellä oleva hinta laskee</translation> <translation id="3328308545011660196">Ehdotus: <ph name="NUMBER_OF_TABS" /> välilehteä vaikuttaa liittyvän toisiinsa. Lisätäänkö ne ryhmäksi?</translation> <translation id="3819916404117584598">{TABS_COUNT,plural, =1{Tiivistä <ph name="TABS_COUNT_ONE" /> välilehti.}other{Tiivistä <ph name="TITLE_OF_GROUP" /> välilehtiryhmä, jossa on <ph name="TABS_COUNT_MANY" /> välilehteä.}}</translation> +<translation id="3882834874697329510">Jos haluat ilmoituksen, kun avoimella välilehdellä oleva hinta laskee, laita ilmoitukset päälle asetuksista.</translation> <translation id="3940195383040445971">Seuraa hintoja välilehdillä</translation> <translation id="3996880007329611795">Haluan ilmoituksia</translation> <translation id="4133493477912226187"><ph name="NUMBER_OF_TABS" /> välilehteä vaikuttaa liittyvän toisiinsa. Lisätäänkö ne ryhmäksi?</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fr-CA.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fr-CA.xtb index 712896c..0a57b6f 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fr-CA.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fr-CA.xtb
@@ -21,6 +21,7 @@ <translation id="3291470810748040983">Vous recevrez une alerte si un meilleur prix est détecté dans un onglet ouvert</translation> <translation id="3328308545011660196">Suggestion : <ph name="NUMBER_OF_TABS" /> onglets semblent liés. Voulez-vous les regrouper?</translation> <translation id="3819916404117584598">{TABS_COUNT,plural, =1{Réduire <ph name="TABS_COUNT_ONE" /> onglet.}one{Réduire le groupe d'onglets <ph name="TITLE_OF_GROUP" /> qui contient <ph name="TABS_COUNT_MANY" /> onglet.}other{Réduire le groupe d'onglets <ph name="TITLE_OF_GROUP" /> qui contient <ph name="TABS_COUNT_MANY" /> onglets.}}</translation> +<translation id="3882834874697329510">Pour recevoir une alerte si un meilleur prix est détecté dans un onglet ouvert, accédez aux paramètres, puis activez les notifications.</translation> <translation id="3940195383040445971">Suivi des prix dans des onglets</translation> <translation id="3996880007329611795">Recevoir des notifications</translation> <translation id="4133493477912226187"><ph name="NUMBER_OF_TABS" /> onglets semblent liés. Voulez-vous les regrouper?</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_gu.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_gu.xtb index cb3cab7c..058bded 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_gu.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_gu.xtb
@@ -21,6 +21,7 @@ <translation id="3291470810748040983">ખોલવામાં આવેલી ટૅબમાં જ્યારે કોઈ આઇટમની કિંમત ઓછી થશે, ત્યારે તમને અલર્ટ મળશે</translation> <translation id="3328308545011660196">સૂચન: <ph name="NUMBER_OF_TABS" /> ટૅબ સંબંધિત હોય તેમ જણાય છે. તેમનું ગ્રૂપ બનાવીએ?</translation> <translation id="3819916404117584598">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> ટૅબ નાની કરો.}one{<ph name="TABS_COUNT_MANY" /> ટૅબ ધરાવતા <ph name="TITLE_OF_GROUP" /> ટૅબ ગ્રૂપને નાનું કરો.}other{<ph name="TABS_COUNT_MANY" /> ટૅબ ધરાવતા <ph name="TITLE_OF_GROUP" /> ટૅબ ગ્રૂપને નાનું કરો.}}</translation> +<translation id="3882834874697329510">ખોલવામાં આવેલી ટૅબમાં જ્યારે કોઈ આઇટમની કિંમત ઓછી થાય ત્યારે અલર્ટ મેળવવા માટે, સેટિંગમાં જઈને નોટિફિકેશન ચાલુ કરો.</translation> <translation id="3940195383040445971">ટૅબ પર કિંમત ટ્રૅક કરો</translation> <translation id="3996880007329611795">નોટિફિકેશન મેળવો</translation> <translation id="4133493477912226187"><ph name="NUMBER_OF_TABS" /> ટૅબ સંબંધિત હોય તેમ જણાય છે. તેમનું ગ્રૂપ બનાવીએ?</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hi.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hi.xtb index 9f34d26..7876e9f 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hi.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hi.xtb
@@ -21,6 +21,7 @@ <translation id="3291470810748040983">खोले गए टैब में मौजूद किसी आइटम की कीमत में कमी होने पर आपको सूचना मिलेगी</translation> <translation id="3328308545011660196">सुझाव: ऐसा लगता है कि <ph name="NUMBER_OF_TABS" /> टैब एक-दूसरे से मिलते-जुलते हैं. इनका ग्रुप बनाएं?</translation> <translation id="3819916404117584598">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> टैब छोटा करें.}one{<ph name="TABS_COUNT_MANY" /> टैब वाले <ph name="TITLE_OF_GROUP" /> टैब ग्रुप को छोटा करें.}other{<ph name="TABS_COUNT_MANY" /> टैब वाले <ph name="TITLE_OF_GROUP" /> टैब ग्रुप को छोटा करें.}}</translation> +<translation id="3882834874697329510">खोले गए टैब में मौजूद किसी आइटम की कीमत कम होने पर सूचना पाने के लिए, सेटिंग में जाकर सूचनाएं चालू करें.</translation> <translation id="3940195383040445971">टैब पर कीमतों को ट्रैक करें</translation> <translation id="3996880007329611795">सूचनाएं पाएं</translation> <translation id="4133493477912226187">ऐसा लगता है कि <ph name="NUMBER_OF_TABS" /> टैब एक-दूसरे से मिलते-जुलते हैं. इनका ग्रुप बनाएं?</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_iw.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_iw.xtb index a06bd57..d02d0ade 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_iw.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_iw.xtb
@@ -21,6 +21,7 @@ <translation id="3291470810748040983">תתקבל התראה כשתזוהה הנחה בכרטיסייה פתוחה</translation> <translation id="3328308545011660196">הצעה: יש <ph name="NUMBER_OF_TABS" /> כרטיסיות שנראות קשורות. לקבץ אותן?</translation> <translation id="3819916404117584598">{TABS_COUNT,plural, =1{כיווץ כרטיסייה אחת (<ph name="TABS_COUNT_ONE" />).}two{כיווץ של קבוצת הכרטיסיות <ph name="TITLE_OF_GROUP" /> שיש בה <ph name="TABS_COUNT_MANY" /> כרטיסיות.}many{כיווץ של קבוצת הכרטיסיות <ph name="TITLE_OF_GROUP" /> שיש בה <ph name="TABS_COUNT_MANY" /> כרטיסיות.}other{כיווץ של קבוצת הכרטיסיות <ph name="TITLE_OF_GROUP" /> שיש בה <ph name="TABS_COUNT_MANY" /> כרטיסיות.}}</translation> +<translation id="3882834874697329510">כדי לקבל התראה כשתזוהה הנחה בכרטיסייה פתוחה, יש להפעיל את ההתראות בהגדרות.</translation> <translation id="3940195383040445971">מעקב אחר המחירים בכרטיסיות</translation> <translation id="3996880007329611795">לקבלת התראות</translation> <translation id="4133493477912226187">יש <ph name="NUMBER_OF_TABS" /> כרטיסיות שנראות קשורות. לקבץ אותן?</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kk.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kk.xtb index adaff3c1..16f7deb 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kk.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kk.xtb
@@ -21,6 +21,7 @@ <translation id="3291470810748040983">Баға төмендеген кезде жаңа қойындыға хабарландыру келеді.</translation> <translation id="3328308545011660196">Ұсыныс: <ph name="NUMBER_OF_TABS" /> қойынды өзара қатысты сияқты. Олар топтастырылсын ба?</translation> <translation id="3819916404117584598">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> қойындысын жию.}other{<ph name="TABS_COUNT_MANY" /> қойындысы бар <ph name="TITLE_OF_GROUP" /> қойындылар тобын жию.}}</translation> +<translation id="3882834874697329510">Ашық қойындыда төмен баға болған кезде хабарландыру алу үшін, "Параметрлер" бөлімінен хабарландыруларды қосыңыз.</translation> <translation id="3940195383040445971">Бағаны қойындыларда бақылау</translation> <translation id="3996880007329611795">Хабарландыру алу</translation> <translation id="4133493477912226187"><ph name="NUMBER_OF_TABS" /> қойынды өзара қатысты сияқты. Олар топтастырылсын ба?</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kn.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kn.xtb index 83041214..5985f43 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kn.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kn.xtb
@@ -21,6 +21,7 @@ <translation id="3291470810748040983">ತೆರೆದ ಟ್ಯಾಬ್ನಲ್ಲಿ ಬೆಲೆ ಕಡಿಮೆಯಿದ್ದಾಗ ನೀವು ಎಚ್ಚರಿಕೆಯನ್ನು ಪಡೆಯುತ್ತೀರಿ</translation> <translation id="3328308545011660196">ಸಲಹೆ: <ph name="NUMBER_OF_TABS" /> ಟ್ಯಾಬ್ಗಳು ಸಂಬಂಧಿಸಿರುವ ಹಾಗೆ ಕಾಣುತ್ತಿದೆ. ಅವುಗಳನ್ನು ಗುಂಪು ಮಾಡುವುದೇ?</translation> <translation id="3819916404117584598">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> ಟ್ಯಾಬ್ ಅನ್ನು ಕುಗ್ಗಿಸಿ.}one{<ph name="TABS_COUNT_MANY" /> ಟ್ಯಾಬ್ಗಳ ಜೊತೆಗೆ <ph name="TITLE_OF_GROUP" /> ಟ್ಯಾಬ್ ಗುಂಪನ್ನು ಕುಗ್ಗಿಸಿ.}other{<ph name="TABS_COUNT_MANY" /> ಟ್ಯಾಬ್ಗಳ ಜೊತೆಗೆ <ph name="TITLE_OF_GROUP" /> ಟ್ಯಾಬ್ ಗುಂಪನ್ನು ಕುಗ್ಗಿಸಿ.}}</translation> +<translation id="3882834874697329510">ತೆರೆದ ಟ್ಯಾಬ್ನಲ್ಲಿ ಬೆಲೆ ಕಡಿಮೆಯಿದ್ದಾಗ ನೀವು ಎಚ್ಚರಿಕೆಯನ್ನು ಪಡೆಯಲು, ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಅಧಿಸೂಚನೆಗಳನ್ನು ತೆರೆಯಿರಿ.</translation> <translation id="3940195383040445971">ಟ್ಯಾಬ್ಗಳಲ್ಲಿ ಬೆಲೆಗಳನ್ನು ಟ್ರ್ಯಾಕ್ ಮಾಡಿ</translation> <translation id="3996880007329611795">ಸೂಚನೆ ಪಡೆಯಿರಿ</translation> <translation id="4133493477912226187"><ph name="NUMBER_OF_TABS" /> ಟ್ಯಾಬ್ಗಳು ಸಂಬಂಧಿಸಿರುವ ಹಾಗೆ ಕಾಣುತ್ತಿದೆ. ಅವುಗಳನ್ನು ಗುಂಪು ಮಾಡುವುದೇ?</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ko.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ko.xtb index a4d8dbb..4e8345d 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ko.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ko.xtb
@@ -21,6 +21,7 @@ <translation id="3291470810748040983">열려 있는 탭에 더 낮은 가격이 있으면 알림이 전송됩니다.</translation> <translation id="3328308545011660196">제안: 탭 <ph name="NUMBER_OF_TABS" />개가 서로 관련된 것으로 보입니다. 그룹화할까요?</translation> <translation id="3819916404117584598">{TABS_COUNT,plural, =1{탭 <ph name="TABS_COUNT_ONE" />개를 접습니다.}other{탭 <ph name="TABS_COUNT_MANY" />개가 포함된 <ph name="TITLE_OF_GROUP" /> 탭 그룹을 접습니다.}}</translation> +<translation id="3882834874697329510">열린 탭에서 더 낮은 가격이 발견되었을 때 알림을 받으려면 설정에서 알림을 사용 설정하세요.</translation> <translation id="3940195383040445971">탭에서 가격 추적</translation> <translation id="3996880007329611795">알림 받기</translation> <translation id="4133493477912226187">탭 <ph name="NUMBER_OF_TABS" />개가 서로 관련된 것으로 보입니다. 그룹화할까요?</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ky.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ky.xtb index c4c39a7..58780b9d 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ky.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ky.xtb
@@ -21,6 +21,7 @@ <translation id="3291470810748040983">Төмөндөгөн баа тууралуу эскертүүнү ачылган өтмөктө көрөсүз</translation> <translation id="3328308545011660196">Сунуш: <ph name="NUMBER_OF_TABS" /> өтмөк окшош окшойт. Алар топко бириктирилсинби?</translation> <translation id="3819916404117584598">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> өтмөк жыйыштырылсын.}other{<ph name="TITLE_OF_GROUP" /> өтмөктөр тобундагы <ph name="TABS_COUNT_MANY" /> өтмөк жыйыштырылсын.}}</translation> +<translation id="3882834874697329510">Төмөндөгөн баа тууралуу эскертүүнү ачылган өтмөктө көрүү үчүн Жөндөөлөрдөн билдирмелерди күйгүзүңүз.</translation> <translation id="3940195383040445971">Бааларга өтмөктөрдө көз салуу</translation> <translation id="3996880007329611795">Ооба</translation> <translation id="4133493477912226187"><ph name="NUMBER_OF_TABS" /> өтмөк окшош окшойт. Алар топко бириктирилсинби?</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lo.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lo.xtb index e42c0e4..5068c56 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lo.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lo.xtb
@@ -21,6 +21,7 @@ <translation id="3291470810748040983">ທ່ານຈະໄດ້ຮັບແຈ້ງເຕືອນເມື່ອມີລາຄາຕໍ່າກວ່າໃນແຖບທີ່ເປີດຢູ່</translation> <translation id="3328308545011660196">ຄຳແນະນຳ: ເບິ່ງຄືວ່າມີ <ph name="NUMBER_OF_TABS" /> ແຖບທີ່ກ່ຽວຂ້ອງກັນ. ຈັດກຸ່ມພວກມັນບໍ?</translation> <translation id="3819916404117584598">{TABS_COUNT,plural, =1{ຫຍໍ້ <ph name="TABS_COUNT_ONE" /> ແຖບລົງ.}other{ຫຍໍ້ກຸ່ມແຖບ <ph name="TITLE_OF_GROUP" /> ທີ່ມີ <ph name="TABS_COUNT_MANY" /> ແຖບລົງ.}}</translation> +<translation id="3882834874697329510">ໃຫ້ເປີດໃຊ້ການແຈ້ງເຕືອນໃນການຕັ້ງຄ່າເພື່ອຮັບການແຈ້ງເຕືອນເມື່ອມີລາຄາທີ່ຕ່ຳກວ່າໃນແຖບໃດໜຶ່ງທີ່ເປີດໄວ້.</translation> <translation id="3940195383040445971">ຕິດຕາມລາຄາໃນແຖບ</translation> <translation id="3996880007329611795">ຮັບການແຈ້ງເຕືອນ</translation> <translation id="4133493477912226187">ເບິ່ງຄືວ່າມີ <ph name="NUMBER_OF_TABS" /> ແຖບກ່ຽວຂ້ອງກັນ. ຈັດກຸ່ມພວກມັນບໍ?</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lt.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lt.xtb index 2a53397..4b3a656d 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lt.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lt.xtb
@@ -21,6 +21,7 @@ <translation id="3291470810748040983">Gausite įspėjimą, kai atidarytame skirtuke bus sumažinta kaina</translation> <translation id="3328308545011660196">Pasiūlymas: skirtukai (iš viso: <ph name="NUMBER_OF_TABS" />) atrodo susiję. Grupuoti juos?</translation> <translation id="3819916404117584598">{TABS_COUNT,plural, =1{Sutraukti <ph name="TABS_COUNT_ONE" /> skirtuką.}one{Sutraukti skirtukų grupę „<ph name="TITLE_OF_GROUP" />“, kurioje yra <ph name="TABS_COUNT_MANY" /> skirtukas.}few{Sutraukti skirtukų grupę „<ph name="TITLE_OF_GROUP" />“, kurioje yra <ph name="TABS_COUNT_MANY" /> skirtukai.}many{Sutraukti skirtukų grupę „<ph name="TITLE_OF_GROUP" />“, kurioje yra <ph name="TABS_COUNT_MANY" /> skirtuko.}other{Sutraukti skirtukų grupę „<ph name="TITLE_OF_GROUP" />“, kurioje yra <ph name="TABS_COUNT_MANY" /> skirtukų.}}</translation> +<translation id="3882834874697329510">Norėdami gauti įspėjimą, kai atidarytame skirtuke bus sumažinta kaina, įjunkite pranešimus Nustatymų skiltyje.</translation> <translation id="3940195383040445971">Stebėti kainas skirtukuose</translation> <translation id="3996880007329611795">Pranešti</translation> <translation id="4133493477912226187">Skirtukai (iš viso: <ph name="NUMBER_OF_TABS" />) atrodo susiję. Grupuoti juos?</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ml.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ml.xtb index de635bd..549d17548 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ml.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ml.xtb
@@ -21,6 +21,7 @@ <translation id="3291470810748040983">തുറന്നിരിക്കുന്ന ടാബിൽ, വിലക്കുറവുള്ളപ്പോൾ നിങ്ങൾക്ക് മുന്നറിയിപ്പ് ലഭിക്കും</translation> <translation id="3328308545011660196">നിർദ്ദേശം: <ph name="NUMBER_OF_TABS" /> ടാബുകൾ സമാനമാണെന്ന് തോന്നുന്നു. അവ ഗ്രൂപ്പ് ചെയ്യണോ?</translation> <translation id="3819916404117584598">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> ടാബ് ചുരുക്കുക.}other{<ph name="TABS_COUNT_MANY" /> ടാബുകളുള്ള <ph name="TITLE_OF_GROUP" /> ടാബ് ഗ്രൂപ്പ് ചുരുക്കുക.}}</translation> +<translation id="3882834874697329510">തുറന്നിരിക്കുന്ന ടാബിൽ വിലക്കുറവുള്ളപ്പോൾ അറിയിപ്പ് ലഭിക്കാൻ ക്രമീകരണത്തിൽ അറിയിപ്പുകൾ ഓണാക്കുക.</translation> <translation id="3940195383040445971">ടാബുകളിൽ നിരക്കുകൾ ട്രാക്ക് ചെയ്യുക</translation> <translation id="3996880007329611795">അറിയിപ്പ് നേടുക</translation> <translation id="4133493477912226187"><ph name="NUMBER_OF_TABS" /> ടാബുകൾ സമാനമാണെന്ന് തോന്നുന്നു. അവ ഗ്രൂപ്പ് ചെയ്യണോ?</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ms.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ms.xtb index 05dadc37..356b02b 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ms.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ms.xtb
@@ -21,6 +21,7 @@ <translation id="3291470810748040983">Anda akan mendapat makluman apabila terdapat harga yang lebih murah dalam tab yang terbuka</translation> <translation id="3328308545011660196">Cadangan: <ph name="NUMBER_OF_TABS" /> tab kelihatan berkaitan. Himpunkan semua tab itu?</translation> <translation id="3819916404117584598">{TABS_COUNT,plural, =1{Runtuhkan <ph name="TABS_COUNT_ONE" /> tab.}other{Runtuhkan kumpulan tab <ph name="TITLE_OF_GROUP" /> dengan <ph name="TABS_COUNT_MANY" /> tab.}}</translation> +<translation id="3882834874697329510">Untuk mendapatkan makluman apabila terdapat harga yang lebih murah dalam tab yang terbuka, hidupkan pemberitahuan dalam Tetapan.</translation> <translation id="3940195383040445971">Jejaki harga pada tab</translation> <translation id="3996880007329611795">Dapatkan pemberitahuan</translation> <translation id="4133493477912226187"><ph name="NUMBER_OF_TABS" /> tab kelihatan berkaitan. Himpunkan semua tab itu?</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_my.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_my.xtb index 4af37e6..69d9537 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_my.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_my.xtb
@@ -21,6 +21,7 @@ <translation id="3291470810748040983">ဖွင့်ထားသောတဘ်တွင် ဈေးကျသွားသည့်အခါ သတိပေးချက် ရရှိပါမည်</translation> <translation id="3328308545011660196">အကြံပြုချက်- တဘ် <ph name="NUMBER_OF_TABS" /> ခုက ဆက်စပ်ပုံပေါ်သည်။ ၎င်းတို့ကို အုပ်စုဖွဲ့မလား။</translation> <translation id="3819916404117584598">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> တဘ်ကို ခေါက်ပါ။}other{တဘ် <ph name="TABS_COUNT_MANY" /> ခုဖြင့် အုပ်စုဖွဲ့ထားသည့် <ph name="TITLE_OF_GROUP" /> တဘ်ကို ပြန်ခေါက်ပါ။}}</translation> +<translation id="3882834874697329510">ဖွင့်ထားသောတဘ်တွင် ဈေးကျသွားသည့်အခါ သတိပေးချက်ရရှိရန် ‘ဆက်တင်များ’ တွင် အကြောင်းကြားချက်များကို ဖွင့်ပါ။</translation> <translation id="3940195383040445971">တဘ်များတွင် ဈေးနှုန်းများစောင့်ကြည့်ရန်</translation> <translation id="3996880007329611795">အကြောင်းကြားချက် ရယူရန်</translation> <translation id="4133493477912226187">တဘ် <ph name="NUMBER_OF_TABS" /> ခုက ဆက်စပ်ပုံပေါ်သည်။ ၎င်းတို့ကို အုပ်စုဖွဲ့မလား။</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_or.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_or.xtb index 5aa8bf2..7655bd5 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_or.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_or.xtb
@@ -21,6 +21,7 @@ <translation id="3291470810748040983">ଖୋଲା ଥିବା ଏକ ଟାବରେ ମୂଲ୍ୟରେ ହ୍ରାସ ହେବାର ସୂଚନା ଉପଲବ୍ଧ ହେଲେ ଆପଣ ଏକ ଆଲର୍ଟ ପାଇବେ</translation> <translation id="3328308545011660196">ପରାମର୍ଶ: <ph name="NUMBER_OF_TABS" />ଟି ଟାବ୍ ସମ୍ବନ୍ଧିତ ଥିଲା ପରି ଜଣାପଡ଼ୁଛି। ସେଗୁଡ଼ିକୁ ଗ୍ରୁପ୍ କରିବେ?</translation> <translation id="3819916404117584598">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" />ଟି ଟାବ୍ ସଙ୍କୁଚିତ କରନ୍ତୁ।}other{<ph name="TITLE_OF_GROUP" />ଟି ଟାବ୍ ଥିବା <ph name="TABS_COUNT_MANY" /> ଟାବ୍ ଗ୍ରୁପକୁ ସଙ୍କୁଚିତ କରନ୍ତୁ।}}</translation> +<translation id="3882834874697329510">ଖୋଲା ଥିବା ଏକ ଟାବରେ କମ୍ ମୂଲ୍ୟ ସମ୍ବନ୍ଧିତ ସୂଚନା ଉପଲବ୍ଧ ହେଲେ ଆଲର୍ଟ ପାଇବାକୁ ସେଟିଂସରେ "ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ" ଚାଲୁ କରନ୍ତୁ।</translation> <translation id="3940195383040445971">ଟାବଗୁଡ଼ିକରେ ମୂଲ୍ୟଗୁଡ଼ିକୁ ଟ୍ରାକ୍ କରନ୍ତୁ</translation> <translation id="3996880007329611795">ସୂଚନା ପାଆନ୍ତୁ</translation> <translation id="4133493477912226187"><ph name="NUMBER_OF_TABS" />ଟି ଟାବ୍ ସମ୍ବନ୍ଧିତ ଥିଲା ପରି ଲାଗୁଛି। ସେଗୁଡ଼ିକୁ ଗ୍ରୁପ୍ କରିବେ?</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ro.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ro.xtb index ae785cb..47a836d1 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ro.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ro.xtb
@@ -21,6 +21,7 @@ <translation id="3291470810748040983">Vei primi o alertă atunci când scade prețul dintr-o filă deschisă.</translation> <translation id="3328308545011660196">Sugestie: <ph name="NUMBER_OF_TABS" /> file par similare. Vrei să le grupezi?</translation> <translation id="3819916404117584598">{TABS_COUNT,plural, =1{Restrânge <ph name="TABS_COUNT_ONE" /> filă.}few{Restrânge grupul de file <ph name="TITLE_OF_GROUP" /> cu <ph name="TABS_COUNT_MANY" /> file.}other{Restrânge grupul de file <ph name="TITLE_OF_GROUP" /> cu <ph name="TABS_COUNT_MANY" /> de file.}}</translation> +<translation id="3882834874697329510">Pentru a primi o alertă atunci când scade prețul dintr-o filă deschisă, activează notificările în Setări.</translation> <translation id="3940195383040445971">Urmărește prețurile din file</translation> <translation id="3996880007329611795">Primește notificări</translation> <translation id="4133493477912226187"><ph name="NUMBER_OF_TABS" /> file par similare. Vrei să le grupezi?</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ru.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ru.xtb index 7b21847..1702357 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ru.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ru.xtb
@@ -21,6 +21,7 @@ <translation id="3291470810748040983">Если цена на открытой вкладке снизится, вы получите оповещение.</translation> <translation id="3328308545011660196">Подсказка: обнаружены похожие вкладки (<ph name="NUMBER_OF_TABS" />). Сгруппировать их?</translation> <translation id="3819916404117584598">{TABS_COUNT,plural, =1{Свернуть <ph name="TABS_COUNT_ONE" /> вкладку.}one{Свернуть группу из <ph name="TABS_COUNT_MANY" /> вкладки под названием "<ph name="TITLE_OF_GROUP" />".}few{Свернуть группу из <ph name="TABS_COUNT_MANY" /> вкладок под названием "<ph name="TITLE_OF_GROUP" />".}many{Свернуть группу из <ph name="TABS_COUNT_MANY" /> вкладок под названием "<ph name="TITLE_OF_GROUP" />".}other{Свернуть группу из <ph name="TABS_COUNT_MANY" /> вкладки под названием "<ph name="TITLE_OF_GROUP" />".}}</translation> +<translation id="3882834874697329510">Чтобы получать оповещения о снижении цены на открытой вкладке, включите уведомления в настройках.</translation> <translation id="3940195383040445971">Отслеживать цены на вкладках</translation> <translation id="3996880007329611795">Получать уведомления</translation> <translation id="4133493477912226187">Обнаружены похожие вкладки (<ph name="NUMBER_OF_TABS" />). Сгруппировать их?</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ta.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ta.xtb index ee10c06..22596f32 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ta.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ta.xtb
@@ -21,6 +21,7 @@ <translation id="3291470810748040983">திறந்திருக்கும் தாவலில் குறைவான விலை இருக்கும்போது விழிப்பூட்டலைப் பெறுவீர்கள்</translation> <translation id="3328308545011660196">பரிந்துரை: <ph name="NUMBER_OF_TABS" /> தாவல்கள் தொடர்புடையவையாகத் தெரிகின்றன. அவற்றைக் குழுவாக்கவா?</translation> <translation id="3819916404117584598">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> தாவலைச் சுருக்கும்.}other{<ph name="TABS_COUNT_MANY" /> தாவல்கள் உள்ள <ph name="TITLE_OF_GROUP" /> தாவல் குழுவைச் சுருக்கும்.}}</translation> +<translation id="3882834874697329510">திறந்திருக்கும் தாவலில் குறைவான விலை இருக்கும்போது விழிப்பூட்டலைப் பெற, அமைப்புகளில் அறிவிப்புகளை இயக்குங்கள்.</translation> <translation id="3940195383040445971">தாவல்களில் விலையைக் கண்காணித்தல்</translation> <translation id="3996880007329611795">அறிவிப்பைப் பெறுக</translation> <translation id="4133493477912226187"><ph name="NUMBER_OF_TABS" /> தாவல்கள் தொடர்புடையவையாகத் தெரிகின்றன. அவற்றைக் குழுவாக்கவா?</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ur.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ur.xtb index 1d77ba1..bf1364b8 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ur.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ur.xtb
@@ -21,6 +21,7 @@ <translation id="3291470810748040983">کھلے ہوئے ٹیب میں قیمت کم ہونے پر آپ کو الرٹ کیا جائے گا</translation> <translation id="3328308545011660196">تجویز: <ph name="NUMBER_OF_TABS" /> ٹیبز متعلقہ معلوم ہوتے ہیں۔ ان کی گروپ بندی کریں؟</translation> <translation id="3819916404117584598">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> ٹیب کو سکیڑیں۔}other{<ph name="TITLE_OF_GROUP" /> ٹیب گروپ کو <ph name="TABS_COUNT_MANY" /> ٹیبز کے ساتھ سکیڑیں۔}}</translation> +<translation id="3882834874697329510">کھلے ہوئے ٹیب میں کم قیمت ہونے پر الرٹ حاصل کرنے کے لئے، ترتیبات میں موجود اطلاعات آن کریں۔</translation> <translation id="3940195383040445971">ٹیبز پر قیمتیں ٹریک کریں</translation> <translation id="3996880007329611795">اطلاع حاصل کریں</translation> <translation id="4133493477912226187"><ph name="NUMBER_OF_TABS" /> ٹیبز متعلقہ معلوم ہوتے ہیں۔ ان کی گروپ بندی کریں؟</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_vi.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_vi.xtb index cb5954a..c651991 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_vi.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_vi.xtb
@@ -21,6 +21,7 @@ <translation id="3291470810748040983">Bạn sẽ nhận được thông báo khi có ưu đãi giảm giá trong một thẻ đang mở</translation> <translation id="3328308545011660196">Đề xuất: <ph name="NUMBER_OF_TABS" /> thẻ có vẻ liên quan đến nhau. Bạn có muốn nhóm các thẻ đó lại không?</translation> <translation id="3819916404117584598">{TABS_COUNT,plural, =1{Thu gọn <ph name="TABS_COUNT_ONE" /> thẻ.}other{Thu gọn nhóm thẻ <ph name="TITLE_OF_GROUP" /> có <ph name="TABS_COUNT_MANY" /> thẻ.}}</translation> +<translation id="3882834874697329510">Để nhận thông báo khi có ưu đãi giảm giá trong một thẻ đang mở, hãy bật thông báo trong phần Cài đặt.</translation> <translation id="3940195383040445971">Theo dõi giá trên thẻ</translation> <translation id="3996880007329611795">Nhận thông báo</translation> <translation id="4133493477912226187"><ph name="NUMBER_OF_TABS" /> thẻ có vẻ liên quan đến nhau. Bạn có muốn nhóm các thẻ đó lại không?</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-HK.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-HK.xtb index 00c0ab6..f870a3b 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-HK.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-HK.xtb
@@ -21,6 +21,7 @@ <translation id="3291470810748040983">當開啟的分頁中有產品降價,您就會收到通知</translation> <translation id="3328308545011660196">建議:似乎有 <ph name="NUMBER_OF_TABS" /> 個相關嘅分頁。要唔要將佢哋分組?</translation> <translation id="3819916404117584598">{TABS_COUNT,plural, =1{收合 <ph name="TABS_COUNT_ONE" /> 個分頁。}other{收合有 <ph name="TABS_COUNT_MANY" /> 個分頁嘅「<ph name="TITLE_OF_GROUP" />」分頁群組。}}</translation> +<translation id="3882834874697329510">如要在開啟的分頁有降價產品時收到通知,請在「設定」中啟用通知功能。</translation> <translation id="3940195383040445971">在分頁上追蹤價格</translation> <translation id="3996880007329611795">接收通知</translation> <translation id="4133493477912226187">似乎有 <ph name="NUMBER_OF_TABS" /> 個相關的分頁。要唔要將佢哋分組?</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-TW.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-TW.xtb index 826421e..55bfb8e 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-TW.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-TW.xtb
@@ -21,6 +21,7 @@ <translation id="3291470810748040983">每當開啟的分頁中有降價商品,你就會收到通知</translation> <translation id="3328308545011660196">建議:似乎有 <ph name="NUMBER_OF_TABS" /> 個相關的分頁。要將這些分頁加入群組嗎?</translation> <translation id="3819916404117584598">{TABS_COUNT,plural, =1{收合 <ph name="TABS_COUNT_ONE" /> 個分頁。}other{收合包含 <ph name="TABS_COUNT_MANY" /> 個分頁的「<ph name="TITLE_OF_GROUP" />」分頁群組。}}</translation> +<translation id="3882834874697329510">如要在開啟的分頁有降價商品時收到通知,請在設定中啟用通知功能。</translation> <translation id="3940195383040445971">在分頁上追蹤價格</translation> <translation id="3996880007329611795">接收通知</translation> <translation id="4133493477912226187">似乎有 <ph name="NUMBER_OF_TABS" /> 個相關的分頁。要將這些分頁加入群組嗎?</translation>
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTabUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTabUnitTest.java index 4d8dc7d..857c23f 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTabUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTabUnitTest.java
@@ -300,6 +300,32 @@ } @Test + public void getTimestampMillis_real() { + long timestamp = 12345; + doReturn(timestamp).when(mCriticalPersistedTabData).getTimestampMillis(); + + PseudoTab tab = PseudoTab.fromTabId(TAB1_ID); + Assert.assertEquals(CriticalPersistedTabData.INVALID_TIMESTAMP, tab.getTimestampMillis()); + + PseudoTab realTab = PseudoTab.fromTab(mTab1); + Assert.assertNotEquals(tab, realTab); + Assert.assertEquals(timestamp, realTab.getTimestampMillis()); + } + + @Test + public void getTimestampMillis_cache() { + long timestamp = 42; + TabAttributeCache.setTimestampMillisForTesting(TAB1_ID, timestamp); + + PseudoTab tab = PseudoTab.fromTabId(TAB1_ID); + Assert.assertEquals(timestamp, tab.getTimestampMillis()); + + PseudoTab realTab = PseudoTab.fromTab(mTab1); + Assert.assertNotEquals(tab, realTab); + Assert.assertNotEquals(timestamp, realTab.getTimestampMillis()); + } + + @Test public void isIncognito() { doReturn(true).when(mTab1).isIncognito(); @@ -315,22 +341,6 @@ } @Test - public void getTimestampMillis_realTab() { - CriticalPersistedTabData criticalPersistedTabaData = CriticalPersistedTabData.from(mTab1); - long timestamp = 12345; - doReturn(timestamp).when(criticalPersistedTabaData).getTimestampMillis(); - - PseudoTab tab = PseudoTab.fromTab(mTab1); - Assert.assertEquals(timestamp, tab.getTimestampMillis()); - } - - @Test(expected = AssertionError.class) - public void getTimestampMillis_notRealTab() { - PseudoTab tab = PseudoTab.fromTabId(TAB1_ID); - tab.getTimestampMillis(); - } - - @Test @DisableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID}) @EnableFeatures({ChromeFeatureList.INSTANT_START}) public void getRelatedTabs_noProvider_groupDisabled_single() { @@ -437,17 +447,6 @@ } @Test - public void testTabDestroyedRootId() { - Tab tab = new MockTab(TAB4_ID, false); - PseudoTab pseudoTab = PseudoTab.fromTab(tab); - tab.destroy(); - // Root ID was not set. Without the isInitialized() check, - // pseudoTab.getRootId() would crash here with - // UnsupportedOperationException - Assert.assertEquals(Tab.INVALID_TAB_ID, pseudoTab.getRootId()); - } - - @Test public void testTabDestroyedTitle() { Tab tab = new MockTab(TAB4_ID, false); PseudoTab pseudoTab = PseudoTab.fromTab(tab); @@ -468,4 +467,27 @@ // UnsupportedOperationException Assert.assertEquals("", pseudoTab.getUrl()); } + + @Test + public void testTabDestroyedRootId() { + Tab tab = new MockTab(TAB4_ID, false); + PseudoTab pseudoTab = PseudoTab.fromTab(tab); + tab.destroy(); + // Root ID was not set. Without the isInitialized() check, + // pseudoTab.getRootId() would crash here with + // UnsupportedOperationException + Assert.assertEquals(Tab.INVALID_TAB_ID, pseudoTab.getRootId()); + } + + @Test + public void testTabDestroyedTimestamp() { + Tab tab = new MockTab(TAB4_ID, false); + PseudoTab pseudoTab = PseudoTab.fromTab(tab); + tab.destroy(); + // Timestamp was not set. Without the isInitialized() check, + // pseudoTab.getTimestampMillis() would crash here with + // UnsupportedOperationException + Assert.assertEquals( + CriticalPersistedTabData.INVALID_TIMESTAMP, pseudoTab.getTimestampMillis()); + } }
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/pseudotab/TabAttributeCacheUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/pseudotab/TabAttributeCacheUnitTest.java index 2334e37f..07319f8 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/pseudotab/TabAttributeCacheUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/pseudotab/TabAttributeCacheUnitTest.java
@@ -204,6 +204,31 @@ } @Test + public void updateTimestamp() { + long timestamp = 1337; + doReturn(timestamp).when(mCriticalPersistedTabData1).getTimestampMillis(); + + Assert.assertNotEquals(timestamp, TabAttributeCache.getTimestampMillis(TAB1_ID)); + + mTabObserverCaptor.getValue().onTimestampChanged(mTab1, timestamp); + Assert.assertEquals(timestamp, TabAttributeCache.getTimestampMillis(TAB1_ID)); + + mTabModelSelectorObserverCaptor.getValue().onTabStateInitialized(); + mTabModelObserverCaptor.getValue().tabClosureCommitted(mTab1); + Assert.assertNotEquals(timestamp, TabAttributeCache.getTimestampMillis(TAB1_ID)); + } + + @Test + public void updateTimestamp_incognito() { + long timestamp = 1337; + doReturn(timestamp).when(mCriticalPersistedTabData1).getTimestampMillis(); + doReturn(true).when(mTab1).isIncognito(); + + mTabObserverCaptor.getValue().onTimestampChanged(mTab1, timestamp); + Assert.assertNotEquals(timestamp, TabAttributeCache.getTimestampMillis(TAB1_ID)); + } + + @Test public void updateLastSearchTerm() { String searchTerm = "chromium"; @@ -340,6 +365,8 @@ doReturn(title1).when(mTab1).getTitle(); int rootId1 = 1337; doReturn(rootId1).when(mCriticalPersistedTabData1).getRootId(); + long timestamp1 = 123456; + doReturn(timestamp1).when(mCriticalPersistedTabData1).getTimestampMillis(); String url2 = "url 2"; doReturn(url2).when(mTab2).getUrlString(); @@ -363,6 +390,7 @@ Assert.assertNotEquals(url1, TabAttributeCache.getUrl(TAB1_ID)); Assert.assertNotEquals(title1, TabAttributeCache.getTitle(TAB1_ID)); Assert.assertNotEquals(rootId1, TabAttributeCache.getRootId(TAB1_ID)); + Assert.assertNotEquals(timestamp1, TabAttributeCache.getTimestampMillis(TAB1_ID)); Assert.assertNotEquals(searchTerm, TabAttributeCache.getLastSearchTerm(TAB1_ID)); Assert.assertNotEquals(url2, TabAttributeCache.getUrl(TAB2_ID)); @@ -374,6 +402,7 @@ Assert.assertEquals(url1, TabAttributeCache.getUrl(TAB1_ID)); Assert.assertEquals(title1, TabAttributeCache.getTitle(TAB1_ID)); Assert.assertEquals(rootId1, TabAttributeCache.getRootId(TAB1_ID)); + Assert.assertEquals(timestamp1, TabAttributeCache.getTimestampMillis(TAB1_ID)); Assert.assertEquals(searchTerm, TabAttributeCache.getLastSearchTerm(TAB1_ID)); Assert.assertEquals(url2, TabAttributeCache.getUrl(TAB2_ID));
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java index 3935675..d56d88bc 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java
@@ -452,6 +452,29 @@ } @Test + public void scrollAfterNewTabModelSelected() { + initAndAssertAllProperties(); + mModel.set(TabListContainerProperties.IS_VISIBLE, true); + TabModel incognitoTabModel = mock(TabModel.class); + + doReturn(0).when(mTabModelFilter).index(); + mTabModelSelectorObserverCaptor.getValue().onTabModelSelected(incognitoTabModel, mTabModel); + assertThat(mModel.get(TabListContainerProperties.INITIAL_SCROLL_INDEX), equalTo(0)); + + doReturn(1).when(mTabModelFilter).index(); + mTabModelSelectorObserverCaptor.getValue().onTabModelSelected(incognitoTabModel, mTabModel); + assertThat(mModel.get(TabListContainerProperties.INITIAL_SCROLL_INDEX), equalTo(0)); + + doReturn(2).when(mTabModelFilter).index(); + mTabModelSelectorObserverCaptor.getValue().onTabModelSelected(incognitoTabModel, mTabModel); + assertThat(mModel.get(TabListContainerProperties.INITIAL_SCROLL_INDEX), equalTo(0)); + + doReturn(3).when(mTabModelFilter).index(); + mTabModelSelectorObserverCaptor.getValue().onTabModelSelected(incognitoTabModel, mTabModel); + assertThat(mModel.get(TabListContainerProperties.INITIAL_SCROLL_INDEX), equalTo(1)); + } + + @Test public void updatesMarginWithBottomBarChanges() { initAndAssertAllProperties();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/ChromeDownloadDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/download/ChromeDownloadDelegate.java index 49f05a3..09b7905 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/ChromeDownloadDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/ChromeDownloadDelegate.java
@@ -101,7 +101,7 @@ .setIsGETRequest(true) .build(); DownloadController.enqueueDownloadManagerRequest(newInfo); - DownloadController.closeTabIfBlank(mTab); + // TODO(shaktisahu): Verify if we still need to close an empty tab for OMA download. } } .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadController.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadController.java index 1ffa13a..62513456 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadController.java
@@ -17,13 +17,9 @@ import org.chromium.chrome.R; import org.chromium.chrome.browser.app.ChromeActivity; import org.chromium.chrome.browser.flags.ChromeFeatureList; -import org.chromium.chrome.browser.tab.Tab; -import org.chromium.chrome.browser.tab.TabUtils; -import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.components.download.DownloadCollectionBridge; import org.chromium.components.permissions.AndroidPermissionRequester; import org.chromium.content_public.browser.BrowserStartupController; -import org.chromium.content_public.browser.WebContents; import org.chromium.ui.base.AndroidPermissionDelegate; import org.chromium.ui.base.PermissionCallback; import org.chromium.ui.base.WindowAndroid; @@ -255,37 +251,6 @@ DownloadUtils.showDownloadStartToast(ContextUtils.getApplicationContext()); } - private static TabModelSelector getTabModelSelector(Tab tab) { - Activity activity = TabUtils.getActivity(tab); - if (activity instanceof ChromeActivity) { - return ((ChromeActivity) activity).getTabModelSelector(); - } - return null; - } - - /** - * Close a tab if it is blank. Returns true if it is or already closed. - * @param Tab Tab to close. - * @return true iff the tab was (already) closed. - */ - @CalledByNative - static boolean closeTabIfBlank(Tab tab) { - if (tab == null) return true; - WebContents contents = tab.getWebContents(); - boolean isInitialNavigation = contents == null - || contents.getNavigationController().isInitialNavigation(); - if (isInitialNavigation) { - // Tab is created just for download, close it. - TabModelSelector selector = getTabModelSelector(tab); - if (selector == null) return true; - if (selector.getModel(tab.isIncognito()).getCount() == 1) return false; - boolean closed = selector.closeTab(tab); - assert closed; - return true; - } - return false; - } - @NativeMethods interface Natives { void onAcquirePermissionResult(long callbackId, boolean granted, String permissionToUpdate);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadPage.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadPage.java index ee6cc6a1..3751906e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadPage.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadPage.java
@@ -4,21 +4,27 @@ package org.chromium.chrome.browser.download; +import android.app.Activity; + import org.chromium.base.ActivityState; import org.chromium.base.ApplicationStatus; import org.chromium.base.ApplicationStatus.ActivityStateListener; import org.chromium.base.ThreadUtils; +import org.chromium.base.supplier.ObservableSupplier; import org.chromium.chrome.R; -import org.chromium.chrome.browser.app.ChromeActivity; import org.chromium.chrome.browser.download.home.DownloadManagerCoordinator; import org.chromium.chrome.browser.download.home.DownloadManagerCoordinatorFactoryHelper; import org.chromium.chrome.browser.download.home.DownloadManagerUiConfig; import org.chromium.chrome.browser.download.home.DownloadManagerUiConfigHelper; +import org.chromium.chrome.browser.profiles.OTRProfileID; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.profiles.ProfileKey; +import org.chromium.chrome.browser.tabmodel.TabModelSelector; +import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager; import org.chromium.chrome.browser.ui.native_page.BasicNativePage; import org.chromium.chrome.browser.ui.native_page.NativePageHost; import org.chromium.components.embedder_support.util.UrlConstants; +import org.chromium.ui.modaldialog.ModalDialogManager; /** * Native page for managing downloads handled through Chrome. @@ -32,23 +38,31 @@ /** * Create a new instance of the downloads page. * @param activity The activity to get context and manage fragments. + * @param snackbarManager The {@link SnackbarManager} to show snack bars. + * @param modalDialogManager The {@link ModalDialogManager} associated with the activity. + * @param tabModelSelectorSupplier A supplier for retrieving the {@link TabModelSelector}. * @param host A NativePageHost to load urls. */ - public DownloadPage(ChromeActivity activity, NativePageHost host) { + public DownloadPage(Activity activity, SnackbarManager snackbarManager, + ModalDialogManager modalDialogManager, + ObservableSupplier<TabModelSelector> tabModelSelectorSupplier, NativePageHost host) { super(host); ThreadUtils.assertOnUiThread(); + boolean isIncognito = tabModelSelectorSupplier.get().getCurrentModel().isIncognito(); + OTRProfileID otrProfileId = + tabModelSelectorSupplier.get().getCurrentModel().getProfile().getOTRProfileID(); + DownloadManagerUiConfig config = DownloadManagerUiConfigHelper.fromFlags() - .setIsOffTheRecord(activity.getCurrentTabModel().isIncognito()) - .setOTRProfileID( - activity.getCurrentTabModel().getProfile().getOTRProfileID()) + .setIsOffTheRecord(isIncognito) + .setOTRProfileID(otrProfileId) .setIsSeparateActivity(false) .setShowPaginationHeaders(DownloadUtils.shouldShowPaginationHeaders()) .build(); mDownloadCoordinator = DownloadManagerCoordinatorFactoryHelper.create( - activity, config, activity.getSnackbarManager(), activity.getModalDialogManager()); + activity, config, snackbarManager, modalDialogManager); mDownloadCoordinator.addObserver(this); mTitle = activity.getString(R.string.menu_downloads); @@ -60,7 +74,7 @@ // resumed. mActivityStateListener = (activity1, newState) -> { if (newState == ActivityState.RESUMED) { - Profile profile = activity.getCurrentTabModel().getProfile(); + Profile profile = tabModelSelectorSupplier.get().getCurrentModel().getProfile(); ProfileKey profileKey = profile == null ? ProfileKey.getLastUsedRegularProfileKey() : profile.getProfileKey(); DownloadUtils.checkForExternallyRemovedDownloads(profileKey);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/native_page/NativePageFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/native_page/NativePageFactory.java index 44d6eb4..fd06887 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/native_page/NativePageFactory.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/native_page/NativePageFactory.java
@@ -104,7 +104,9 @@ } protected NativePage buildDownloadsPage(Tab tab) { - return new DownloadPage(mActivity, new TabShim(tab, mActivity)); + return new DownloadPage(mActivity, mActivity.getSnackbarManager(), + mActivity.getModalDialogManager(), mActivity.getTabModelSelectorSupplier(), + new TabShim(tab, mActivity)); } protected NativePage buildExploreSitesPage(Tab tab) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java index 9641ca0..e44456d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java
@@ -4,6 +4,7 @@ package org.chromium.chrome.browser.tab; +import android.app.Activity; import android.os.Handler; import androidx.annotation.IntDef; @@ -18,12 +19,15 @@ import org.chromium.base.ObserverList; import org.chromium.base.ObserverList.RewindableIterator; import org.chromium.base.metrics.RecordHistogram; +import org.chromium.chrome.R; import org.chromium.chrome.browser.AppHooks; import org.chromium.chrome.browser.SwipeRefreshHandler; import org.chromium.chrome.browser.display_cutout.DisplayCutoutTabHelper; +import org.chromium.chrome.browser.feedback.HelpAndFeedbackLauncherImpl; import org.chromium.chrome.browser.media.MediaCaptureNotificationServiceImpl; import org.chromium.chrome.browser.policy.PolicyAuditor; import org.chromium.chrome.browser.policy.PolicyAuditor.AuditEvent; +import org.chromium.chrome.browser.profiles.Profile; import org.chromium.content_public.browser.NavigationHandle; import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.WebContentsAccessibility; @@ -213,7 +217,27 @@ // {@link WebContentsObserver#onWebContentsLostFocus}. This will ensure all // observers in {@link WebContentsObserverProxy} receive callbacks for // {@link WebContentsObserver#renderProcessGone} first. - (new Handler()).post(SadTab.from(mTab)::show); + SadTab sadTab = SadTab.from(mTab); + (new Handler()).post(() -> { + sadTab.show(mTab.getThemedApplicationContext(), + /* suggestionAction= */ () -> { + Activity activity = mTab.getWindowAndroid().getActivity().get(); + assert activity != null; + HelpAndFeedbackLauncherImpl.getInstance().show(activity, + activity.getString(R.string.help_context_sad_tab), + Profile.fromWebContents(mTab.getWebContents()), null); + }, + + /* buttonAction= */ () -> { + if (sadTab.showSendFeedbackView()) { + mTab.getActivity().startHelpAndFeedback(mTab.getUrlString(), + "MobileSadTabFeedback", + Profile.fromWebContents(mTab.getWebContents())); + } else { + mTab.reload(); + } + }); + }); // This is necessary to correlate histogram data with stability counts. RecordHistogram.recordBooleanHistogram("Stability.Android.RendererCrash", true); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webauth/IsUvpaaHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/webauth/IsUvpaaHelper.java new file mode 100644 index 0000000..108742da --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/webauth/IsUvpaaHelper.java
@@ -0,0 +1,63 @@ +// Copyright 2021 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.chrome.browser.webauth; + +import android.content.Context; +import android.os.Build; + +import org.chromium.base.ContextUtils; +import org.chromium.base.PackageUtils; +import org.chromium.base.annotations.CalledByNative; +import org.chromium.base.annotations.JNINamespace; +import org.chromium.base.annotations.NativeMethods; +import org.chromium.chrome.browser.flags.ChromeFeatureList; + +/** + * This class provides a separate entry point to the WebAuthentication + * implementation that allows IsUserVerifyingPlatformAuthenticator to be called + * without a RenderFrameHost. It exists to support IsUVPAA metrics. + * This is intended to be used from native code. + */ +@JNINamespace("webauth") +public class IsUvpaaHelper { + private static final String GMSCORE_PACKAGE_NAME = "com.google.android.gms"; + + /** + * Determine whether a user-verifying platform authenticator is available + * for WebAuthn. + */ + @CalledByNative + public static void isUserVerifyingPlatformAuthenticatorAvailable() { + Context context = ContextUtils.getApplicationContext(); + if (context == null) { + IsUvpaaHelperJni.get().onIsUvpaaComplete(false); + return; + } + + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) { + IsUvpaaHelperJni.get().onIsUvpaaComplete(false); + return; + } + + if (!ChromeFeatureList.isEnabled(ChromeFeatureList.WEB_AUTH)) { + IsUvpaaHelperJni.get().onIsUvpaaComplete(false); + return; + } + + if (PackageUtils.getPackageVersion(context, GMSCORE_PACKAGE_NAME) + < Fido2ApiHandler.GMSCORE_MIN_VERSION) { + IsUvpaaHelperJni.get().onIsUvpaaComplete(false); + return; + } + + Fido2ApiHandler.getInstance().isUserVerifyingPlatformAuthenticatorAvailable( + null, isUVPAA -> IsUvpaaHelperJni.get().onIsUvpaaComplete(isUVPAA)); + } + + @NativeMethods + interface Natives { + void onIsUvpaaComplete(boolean available); + } +} \ No newline at end of file
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/SadTabTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/SadTabTest.java index 52aeb2d..bbcb00b 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/SadTabTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/SadTabTest.java
@@ -181,7 +181,7 @@ TestThreadUtils.runOnUiThreadBlocking(() -> { SadTab sadTab = SadTab.from(tab); sadTab.removeIfPresent(); - sadTab.show(); + sadTab.show(tab.getContext(), () -> {}, () -> {}); }); }
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index 9b17169..1185c82 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -4671,7 +4671,7 @@ <translation id="6291741848715722067">رمز تأكيد البيانات</translation> <translation id="6291949900244949761">طلب الإذن في حال محاولة أحد المواقع الوصول إلى أجهزة USB (مُوصى به)</translation> <translation id="6291953229176937411">إ&ظهار في الباحث</translation> -<translation id="6295158916970320988">جميع المواقع</translation> +<translation id="6295158916970320988">جميع المواقع الإلكترونية</translation> <translation id="6295855836753816081">جارٍ الحفظ...</translation> <translation id="6298962879096096191">استخدام Google Play لتثبيت تطبيقات Android</translation> <translation id="6300177430812514606">المواقع الإلكترونية التي لا يُسمح لها بإنهاء إرسال البيانات أو استلامها</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb index f7b1d4036..daa3ae2 100644 --- a/chrome/app/resources/generated_resources_az.xtb +++ b/chrome/app/resources/generated_resources_az.xtb
@@ -571,6 +571,7 @@ <translation id="1627408615528139100">Artıq endirilib</translation> <translation id="1628948239858170093">Açmazdan əvvəl fayl skanlansın?</translation> <translation id="1629314197035607094">Parolun müddəti bitdi</translation> +<translation id="1629521517399325891">Şəbəkə doğrulaması üçün istifadəçi sertifikatı əlçatan deyil.</translation> <translation id="163072119192489970">Verilənlərin göndərilməsini və qəbulunu tamamlamaq icazəsi verilib</translation> <translation id="1630768113285622200">Yenidən başladın və davam edin</translation> <translation id="1632082166874334883">Google hesabınızda saxlanılmış parol</translation> @@ -1175,6 +1176,7 @@ <translation id="2300383962156589922"><ph name="APP_NAME" /> tətbiqini fərdiləşdirin və nəzarət edin</translation> <translation id="2301382460326681002">Artırma kökü kataloqu etibarsızdır.</translation> <translation id="23030561267973084">"<ph name="EXTENSION_NAME" />" əlavə icazə istəyir.</translation> +<translation id="230529452743010958">Bu elementi daha əvvəl Google xidmətlərindən istifadə etdiyiniz üçün görürsünüz. Siz <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> ünvanında datanıza baxa, onu silə və ayarlarınızı dəyişə bilərsiniz.</translation> <translation id="23055578400314116">İstifadəçi adı seçin</translation> <translation id="2307462900900812319">Şəbəkəni konfiqurasiya edin</translation> <translation id="230927227160767054">Bu səhifə xidmət işləyici quraşdırmaq istəyir.</translation> @@ -1400,6 +1402,7 @@ <translation id="2541706104884128042">Yeni yuxu vaxtı ayarlandı</translation> <translation id="2542050502251273923">Şəbəkə bağlantı meneceri və ff_debug istifadə edən digər xidmətlərin sazlama səviyyəsini ayarlayır.</translation> <translation id="2544292303401268586">Administrator tətbiqləri güncəlləmək üçün cihazı yenidən başlatmağı tələb edir. Güncəllənmə bir az vaxt alacaq.</translation> +<translation id="2544352060595557290">Bu Tab</translation> <translation id="2544853746127077729">Doğrulama təsdiqi şəbəkə tərəfindən ləğv edildi</translation> <translation id="2546283357679194313">Kukilər və sayt datası</translation> <translation id="2548347166720081527"><ph name="PERMISSION" /> üçün icazə verilib</translation> @@ -1565,6 +1568,7 @@ <translation id="2734760316755174687"><ph name="SITE_GROUP_NAME" /> ünvanındakı saytlar da sıfırlanacaq.</translation> <translation id="2735712963799620190">Cədvəl</translation> <translation id="2737363922397526254">Yığcamlaşdırın...</translation> +<translation id="2737916598897808047"><ph name="APP_NAME" />ekranınızın məzmununu <ph name="TARGET_NAME" /> ilə paylaşmaq istəyir.</translation> <translation id="2738771556149464852">Sonra yox</translation> <translation id="2739191690716947896">Debaq</translation> <translation id="2739240477418971307">Əlçatımlıq ayarlarını dəyişin</translation> @@ -2393,6 +2397,7 @@ <translation id="3677911431265050325">Mobil saytı tələb edin</translation> <translation id="3677959414150797585">Tətbiqlər, veb səhifələr və daha çoxu daxildir. Yalnız istifadə datasını paylaşmağı seçdiyiniz zaman təklifləri yaxşılaşdırmaq üçün statistika göndərir.</translation> <translation id="3678156199662914018">Artırma: <ph name="EXTENSION_NAME" /></translation> +<translation id="3678188444105291936">Bu pəncərədə baxdığınız səhifələr brauzer tarixçəsində görünməyəcək və onlar heç bir iz buraxmayacaq. Endirdiyiniz fayllar və yaratdığınız əlfəcinlər saxlanmayacaq.</translation> <translation id="3680683624079082902">Mətndən-nitqə səsi</translation> <translation id="3681311097828166361">Əks əlaqə üçün təşəkkür edirik. Hazırda oflaynsınız, hesabınız sonra göndəriləcək.</translation> <translation id="3682824389861648626">Hərəkət limiti</translation> @@ -2594,6 +2599,7 @@ <translation id="3884152383786131369">Bir neçə dildə əlçatan veb məzmun siyahıdakı ilk dəstəklənən dili istifadə edəcək. Bu tərcihlər brauzer ayarlarınızla sinxronlaşdırılır. <ph name="BEGIN_LINK_LEARN_MORE" />Ətraflı məlumat<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3886446263141354045">Bu sayta giriş sorğunuz <ph name="NAME" /> ünvanına göndərilib</translation> <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" /> ilə qeyd götürmə</translation> +<translation id="3888586133700543064">Bu məlumat Assistent ilə bağlı problemləri daha yaxşı anlamağımıza kömək edir. Bu, 90 günə qədər saxlanılır. Müvafiq texniki və rəy komandaları üçün giriş məhduddur.</translation> <translation id="3890064827463908288">Wi-Fi Sinxronlaşdırmasını istifadə etmək üçün Chrome Sinxronlaşdırmasını aktiv edin</translation> <translation id="3892414795099177503">OpenVPN / L2TP əlavə edin...</translation> <translation id="3893536212201235195">Əlçatımlıq ayarlarını oxuyun və dəyişin</translation> @@ -2625,6 +2631,7 @@ <translation id="3916445069167113093">Bu fayl növü kompüterinizi zədələyə bilər. <ph name="FILE_NAME" /> faylını yenə də saxlamaq istəyirsiniz?</translation> <translation id="3918972485393593704">Detalları Google'a bildirin</translation> <translation id="3919145445993746351">Artırmaları bütün kompüterlərdə əldə etmək üçün sinxronizasiyanı aktiv edin</translation> +<translation id="3919798653937160644">Bu pəncərədə baxdığınız səhifələr brauzer tarixçəsində görünməyəcək və bütün Qonaq səhifələrini qapadandan sonra, kuki kimi digər izlər buraxmayacaq. Lakin, endirmiş olduğunuz bütün fayllar qalacaq.</translation> <translation id="3920504717067627103">Sertifikat siyasəti</translation> <translation id="392089482157167418">ChromeVox'u (şifahi geri əlaqə) aktiv edin</translation> <translation id="3920909973552939961">Ödəniş vasitələri quraşdırmaq icazəsi verilməyib</translation> @@ -2960,6 +2967,7 @@ <translation id="4332976768901252016">Valideyn Nəzarətləri ayarlayın</translation> <translation id="4333854382783149454">PKCS #1 SHA-1 Şifrələmə ilə</translation> <translation id="4336434711095810371">Bütün datanı silin</translation> +<translation id="4340125850502689798">Yanlış istifadəçi adı</translation> <translation id="4340515029017875942"><ph name="ORIGIN" /> "<ph name="EXTENSION_NAME" />" tətbiqi ilə bağlantı yaratmaq istəyir</translation> <translation id="4340575312453649552">Bu reklam cihazınız üçün həddindən çox mənbədən istifadə etdiyinə görə Chrome onu sildi.</translation> <translation id="4341577178275615435">Klaviatura ilə baxışı aktiv və ya deaktiv etmək üçün F7 qısayolunu istifadə edin</translation> @@ -3574,6 +3582,7 @@ <translation id="5057110919553308744">Artırmaya kliklədiyiniz vaxt</translation> <translation id="5057403786441168405">Giriş edilən hesablarınızı idarə edin. Chrome və Google Play'dəki veb saytlar, tətbiqlər və artırmalar icazələrdən asılı olaraq təcrübənizi fərdiləşdirmək üçün bu hesablardan istifadə edə bilər. <ph name="LINK_BEGIN" />Ətraflı məlumat<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Girişi məhdudlaşdırın</translation> +<translation id="5059526285558225588">Nəyi paylaşacağınızı seçin</translation> <translation id="5060332552815861872">Yadda saxlanıla biləcək 1 printer var.</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{Bu qovluqda əlfəcin var. Onu silmək istədiyinizə əminsiniz?}other{Bu qovluqda # əlfəcin var. Onu silmək istədiyinizə əminsiniz?}}</translation> <translation id="5062930723426326933">Hesaba giriş alınmadı, internetə qoşulun və yenidən cəhd edin.</translation> @@ -3690,6 +3699,7 @@ <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">Sevimli xatirələrinizi canlandırın. Albomlarə əlavə və ya redaktə etmək üçün <ph name="LINK_BEGIN" />Google Fotoya<ph name="LINK_END" /> keçin.</translation> <translation id="5190926251776387065">Portu aktiv edin</translation> +<translation id="5191094172448199359">Daxil etdiyiniz PIN kodlar uyğun gəlmir</translation> <translation id="5191251636205085390">Üçüncü tərəf kukilərini əvəzləmək üçün hazırlanmış yeni texnologiyalar barədə öyrənin və onlara nəzarət edin</translation> <translation id="51918995459521422"><ph name="ORIGIN" /> bir neçə faylı endirmək istəyir</translation> <translation id="5192062846343383368">Nəzarət ayarlarına baxmaq üçün Family Link tətbiqini açın</translation> @@ -3702,6 +3712,7 @@ <translation id="5204673965307125349">Cihazı sıfırlayıb yenidən cəhd edin.</translation> <translation id="5204967432542742771">Şifrəni daxil edin</translation> <translation id="5205484256512407285">Ötürmək üçün heç vaxt mobil data istifadə etməyin</translation> +<translation id="520568280985468584">Şəbəkə uğurla əlavə edildi. Mobil şəbəkənizin aktiv olması bir neçə dəqiqə çəkə bilər.</translation> <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />" silinsin?</translation> <translation id="520621735928254154">Sertifikat İmport Xətası</translation> <translation id="5206787458656075734">{COUNT,plural, =1{Oğurlanmış parol uğurla dəyişdirildi. Daha # oğurlanmış parolunuz var. Chrome bu parolu indi yoxlamağı tövsiyə edir.}other{Oğurlanmış parol uğurla dəyişdirildi. Daha # oğurlanmış parolunuz var. Chrome bu parolları indi yoxlamağı tövsiyə edir.}}</translation> @@ -4335,6 +4346,7 @@ <translation id="5935656526031444304">Təhlükəsiz Baxışı idarə edin</translation> <translation id="5938002010494270685">Təhülkəsizlik yeniləməsi əlçatandır</translation> <translation id="5939518447894949180">Sıfırlayın</translation> +<translation id="5939719276406088041">Qısayol yaratmaq olmur</translation> <translation id="5941153596444580863">Şəxs əlavə edin...</translation> <translation id="5941343993301164315"><ph name="TOKEN_NAME" /> məhsuluna daxil olun.</translation> <translation id="5941711191222866238">Minimallaşdırın</translation> @@ -4422,6 +4434,7 @@ <translation id="6043994281159824495">Hesabdan çıxın</translation> <translation id="6044805581023976844"><ph name="APP_NAME" /> tətbiqi Chrome paneli və audionu <ph name="TAB_NAME" /> ilə paylaşır.</translation> <translation id="6045114302329202345">Əsas TrackPoint düyməsi</translation> +<translation id="6047632800149092791">Sinxronlaşdırma işləmir. Çıxın və yenidən daxil olun.</translation> <translation id="6049004884579590341">Tam ekrandan çıxmaq üçün |<ph name="ACCELERATOR" />| düyməsinə basıb saxlayın</translation> <translation id="6051354611314852653">Vay! Sistem bu cihaza olan API girişini doğrulaya bilmədi.</translation> <translation id="6052976518993719690">SSL Sertifikatlaşdırma Təşkilatı</translation> @@ -4514,6 +4527,7 @@ <translation id="6143186082490678276">Yardım</translation> <translation id="6143366292569327983">Səhifənin hansı dildən tərcümə ediləcəyini seçin</translation> <translation id="6144938890088808325">Chromebook'ları təkmilləşdirməyə yardım edin</translation> +<translation id="6146409560350811147">Sinxronlaşdırma işləmir. Yenidən daxil olmağa cəhd edin.</translation> <translation id="6147020289383635445">Çap önbaxışı alınmadı.</translation> <translation id="6148576794665275391">İndi açın</translation> <translation id="6149015141270619212">İnternetə qoşulmaq mümkün deyil</translation> @@ -4581,6 +4595,7 @@ <translation id="6232017090690406397">Batareya</translation> <translation id="6232116551750539448"><ph name="NAME" /> bağlantısı kəsildi</translation> <translation id="6233154960150021497">Klaviatura əvəzinə səsdən istifadə üçün defolt</translation> +<translation id="6234108445915742946">Chrome’un Xidmət Şərtləri 31 martda dəyişəcək</translation> <translation id="6234474535228214774">Quraşdırma gözlənilir</translation> <translation id="6237474966939441970">Stilus qeyd aparma tətbiqi</translation> <translation id="6237816943013845465">Ekran ayırdetmə dəqiqliyini nizamlamağa icazə verir</translation> @@ -4880,6 +4895,7 @@ <translation id="656293578423618167">Fayl yolu və ya adı çox uzundur. Qısa ad ilə və ya başqa yerə saxlayın.</translation> <translation id="6563469144985748109">Meneceriniz hələ ki təsdiq etməyib</translation> <translation id="6569934958368283244">Digər şəxslər</translation> +<translation id="6573497332121198392">Qısayolu silmək olmur</translation> <translation id="657402800789773160">Bu Səhifəni Yenidən yükləyin</translation> <translation id="6577284282025554716">Endirmə ləğv edildi: <ph name="FILE_NAME" /></translation> <translation id="657866106756413002">Şəbəkə vəziyyətinə baxış</translation> @@ -4887,6 +4903,7 @@ <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> - Masaüstü kontent paylaşıldı</translation> <translation id="6580203076670148210">Skan sürəti</translation> <translation id="6582080224869403177">Təhlükəsizliyi yeniləmək üçün <ph name="DEVICE_TYPE" /> cihazını sıfırlayın.</translation> +<translation id="6582274660680936615">Qonaq kimi baxırsınız</translation> <translation id="6584878029876017575">Microsoft Lifetime Signing</translation> <translation id="6586099239452884121">Qonaq axtarışı</translation> <translation id="6586451623538375658">Əsas siçan düyməsini Swap</translation> @@ -5056,6 +5073,7 @@ <translation id="6782468519961184511">Administratorunuz əlavə Google Hesablarına icazə vermir</translation> <translation id="6785518634832172390">PIN maksimum 12 rəqəmdən ibarət olmalıdır</translation> <translation id="6786747875388722282">Artırmalar</translation> +<translation id="6787097042755590313">Digər Tab</translation> <translation id="6787839852456839824">Klaviatura qısayolları</translation> <translation id="6788210894632713004">Paketlənməmiş artırma</translation> <translation id="6789592661892473991">Horizontal bölün</translation> @@ -5066,6 +5084,7 @@ <translation id="6793723358811598107">'<ph name="CURRENTKEY" />' artıq '<ph name="ACTION" />' əməliyyatına təyin edilib. Çıxmaq üçün istənilən düyməni basın.</translation> <translation id="6795884519221689054">Panda</translation> <translation id="6797493596609571643">Xəta oldu.</translation> +<translation id="6798420440063423019">Həddindən çox yanlış PIN daxil edildiyinə görə təhlükəsizlik açarı kilidlənib. Təhlükəsizlik açarını sıfırlamalısınız.</translation> <translation id="6798578729981748444">İmportu tamamlamaq üçün bütün Firefox pəncərələrini bağlayın</translation> <translation id="6798780071646309401">böyük hərflər aktivdir</translation> <translation id="6798954102094737107">Plagin: <ph name="PLUGIN_NAME" /></translation> @@ -5411,6 +5430,7 @@ <translation id="7180865173735832675">Fərdiləşdirin</translation> <translation id="7182791023900310535">Parolunuzu daşıyın</translation> <translation id="7186088072322679094">Alətlər panelində saxlayın</translation> +<translation id="7186303001964993981"><ph name="ORIGIN" /> sistem faylları ehtiva etdiyinə görə bu qovluğu aça bilmir</translation> <translation id="7187428571767585875">Silinəcək və ya dəyişdiriləcək qeyd girişləri:</translation> <translation id="7187855807420906517">Çıxış etdikdən, yaxud oflayn olduqdan sonra saytlar adətən şəkilləri yükləmək və ya çat mesajı göndərmək kimi tapşırıqları bitirmək üçün sinxronlaşdırmağa davam edir</translation> <translation id="7189234443051076392">Əmin olun ki cihazda kifayət qədər yer var</translation> @@ -6031,6 +6051,7 @@ <translation id="7871109039747854576">Kandidat siyahısını səhifələmək üçün <ph name="COMMA" /> və <ph name="PERIOD" /> düymələrindən istifadə edin</translation> <translation id="787268756490971083">Deaktiv</translation> <translation id="7874257161694977650">Chrome arxa fonları</translation> +<translation id="7876027585589532670">Qısayolu redaktə etmək olmur</translation> <translation id="7877451762676714207">Naməlum server xətası. Lütfən, yenidən cəhd edin vəya server administratoru ilə əlaqə saxlayın.</translation> <translation id="7879631849810108578">Qısayol ayarlanıb: <ph name="IDS_SHORT_SET_COMMAND" /></translation> <translation id="7880823633812189969">Yenidən başlatma zamanı lokal data silinəcək</translation> @@ -6315,6 +6336,7 @@ <translation id="8189750580333936930">Məxfilik Sendboksu</translation> <translation id="8190193592390505034"><ph name="PROVIDER_NAME" /> provayderinə qoşulur</translation> <translation id="8191230140820435481">Tətbiqlər, artırmalar və temalarınızı idarə edin</translation> +<translation id="8192944472786724289"><ph name="APP_NAME" /> ekranınızın məzmununu paylaşmaq istəyir.</translation> <translation id="8195027750202970175">Disk ölçüsü</translation> <translation id="8198323535106903877">Həmin <ph name="NUMBER_OF_APPS" /> tətbiqi sizin üçün quraşdıracağıq</translation> <translation id="8199300056570174101">Şəbəkə (Xidmət) və Cihaz xüsusiyyətləri</translation> @@ -6962,6 +6984,7 @@ <translation id="8931475688782629595">Sinxronlaşdırdığınız datanı idarə edin</translation> <translation id="8932654652795262306">Ani Birləşmə detalları</translation> <translation id="8932894639908691771">Keçid Düyməsi seçimləri</translation> +<translation id="893298445929867520">Arabalar gizlədilib. Dəyişiklik etdiyiniz zaman onlar yenidən görünəcək.</translation> <translation id="8933960630081805351">&Axtarıcıda göstərin</translation> <translation id="8934732568177537184">Davam edin</translation> <translation id="8938306522009698937">emalçılar</translation> @@ -7238,6 +7261,7 @@ <translation id="942532530371314860"><ph name="APP_NAME" /> Chrome tab və audionu paylaşır.</translation> <translation id="945522503751344254">Geri əlaqə göndərin</translation> <translation id="947329552760389097">&Elementləri Yoxlayın</translation> +<translation id="947667444780368238"><ph name="ORIGIN" /> sistem faylları ehtiva etdiyinə görə bu qovluqdakı faylları aça bilmir</translation> <translation id="951991426597076286">Kənarlaşdırın</translation> <translation id="956500788634395331">Potensial zərərli artırmalardan qorunursunuz</translation> <translation id="957960681186851048">Bu sayt çoxsaylı faylları avtomatik endirməyə cəhd etdi</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb index 82828e4..fda5cb7 100644 --- a/chrome/app/resources/generated_resources_be.xtb +++ b/chrome/app/resources/generated_resources_be.xtb
@@ -578,6 +578,7 @@ <translation id="1627408615528139100">Файл ужо спампаваны</translation> <translation id="1628948239858170093">Праверыць файл перад адкрыццём?</translation> <translation id="1629314197035607094">Тэрмін дзеяння пароля скончыўся</translation> +<translation id="1629521517399325891">Гэты сертыфікат карыстальніка нельга выкарыстаць для аўтэнтыфікацыі сеткі.</translation> <translation id="163072119192489970">Дазволена завяршаць адпраўку і атрыманне даных</translation> <translation id="1630768113285622200">Перазапусціць і працягнуць</translation> <translation id="1632082166874334883">Пароль, захаваны ва Уліковым запісе Google</translation> @@ -1182,6 +1183,7 @@ <translation id="2300383962156589922"><ph name="APP_NAME" />: наладка і кіраванне</translation> <translation id="2301382460326681002">Няправільны каранёвы каталог пашырэння.</translation> <translation id="23030561267973084">Праграма "<ph name="EXTENSION_NAME" />" запатрабавала дадатковыя дазволы.</translation> +<translation id="230529452743010958">Гэты прадукт паказваецца вам на падставе вашых папярэдніх дзеянняў у сэрвісах Google. Праглядаць і выдаляць свае даныя, а таксама змяняць налады можна на старонцы <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="23055578400314116">Выберыце імя карыстальніка</translation> <translation id="2307462900900812319">Наладзіць сетку</translation> <translation id="230927227160767054">Старонка спрабуе ўсталяваць апрацоўшчык сэрвісу.</translation> @@ -1408,6 +1410,7 @@ <translation id="2541706104884128042">Зададзены новы час адыходу да сну</translation> <translation id="2542050502251273923">Задае ўзровень адладкі дыспетчара падключэння сеткі і іншых сэрвісаў пры дапамозе ff_debug.</translation> <translation id="2544292303401268586">Адміністратар адправіў запыт на перазапуск прылады, каб абнавіць праграмы. Гэта можа заняць некалькі хвілін.</translation> +<translation id="2544352060595557290">Гэта ўкладка</translation> <translation id="2544853746127077729">Сертыфікат аўтэнтыфікацыі адхілены сеткай</translation> <translation id="2546283357679194313">Файлы сookie і даныя сайтаў</translation> <translation id="2548347166720081527">Дадзены дазвол (<ph name="PERMISSION" />)</translation> @@ -1573,6 +1576,7 @@ <translation id="2734760316755174687">Сайты ў межах <ph name="SITE_GROUP_NAME" /> таксама будуць скінуты.</translation> <translation id="2735712963799620190">Расклад</translation> <translation id="2737363922397526254">Згарнуць...</translation> +<translation id="2737916598897808047">Праграма "<ph name="APP_NAME" />" запытвае дазвол на абагульванне змесціва экрана з <ph name="TARGET_NAME" />.</translation> <translation id="2738771556149464852">Не пазней</translation> <translation id="2739191690716947896">Адладзіць</translation> <translation id="2739240477418971307">Змяніць налады спецыяльных магчымасцей</translation> @@ -2401,6 +2405,7 @@ <translation id="3677911431265050325">Запытаць мабільную версію сайта</translation> <translation id="3677959414150797585">Яно ўключае ў сябе праграмы, вэб-старонкі і іншае. Статыстыка для паляпшэнне прапаноў будзе адпраўляцца, толькі калі вы згадзіліся на абагульванне даных пра выкарыстанне.</translation> <translation id="3678156199662914018">Пашырэнне: <ph name="EXTENSION_NAME" /></translation> +<translation id="3678188444105291936">Старонкі, якія вы праглядаеце ў гэтым акне, не будуць паказвацца ў гісторыі прагляду сайтаў і пасля выхаду з уліковага запісу не пакінуць ніякіх слядоў (напрыклад, файлаў cookie) на камп'ютары. Спампаваныя файлы і створаныя закладкі не захаваюцца.</translation> <translation id="3680683624079082902">Голас для сінтэзу маўлення</translation> <translation id="3681311097828166361">Дзякуй за водгук. Вы па-за сеткай, таму справаздача будзе адпраўлена пазней.</translation> <translation id="3682824389861648626">Парог перамяшчэння</translation> @@ -2602,6 +2607,7 @@ <translation id="3884152383786131369">Вэб-змесціва, даступнае на некалькіх мовах, будзе адлюстроўвацца на першай мове з дадзенага спіса. Гэтыя параметры сінхранізуюцца з наладамі вашага браўзера. <ph name="BEGIN_LINK_LEARN_MORE" />Даведацца больш<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3886446263141354045">Запыт на доступ да гэтага сайта адпраўлены карыстальніку <ph name="NAME" /></translation> <translation id="3888550877729210209">Нататкі ў <ph name="LOCK_SCREEN_APP_NAME" /></translation> +<translation id="3888586133700543064">Гэтыя звесткі дапамагаюць нам зразумець вашу праблему з Памочнікам. Яны захоўваюцца да 90 дзён, доступ да іх маюць толькі адпаведныя распрацоўшчыкі і спецыялісты па працы з водгукамі.</translation> <translation id="3890064827463908288">Каб выкарыстоўваць функцыю сінхранізацыі параметраў Wi-Fi, уключыце Сінхранізацыю Chrome</translation> <translation id="3892414795099177503">Дадаць OpenVPN/L2TP...</translation> <translation id="3893536212201235195">Прагляд і змена налад спецыяльных магчымасцей</translation> @@ -2633,6 +2639,7 @@ <translation id="3916445069167113093">Файл гэтага тыпу можа пашкодзіць ваш камп'ютар. Усё роўна захаваць файл "<ph name="FILE_NAME" />"?</translation> <translation id="3918972485393593704">Паведаміць падрабязныя звесткі ў Google</translation> <translation id="3919145445993746351">Каб карыстацца ўсталяванымі пашырэннямі на ўсіх сваіх камп'ютарах, уключыце сінхранізацыю</translation> +<translation id="3919798653937160644">Старонкі, якія вы праглядаеце ў гэтым акне, не будуць паказвацца ў гісторыі прагляду сайтаў і пасля закрыцця ўсіх адкрытых гасцявых вокнаў не пакінуць ніякіх слядоў (напрыклад, файлаў cookie) на камп'ютары. Пры гэтым спампаваныя файлы будуць захаваны.</translation> <translation id="3920504717067627103">Палітыкі сертыфікатаў</translation> <translation id="392089482157167418">Уключыць ChromeVox (галасавая зваротная сувязь)</translation> <translation id="3920909973552939961">Не дазволена ўсталёўваць апрацоўшчыкаў плацяжоў</translation> @@ -2970,6 +2977,7 @@ <translation id="4332976768901252016">Наладжванне бацькоўскага кантролю</translation> <translation id="4333854382783149454">PKCS #1 SHA-1 з шыфраваннем RSA</translation> <translation id="4336434711095810371">Выдаліць усе даныя</translation> +<translation id="4340125850502689798">Несапраўднае імя карыстальніка</translation> <translation id="4340515029017875942"><ph name="ORIGIN" /> запытвае абмен данымі з праграмай "<ph name="EXTENSION_NAME" />"</translation> <translation id="4340575312453649552">Гэта рэклама выкарыстоўвала занадта многа рэсурсаў прылады, таму Chrome выдаліў яе.</translation> <translation id="4341577178275615435">Каб уключыць або выключыць навігацыю клавішамі, выкарыстоўвайце клавішу F7.</translation> @@ -3584,6 +3592,7 @@ <translation id="5057110919553308744">Пры націсканні на пашырэнне</translation> <translation id="5057403786441168405">Тут можна кіраваць уліковымі запісамі, у якія вы ўвайшлі: вэб-сайты, праграмы і пашырэнні ў браўзеры Chrome і краме Google Play могуць выкарыстоўваць іх для персаналізацыі сваіх функцый згодна з дазволамі. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Задаць абмежаванні на ўваход</translation> +<translation id="5059526285558225588">Выберыце, што абагульваць</translation> <translation id="5060332552815861872">Даступны 1 прынтар, які можна захаваць.</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{У гэтай папцы ёсць закладка. Вы ўпэўненыя, што хочаце яе выдаліць?}one{У гэтай папцы ёсць # закладка. Вы ўпэўненыя, што хочаце яе выдаліць?}few{У гэтай папцы ёсць # закладкі. Вы ўпэўненыя, што хочаце яе выдаліць?}many{У гэтай папцы ёсць # закладак. Вы ўпэўненыя, што хочаце яе выдаліць?}other{У гэтай папцы ёсць # закладкі. Вы ўпэўненыя, што хочаце яе выдаліць?}}</translation> <translation id="5062930723426326933">Уваход не выкананы. Падключыцеся да інтэрнэту і паўтарыце спробу.</translation> @@ -3700,6 +3709,7 @@ <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">Ажывіце прыемныя ўспаміны. Каб дадаць або змяніць альбомы, перайдзіце ў <ph name="LINK_BEGIN" />Google Фота<ph name="LINK_END" />.</translation> <translation id="5190926251776387065">Уключыць порт</translation> +<translation id="5191094172448199359">Уведзеныя PIN-коды не супадаюць</translation> <translation id="5191251636205085390">Даведайцеся пра новыя тэхналогіі, якія прыходзяць на змену староннім файлам cookie, а таксама пра спосабы кіравання імі</translation> <translation id="51918995459521422"><ph name="ORIGIN" /> запытвае дазвол на спампоўку некалькіх файлаў</translation> <translation id="5192062846343383368">Каб праглядзець налады бацькоўскага кантролю, адкрыйце праграму Family Link</translation> @@ -3712,6 +3722,7 @@ <translation id="5204673965307125349">Скіньце налады прылады з дапамогай функцыі Powewash і паўтарыце спробу.</translation> <translation id="5204967432542742771">Увядзіце пароль</translation> <translation id="5205484256512407285">Ніколі не выкарыстоўваць мабільную перадачу даных</translation> +<translation id="520568280985468584">Сотавая сетка дададзена. Яе актывацыя можа заняць некалькі хвілін.</translation> <translation id="5206215183583316675">Выдаліць "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="520621735928254154">Памылка імпарту сертыфіката</translation> <translation id="5206787458656075734">{COUNT,plural, =1{Раскрыты пароль зменены. Застаўся яшчэ # раскрыты пароль. Chrome рэкамендуе праверыць гэты пароль зараз.}one{Раскрыты пароль зменены. Застаўся яшчэ # раскрыты пароль. Chrome рэкамендуе праверыць гэтыя паролі зараз.}few{Раскрыты пароль зменены. Засталіся яшчэ # раскрытыя паролі. Chrome рэкамендуе праверыць гэтыя паролі зараз.}many{Раскрыты пароль зменены. Засталіся яшчэ # раскрытых пароляў. Chrome рэкамендуе праверыць гэтыя паролі зараз.}other{Раскрыты пароль зменены. Засталіся яшчэ # раскрытага пароля. Chrome рэкамендуе праверыць гэтыя паролі зараз.}}</translation> @@ -4346,6 +4357,7 @@ <translation id="5935656526031444304">Кіраваць Бяспечным праглядам</translation> <translation id="5938002010494270685">Даступнае абнаўленне сістэмы бяспекі</translation> <translation id="5939518447894949180">Скінуць</translation> +<translation id="5939719276406088041">Не ўдаецца стварыць ярлык</translation> <translation id="5941153596444580863">Дадаць карыстальніка...</translation> <translation id="5941343993301164315">Увайдзіце ў <ph name="TOKEN_NAME" />.</translation> <translation id="5941711191222866238">Згарнуць</translation> @@ -4433,6 +4445,7 @@ <translation id="6043994281159824495">Выйсці</translation> <translation id="6044805581023976844"><ph name="APP_NAME" /> абагульвае гук і ўкладку Chrome з укладкай <ph name="TAB_NAME" />.</translation> <translation id="6045114302329202345">Асноўная кнопка TrackPoint</translation> +<translation id="6047632800149092791">Сінхранізацыя не працуе. Паспрабуйце выйсці і ўвайсці зноў.</translation> <translation id="6049004884579590341">Каб выйсці з поўнаэкраннага рэжыму, націсніце і ўтрымлівайце "<ph name="ACCELERATOR" />"</translation> <translation id="6051354611314852653">Памылка! Сістэме не ўдалося аўтарызаваць доступ API для гэтай прылады.</translation> <translation id="6052976518993719690">Цэнтр сертыфікацыі SSL</translation> @@ -4525,6 +4538,7 @@ <translation id="6143186082490678276">Даведка</translation> <translation id="6143366292569327983">Выберыце, з якой мовы трэба перакладаць старонку</translation> <translation id="6144938890088808325">Дапамажыце нам палепшыць прылады Chromebook</translation> +<translation id="6146409560350811147">Сінхранізацыя не працуе. Увайдзіце яшчэ раз.</translation> <translation id="6147020289383635445">Не ўдалося выканаць перадпрагляд друку.</translation> <translation id="6148576794665275391">Адкрыць</translation> <translation id="6149015141270619212">Не ўдалося падключыцца да інтэрнэту</translation> @@ -4592,6 +4606,7 @@ <translation id="6232017090690406397">Акумулятар</translation> <translation id="6232116551750539448">Падключэнне да <ph name="NAME" /> страчана</translation> <translation id="6233154960150021497">Стандартныя паводзіны — выкарыстоўваць голас замест клавіятуры</translation> +<translation id="6234108445915742946">Умовы выкарыстання Chrome зменяцца 31 сакавіка</translation> <translation id="6234474535228214774">Чакаецца ўсталёўка</translation> <translation id="6237474966939441970">Праграма для запісу нататак пяром</translation> <translation id="6237816943013845465">Дазваляе наладзіць раздзяляльнасць экрана</translation> @@ -4891,6 +4906,7 @@ <translation id="656293578423618167">Шлях да файла або яго назва занадта доўгія. Зрабіце назву карацейшай або ўкажыце іншае месцазнаходжанне.</translation> <translation id="6563469144985748109">Ваш менеджар пакуль што не ўхваліў гэты сайт</translation> <translation id="6569934958368283244">Іншыя людзі</translation> +<translation id="6573497332121198392">Не ўдалося выдаліць ярлык</translation> <translation id="657402800789773160">&Перазагрузіць старонку</translation> <translation id="6577284282025554716">Спампоўванне скасавана: <ph name="FILE_NAME" /></translation> <translation id="657866106756413002">Зводка па стане сеткі</translation> @@ -4898,6 +4914,7 @@ <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> – абагульваецца змесціва працоўнага стала</translation> <translation id="6580203076670148210">Хуткасць праверкі</translation> <translation id="6582080224869403177">Каб палепшыць сістэму бяспекі, скіньце налады прылады <ph name="DEVICE_TYPE" />.</translation> +<translation id="6582274660680936615">Вы выкарыстоўваеце браўзер як госць</translation> <translation id="6584878029876017575">Бестэрміновы подпіс Microsoft</translation> <translation id="6586099239452884121">Гасцявы прагляд</translation> <translation id="6586451623538375658">Змяніць асноўную кнопку мышы</translation> @@ -5067,6 +5084,7 @@ <translation id="6782468519961184511">Адміністратар не дазваляе выкарыстоўваць дадатковыя Уліковыя запісы Google</translation> <translation id="6785518634832172390">PIN-код павінен змяшчаць не больш за 12 сімвалаў</translation> <translation id="6786747875388722282">Пашырэнні</translation> +<translation id="6787097042755590313">Іншая ўкладка</translation> <translation id="6787839852456839824">Спалучэнні клавіш</translation> <translation id="6788210894632713004">Распакаванае пашырэнне</translation> <translation id="6789592661892473991">Падзяліць гарызантальна</translation> @@ -5077,6 +5095,7 @@ <translation id="6793723358811598107">Клавіша "<ph name="CURRENTKEY" />" ужо прызначана для дзеяння "<ph name="ACTION" />" Каб выйсці, націсніце любую клавішу.</translation> <translation id="6795884519221689054">Панда</translation> <translation id="6797493596609571643">На жаль, нешта пайшло не так.</translation> +<translation id="6798420440063423019">Ключ бяспекі заблакіраваны, бо занадта шмат разоў быў уведзены няправільны PIN-код. Вам трэба будзе скінуць ключ бяспекі.</translation> <translation id="6798578729981748444">Каб завяршыць імпартаванне, закрыйце ўсе вокны Firefox.</translation> <translation id="6798780071646309401">Caps Lock уключаны</translation> <translation id="6798954102094737107">Убудова "<ph name="PLUGIN_NAME" />"</translation> @@ -5422,6 +5441,7 @@ <translation id="7180865173735832675">Наладзіць</translation> <translation id="7182791023900310535">Перамясціце пароль</translation> <translation id="7186088072322679094">Пакінуць у панэлі інструментаў</translation> +<translation id="7186303001964993981">Сайт <ph name="ORIGIN" /> не можа адкрываць гэту папку, бо ў ёй знаходзяцца сістэмныя файлы</translation> <translation id="7187428571767585875">Запісы рэестра, якія будуць выдалены або зменены:</translation> <translation id="7187855807420906517">Пасля таго як вы зноў падключаецеся да інтэрнэту, сайты звычайна працягваюць сінхранізацыю для завяршэння задач (такіх як запампоўванне фота або адпраўка паведамлення ў чаце)</translation> <translation id="7189234443051076392">Праверце, ці дастаткова месца на прыладзе</translation> @@ -6042,6 +6062,7 @@ <translation id="7871109039747854576">Выкарыстоўваць клавішы <ph name="COMMA" /> і <ph name="PERIOD" /> для пераходу паміж старонкамі спіса кандыдатаў</translation> <translation id="787268756490971083">Выключана</translation> <translation id="7874257161694977650">Фоны Chrome</translation> +<translation id="7876027585589532670">Не ўдалося змяніць ярлык</translation> <translation id="7877451762676714207">Невядомая памылка сервера. Паўтарыце спробу або звярніцеся да адміністратара сервера.</translation> <translation id="7879631849810108578">Спалучэнне клавіш зададзена: <ph name="IDS_SHORT_SET_COMMAND" /></translation> <translation id="7880823633812189969">Пры перазапуску лакальныя даныя будуць выдалены</translation> @@ -6327,6 +6348,7 @@ <translation id="8189750580333936930">Privacy Sandbox</translation> <translation id="8190193592390505034">Ідзе падключэнне да правайдара <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">Кіраваць праграмамі, пашырэннямі і тэмамі</translation> +<translation id="8192944472786724289">Праграма "<ph name="APP_NAME" />" запытвае дазвол на абагульванне змесціва экрана.</translation> <translation id="8195027750202970175">Месца на дыску</translation> <translation id="8198323535106903877">Будуць усталяваны гэтыя праграмы (<ph name="NUMBER_OF_APPS" /> шт.)</translation> <translation id="8199300056570174101">Уласцівасці прылады і сеткі (сэрвісу)</translation> @@ -6979,6 +7001,7 @@ <translation id="8931475688782629595">Кіраванне данымі для сінхранізацыі</translation> <translation id="8932654652795262306">Звесткі пра Імгненны рэжым мадэма</translation> <translation id="8932894639908691771">Параметры доступу праз пераключальнікі</translation> +<translation id="893298445929867520">Кошыкі схаваны. Яны з'явяцца тут зноў, калі вы ўнесяце змены.</translation> <translation id="8933960630081805351">&Паказаць у акне Finder</translation> <translation id="8934732568177537184">Далей</translation> <translation id="8938306522009698937">апрацоўшчыкі</translation> @@ -7255,6 +7278,7 @@ <translation id="942532530371314860"><ph name="APP_NAME" /> абагульвае гук і ўкладку Chrome.</translation> <translation id="945522503751344254">Адправіць водгук</translation> <translation id="947329552760389097">&Праверыць элементы</translation> +<translation id="947667444780368238">Сайт <ph name="ORIGIN" /> не можа адкрываць файлы ў гэтай папцы, бо ў ёй знаходзяцца сістэмныя файлы</translation> <translation id="951991426597076286">Адхіліць</translation> <translation id="956500788634395331">Вы абаронены ад патэнцыйна шкодных пашырэнняў</translation> <translation id="957960681186851048">Гэты сайт паспрабаваў аўтаматычна спампаваць некалькі файлаў</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index 21cb097..b2efe9d 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -197,7 +197,7 @@ <translation id="1213254615020057352">Envía datos de uso y diagnóstico. Para ayudar a mejorar la experiencia de Android de tu hijo, envía a Google datos de diagnóstico y uso de dispositivos y apps de forma automática. Esta información no se usará para identificar a tu hijo y ayudará a lograr la estabilidad de las apps y el sistema, entre otras mejoras. Algunos datos agregados también ayudarán a las apps y los socios de Google, como los desarrolladores de Android. El propietario controla esta configuración. Es posible que el propietario decida enviar a Google datos de uso y diagnóstico de este dispositivo. Si habilitaste la Actividad de web y de aplicaciones adicional en la Cuenta de Google de tu hijo, es posible que se almacenen estos datos en esa cuenta.</translation> <translation id="121384500095351701">No se puede descargar este archivo de forma segura</translation> <translation id="1215411991991485844">Nueva aplicación en segundo plano agregada</translation> -<translation id="1216542092748365687">Quitar huella digital</translation> +<translation id="1216542092748365687">Quitar huella dactilar</translation> <translation id="1217483152325416304">Pronto se borrarán tus datos locales</translation> <translation id="1217668622537098248">Volver al clic con el botón izquierdo después de la acción</translation> <translation id="121783623783282548">Las contraseñas no coinciden.</translation> @@ -302,7 +302,7 @@ <translation id="1334384124770871673">Por lo general, los sitios utilizan los sensores de movimiento del dispositivo para habilitar funciones, como la realidad virtual o el conteo de pasos.</translation> <translation id="133535873114485416">Método de entrada preferido</translation> <translation id="1335929031622236846">Inscribe tu dispositivo</translation> -<translation id="1336902454946927954">Se bloqueó la llave de seguridad porque no se reconoció tu huella digital. Para desbloquearla, ingresa el PIN.</translation> +<translation id="1336902454946927954">Se bloqueó la llave de seguridad porque no se reconoció tu huella dactilar. Para desbloquearla, ingresa el PIN.</translation> <translation id="1337692097987160377">Compartir esta pestaña</translation> <translation id="1338802252451106843"><ph name="ORIGIN" /> quiere abrir esta app.</translation> <translation id="1338950911836659113">Eliminando…</translation> @@ -455,7 +455,7 @@ <translation id="1506061864768559482">Motor de búsqueda</translation> <translation id="1507170440449692343">Esta página no tiene permiso para acceder a la cámara.</translation> <translation id="1507246803636407672">&Descartar</translation> -<translation id="1508491105858779599">Coloca tu dedo en el sensor de huella digital para desbloquear el dispositivo.</translation> +<translation id="1508491105858779599">Coloca tu dedo en el sensor de huella dactilar para desbloquear el dispositivo.</translation> <translation id="1508575541972276599">La versión actual es Debian 9 (Stretch)</translation> <translation id="1509281256533087115">Accede a cualquier <ph name="DEVICE_NAME_AND_VENDOR" /> a través de USB</translation> <translation id="1509960214886564027">Es posible que las características de muchos sitios no funcionen de forma correcta</translation> @@ -656,7 +656,7 @@ <translation id="1714644264617423774">Permite habilitar las funciones de accesibilidad para que tu dispositivo sea más fácil de usar. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="1717218214683051432">Sensores de movimiento</translation> <translation id="1718835860248848330">Última hora</translation> -<translation id="1719312230114180055">Nota: La huella digital puede ser menos segura que un PIN o una contraseña eficaz.</translation> +<translation id="1719312230114180055">Nota: La huella dactilar puede ser menos segura que un PIN o una contraseña eficaz.</translation> <translation id="1720318856472900922">Autenticación de servidor TLS WWW</translation> <translation id="1721312023322545264">Necesitas permiso de <ph name="NAME" /> para visitar este sitio</translation> <translation id="1722460139690167654"><ph name="ENROLLMENT_DOMAIN" /> administra tu <ph name="BEGIN_LINK" /><ph name="DEVICE_TYPE" /><ph name="END_LINK" /></translation> @@ -698,7 +698,7 @@ <translation id="175772926354468439">Habilitar tema</translation> <translation id="17584710573359123">Ver en Chrome Web Store</translation> <translation id="1761845175367251960">Cuentas de <ph name="NAME" /></translation> -<translation id="176193854664720708">El sensor de huellas digitales es el botón de encendido. Tócalo suavemente con cualquier dedo.</translation> +<translation id="176193854664720708">El sensor de huellas dactilares es el botón de encendido. Tócalo suavemente con cualquier dedo.</translation> <translation id="176272781006230109">sugerencias de compras</translation> <translation id="1763046204212875858">Crear accesos directos a aplicaciones</translation> <translation id="1763808908432309942">Se abre en una pestaña nueva</translation> @@ -1373,7 +1373,7 @@ <translation id="2509566264613697683">8x</translation> <translation id="2510988373360790637">Olvidar el dispositivo Bluetooth</translation> <translation id="2513396635448525189">Imagen de acceso</translation> -<translation id="2514326558286966059">Desbloquea más rápido con tu huella digital</translation> +<translation id="2514326558286966059">Desbloquea más rápido con tu huella dactilar</translation> <translation id="2515586267016047495">Alt</translation> <translation id="2517472476991765520">Buscar</translation> <translation id="2518024842978892609">Usar los certificados de cliente</translation> @@ -2217,7 +2217,7 @@ <translation id="3473241910002674503">Con los botones del modo tablet, puedes navegar hacia la pantalla de inicio, regresar y cambiar de apps.</translation> <translation id="3473479545200714844">Lupa</translation> <translation id="3474218480460386727">Las palabras nuevas pueden tener un máximo de 99 letras.</translation> -<translation id="3475843873335999118">No se puede reconocer tu huella digital. Ingresa tu contraseña.</translation> +<translation id="3475843873335999118">No se puede reconocer tu huella dactilar. Ingresa tu contraseña.</translation> <translation id="3476303763173086583">Envía datos de uso y diagnóstico. Para ayudar a mejorar la experiencia de Android de tu hijo, envía a Google datos de diagnóstico y uso de dispositivos y apps de forma automática. Esta información no se usará para identificar a tu hijo y ayudará a lograr la estabilidad de las apps y el sistema, entre otras mejoras. Algunos datos agregados también ayudarán a las apps y los socios de Google, como los desarrolladores de Android. El propietario controla esta <ph name="BEGIN_LINK1" />configuración<ph name="END_LINK1" />. Es posible que el propietario decida enviar a Google datos de uso y diagnóstico de este dispositivo. Si habilitaste la "Actividad de web y de aplicaciones adicional" en la Cuenta de Google de tu hijo, es posible que se almacenen estos datos en esa cuenta. <ph name="BEGIN_LINK2" />Más información<ph name="END_LINK2" /></translation> <translation id="347670947055184738">El sistema no pudo recuperar la política para tu dispositivo.</translation> <translation id="347785443197175480">Continuar permitiendo que <ph name="HOST" /> acceda a la cámara y al micrófono</translation> @@ -2339,7 +2339,7 @@ <translation id="3613134908380545408">Mostrar <ph name="FOLDER_NAME" /></translation> <translation id="3613422051106148727">&Abrir en una pestaña nueva</translation> <translation id="3614974189435417452">Se completó la copia de seguridad</translation> -<translation id="3615073365085224194">Toca el sensor de huellas digitales con el dedo</translation> +<translation id="3615073365085224194">Toca el sensor de huellas dactilares con el dedo</translation> <translation id="3615579745882581859">Se está analizando <ph name="FILE_NAME" />.</translation> <translation id="3616741288025931835">Eliminar datos de navega&ción...</translation> <translation id="3617891479562106823">Los fondos no están disponibles. Vuelve a intentarlo más tarde.</translation> @@ -2367,7 +2367,7 @@ <translation id="3640214691812501263">¿Quieres agregar "<ph name="EXTENSION_NAME" />" para <ph name="USER_NAME" />?</translation> <translation id="3640613767643722554">Enséñale al Asistente a reconocer tu voz</translation> <translation id="3643637292669952403">No permitir que los sitios vean tu ubicación</translation> -<translation id="3645372836428131288">Mueve el dedo ligeramente para capturar otra parte de la huella digital.</translation> +<translation id="3645372836428131288">Mueve el dedo ligeramente para capturar otra parte de la huella dactilar.</translation> <translation id="3647998456578545569">{COUNT,plural, =1{<ph name="ATTACHMENTS" /> recibido de <ph name="DEVICE_NAME" />}other{<ph name="ATTACHMENTS" /> recibidos de <ph name="DEVICE_NAME" />}}</translation> <translation id="3648348069317717750">Se detectó <ph name="USB_DEVICE_NAME" /></translation> <translation id="3649138363871392317">Se capturó la foto.</translation> @@ -3147,7 +3147,7 @@ <translation id="4533985347672295764">Tiempo de CPU</translation> <translation id="4534661889221639075">Vuelve a intentarlo.</translation> <translation id="4535127706710932914">Perfil predeterminado</translation> -<translation id="4535767533210902251">El sensor de huellas digitales es la opción de la parte superior derecha del teclado. Tócalo suavemente con un dedo.</translation> +<translation id="4535767533210902251">El sensor de huellas dactilares es la opción de la parte superior derecha del teclado. Tócalo suavemente con un dedo.</translation> <translation id="4536140153723794651">Sitios que siempre pueden usar cookies</translation> <translation id="4538417792467843292">Eliminar palabra</translation> <translation id="4538792345715658285">Instalada por una política empresarial</translation> @@ -3175,7 +3175,7 @@ <translation id="4558426062282641716">Solicitud de permiso de inicio automático</translation> <translation id="4559617833001311418">Este sitio puede acceder a los sensores de movimiento o luz.</translation> <translation id="4561893854334016293">No se cambió ningún permiso recientemente</translation> -<translation id="4562155214028662640">Agregar huella digital</translation> +<translation id="4562155214028662640">Agregar huella dactilar</translation> <translation id="4563210852471260509">El idioma inicial de entrada es chino</translation> <translation id="4563880231729913339">Dedo 3</translation> <translation id="4565377596337484307">Ocultar contraseña</translation> @@ -4141,7 +4141,7 @@ <translation id="5689516760719285838">Ubicación</translation> <translation id="56907980372820799">Vincular datos</translation> <translation id="5691581861107245578">Obtén sugerencias de emojis basadas en lo que estás escribiendo</translation> -<translation id="5691772641933328258">No se reconoció la huella digital</translation> +<translation id="5691772641933328258">No se reconoció la huella dactilar</translation> <translation id="5692183275898619210">Se completó la impresión</translation> <translation id="5695184138696833495">ADB de apps para Android en Linux</translation> <translation id="5696143504434933566">Informar abuso de "<ph name="EXTENSION_NAME" />"</translation> @@ -4408,7 +4408,7 @@ <translation id="6006484371116297560">Clásico</translation> <translation id="6007240208646052708">La búsqueda por voz no está disponible en tu idioma.</translation> <translation id="6011074160056912900">Red de Ethernet</translation> -<translation id="6011193465932186973">Huella digital</translation> +<translation id="6011193465932186973">Huella dactilar</translation> <translation id="6011449291337289699">Borrar los datos del sitio</translation> <translation id="6013027779243312217">Obtener subtítulos para el audio y el video</translation> <translation id="6015796118275082299">Año</translation> @@ -4422,7 +4422,7 @@ <translation id="6023643151125006053">El administrador de <ph name="SAML_DOMAIN" /> bloqueó este dispositivo (NS: <ph name="SERIAL_NUMBER" />).</translation> <translation id="6025215716629925253">Seguimiento de la pila</translation> <translation id="6026819612896463875"><ph name="WINDOW_TITLE" />: Se conectó el dispositivo USB</translation> -<translation id="6028117231645531007">Agregar huella digital</translation> +<translation id="6028117231645531007">Agregar huella dactilar</translation> <translation id="6031600495088157824">Opciones de entrada de la barra de herramientas</translation> <translation id="6032715498678347852">Haz clic en una extensión para otorgarle acceso a este sitio.</translation> <translation id="6032912588568283682">Sistema de archivos</translation> @@ -5440,7 +5440,7 @@ <translation id="7187855807420906517">Después de que sales de los sitios y vuelves a conectarte, por lo general los sitios se siguen sincronizando para completar tareas, como la de subir fotos o enviar un mensaje de chat.</translation> <translation id="7189234443051076392">Asegúrate de que haya espacio suficiente en tu dispositivo</translation> <translation id="7189451821249468368">No tienes suficientes actualizaciones para inscribir este dispositivo; comunícate con el vendedor para adquirir más. Si crees que recibiste este mensaje por error, comunícate con el servicio de asistencia.</translation> -<translation id="7189965711416741966">Se agregó una huella digital.</translation> +<translation id="7189965711416741966">Se agregó una huella dactilar.</translation> <translation id="7191159667348037">Impresora desconocida (USB)</translation> <translation id="7193051357671784796">Tu organización agregó esta app. Para finalizar la instalación, restablece la app.</translation> <translation id="7193374945610105795">No se guardó ninguna contraseña para <ph name="ORIGIN" /></translation> @@ -5512,7 +5512,7 @@ <translation id="7258697411818564379">Se agregó tu PIN</translation> <translation id="7262004276116528033">El servicio de acceso a la cuenta está alojado en <ph name="SAML_DOMAIN" /></translation> <translation id="7267044199012331848">No se pudo instalar la máquina virtual. Inténtalo de nuevo o comunícate con el administrador. Código de error: <ph name="ERROR_CODE" />.</translation> -<translation id="7267875682732693301">Sigue levantando el dedo para agregar diferentes partes de la huella digital.</translation> +<translation id="7267875682732693301">Sigue levantando el dedo para agregar diferentes partes de la huella dactilar.</translation> <translation id="7268127947535186412">Esta configuración la administra el propietario del dispositivo.</translation> <translation id="7269736181983384521">Uso de datos de Compartir con Nearby</translation> <translation id="7270858098575133036">Preguntarme cuando un sitio quiera usar los mensajes exclusivos del sistema para acceder a dispositivos MIDI</translation> @@ -5581,7 +5581,7 @@ <translation id="7352651011704765696">Se produjo un error</translation> <translation id="7353261921908507769">Tus contactos pueden compartir contenido contigo cuando están cerca. Las transferencias no comenzarán hasta que las aceptes.</translation> <translation id="735361434055555355">Instalando Linux…</translation> -<translation id="7354341762311560488">El sensor de huellas digitales se encuentra en la esquina inferior izquierda del teclado. Tócalo suavemente con un dedo.</translation> +<translation id="7354341762311560488">El sensor de huellas dactilares se encuentra en la esquina inferior izquierda del teclado. Tócalo suavemente con un dedo.</translation> <translation id="7356908624372060336">Registros de red</translation> <translation id="735745346212279324">VPN desconectada</translation> <translation id="7360233684753165754"><ph name="PAGE_NUMBER" /> páginas a <ph name="PRINTER_NAME" /></translation> @@ -5773,7 +5773,7 @@ <translation id="7574650250151586813">Para ingresar texto, actualiza la app de Teclado Daydream</translation> <translation id="7576690715254076113">Intercalar</translation> <translation id="7576976045740938453">Hubo un problema con la cuenta en el modo de demostración.</translation> -<translation id="7578137152457315135">Configuración de la huella digital</translation> +<translation id="7578137152457315135">Configuración de la huella dactilar</translation> <translation id="7578692661782707876">Ingresa tu código de confirmación.</translation> <translation id="7580671184200851182">Reproducir el mismo audio en todos los altavoces (sonido mono)</translation> <translation id="7581462281756524039">Una herramienta de limpieza</translation> @@ -6585,7 +6585,7 @@ <translation id="8487678622945914333">Acercar</translation> <translation id="8489156414266187072">Las sugerencias personales solo se muestran en tu cuenta</translation> <translation id="8490896350101740396">Se actualizaron las siguientes aplicaciones de kiosco "<ph name="UPDATED_APPS" />". Reinicia el dispositivo para completar el proceso de actualización.</translation> -<translation id="8492685019009920170">Toca el sensor de huellas digitales con el dedo. Tus datos se almacenan de forma segura y no salen de tu <ph name="DEVICE_TYPE" />.</translation> +<translation id="8492685019009920170">Toca el sensor de huellas dactilares con el dedo. Tus datos se almacenan de forma segura y no salen de tu <ph name="DEVICE_TYPE" />.</translation> <translation id="8492822722330266509">Permitir que los sitios abran ventanas emergentes y usen redireccionamientos</translation> <translation id="8492972329130824181">La red doméstica no está disponible. Debes habilitar el roaming de datos móviles para tener conexión.</translation> <translation id="8493236660459102203">Micrófono:</translation> @@ -6783,8 +6783,8 @@ <translation id="8720200012906404956">Buscando una red móvil. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation> <translation id="8720816553731218127">Se agotó el tiempo de la inicialización de los atributos de tiempo de instalación.</translation> <translation id="8722912030556880711">Envía datos de uso y diagnóstico. De forma automática, este dispositivo está enviando a Google datos de diagnóstico y sobre el uso del dispositivo y las apps. Esta información ayudará a lograr la estabilidad de las apps y el sistema, entre otras mejoras. Algunos datos agregados también ayudarán a las apps y los socios de Google, como los desarrolladores de Android. Si habilitaste la "Actividad de web y de aplicaciones adicional", es posible que se almacenen estos datos en tu Cuenta de Google. <ph name="BEGIN_LINK2" />Más información<ph name="END_LINK2" /></translation> -<translation id="8724405322205516354">Cuando veas este ícono, usa tu huella digital para identificarte o aprobar compras.</translation> -<translation id="8724409975248965964">Se agregó la huella digital</translation> +<translation id="8724405322205516354">Cuando veas este ícono, usa tu huella dactilar para identificarte o aprobar compras.</translation> +<translation id="8724409975248965964">Se agregó la huella dactilar</translation> <translation id="8724859055372736596">Mo&strar en carpeta</translation> <translation id="8725066075913043281">Intentar nuevamente</translation> <translation id="8725178340343806893">Favoritos/Favoritos</translation> @@ -7052,7 +7052,7 @@ <translation id="8995603266996330174">Administrado por <ph name="DOMAIN" /></translation> <translation id="8996526648899750015">Agregar cuenta…</translation> <translation id="899657321862108550">Tu navegador Chrome, en todos lados</translation> -<translation id="899676909165543803">El sensor de huellas digitales se encuentra en la esquina inferior derecha del teclado. Tócalo suavemente con un dedo.</translation> +<translation id="899676909165543803">El sensor de huellas dactilares se encuentra en la esquina inferior derecha del teclado. Tócalo suavemente con un dedo.</translation> <translation id="8999560016882908256">Error de sintaxis seccional: <ph name="ERROR_LINE" /></translation> <translation id="9003647077635673607">Permitir en todos los sitios web</translation> <translation id="9003677638446136377">Volver a comprobar</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index 6a25092..999a22b 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -575,6 +575,7 @@ <translation id="1627408615528139100">Juba alla laaditud</translation> <translation id="1628948239858170093">Kas skannida faili enne avamist?</translation> <translation id="1629314197035607094">Parool on aegunud</translation> +<translation id="1629521517399325891">Kasutaja sertifikaat pole võrgu autentimiseks saadaval.</translation> <translation id="163072119192489970">Lubatud andmete saatmine ja vastuvõtmine lõpule viia</translation> <translation id="1630768113285622200">Taaskäivita ja jätka</translation> <translation id="1632082166874334883">Parool salvestati teie Google'i kontole</translation> @@ -1179,6 +1180,7 @@ <translation id="2300383962156589922">Rakenduse <ph name="APP_NAME" /> kohandamine ja juhtimine</translation> <translation id="2301382460326681002">Laienduse juurkaust on kehtetu.</translation> <translation id="23030561267973084">„<ph name="EXTENSION_NAME" />” on taotlenud täiendavaid lube.</translation> +<translation id="230529452743010958">Näete seda üksust oma varasemate tegevuste põhjal Google'i teenustes. Saate oma andmeid vaadata ja kustutada ning oma seadeid muuta saidil <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="23055578400314116">Valige kasutajanimi</translation> <translation id="2307462900900812319">Seadista võrk</translation> <translation id="230927227160767054">Leht soovib installida teenusetöötleja.</translation> @@ -1405,6 +1407,7 @@ <translation id="2541706104884128042">Määrati uus uneaeg</translation> <translation id="2542050502251273923">Määrab võrguühenduse halduri ja muude üksust ff_debug kasutavate teenuste silumise taseme.</translation> <translation id="2544292303401268586">Administraator taotles teie seadme taaskäivitamist, et rakendusi värskendada. Selleks võib kuluda mitu minutit.</translation> +<translation id="2544352060595557290">See vaheleht</translation> <translation id="2544853746127077729">Võrk lükkas autentimissertifikaadi tagasi</translation> <translation id="2546283357679194313">Küpsised ja saidiandmed</translation> <translation id="2548347166720081527">Lubati <ph name="PERMISSION" /></translation> @@ -1570,6 +1573,7 @@ <translation id="2734760316755174687">Rühmas <ph name="SITE_GROUP_NAME" /> olevad saidid lähtestatakse samuti.</translation> <translation id="2735712963799620190">Ajakava</translation> <translation id="2737363922397526254">Ahenda ...</translation> +<translation id="2737916598897808047"><ph name="APP_NAME" /> soovib teie ekraanikuval olevat sisu jagada vahelehega <ph name="TARGET_NAME" />.</translation> <translation id="2738771556149464852">Mitte pärast</translation> <translation id="2739191690716947896">Silu</translation> <translation id="2739240477418971307">Juurdepääsetavuse seadete muutmine</translation> @@ -2398,6 +2402,7 @@ <translation id="3677911431265050325">Taotle mobiilisaiti</translation> <translation id="3677959414150797585">Hõlmab rakendusi, veebilehti ja muud. Saadab soovituste parandamiseks statistikat ainult siis, kui olete valinud kasutusandmete jagamise.</translation> <translation id="3678156199662914018">Laiend: <ph name="EXTENSION_NAME" /></translation> +<translation id="3678188444105291936">Lehti, mida vaatate selles aknas, ei lisata teie brauseri ajalukku ja pärast väljalogimist ei jää neist arvutisse ka muid jälgi (nt küpsisefaile). Allalaaditud faile ja loodud järjehoidjaid ei säilitata.</translation> <translation id="3680683624079082902">Kõnesünteesi hääl</translation> <translation id="3681311097828166361">Täname teid tagasiside eest. Te pole praegu võrguga ühendatud ja aruanne saadetakse hiljem.</translation> <translation id="3682824389861648626">Liikumislävi</translation> @@ -2599,6 +2604,7 @@ <translation id="3884152383786131369">Mitmes keeles saadaval olev veebisisu esitatakse loendi esimeses toetatud keeles. Need eelistused sünkroonitakse teie brauseri seadetega. <ph name="BEGIN_LINK_LEARN_MORE" />Lisateave<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3886446263141354045">Teie juurdepääsutaotlus sellele saidile saadeti kasutajale <ph name="NAME" /></translation> <translation id="3888550877729210209">Märkmete tegemine rakendusega <ph name="LOCK_SCREEN_APP_NAME" /></translation> +<translation id="3888586133700543064">See teave aitab meil teie assistendiga seotud probleemi paremini mõista. See salvestakse kuni 90 päevaks ning sellele pääsevad juurde ainult asjakohased inseneri- ja tagasisidetiimid.</translation> <translation id="3890064827463908288">WiFi sünkroonimise kasutamiseks lülitage sisse Chrome'i sünkroonimine</translation> <translation id="3892414795099177503">Lisa OpenVPN/L2TP …</translation> <translation id="3893536212201235195">Juurdepääsetavuse seadete lugemine ja muutmine</translation> @@ -2630,6 +2636,7 @@ <translation id="3916445069167113093">Seda tüüpi fail võib teie arvutit kahjustada. Kas soovite faili <ph name="FILE_NAME" /> ikkagi alles hoida?</translation> <translation id="3918972485393593704">Teavita üksikasjadest Google'it</translation> <translation id="3919145445993746351">Oma laienduste nägemiseks kõigis arvutites lülitage sisse sünkroonimine</translation> +<translation id="3919798653937160644">Lehti, mida vaatate selles aknas, ei lisata teie brauseri ajalukku ja pärast kõikide avatud külalisrežiimi akende sulgemist ei jää neist arvutisse ka muid jälgi (nt küpsisefaile). Kõik allalaaditud failid siiski säilitatakse.</translation> <translation id="3920504717067627103">Sertifikaadi eeskirjad</translation> <translation id="392089482157167418">Luba ChromeVox (kõnena esitatud tagasiside)</translation> <translation id="3920909973552939961">Pole lubatud maksetöötlejaid installida</translation> @@ -2967,6 +2974,7 @@ <translation id="4332976768901252016">Vanemliku järelevalve seadistamine</translation> <translation id="4333854382783149454">PKCS 1 SHA-1 koos RSA krüpteerimisega</translation> <translation id="4336434711095810371">Kustuta kõik andmed</translation> +<translation id="4340125850502689798">Sobimatu kasutajanimi</translation> <translation id="4340515029017875942"><ph name="ORIGIN" /> tahab suhelda rakendusega „<ph name="EXTENSION_NAME" />”</translation> <translation id="4340575312453649552">See reklaam kasutas teie seadmes liiga palju ressursse, seetõttu Chrome eemaldas selle.</translation> <translation id="4341577178275615435">Sisestusmärgiga sirvimise sisse- ja väljalülitamiseks võite kasutada kiirklahvi F7</translation> @@ -3581,6 +3589,7 @@ <translation id="5057110919553308744">Laiendusel klõpsamisel</translation> <translation id="5057403786441168405">Hallake oma sisselogitud kontosid. Veebisaidid, rakendused ja laiendused Chrome’is ning Google Plays võivad olenevalt lubadest kasutada neid kontosid teie kasutuskogemuse isikupärastamiseks. <ph name="LINK_BEGIN" />Lisateave<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Sisselogimise piiramine</translation> +<translation id="5059526285558225588">Valige, mida jagada</translation> <translation id="5060332552815861872">Salvestamiseks on saadaval 1 printer.</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{Kaust sisaldab järjehoidjat. Kas soovite kindlasti selle kustutada?}other{Kaust sisaldab # järjehoidjat. Kas soovite kindlasti selle kustutada?}}</translation> <translation id="5062930723426326933">Sisselogimine ebaõnnestus. Looge ühendus Internetiga ja proovige uuesti.</translation> @@ -3697,6 +3706,7 @@ <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">Taaselustage oma lemmikmälestused. Albumite lisamiseks või muutmiseks avage rakendus <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" />.</translation> <translation id="5190926251776387065">Aktiveeri port</translation> +<translation id="5191094172448199359">Teie sisestatud PIN-koodid ei ühti</translation> <translation id="5191251636205085390">Vaadake lisateavet uute tehnoloogiate kohta, mille eesmärk on kolmandate osapoolte küpsisefailid asendada, ja õppige neid haldama.</translation> <translation id="51918995459521422"><ph name="ORIGIN" /> soovib alla laadida mitu faili</translation> <translation id="5192062846343383368">Avage rakendus Family Link, et näha järelevalve seadeid</translation> @@ -3709,6 +3719,7 @@ <translation id="5204673965307125349">Käitage seadmes funktsiooni Powerwash ja proovige uuesti.</translation> <translation id="5204967432542742771">Sisestage parool</translation> <translation id="5205484256512407285">Mobiilset andmesidet ei kasutata ülekandmiseks kunagi</translation> +<translation id="520568280985468584">Võrgu lisamine õnnestus. Teie mobiilsidevõrgu aktiveerimine võib võtta mitu minutit.</translation> <translation id="5206215183583316675">Kas kustutada „<ph name="CERTIFICATE_NAME" />”?</translation> <translation id="520621735928254154">Viga sertifikaadi importimisel</translation> <translation id="5206787458656075734">{COUNT,plural, =1{Ohustatud parooli muutmine õnnestus. Teil on veel # ohustatud parool. Chrome soovitab seda parooli kohe kontrollida.}other{Ohustatud parooli muutmine õnnestus. Teil on veel # ohustatud parooli. Chrome soovitab neid paroole kohe kontrollida.}}</translation> @@ -4343,6 +4354,7 @@ <translation id="5935656526031444304">Google'i ohutu sirvimise haldamine</translation> <translation id="5938002010494270685">Turvavärskendus on saadaval</translation> <translation id="5939518447894949180">Lähtesta</translation> +<translation id="5939719276406088041">Otseteed ei saa luua</translation> <translation id="5941153596444580863">Lisa isik ...</translation> <translation id="5941343993301164315">Logige üksusele <ph name="TOKEN_NAME" /> sisse.</translation> <translation id="5941711191222866238">Minimeeri</translation> @@ -4430,6 +4442,7 @@ <translation id="6043994281159824495">Logi nüüd välja</translation> <translation id="6044805581023976844">Rakendus <ph name="APP_NAME" /> jagab Chrome'i vahelehte ja heli vahelehega <ph name="TAB_NAME" />.</translation> <translation id="6045114302329202345">Peamine TrackPointi nupp</translation> +<translation id="6047632800149092791">Sünkroonimine ei tööta. Logige välja ja seejärel uuesti sisse.</translation> <translation id="6049004884579590341">Täisekraanilt väljumiseks vajutage pikalt klahvi |<ph name="ACCELERATOR" />|</translation> <translation id="6051354611314852653">Vabandust! Süsteemil ei õnnestunud saada sellele seadmele API juurdepääsu.</translation> <translation id="6052976518993719690">SSL-i sertimiskeskus</translation> @@ -4522,6 +4535,7 @@ <translation id="6143186082490678276">Abi hankimine</translation> <translation id="6143366292569327983">Valige lehe keel, millest soovite tõlkida</translation> <translation id="6144938890088808325">Aidake meil Chromebooke täiustada</translation> +<translation id="6146409560350811147">Sünkroonimine ei tööta. Proovige uuesti sisse logida.</translation> <translation id="6147020289383635445">Prindi eelvaade nurjus.</translation> <translation id="6148576794665275391">Praegu avatud</translation> <translation id="6149015141270619212">Internetiga ei saa ühendust luua</translation> @@ -4589,6 +4603,7 @@ <translation id="6232017090690406397">Aku</translation> <translation id="6232116551750539448">Ühendus üksusega <ph name="NAME" /> katkes</translation> <translation id="6233154960150021497">Kasuta vaikimisi häält, mitte klaviatuuri</translation> +<translation id="6234108445915742946">Chrome'i teenusetingimused muutuvad 31. märtsil</translation> <translation id="6234474535228214774">Installimine on ootel</translation> <translation id="6237474966939441970">Elektronpliiatsiga märkmete tegemise rakendus</translation> <translation id="6237816943013845465">Võimaldab kohandada ekraani eraldusvõimet</translation> @@ -4888,6 +4903,7 @@ <translation id="656293578423618167">Faili tee või nimi on liiga pikk. Salvestage lühema nimega või muusse asukohta.</translation> <translation id="6563469144985748109">Haldur ei ole seda veel kinnitanud</translation> <translation id="6569934958368283244">Teised inimesed</translation> +<translation id="6573497332121198392">Otseteed ei saa eemaldada</translation> <translation id="657402800789773160">&Laadi see leht uuesti</translation> <translation id="6577284282025554716">Allalaadimine on tühistatud: <ph name="FILE_NAME" /></translation> <translation id="657866106756413002">Võrgu seisukorra ülevaade</translation> @@ -4895,6 +4911,7 @@ <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> – jagab töölaua sisu</translation> <translation id="6580203076670148210">Skannimiskiirus</translation> <translation id="6582080224869403177">Turvafunktsioonide värskendamiseks lähtestage <ph name="DEVICE_TYPE" />.</translation> +<translation id="6582274660680936615">Sirvite külalisena</translation> <translation id="6584878029876017575">Microsofti pikaajaline signeerimine</translation> <translation id="6586099239452884121">Külastajana sirvimine</translation> <translation id="6586451623538375658">Vaheta esmast hiirenuppu</translation> @@ -5064,6 +5081,7 @@ <translation id="6782468519961184511">Teie administraator ei luba täiendavaid Google'i kontosid</translation> <translation id="6785518634832172390">PIN-kood tohib olla kuni 12-kohaline</translation> <translation id="6786747875388722282">Laiendused</translation> +<translation id="6787097042755590313">Muu vaheleht</translation> <translation id="6787839852456839824">Klaviatuuri otseteed</translation> <translation id="6788210894632713004">Pakkimata laiendus</translation> <translation id="6789592661892473991">Horisontaalne poolitamine</translation> @@ -5074,6 +5092,7 @@ <translation id="6793723358811598107"><ph name="CURRENTKEY" /> on juba määratud toimingu <ph name="ACTION" /> jaoks. Väljumiseks vajutage mis tahes klahvi.</translation> <translation id="6795884519221689054">Panda</translation> <translation id="6797493596609571643">Vabandust! Midagi läks valesti.</translation> +<translation id="6798420440063423019">Turvavõti lukustati, kuna vale PIN-kood sisestati liiga palju kordi. Peate turvavõtme lähtestama.</translation> <translation id="6798578729981748444">Importimise lõpetamiseks sulgege kõik Firefoxi aknad.</translation> <translation id="6798780071646309401">suurtähelukk on sisse lülitatud</translation> <translation id="6798954102094737107">Pistikprogramm: <ph name="PLUGIN_NAME" /></translation> @@ -5419,6 +5438,7 @@ <translation id="7180865173735832675">Kohandamine</translation> <translation id="7182791023900310535">Parooli teisaldamine</translation> <translation id="7186088072322679094">Tööriistaribale jätmine</translation> +<translation id="7186303001964993981"><ph name="ORIGIN" /> ei saa seda kausta avada, kuna see sisaldab süsteemifaile</translation> <translation id="7187428571767585875">Eemaldatavad või muudetavad registrikanded:</translation> <translation id="7187855807420906517">Kui lahkute või võrguühenduse katkestate, jätkavad saidid tavaliselt sünkroonimist, et toimingud (nt fotode üleslaadimine või vestlussõnumi saatmine) lõpule viia</translation> <translation id="7189234443051076392">Veenduge, et seadmes oleks piisavalt ruumi</translation> @@ -6039,6 +6059,7 @@ <translation id="7871109039747854576">Kasuta klahve <ph name="COMMA" /> ja <ph name="PERIOD" /> kandidaatide loendi lehitsemiseks</translation> <translation id="787268756490971083">Väljas</translation> <translation id="7874257161694977650">Chrome'i taustad</translation> +<translation id="7876027585589532670">Otseteed ei saa muuta</translation> <translation id="7877451762676714207">Tundmatu serveriviga. Proovige uuesti või võtke ühendust serveri administraatoriga.</translation> <translation id="7879631849810108578">Otsetee on määratud: <ph name="IDS_SHORT_SET_COMMAND" /></translation> <translation id="7880823633812189969">Kohalikud andmed kustutatakse taaskäivitamisel</translation> @@ -6325,6 +6346,7 @@ <translation id="8189750580333936930">Privaatsuse liivakast</translation> <translation id="8190193592390505034">Ühendamine võrku <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">Teie rakenduste, laienduste ja teemade haldamine</translation> +<translation id="8192944472786724289"><ph name="APP_NAME" /> soovib teie ekraanikuval olevat sisu jagada.</translation> <translation id="8195027750202970175">Maht kettal</translation> <translation id="8198323535106903877">Installime need <ph name="NUMBER_OF_APPS" /> rakendust teie eest</translation> <translation id="8199300056570174101">Võrk (teenus) ja seadme atribuudid</translation> @@ -6974,6 +6996,7 @@ <translation id="8931475688782629595">Hallake, mida sünkroonite</translation> <translation id="8932654652795262306">Automaatse jagamise üksikasjad</translation> <translation id="8932894639908691771">Lülitiga juurdepääsu valikud</translation> +<translation id="893298445929867520">Ostukorvid on peidetud. Need kuvatakse uuesti, kui muudatusi teete.</translation> <translation id="8933960630081805351">&Näita otsijas</translation> <translation id="8934732568177537184">Jätka</translation> <translation id="8938306522009698937">töötlejad</translation> @@ -7250,6 +7273,7 @@ <translation id="942532530371314860">Rakendus <ph name="APP_NAME" /> jagab Chrome'i vahelehte ja heli.</translation> <translation id="945522503751344254">Tagasiside saatmine</translation> <translation id="947329552760389097">&Elementide uurimine</translation> +<translation id="947667444780368238"><ph name="ORIGIN" /> ei saa selles kaustas olevaid faile avada, kuna see sisaldab süsteemifaile</translation> <translation id="951991426597076286">Keeldu</translation> <translation id="956500788634395331">Olete potentsiaalselt ohtlike laienduste eest kaitstud</translation> <translation id="957960681186851048">Sait püüdis automaatselt mitut faili alla laadida</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb index a9209ded..4c065c70 100644 --- a/chrome/app/resources/generated_resources_eu.xtb +++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -575,6 +575,7 @@ <translation id="1627408615528139100">Deskargatu da jada</translation> <translation id="1628948239858170093">Ireki aurretik aztertu egin nahi al duzu fitxategia?</translation> <translation id="1629314197035607094">Pasahitza iraungi egin da</translation> +<translation id="1629521517399325891">Erabiltzailearen ziurtagiria ez dago erabilgarri sarea autentifikatzeko.</translation> <translation id="163072119192489970">Datuak bidaltzen eta jasotzen amai dezakete</translation> <translation id="1630768113285622200">Berrabiarazi eta egin aurrera</translation> <translation id="1632082166874334883">Google-ko kontuan gordetako pasahitza</translation> @@ -1179,6 +1180,7 @@ <translation id="2300383962156589922">Pertsonalizatu eta kontrolatu <ph name="APP_NAME" /></translation> <translation id="2301382460326681002">Luzapenaren erro-direktorioak ez du balio.</translation> <translation id="23030561267973084">"<ph name="EXTENSION_NAME" />" luzapenak baimen gehigarriak eskatu ditu.</translation> +<translation id="230529452743010958">Google-ren zerbitzuak erabiltzean egin dituzun jardueretan oinarrituta ari gara erakusten produktua. Jarduera horiei buruzko datuak ikusi eta ezabatu nahi badituzu, eta haiei buruzko ezarpenak aldatu, joan <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> webgunera.</translation> <translation id="23055578400314116">Hautatu erabiltzaile-izen bat</translation> <translation id="2307462900900812319">Konfiguratu sarea</translation> <translation id="230927227160767054">Orri honek zerbitzu-kudeatzaile bat instalatu nahi du.</translation> @@ -1405,6 +1407,7 @@ <translation id="2541706104884128042">Lo egiteko garaia aldatu da</translation> <translation id="2542050502251273923">Sareko konexioaren kudeatzailearen eta beste zerbitzu batzuen arazketa-maila ezartzen du ff_debug erabiliz.</translation> <translation id="2544292303401268586">Aplikazioak eguneratze aldera, gailua berrabiarazteko eskatu dizu administratzaileak. Agian minutu batzuk beharko dira prozesua osatzeko.</translation> +<translation id="2544352060595557290">Fitxa hau</translation> <translation id="2544853746127077729">Sareak autentifikazio-ziurtagiria baztertu du</translation> <translation id="2546283357679194313">Cookieak eta webguneetako datuak</translation> <translation id="2548347166720081527"><ph name="PERMISSION" /> baimendu da</translation> @@ -1570,6 +1573,7 @@ <translation id="2734760316755174687"><ph name="SITE_GROUP_NAME" /> taldeko webguneak ere berrezarriko dira.</translation> <translation id="2735712963799620190">Programazioa</translation> <translation id="2737363922397526254">Tolestu…</translation> +<translation id="2737916598897808047"><ph name="APP_NAME" /> aplikazioak pantailan duzun edukia <ph name="TARGET_NAME" /> fitxarekin partekatu nahi du.</translation> <translation id="2738771556149464852">Ez honen atzetik</translation> <translation id="2739191690716947896">Araztu</translation> <translation id="2739240477418971307">Aldatu erabilerraztasun-ezarpenak</translation> @@ -2398,6 +2402,7 @@ <translation id="3677911431265050325">Eskatu mugikorretarako webgunea</translation> <translation id="3677959414150797585">Aplikazioak, web-orriak eta beste gauza batzuk sartzen dira. Iradokizunak hobetzeko balio duten estatistikak bidaltzen dira erabilera-datuak partekatzea aukeratu baduzu soilik.</translation> <translation id="3678156199662914018">Luzapena: <ph name="EXTENSION_NAME" /></translation> +<translation id="3678188444105291936">Leiho honetan ikusten dituzun orriak ez dira arakatze-historian agertuko eta ez dute ordenagailuan beste inolako aztarnarik utziko (adibidez, cookieak) saioa itxi ondoren. Ez dira gordeko deskargatzen dituzun fitxategiak eta sortzen dituzun laster-markak.</translation> <translation id="3680683624079082902">Testua ahots bihurtzeko eginbidearen ahotsa</translation> <translation id="3681311097828166361">Eskerrik asko oharrak bidaltzeagatik. Konektatuta ez zaudenez, geroago bidaliko da txostena.</translation> <translation id="3682824389861648626">Mugimenduen atalasea</translation> @@ -2599,6 +2604,7 @@ <translation id="3884152383786131369">Hizkuntza onartuen zerrendan agertzen den lehenengo hizkuntza erabiliko dute hizkuntza batean baino gehiagotan dauden web-edukiek. Arakatzaileko ezarpenekin sinkronizatuta daude hobespen horiek. <ph name="BEGIN_LINK_LEARN_MORE" />Lortu informazio gehiago<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3886446263141354045">Bidali zaio webgunean sartzeko eskaera <ph name="NAME" /> erabiltzaileari.</translation> <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" /> aplikazioarekin oharrak idaztea</translation> +<translation id="3888586133700543064">Laguntzailea eginbidearekin duzun arazoa hobeto ulertzeko balio du informazioak. 90 egunez gordeko da, eta ingeniaritza-taldeek nahiz erabiltzaileen iritzien arduradun direnek bakarrik atzitu ahalko dute.</translation> <translation id="3890064827463908288">Aktibatu Chrome-ren Sinkronizazioa Wifi-sinkronizazioa erabiltzeko</translation> <translation id="3892414795099177503">Gehitu OpenVPN/L2TP…</translation> <translation id="3893536212201235195">Irakurri eta aldatu erabilerraztasun-ezarpenak</translation> @@ -2630,6 +2636,7 @@ <translation id="3916445069167113093">Fitxategi mota honek ordenagailuari kalte egin diezaioke. <ph name="FILE_NAME" /> mantendu nahi duzu halere?</translation> <translation id="3918972485393593704">Eman xehetasunen berri Google-ri</translation> <translation id="3919145445993746351">Luzapenak ordenagailu guztietan izateko, aktibatu sinkronizazioa</translation> +<translation id="3919798653937160644">Leiho honetan ikusten dituzun orriak ez dira arakatze-historian agertuko eta ez dute ordenagailuan beste inolako aztarnarik utziko (adibidez, cookieak) gonbidatu moduko leiho guztiak itxi ondoren. Hala ere, deskargatutako fitxategiak mantendu egingo dira.</translation> <translation id="3920504717067627103">Ziurtagiri-gidalerroak</translation> <translation id="392089482157167418">Gaitu ChromeVox (ahozko argibideak)</translation> <translation id="3920909973552939961">Ezin dituzte instalatu ordainketa-kudeatzaileak</translation> @@ -2967,6 +2974,7 @@ <translation id="4332976768901252016">Konfiguratu gurasoen murriztapenak</translation> <translation id="4333854382783149454">PKCS #1 SHA-1 RSA enkriptazioarekin</translation> <translation id="4336434711095810371">Garbitu datu guztiak</translation> +<translation id="4340125850502689798">Erabiltzaile-izenak ez du balio</translation> <translation id="4340515029017875942"><ph name="ORIGIN" /> webguneak "<ph name="EXTENSION_NAME" />" aplikazioarekin komunikatu nahi du</translation> <translation id="4340575312453649552">Iragarki honek gailuko baliabide gehiegi erabili ditu; ondorioz, Chrome-k kendu egin du.</translation> <translation id="4341577178275615435">Testu-kurtsorearen bidez arakatzeko eginbidea aktibatu edo desaktibatzeko, erabili F7 lasterbidea</translation> @@ -3581,6 +3589,7 @@ <translation id="5057110919553308744">Luzapena sakatzen duzunean</translation> <translation id="5057403786441168405">Kudeatu saioa hasita daukaten kontuak. Baimenen arabera, Chrome eta Google Play-ko webgune, aplikazio eta luzapenek kontu horiek erabil ditzakete zerbitzua pertsonalizatzeko. <ph name="LINK_BEGIN" />Lortu informazio gehiago<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Murriztu saioa hasteko aukera</translation> +<translation id="5059526285558225588">Aukeratu zer partekatu</translation> <translation id="5060332552815861872">1 inprimagailu dago gordetzeko.</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{Laster-marka bat du karpeta honek. Ziur ezabatu nahi duzula?}other{# laster-marka ditu karpeta honek. Ziur ezabatu nahi duzula?}}</translation> <translation id="5062930723426326933">Ezin izan da saioa hasi. Konektatu Internetera eta saiatu berriro.</translation> @@ -3697,6 +3706,7 @@ <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">Ekarri gogora gogoko oroitzapenak. Albumak gehitu edo editatzeko, joan <ph name="LINK_BEGIN" />Google Argazkiak<ph name="LINK_END" /> zerbitzura.</translation> <translation id="5190926251776387065">Aktibatu ataka</translation> +<translation id="5191094172448199359">Idatzi dituzun PIN kodeak ez datoz bat</translation> <translation id="5191251636205085390">Kontrolatu hirugarrenen cookieak ordezteko helburua duten teknologia berriak eta lortu haiei buruzko informazio gehiago</translation> <translation id="51918995459521422"><ph name="ORIGIN" /> webguneak fitxategi bat baino gehiago deskargatu nahi ditu</translation> <translation id="5192062846343383368">Zabaldu Family Link aplikazioa gainbegiratze-ezarpenak ikusteko.</translation> @@ -3709,6 +3719,7 @@ <translation id="5204673965307125349">Berrezarri gailuaren fabrikako ezarpenak Powerwash bidez eta saiatu berriro.</translation> <translation id="5204967432542742771">Idatzi pasahitza</translation> <translation id="5205484256512407285">Ez erabili inoiz datu-konexioa transferentziak egiteko</translation> +<translation id="520568280985468584">Gehitu da sarea. Minutu batzuk beharko dira sare mugikorra aktibatzeko.</translation> <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />" ezabatu nahi duzu?</translation> <translation id="520621735928254154">Ziurtagiria inportatzeko errorea</translation> <translation id="5206787458656075734">{COUNT,plural, =1{Aldatu da arriskuan zegoen pasahitza. Arriskuan dauden # pasahitz gehiago daukazu. Pasahitz hori orain egiaztatzea gomendatzen dizu Chrome-k.}other{Aldatu da arriskuan zegoen pasahitza. Arriskuan dauden # pasahitz gehiago dauzkazu. Pasahitz horiek orain egiaztatzea gomendatzen dizu Chrome-k.}}</translation> @@ -4343,6 +4354,7 @@ <translation id="5935656526031444304">Kudeatu arakatze segurua</translation> <translation id="5938002010494270685">Segurtasun-eguneratze bat dago</translation> <translation id="5939518447894949180">Berrezarri</translation> +<translation id="5939719276406088041">Ezin da sortu lasterbidea</translation> <translation id="5941153596444580863">Gehitu pertsona bat…</translation> <translation id="5941343993301164315">Hasi saioa <ph name="TOKEN_NAME" /> gailuan.</translation> <translation id="5941711191222866238">Minimizatu</translation> @@ -4430,6 +4442,7 @@ <translation id="6043994281159824495">Amaitu saioa</translation> <translation id="6044805581023976844"><ph name="APP_NAME" /> Chrome-ko fitxa bat eta audioa partekatzen ari da <ph name="TAB_NAME" /> fitxarekin.</translation> <translation id="6045114302329202345">TrackPoint botoi nagusia</translation> +<translation id="6047632800149092791">Sinkronizazioa ez dabil. Amaitu eta hasi berriro saioa.</translation> <translation id="6049004884579590341">Pantaila osotik irteteko, eduki sakatuta |<ph name="ACCELERATOR" />|</translation> <translation id="6051354611314852653">Sistemak ezin izan dio gailu honi APIa atzitzeko baimenik eman.</translation> <translation id="6052976518993719690">SSL ziurtagiri-emailea</translation> @@ -4522,6 +4535,7 @@ <translation id="6143186082490678276">Lortu laguntza</translation> <translation id="6143366292569327983">Aukeratu orriko hizkuntza, hura itzultzeko</translation> <translation id="6144938890088808325">Lagundu Chromebook-ak hobetzen</translation> +<translation id="6146409560350811147">Sinkronizazioa ez dabil. Hasi saioa berriro.</translation> <translation id="6147020289383635445">Ezin izan da bistaratu inprimatze-aurrebista.</translation> <translation id="6148576794665275391">Ireki</translation> <translation id="6149015141270619212">Ezin da konektatu Internetera</translation> @@ -4589,6 +4603,7 @@ <translation id="6232017090690406397">Bateria</translation> <translation id="6232116551750539448">Galdu egin da <ph name="NAME" /> sarerako konexioa</translation> <translation id="6233154960150021497">Lehenetsi ahotsa erabiltzea, teklatuaren gainetik</translation> +<translation id="6234108445915742946">Chrome-ren Zerbitzu-baldintzak martxoaren 31n aldatuko dira</translation> <translation id="6234474535228214774">Instalatzeke</translation> <translation id="6237474966939441970">Arkatzarekin oharrak hartzeko aplikazioa</translation> <translation id="6237816943013845465">Pantailaren bereizmena doitzeko aukera ematen dizu</translation> @@ -4888,6 +4903,7 @@ <translation id="656293578423618167">Fitxategi-bidea edo -izena luzeegia da. Gorde izen laburrago batekin edo beste kokapen batean.</translation> <translation id="6563469144985748109">Kudeatzaileak ez du onartu eskaera oraindik</translation> <translation id="6569934958368283244">Jende gehiago</translation> +<translation id="6573497332121198392">Ezin da kendu lasterbidea</translation> <translation id="657402800789773160">&Kargatu orria berriro</translation> <translation id="6577284282025554716">Bertan behera utzi da <ph name="FILE_NAME" /> fitxategia deskargatzeko prozesua</translation> <translation id="657866106756413002">Sarearen egoeraren laburpena</translation> @@ -4895,6 +4911,7 @@ <translation id="6579705087617859690"><ph name="WINDOW_TITLE" />: ordenagailuko edukia partekatzen ari da</translation> <translation id="6580203076670148210">Bilaketa-abiadura</translation> <translation id="6582080224869403177">Berrezarri <ph name="DEVICE_TYPE" /> gailua segurtasuna eguneratzeko.</translation> +<translation id="6582274660680936615">Gonbidatu gisa arakatzen ari zara</translation> <translation id="6584878029876017575">Microsoft biziarteko sinadurak</translation> <translation id="6586099239452884121">Arakatu gonbidatu gisa</translation> <translation id="6586451623538375658">Aldatu saguaren botoi nagusia</translation> @@ -5064,6 +5081,7 @@ <translation id="6782468519961184511">Administratzaileak ez du ematen baimenik Google-ko beste konturik gehitzeko</translation> <translation id="6785518634832172390">PIN kodeak 12 digitu edo gutxiago izan behar ditu</translation> <translation id="6786747875388722282">Luzapenak</translation> +<translation id="6787097042755590313">Beste fitxa bat</translation> <translation id="6787839852456839824">Laster-teklak</translation> <translation id="6788210894632713004">Paketetik ateratako luzapena</translation> <translation id="6789592661892473991">Zatitu horizontalki</translation> @@ -5074,6 +5092,7 @@ <translation id="6793723358811598107">"<ph name="CURRENTKEY" />" tekla "<ph name="ACTION" />" ekintzari esleituta dago dagoeneko. Irteteko, sakatu edozein tekla.</translation> <translation id="6795884519221689054">Panda</translation> <translation id="6797493596609571643">Arazoren bat izan da.</translation> +<translation id="6798420440063423019">Segurtasun-giltza blokeatuta dago PIN kodea gehiegitan idatzi delako oker. Segurtasun-giltza berrezarri beharko duzu.</translation> <translation id="6798578729981748444">Inportazioa amaitzeko, itxi Firefox-eko leiho guztiak.</translation> <translation id="6798780071646309401">maiuskulak aktibatuta daude</translation> <translation id="6798954102094737107"><ph name="PLUGIN_NAME" /> plugina</translation> @@ -5129,7 +5148,7 @@ <translation id="6850286078059909152">Testuaren kolorea</translation> <translation id="6851181413209322061">Bidali erabilera- eta diagnostiko-datuak. Gailu honek automatikoki bidaltzen dizkio Google-ri diagnostikoak eta gailu zein aplikazioen erabilera-datuak. Informazio hori ez da erabiliko haurra identifikatzeko eta, hari esker, sistemaren eta aplikazioen egonkortasuna hobetuko da, besteak beste. Gainera, multzokatutako datu batzuk oso baliagarriak izango dira Google-ren aplikazioak hobetzeko eta bazkideei laguntzeko (adibidez, Android-en garatzaileei). Jabeak konfiguratu du ezarpen hori. Haurraren kontuko Sareko eta aplikazioetako jarduera gehigarriak ezarpena aktibatuta badago, baliteke datu horiek haren Google-ko kontuan gordetzea.</translation> <translation id="6851497530878285708">Aplikazioa gaituta</translation> -<translation id="6853142139292753691">Lehenespenez, aplikazioak eta orriak leheneratzea nahi duzu?</translation> +<translation id="6853142139292753691">Modu lehenetsian aplikazioak eta orriak leheneratzea nahi duzu?</translation> <translation id="6853388645642883916">Eguneratzailea inaktibo dago</translation> <translation id="68541483639528434">Itxi beste fitxak</translation> <translation id="6855892664589459354">Crostini-ren babeskopiak eta leheneratzea</translation> @@ -5419,6 +5438,7 @@ <translation id="7180865173735832675">Pertsonalizatu</translation> <translation id="7182791023900310535">Eraman pasahitza</translation> <translation id="7186088072322679094">Mantendu tresna-barran</translation> +<translation id="7186303001964993981"><ph name="ORIGIN" /> webguneak ezin du ireki karpeta sistemaren fitxategiak dituelako</translation> <translation id="7187428571767585875">Erregistroan kendu edo aldatu beharreko sarrerak:</translation> <translation id="7187855807420906517">Irteten edo deskonektatzen zarenean, webguneek sinkronizatzen jarraitzen dute zereginak amaitzeko, hala nola argazkiak kargatzeko edo txat-mezuak bidaltzeko</translation> <translation id="7189234443051076392">Ziurtatu gailuan behar adina toki duzula</translation> @@ -6039,6 +6059,7 @@ <translation id="7871109039747854576">Erabili <ph name="COMMA" /> eta <ph name="PERIOD" /> teklak aukeren zerrenda erakusteko</translation> <translation id="787268756490971083">Desaktibatuta</translation> <translation id="7874257161694977650">Chrome atzeko-planoak</translation> +<translation id="7876027585589532670">Ezin da editatu lasterbidea</translation> <translation id="7877451762676714207">Zerbitzariko errore ezezaguna. Saiatu berriro edo jarri harremanetan zerbitzariaren administratzailearekin.</translation> <translation id="7879631849810108578">Ezarri da lasterbidea: <ph name="IDS_SHORT_SET_COMMAND" /></translation> <translation id="7880823633812189969">Gailuan dituzun datuak ezabatu egingo dira gailua berrabiarazten duzunean</translation> @@ -6324,6 +6345,7 @@ <translation id="8189750580333936930">Pribatutasunaren proben eremua</translation> <translation id="8190193592390505034"><ph name="PROVIDER_NAME" /> hornitzailera konektatzen</translation> <translation id="8191230140820435481">Kudeatu aplikazioak, luzapenak eta gaiak</translation> +<translation id="8192944472786724289"><ph name="APP_NAME" /> aplikazioak pantailan duzun edukia partekatu nahi du.</translation> <translation id="8195027750202970175">Diskoko tamaina</translation> <translation id="8198323535106903877"><ph name="NUMBER_OF_APPS" /> aplikazio horiek instalatuko dizkizugu</translation> <translation id="8199300056570174101">Sarearen mantentze-zerbitzua eta gailuaren propietateak</translation> @@ -6973,6 +6995,7 @@ <translation id="8931475688782629595">Kudeatu zer sinkronizatzen duzun</translation> <translation id="8932654652795262306">Konexioa bizkor partekatzeko eginbidearen xehetasunak</translation> <translation id="8932894639908691771">Erabilerraztasun-osagarriaren aukerak</translation> +<translation id="893298445929867520">Ezkutatu dira saskiak. Aldaketak egiten dituzunean agertuko dira berriro.</translation> <translation id="8933960630081805351">&Erakutsi Finder-en</translation> <translation id="8934732568177537184">Jarraitu</translation> <translation id="8938306522009698937">kudeatzaileak</translation> @@ -7249,6 +7272,7 @@ <translation id="942532530371314860"><ph name="APP_NAME" /> Chrome-ko fitxa bat eta audioa partekatzen ari da.</translation> <translation id="945522503751344254">Bidali oharrak</translation> <translation id="947329552760389097">&Aztertu elementuak</translation> +<translation id="947667444780368238"><ph name="ORIGIN" /> webguneak ezin ditu ireki karpeta honetako fitxategiak, sistemaren fitxategiak daudelako bertan</translation> <translation id="951991426597076286">Baztertu</translation> <translation id="956500788634395331">Luzapen kaltegarrien aurka babestuta zaude</translation> <translation id="957960681186851048">Hainbat fitxategi automatikoki deskargatzen saiatu da webgunea</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index cca7d03..10995d61 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -575,6 +575,7 @@ <translation id="1627408615528139100">Ladattu aiemmin</translation> <translation id="1628948239858170093">Tarkistetaanko tiedosto ennen avaamista?</translation> <translation id="1629314197035607094">Salasana on vanhentunut</translation> +<translation id="1629521517399325891">Käyttäjävarmenne ei ole saatavilla verkon todennukseen.</translation> <translation id="163072119192489970">Tietojen lähetyksen ja vastaanoton viimeistely sallittu</translation> <translation id="1630768113285622200">Käynnistä uudelleen ja jatka</translation> <translation id="1632082166874334883">Salasana tallennettu Google-tilillesi</translation> @@ -1179,6 +1180,7 @@ <translation id="2300383962156589922">Muokkaus ja hallinta: <ph name="APP_NAME" /></translation> <translation id="2301382460326681002">Laajennuksen juurihakemisto on virheellinen.</translation> <translation id="23030561267973084"><ph name="EXTENSION_NAME" /> on pyytänyt lisäoikeuksia.</translation> +<translation id="230529452743010958">Tämä on valittu perustuen aiempaan toimintaasi Googlen palveluissa. Voit nähdä datasi tai poistaa sitä ja muuttaa asetuksiasi osoitteessa <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="23055578400314116">Valitse käyttäjänimi</translation> <translation id="2307462900900812319">Määritä verkko</translation> <translation id="230927227160767054">Sivu haluaa asentaa palvelukäsittelijän.</translation> @@ -1405,6 +1407,7 @@ <translation id="2541706104884128042">Uusi yölukitusaika asetettu</translation> <translation id="2542050502251273923">Määrittää virheenkorjaustason verkkoyhteysohjelmassa ja muissa palveluissa, joissa on käytössä ff_debug.</translation> <translation id="2544292303401268586">Järjestelmänvalvoja pyysi käynnistämään laitteen uudelleen sovellusten päivittämiseksi. Tämä voi kestää useita minuutteja.</translation> +<translation id="2544352060595557290">Tämä välilehti</translation> <translation id="2544853746127077729">Verkko on hylännyt todennusvarmenteen</translation> <translation id="2546283357679194313">Evästeet ja sivustotiedot</translation> <translation id="2548347166720081527"><ph name="PERMISSION" /> sallittu</translation> @@ -1570,6 +1573,7 @@ <translation id="2734760316755174687"><ph name="SITE_GROUP_NAME" />:n alaiset sivustot nollataan myös.</translation> <translation id="2735712963799620190">Aikataulu</translation> <translation id="2737363922397526254">Tiivistä...</translation> +<translation id="2737916598897808047"><ph name="APP_NAME" /> haluaa jakaa näyttösi sisällön tälle: <ph name="TARGET_NAME" />.</translation> <translation id="2738771556149464852">Ei tämän jälkeen</translation> <translation id="2739191690716947896">Vianetsintä</translation> <translation id="2739240477418971307">Muokata esteettömyysasetuksia</translation> @@ -2398,6 +2402,7 @@ <translation id="3677911431265050325">Pyydä mobiilisivustoa</translation> <translation id="3677959414150797585">Sisältää esimerkiksi sovelluksia ja verkkosivuja. Lähettää tilastoja ehdotusten parantamiseksi vain, jos olet sallinut käyttödatan jakamisen.</translation> <translation id="3678156199662914018">Laajennus: <ph name="EXTENSION_NAME" /></translation> +<translation id="3678188444105291936">Tässä ikkunassa katsomiasi sivuja ei lisätä selaushistoriaan, eikä niistä jää tietokoneelle muita jälkiä (esim. evästeitä) kirjauduttuasi ulos. Lataamiasi tiedostoja ja luomiasi kirjanmerkkejä ei tallenneta.</translation> <translation id="3680683624079082902">Tekstistä puheeksi ‑ääni</translation> <translation id="3681311097828166361">Kiitos palautteestasi. Olet nyt offline-tilassa, joten ilmoituksesi lähetetään myöhemmin.</translation> <translation id="3682824389861648626">Liikkeen raja-arvo</translation> @@ -2599,6 +2604,7 @@ <translation id="3884152383786131369">Verkkosisältö, joka on saatavilla useilla kielillä, käyttää ensimmäistä tuettua kieltä tältä listalta. Nämä asetukset synkronoidaan selainasetustesi kanssa. <ph name="BEGIN_LINK_LEARN_MORE" />Lue lisää<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3886446263141354045">Pyyntösi päästä tälle sivustolle on lähetetty henkilölle <ph name="NAME" />.</translation> <translation id="3888550877729210209">Muistiinpanojen kirjoittaminen sovelluksella <ph name="LOCK_SCREEN_APP_NAME" /></translation> +<translation id="3888586133700543064">Nämä tiedot auttavat meitä ymmärtämään Assistant-ongelmaasi paremmin. Niitä säilytetään enintään 90 päivää, ja vain asianmukaiset insinööri- ja palautetiimit pääsevät tietoihin.</translation> <translation id="3890064827463908288">Laita Chromen synkronointi päälle, jotta voit käyttää Wi-Fin synkronointia</translation> <translation id="3892414795099177503">Lisää OpenVPN tai L2TP…</translation> <translation id="3893536212201235195">Lukea ja muokata esteettömyysasetuksiasi</translation> @@ -2630,6 +2636,7 @@ <translation id="3916445069167113093">Tämäntyyppinen tiedosto voi vahingoittaa tietokonettasi. Haluatko säilyttää tiedoston <ph name="FILE_NAME" />?</translation> <translation id="3918972485393593704">Raportoi tiedot Googlelle</translation> <translation id="3919145445993746351">Ota synkronointi käyttöön, niin voit käyttää laajennuksia kaikilla tietokoneilla</translation> +<translation id="3919798653937160644">Tässä ikkunassa katsomasi sivut eivät näy selaushistoriassa, eikä niistä jää tietokoneelle muita jälkiä (esim. evästeitä) suljettuasi kaikki vierasikkunat. Kaikki lataamasi tiedostot kuitenkin säilytetään.</translation> <translation id="3920504717067627103">Varmennekäytännöt</translation> <translation id="392089482157167418">Ota ChromeVox käyttöön (äänipalaute)</translation> <translation id="3920909973552939961">Maksujen käsittelijöiden asentaminen kielletty</translation> @@ -2964,6 +2971,7 @@ <translation id="4332976768901252016">Lapsilukon määritys</translation> <translation id="4333854382783149454">PKCS #1 SHA-1 ja RSA-salaus</translation> <translation id="4336434711095810371">Poista kaikki data</translation> +<translation id="4340125850502689798">Virheellinen käyttäjänimi</translation> <translation id="4340515029017875942"><ph name="ORIGIN" /> haluaa viestiä sovelluksen <ph name="EXTENSION_NAME" /> kanssa.</translation> <translation id="4340575312453649552">Chrome poisti tämän mainoksen, koska se käytti liian paljon laitteen resursseja.</translation> <translation id="4341577178275615435">Voit laittaa näppäimistöselaamisen päälle tai pois päältä pikanäppäimellä F7</translation> @@ -3578,6 +3586,7 @@ <translation id="5057110919553308744">Kun klikkaat laajennusta</translation> <translation id="5057403786441168405">Ylläpidä kirjautuneita tilejäsi. Verkkosivustot, sovellukset ja laajennukset Chromessa ja Google Playssa voivat käyttää näitä tilejä käyttökokemuksen personointiin lupien perusteella. <ph name="LINK_BEGIN" />Lue lisää<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Rajoita kirjautumista</translation> +<translation id="5059526285558225588">Valitse, mitä jaat</translation> <translation id="5060332552815861872">Tallennettavia tulostimia on yksi.</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{Tässä kansiossa on kirjanmerkki. Haluatko varmasti poistaa sen?}other{Tässä kansiossa on # kirjanmerkkiä. Haluatko varmasti poistaa sen?}}</translation> <translation id="5062930723426326933">Kirjautuminen epäonnistui. Muodosta verkkoyhteys ja yritä uudelleen.</translation> @@ -3694,6 +3703,7 @@ <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">Palaa rakkaisiin muistoihisi. Jos haluat lisätä tai muokata albumeja, siirry <ph name="LINK_BEGIN" />Google Kuviin<ph name="LINK_END" />.</translation> <translation id="5190926251776387065">Aktivoi portti</translation> +<translation id="5191094172448199359">Lisäämäsi PIN-koodit eivät täsmää</translation> <translation id="5191251636205085390">Lue lisää uusista teknologioista, joilla on tarkoitus korvata kolmannen osapuolen evästeet, ja tee haluamasi valinnat</translation> <translation id="51918995459521422"><ph name="ORIGIN" /> haluaa ladata useita tiedostoja</translation> <translation id="5192062846343383368">Avaa Family Link ‑sovellus, niin näet valvonta-asetukset</translation> @@ -3706,6 +3716,7 @@ <translation id="5204673965307125349">Suorita powerwash ja yritä uudelleen.</translation> <translation id="5204967432542742771">Lisää salasana</translation> <translation id="5205484256512407285">Älä koskaan käytä mobiilidataa siirtoihin</translation> +<translation id="520568280985468584">Verkko on lisätty. Voi kestää useita minuutteja ennen kuin mobiiliverkkosi on käytettävissä.</translation> <translation id="5206215183583316675">Poistetaanko <ph name="CERTIFICATE_NAME" />?</translation> <translation id="520621735928254154">Varmenteen tuontivirhe</translation> <translation id="5206787458656075734">{COUNT,plural, =1{Vaarantunut salasana vaihdettu onnistuneesti. Sinulla on vielä # vaarantunut salasana. Chrome suosittelee tarkistamaan tämän salasanan nyt.}other{Vaarantunut salasana vaihdettu onnistuneesti. Sinulla on vielä # vaarantunutta salasanaa. Chrome suosittelee tarkistamaan nämä salasanat nyt.}}</translation> @@ -4340,6 +4351,7 @@ <translation id="5935656526031444304">Muuta Selaussuoja-asetuksia</translation> <translation id="5938002010494270685">Turvallisuuspäivitys saatavilla</translation> <translation id="5939518447894949180">Tyhjennä</translation> +<translation id="5939719276406088041">Pikakuvaketta ei voi luoda</translation> <translation id="5941153596444580863">Lisää henkilö…</translation> <translation id="5941343993301164315">Kirjaudu sisään palveluun <ph name="TOKEN_NAME" />.</translation> <translation id="5941711191222866238">Pienennä</translation> @@ -4427,6 +4439,7 @@ <translation id="6043994281159824495">Kirjaudu ulos nyt</translation> <translation id="6044805581023976844"><ph name="APP_NAME" /> jakaa Chrome-välilehden ja ääntä välilehdelle <ph name="TAB_NAME" />.</translation> <translation id="6045114302329202345">Ensisijainen TrackPoint-painike</translation> +<translation id="6047632800149092791">Synkronointi ei toimi. Kokeile kirjautua ensin ulos ja sitten takaisin sisään.</translation> <translation id="6049004884579590341">Paina pitkään |<ph name="ACCELERATOR" />|, niin poistut koko näytön tilasta.</translation> <translation id="6051354611314852653">Hups! Järjestelmä ei voinut sallia sovellusliittymän käyttöä tälle laitteelle.</translation> <translation id="6052976518993719690">SSL-varmenteen myöntäjä</translation> @@ -4519,6 +4532,7 @@ <translation id="6143186082490678276">Ohje</translation> <translation id="6143366292569327983">Valitse sivun käännettävä kieli</translation> <translation id="6144938890088808325">Auta meitä parantamaan Chromebookeja</translation> +<translation id="6146409560350811147">Synkronointi ei toimi. Yritä kirjautua sisään uudelleen.</translation> <translation id="6147020289383635445">Tulostuksen esikatselu epäonnistui.</translation> <translation id="6148576794665275391">Avaa nyt</translation> <translation id="6149015141270619212">Internetyhteyttä ei voi muodostaa</translation> @@ -4586,6 +4600,7 @@ <translation id="6232017090690406397">Akku</translation> <translation id="6232116551750539448">Yhteys kohteeseen <ph name="NAME" /> on katkennut.</translation> <translation id="6233154960150021497">Oletuksena puhe näppäimistön sijaan</translation> +<translation id="6234108445915742946">Chromen käyttöehdot muuttuvat 31.3.</translation> <translation id="6234474535228214774">Odottaa asennusta</translation> <translation id="6237474966939441970">Näyttökynä muistiinpanosovellus</translation> <translation id="6237816943013845465">Sallii näytön resoluution säätämisen.</translation> @@ -4885,6 +4900,7 @@ <translation id="656293578423618167">Tiedostonimi tai -polku on liian pitkä. Lyhennä nimeä tai tallenna muuhun sijaintiin.</translation> <translation id="6563469144985748109">Ylläpitäjä ei ole hyväksynyt sitä vielä.</translation> <translation id="6569934958368283244">Muut ihmiset</translation> +<translation id="6573497332121198392">Pikakuvaketta ei voi poistaa</translation> <translation id="657402800789773160">&Päivitä tämä sivu</translation> <translation id="6577284282025554716">Lataus peruutettu: <ph name="FILE_NAME" /></translation> <translation id="657866106756413002">Verkon toiminnan tilannekatsaus</translation> @@ -4892,6 +4908,7 @@ <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> – työpöydän sisältöä jaetaan</translation> <translation id="6580203076670148210">Skannausnopeus</translation> <translation id="6582080224869403177">Nollaa <ph name="DEVICE_TYPE" /> päivittääksesi tietoturvasi</translation> +<translation id="6582274660680936615">Selaat vieraana</translation> <translation id="6584878029876017575">Microsoftin elinikäinen allekirjoitus</translation> <translation id="6586099239452884121">Vierailijakäyttö</translation> <translation id="6586451623538375658">Vaihda hiiren ykköspainiketta</translation> @@ -5061,6 +5078,7 @@ <translation id="6782468519961184511">Järjestelmänvalvoja ei salli ylimääräisiä Google-tilejä</translation> <translation id="6785518634832172390">PIN-koodin enimmäispituus on 12 merkkiä</translation> <translation id="6786747875388722282">Laajennukset</translation> +<translation id="6787097042755590313">Muu välilehti</translation> <translation id="6787839852456839824">Pikanäppäimet</translation> <translation id="6788210894632713004">Pakkaamaton laajennus</translation> <translation id="6789592661892473991">Vaakasuuntainen jako</translation> @@ -5071,6 +5089,7 @@ <translation id="6793723358811598107"><ph name="CURRENTKEY" /> liittyy jo toimintoon (<ph name="ACTION" />). Poistu painamalla mitä tahansa näppäintä.</translation> <translation id="6795884519221689054">Panda</translation> <translation id="6797493596609571643">Hups… Jotain meni pieleen.</translation> +<translation id="6798420440063423019">Suojausavain on lukittu, koska väärä PIN-koodi on syötetty liian monta kertaa. Suojausavain on nollattava.</translation> <translation id="6798578729981748444">Jos haluat suorittaa tuonnin loppuun, sulje kaikki Firefox-ikkunat.</translation> <translation id="6798780071646309401">caps lock päällä</translation> <translation id="6798954102094737107">Laajennus: <ph name="PLUGIN_NAME" /></translation> @@ -5416,6 +5435,7 @@ <translation id="7180865173735832675">Muokkaa</translation> <translation id="7182791023900310535">Siirrä salasana</translation> <translation id="7186088072322679094">Pidä yläpalkissa</translation> +<translation id="7186303001964993981"><ph name="ORIGIN" /> ei saa avata tätä kansiota, koska se sisältää järjestelmätiedostoja</translation> <translation id="7187428571767585875">Poistettavat tai muutettavat rekisteritiedot:</translation> <translation id="7187855807420906517">Kun lähdet pois tai siirryt offline-tilaan, sivustot jatkavat yleensä synkronointia viimeistelläkseen asioita, kuten kuvien latauksen tai chat-viestin lähettämisen</translation> <translation id="7189234443051076392">Varmista, että laitteellasi on tarpeeksi tilaa.</translation> @@ -6035,6 +6055,7 @@ <translation id="7871109039747854576">Selaa vaihtoehtolistaa näppäimillä <ph name="COMMA" /> ja <ph name="PERIOD" /></translation> <translation id="787268756490971083">Pois päältä</translation> <translation id="7874257161694977650">Chrome-taustat</translation> +<translation id="7876027585589532670">Pikakuvaketta ei voi muokata</translation> <translation id="7877451762676714207">Tuntematon palvelinvirhe. Yritä uudelleen tai ota yhteyttä palvelimen järjestelmänvalvojaan.</translation> <translation id="7879631849810108578">Pikanäppäin luotu: <ph name="IDS_SHORT_SET_COMMAND" /></translation> <translation id="7880823633812189969">Paikallinen data poistetaan uudelleenkäynnistyksen yhteydessä</translation> @@ -6321,6 +6342,7 @@ <translation id="8189750580333936930">Tietosuojan hiekkalaatikko</translation> <translation id="8190193592390505034">Muodostetaan yhteyttä sivustoon <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">Hallita sovelluksia, laajennuksia ja teemoja</translation> +<translation id="8192944472786724289"><ph name="APP_NAME" /> haluaa jakaa näyttösi sisällön.</translation> <translation id="8195027750202970175">Tiedoston koko</translation> <translation id="8198323535106903877">Asennamme nämä <ph name="NUMBER_OF_APPS" /> sovellusta puolestasi</translation> <translation id="8199300056570174101">Verkon ja laitteen ominaisuudet</translation> @@ -6970,6 +6992,7 @@ <translation id="8931475688782629595">Valitse, mitä synkronoit</translation> <translation id="8932654652795262306">Tietoja yhteyden pikajakamisesta</translation> <translation id="8932894639908691771">Muuta kytkinasetuksia</translation> +<translation id="893298445929867520">Ostoskorit on piilotettu. Ne tulevat taas näkyviin, kun teet muutoksia.</translation> <translation id="8933960630081805351">Näytä Finderi&ssä</translation> <translation id="8934732568177537184">Jatka</translation> <translation id="8938306522009698937">käsittelijät</translation> @@ -7246,6 +7269,7 @@ <translation id="942532530371314860"><ph name="APP_NAME" /> jakaa Chrome-välilehden ja ääntä.</translation> <translation id="945522503751344254">Lähetä palautetta</translation> <translation id="947329552760389097">Tutk&i elementtejä</translation> +<translation id="947667444780368238"><ph name="ORIGIN" /> ei saa avata tämän kansion tiedostoja, koska se sisältää järjestelmätiedostoja</translation> <translation id="951991426597076286">Hylkää</translation> <translation id="956500788634395331">Sinut on suojattu mahdollisesti haitallisilta laajennuksilta</translation> <translation id="957960681186851048">Tämä sivusto yrittää ladata useita tiedostoja automaattisesti</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb index 05b3f1b..37311cc8 100644 --- a/chrome/app/resources/generated_resources_fr-CA.xtb +++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -576,6 +576,7 @@ <translation id="1627408615528139100">Déjà téléchargé</translation> <translation id="1628948239858170093">Analyser le fichier avant l'ouverture?</translation> <translation id="1629314197035607094">Le mot de passe a expiré</translation> +<translation id="1629521517399325891">Le certificat utilisateur n'est pas accessible pour l'authentification réseau.</translation> <translation id="163072119192489970">Autorisés à terminer l'envoi ou la réception de données</translation> <translation id="1630768113285622200">Redémarrer et continuer</translation> <translation id="1632082166874334883">Mots de passe enregistrés dans votre compte Google</translation> @@ -1179,6 +1180,7 @@ <translation id="2300383962156589922">Personnaliser et contrôler <ph name="APP_NAME" /></translation> <translation id="2301382460326681002">Le répertoire racine de l'extension n'est pas valide.</translation> <translation id="23030561267973084">« <ph name="EXTENSION_NAME" /> » a demandé des autorisations supplémentaires.</translation> +<translation id="230529452743010958">Vous voyez cet élément en fonction de vos activités précédentes sur les services Google. Vous pouvez consulter vos données, les supprimer ainsi que modifier vos paramètres à l'adresse <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="23055578400314116">Sélectionnez un nom d'utilisateur</translation> <translation id="2307462900900812319">Configurer le réseau</translation> <translation id="230927227160767054">Cette page veut installer un gestionnaire de services.</translation> @@ -1405,6 +1407,7 @@ <translation id="2541706104884128042">Une nouvelle heure du coucher a été définie</translation> <translation id="2542050502251273923">Définit le niveau de débogage du gestionnaire de connexion réseau et d'autres services à l'aide de la commande ff_debug.</translation> <translation id="2544292303401268586">Votre administrateur vous a demandé de redémarrer votre appareil afin de mettre à jour les applications. Cette opération peut prendre plusieurs minutes.</translation> +<translation id="2544352060595557290">Cet onglet</translation> <translation id="2544853746127077729">Certificat d'authentification rejeté par le réseau</translation> <translation id="2546283357679194313">Témoins et données de site</translation> <translation id="2548347166720081527">Autorisé <ph name="PERMISSION" /></translation> @@ -1571,6 +1574,7 @@ <translation id="2734760316755174687">Les sites sous <ph name="SITE_GROUP_NAME" /> seront également réinitialisés.</translation> <translation id="2735712963799620190">Horaire</translation> <translation id="2737363922397526254">Réduire...</translation> +<translation id="2737916598897808047"><ph name="APP_NAME" /> veut partager le contenu de votre écran avec <ph name="TARGET_NAME" />.</translation> <translation id="2738771556149464852">Pas après le</translation> <translation id="2739191690716947896">Débogage</translation> <translation id="2739240477418971307">Modifier vos paramètres d'accessibilité</translation> @@ -2399,6 +2403,7 @@ <translation id="3677911431265050325">Voir la version pour appareil mobile</translation> <translation id="3677959414150797585">Comprend les applications, les pages Web et plus. Envoie des statistiques afin d'améliorer les suggestions seulement si vous avez choisi de partager les données d'utilisation.</translation> <translation id="3678156199662914018">Extension : <ph name="EXTENSION_NAME" /></translation> +<translation id="3678188444105291936">Les pages que vous consultez dans cette fenêtre ne sont pas consignées dans l'historique du navigateur et ne laisseront aucune autre trace sur votre ordinateur (comme des témoins) après la déconnexion. Les fichiers que vous téléchargez et les favoris que vous créez ne seront pas conservés.</translation> <translation id="3680683624079082902">Voix de la synthèse vocale</translation> <translation id="3681311097828166361">Nous vous remercions de vos commentaires. Vous êtes actuellement hors connexion, et votre rapport sera envoyé plus tard.</translation> <translation id="3682824389861648626">Seuil de mouvement</translation> @@ -2600,6 +2605,7 @@ <translation id="3884152383786131369">Le contenu Web offert en plusieurs langues utilisera la première langue prise en charge de cette liste. Ces préférences sont synchronisées avec les paramètres de votre navigateur. <ph name="BEGIN_LINK_LEARN_MORE" />En savoir plus<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3886446263141354045">Votre demande d'accès à ce site a été envoyée à <ph name="NAME" /></translation> <translation id="3888550877729210209">Prendre des notes avec <ph name="LOCK_SCREEN_APP_NAME" /></translation> +<translation id="3888586133700543064">Ces données nous aident à mieux comprendre le problème que vous éprouvez avec votre Assistant. Elles sont stockées pendant 90 jours, et l'accès est limité aux équipes d'ingénierie et de rétroaction appropriées.</translation> <translation id="3890064827463908288">Activez la synchronisation Chrome pour utiliser la synchronisation Wi-Fi</translation> <translation id="3892414795099177503">Ajouter OpenVPN/L2TP…</translation> <translation id="3893536212201235195">Consulter et modifier vos paramètres d'accessibilité</translation> @@ -2631,6 +2637,7 @@ <translation id="3916445069167113093">Ce type de fichier risque d'endommager votre ordinateur. Voulez-vous vraiment télécharger <ph name="FILE_NAME" />?</translation> <translation id="3918972485393593704">Signaler les détails à Google</translation> <translation id="3919145445993746351">Pour utiliser vos extensions sur tous vos ordinateurs, activez la synchronisation</translation> +<translation id="3919798653937160644">Les pages que vous consultez dans cette fenêtre ne sont pas consignées dans l'historique du navigateur et ne laissent aucune autre trace sur votre ordinateur (comme des témoins), une fois que vous avez fermé toutes les fenêtres ouvertes en tant qu'invité. Tous les fichiers téléchargés sont toutefois conservés.</translation> <translation id="3920504717067627103">Politiques pour les certificats</translation> <translation id="392089482157167418">Activer ChromeVox (commentaires audio)</translation> <translation id="3920909973552939961">Non autorisés à installer des modules de traitement de paiement</translation> @@ -2967,6 +2974,7 @@ <translation id="4332976768901252016">Configurer les contrôles parentaux</translation> <translation id="4333854382783149454">PKCS n° 1 SHA-1 avec chiffrement RSA</translation> <translation id="4336434711095810371">Effacer toutes les données</translation> +<translation id="4340125850502689798">Nom d'utilisateur non valide</translation> <translation id="4340515029017875942"><ph name="ORIGIN" /> souhaite communiquer avec l’application « <ph name="EXTENSION_NAME" /> »</translation> <translation id="4340575312453649552">Cette annonce utilisait trop de ressources pour votre appareil, alors Chrome l'a supprimée.</translation> <translation id="4341577178275615435">Pour activer ou désactiver la navigation au clavier, utilisez le raccourci F7</translation> @@ -3581,6 +3589,7 @@ <translation id="5057110919553308744">Lorsque vous cliquez sur l'extension</translation> <translation id="5057403786441168405">Gérez les comptes auxquels vous êtes connecté. Les sites Web, les applications et les extensions dans Chrome et dans Google Play peuvent utiliser ces comptes pour personnaliser votre expérience, selon les autorisations accordées. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Restreindre les connexions</translation> +<translation id="5059526285558225588">Choisir quoi partager</translation> <translation id="5060332552815861872">Il y a 1 imprimante à enregistrer.</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{Ce dossier contient un favori. Voulez-vous vraiment le supprimer?}one{Ce dossier contient # favori. Voulez-vous vraiment le supprimer?}other{Ce dossier contient # favoris. Voulez-vous vraiment le supprimer?}}</translation> <translation id="5062930723426326933">Échec de la connexion. Veuillez vous connecter à Internet, puis réessayer.</translation> @@ -3697,6 +3706,7 @@ <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">Revivez vos souvenirs préférés. Pour ajouter des albums ou modifier vos albums existants, accédez à <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" />.</translation> <translation id="5190926251776387065">Activer le port</translation> +<translation id="5191094172448199359">Les NIP entrés ne correspondent pas</translation> <translation id="5191251636205085390">Découvrez les nouvelles technologies qui visent à remplacer les témoins tiers et apprenez à les utiliser.</translation> <translation id="51918995459521422"><ph name="ORIGIN" /> veut télécharger plusieurs fichiers</translation> <translation id="5192062846343383368">Ouvrez l'application Family Link pour afficher vos paramètres de supervision</translation> @@ -3709,6 +3719,7 @@ <translation id="5204673965307125349">Veuillez effectuer un Powerwash sur l'appareil et réessayer.</translation> <translation id="5204967432542742771">Entrez le mot de passe</translation> <translation id="5205484256512407285">Ne jamais utiliser les données cellulaires pour effectuer les transferts</translation> +<translation id="520568280985468584">Le réseau a bien été ajouté. L'activation de votre réseau cellulaire peut prendre plusieurs minutes.</translation> <translation id="5206215183583316675">Supprimer « <ph name="CERTIFICATE_NAME" /> »?</translation> <translation id="520621735928254154">Erreur d'importation du certificat</translation> <translation id="5206787458656075734">{COUNT,plural, =1{Le mot de passe compromis a été changé. Vous avez # autre mot de passe compromis. Chrome recommande de vérifier ce mot de passe maintenant.}one{Le mot de passe compromis a été changé. Vous avez # autre mot de passe compromis. Chrome recommande de vérifier ce mot de passe maintenant.}other{Le mot de passe compromis a été changé. Vous avez # autres mots de passe compromis. Chrome recommande de vérifier ces mots de passe maintenant.}}</translation> @@ -4342,6 +4353,7 @@ <translation id="5935656526031444304">Gérer la navigation sécurisée</translation> <translation id="5938002010494270685">Mise à niveau de sécurité disponible</translation> <translation id="5939518447894949180">Recommencer</translation> +<translation id="5939719276406088041">Impossible de créer le raccourci</translation> <translation id="5941153596444580863">Ajouter une personne...</translation> <translation id="5941343993301164315">Veuillez vous connecter à <ph name="TOKEN_NAME" />.</translation> <translation id="5941711191222866238">Réduire</translation> @@ -4429,6 +4441,7 @@ <translation id="6043994281159824495">Se déconnecter maintenant</translation> <translation id="6044805581023976844"><ph name="APP_NAME" /> partage un onglet Chrome et du son avec <ph name="TAB_NAME" />.</translation> <translation id="6045114302329202345">Bouton TrackPoint principal</translation> +<translation id="6047632800149092791">La synchronisation ne fonctionne pas. Essayez de vous déconnecter et de vous reconnecter.</translation> <translation id="6049004884579590341">Maintenez le doigt sur |<ph name="ACCELERATOR" />| pour quitter le mode plein écran</translation> <translation id="6051354611314852653">Oups… Échec de l'autorisation d'accès à l'API pour cet appareil.</translation> <translation id="6052976518993719690">Autorité de certification SSL</translation> @@ -4520,6 +4533,7 @@ <translation id="6143186082490678276">Obtenir de l'aide</translation> <translation id="6143366292569327983">Choisissez la langue de la page à traduire</translation> <translation id="6144938890088808325">Aidez-nous à améliorer les Chromebook</translation> +<translation id="6146409560350811147">La synchronisation ne fonctionne pas. Essayez de vous connecter à nouveau.</translation> <translation id="6147020289383635445">Échec de création de l'aperçu avant impression.</translation> <translation id="6148576794665275391">Ouvrir maintenant</translation> <translation id="6149015141270619212">Impossible de se connecter à Internet</translation> @@ -4587,6 +4601,7 @@ <translation id="6232017090690406397">Pile</translation> <translation id="6232116551750539448">La connexion à <ph name="NAME" /> a été perdue</translation> <translation id="6233154960150021497">Utiliser la voix plutôt que le clavier par défaut</translation> +<translation id="6234108445915742946">Les conditions d'utilisation de Chrome changeront le 31 mars</translation> <translation id="6234474535228214774">Installation en attente…</translation> <translation id="6237474966939441970">Application de prise de notes avec stylet</translation> <translation id="6237816943013845465">Permet de régler la résolution de votre écran</translation> @@ -4886,6 +4901,7 @@ <translation id="656293578423618167">Le chemin d'accès ou le nom du fichier est trop long. Veuillez raccourcir le nom ou enregistrer le fichier à un autre endroit.</translation> <translation id="6563469144985748109">Votre gestionnaire n'a pas encore donné son autorisation</translation> <translation id="6569934958368283244">Autres personnes</translation> +<translation id="6573497332121198392">Impossible de supprimer le raccourci</translation> <translation id="657402800789773160">Actualise&r cette page</translation> <translation id="6577284282025554716">Téléchargement annulé : <ph name="FILE_NAME" /></translation> <translation id="657866106756413002">Aperçu de la santé du réseau</translation> @@ -4893,6 +4909,7 @@ <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> – Contenu du bureau partagé</translation> <translation id="6580203076670148210">Vitesse de recherche</translation> <translation id="6582080224869403177">Réinitialisez votre <ph name="DEVICE_TYPE" /> pour effectuer une mise à niveau de la sécurité.</translation> +<translation id="6582274660680936615">Vous naviguez en tant qu'invité</translation> <translation id="6584878029876017575">Signature permanente Microsoft</translation> <translation id="6586099239452884121">Navigation comme invité</translation> <translation id="6586451623538375658">Inverser les boutons de la souris</translation> @@ -5062,6 +5079,7 @@ <translation id="6782468519961184511">Votre administrateur n'autorise pas de comptes Google supplémentaires</translation> <translation id="6785518634832172390">Le NIP doit comprendre 12 chiffres ou moins</translation> <translation id="6786747875388722282">Extensions</translation> +<translation id="6787097042755590313">Autre onglet</translation> <translation id="6787839852456839824">Raccourcis clavier</translation> <translation id="6788210894632713004">Extension non compressée</translation> <translation id="6789592661892473991">Séparation horizontale</translation> @@ -5072,6 +5090,7 @@ <translation id="6793723358811598107">La touche « <ph name="CURRENTKEY" /> » est déjà attribuée à l'action « <ph name="ACTION" /> ». Appuyez sur n'importe quelle touche pour quitter.</translation> <translation id="6795884519221689054">Panda</translation> <translation id="6797493596609571643">Une erreur s'est produite.</translation> +<translation id="6798420440063423019">La clé de sécurité est verrouillée parce qu'un NIP incorrect a été entré trop de fois. Vous devez réinitialiser la clé de sécurité.</translation> <translation id="6798578729981748444">Pour terminer l'importation, fermez toutes les fenêtres Firefox.</translation> <translation id="6798780071646309401">verrouillage des majuscules activé</translation> <translation id="6798954102094737107">Plugiciel : <ph name="PLUGIN_NAME" /></translation> @@ -5417,6 +5436,7 @@ <translation id="7180865173735832675">Personnaliser</translation> <translation id="7182791023900310535">Déplacer votre mot de passe</translation> <translation id="7186088072322679094">Garder dans la barre d'outils</translation> +<translation id="7186303001964993981"><ph name="ORIGIN" /> ne peut pas ouvrir ce dossier parce qu'il contient des fichiers système</translation> <translation id="7187428571767585875">Entrées du registre à supprimer ou à modifier :</translation> <translation id="7187855807420906517">Lorsque vous revenez en ligne, la synchronisation des sites se poursuit généralement afin de terminer certaines tâches, comme téléverser des photos ou envoyer un message de clavardage</translation> <translation id="7189234443051076392">Assurez-vous qu'il y a suffisamment d'espace sur votre appareil</translation> @@ -6037,6 +6057,7 @@ <translation id="7871109039747854576">Utiliser les touches <ph name="COMMA" /> et <ph name="PERIOD" /> pour paginer une liste de choix</translation> <translation id="787268756490971083">Désactivé</translation> <translation id="7874257161694977650">Arrière-plans Chrome</translation> +<translation id="7876027585589532670">Impossible de modifier le raccourci</translation> <translation id="7877451762676714207">Erreur inconnue du serveur. Veuillez essayer de nouveau ou communiquer avec l'administrateur du serveur.</translation> <translation id="7879631849810108578">Raccourci clavier configuré : <ph name="IDS_SHORT_SET_COMMAND" /></translation> <translation id="7880823633812189969">Les données locales seront supprimées lorsque vous redémarrez l'appareil</translation> @@ -6322,6 +6343,7 @@ <translation id="8189750580333936930">Bac à sable de confidentialité</translation> <translation id="8190193592390505034">Connexion à <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">Gérer vos applications, vos extensions et vos thèmes</translation> +<translation id="8192944472786724289"><ph name="APP_NAME" /> veut partager le contenu de votre écran.</translation> <translation id="8195027750202970175">Taille sur le disque</translation> <translation id="8198323535106903877">Nous allons installer ces <ph name="NUMBER_OF_APPS" /> applications pour vous</translation> <translation id="8199300056570174101">(Service) réseau et propriétés de l’appareil</translation> @@ -6971,6 +6993,7 @@ <translation id="8931475688782629595">Gérer les données que vous synchronisez</translation> <translation id="8932654652795262306">Renseignements sur le partage de connexion instantané</translation> <translation id="8932894639908691771">Options de Switch Access</translation> +<translation id="893298445929867520">Paniers masqués. Ils s'afficheront de nouveau lorsque vous effectuerez des changements.</translation> <translation id="8933960630081805351">&Afficher dans le Finder</translation> <translation id="8934732568177537184">Continuer</translation> <translation id="8938306522009698937">Modules de traitement</translation> @@ -7247,6 +7270,7 @@ <translation id="942532530371314860"><ph name="APP_NAME" /> partage un onglet Chrome et le son.</translation> <translation id="945522503751344254">Envoyer un commentaire à Google</translation> <translation id="947329552760389097">&Inspecter des éléments</translation> +<translation id="947667444780368238"><ph name="ORIGIN" /> ne peut pas ouvrir les fichiers dans ce dossier parce qu'il contient des fichiers système</translation> <translation id="951991426597076286">Refuser</translation> <translation id="956500788634395331">Vous êtes protégé contre les extensions potentiellement nuisibles</translation> <translation id="957960681186851048">Ce site a tenté de télécharger plusieurs fichiers automatiquement</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index c7d80d00..1a22c35 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -572,6 +572,7 @@ <translation id="1627408615528139100">પહેલેથી જ ડાઉનલોડ કરેલ છે</translation> <translation id="1628948239858170093">ખોલતા પહેલાં ફાઇલને સ્કૅન કરીએ?</translation> <translation id="1629314197035607094">પાસવર્ડની સમયસીમા સમાપ્ત થઈ</translation> +<translation id="1629521517399325891">નેટવર્કના પ્રમાણીકરણ માટે વપરાશકર્તા પ્રમાણપત્ર ઉપલબ્ધ નથી.</translation> <translation id="163072119192489970">ડેટા મોકલવાનું અને પ્રાપ્ત કરવાનું સમાપ્ત કરવાની મંજૂરી છે</translation> <translation id="1630768113285622200">ફરી શરૂ કરો અને ચાલુ રાખો</translation> <translation id="1632082166874334883">પાસવર્ડને તમારા Google એકાઉન્ટમાં સ્ટોર કર્યો</translation> @@ -1176,6 +1177,7 @@ <translation id="2300383962156589922"><ph name="APP_NAME" />ને કસ્ટમાઇઝ કરો અને નિયંત્રિત કરો</translation> <translation id="2301382460326681002">એક્સ્ટેંશન રૂટ ડિરેક્ટરી અમાન્ય છે.</translation> <translation id="23030561267973084">"<ph name="EXTENSION_NAME" />" એ અતિરિક્ત પરવાનગીઓની વિનંતી કરી છે.</translation> +<translation id="230529452743010958">Googleની સેવાઓનો ઉપયોગ કરવાની તમારી અગાઉની પ્રવૃત્તિના આધારે તમને આ આઇટમ દેખાઈ રહી છે. તમે <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> પર તમારો ડેટા જોઈ શકો છો, તેને ડિલીટ કરી શકો છો અને તેના સેટિંગમાં ફેરફાર કરી શકો છો.</translation> <translation id="23055578400314116">વપરાશકર્તાનું નામ પસંદ કરો</translation> <translation id="2307462900900812319">નેટવર્ક ગોઠવો</translation> <translation id="230927227160767054">આ પૃષ્ઠ સેવા હેન્ડલર ઇન્સ્ટોલ કરવા માગે છે.</translation> @@ -1402,6 +1404,7 @@ <translation id="2541706104884128042">સૂવાનો નવો સમય સેટ કર્યો</translation> <translation id="2542050502251273923">ff_debugનો ઉપયોગ કરીને નેટવર્ક કનેક્શન મેનેજરના અને અન્ય સેવાઓનું ડિબગીંગ લેવલ સેટ કરે છે.</translation> <translation id="2544292303401268586">તમારા વ્યવસ્થાપકે ઍપ અપડેટ કરવા માટે તમારા ડિવાઇસને ફરી શરૂ કરવાની વિનંતી કરી છે. આને પૂર્ણ થવામાં થોડી મિનિટનો સમય લાગી શકે છે.</translation> +<translation id="2544352060595557290">આ ટૅબ</translation> <translation id="2544853746127077729">નેટવર્ક દ્વારા પ્રમાણીકરણ પ્રમાણપત્ર નકારવામાં આવ્યું</translation> <translation id="2546283357679194313">કૂકીઝ અને સાઇટ ડેટા</translation> <translation id="2548347166720081527"><ph name="PERMISSION" />ની મંજૂરી આપી</translation> @@ -1567,6 +1570,7 @@ <translation id="2734760316755174687"><ph name="SITE_GROUP_NAME" /> હેઠળની સાઇટ પણ રીસેટ કરવામાં આવશે.</translation> <translation id="2735712963799620190">શેડ્યૂલ</translation> <translation id="2737363922397526254">સંકુચિત કરો...</translation> +<translation id="2737916598897808047"><ph name="APP_NAME" /> તમારી સ્ક્રીન પરનું કન્ટેન્ટ <ph name="TARGET_NAME" /> સાથે શેર કરવા માગે છે.</translation> <translation id="2738771556149464852">આના પછી નહીં</translation> <translation id="2739191690716947896">ડીબગ કરો</translation> <translation id="2739240477418971307">તમારી ઍક્સેસિબિલિટી સેટિંગ્સ બદલો</translation> @@ -2395,6 +2399,7 @@ <translation id="3677911431265050325">મોબાઇલ સાઇટની વિનંતી કરો</translation> <translation id="3677959414150797585">આમાં ઍપ, વેબપેજ અને બીજું ઘણું શામેલ છે. જો તમે વપરાશનો ડેટા શેર કરવાનું પસંદ કર્યું હોય, તો જ તે સૂચનોને બહેતર બનાવવા માટે આંકડા મોકલે છે.</translation> <translation id="3678156199662914018">એક્સ્ટેંશન: <ph name="EXTENSION_NAME" /></translation> +<translation id="3678188444105291936">આ વિન્ડોમાં તમે જે પેજ જોઈ રહ્યાં છો એ બ્રાઉઝર ઇતિહાસમાં દેખાશે નહીં અને તમારા સાઇન આઉટ કર્યા પછી, તે કમ્પ્યુટર પર કુકી જેવા કોઈ બીજા ટ્રેસ છોડશે નહીં. તમે ડાઉનલોડ કરશો એ ફાઇલો અને તમે બનાવશો એ બુકમાર્ક જાળવવામાં આવશે નહીં.</translation> <translation id="3680683624079082902">ટેક્સ્ટ ટૂ સ્પીચ વૉઇસ</translation> <translation id="3681311097828166361">તમારા પ્રતિસાદ બદલ આભાર. તમે હમણાં ઑફલાઇન છો અને તમારી રિપોર્ટ પછીથી મોકલવામાં આવશે.</translation> <translation id="3682824389861648626">ગતિવિધિનો થ્રેશોલ્ડ</translation> @@ -2596,6 +2601,7 @@ <translation id="3884152383786131369">એકથી વધારે ભાષાઓમાં ઉપલબ્ધ વેબ કન્ટેન્ટ આ સૂચિમાંની પહેલી સપોર્ટેડ ભાષાનો ઉપયોગ કરશે. આ પસંદગીઓને તમારા બ્રાઉઝર સેટિંગ સાથે સિંક કરવામાં આવે છે. <ph name="BEGIN_LINK_LEARN_MORE" />વધુ જાણો<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3886446263141354045">આ સાઇટને ઍક્સેસ કરવાની તમારી વિનંતી <ph name="NAME" /> ને મોકલવામાં આવી છે</translation> <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" /> વડે નોંધ લેવી</translation> +<translation id="3888586133700543064">તમારા Assistant સંબંધિત સમસ્યાને વધુ સારી રીતે સમજવામાં આ માહિતી અમને સહાય કરે છે. તેને વધુમાં વધુ 90 દિવસ સુધી સ્ટોર કરવામાં આવે છે અને તેનો ઍક્સેસ એન્જિનિયરિંગ તેમજ પ્રતિસાદ ટીમ સુધી મર્યાદિત હોય છે.</translation> <translation id="3890064827463908288">વાઇ-ફાઇ સિંકનો ઉપયોગ કરવા માટે 'Chrome સિંક' ચાલુ કરો</translation> <translation id="3892414795099177503">OpenVPN / L2TP ઉમેરો...</translation> <translation id="3893536212201235195">તમારી ઍક્સેસિબિલિટી સેટિંગ્સને વાંચો અને બદલો</translation> @@ -2627,6 +2633,7 @@ <translation id="3916445069167113093">આ પ્રકારની ફાઇલ તમારા કમ્પ્યુટરને નુકસાન પહોંચાડી શકે છે. શું તમે તો પણ <ph name="FILE_NAME" /> ને રાખવા માગો છો?</translation> <translation id="3918972485393593704">Googleને વિગતોની જાણ કરો</translation> <translation id="3919145445993746351">તમારા બધા કમ્પ્યુટર પર તમારા એક્સ્ટેંશન મેળવવા માટે સિંક કરવાનું ચાલુ કરો</translation> +<translation id="3919798653937160644">આ વિન્ડોમાં તમે જે પેજ જોઈ રહ્યાં છો એ બ્રાઉઝર ઇતિહાસમાં દેખાશે નહીં અને તમે ખોલેલી બધી અતિથિ વિન્ડો બંધ કરી દો પછી, તે કમ્પ્યુટર પર કુકી જેવા કોઈ બીજા ટ્રેસ છોડશે નહીં. જોકે, તમે ડાઉનલોડ કરશો એ કોઈપણ ફાઇલ જાળવવામાં આવશે.</translation> <translation id="3920504717067627103">પ્રમાણપત્ર નીતિઓ</translation> <translation id="392089482157167418">ChromeVox ચાલુ કરો (બોલાયેલો પ્રતિસાદ)</translation> <translation id="3920909973552939961">ચુકવણી હૅન્ડલર ઇન્સ્ટૉલ કરવાની મંજૂરી નથી</translation> @@ -2964,6 +2971,7 @@ <translation id="4332976768901252016">માતાપિતાના યોગ્ય નિયંત્રણોનું સેટઅપ કરો</translation> <translation id="4333854382783149454">RSA એન્ક્રિપ્શનવાળું PKCS #1 SHA-1</translation> <translation id="4336434711095810371">બધો ડેટા સાફ કરો</translation> +<translation id="4340125850502689798">અમાન્ય વપરાશકર્તાનામ</translation> <translation id="4340515029017875942"><ph name="ORIGIN" /> આ "<ph name="EXTENSION_NAME" />" ઍપ્લિકેશન સાથે સંચાર કરવા માગે છે</translation> <translation id="4340575312453649552">આ જાહેરાતે તમારા ડિવાઇસ માટે ઘણાં વધારે સાધનોનો ઉપયોગ કર્યો, આથી Chrome દ્વારા તેને કાઢી નાખવામાં આવી છે.</translation> <translation id="4341577178275615435">ટેક્સ્ટના કર્સર વડે બ્રાઉઝ કરવાનું ચાલુ અથવા બંધ કરવા માટે, F7 શૉર્ટકટ કીનો ઉપયોગ કરો</translation> @@ -3578,6 +3586,7 @@ <translation id="5057110919553308744">તમે એક્સ્ટેંશનને ક્લિક કરો ત્યારે</translation> <translation id="5057403786441168405">તમારા સાઇન ઇન કરેલા એકાઉન્ટ મેનેજ કરો. Chrome અને Google Playમાં રહેલી વેબસાઇટ, ઍપ અને એક્સ્ટેંશન, પરવાનગીઓના આધારે આ એકાઉન્ટનો ઉપયોગ તમારા અનુભવને ક્સ્ટમાઇઝ કરવા માટે કરી શકે છે. <ph name="LINK_BEGIN" />વધુ જાણો<ph name="LINK_END" /></translation> <translation id="5059241099014281248">સાઇન ઇન કરવાનું પ્રતિબંધિત કરો</translation> +<translation id="5059526285558225588">શું શેર કરવું તે પસંદ કરો</translation> <translation id="5060332552815861872">1 પ્રિન્ટર સાચવવા માટે ઉપલબ્ધ છે.</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{આ ફોલ્ડર બુકમાર્ક સમાવે છે. શું તમે ખરેખર એને ડિલીટ કરવા માગો છો?}one{આ ફોલ્ડર # બુકમાર્ક સમાવે છે. શું તમે ખરેખર એને ડિલીટ કરવા માગો છો?}other{આ ફોલ્ડર # બુકમાર્ક સમાવે છે. શું તમે ખરેખર એને ડિલીટ કરવા માગો છો?}}</translation> <translation id="5062930723426326933">સાઇન-ઇન નિષ્ફળ થયું, કૃપા કરીને ઇન્ટરનેટથી કનેક્ટ કરો અને ફરી પ્રયાસ કરો.</translation> @@ -3694,6 +3703,7 @@ <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">તમારી મનગમતી યાદગીરીઓને ફરીથી માણો. આલ્બમ ઉમેરવા અથવા તેમાં ફેરફાર કરવા માટે, <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" /> પર જાઓ.</translation> <translation id="5190926251776387065">પોર્ટ સક્રિય કરો</translation> +<translation id="5191094172448199359">તમે દાખલ કરેલા પિન મેળ ખાતા નથી</translation> <translation id="5191251636205085390">ત્રીજા પક્ષની કુકીને બદલે વાપરવાના ઉદ્દેશ્યથી બનાવવામાં આવેલી નવી ટેક્નોલોજી વિશે જાણો અને તેમને નિયંત્રિત કરો</translation> <translation id="51918995459521422"><ph name="ORIGIN" /> એકથી વધુ ફાઇલો ડાઉનલોડ કરવા માગે છે</translation> <translation id="5192062846343383368">તમારા નિરીક્ષણ સેટિંગ જોવા માટે Family Link ઍપ ખોલો</translation> @@ -3706,6 +3716,7 @@ <translation id="5204673965307125349">કૃપા કરીને ડિવાઇસને પાવરવોશ કરો અને ફરી પ્રયાસ કરો.</translation> <translation id="5204967432542742771">પાસવર્ડ દાખલ કરો</translation> <translation id="5205484256512407285">ટ્રાન્સફર કરવા માટે ક્યારેય મોબાઇલ ડેટાનો ઉપયોગ કરશો નહીં</translation> +<translation id="520568280985468584">નેટવર્ક સફળતાપૂર્વક ઉમેરવામાં આવ્યું છે. તમારા સેલ્યુલર નેટવર્કને સક્રિય થવામાં થોડો સમય લાગી શકે છે.</translation> <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />"ને ડિલીટ કરી દઈએ?</translation> <translation id="520621735928254154">પ્રમાણપત્ર આયાત કરવામાં ભૂલ</translation> <translation id="5206787458656075734">{COUNT,plural, =1{ચેડાં કરાયેલો પાસવર્ડ સફળતાપૂર્વક બદલ્યો. તમે ચેડાં કરાયેલો વધુ # પાસવર્ડ ધરાવો છો. Chrome આ પાસવર્ડને અત્યારે ચેક કરવાની ભલામણ કરે છે.}one{ચેડાં કરાયેલો પાસવર્ડ સફળતાપૂર્વક બદલ્યો. તમે ચેડાં કરાયેલા વધુ # પાસવર્ડ ધરાવો છો. Chrome આ પાસવર્ડને અત્યારે ચેક કરવાની ભલામણ કરે છે.}other{ચેડાં કરાયેલો પાસવર્ડ સફળતાપૂર્વક બદલ્યો. તમે ચેડાં કરાયેલા વધુ # પાસવર્ડ ધરાવો છો. Chrome આ પાસવર્ડને અત્યારે ચેક કરવાની ભલામણ કરે છે.}}</translation> @@ -4342,6 +4353,7 @@ <translation id="5935656526031444304">Safe Browsingને મેનેજ કરો</translation> <translation id="5938002010494270685">સુરક્ષા અપગ્રેડ ઉપલબ્ધ</translation> <translation id="5939518447894949180">રીસેટ કરો</translation> +<translation id="5939719276406088041">શૉર્ટકટ બનાવી શકતા નથી</translation> <translation id="5941153596444580863">વ્યક્તિ ઉમેરો...</translation> <translation id="5941343993301164315"><ph name="TOKEN_NAME" /> માટે કૃપા કરીને સાઇન ઇન કરો.</translation> <translation id="5941711191222866238">નાનું કરો</translation> @@ -4429,6 +4441,7 @@ <translation id="6043994281159824495">હવે સાઇન આઉટ કરો</translation> <translation id="6044805581023976844"><ph name="APP_NAME" />, <ph name="TAB_NAME" /> સાથે Chrome ટૅબ અને ઑડિઓને શેર કરી રહી છે.</translation> <translation id="6045114302329202345">પ્રાથમિક TrackPoint બટન</translation> +<translation id="6047632800149092791">સિંક કાર્ય કરી રહ્યું નથી. સાઇન આઉટ કરીને ફરી પાછા સાઇન ઇન કરવાનો પ્રયાસ કરો.</translation> <translation id="6049004884579590341">પૂર્ણ સ્ક્રીનથી બહાર નીકળવા માટે |<ph name="ACCELERATOR" />|ને દબાવી રાખો</translation> <translation id="6051354611314852653">અરેરે! આ ઉપકરણ માટે અધિકૃત API ઍક્સેસ કરવા આ સિસ્ટમ નિષ્ફળ થઈ છે.</translation> <translation id="6052976518993719690">SSL પ્રમાણન અધિકારી</translation> @@ -4521,6 +4534,7 @@ <translation id="6143186082490678276">સહાય મેળવો</translation> <translation id="6143366292569327983">પેજની જે ભાષામાંથી અનુવાદ કરાવવા ઇચ્છતા હો, તે પસંદ કરો</translation> <translation id="6144938890088808325">Chromebooks બહેતર બનાવવામાં અમારી સહાય કરો</translation> +<translation id="6146409560350811147">સિંક કાર્ય કરી રહ્યું નથી. ફરીથી સાઇન ઇન કરવાનો પ્રયાસ કરો.</translation> <translation id="6147020289383635445">પ્રિન્ટ પ્રીવ્યૂ નિષ્ફળ ગયું.</translation> <translation id="6148576794665275391">હમણાં ખોલો</translation> <translation id="6149015141270619212">ઇન્ટરનેટ સાથે કનેક્ટ કરી શકાતું નથી</translation> @@ -4588,6 +4602,7 @@ <translation id="6232017090690406397">બૅટરી</translation> <translation id="6232116551750539448"><ph name="NAME" /> થી કનેક્શન જતું રહ્યું છે</translation> <translation id="6233154960150021497">કીબોર્ડને બદલે અવાજનો ઉપયોગ કરવા માટે ડિફૉલ્ટ</translation> +<translation id="6234108445915742946">Chromeની સેવાની શરતો 31 માર્ચથી બદલાઈ રહી છે</translation> <translation id="6234474535228214774">ઇન્સ્ટૉલ બાકી છે</translation> <translation id="6237474966939441970">સ્ટાયલસ વડે નોંધ લેવાની ઍપના સેટિંગ</translation> <translation id="6237816943013845465">તમને તમારું સ્ક્રીન રિઝોલ્યૂશન સમાયોજિત કરવાની મંજૂરી આપે છે</translation> @@ -4887,6 +4902,7 @@ <translation id="656293578423618167">ફાઇલ પાથ અથવા નામ ખૂબ લાંબા છે. કૃપા કરીને ટૂંકા નામથી બીજી જગ્યાએ સાચવો.</translation> <translation id="6563469144985748109">તમારા સંચાલકે હજી સુધી તેને મંજૂર કરેલ નથી</translation> <translation id="6569934958368283244">અન્ય લોકો</translation> +<translation id="6573497332121198392">શૉર્ટકટ કાઢી નાખી શકાતો નથી</translation> <translation id="657402800789773160">&Reload This Page</translation> <translation id="6577284282025554716">ડાઉનલોડ રદ કર્યું: <ph name="FILE_NAME" /></translation> <translation id="657866106756413002">નેટવર્કના સ્વાસ્થ્યનો સ્નૅપશૉટ</translation> @@ -4894,6 +4910,7 @@ <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> - ડેસ્કટૉપ કન્ટેન્ટ શેર કર્યું</translation> <translation id="6580203076670148210">સ્કૅન કરવાની ઝડપ</translation> <translation id="6582080224869403177">તમારી સુરક્ષા અપગ્રેડ કરવા માટે <ph name="DEVICE_TYPE" />ને રીસેટ કરો.</translation> +<translation id="6582274660680936615">તમે અતિથિ તરીકે બ્રાઉઝ કરી રહ્યાં છો</translation> <translation id="6584878029876017575">Microsoft Lifetime Signing</translation> <translation id="6586099239452884121">અતિથિ બ્રાઉઝિંગ</translation> <translation id="6586451623538375658">પ્રાથમિક માઉસ બટનને સ્વેપ કરો</translation> @@ -5063,6 +5080,7 @@ <translation id="6782468519961184511">તમારા વ્યવસ્થાપક વધારાના Google એકાઉન્ટની મંજૂરી આપતા નથી</translation> <translation id="6785518634832172390">પિન 12 કે તેથી ઓછા અંકનો હોવો જરૂરી છે</translation> <translation id="6786747875388722282">એક્સ્ટેન્શન્સ</translation> +<translation id="6787097042755590313">અન્ય ટૅબ</translation> <translation id="6787839852456839824">કીબોર્ડ શોર્ટકટ્સ</translation> <translation id="6788210894632713004">અનપૅક કરેલ એક્સ્ટેન્શન</translation> <translation id="6789592661892473991">સ્ક્રીનને આડી વિભાજિત કરો</translation> @@ -5073,6 +5091,7 @@ <translation id="6793723358811598107">'<ph name="ACTION" />' ક્રિયાને '<ph name="CURRENTKEY" />' કી પહેલેથી સોંપવામાં આવી છે. બહાર નીકળવા માટે કોઈપણ કી દબાવો.</translation> <translation id="6795884519221689054">પાંડા</translation> <translation id="6797493596609571643">અરેરે, કંઈક ખોટું થયું.</translation> +<translation id="6798420440063423019">ઘણી બધી વખત ખોટો પિન દાખલ કર્યો હોવાને કારણે સિક્યુરિટી કી લૉક કરવામાં આવી છે. તમારે સિક્યુરિટી કી રીસેટ કરવાની જરૂર રહેશે.</translation> <translation id="6798578729981748444">આયાત કરવાનું સમાપ્ત કરવા માટે, બધી Firefox વિંડો બંધ કરો.</translation> <translation id="6798780071646309401">caps lock ચાલુ છે</translation> <translation id="6798954102094737107">પ્લગિન: <ph name="PLUGIN_NAME" /></translation> @@ -5418,6 +5437,7 @@ <translation id="7180865173735832675">કસ્ટમાઇઝ કરો</translation> <translation id="7182791023900310535">તમારો પાસવર્ડ ખસેડો</translation> <translation id="7186088072322679094">ટુલબારમાં રાખો</translation> +<translation id="7186303001964993981"><ph name="ORIGIN" /> આ ફોલ્ડર ખોલી શકતું નથી, કારણ કે તેમાં સિસ્ટમ ફાઇલો શામેલ છે</translation> <translation id="7187428571767585875">કાઢી નાખવા અથવા બદલવા માટેની રજિસ્ટ્રી એન્ટ્રી:</translation> <translation id="7187855807420906517">તમે બહાર નીકળી જાઓ અથવા ઑફલાઇન થાઓ, તે પછી સાઇટ સામાન્ય રીતે, ફોટા અપલોડ કરવા અથવા ચૅટ સંદેશ મોકલવા જેવા કાર્યો પૂરા કરવા માટે સિંક કર્યા કરે છે</translation> <translation id="7189234443051076392">ખાતરી કરો કે તમારા ઉપકરણ પર પૂરતી સ્પેસ છે</translation> @@ -6037,6 +6057,7 @@ <translation id="7871109039747854576">ઉમેદવારોની સૂચિનું પેજ બનાવવા માટે <ph name="COMMA" /> અને <ph name="PERIOD" /> કીનો ઉપયોગ કરો</translation> <translation id="787268756490971083">બંધ</translation> <translation id="7874257161694977650">Chrome બૅકગ્રાઉન્ડ</translation> +<translation id="7876027585589532670">શૉર્ટકટમાં ફેરફાર કરી શકાતો નથી</translation> <translation id="7877451762676714207">અજ્ઞાત સર્વર ભૂલ. કૃપા કરી ફરીથી પ્રયત્ન કરો અથવા સર્વર વ્યવસ્થાપકનો સંપર્ક કરો.</translation> <translation id="7879631849810108578">શૉર્ટકટ સેટ થયો: <ph name="IDS_SHORT_SET_COMMAND" /></translation> <translation id="7880823633812189969">તમે ફરી શરૂ કરશો ત્યારે સ્થાનિક ડેટા ડિલીટ કરવામાં આવશે</translation> @@ -6318,6 +6339,7 @@ <translation id="8189750580333936930">પ્રાઇવસી સૅન્ડબૉક્સ</translation> <translation id="8190193592390505034"><ph name="PROVIDER_NAME" /> થી કનેક્ટ કરે છે</translation> <translation id="8191230140820435481">તમારી ઍપ્લિકેશનો, એક્સ્ટેન્શન અને થીમ્સ મેનેજ કરો</translation> +<translation id="8192944472786724289"><ph name="APP_NAME" /> તમારી સ્ક્રીન પરનું કન્ટેન્ટ શેર કરવા માગે છે.</translation> <translation id="8195027750202970175">ડિસ્ક પર કદ</translation> <translation id="8198323535106903877">અમે તમારા માટે તે <ph name="NUMBER_OF_APPS" /> ઍપ ઇન્સ્ટૉલ કરીશું</translation> <translation id="8199300056570174101">નેટવર્ક (સેવા) અને ઉપકરણના ગુણધર્મો</translation> @@ -6968,6 +6990,7 @@ <translation id="8931475688782629595">તમે જે સિંક કરો તેને મેનેજ કરો</translation> <translation id="8932654652795262306">ઝટપટ ઇન્ટરનેટ શેર કરવાની સુવિધાની વિગતો</translation> <translation id="8932894639908691771">સ્વિચ ઍક્સેસ માટે વિકલ્પો</translation> +<translation id="893298445929867520">કાર્ટ છુપાવેલા છે. તમે ફેરફાર કરશો ત્યારે તે ફરી દેખાશે.</translation> <translation id="8933960630081805351">ફાઇન્ડર માં &બતાવો</translation> <translation id="8934732568177537184">ચાલુ રાખો</translation> <translation id="8938306522009698937">હૅન્ડલર</translation> @@ -7244,6 +7267,7 @@ <translation id="942532530371314860"><ph name="APP_NAME" />, Chrome ટૅબ અને ઑડિઓને શેર કરી રહી છે.</translation> <translation id="945522503751344254">પ્રતિસાદ મોકલો</translation> <translation id="947329552760389097">&ઘટકોની તપાસ કરો</translation> +<translation id="947667444780368238"><ph name="ORIGIN" /> આ ફોલ્ડરમાં ફાઇલો ખોલી શકતું નથી, કારણ કે તેમાં સિસ્ટમ ફાઇલો શામેલ છે</translation> <translation id="951991426597076286">નકારો</translation> <translation id="956500788634395331">તમને નુકસાન પહોંચાડવાની સંભાવના હોય એવા એક્સ્ટેંશનથી સુરક્ષિત કર્યા છે</translation> <translation id="957960681186851048">આ સાઇટે એકથી વધુ ફાઇલોને ઑટોમૅટિક રીતે ડાઉનલોડ કરવાનો પ્રયાસ કર્યો</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index 24914415..517b045 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -576,6 +576,7 @@ <translation id="1627408615528139100">पहले से डाउनलोड की हुई है</translation> <translation id="1628948239858170093">क्या आप फ़ाइल को खोलने से पहले स्कैन करना चाहते हैं?</translation> <translation id="1629314197035607094">पासवर्ड की समय सीमा खत्म हो गई है</translation> +<translation id="1629521517399325891">नेटवर्क की पुष्टि करने के लिए, उपयोगकर्ता प्रमाणपत्र उपलब्ध नहीं है.</translation> <translation id="163072119192489970">डेटा भेजने और पाने की अनुमति है</translation> <translation id="1630768113285622200">रीस्टार्ट करें और जारी रखें</translation> <translation id="1632082166874334883">आपके Google खाते में सेव किया गया पासवर्ड</translation> @@ -1180,6 +1181,7 @@ <translation id="2300383962156589922"><ph name="APP_NAME" /> को पसंद के मुताबिक बनाएं और नियंत्रित करें</translation> <translation id="2301382460326681002">एक्सटेंशन मूल निर्देशिका अमान्य है.</translation> <translation id="23030561267973084">"<ph name="EXTENSION_NAME" />" ने अतिरिक्त अनुमतियों का अनुरोध किया है.</translation> +<translation id="230529452743010958">आपने Google की सेवाओं पर हाल ही में क्या-क्या खोजा, देखा, और किया है, इसके आधार पर आपको यह आइटम दिख रहा है. आप <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> पर जाकर, अपना डेटा देख सकते हैं, मिटा सकते हैं, और सेटिंग में बदलाव कर सकते हैं.</translation> <translation id="23055578400314116">कोई उपयोगकर्ता नाम चुनें</translation> <translation id="2307462900900812319">नेटवर्क कॉन्फ़िगर करें</translation> <translation id="230927227160767054">यह पेज सेवा हैंडलर इंस्टॉल करना चाहता है.</translation> @@ -1406,6 +1408,7 @@ <translation id="2541706104884128042">सोने का नया समय सेट किया गया</translation> <translation id="2542050502251273923">ff_debug का इस्तेमाल करके, इंटरनेट कनेक्शन मैनेजर और दूसरी सेवाओं के डीबग करने के लेवल को सेट करता है.</translation> <translation id="2544292303401268586">ऐप्लिकेशन अपडेट करने के लिए, एडमिन ने आपके डिवाइस को रीस्टार्ट करने का अनुरोध किया है. इस प्रोसेस को पूरा होने में कुछ समय लग सकता है.</translation> +<translation id="2544352060595557290">यह टैब</translation> <translation id="2544853746127077729">नेटवर्क द्वारा प्रमाणीकरण प्रमाणपत्र अस्वीकार किया गया</translation> <translation id="2546283357679194313">कुकी और साइट डेटा</translation> <translation id="2548347166720081527"><ph name="PERMISSION" /> इस्तेमाल करने की अनुमति दी गई है</translation> @@ -1571,6 +1574,7 @@ <translation id="2734760316755174687"><ph name="SITE_GROUP_NAME" /> की साइटों को भी रीसेट किया जाएगा.</translation> <translation id="2735712963799620190">शेड्यूल</translation> <translation id="2737363922397526254">छोटा करें...</translation> +<translation id="2737916598897808047"><ph name="APP_NAME" /> आपकी स्क्रीन पर मौजूद कॉन्टेंट को <ph name="TARGET_NAME" /> के साथ शेयर करना चाहता है.</translation> <translation id="2738771556149464852">बाद में नहीं</translation> <translation id="2739191690716947896">डीबग</translation> <translation id="2739240477418971307">अपनी सुलभता सेटिंग बदलें</translation> @@ -2399,6 +2403,7 @@ <translation id="3677911431265050325">मोबाइल साइट के लिए अनुरोध करें</translation> <translation id="3677959414150797585">इसमें ऐप्लिकेशन, वेबपेज वगैरह शामिल हैं. यह सुझावों को बेहतर बनाने के लिए आंकड़े सिर्फ़ तब भेजता है जब आपने इस्तेमाल के बारे में जानकारी देने वाला डेटा शेयर करने का विकल्प चुना हो.</translation> <translation id="3678156199662914018">एक्सटेंशन: <ph name="EXTENSION_NAME" /></translation> +<translation id="3678188444105291936">जब आप अपने कंप्यूटर पर साइन आउट करेंगे, तो इस विंडो में देखे गए पेजों की जानकारी आपके ब्राउज़र इतिहास में सेव नहीं होगी. साथ ही, इन पेजों से जुड़ा किसी भी तरह का डेटा मिट जाएगा, जैसे कि कुकी. आपकी डाउनलोड की गई सभी फ़ाइलें और बनाए गए बुकमार्क भी सेव नहीं रहेंगे.</translation> <translation id="3680683624079082902">लिखाई को बोली में बदलने के लिए आवाज़ की सेटिंग</translation> <translation id="3681311097828166361">आपके फ़ीडबैक के लिए धन्यवाद. आप अब ऑफ़लाइन हैं और आपकी रिपोर्ट बाद में भेज दी जाएगी.</translation> <translation id="3682824389861648626">माउस की गति की सीमा</translation> @@ -2600,6 +2605,7 @@ <translation id="3884152383786131369">कई भाषाओं में उपलब्ध वेब कॉन्टेंट, इस सूची में दी गई पहली भाषा में दिखाया जाएगा. इन प्राथमिकताओं को आपके ब्राउज़र की सेटिंग के साथ सिंक किया जाता है. <ph name="BEGIN_LINK_LEARN_MORE" />ज़्यादा जानें<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3886446263141354045">यह साइट एक्सेस करने का आपका अनुरोध <ph name="NAME" /> को भेज दिया गया है</translation> <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" /> से नोट लेना</translation> +<translation id="3888586133700543064">इस जानकारी से, हमें Assistant से जुड़ी आपकी समस्या को बेहतर तरीके से समझने में मदद मिलती है. इस जानकारी को 90 दिनों तक सेव करके रखा जाता है. साथ ही, इसका ऐक्सेस उन इंजीनियरिंग और फ़ीडबैक टीमों के पास ही रहता है जो आपकी समस्या पर काम करती हैं.</translation> <translation id="3890064827463908288">'वाई-फ़ाई सिंक' इस्तेमाल करने के लिए 'Chrome सिंक' चालू करें</translation> <translation id="3892414795099177503">OpenVPN / L2TP जोड़ें...</translation> <translation id="3893536212201235195">अपनी सुलभता सेटिंग पढ़ें और उसमें बदलाव करें</translation> @@ -2631,6 +2637,7 @@ <translation id="3916445069167113093">इस प्रकार की फ़ाइल आपके कंप्यूटर को नुकसान पहुंचा सकती है. क्या फिर भी आप <ph name="FILE_NAME" /> को रखना चाहते हैं?</translation> <translation id="3918972485393593704">Google को जानकारी भेजें</translation> <translation id="3919145445993746351">अपने सभी कंप्यूटर पर अपने एक्सटेंशन पाने के लिए, सिंक चालू करें</translation> +<translation id="3919798653937160644">जब आप अपने कंप्यूटर पर सभी मेहमान विंडो बंद कर देंगे, तो इस विंडो में देखे गए पेजों की जानकारी आपके ब्राउज़र इतिहास में सेव नहीं होगी. साथ ही, इन पेजों से जुड़ा किसी भी तरह का डेटा मिट जाएगा, जैसे कि कुकी. हालांकि, आपकी डाउनलोड की गई सभी फ़ाइलें सेव रहेंगी.</translation> <translation id="3920504717067627103">प्रमाणपत्र नीतियां</translation> <translation id="392089482157167418">ChromeVox (कंप्यूटर का बोलकर दिया गया जवाब) चालू करें</translation> <translation id="3920909973552939961">पेमेंट हैंडलर इंस्टॉल करनी की अनुमति नहीं है</translation> @@ -2967,6 +2974,7 @@ <translation id="4332976768901252016">माता-पिता के नियंत्रण सेट अप करें</translation> <translation id="4333854382783149454">RSA सुरक्षित करने के तरीके के साथ PKCS #1 SHA-1</translation> <translation id="4336434711095810371">सारा डेटा मिटाएं</translation> +<translation id="4340125850502689798">यह उपयोगकर्ता नाम गलत/अमान्य है</translation> <translation id="4340515029017875942"><ph name="ORIGIN" /> "<ph name="EXTENSION_NAME" />" से संचार करना चाहती है</translation> <translation id="4340575312453649552">यह विज्ञापन आपके डिवाइस के बहुत से संसाधन इस्तेमाल करता था, इसलिए Chrome ने इसे हटा दिया है.</translation> <translation id="4341577178275615435">कैरेट ब्राउज़िंग को चालू या बंद करने के लिए, शॉर्टकट F7 का इस्तेमाल करें</translation> @@ -3581,6 +3589,7 @@ <translation id="5057110919553308744">जब आप एक्सटेंशन को क्लिक करते हैं</translation> <translation id="5057403786441168405">अपने साइन इन किए गए खातों को प्रबंधित करें. वेबसाइट, ऐप्लिकेशन, और Chrome या Google Play के एक्सटेंशन, इन खातों का इस्तेमाल आपके अनुभव को आपकी पसंद के मुताबिक बनाने के लिए कर सकते हैं. ये आपकी अनुमतियों के आधार पर ऐसा करते हैं. <ph name="LINK_BEGIN" />ज़्यादा जानें<ph name="LINK_END" /></translation> <translation id="5059241099014281248">साइन-इन करने पर पाबंदी लगाएं</translation> +<translation id="5059526285558225588">चुनें कि क्या शेयर करना है</translation> <translation id="5060332552815861872">सेव करने के लिए एक प्रिंटर उपलब्ध है.</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{इस फ़ोल्डर में एक बुकमार्क है. क्या आप वाकई इसे मिटाना चाहते हैं?}one{इस फ़ोल्डर में # बुकमार्क हैं. क्या आप वाकई इसे मिटाना चाहते हैं?}other{इस फ़ोल्डर में # बुकमार्क हैं. क्या आप वाकई इसे मिटाना चाहते हैं?}}</translation> <translation id="5062930723426326933">साइन इन नहीं हो पाया, कृपया इंटरनेट से कनेक्ट करें और फिर से कोशिश करें.</translation> @@ -3697,6 +3706,7 @@ <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">अपनी पसंदीदा यादें ताज़ा करें. एल्बम जोड़ने या उनमें बदलाव करने के लिए, <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" /> पर जाएं.</translation> <translation id="5190926251776387065">पोर्ट को चालू करें</translation> +<translation id="5191094172448199359">आपके डाले गए पिन मेल नहीं खा रहे हैं</translation> <translation id="5191251636205085390">तीसरे पक्ष की कुकी की जगह इस्तेमाल करने के मकसद से बनाई गई नई टेक्नोलॉजी के बारे में जानें और उन्हें कंट्रोल करें</translation> <translation id="51918995459521422"><ph name="ORIGIN" /> एक से ज़्यादा फ़ाइलें डाउनलोड करना चाहते हैं</translation> <translation id="5192062846343383368">निगरानी करने की सेटिग देखने के लिए Family Link ऐप्लिकेशन खोलें</translation> @@ -3709,6 +3719,7 @@ <translation id="5204673965307125349">कृपया डिवाइस को पावरवॉश करें और फिर से कोशिश करें.</translation> <translation id="5204967432542742771">पासवर्ड डालें</translation> <translation id="5205484256512407285">ट्रांसफ़र करने के लिए, मोबाइल डेटा का इस्तेमाल कभी न करें</translation> +<translation id="520568280985468584">मोबाइल नेटवर्क जोड़ दिया गया है. इसे चालू होने में कुछ मिनट लग सकते हैं.</translation> <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />" मिटाएं?</translation> <translation id="520621735928254154">प्रमाणपत्र आयात करने में गड़बड़ी</translation> <translation id="5206787458656075734">{COUNT,plural, =1{हैक किए गए या चोरी हुए पासवर्ड को बदल दिया गया है. आपका # और पासवर्ड या तो हैक हुआ है या चोरी हुआ है. Chrome अभी इस पासवर्ड की जांच करने का सुझाव देता है.}one{हैक किए गए या चोरी हुए पासवर्ड को बदल दिया गया है. आपका # और पासवर्ड या तो हैक हुआ है या चोरी हुआ है. Chrome अभी इस पासवर्ड की जांच करने का सुझाव देता है.}other{हैक किए गए या चोरी हुए पासवर्ड बदल दिए गए हैं. आपके # और पासवर्ड या तो हैक हुए हैं या चोरी हुए हैं. Chrome अभी इन पासवर्ड की जांच करने का सुझाव देता है.}}</translation> @@ -4343,6 +4354,7 @@ <translation id="5935656526031444304">सुरक्षित ब्राउज़िंग प्रबंधित करें</translation> <translation id="5938002010494270685">सुरक्षा बेहतर बनाने की सुविधा मौजूद है</translation> <translation id="5939518447894949180">रीसेट करें</translation> +<translation id="5939719276406088041">शॉर्टकट नहीं बनाए जा सकते</translation> <translation id="5941153596444580863">व्यक्ति को शामिल करें...</translation> <translation id="5941343993301164315">कृपया <ph name="TOKEN_NAME" /> में साइन इन करें.</translation> <translation id="5941711191222866238">छोटा करें</translation> @@ -4430,6 +4442,7 @@ <translation id="6043994281159824495">अब प्रस्थान करें</translation> <translation id="6044805581023976844"><ph name="APP_NAME" />, <ph name="TAB_NAME" /> के साथ Chrome टैब और ऑडियो शेयर कर रहा है.</translation> <translation id="6045114302329202345">मुख्य TrackPoint बटन</translation> +<translation id="6047632800149092791">सिंक करने की सुविधा काम नहीं कर रही. साइन आउट करके फिर से साइन इन करें.</translation> <translation id="6049004884579590341">पूरी स्क्रीन से बाहर निकलने के लिए |<ph name="ACCELERATOR" />| दबाकर रखें</translation> <translation id="6051354611314852653">ओह! सिस्टम इस डिवाइस के लिए API (एपीआई) एक्सेस की मंज़ूरी नहीं दे सका.</translation> <translation id="6052976518993719690">SSL सत्यापन प्रधिकरण</translation> @@ -4522,6 +4535,7 @@ <translation id="6143186082490678276">सहायता पाएं</translation> <translation id="6143366292569327983">वह भाषा चुनें जिसका अनुवाद करना है</translation> <translation id="6144938890088808325">Chromebook को बेहतर बनाने में हमारी सहायता करें</translation> +<translation id="6146409560350811147">सिंक करने की सुविधा काम नहीं कर रही. फिर से साइन इन करने की कोशिश करें.</translation> <translation id="6147020289383635445">प्रिंट की झलक नहीं देखी जा सकी.</translation> <translation id="6148576794665275391">अभी खोलें</translation> <translation id="6149015141270619212">इंटरनेट से कनेक्ट नहीं किया जा सकता</translation> @@ -4589,6 +4603,7 @@ <translation id="6232017090690406397">बैटरी</translation> <translation id="6232116551750539448"><ph name="NAME" /> से कनेक्शन टूट गया</translation> <translation id="6233154960150021497">कीबोर्ड के बजाय आवाज़ का इस्तेमाल करना डिफ़ॉल्ट करें</translation> +<translation id="6234108445915742946">Chrome की सेवा की शर्तें 31 मार्च से बदलने वाली हैं</translation> <translation id="6234474535228214774">इंस्टॉल होना बाकी है</translation> <translation id="6237474966939441970">स्टाइलस की मदद से नोट के लिए ऐप्लिकेशन</translation> <translation id="6237816943013845465">आपको अपना स्क्रीन रिज़ॉल्यूशन समायोजित करने देती है</translation> @@ -4888,6 +4903,7 @@ <translation id="656293578423618167">फ़ाइल पाथ या नाम बहुत बड़ा है. कृपया छोटे नाम के साथ या किसी दूसरी जगह पर सेव करें.</translation> <translation id="6563469144985748109">आपके मैनेजर ने अभी तक इसकी अनुमति नहीं दी है</translation> <translation id="6569934958368283244">दूसरे लोग</translation> +<translation id="6573497332121198392">शॉर्टकट नहीं हटाया जा सकता</translation> <translation id="657402800789773160">&यह पेज फिर से लोड करें</translation> <translation id="6577284282025554716">डाउनलोड रोका गया: <ph name="FILE_NAME" /></translation> <translation id="657866106756413002">नेटवर्क हेल्थ स्नैपशॉट</translation> @@ -4895,6 +4911,7 @@ <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> - डेस्कटॉप की सामग्री शेयर की गई</translation> <translation id="6580203076670148210">स्कैन करने की रफ़्तार</translation> <translation id="6582080224869403177">अपनी सुरक्षा बेहतर बनाने के लिए अपना <ph name="DEVICE_TYPE" /> रीसेट करें.</translation> +<translation id="6582274660680936615">आप मेहमान मोड में ब्राउज़ कर रहे हैं</translation> <translation id="6584878029876017575">Microsoft Lifetime Signing</translation> <translation id="6586099239452884121">अतिथि ब्राउज़िंग</translation> <translation id="6586451623538375658">प्राथमिक माउस बटन स्वैप करें</translation> @@ -5064,6 +5081,7 @@ <translation id="6782468519961184511">आपका एडमिन अतिरिक्त Google खाते जोड़ने की अनुमति नहीं देता है</translation> <translation id="6785518634832172390">पासवर्ड 12 या उससे कम अंक का होना चाहिए</translation> <translation id="6786747875388722282">एक्सटेंशन</translation> +<translation id="6787097042755590313">अन्य टैब</translation> <translation id="6787839852456839824">कीबोर्ड शॉर्टकट</translation> <translation id="6788210894632713004">पैक नहीं किया गया एक्सटेंशन</translation> <translation id="6789592661892473991">हाॅरिज़ॉन्टल (बाईं से दाईं ओर) रूप से छोटे-छोटे हिस्सों में बांटें यानी स्प्लिट करें</translation> @@ -5074,6 +5092,7 @@ <translation id="6793723358811598107">'<ph name="CURRENTKEY" />' को पहले ही '<ph name="ACTION" />' कार्रवाई के लिए असाइन किया जा चुका है. बाहर निकलने के लिए कोई भी बटन दबाएं.</translation> <translation id="6795884519221689054">पांडा</translation> <translation id="6797493596609571643">ओह! कुछ गड़बड़ी हो गई है.</translation> +<translation id="6798420440063423019">बार-बार गलत बिन डालने की वजह से सुरक्षा कुंजी लॉक हो गई है. आपको सुरक्षा कुंजी को रीसेट करना होगा.</translation> <translation id="6798578729981748444">आयात करना पूरा करने के लिए, सभी Firefox विंडो बंद करें.</translation> <translation id="6798780071646309401">caps lock चालू है</translation> <translation id="6798954102094737107">प्लग इन: <ph name="PLUGIN_NAME" /></translation> @@ -5419,6 +5438,7 @@ <translation id="7180865173735832675">पसंद के मुताबिक बनाएं</translation> <translation id="7182791023900310535">अपने पासवर्ड को खाते में ले जाएं</translation> <translation id="7186088072322679094">टूलबार में रखें</translation> +<translation id="7186303001964993981"><ph name="ORIGIN" /> की मदद से इस फ़ोल्डर को नहीं खोला जा सकता, क्योंकि इस फ़ोल्डर में सिस्टम फ़ाइलें हैं</translation> <translation id="7187428571767585875">ऐसी रजिस्ट्री प्रविष्टियां जिन्हें हटाया या बदला जाना है:</translation> <translation id="7187855807420906517">जब आप ऑफ़लाइन होने के बाद फिर से ऑनलाइल आते हैं, तो आम तौर पर साइटें कुछ कामों को पूरा करने के लिए सिंक करती रहती हैं. जैसे कि फ़ोटो अपलोड करना या चैट मैसेज भेजना</translation> <translation id="7189234443051076392">पक्का करें कि आपके डिवाइस पर ज़रूरी जगह मौजूद हो</translation> @@ -6038,6 +6058,7 @@ <translation id="7871109039747854576">उम्मीदवारों की सूची को पेज पर लाने के लिए, <ph name="COMMA" /> और <ph name="PERIOD" /> बटन दबाएं</translation> <translation id="787268756490971083">बंद है</translation> <translation id="7874257161694977650">Chrome बैकग्राउंड</translation> +<translation id="7876027585589532670">शॉर्टकट में बदलाव नहीं किया जा सकता</translation> <translation id="7877451762676714207">अज्ञात सर्वर गड़बड़ी. कृपया फिर से प्रयास करें, या सर्वर व्यवस्थापक से संपर्क करें.</translation> <translation id="7879631849810108578">शॉर्टकट सेट हो गया: <ph name="IDS_SHORT_SET_COMMAND" /></translation> <translation id="7880823633812189969">जब आप रीस्टार्ट करेंगे, तो स्थानीय डेटा मिटा दिया जाएगा</translation> @@ -6324,6 +6345,7 @@ <translation id="8189750580333936930">निजता सैंडबॉक्स</translation> <translation id="8190193592390505034"><ph name="PROVIDER_NAME" /> से कनेक्ट हो रहा है</translation> <translation id="8191230140820435481">अपने ऐप्स , एक्सटेंशन, और थीम प्रबंधित करें</translation> +<translation id="8192944472786724289"><ph name="APP_NAME" /> आपकी स्क्रीन पर मौजूद कॉन्टेंट शेयर करना चाहता है.</translation> <translation id="8195027750202970175">डिस्क पर आकार</translation> <translation id="8198323535106903877">हम आपके लिए वे <ph name="NUMBER_OF_APPS" /> ऐप्लिकेशन इंस्टॉल करेंगे</translation> <translation id="8199300056570174101">नेटवर्क (सेवा) और डिवाइस प्रॉपर्टी</translation> @@ -6974,6 +6996,7 @@ <translation id="8931475688782629595">सिंक किया गया डेटा प्रबंधित करें</translation> <translation id="8932654652795262306">इंस्टैंट टेदरिंग की जानकारी</translation> <translation id="8932894639908691771">ऐक्सेस का तरीका बदलने के विकल्प</translation> +<translation id="893298445929867520">कार्ट छिपा दिए गए हैं. जब आप बदलाव करेंगे, तब वे फिर से दिखेंगे.</translation> <translation id="8933960630081805351">खोजकर्ता में &दिखाएं</translation> <translation id="8934732568177537184">जारी रखें</translation> <translation id="8938306522009698937">हैंडलर</translation> @@ -7250,6 +7273,7 @@ <translation id="942532530371314860"><ph name="APP_NAME" /> एक Chrome टैब और ऑडियो शेयर कर रहा है.</translation> <translation id="945522503751344254">फ़ीडबैक भेजें</translation> <translation id="947329552760389097">&एलिमेंट जाँचें</translation> +<translation id="947667444780368238"><ph name="ORIGIN" /> की मदद से, इस फ़ोल्डर में मौजूद फ़ाइलें नहीं खोली जा सकतीं, क्योंकि ये सिस्टम फ़ाइलें हैं</translation> <translation id="951991426597076286">अस्वीकार करें</translation> <translation id="956500788634395331">आप ऐसे एक्सटेंशन से सुरक्षित हैं जो शायद नुकसान पहुंचा सकते हैं</translation> <translation id="957960681186851048">इस साइट ने अपने आप कई फ़ाइलें डाउनलोड करने की कोशिश की है</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index a865632..3d8ed21 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -574,6 +574,7 @@ <translation id="1627408615528139100">הקובץ כבר הורד</translation> <translation id="1628948239858170093">לסרוק את הקובץ לפני שפותחים אותו?</translation> <translation id="1629314197035607094">פג תוקף הסיסמה</translation> +<translation id="1629521517399325891">אישור המשתמש לא זמין לאימות הרשת.</translation> <translation id="163072119192489970">מורשים לסיים שליחה או קבלה של נתונים</translation> <translation id="1630768113285622200">הפעלה מחדש והמשכת התהליך</translation> <translation id="1632082166874334883">הסיסמה מאוחסנת בחשבון Google שלך</translation> @@ -1178,6 +1179,7 @@ <translation id="2300383962156589922">התאמה אישית ושליטה ב-<ph name="APP_NAME" /></translation> <translation id="2301382460326681002">ספריית הבסיס של ההרחבה אינה חוקית.</translation> <translation id="23030561267973084">"<ph name="EXTENSION_NAME" />" ביקש אישורים נוספים.</translation> +<translation id="230529452743010958">הפריט הזה מוצג לך על סמך הפעילות הקודמת שלך בשירותי Google. הנתונים שלך מוצגים בכתובת <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />, ואפשר למחוק אותם או לשנות את ההגדרות.</translation> <translation id="23055578400314116">יש לבחור שם משתמש</translation> <translation id="2307462900900812319">הגדרת רשת</translation> <translation id="230927227160767054">דף זה מעוניין להתקין handler של שירות.</translation> @@ -1404,6 +1406,7 @@ <translation id="2541706104884128042">הוגדרה שעת שינה חדשה</translation> <translation id="2542050502251273923">קובעת את רמת ניפוי הבאגים של מנהל החיבור לרשת ושירותים אחרים שמשתמשים ב-ff_debug.</translation> <translation id="2544292303401268586">התקבלה בקשה ממנהל המערכת להפעיל מחדש את המכשיר שלך כדי לעדכן אפליקציות. השלמת הפעולה עשויה להימשך מספר דקות.</translation> +<translation id="2544352060595557290">הכרטיסייה הזו</translation> <translation id="2544853746127077729">אישור האימות נדחה על ידי הרשת</translation> <translation id="2546283357679194313">נתוני אתר וקובצי Cookie</translation> <translation id="2548347166720081527">ההרשאה <ph name="PERMISSION" /> הוענקה</translation> @@ -1570,6 +1573,7 @@ <translation id="2734760316755174687">הפעולה תאפס גם אתרים שהם חלק מ-<ph name="SITE_GROUP_NAME" />.</translation> <translation id="2735712963799620190">לוח זמנים</translation> <translation id="2737363922397526254">כיווץ...</translation> +<translation id="2737916598897808047">האפליקציה <ph name="APP_NAME" /> מבקשת הרשאה לשתף את המסך שלך עם <ph name="TARGET_NAME" />.</translation> <translation id="2738771556149464852">לא אחרי</translation> <translation id="2739191690716947896">ניפוי באגים</translation> <translation id="2739240477418971307">שינוי הגדרות הנגישות שלך</translation> @@ -2398,6 +2402,7 @@ <translation id="3677911431265050325">בקשת אתר לנייד</translation> <translation id="3677959414150797585">כולל אפליקציות, דפי אינטרנט ועוד. המערכת שולחת נתונים סטטיסטיים כדי לשפר את ההצעות רק אם בחרת לשתף נתוני שימוש במכשיר.</translation> <translation id="3678156199662914018">תוסף: <ph name="EXTENSION_NAME" /></translation> +<translation id="3678188444105291936">דפים שיוצגו בחלון זה לא יופיעו בהיסטוריית הדפדפן ולא ישאירו במחשב עקבות מסוגים אחרים, כגון קובצי Cookie, לאחר היציאה. קבצים שיורדו וסימניות שייווצרו לא יישמרו.</translation> <translation id="3680683624079082902">קול של המרת טקסט לדיבור (TTS)</translation> <translation id="3681311097828166361">תודה על המשוב. כרגע אינך מחובר לאינטרנט, כך שהדוח שלך יישלח מאוחר יותר.</translation> <translation id="3682824389861648626">סף תנועה</translation> @@ -2599,6 +2604,7 @@ <translation id="3884152383786131369">תוכן אינטרנט שזמין במספר שפות יוצג בשפה הנתמכת הראשונה ברשימה הזו. ההעדפות האלה מסונכרנות עם הגדרות הדפדפן. <ph name="BEGIN_LINK_LEARN_MORE" />מידע נוסף<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3886446263141354045">הבקשה שלך לגשת לאתר הזה נשלחה אל <ph name="NAME" /></translation> <translation id="3888550877729210209">כתיבת הערות בעזרת <ph name="LOCK_SCREEN_APP_NAME" /></translation> +<translation id="3888586133700543064">המידע הזה עוזר לנו להבין בצורה טובה יותר את הבעיה שלך ב-Assistant. הוא נשמר לתקופה של עד 90 ימים והגישה אליו מוגבלת: רק צוותי ההנדסה והמשוב המתאימים רשאים לגשת אליו.</translation> <translation id="3890064827463908288">צריך להפעיל סנכרון Chrome כדי להשתמש בסנכרון Wi-Fi</translation> <translation id="3892414795099177503">הוספת OpenVPN / L2TP...</translation> <translation id="3893536212201235195">קריאה ושינוי של הגדרות הנגישות שלך</translation> @@ -2630,6 +2636,7 @@ <translation id="3916445069167113093">סוג קובץ זה עלול לגרום נזק למחשב שלך. האם ברצונך לשמור את <ph name="FILE_NAME" /> בכל מקרה?</translation> <translation id="3918972485393593704">שליחת הפרטים אל Google</translation> <translation id="3919145445993746351">כדי לקבל גישה אל התוספים שלך בכל המחשבים שברשותך, יש להפעיל את הסנכרון</translation> +<translation id="3919798653937160644">הדפים המוצגים בחלון זה לא יופיעו בהיסטוריית הדפדפן, ולאחר סגירת כל חלונות האורח הפתוחים, לא יותירו במחשב עקבות, כמו קובצי Cookie. עם זאת, כל הקבצים שיורדו יישמרו.</translation> <translation id="3920504717067627103">מדיניות אישורים </translation> <translation id="392089482157167418">הפעלת ChromeVox (משוב קולי)</translation> <translation id="3920909973552939961">לא מורשים להתקין רכיבי handler של תשלומים</translation> @@ -2967,6 +2974,7 @@ <translation id="4332976768901252016">הגדרה של בקרת הורים</translation> <translation id="4333854382783149454">PKCS #1 SHA-1 עם הצפנת RSA</translation> <translation id="4336434711095810371">ניקוי כל הנתונים</translation> +<translation id="4340125850502689798">שם משתמש לא תקין</translation> <translation id="4340515029017875942"><ph name="ORIGIN" /> רוצה לתקשר עם האפליקציה "<ph name="EXTENSION_NAME" />"</translation> <translation id="4340575312453649552">המודעה הזו צרכה משאבים רבים מדי מהמכשיר שלך, ולכן היא הוסרה על-ידי Chrome.</translation> <translation id="4341577178275615435">כדי להפעיל או להשבית את הגלישה באמצעות סמן הטקסט, אפשר להשתמש במקש הקיצור F7</translation> @@ -3581,6 +3589,7 @@ <translation id="5057110919553308744">בלחיצה על התוסף</translation> <translation id="5057403786441168405">ניהול החשבונות שנכנסת אליהם. אתרים, אפליקציות ותוספים ב-Chrome וב-Google Play עשויים להשתמש בחשבונות האלה כדי להתאים אישית את החוויה שלך, בהתאם להרשאות. <ph name="LINK_BEGIN" />מידע נוסף<ph name="LINK_END" /></translation> <translation id="5059241099014281248">הגבלת הכניסה</translation> +<translation id="5059526285558225588">בחירת הפרטים לשיתוף</translation> <translation id="5060332552815861872">יש מדפסת אחת זמינה לשמירה.</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{תיקייה זו מכילה סימנייה. ברצונך באמת למחוק אותה?}two{תיקייה זו מכילה שתי סימניות. ברצונך באמת למחוק אותה?}many{תיקייה זו מכילה # סימניות. ברצונך באמת למחוק אותה?}other{תיקייה זו מכילה # סימניות. ברצונך באמת למחוק אותה?}}</translation> <translation id="5062930723426326933">הכניסה לחשבון נכשלה. צריך להתחבר לאינטרנט ולנסות שוב.</translation> @@ -3697,6 +3706,7 @@ <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">זיכרונות אהובים מתעוררים לחיים. כדי להוסיף או לערוך אלבומים, יש לעבור ל<ph name="LINK_BEGIN" />תמונות Google<ph name="LINK_END" />.</translation> <translation id="5190926251776387065">הפעלת היציאה</translation> +<translation id="5191094172448199359">קודי האימות שהזנת לא תואמים.</translation> <translation id="5191251636205085390">מידע על טכנולוגיות חדשות שמיועדות להחליף קובצי cookie של צד שלישי והוראות לשליטה בהן.</translation> <translation id="51918995459521422"><ph name="ORIGIN" /> רוצה להוריד מספר קבצים</translation> <translation id="5192062846343383368">כדי לראות את הגדרות הפיקוח יש לפתוח את האפליקציה Family Link</translation> @@ -3709,6 +3719,7 @@ <translation id="5204673965307125349">אפשר לבצע Powerwash במכשיר ולנסות שוב.</translation> <translation id="5204967432542742771">הזנת סיסמה</translation> <translation id="5205484256512407285">אף פעם אין להשתמש בנתונים סלולריים להעברה</translation> +<translation id="520568280985468584">הרשת נוספה בהצלחה. ייתכן שיחלפו מספר דקות עד שהרשת הסלולרית תהיה פעילה.</translation> <translation id="5206215183583316675">האם למחוק את "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="520621735928254154">שגיאה בייבוא האישור</translation> <translation id="5206787458656075734">{COUNT,plural, =1{הסיסמה שנחשפה הוחלפה בהצלחה. נותרה עוד סיסמה אחת שנחשפה. ההמלצה של Chrome היא לבדוק את הסיסמה הזו עכשיו.}two{הסיסמה שנחשפה הוחלפה בהצלחה. נותרו עוד # סיסמאות שנחשפו. ההמלצה של Chrome היא לבדוק את הסיסמאות האלה עכשיו.}many{הסיסמה שנחשפה הוחלפה בהצלחה. נותרו עוד # סיסמאות שנחשפו. ההמלצה של Chrome היא לבדוק את הסיסמאות האלה עכשיו.}other{הסיסמה שנחשפה הוחלפה בהצלחה. נותרו עוד # סיסמאות שנחשפו. ההמלצה של Chrome היא לבדוק את הסיסמאות האלה עכשיו.}}</translation> @@ -4343,6 +4354,7 @@ <translation id="5935656526031444304">ניהול גלישה בטוחה</translation> <translation id="5938002010494270685">יש שדרוג אבטחה זמין</translation> <translation id="5939518447894949180">איפוס</translation> +<translation id="5939719276406088041">לא ניתן ליצור קיצור דרך</translation> <translation id="5941153596444580863">הוספת משתמש...</translation> <translation id="5941343993301164315">כניסה ל-<ph name="TOKEN_NAME" />.</translation> <translation id="5941711191222866238">מזעור</translation> @@ -4430,6 +4442,7 @@ <translation id="6043994281159824495">יציאה עכשיו</translation> <translation id="6044805581023976844"><ph name="APP_NAME" /> משתף כרטיסייה ואודיו של Chrome עם <ph name="TAB_NAME" />.</translation> <translation id="6045114302329202345">לחצן TrackPoint ראשי</translation> +<translation id="6047632800149092791">הסנכרון לא פועל. יש לנסות לצאת ולהיכנס שוב.</translation> <translation id="6049004884579590341">יש ללחוץ לחיצה ארוכה על |<ph name="ACCELERATOR" />| כדי לצאת ממסך מלא</translation> <translation id="6051354611314852653">אופס! המערכת לא הצליחה לאמת את הגישה של מכשיר זה לממשק ה-API.</translation> <translation id="6052976518993719690">רשות אישורי SSL </translation> @@ -4522,6 +4535,7 @@ <translation id="6143186082490678276">קבלת עזרה</translation> <translation id="6143366292569327983">בחירת שפת הדף שתתורגם</translation> <translation id="6144938890088808325">רוצה לעזור לנו לשפר את מחשבי Chromebook?</translation> +<translation id="6146409560350811147">הסנכרון לא פועל. יש לנסות להיכנס שוב.</translation> <translation id="6147020289383635445">התצוגה המקדימה של ההדפסה נכשלה.</translation> <translation id="6148576794665275391">פתיחה עכשיו</translation> <translation id="6149015141270619212">לא ניתן להתחבר לאינטרנט</translation> @@ -4589,6 +4603,7 @@ <translation id="6232017090690406397">סוללה</translation> <translation id="6232116551750539448">החיבור אל <ph name="NAME" /> נותק</translation> <translation id="6233154960150021497">שימוש בקול במקום במקלדת כברירת מחדל</translation> +<translation id="6234108445915742946">התנאים וההגבלות של Chrome ישתנו ב-31 במרץ</translation> <translation id="6234474535228214774">ההתקנה בהמתנה</translation> <translation id="6237474966939441970">אפליקציה לכתיבת הערות בעזרת סטיילוס</translation> <translation id="6237816943013845465">הגדרה זו מאפשרת לך לקבוע את רזולוציית המסך</translation> @@ -4888,6 +4903,7 @@ <translation id="656293578423618167">הנתיב או שם הקובץ ארוך מדי. יש לשמור אותו בשם קצר יותר או במיקום אחר.</translation> <translation id="6563469144985748109">המנהל שלך עדיין לא אישר זאת</translation> <translation id="6569934958368283244">אנשים אחרים</translation> +<translation id="6573497332121198392">לא ניתן להסיר את קיצור הדרך</translation> <translation id="657402800789773160">&טעינת דף זה מחדש</translation> <translation id="6577284282025554716">ההורדה בוטלה: <ph name="FILE_NAME" /></translation> <translation id="657866106756413002">תמונת מצב של תקינות הרשת</translation> @@ -4895,6 +4911,7 @@ <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> - תוכן שולחן העבודה משותף</translation> <translation id="6580203076670148210">מהירות הסריקה</translation> <translation id="6582080224869403177">יש לאתחל את <ph name="DEVICE_TYPE" /> כדי לשדרג את האבטחה.</translation> +<translation id="6582274660680936615">גלישה כאורח</translation> <translation id="6584878029876017575">חתימה לכל החיים של Microsoft</translation> <translation id="6586099239452884121">גלישה כאורח</translation> <translation id="6586451623538375658">החלפת לחצן העכבר העיקרי</translation> @@ -5064,6 +5081,7 @@ <translation id="6782468519961184511">מנהל המערכת לא מאפשר לך להוסיף חשבונות Google</translation> <translation id="6785518634832172390">קוד האימות לא יכול לכלול יותר מ-12 תווים</translation> <translation id="6786747875388722282">תוספים</translation> +<translation id="6787097042755590313">כרטיסייה אחרת</translation> <translation id="6787839852456839824">מקשי קיצור</translation> <translation id="6788210894632713004">תוסף Unpacked</translation> <translation id="6789592661892473991">פיצול אופקי</translation> @@ -5074,6 +5092,7 @@ <translation id="6793723358811598107">'<ph name="CURRENTKEY" />' כבר מוקצה לפעולה '<ph name="ACTION" />'. יש להקיש על מקש כלשהו כדי לצאת.</translation> <translation id="6795884519221689054">פנדה</translation> <translation id="6797493596609571643">אופס. משהו השתבש.</translation> +<translation id="6798420440063423019">מפתח האבטחה נעול כי הזנת קוד אימות שגוי יותר מדי פעמים. צריך לאפס את מפתח האבטחה.</translation> <translation id="6798578729981748444">סגירת כל החלונות של Firefox תשלים את פעולת הייבוא.</translation> <translation id="6798780071646309401">caps lock מופעל</translation> <translation id="6798954102094737107">פלאגין: <ph name="PLUGIN_NAME" /></translation> @@ -5419,6 +5438,7 @@ <translation id="7180865173735832675">התאמה אישית</translation> <translation id="7182791023900310535">העברת הסיסמה שלך</translation> <translation id="7186088072322679094">השארה בסרגל הכלים</translation> +<translation id="7186303001964993981">ל-<ph name="ORIGIN" /> אין הרשאה לפתוח את התיקייה הזו כי היא מכילה קובצי מערכת</translation> <translation id="7187428571767585875">ערכים בקובץ הרישום שיש להסיר או לשנות:</translation> <translation id="7187855807420906517">לאחר יציאה או מעבר למצב אופליין, אתרים ממשיכים בדרך כלל בסנכרון כדי להשלים משימות, כמו העלאת תמונות או שליחת הודעות צ'אט</translation> <translation id="7189234443051076392">צריך לוודא שיש מספיק מקום פנוי במכשיר</translation> @@ -6038,6 +6058,7 @@ <translation id="7871109039747854576">מעבר בין העמודים של רשימת התווים האפשריים באמצעות המקש <ph name="COMMA" /> והמקש <ph name="PERIOD" /></translation> <translation id="787268756490971083">כבוי</translation> <translation id="7874257161694977650">רקעים של Chrome</translation> +<translation id="7876027585589532670">לא ניתן לערוך את קיצור הדרך</translation> <translation id="7877451762676714207">שגיאת שרת לא ידועה. יש לנסות שוב או לפנות למנהל השרת.</translation> <translation id="7879631849810108578">קיצור הדרך הוגדר: <ph name="IDS_SHORT_SET_COMMAND" /></translation> <translation id="7880823633812189969">הנתונים המקומיים יימחקו אחרי הפעלה מחדש</translation> @@ -6326,6 +6347,7 @@ <translation id="8189750580333936930">ארגז חול של הגדרות פרטיות</translation> <translation id="8190193592390505034">מתבצע חיבור אל <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">לנהל את היישומים, התוספים והעיצובים שלך</translation> +<translation id="8192944472786724289">האפליקציה <ph name="APP_NAME" /> מבקשת הרשאה לשתף את המסך שלך.</translation> <translation id="8195027750202970175">גודל בדיסק</translation> <translation id="8198323535106903877"><ph name="NUMBER_OF_APPS" /> האפליקציות יותקנו</translation> <translation id="8199300056570174101">מאפייני רשת (שירות) ומכשיר</translation> @@ -6977,6 +6999,7 @@ <translation id="8931475688782629595">ניהול הסנכרון</translation> <translation id="8932654652795262306">הפרטים של שיתוף האינטרנט המיידי בין מכשירים</translation> <translation id="8932894639908691771">אפשרויות גישה באמצעות מתג</translation> +<translation id="893298445929867520">עגלות הקניות הוסתרו. הן יופיעו מחדש לאחר ביצוע שינויים.</translation> <translation id="8933960630081805351">ה&צגה ב-Finder</translation> <translation id="8934732568177537184">המשך</translation> <translation id="8938306522009698937">רכיבי handler</translation> @@ -7253,6 +7276,7 @@ <translation id="942532530371314860"><ph name="APP_NAME" /> משתף כרטיסייה ואודיו של Chrome.</translation> <translation id="945522503751344254"> שליחת משוב</translation> <translation id="947329552760389097">&בדיקת רכיבים</translation> +<translation id="947667444780368238">ל-<ph name="ORIGIN" /> אין הרשאה לפתוח קבצים בתיקייה הזו כי היא מכילה קובצי מערכת</translation> <translation id="951991426597076286">דחייה</translation> <translation id="956500788634395331">המערכת מגינה עליך מפני תוספים שעשויים להיות מזיקים</translation> <translation id="957960681186851048">האתר הזה ניסה להוריד קבצים מרובים באופן אוטומטי</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb index e85a5fa..337a160 100644 --- a/chrome/app/resources/generated_resources_kk.xtb +++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -572,6 +572,7 @@ <translation id="1627408615528139100">Жүктеп алынған</translation> <translation id="1628948239858170093">Файл ашылмас бұрын сканерленсін бе?</translation> <translation id="1629314197035607094">Құпия сөз мерзімі аяқталды.</translation> +<translation id="1629521517399325891">Желі аутентификациясы үшін пайдаланушы сертификаты қолжетімді емес.</translation> <translation id="163072119192489970">Дерек жіберуге және алуға рұқсаты барлар</translation> <translation id="1630768113285622200">Қайта қосу және жалғастыру</translation> <translation id="1632082166874334883">Google есептік жазбаңызда сақталған құпия сөз</translation> @@ -1176,6 +1177,7 @@ <translation id="2300383962156589922"><ph name="APP_NAME" /> қолданбасын реттеу және басқару</translation> <translation id="2301382460326681002">Кеңейтімнің түбір каталогы жарамсыз.</translation> <translation id="23030561267973084">"<ph name="EXTENSION_NAME" />" қосымша рұқсат сұрады.</translation> +<translation id="230529452743010958">Бұл осыған дейін Google қызметтерін пайдалануыңыз негізінде көрсетілді. Деректерді <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> бетінде көре және жоя аласыз, сондай-ақ мұнда параметрлерді өзгерте аласыз.</translation> <translation id="23055578400314116">Пайдаланушы атын таңдаңыз.</translation> <translation id="2307462900900812319">Желіні реттеу</translation> <translation id="230927227160767054">Бұл бет қызмет өңдегішін орнатпақ.</translation> @@ -1402,6 +1404,7 @@ <translation id="2541706104884128042">Жаңа ұйықтау уақыты орнатылды.</translation> <translation id="2542050502251273923">ff_debug арқылы желі байланысы менеджерін және басқа да қызметтердің түзету деңгейін орнатады.</translation> <translation id="2544292303401268586">Әкімшіңіз қолданбаларды жаңарту үшін құрылғыны өшіріп қосуды сұрады. Ол бірнеше минутқа созылуы мүмкін.</translation> +<translation id="2544352060595557290">Осы қойынды</translation> <translation id="2544853746127077729">Желі аутентификация сертификатын қабылдамады</translation> <translation id="2546283357679194313">Cookie файлдары және торап деректері</translation> <translation id="2548347166720081527"><ph name="PERMISSION" /> пайдалануға рұқсат берілді.</translation> @@ -1567,6 +1570,7 @@ <translation id="2734760316755174687"><ph name="SITE_GROUP_NAME" /> тобына жататын сайттар да бастапқы күйіне қайтарылады.</translation> <translation id="2735712963799620190">Кесте</translation> <translation id="2737363922397526254">Жию…</translation> +<translation id="2737916598897808047"><ph name="APP_NAME" /> қолданбасы экраныңыздағы мазмұнды <ph name="TARGET_NAME" /> сайтымен бөліскісі келеді.</translation> <translation id="2738771556149464852">Кейін емес</translation> <translation id="2739191690716947896">Түзету</translation> <translation id="2739240477418971307">Арнайы мүмкіндіктер параметрлерін өзгерту</translation> @@ -2395,6 +2399,7 @@ <translation id="3677911431265050325">Сайттың мобильдік нұсқасын сұрау</translation> <translation id="3677959414150797585">Оған қолданбалар, веб-беттер және тағы басқалар жатады. Пайдаланылуы туралы деректерді бөлісуді таңдасаңыз, ұсыныстарды жақсарту үшін статистиканы жібереді.</translation> <translation id="3678156199662914018">Кеңейтім: <ph name="EXTENSION_NAME" /></translation> +<translation id="3678188444105291936">Сіз осы терезеде қарайтын беттер браузерді қолдану тарихында көрсетілмейді және есептік жазбаңыздан шыққаннан кейін, олар компьютерде cookie файлдары сияқты іздер қалдырмайды. Сіз жүктеп алған файлдар және жасаған бетбелгілер сақталмайды.</translation> <translation id="3680683624079082902">Мәтінді дыбыстау дауысы</translation> <translation id="3681311097828166361">Пікіріңіз үшін рақмет. Қазір желіге қосылмағансыз, есебіңіз кейінірек жіберіледі.</translation> <translation id="3682824389861648626">Қозғалыс шегі</translation> @@ -2596,6 +2601,7 @@ <translation id="3884152383786131369">Бірнеше тілдегі веб-мазмұн осы тізімдегі бірінші тілді пайдаланады. Бұл параметрлер браузер параметрлерімен синхрондалады. <ph name="BEGIN_LINK_LEARN_MORE" />Толығырақ<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3886446263141354045">Бұл сайтқа кіру сұрауыңыз <ph name="NAME" /> деген контактіге жіберілді</translation> <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" /> қолданбасымен жазбалар жазу</translation> +<translation id="3888586133700543064">Бұл ақпарат Assistant ақауын жақсырақ түсінуімізге көмектеседі. Ол 90 күнге дейін сақталады және тиісті инженерлер мен кері байланыс ұжымына ғана қолжетімді болады.</translation> <translation id="3890064827463908288">Wi-Fi деректерін синхрондау үшін Chrome Sync функциясын қосыңыз.</translation> <translation id="3892414795099177503">OpenVPN / L2TP енгізу…</translation> <translation id="3893536212201235195">Арнайы мүмкіндіктер параметрлерін оқу және өзгерту</translation> @@ -2627,6 +2633,7 @@ <translation id="3916445069167113093">Файлдың бұл түрі компьютеріңізге зиян келтіруі мүмкін. Бәрібір <ph name="FILE_NAME" /> сақтауды қалайсыз ба?</translation> <translation id="3918972485393593704">Толық мәліметтерді Google қызметіне беріңіз</translation> <translation id="3919145445993746351">Барлық компьютерде кеңейтімдер орнатылуы үшін, синхрондауды іске қосыңыз.</translation> +<translation id="3919798653937160644">Сіз осы терезеде қарайтын беттер браузерді қолдану тарихында көрсетілмейді және ашық Қонақ терезелерінің барлығын жапқаннан кейін, олар компьютерде cookie файлдары сияқты іздер қалдырмайды. Дегенмен сіз жүктеген файлдардың барлығы сақталады.</translation> <translation id="3920504717067627103">Сертификат саясаттары</translation> <translation id="392089482157167418">ChromeVox құралын (дыбысты көмек) қосу</translation> <translation id="3920909973552939961">Төлем өңдегіштерін орнатуға рұқсаты жоқтар</translation> @@ -2964,6 +2971,7 @@ <translation id="4332976768901252016">Ата-ана бақылауын реттеу</translation> <translation id="4333854382783149454">RSA шифрлауына ие PKCS #1 SHA-1</translation> <translation id="4336434711095810371">Барлық деректерді өшіру</translation> +<translation id="4340125850502689798">Пайдаланушы аты дұрыс емес.</translation> <translation id="4340515029017875942"><ph name="ORIGIN" /> "<ph name="EXTENSION_NAME" />" қолданбасымен байланысуға рұқсат сұрап тұр</translation> <translation id="4340575312453649552">Бұл жарнама құрылғыңыздың тым көп ресурсын пайдаланғандықтан, Chrome оны өшірді.</translation> <translation id="4341577178275615435">Перне арқылы қозғалу функциясын қосу немесе өшіру үшін F7 пернесін пайдаланыңыз.</translation> @@ -3578,6 +3586,7 @@ <translation id="5057110919553308744">Кеңейтім басылғанда</translation> <translation id="5057403786441168405">Кірген есептік жазбаларды басқарыңыз. Рұқсаттарыңызға байланысты мүмкіндігіңізді реттеу үшін веб-сайттар, қолданбалар, Chrome және Google Play кеңейтімдері осы есептік жазбаларды пайдалануы мүмкін. <ph name="LINK_BEGIN" />Толығырақ<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Кіруді шектеу</translation> +<translation id="5059526285558225588">Бөлісілетін мазмұнды таңдаңыз</translation> <translation id="5060332552815861872">1 принтерді сақтауға болады.</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{Бұл қалтада бетбелгі бар. Оны шынымен жойғыңыз келе ме?}other{Бұл қалтада # бетбелгі бар. Оны шынымен жойғыңыз келе ме?}}</translation> <translation id="5062930723426326933">Кіру сәтсіз аяқталды, интернетке қосылып, әрекетті қайталаңыз.</translation> @@ -3694,6 +3703,7 @@ <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">Өміріңіздегі ерекше сәттерді қайта өткеріңіз. Альбомдарды қосу немесе өзгерту үшін <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" /> қызметіне өтіңіз.</translation> <translation id="5190926251776387065">Портты іске қосу</translation> +<translation id="5191094172448199359">Енгізген PIN кодтарыңыз сәйкес келмейді.</translation> <translation id="5191251636205085390">Үшінші тарап cookie файлдарын ауыстыруға арналған жаңа технологиялар туралы ақпарат алыңыз және оларды басқарыңыз.</translation> <translation id="51918995459521422"><ph name="ORIGIN" /> бірнеше файл жүктеп алғысы келеді</translation> <translation id="5192062846343383368">Қадағалау параметрлерін көру үшін Family Link қолданбасын ашыңыз.</translation> @@ -3706,6 +3716,7 @@ <translation id="5204673965307125349">Құрылғыға Powerwash қолданып, қайталап көріңіз.</translation> <translation id="5204967432542742771">Құпия сөз енгізу</translation> <translation id="5205484256512407285">Тасымалдау үшін ешқашан мобильдік интернетті пайдаланбау</translation> +<translation id="520568280985468584">Желі қосылды. Ұялы желі белсенді болуы үшін бірнеше минут керек.</translation> <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />" сертификатын жою керек пе?</translation> <translation id="520621735928254154">Сертификатты импорттау қатесі</translation> <translation id="5206787458656075734">{COUNT,plural, =1{Ұрланған құпия сөз өзгертілді. Тағы # құпия сөзіңіз ұрланған. Chrome осы құпия сөзді қазір тексеруге кеңес береді.}other{Ұрланған құпия сөз өзгертілді. Тағы # құпия сөзіңіз ұрланған. Chrome осы құпия сөздерді қазір тексеруге кеңес береді.}}</translation> @@ -4340,6 +4351,7 @@ <translation id="5935656526031444304">"Қауіпсіз шолу" функциясын басқару</translation> <translation id="5938002010494270685">Қауіпсіздік бойынша жаңартылған нұсқа бар</translation> <translation id="5939518447894949180">Қалпына келтіру</translation> +<translation id="5939719276406088041">Таңбаша жасау мүмкін емес.</translation> <translation id="5941153596444580863">Адам қосу…</translation> <translation id="5941343993301164315"><ph name="TOKEN_NAME" /> жүйесіне кіріңіз.</translation> <translation id="5941711191222866238">Жию</translation> @@ -4427,6 +4439,7 @@ <translation id="6043994281159824495">Қазір шығу</translation> <translation id="6044805581023976844"><ph name="APP_NAME" /> қолданбасы <ph name="TAB_NAME" /> сайтымен Chrome қойындысын және аудионы бөлісуде.</translation> <translation id="6045114302329202345">Негізгі TrackPoint түймесі</translation> +<translation id="6047632800149092791">Синхрондалмай жатыр. Шығып, қайта кіріп көріңіз.</translation> <translation id="6049004884579590341">Толық экраннан шығу үшін |<ph name="ACCELERATOR" />| түймесін басып тұрыңыз</translation> <translation id="6051354611314852653">Жүйенің API осы құрылғыға кіру құқығын авторизациялауы сәтсіз аяқталды.</translation> <translation id="6052976518993719690">SSL сертификат беру органы</translation> @@ -4519,6 +4532,7 @@ <translation id="6143186082490678276">Анықтама алу</translation> <translation id="6143366292569327983">Аудару керек бет тілін таңдаңыз</translation> <translation id="6144938890088808325">Chromebooks құрылғыларын жақсартуға көмектесіңіз</translation> +<translation id="6146409560350811147">Синхрондалмай жатыр. Қайта кіріп көріңіз.</translation> <translation id="6147020289383635445">Басып шығаруды алдын ала көру сәтсіз аяқталды.</translation> <translation id="6148576794665275391">Қазір ашық</translation> <translation id="6149015141270619212">Интернетке қосылу мүмкін емес</translation> @@ -4586,6 +4600,7 @@ <translation id="6232017090690406397">Батарея</translation> <translation id="6232116551750539448"><ph name="NAME" /> байланысы үзілді</translation> <translation id="6233154960150021497">Пернетақтаның орнына дауыс пәрмендерін әдепкі етіп пайдалану</translation> +<translation id="6234108445915742946">Chrome-ның Қызмет көрсету шарттары 31 наурыздан бастап өзгереді</translation> <translation id="6234474535228214774">Орнату процесі кезекте тұр</translation> <translation id="6237474966939441970">Стилуспен жазба жазу қолданбасы</translation> <translation id="6237816943013845465">Экран ажыратымдылығын реттеуге мүмкіндік береді</translation> @@ -4885,6 +4900,7 @@ <translation id="656293578423618167">Файл жолы немесе атауы тым ұзын. Қысқа атаумен немесе басқа орынға сақтаңыз.</translation> <translation id="6563469144985748109">Менеджеріңіз әлі мақұлдаған жоқ</translation> <translation id="6569934958368283244">Басқа адамдар</translation> +<translation id="6573497332121198392">Таңбашаны өшіру мүмкін емес.</translation> <translation id="657402800789773160">&Бұл бетті қайта жүктеу</translation> <translation id="6577284282025554716">Жүктеп алудан бас тартылды: <ph name="FILE_NAME" /></translation> <translation id="657866106756413002">Network Health Snapshot</translation> @@ -4892,6 +4908,7 @@ <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> – жұмыс үстелі мазмұны бөлісілді</translation> <translation id="6580203076670148210">Сканерлеу жылдамдығы</translation> <translation id="6582080224869403177">Қауіпсіздікті жаңарту үшін <ph name="DEVICE_TYPE" /> құрылғысын бастапқы күйге қайтарыңыз.</translation> +<translation id="6582274660680936615">Интернетті Қонақ ретінде пайдаланудасыз</translation> <translation id="6584878029876017575">Microsoft Lifetime Signing</translation> <translation id="6586099239452884121">Қонақ режимі</translation> <translation id="6586451623538375658">Негізгі тінтуір түймесін ауыстыру</translation> @@ -5061,6 +5078,7 @@ <translation id="6782468519961184511">Әкімшіңіз қосымша Google есептік жазбаларын пайдалануға рұқсат бермейді.</translation> <translation id="6785518634832172390">PIN коды 12 саннан аспауы керек</translation> <translation id="6786747875388722282">Кеңейтімдер</translation> +<translation id="6787097042755590313">Басқа қойынды</translation> <translation id="6787839852456839824">Пернелер тіркесімі</translation> <translation id="6788210894632713004">Пакеттен шығарылған кеңейтім</translation> <translation id="6789592661892473991">Көлденеңінен бөлу</translation> @@ -5071,6 +5089,7 @@ <translation id="6793723358811598107">"<ph name="ACTION" />" әрекетіне "<ph name="CURRENTKEY" />" пернесі әлдеқашан тағайындалған. Шығу үшін кез келген пернені басыңыз.</translation> <translation id="6795884519221689054">Панда</translation> <translation id="6797493596609571643">Бір нәрсе дұрыс емес.</translation> +<translation id="6798420440063423019">PIN коды бірнеше рет қате енгізілгендіктен, қауіпсіздік кілті құлыпталды. Қауіпсіздік кілтін бастапқы күйге қайтаруыңыз қажет.</translation> <translation id="6798578729981748444">Импорттауды аяқтау үшін барлық Firefox терезелерін жабыңыз.</translation> <translation id="6798780071646309401">Caps Lock қосулы</translation> <translation id="6798954102094737107">Плагин: <ph name="PLUGIN_NAME" /></translation> @@ -5416,6 +5435,7 @@ <translation id="7180865173735832675">Реттеу</translation> <translation id="7182791023900310535">Құпия сөзді көшіру</translation> <translation id="7186088072322679094">Құралдар тақтасында сақтау</translation> +<translation id="7186303001964993981">Бұл қалтада жүйелік файлдар болғандықтан, <ph name="ORIGIN" /> оны аша алмайды.</translation> <translation id="7187428571767585875">Жойылатын немесе өзгертілетін тіркелу жазбалары:</translation> <translation id="7187855807420906517">Сайттан шығып кеткен соң немесе интернетті өшіргеннен кейін, сайттар фотосуреттерді жүктеп салу немесе чат хабарын жіберу сияқты тапсырмаларды аяқтау үшін синхронизация жасай береді.</translation> <translation id="7189234443051076392">Құрылғыңызда бос жад орны жеткілікті екенін тексеріңіз</translation> @@ -6036,6 +6056,7 @@ <translation id="7871109039747854576">Нұсқалар тізімін қарап шығу үшін "<ph name="COMMA" />" және "<ph name="PERIOD" />" пернелерін пайдалану</translation> <translation id="787268756490971083">Өшірулі</translation> <translation id="7874257161694977650">Chrome фондары</translation> +<translation id="7876027585589532670">Таңбашаны өзгерту мүмкін емес.</translation> <translation id="7877451762676714207">Белгісіз сервер қатесі. Әрекетті қайталап көріңіз немесе сервер әкімшісіне хабарласыңыз.</translation> <translation id="7879631849810108578">Пернелер тіркесімі орнатылды: <ph name="IDS_SHORT_SET_COMMAND" /></translation> <translation id="7880823633812189969">Іске қосылған кезде, жергілікті деректер жойылады</translation> @@ -6321,6 +6342,7 @@ <translation id="8189750580333936930">Privacy Sandbox</translation> <translation id="8190193592390505034"><ph name="PROVIDER_NAME" /> провайдеріне қосылу</translation> <translation id="8191230140820435481">Қолданбаларыңызды, кеңейтімдеріңізді және тақырыптарыңызды басқару</translation> +<translation id="8192944472786724289"><ph name="APP_NAME" /> қолданбасы экраныңыздағы мазмұнды бөліскісі келеді.</translation> <translation id="8195027750202970175">Дискідегі көлемі</translation> <translation id="8198323535106903877">Біз <ph name="NUMBER_OF_APPS" /> қолданбаны өзіміз орнатып береміз</translation> <translation id="8199300056570174101">Желі (қызмет) және құрылғы сипаттары</translation> @@ -6970,6 +6992,7 @@ <translation id="8931475688782629595">Синхрондауға арналған деректерді басқару</translation> <translation id="8932654652795262306">Жылдам тетеринг мәліметтері</translation> <translation id="8932894639908691771">Switch Access опциялары</translation> +<translation id="893298445929867520">Себеттер жасырылды. Сіз өзгеріс енгізгенде, олар қайта пайда болады.</translation> <translation id="8933960630081805351">&Іздеу жүйесінде көрсету</translation> <translation id="8934732568177537184">Жалғастыру</translation> <translation id="8938306522009698937">өңдегіштер</translation> @@ -7246,6 +7269,7 @@ <translation id="942532530371314860"><ph name="APP_NAME" /> қолданбасы Chrome қойындысын және аудионы бөлісуде.</translation> <translation id="945522503751344254">Пікір жіберу</translation> <translation id="947329552760389097">&Элементтерді тексеру</translation> +<translation id="947667444780368238">Бұл қалтада жүйелік файлдар болғандықтан, <ph name="ORIGIN" /> ондағы файлдарды аша алмайды.</translation> <translation id="951991426597076286">Қабылдамау</translation> <translation id="956500788634395331">Сіз зиянды кеңейтімдерден қорғалғансыз.</translation> <translation id="957960681186851048">Бұл сайт бірнеше файлды автоматты түрде жүктеп алғысы келді</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index 032ca61a..e13a69f 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -577,6 +577,7 @@ <translation id="1627408615528139100">ಈಗಾಗಲೇ ಡೌನ್ಲೋಡ್ ಮಾಡಲಾಗಿದೆ</translation> <translation id="1628948239858170093">ಫೈಲ್ ತೆರೆಯುವ ಮೊದಲು ಸ್ಕ್ಯಾನ್ ಮಾಡಿ?</translation> <translation id="1629314197035607094">ಪಾಸ್ವರ್ಡ್ ಅವಧಿ ಮೀರಿದೆ</translation> +<translation id="1629521517399325891">ನೆಟ್ವರ್ಕ್ ದೃಢೀಕರಣಕ್ಕಾಗಿ ಬಳಕೆದಾರ ಪ್ರಮಾಣಪತ್ರ ಲಭ್ಯವಿಲ್ಲ.</translation> <translation id="163072119192489970">ಡೇಟಾವನ್ನು ಕಳುಹಿಸುವುದು ಮತ್ತು ಸ್ವೀಕರಿಸುವುದನ್ನು ಮುಗಿಸಲು ಈ ಸೈಟ್ಗಳಿಗೆ ಅನುಮತಿಸಲಾಗಿದೆ</translation> <translation id="1630768113285622200">ಮರುಪ್ರಾರಂಭಿಸಿ ಮತ್ತು ಮುಂದುವರಿಸಿ</translation> <translation id="1632082166874334883">ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾಗಿರುತ್ತದೆ</translation> @@ -1181,6 +1182,7 @@ <translation id="2300383962156589922"><ph name="APP_NAME" /> ಅನ್ನು ಕಸ್ಟಮೈಸ್ ಮಾಡಿ ಮತ್ತು ನಿಯಂತ್ರಿಸಿ</translation> <translation id="2301382460326681002">ವಿಸ್ತರಣೆ ಮೂಲ ಡೈರೆಕ್ಟರಿ ಅಮಾನ್ಯವಾಗಿದೆ.</translation> <translation id="23030561267973084">"<ph name="EXTENSION_NAME" />" ಹೆಚ್ಚುವರಿ ಅನುಮತಿಗಳನ್ನು ವಿನಂತಿಸಿದ್ದಾರೆ.</translation> +<translation id="230529452743010958">Google ಸೇವೆಗಳನ್ನು ಬಳಸಿಕೊಂಡು ನಿಮ್ಮ ಹಿಂದಿನ ಚಟುವಟಿಕೆಯ ಆಧಾರದ ಮೇಲೆ ನೀವು ಈ ಐಟಂ ಅನ್ನು ವೀಕ್ಷಿಸುತ್ತಿದ್ದೀರಿ. ನೀವು <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> ನಲ್ಲಿ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ವೀಕ್ಷಿಸಬಹುದು, ಅದನ್ನು ಅಳಿಸಬಹುದು ಮತ್ತು ನಿಮ್ಮ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಬದಲಾಯಿಸಬಹುದು.</translation> <translation id="23055578400314116">ಬಳಕೆದಾರರ ಹೆಸರನ್ನು ಆಯ್ಕೆಮಾಡಿ</translation> <translation id="2307462900900812319">ನೆಟ್ವರ್ಕ್ ಕಾನ್ಫಿಗರ್ ಮಾಡು</translation> <translation id="230927227160767054">ಸೇವೆ ಹ್ಯಾಂಡ್ಲರ್ ಅನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ಈ ಪುಟವು ಬಯಸುತ್ತದೆ.</translation> @@ -1406,6 +1408,7 @@ <translation id="2541706104884128042">ಹೊಸ ಮಲಗುವ ಸಮಯವನ್ನು ಹೊಂದಿಸಲಾಗಿದೆ</translation> <translation id="2542050502251273923">Ff_debug ಬಳಸಿ ನೆಟ್ವರ್ಕ್ ಕನೆಕ್ಷನ್ ನಿರ್ವಾಹಕ ಮತ್ತು ಇತರ ಸೇವೆಗಳ ಡೀಬಗ್ ಮಾಡುವಿಕೆ ಹಂತವನ್ನು ಹೊಂದಿಸುತ್ತದೆ.</translation> <translation id="2544292303401268586">ಆ್ಯಪ್ಗಳನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡುವುದಕ್ಕೆ ನಿಮ್ಮ ಸಾಧನವನ್ನು ಮರುಪ್ರಾರಂಭಿಸಲು ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ವಿನಂತಿಸಿದ್ದಾರೆ. ಇದು ಪೂರ್ಣಗೊಳ್ಳಲು ಹಲವು ನಿಮಿಷಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳಬಹುದು</translation> +<translation id="2544352060595557290">ಈ ಟ್ಯಾಬ್</translation> <translation id="2544853746127077729">ದೃಢೀಕರಣ ಪ್ರಮಾಣಪತ್ರವನ್ನು ನೆಟ್ವರ್ಕ್ನಿಂದ ತಿರಸ್ಕರಿಸಲಾಗಿದೆ</translation> <translation id="2546283357679194313">ಕುಕೀಗಳು ಮತ್ತು ಸೈಟ್ ಡೇಟಾ</translation> <translation id="2548347166720081527"><ph name="PERMISSION" /> ಅನುಮತಿಸಲಾಗಿದೆ</translation> @@ -1571,6 +1574,7 @@ <translation id="2734760316755174687"><ph name="SITE_GROUP_NAME" /> ಹೆಸರಿನಡಿಯಲ್ಲಿನ ಸೈಟ್ಗಳನ್ನು ಸಹ ಮರುಹೊಂದಿಸಲಾಗುತ್ತದೆ.</translation> <translation id="2735712963799620190">ವೇಳಾಪಟ್ಟಿ</translation> <translation id="2737363922397526254">ಕುಗ್ಗಿಸು...</translation> +<translation id="2737916598897808047">ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ನಲ್ಲಿರುವ ವಿಷಯಗಳನ್ನು <ph name="TARGET_NAME" /> ಜೊತೆಗೆ ಹಂಚಿಕೊಳ್ಳಲು <ph name="APP_NAME" /> ಬಯಸುತ್ತದೆ.</translation> <translation id="2738771556149464852">ನಂತರ ಅಲ್ಲ</translation> <translation id="2739191690716947896">ಡೀಬಗ್</translation> <translation id="2739240477418971307">ನಿಮ್ಮ ಪ್ರವೇಶಿಸುವಿಕೆ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಬದಲಾಯಿಸಿ</translation> @@ -2399,6 +2403,7 @@ <translation id="3677911431265050325">ಮೊಬೈಲ್ ಸೈಟ್ಗಾಗಿ ವಿನಂತಿಸಿ</translation> <translation id="3677959414150797585">ಆ್ಯಪ್ಗಳು, ವೆಬ್ಪುಟಗಳು ಮತ್ತು ಇತ್ಯಾದಿಯನ್ನು ಒಳಗೊಂಡಿದೆ. ಬಳಕೆಯ ಡೇಟಾವನ್ನು ಹಂಚಿಕೊಳ್ಳಲು ನೀವು ಆರಿಸಿದ್ದರೆ ಮಾತ್ರ ಸಲಹೆಗಳನ್ನು ಸುಧಾರಿಸಲು ಅಂಕಿಅಂಶಗಳನ್ನು ಕಳುಹಿಸುತ್ತದೆ.</translation> <translation id="3678156199662914018">ವಿಸ್ತರಣೆ: <ph name="EXTENSION_NAME" /></translation> +<translation id="3678188444105291936">ನೀವು ಈ ವಿಂಡೋದಲ್ಲಿ ವೀಕ್ಷಿಸುವ ಪುಟಗಳು ಬ್ರೌಸರ್ ಇತಿಹಾಸದಲ್ಲಿ ಗೋಚರಿಸುವುದಿಲ್ಲ ಮತ್ತು ನೀವು ಸೈನ್ ಔಟ್ ಮಾಡಿದ ನಂತರ, ಅವುಗಳು ಕುಕೀಗಳಂತಹ ಇತರ ಗುರುತುಗಳನ್ನು ಕಂಪ್ಯೂಟರ್ನಲ್ಲಿ ಉಳಿಯಲು ಬಿಡುವುದಿಲ್ಲ. ನೀವು ಡೌನ್ಲೋಡ್ ಮಾಡಿದ ಫೈಲ್ಗಳು ಮತ್ತು ನೀವು ರಚಿಸಿದ ಬುಕ್ಮಾರ್ಕ್ಗಳನ್ನು ರಕ್ಷಣೆ ಮಾಡಿ ಇಟ್ಟುಕೊಳ್ಳುವುದಿಲ್ಲ.</translation> <translation id="3680683624079082902">ಪಠ್ಯದಿಂದ ಧ್ವನಿಯ ಧ್ವನಿ</translation> <translation id="3681311097828166361">ನಿಮ್ಮ ಪ್ರತಿಕ್ರಿಯೆಗೆ ಧನ್ಯವಾದಗಳು. ನೀವು ಇದೀಗ ಆಫ್ಲೈನ್ನಲ್ಲಿರುವಿರಿ ಮತ್ತು ನಿಮ್ಮ ವರದಿಯನ್ನು ನಂತರ ಕಳುಹಿಸಲಾಗುತ್ತದೆ.</translation> <translation id="3682824389861648626">ಚಲನೆಯ ಮಿತಿ</translation> @@ -2600,6 +2605,7 @@ <translation id="3884152383786131369">ಹಲವು ಭಾಷೆಗಳಲ್ಲಿ ಲಭ್ಯವಿರುವ ವೆಬ್ ವಿಷಯವನ್ನು ಈ ಪಟ್ಟಿಯಿಂದ ಮೊದಲು ಬೆಂಬಲಿಸುವ ಭಾಷೆಯನ್ನು ಬಳಸುತ್ತವೆ. ಈ ಆದ್ಯತೆಗಳನ್ನು ನಿಮ್ಮ ಬ್ರೌಸರ್ ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಸಿಂಕ್ ಮಾಡಲಾಗುತ್ತದೆ. <ph name="BEGIN_LINK_LEARN_MORE" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3886446263141354045">ಈ ಸೈಟ್ಗೆ ಪ್ರವೇಶಿಸುವ ನಿಮ್ಮ ವಿನಂತಿಯನ್ನು <ph name="NAME" /> ಅವರಿಗೆ ಕಳುಹಿಸಲಾಗಿದೆ</translation> <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" /> ಮೂಲಕ ಟಿಪ್ಪಣಿಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳಲಾಗುತ್ತಿದೆ</translation> +<translation id="3888586133700543064">ನಿಮ್ಮ Assistant ಕುರಿತ ಸಮಸ್ಯೆಯನ್ನು ಇನ್ನಷ್ಟು ಚೆನ್ನಾಗಿ ಅರ್ಥಮಾಡಿಕೊಳ್ಳಲು, ಈ ಮಾಹಿತಿ ನಮಗೆ ಸಹಾಯ ಮಾಡುತ್ತದೆ. ಇದನ್ನು 90 ದಿನಗಳವರೆಗೆ ಸಂಗ್ರಹಣೆ ಮಾಡಲಾಗುತ್ತದೆ ಮತ್ತು ಸೂಕ್ತ ಇಂಜಿನಿಯರಿಂಗ್ ಹಾಗೂ ಪ್ರತಿಕ್ರಿಯೆ ತಂಡಗಳಿಗೆ ಮಾತ್ರ ಇದಕ್ಕೆ ಪ್ರವೇಶಿಸಲು ಅವಕಾಶ ನೀಡಲಾಗುತ್ತದೆ.</translation> <translation id="3890064827463908288">Wi-Fi ಸಿಂಕ್ ಅನ್ನು ಬಳಸಲು Chrome ಸಿಂಕ್ ಅನ್ನು ಆನ್ ಮಾಡಿ</translation> <translation id="3892414795099177503">OpenVPN / L2TP ಸೇರಿಸಿ...</translation> <translation id="3893536212201235195">ನಿಮ್ಮ ಪ್ರವೇಶಿಸುವಿಕೆ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಓದಿ ಮತ್ತು ಬದಲಾಯಿಸಿ</translation> @@ -2631,6 +2637,7 @@ <translation id="3916445069167113093">ಈ ಫೈಲ್ನ ಪ್ರಕಾರವು ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ಗೆ ಹಾನಿಯನ್ನುಂಟು ಮಾಡಬಹುದು. ನೀವು <ph name="FILE_NAME" /> ಅನ್ನು ಹೇಗಿದ್ದರೂ ಇರಿಸಲು ಬಯಸುವಿರಾ?</translation> <translation id="3918972485393593704">Google ಗೆ ವಿವರಗಳ ವರದಿ ನೀಡಿ</translation> <translation id="3919145445993746351">ನಿಮ್ಮ ಎಲ್ಲಾ ಕಂಪ್ಯೂಟರ್ಗಳಲ್ಲೂ ನಿಮ್ಮ ವಿಸ್ತರಣೆಗಳನ್ನು ಪಡೆಯಲು, ಸಿಂಕ್ ಅನ್ನು ಆನ್ ಮಾಡಿ</translation> +<translation id="3919798653937160644">ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ನಲ್ಲಿ ತೆರೆದಿರುವ ಎಲ್ಲ ಅತಿಥಿ ವಿಂಡೊಗಳನ್ನು ಮುಚ್ಚಿದ ನಂತರ ಈ ವಿಂಡೊದಲ್ಲಿ ನೀವು ವೀಕ್ಷಿಸುವ ಪುಟಗಳು ಬ್ರೌಸರ್ ಇತಿಹಾಸದಲ್ಲಿ ಗೋಚರಿಸುವುದಿಲ್ಲ ಮತ್ತು ಅವುಗಳು ಕುಕೀಗಳಂತಹ ಇತರ ಗುರುತುಗಳನ್ನು ಕಂಪ್ಯೂಟರ್ನಲ್ಲಿ ಉಳಿಯಲು ಬಿಡುವುದಿಲ್ಲ. ಆದರೂ, ನೀವು ಡೌನ್ಲೋಡ್ ಮಾಡಿದ ಯಾವುದೇ ಫೈಲ್ಗಳನ್ನು ರಕ್ಷಣೆ ಮಾಡಿ ಇಟ್ಟುಕೊಳ್ಳಲಾಗುತ್ತದೆ.</translation> <translation id="3920504717067627103">ಪ್ರಮಾಣಪತ್ರ ನೀತಿಗಳು</translation> <translation id="392089482157167418">ChromeVox ಸಕ್ರಿಯಗೊಳಿಸಿ (ಮಾತಿನ ಪ್ರತಿಕ್ರಿಯೆ)</translation> <translation id="3920909973552939961">ಪಾವತಿ ಹ್ಯಾಂಡ್ಲರ್ಗಳನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ಈ ಸೈಟ್ಗಳಿಗೆ ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ</translation> @@ -2968,6 +2975,7 @@ <translation id="4332976768901252016">ಪೋಷಕ ನಿಯಂತ್ರಣಗಳನ್ನು ಸೆಟಪ್ ಮಾಡಿ</translation> <translation id="4333854382783149454">RSA ಎನ್ಕ್ರಿಪ್ಶನ್ನೊಂದಿಗೆ PKCS #1 SHA-1</translation> <translation id="4336434711095810371">ಎಲ್ಲಾ ಡೇಟಾವನ್ನು ತೆರವುಗೊಳಿಸಿ</translation> +<translation id="4340125850502689798">ಮಾನ್ಯವಲ್ಲದ ಬಳಕೆದಾರರ ಹೆಸರು</translation> <translation id="4340515029017875942">"<ph name="EXTENSION_NAME" />" ಅಪ್ಲಿಕೇಶನ್ ನೊಂದಿಗೆ <ph name="ORIGIN" /> ಸಂಪರ್ಕಿಸಲು ಬಯಸುತ್ತದೆ</translation> <translation id="4340575312453649552">ಈ ಜಾಹೀರಾತು, ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ತೀರಾ ಹೆಚ್ಚು ಸಂಪನ್ಮೂಲಗಳನ್ನು ಬಳಸಿದೆ. ಆದ್ದರಿಂದ, Chrome ಇದನ್ನು ತೆಗೆದುಹಾಕಿದೆ.</translation> <translation id="4341577178275615435">ಕೆರೆಟ್ ಬ್ರೌಸಿಂಗ್ ಆನ್ ಅಥವಾ ಆಫ್ ಮಾಡಲು, F7 ಶಾರ್ಟ್ಕಟ್ ಬಳಸಿ</translation> @@ -3583,6 +3591,7 @@ <translation id="5057110919553308744">ನೀವು ವಿಸ್ತರಣೆಯನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿದಾಗ</translation> <translation id="5057403786441168405">ನಿಮ್ಮ ಸೈನ್ ಇನ್ ಮಾಡಿದ ಖಾತೆಗಳನ್ನು ನಿರ್ವಹಿಸಿ. Chrome ಮತ್ತು Google Play ನಲ್ಲಿನ ವೆಬ್ಸೈಟ್ಗಳು, ಆ್ಯಪ್ಗಳು ಮತ್ತು ವಿಸ್ತರಣೆಗಳ ಅನುಮತಿಗಳನ್ನು ಆಧರಿಸಿ, ನಿಮ್ಮ ಅನುಭವವನ್ನು ಕಸ್ಟಮೈಸ್ ಮಾಡಲು ಈ ಖಾತೆಗಳನ್ನು ಬಳಸಬಹುದು. <ph name="LINK_BEGIN" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="LINK_END" /></translation> <translation id="5059241099014281248">ಸೈನ್-ಇನ್ ನಿಂರ್ಬಂಧಿಸಿ</translation> +<translation id="5059526285558225588">ಏನನ್ನು ಹಂಚಿಕೊಳ್ಳಬೇಕು ಎಂಬುದನ್ನು ಆಯ್ಕೆಮಾಡಿ</translation> <translation id="5060332552815861872">ಉಳಿಸಲು 1 ಪ್ರಿಂಟರ್ ಲಭ್ಯವಿದೆ.</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{ಈ ಫೋಲ್ಡರ್ ಬುಕ್ಮಾರ್ಕ್ ಒಳಗೊಂಡಿದೆ. ಅದನ್ನು ಅಳಿಸಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ?}one{ಈ ಫೋಲ್ಡರ್ # ಬುಕ್ಮಾರ್ಕ್ಗಳನ್ನು ಒಳಗೊಂಡಿದೆ. ಅದನ್ನು ಅಳಿಸಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ?}other{ಈ ಫೋಲ್ಡರ್ # ಬುಕ್ಮಾರ್ಕ್ಗಳನ್ನು ಒಳಗೊಂಡಿದೆ. ಅದನ್ನು ಅಳಿಸಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ?}}</translation> <translation id="5062930723426326933">ಸೈನ್-ಇನ್ ವಿಫಲವಾಗಿದೆ, ದಯವಿಟ್ಟು ಇಂಟರ್ನೆಟ್ಗೆ ಸಂಪರ್ಕಿಸಿ ಹಾಗೂ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</translation> @@ -3699,6 +3708,7 @@ <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">ನಿಮ್ಮ ಮೆಚ್ಚಿನ ಮಧುರ ಕ್ಷಣಗಳನ್ನು ಮೆಲುಕು ಹಾಕಿ. ಆಲ್ಬಮ್ಗಳನ್ನು ಸೇರಿಸಲು ಅಥವಾ ಎಡಿಟ್ ಮಾಡಲು, <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" /> ಗೆ ಹೋಗಿ.</translation> <translation id="5190926251776387065">ಪೋರ್ಟ್ ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> +<translation id="5191094172448199359">ನೀವು ನಮೂದಿಸಿರುವ ಪಿನ್ಗಳು ಹೊಂದಾಣಿಕೆಯಾಗುತ್ತಿಲ್ಲ</translation> <translation id="5191251636205085390">ಥರ್ಡ್ ಪಾರ್ಟಿ ಕುಕೀಗಳನ್ನು ಬದಲಿಸುವ ಉದ್ದೇಶವನ್ನು ಹೊಂದಿರುವ ಹೊಸ ತಂತ್ರಜ್ಞಾನಗಳ ಬಗ್ಗೆ ತಿಳಿದುಕೊಳ್ಳಿ ಮತ್ತು ಅವುಗಳನ್ನು ನಿಯಂತ್ರಿಸಿ</translation> <translation id="51918995459521422"><ph name="ORIGIN" /> ಬಹು ಫೈಲ್ಗಳನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಲು ಬಯಸುತ್ತದೆ</translation> <translation id="5192062846343383368">ನಿಮ್ಮ ಮೇಲ್ವಿಚಾರಣೆ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ನೋಡಲು Family Link ಆ್ಯಪ್ ಅನ್ನು ತೆರೆಯಿರಿ</translation> @@ -3711,6 +3721,7 @@ <translation id="5204673965307125349">ಸಾಧನವನ್ನು ಪವರ್ವಾಷ್ ಮಾಡಿ, ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="5204967432542742771">ಪಾಸ್ವರ್ಡ್ ನಮೂದಿಸಿ</translation> <translation id="5205484256512407285">ವರ್ಗಾವಣೆ ಮಾಡಲು ಎಂದಿಗೂ ಮೊಬೈಲ್ ಡೇಟಾ ಬಳಸಬೇಡಿ</translation> +<translation id="520568280985468584">ನೆಟ್ವರ್ಕ್ ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಸೇರಿಸಲಾಗಿದೆ. ಸೆಲ್ಯುಲಾರ್ ನೆಟ್ವರ್ಕ್ ಸಕ್ರಿಯವಾಗಲು ಕೆಲವು ನಿಮಿಷಗಳು ತೆಗೆದುಕೊಳ್ಳಬಹುದು.</translation> <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />" ಅಳಿಸುವುದೇ?</translation> <translation id="520621735928254154">ಪ್ರಮಾಣಪತ್ರದ ಆಮದು ದೋಷ</translation> <translation id="5206787458656075734">{COUNT,plural, =1{ಅಪಾಯಕ್ಕೀಡಾದ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಬದಲಾಯಿಸಲಾಗಿದೆ. ನೀವು ಇನ್ನೂ # ಅಪಾಯಕ್ಕೀಡಾಗಿದ ಪಾಸ್ವರ್ಡ್ ಹೊಂದಿರುವಿರಿ. ಈಗಲೇ ಈ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಪರಿಶೀಲಿಸಲು Chrome ಶಿಫಾರಸು ಮಾಡುತ್ತದೆ.}one{ಅಪಾಯಕ್ಕೀಡಾದ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಬದಲಾಯಿಸಲಾಗಿದೆ. ನೀವು ಇನ್ನೂ # ಅಪಾಯಕ್ಕೀಡಾಗಿದ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಹೊಂದಿರುವಿರಿ. ಈಗಲೇ ಈ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಪರಿಶೀಲಿಸಲು Chrome ಶಿಫಾರಸು ಮಾಡುತ್ತದೆ.}other{ಅಪಾಯಕ್ಕೀಡಾದ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಬದಲಾಯಿಸಲಾಗಿದೆ. ನೀವು ಇನ್ನೂ # ಅಪಾಯಕ್ಕೀಡಾಗಿದ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಹೊಂದಿರುವಿರಿ. ಈಗಲೇ ಈ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಪರಿಶೀಲಿಸಲು Chrome ಶಿಫಾರಸು ಮಾಡುತ್ತದೆ.}}</translation> @@ -4346,6 +4357,7 @@ <translation id="5935656526031444304">ಸುರಕ್ಷಿತ ಬ್ರೌಸಿಂಗ್ ಅನ್ನು ನಿರ್ವಹಿಸಿ</translation> <translation id="5938002010494270685">ಸುರಕ್ಷತಾ ಅಪ್ಗ್ರೇಡ್ ಲಭ್ಯವಿದೆ</translation> <translation id="5939518447894949180">ಮರುಹೊಂದಿಸು</translation> +<translation id="5939719276406088041">ಶಾರ್ಟ್ಕಟ್ ರಚಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ</translation> <translation id="5941153596444580863">ವ್ಯಕ್ತಿಯನ್ನು ಸೇರಿಸಿ...</translation> <translation id="5941343993301164315">ದಯವಿಟ್ಟು <ph name="TOKEN_NAME" /> ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ.</translation> <translation id="5941711191222866238">ಕುಗ್ಗಿಸಿ</translation> @@ -4433,6 +4445,7 @@ <translation id="6043994281159824495">ಈಗ ಸೈನ್ ಔಟ್ ಮಾಡಿ</translation> <translation id="6044805581023976844"><ph name="TAB_NAME" /> ಜೊತೆಗೆ Chrome ಟ್ಯಾಬ್ ಮತ್ತು ಆಡಿಯೋ ಅನ್ನು <ph name="APP_NAME" /> ಹಂಚಿಕೊಳ್ಳುತ್ತಿದೆ.</translation> <translation id="6045114302329202345">ಪ್ರಾಥಮಿಕ TrackPoint ಬಟನ್</translation> +<translation id="6047632800149092791">ಸಿಂಕ್ ಕೆಲಸ ಮಾಡುತ್ತಿಲ್ಲ. ಸೈನ್ ಔಟ್ ಮಾಡಿ ಮತ್ತು ಪುನಃ ಸೈನ್ ಇನ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="6049004884579590341">ಪೂರ್ಣಪರದೆಯಿಂದ ನಿರ್ಗಮಿಸಲು <ph name="ACCELERATOR" /> ಅನ್ನು ಒತ್ತಿ ಹಿಡಿದುಕೊಳ್ಳಿ</translation> <translation id="6051354611314852653">ಓಹ್! ಈ ಸಾಧನಕ್ಕಾಗಿ API ಪ್ರವೇಶವನ್ನು ದೃಢೀಕರಿಸುವಾಗ ಸಿಸ್ಟಂ ವಿಫಲಗೊಂಡಿದೆ.</translation> <translation id="6052976518993719690">SSL ಪ್ರಮಾಣಪತ್ರ ಅಧಿಕಾರ</translation> @@ -4525,6 +4538,7 @@ <translation id="6143186082490678276">ಸಹಾಯ ಪಡೆಯಿರಿ</translation> <translation id="6143366292569327983">ಅನುವಾದಿಸಲು ಪುಟದ ಭಾಷೆಯನ್ನು ಆರಿಸಿ</translation> <translation id="6144938890088808325">Chromebooks ಸುಧಾರಿಸಲು ನಮಗೆ ಸಹಾಯಮಾಡಿ</translation> +<translation id="6146409560350811147">ಸಿಂಕ್ ಕೆಲಸ ಮಾಡುತ್ತಿಲ್ಲ. ಮತ್ತೊಮ್ಮೆ ಸೈನ್ ಇನ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="6147020289383635445">ಮುದ್ರಣ ಪೂರ್ವವೀಕ್ಷಣೆ ವಿಫಲಗೊಂಡಿದೆ.</translation> <translation id="6148576794665275391">ಈಗ ತೆರೆಯಿರಿ</translation> <translation id="6149015141270619212">ಇಂಟರ್ನೆಟ್ಗೆ ಸಂಪರ್ಕಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ</translation> @@ -4592,6 +4606,7 @@ <translation id="6232017090690406397">ಬ್ಯಾಟರಿ</translation> <translation id="6232116551750539448"><ph name="NAME" /> ಗೆ ಸಂಪರ್ಕ ಕಡಿದು ಹೋಗಿದೆ</translation> <translation id="6233154960150021497">ಕೀಬೋರ್ಡ್ನ ಬದಲಿಗೆ ಧ್ವನಿ ಬಳಸುವುದನ್ನು ಡೀಫಾಲ್ಟ್ ಮಾಡಿಕೊಳ್ಳಿ</translation> +<translation id="6234108445915742946">ಮಾರ್ಚ್ 31 ರಿಂದ Chrome ನ ಸೇವಾ ನಿಯಮಗಳು ಬದಲಾಗುತ್ತಿವೆ</translation> <translation id="6234474535228214774">ಇನ್ಸ್ಟಾಲ್ ಮಾಡುವುದು ಬಾಕಿ ಉಳಿದಿದೆ</translation> <translation id="6237474966939441970">ಸ್ಟೈಲಸ್ ಟಿಪ್ಪಣಿ-ತೆಗೆದುಕೊಳ್ಳುವಿಕೆ ಆ್ಯಪ್</translation> <translation id="6237816943013845465">ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ ರೆಸಲ್ಯೂಶನ್ ಸರಿಹೊಂದಿಸಲು ನಿಮಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ</translation> @@ -4891,6 +4906,7 @@ <translation id="656293578423618167">ಫೈಲ್ ಹಾದಿ ಅಥವಾ ಹೆಸರು ತುಂಬಾ ಉದ್ದವಾಗಿದೆ. ದಯವಿಟ್ಟು ಕಿರಿದಾದ ಹೆಸರಿನೊಂದಿಗೆ ಅಥವಾ ಮತ್ತೊಂದು ಸ್ಥಾನದಲ್ಲಿ ಉಳಿಸಿ. </translation> <translation id="6563469144985748109">ನಿಮ್ಮ ಮ್ಯಾನೇಜರ್ ಇನ್ನೂ ಇದನ್ನು ಅಂಗೀಕರಿಸಿಲ್ಲ</translation> <translation id="6569934958368283244">ಇತರ ಜನರು</translation> +<translation id="6573497332121198392">ಶಾರ್ಟ್ಕಟ್ ತೆಗೆದುಹಾಕಲು ಸಾಧ್ಯವಿಲ್ಲ</translation> <translation id="657402800789773160">ಈ ಪುಟವನ್ನು &ರೀಲೋಡ್ ಮಾಡಿ</translation> <translation id="6577284282025554716">ಡೌನ್ಲೋಡ್ ರದ್ದುಪಡಿಸಲಾಗಿದೆ: <ph name="FILE_NAME" /></translation> <translation id="657866106756413002">ನೆಟ್ವರ್ಕ್ ಹೆಲ್ತ್ ಸ್ನ್ಯಾಪ್ಶಾಟ್</translation> @@ -4898,6 +4914,7 @@ <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> - ಡೆಸ್ಕ್ಟಾಪ್ ವಿಷಯವನ್ನು ಹಂಚಲಾಗಿದೆ</translation> <translation id="6580203076670148210">ಸ್ಕ್ಯಾನಿಂಗ್ನ ವೇಗ</translation> <translation id="6582080224869403177">ನಿಮ್ಮ ಸುರಕ್ಷತೆಯನ್ನು ಅಪ್ಗ್ರೇಡ್ ಮಾಡಲು, ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ಅನ್ನು ಮರುಹೊಂದಿಸಿ.</translation> +<translation id="6582274660680936615">ನೀವು ಒಬ್ಬ ಅತಿಥಿಯಾಗಿ ಬ್ರೌಸಿಂಗ್ ಮಾಡುತ್ತಿರುವಿರಿ</translation> <translation id="6584878029876017575">Microsoft Lifetime Signing</translation> <translation id="6586099239452884121">ಅತಿಥಿ ಬ್ರೌಸಿಂಗ್</translation> <translation id="6586451623538375658">ಪ್ರಾಥಮಿಕ ಮೌಸ್ ಬಟನ್ ಅನ್ನು ಸ್ವ್ಯಾಪ್ ಮಾಡಿ</translation> @@ -5067,6 +5084,7 @@ <translation id="6782468519961184511">ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಹೆಚ್ಚುವರಿ Google ಖಾತೆಗಳನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ</translation> <translation id="6785518634832172390">ಪಿನ್ 12 ಅಥವಾ ಅದಕ್ಕಿಂತ ಕಡಿಮೆ ಅಂಕಿಗಳನ್ನು ಹೊಂದಿರಬೇಕು</translation> <translation id="6786747875388722282">ವಿಸ್ತರಣೆಗಳು</translation> +<translation id="6787097042755590313">ಇತರೆ ಟ್ಯಾಬ್.</translation> <translation id="6787839852456839824">ಕೀಬೋರ್ಡ್ ಶಾರ್ಟ್ಕಟ್ಗಳು</translation> <translation id="6788210894632713004">ಬಿಚ್ಚಿದ ವಿಸ್ತರಣೆ</translation> <translation id="6789592661892473991">ಅಡ್ಡಲಾಗಿ ವಿಭಜಿಸಿ</translation> @@ -5077,6 +5095,7 @@ <translation id="6793723358811598107">'<ph name="CURRENTKEY" />' ಅನ್ನು ಈಗಾಗಲೇ '<ph name="ACTION" />' ಕ್ರಿಯೆಗೆ ನಿಯೋಜಿಸಲಾಗಿದೆ. ನಿರ್ಗಮಿಸಲು ಯಾವುದಾದರೂ ಕೀ ಒತ್ತಿ.</translation> <translation id="6795884519221689054">ಪಾಂಡಾ</translation> <translation id="6797493596609571643">ಓಹ್, ಏನೋ ತಪ್ಪಾಗಿದೆ.</translation> +<translation id="6798420440063423019">ತಪ್ಪಾದ ಪಿನ್ ಸಂಖ್ಯೆಯನ್ನು ಹಲವಾರು ಬಾರಿ ನಮೂದಿಸಿರುವ ಕಾರಣ, ಭದ್ರತೆ ಕೀ ಅನ್ನು ಲಾಕ್ ಮಾಡಲಾಗಿದೆ. ನೀವು ಭದ್ರತೆ ಕೀ ಅನ್ನು ರೀಸೆಟ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ.</translation> <translation id="6798578729981748444">ಆಮದು ಮಾಡುವುದನ್ನು ಪೂರ್ತಿಗೊಳಿಸಲು, ಎಲ್ಲಾ Firefox ವಿಂಡೋಗಳನ್ನು ಮುಚ್ಚಿ.</translation> <translation id="6798780071646309401">caps lock ಆನ್</translation> <translation id="6798954102094737107">ಪ್ಲಗಿನ್: <ph name="PLUGIN_NAME" /></translation> @@ -5423,6 +5442,7 @@ <translation id="7180865173735832675">ಕಸ್ಟಮೈಸ್</translation> <translation id="7182791023900310535">ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಸರಿಸಿ</translation> <translation id="7186088072322679094">ಪರಿಕರಪಟ್ಟಿಯಲ್ಲಿ ಇರಿಸು</translation> +<translation id="7186303001964993981"><ph name="ORIGIN" /> ಗೆ ಈ ಫೋಲ್ಡರ್ ಅನ್ನು ತೆರೆಯಲು ಸಾಧ್ಯವಿಲ್ಲ ಏಕೆಂದರೆ ಇದರಲ್ಲಿ ಸಿಸ್ಟಂ ಫೈಲ್ಗಳಿವೆ</translation> <translation id="7187428571767585875">ತೆಗೆದುಹಾಕಬೇಕಲಾದ ಅಥವಾ ಬದಲಾಯಿಸಬೇಕಾದ ದಾಖಲಾತಿ ನಮೂದುಗಳು:</translation> <translation id="7187855807420906517">ನಿರ್ಗಮಿಸಿದ ಅಥವಾ ಆಫ್ಲೈನ್ ಮಾಡಿದ ನಂತರ, ಫೋಟೋಗಳನ್ನು ಅಪ್ಲೋಡ್ ಮಾಡುವುದು ಅಥವಾ ಚಾಟ್ ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸುವುದು ಮುಂತಾದ ಕಾರ್ಯಗಳನ್ನು ಪೂರ್ಣಗೊಳಿಸಲು ಸೈಟ್ಗಳು ಸಾಮಾನ್ಯವಾಗಿ ಸಿಂಕ್ ಮಾಡುತ್ತಲೇ ಇರುತ್ತವೆ</translation> <translation id="7189234443051076392">ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಸಾಕಷ್ಟು ಸ್ಥಳಾವಕಾಶ ಇರುವುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ</translation> @@ -6042,6 +6062,7 @@ <translation id="7871109039747854576">ಕ್ಯಾಂಡಿಡೇಟ್ ಪಟ್ಟಿಯನ್ನು ವಿಭಾಗಿಸಲು <ph name="COMMA" /> ಮತ್ತು <ph name="PERIOD" /> ಕೀಗಳನ್ನು ಬಳಸಿ</translation> <translation id="787268756490971083">ಆಫ್</translation> <translation id="7874257161694977650">Chrome ಹಿನ್ನೆಲೆಗಳು</translation> +<translation id="7876027585589532670">ಶಾರ್ಟ್ಕಟ್ ಅನ್ನು ಎಡಿಟ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ</translation> <translation id="7877451762676714207">ಅಪರಿಚಿತ ಸರ್ವರ್ ದೋಷ. ದಯವಿಟ್ಟು ಪುನಃ ಪ್ರಯತ್ನಿಸಿ, ಅಥವಾ ಸರ್ವರ್ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ.</translation> <translation id="7879631849810108578">ಶಾರ್ಟ್ಕಟ್ ಸೆಟ್ ಮಾಡಲಾಗಿದೆ: <ph name="IDS_SHORT_SET_COMMAND" /></translation> <translation id="7880823633812189969">ನೀವು ಮರುಪ್ರಾರಂಭಿಸಿದಾಗ ಸ್ಥಳೀಯ ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ</translation> @@ -6325,6 +6346,7 @@ <translation id="8189750580333936930">ಗೌಪ್ಯತೆ ಸ್ಯಾಂಡ್ಬಾಕ್ಸ್</translation> <translation id="8190193592390505034"><ph name="PROVIDER_NAME" /> ಗೆ ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ</translation> <translation id="8191230140820435481">ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್ಗಳು, ವಿಸ್ತರಣೆಗಳು, ಮತ್ತು ಥೀಮ್ಗಳನ್ನು ನಿರ್ವಹಿಸಿ</translation> +<translation id="8192944472786724289">ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ನಲ್ಲಿರುವ ವಿಷಯಗಳನ್ನು ಹಂಚಿಕೊಳ್ಳಲು <ph name="APP_NAME" /> ಬಯಸುತ್ತದೆ.</translation> <translation id="8195027750202970175">ಡಿಸ್ಕ್ನಲ್ಲಿನ ಗಾತ್ರ</translation> <translation id="8198323535106903877">ನಾವು ನಿಮಗಾಗಿ ಆ <ph name="NUMBER_OF_APPS" /> ಆ್ಯಪ್ಗಳನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡುತ್ತೇವೆ</translation> <translation id="8199300056570174101">ನೆಟ್ವರ್ಕ್ (ಸೇವೆ) ಮತ್ತು ಸಾಧನದ ಗುಣಲಕ್ಷಣಗಳು</translation> @@ -6975,6 +6997,7 @@ <translation id="8931475688782629595">ನೀವು ಏನನ್ನು ಸಿಂಕ್ ಮಾಡುತ್ತೀರಿ ಎಂಬುದನ್ನು ನಿರ್ವಹಿಸಿ</translation> <translation id="8932654652795262306">ತತ್ಕ್ಷಣದ ಟೆಥರಿಂಗ್ ವಿವರಗಳು</translation> <translation id="8932894639908691771">ಪ್ರವೇಶ ಬದಲಾಯಿಸುವಿಕೆ ಆಯ್ಕೆಗಳು</translation> +<translation id="893298445929867520">ಕಾರ್ಟ್ಗಳನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ. ನೀವು ಬದಲಾವಣೆಗಳನ್ನು ಮಾಡಿದಾಗ ಅವುಗಳು ಪುನಃ ಗೋಚರಿಸುತ್ತವೆ.</translation> <translation id="8933960630081805351">ಫೈಂಡರ್ನಲ್ಲಿ &ತೋರಿಸಿ</translation> <translation id="8934732568177537184">ಮುಂದುವರಿಸು</translation> <translation id="8938306522009698937">ಹ್ಯಾಂಡ್ಲರ್ಗಳು</translation> @@ -7252,6 +7275,7 @@ <translation id="942532530371314860">Chrome ಟ್ಯಾಬ್ ಮತ್ತು ಆಡಿಯೋವನ್ನು <ph name="APP_NAME" /> ಹಂಚಿಕೊಳ್ಳುತ್ತಿದೆ.</translation> <translation id="945522503751344254">ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಕಳುಹಿಸಿ</translation> <translation id="947329552760389097">&ಅಂಶಗಳನ್ನು ಪರಿಶೀಲಿಸಿ</translation> +<translation id="947667444780368238"><ph name="ORIGIN" /> ಗೆ ಈ ಫೋಲ್ಡರ್ನಲ್ಲಿರುವ ಫೈಲ್ಗಳನ್ನು ತೆರೆಯಲು ಸಾಧ್ಯವಿಲ್ಲ ಏಕೆಂದರೆ ಇದರಲ್ಲಿ ಸಿಸ್ಟಂ ಫೈಲ್ಗಳಿವೆ</translation> <translation id="951991426597076286">ನಿರಾಕರಿಸಿ</translation> <translation id="956500788634395331">ಹಾನಿಕಾರಕ ವಿಸ್ತರಣೆಗಳಿಂದ ನಿಮ್ಮನ್ನು ರಕ್ಷಿಸಲಾಗಿದೆ</translation> <translation id="957960681186851048">ಈ ಸೈಟ್ ಬಹು ಫೈಲ್ಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಡೌನ್ಲೋಡ್ ಮಾಡಲು ಯತ್ನಿಸಿದೆ</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index 2a925a8b..2286717 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -575,6 +575,7 @@ <translation id="1627408615528139100">이미 다운로드됨</translation> <translation id="1628948239858170093">열기 전에 파일을 검사하시겠습니까?</translation> <translation id="1629314197035607094">비밀번호가 만료되었습니다.</translation> +<translation id="1629521517399325891">사용자 인증서를 네트워크 인증에 사용할 수 없습니다.</translation> <translation id="163072119192489970">데이터 전송 및 수신 완료가 허용됨</translation> <translation id="1630768113285622200">다시 시작 및 계속</translation> <translation id="1632082166874334883">Google 계정에 비밀번호가 저장됨</translation> @@ -1179,6 +1180,7 @@ <translation id="2300383962156589922"><ph name="APP_NAME" /> 맞춤설정 및 제어</translation> <translation id="2301382460326681002">확장 프로그램 루트 디렉터리가 잘못되었습니다.</translation> <translation id="23030561267973084">'<ph name="EXTENSION_NAME" />'이(가) 추가 승인을 요청했습니다.</translation> +<translation id="230529452743010958">과거의 Google 서비스 이용 활동을 바탕으로 표시된 항목입니다. <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />에서 데이터를 확인, 삭제하고 설정을 변경할 수 있습니다.</translation> <translation id="23055578400314116">사용자 이름 선택</translation> <translation id="2307462900900812319">네트워크 설정</translation> <translation id="230927227160767054">이 페이지에서 서비스 핸들러를 설치하려 합니다.</translation> @@ -1405,6 +1407,7 @@ <translation id="2541706104884128042">새 취침 시간이 설정됨</translation> <translation id="2542050502251273923">ff_debug를 사용해 네트워크 연결 관리자와 다른 서비스의 디버깅 수준을 설정합니다.</translation> <translation id="2544292303401268586">관리자가 앱 업데이트를 위해 기기 재시작을 요청했습니다. 완료하는 데 몇 분 정도 걸릴 수 있습니다.</translation> +<translation id="2544352060595557290">현재 탭</translation> <translation id="2544853746127077729">인증서가 네트워크에 의해 거부됨</translation> <translation id="2546283357679194313">쿠키 및 사이트 데이터</translation> <translation id="2548347166720081527"><ph name="PERMISSION" /> 권한이 허용됨</translation> @@ -1570,6 +1573,7 @@ <translation id="2734760316755174687"><ph name="SITE_GROUP_NAME" /> 그룹에 있는 사이트의 권한도 초기화됩니다.</translation> <translation id="2735712963799620190">일정</translation> <translation id="2737363922397526254">접기...</translation> +<translation id="2737916598897808047"><ph name="APP_NAME" /> 앱이 <ph name="TARGET_NAME" /> 사이트와 내 화면의 콘텐츠를 공유하려고 합니다.</translation> <translation id="2738771556149464852">만료:</translation> <translation id="2739191690716947896">디버그</translation> <translation id="2739240477418971307">접근성 설정 변경</translation> @@ -2398,6 +2402,7 @@ <translation id="3677911431265050325">모바일 버전으로 보기</translation> <translation id="3677959414150797585">앱, 웹페이지 등이 포함됩니다. 사용 데이터를 공유하기로 선택한 경우에만 추천 기능 개선을 위해 통계를 전송합니다.</translation> <translation id="3678156199662914018">확장 프로그램: <ph name="EXTENSION_NAME" /></translation> +<translation id="3678188444105291936">이 창에서 보는 페이지는 방문 기록에 나타나지 않으며, 로그아웃한 후 쿠키와 같은 다른 흔적을 컴퓨터에 남기지 않습니다. 다운로드한 파일과 생성한 북마크는 보관되지 않습니다.</translation> <translation id="3680683624079082902">텍스트 음성 변환 음성</translation> <translation id="3681311097828166361">의견을 보내주셔서 감사합니다. 현재 오프라인 상태이므로 보고서는 나중에 전송됩니다.</translation> <translation id="3682824389861648626">움직임 기준</translation> @@ -2599,6 +2604,7 @@ <translation id="3884152383786131369">여러 언어를 지원하는 웹 콘텐츠는 목록의 첫 번째 지원 언어를 사용합니다. 이러한 환경설정은 브라우저 설정과 동기화됩니다. <ph name="BEGIN_LINK_LEARN_MORE" />자세히 알아보기<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3886446263141354045">사용자의 사이트 액세스 요청이 <ph name="NAME" />님에게 전송되었습니다.</translation> <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" />(으)로 메모 작성</translation> +<translation id="3888586133700543064">어시스턴트에서 발생하는 문제를 파악하는 데 도움이 되는 정보입니다. 정보는 최대 90일 동안 저장되며, 관련 엔지니어링팀과 의견팀에서만 액세스할 수 있습니다.</translation> <translation id="3890064827463908288">Wi-Fi 동기화를 사용하려면 Chrome 동기화 사용 설정</translation> <translation id="3892414795099177503">OpenVPN/L2TP... 추가</translation> <translation id="3893536212201235195">접근성 설정 확인 및 변경</translation> @@ -2630,6 +2636,7 @@ <translation id="3916445069167113093">이 형식의 파일은 컴퓨터를 손상시킬 수 있습니다. 그래도 <ph name="FILE_NAME" />을(를) 다운로드하시겠습니까?</translation> <translation id="3918972485393593704">Google에 세부정보 신고</translation> <translation id="3919145445993746351">어느 컴퓨터에서나 내 확장 프로그램을 사용하려면 동기화를 사용 설정하세요.</translation> +<translation id="3919798653937160644">이 창에서 보는 페이지는 방문 기록에 나타나지 않으며, 열려 있는 모든 게스트 창을 닫은 후 쿠키와 같은 다른 흔적을 컴퓨터에 남기지 않습니다. 하지만 다운로드한 파일은 모두 저장됩니다.</translation> <translation id="3920504717067627103">인증서 정책</translation> <translation id="392089482157167418">ChromeVox(음성 피드백) 사용</translation> <translation id="3920909973552939961">결제 핸들러 설치가 허용되지 않음</translation> @@ -2965,6 +2972,7 @@ <translation id="4332976768901252016">자녀 보호 기능 설정하기</translation> <translation id="4333854382783149454">PKCS #1 SHA-1(RSA 암호화 사용)</translation> <translation id="4336434711095810371">모든 데이터 삭제</translation> +<translation id="4340125850502689798">잘못된 사용자 이름</translation> <translation id="4340515029017875942"><ph name="ORIGIN" />에서 '<ph name="EXTENSION_NAME" />' 앱과 통신하려고 합니다.</translation> <translation id="4340575312453649552">이 광고는 기기에서 너무 많은 리소스를 사용했기 때문에 Chrome에서 삭제했습니다.</translation> <translation id="4341577178275615435">캐럿 브라우징을 사용 설정하거나 중지하려면 F7 단축키를 사용합니다.</translation> @@ -3579,6 +3587,7 @@ <translation id="5057110919553308744">확장 프로그램을 클릭할 경우</translation> <translation id="5057403786441168405">로그인된 계정을 관리하세요. 웹사이트, 앱, Chrome 확장 프로그램 및 Google Play에서 권한에 따라 이 계정을 사용하여 사용 환경을 맞춤설정할 수 있습니다. <ph name="LINK_BEGIN" />자세히 알아보기<ph name="LINK_END" /></translation> <translation id="5059241099014281248">로그인 제한</translation> +<translation id="5059526285558225588">공유할 정보 선택</translation> <translation id="5060332552815861872">저장할 수 있는 프린터가 1대 있습니다.</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{폴더에 북마크가 있습니다. 삭제하시겠습니까?}other{폴더에 #개의 북마크가 있습니다. 삭제하시겠습니까?}}</translation> <translation id="5062930723426326933">로그인하지 못했습니다. 인터넷에 연결한 후 다시 시도하세요.</translation> @@ -3695,6 +3704,7 @@ <translation id="5187826826541650604"><ph name="KEY_NAME" />(<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">소중한 추억을 되새겨 보세요. 앨범을 추가하거나 수정하려면 <ph name="LINK_BEGIN" />Google 포토<ph name="LINK_END" />로 이동하세요.</translation> <translation id="5190926251776387065">포트 활성화</translation> +<translation id="5191094172448199359">입력한 PIN이 일치하지 않음</translation> <translation id="5191251636205085390">타사 쿠키를 대체하는 것을 목표로 하는 새로운 기술을 알아보고 관리하세요.</translation> <translation id="51918995459521422"><ph name="ORIGIN" />에서 여러 파일을 다운로드하려고 합니다.</translation> <translation id="5192062846343383368">Family Link 앱을 열어 감독 설정을 확인합니다.</translation> @@ -3707,6 +3717,7 @@ <translation id="5204673965307125349">기기를 파워워시한 후 다시 시도해 주세요.</translation> <translation id="5204967432542742771">비밀번호 입력</translation> <translation id="5205484256512407285">전송에 모바일 데이터를 사용하지 않음</translation> +<translation id="520568280985468584">네트워크가 추가되었습니다. 셀룰러 네트워크가 활성화되려면 몇 분 정도 걸릴 수 있습니다.</translation> <translation id="5206215183583316675">'<ph name="CERTIFICATE_NAME" />'을(를) 삭제하시겠습니까?</translation> <translation id="520621735928254154">인증서 가져오기 오류</translation> <translation id="5206787458656075734">{COUNT,plural, =1{유출된 비밀번호를 변경했습니다. 유출된 비밀번호가 #개 더 있습니다. 지금 바로 이 비밀번호를 확인해 보시기 바랍니다.}other{유출된 비밀번호를 변경했습니다. 유출된 비밀번호가 #개 더 있습니다. 지금 바로 이 비밀번호를 확인해 보시기 바랍니다.}}</translation> @@ -4341,6 +4352,7 @@ <translation id="5935656526031444304">세이프 브라우징 관리</translation> <translation id="5938002010494270685">보안 업그레이드 사용 가능</translation> <translation id="5939518447894949180">초기화</translation> +<translation id="5939719276406088041">바로가기를 만들 수 없음</translation> <translation id="5941153596444580863">사용자 추가...</translation> <translation id="5941343993301164315"><ph name="TOKEN_NAME" />에 로그인하세요.</translation> <translation id="5941711191222866238">최소화</translation> @@ -4428,6 +4440,7 @@ <translation id="6043994281159824495">지금 로그아웃</translation> <translation id="6044805581023976844"><ph name="APP_NAME" />에서 <ph name="TAB_NAME" />와(과) Chrome 탭과 오디오를 공유 중입니다.</translation> <translation id="6045114302329202345">기본 TrackPoint 버튼</translation> +<translation id="6047632800149092791">동기화가 작동하지 않습니다. 로그아웃한 뒤 다시 로그인해 보세요.</translation> <translation id="6049004884579590341">전체화면을 종료하려면 |<ph name="ACCELERATOR" />|을(를) 길게 누르기</translation> <translation id="6051354611314852653">시스템에서 이 기기에 대한 API 액세스를 승인하지 못했습니다.</translation> <translation id="6052976518993719690">SSL 인증 기관</translation> @@ -4520,6 +4533,7 @@ <translation id="6143186082490678276">도움말 보기</translation> <translation id="6143366292569327983">번역할 페이지의 출발 언어 선택</translation> <translation id="6144938890088808325">Chromebook 개선에 도움을 주세요.</translation> +<translation id="6146409560350811147">동기화가 작동하지 않습니다. 다시 로그인해 주세요.</translation> <translation id="6147020289383635445">인쇄 미리보기에 실패했습니다.</translation> <translation id="6148576794665275391">지금 열기</translation> <translation id="6149015141270619212">인터넷에 연결할 수 없음</translation> @@ -4587,6 +4601,7 @@ <translation id="6232017090690406397">배터리</translation> <translation id="6232116551750539448"><ph name="NAME" /> 연결이 끊어졌습니다.</translation> <translation id="6233154960150021497">키보드 대신 음성 사용을 기본값으로 설정</translation> +<translation id="6234108445915742946">3월 31일부터 Chrome의 서비스 약관이 변경됩니다</translation> <translation id="6234474535228214774">설치 대기 중</translation> <translation id="6237474966939441970">스타일러스 메모 앱</translation> <translation id="6237816943013845465">화면 해상도를 조정할 수 있습니다.</translation> @@ -4886,6 +4901,7 @@ <translation id="656293578423618167">파일 경로 또는 이름이 너무 깁니다. 짧은 이름으로 변경하거나 다른 위치에 저장하세요.</translation> <translation id="6563469144985748109">관리자가 아직 승인하지 않았습니다.</translation> <translation id="6569934958368283244">다른 사용자</translation> +<translation id="6573497332121198392">바로가기를 삭제할 수 없음</translation> <translation id="657402800789773160">페이지 새로고침(&R)</translation> <translation id="6577284282025554716">다운로드 취소됨: <ph name="FILE_NAME" /></translation> <translation id="657866106756413002">네트워크 상태 스냅샷</translation> @@ -4893,6 +4909,7 @@ <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> - 데스크톱 콘텐츠 공유됨</translation> <translation id="6580203076670148210">검색 속도</translation> <translation id="6582080224869403177"><ph name="DEVICE_TYPE" />을(를) 재설정하여 보안을 업그레이드하세요.</translation> +<translation id="6582274660680936615">게스트로 탐색 중</translation> <translation id="6584878029876017575">Microsoft Lifetime Signing</translation> <translation id="6586099239452884121">손님으로 로그인</translation> <translation id="6586451623538375658">기본 마우스 버튼 전환</translation> @@ -5062,6 +5079,7 @@ <translation id="6782468519961184511">관리자가 보조 Google 계정 추가를 허용하지 않습니다.</translation> <translation id="6785518634832172390">PIN은 12자리 이하여야 합니다.</translation> <translation id="6786747875388722282">확장 프로그램</translation> +<translation id="6787097042755590313">다른 탭</translation> <translation id="6787839852456839824">단축키</translation> <translation id="6788210894632713004">압축해제된 확장 프로그램</translation> <translation id="6789592661892473991">수평 분할</translation> @@ -5072,6 +5090,7 @@ <translation id="6793723358811598107">'<ph name="CURRENTKEY" />' 키는 이미 '<ph name="ACTION" />' 작업에 할당되었습니다. 종료하려면 아무 키나 누르세요.</translation> <translation id="6795884519221689054">판다</translation> <translation id="6797493596609571643">문제가 발생했습니다.</translation> +<translation id="6798420440063423019">잘못된 PIN을 너무 여러 번 입력하여 보안 키가 잠겼습니다. 보안 키를 재설정해야 합니다.</translation> <translation id="6798578729981748444">가져오기를 완료하려면 Firefox 창을 모두 닫으세요.</translation> <translation id="6798780071646309401">Caps Lock 사용</translation> <translation id="6798954102094737107">플러그인: <ph name="PLUGIN_NAME" /></translation> @@ -5417,6 +5436,7 @@ <translation id="7180865173735832675">맞춤설정</translation> <translation id="7182791023900310535">비밀번호 이동</translation> <translation id="7186088072322679094">툴바에 보관</translation> +<translation id="7186303001964993981">이 폴더에는 시스템 파일이 포함되어 있으므로 <ph name="ORIGIN" />에서 열 수 없습니다.</translation> <translation id="7187428571767585875">삭제 또는 변경할 레지스트리 항목:</translation> <translation id="7187855807420906517">사용자가 나가거나 오프라인 상태가 된 후에도 사이트에서는 일반적으로 동기화를 계속하여 사진 업로드나 채팅 메시지 전송과 같은 작업을 마무리합니다.</translation> <translation id="7189234443051076392">기기 저장용량이 충분한지 확인합니다.</translation> @@ -6037,6 +6057,7 @@ <translation id="7871109039747854576"><ph name="COMMA" /> 및 <ph name="PERIOD" /> 키를 사용하여 후보 목록을 페이지에 표시</translation> <translation id="787268756490971083">사용 안함</translation> <translation id="7874257161694977650">Chrome 배경</translation> +<translation id="7876027585589532670">바로가기를 수정할 수 없음</translation> <translation id="7877451762676714207">알 수 없는 서버 오류입니다. 다시 시도하거나 서버 관리자에게 문의하시기 바랍니다.</translation> <translation id="7879631849810108578">단축키 조합: <ph name="IDS_SHORT_SET_COMMAND" /></translation> <translation id="7880823633812189969">다시 시작하면 로컬 데이터가 삭제됩니다</translation> @@ -6323,6 +6344,7 @@ <translation id="8189750580333936930">개인정보 보호 샌드박스</translation> <translation id="8190193592390505034"><ph name="PROVIDER_NAME" />에 연결 중</translation> <translation id="8191230140820435481">앱, 확장 프로그램 및 테마 관리</translation> +<translation id="8192944472786724289"><ph name="APP_NAME" /> 앱이 내 화면의 콘텐츠를 공유하려고 합니다.</translation> <translation id="8195027750202970175">디스크에서 차지하는 용량</translation> <translation id="8198323535106903877">앱 <ph name="NUMBER_OF_APPS" />개는 자동으로 설치됩니다</translation> <translation id="8199300056570174101">네트워크(서비스) 및 기기 속성</translation> @@ -6972,6 +6994,7 @@ <translation id="8931475688782629595">동기화 관리</translation> <translation id="8932654652795262306">인스턴트 테더링 세부정보</translation> <translation id="8932894639908691771">스위치 제어 옵션</translation> +<translation id="893298445929867520">장바구니를 숨겼습니다. 변경사항이 있을 경우 다시 표시됩니다.</translation> <translation id="8933960630081805351">Finder에서 보기(&S)</translation> <translation id="8934732568177537184">계속</translation> <translation id="8938306522009698937">핸들러</translation> @@ -7248,6 +7271,7 @@ <translation id="942532530371314860"><ph name="APP_NAME" />에서 Chrome 탭과 오디오를 공유 중입니다.</translation> <translation id="945522503751344254">의견 보내기</translation> <translation id="947329552760389097">요소 검사(&I)</translation> +<translation id="947667444780368238">이 폴더에는 시스템 파일이 포함되어 있으므로 <ph name="ORIGIN" />에서 폴더의 파일을 열 수 없습니다.</translation> <translation id="951991426597076286">거부</translation> <translation id="956500788634395331">잠재적으로 위험한 확장 프로그램으로부터 사용자를 보호합니다.</translation> <translation id="957960681186851048">이 사이트에서 여러 파일을 자동으로 다운로드하려고 함</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb index 36d7e643..be328cb 100644 --- a/chrome/app/resources/generated_resources_ky.xtb +++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -575,6 +575,7 @@ <translation id="1627408615528139100">Жүктөлүп алынган</translation> <translation id="1628948239858170093">Ачуудан мурда файл текшерилсинби?</translation> <translation id="1629314197035607094">Сырсөздүн жарамдуулук мөөнөтү аяктады</translation> +<translation id="1629521517399325891">Колдонуучунун тастыктамасын тармак аутентификациясы үчүн пайдаланууга болбойт.</translation> <translation id="163072119192489970">Маалымат жөнөтүүнү жана алууну аягына чыгара алат</translation> <translation id="1630768113285622200">Өчүрүп-күйгүзүү жана улантуу</translation> <translation id="1632082166874334883">Google аккаунтуңузда сакталган сырсөз</translation> @@ -1179,6 +1180,7 @@ <translation id="2300383962156589922"><ph name="APP_NAME" /> колдонмосун ыңгайлаштыруу жана көзөмөлдөө</translation> <translation id="2301382460326681002">Кеңейтүүнүн түпкү каталогу жараксыз.</translation> <translation id="23030561267973084">"<ph name="EXTENSION_NAME" />" кошумча уруксат сурады.</translation> +<translation id="230529452743010958">Бул нерсе Google кызматтарында буга чейин аткарган аракеттериңиздин негизинде көрсөтүлүүдө. Маалыматыңызды көрүү, өчүрүү жана жөндөөлөрүңүздү өзгөртүү үчүн төмөнкү дарекке өтүңүз: <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="23055578400314116">Колдонуучунун атын тандаңыз</translation> <translation id="2307462900900812319">Тармакты конфигурациялоо</translation> <translation id="230927227160767054">Бул баракча кызматты иштеткичти орнотоюн деп жатат.</translation> @@ -1405,6 +1407,7 @@ <translation id="2541706104884128042">Жаңы уктоочу убакыт коюлду</translation> <translation id="2542050502251273923">Тармактын туташуусун башкаруучунун жана ff_debug колдонулган башка кызматтардагы мүчүлүштүктөрдү оңдоо деңгээлин жөндөйт.</translation> <translation id="2544292303401268586">Администраторуңуз колдонмолорду жаңыртуу үчүн түзмөктү өчүрүп күйгүзүүнү суранды. Бул бир нече мүнөттө аткарылат.</translation> +<translation id="2544352060595557290">Ушул өтмөк</translation> <translation id="2544853746127077729">Аныктыкты текшерүү тастыктамасын тармак четке какты</translation> <translation id="2546283357679194313">Кукилер жана сайттын дайындары</translation> <translation id="2548347166720081527"><ph name="PERMISSION" /> – уруксат берилди</translation> @@ -1570,6 +1573,7 @@ <translation id="2734760316755174687">Бардык <ph name="SITE_GROUP_NAME" /> сайттарындагы уруксаттар дагы баштапкы абалга келтирилет.</translation> <translation id="2735712963799620190">Графиги</translation> <translation id="2737363922397526254">Жыйнап коюу…</translation> +<translation id="2737916598897808047"><ph name="APP_NAME" /> колдонмосу экраныңыздагы мазмундарды <ph name="TARGET_NAME" /> менен бөлүшкүсү келет.</translation> <translation id="2738771556149464852">Кийин эмес</translation> <translation id="2739191690716947896">Мүчүлүштүктөрдү аныктоо</translation> <translation id="2739240477418971307">Атайын мүмкүнчүлүктөр жөндөөлөрүн өзгөртүңүз</translation> @@ -2398,6 +2402,7 @@ <translation id="3677911431265050325">Мобилдик версиясы керек</translation> <translation id="3677959414150797585">Колдонмолор, веб-баракчалар жана башкалар сунушталат. Сунуштарды жакшыртуу максатында колдонуу статистикаңыз жөнөтүлөт (статистиканы бөлүшүүнү тандаган болсоңуз гана).</translation> <translation id="3678156199662914018">Кеңейтүү: <ph name="EXTENSION_NAME" /></translation> +<translation id="3678188444105291936">Чыкканыңыздан кийин, бул терезеде каралган баракчалар серепчи таржымалында көрүнбөйт жана компьютерде cookie файлдары сыяктуу башка издерди калтырбайт. Бирок жүктөлүп алынган файлдар жана түзүлгөн кыстармалар сакталбайт.</translation> <translation id="3680683624079082902">Кеп синтезаторунун үнү</translation> <translation id="3681311097828166361">Ой пикириңиз үчүн чоң рахмат! Отчет Интернетке туташаарыңыз менен жөнөтүлөт.</translation> <translation id="3682824389861648626">Жылдыруу босогосу</translation> @@ -2599,6 +2604,7 @@ <translation id="3884152383786131369">Бир нече тилде жеткиликтүү болгон вебдеги мазмун бул тизмедеги колдоого алынган биринчи тилди колдонот. Бул параметрлер серепчиңиздин жөндөөлөрү менен шайкештирилет. <ph name="BEGIN_LINK_LEARN_MORE" />Кеңири маалымат<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3886446263141354045">Бул сайтка кирүү өтүнүчүңүз <ph name="NAME" /> деген колдонуучуга жөнөтүлдү</translation> <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" /> колдонмосунда жазылууда</translation> +<translation id="3888586133700543064">Бул маалымат Жардамчыңызда келип чыккан маселени түшүнүүгө жардам берет. Ал 90 күн сакталып, тиешелүү инженердик жана пикир боюнча жамааттар тарабынан көзөмөлгө алынат.</translation> <translation id="3890064827463908288">Wi-Fi Sync функциясын колдонуу үчүн Chrome шайкештирүүнү күйгүзүңүз</translation> <translation id="3892414795099177503">АчыкVPN/L2TP'ди кошуу…</translation> <translation id="3893536212201235195">Атайын мүмкүнчүлүктөр жөндөөлөрүңүздү окуп, өзгөртүңүз</translation> @@ -2630,6 +2636,7 @@ <translation id="3916445069167113093">Файлдын мындай түрү компьютериңизге зыян келтириши мүмкүн. <ph name="FILE_NAME" /> баары бир кала берсинби?</translation> <translation id="3918972485393593704">Чоо-жайы тууралуу Google'га кабар бериңиз</translation> <translation id="3919145445993746351">Бардык компьютерлериңизден кеңейтүүлөрүңүздү алуу үчүн, шайкештирүүнү күйгүзүңүз</translation> +<translation id="3919798653937160644">Ачылып турган Конок терезелери жабылгандан кийин, бул терезеде каралган баракчалар серепчи таржымалында көрүнбөйт жана компьютерде cookie файлдары сыяктуу башка издерди калтырбайт. Бирок бардык жүктөлүп алынган файлдар сакталып кала берет.</translation> <translation id="3920504717067627103">Тастыктама саясаттары</translation> <translation id="392089482157167418">ChromeVox иштетүү (айтылуучу жооп пикир)</translation> <translation id="3920909973552939961">Төлөм иштеткичтерин орното албайт</translation> @@ -2967,6 +2974,7 @@ <translation id="4332976768901252016">Ата-эненин көзөмөлүн жөндөө</translation> <translation id="4333854382783149454">PKCS #1 SHA-1 RSA шифрлөөсү менен</translation> <translation id="4336434711095810371">Бардык маалыматты өчүрүү</translation> +<translation id="4340125850502689798">Колдонуучунун аты жараксыз</translation> <translation id="4340515029017875942"><ph name="ORIGIN" /> "<ph name="EXTENSION_NAME" />" колдонмосу менен байланышкысы келет</translation> <translation id="4340575312453649552">Бул жарнама түзмөгүңүздүн ресурстарын ашыкча колдонуп жаткандыктан Chrome аны өчүрүп койду.</translation> <translation id="4341577178275615435">Caret серептөөсүн күйгүзүү же өчүрүү үчүн F7 ыкчам баскычын колдонуңуз</translation> @@ -3581,6 +3589,7 @@ <translation id="5057110919553308744">Кеңейтүүнү чыкылдатканда</translation> <translation id="5057403786441168405">Кирип турган аккаунттарыңызды башкарасыз. Уруксаттарга жараша Chrome менен Google Play'деги вебсайттар, колдонмолор жана кеңейтүүлөр бул аккаунттарды сизге көрсөтүлгөн кызматтарды жекечелештирүү үчүн колдонушу мүмкүн. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Кирүүнү чектөө</translation> +<translation id="5059526285558225588">Бөлүшө турган нерсени тандаңыз</translation> <translation id="5060332552815861872">Сактоо үчүн 1 принтер жеткиликтүү.</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{Бул куржунда кыстарма камтылган. Аны чын эле өчүрөсүзбү?}other{Бул куржунда # кыстарма камтылган. Аны чын эле өчүрөсүзбү?}}</translation> <translation id="5062930723426326933">Кирбей калдыңыз, Интернетке туташып, кайра аракет кылып көрүңүз.</translation> @@ -3697,6 +3706,7 @@ <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">Эсте калган учурларды кайра көз алдыңыздан өткөрүңүз. Альбомдорду кошуу же түзөтүү үчүн <ph name="LINK_BEGIN" />Google Фотого<ph name="LINK_END" /> өтүңүз.</translation> <translation id="5190926251776387065">Оюкчаны иштетүү</translation> +<translation id="5191094172448199359">Киргизилген PIN коддор дал келген жок</translation> <translation id="5191251636205085390">Үчүнчү тараптын cookie файлдарын алмаштыруучу жаңы технологиялар жөнүндө маалымат алып, аларды башкарыңыз</translation> <translation id="51918995459521422"><ph name="ORIGIN" /> бир нече файлды жүктөп алганы жатат</translation> <translation id="5192062846343383368">Көзөмөлдөө жөндөөлөрүн көрүү үчүн Family Link колдонмосун ачыңыз</translation> @@ -3709,6 +3719,7 @@ <translation id="5204673965307125349">Түзмөктүн жөндөөлөрүн баштапкы абалга келтирип туруп, кайталап көрүңүз.</translation> <translation id="5204967432542742771">Сырсөз киргизүү</translation> <translation id="5205484256512407285">Өткөрүү үчүн эч качан мобилдик трафик колдонулбасын</translation> +<translation id="520568280985468584">Тармак кошулду. Мобилдик тармак бир нече мүнөттө активдүү болот.</translation> <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />" жок кылынсынбы?</translation> <translation id="520621735928254154">Тастыктаманы импорттоодогу ката</translation> <translation id="5206787458656075734">{COUNT,plural, =1{Уурдалган сырсөз ийгиликтүү өзгөртүлдү. Дагы # уурдалган сырсөз бар. Chrome бул сырсөздү азыр текшерүүнү сунуштайт.}other{Уурдалган сырсөз ийгиликтүү өзгөртүлдү. Дагы # уурдалган сырсөз бар. Chrome бул сырсөздөрдү азыр текшерүүнү сунуштайт.}}</translation> @@ -4343,6 +4354,7 @@ <translation id="5935656526031444304">Коопсуз серептөөнү башкаруу</translation> <translation id="5938002010494270685">Коопсуздук тутумунун жаңы версиясы бар</translation> <translation id="5939518447894949180">Кайра коюу</translation> +<translation id="5939719276406088041">Ыкчам баскыч түзүлбөй жатат</translation> <translation id="5941153596444580863">Адам кошуу…</translation> <translation id="5941343993301164315"><ph name="TOKEN_NAME" /> ичине кириңиз.</translation> <translation id="5941711191222866238">Кичирейтүү</translation> @@ -4430,6 +4442,7 @@ <translation id="6043994281159824495">Азыр чыгуу</translation> <translation id="6044805581023976844"><ph name="APP_NAME" /> колдонмосу Chrome өтмөгүн жана аудио файлын <ph name="TAB_NAME" /> менен бөлүп жатат.</translation> <translation id="6045114302329202345">Негизги TrackPoint баскычы</translation> +<translation id="6047632800149092791">Шайкештирүү иштебей жатат. Чыгып, кайра кирип көрүңүз.</translation> <translation id="6049004884579590341">Толук экандан чыгуу үчүн |<ph name="ACCELERATOR" />| баскычын басып, кармап туруңуз</translation> <translation id="6051354611314852653">Ой! Тутум бул түзмөктүн API'не кирүүгө уруксат бере алган жок.</translation> <translation id="6052976518993719690">SSL тастыктама борбору</translation> @@ -4522,6 +4535,7 @@ <translation id="6143186082490678276">Жардам алуу</translation> <translation id="6143366292569327983">Кайсы тилдеги баракчалар которуларын тандаңыз</translation> <translation id="6144938890088808325">Chromebooks'ту жакшыртууга жардам бериңиз</translation> +<translation id="6146409560350811147">Шайкештирүү иштебей жатат. Кайра кирип көрүңүз.</translation> <translation id="6147020289383635445">Басылып чыга турган нерсе алдын ала көрүнгөн жок.</translation> <translation id="6148576794665275391">Азыр ачык</translation> <translation id="6149015141270619212">Интернетке туташа албай жатат</translation> @@ -4589,6 +4603,7 @@ <translation id="6232017090690406397">Батарея</translation> <translation id="6232116551750539448"><ph name="NAME" /> менен туташуу жоготулду</translation> <translation id="6233154960150021497">Демейки шартта баскычтопту колдонуунун ордуна оозеки кайрылуу</translation> +<translation id="6234108445915742946">Chrome’дун Тейлөө шарттары 31-марттан кийин өзгөргөнү жатат</translation> <translation id="6234474535228214774">Орнотуу күтүүдө</translation> <translation id="6237474966939441970">Стилус менен эскертме жазуучу колдонмо</translation> <translation id="6237816943013845465">Экраныңыздын дааналыгын өзгөртө аласыз</translation> @@ -4888,6 +4903,7 @@ <translation id="656293578423618167">Файлдын аталышы же ага алып барчу жол өтө узун. Анын аталышын кыскартыңыз же жакыныраак жерге сактаңыз.</translation> <translation id="6563469144985748109">Башкаруучуңуз буга уруксат бере элек</translation> <translation id="6569934958368283244">Башка кишилер</translation> +<translation id="6573497332121198392">Ыкчам баскыч өчпөй жатат</translation> <translation id="657402800789773160">&Бул бетти кайра жүктөө</translation> <translation id="6577284282025554716">Жүктөп алуу жокко чыгарылды: <ph name="FILE_NAME" /></translation> <translation id="657866106756413002">Тармактын абалынын сүрөтү</translation> @@ -4895,6 +4911,7 @@ <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> – Иш тактанын мазмуну бөлүшүлүүдө</translation> <translation id="6580203076670148210">Скандоо ылдамдыгы</translation> <translation id="6582080224869403177">Коопсуздук тутумун жаңыртуу үчүн <ph name="DEVICE_TYPE" /> түзмөгүңүздү баштапкы абалга келтириңиз.</translation> +<translation id="6582274660680936615">Конок катары серептеп жатасыз</translation> <translation id="6584878029876017575">Microsoft Өмүр бою жазылуу</translation> <translation id="6586099239452884121">Конок катары карап чыгуу</translation> <translation id="6586451623538375658">Негизги чычкан баскычын алмаштыруу</translation> @@ -5064,6 +5081,7 @@ <translation id="6782468519961184511">Администраторуңуз кошумча Google аккаунттарын колдонууга тыюу салат</translation> <translation id="6785518634832172390">PIN код 12 же андан азыраак сандан турушу керек</translation> <translation id="6786747875388722282">Кеңейтүүлөр</translation> +<translation id="6787097042755590313">Башка өтмөк</translation> <translation id="6787839852456839824">Ыкчам баскычтар</translation> <translation id="6788210894632713004">Топтомдон чыгарыла элек кеңейтүү</translation> <translation id="6789592661892473991">Туурасынан бөлүү</translation> @@ -5074,6 +5092,7 @@ <translation id="6793723358811598107">"<ph name="CURRENTKEY" />" "<ph name="ACTION" />" аракети үчүн дайындалган. Чыгуу үчүн каалаган баскычты басыңыз.</translation> <translation id="6795884519221689054">Панда</translation> <translation id="6797493596609571643">Ой, бир жерден ката кетти окшойт.</translation> +<translation id="6798420440063423019">Туура эмес PIN код өтө көп жолу киргизилгендиктен, коопсуздук ачкычы кулпуланып калды. Коопсуздук ачкычын баштапкы абалга келтиришиңиз керек.</translation> <translation id="6798578729981748444">Импорттоону бүтүрүү үчүн бардык Firefox терезелерин жабыңыз.</translation> <translation id="6798780071646309401">Caps Lock күйүк</translation> <translation id="6798954102094737107">Плагин: <ph name="PLUGIN_NAME" /></translation> @@ -5419,6 +5438,7 @@ <translation id="7180865173735832675">Өзгөчөлөштүрүү</translation> <translation id="7182791023900310535">Сырсөздү жылдыруу</translation> <translation id="7186088072322679094">Куралдар тилкесинде калтыруу</translation> +<translation id="7186303001964993981"><ph name="ORIGIN" /> бул папканы ача албайт, себеби анда тутум файлдары бар</translation> <translation id="7187428571767585875">Өчүрүлө же өзгөртүлө турган реестрдеги жазуулар:</translation> <translation id="7187855807420906517">Сайттан чыгып же оффлайн режиминде болсоңуз, сайттар сүрөттөрдү жүктөп алуу же чат билдирмелерин жөнөтүү сыяктуу иштерди бүтүрүү үчүн, шайкештирүүнү улантат</translation> <translation id="7189234443051076392">Түзмөгүңүздө бош орун бар экенин текшериңиз</translation> @@ -6039,6 +6059,7 @@ <translation id="7871109039747854576">Талапкерлер тизмесин барактоо үчүн <ph name="COMMA" /> жана <ph name="PERIOD" /> баскычтарын колдонуңуз</translation> <translation id="787268756490971083">Өчүк</translation> <translation id="7874257161694977650">Chrome'ду фондо ыңгайлаштыруу</translation> +<translation id="7876027585589532670">Ыкчам баскыч түзөтүлбөй жатат</translation> <translation id="7877451762676714207">Белгисиз сервер катасы. Кайталап көрүңүз же сервер администраторуна кайрылыңыз.</translation> <translation id="7879631849810108578">Ыкчам баскыч коюлду: <ph name="IDS_SHORT_SET_COMMAND" /></translation> <translation id="7880823633812189969">Түзмөк өчүрүлүп күйгүзүлгөндө, түзмөктөгү дайындар өчүрүлөт</translation> @@ -6324,6 +6345,7 @@ <translation id="8189750580333936930">Купуя сыноо чөйрөсү</translation> <translation id="8190193592390505034"><ph name="PROVIDER_NAME" /> менен туташууда</translation> <translation id="8191230140820435481">Колдонмолоруңузду, кеңейтүүлөрүңүздү жана темаларыңызды башкарыңыз</translation> +<translation id="8192944472786724289"><ph name="APP_NAME" /> колдонмосу экраныңыздагы мазмундарды бөлүшкүсү келет.</translation> <translation id="8195027750202970175">Дисктин көлөмү</translation> <translation id="8198323535106903877">Ал <ph name="NUMBER_OF_APPS" /> колдонмону орнотуп беребиз</translation> <translation id="8199300056570174101">Тармактын (кызматтын) жана түзмөктүн касиеттери</translation> @@ -6973,6 +6995,7 @@ <translation id="8931475688782629595">Шайкештириле турган маалыматты башкаруу</translation> <translation id="8932654652795262306">Ыкчам байланыш түйүнүнүн чоо-жайы</translation> <translation id="8932894639908691771">Switch Access функциясынын параметрлери</translation> +<translation id="893298445929867520">Арабалар жашырылды. Алар өзгөртүү киргизгениңизде көрүнөт.</translation> <translation id="8933960630081805351">Тапкычта &көрсөтүү</translation> <translation id="8934732568177537184">Улантуу</translation> <translation id="8938306522009698937">иштеткичтер</translation> @@ -7249,6 +7272,7 @@ <translation id="942532530371314860"><ph name="APP_NAME" /> колдонмосу Chrome өтмөгүн жана аудио файлын бөлүшүп жатат.</translation> <translation id="945522503751344254">Пикириңизди билдириңиз</translation> <translation id="947329552760389097">&Элементтерди иликтөө</translation> +<translation id="947667444780368238"><ph name="ORIGIN" /> бул папкадагы файлдарды ача албайт, себеби анда тутум файлдары бар</translation> <translation id="951991426597076286">Четке кагуу</translation> <translation id="956500788634395331">Мүмкүн болгон кооптуу кеңейтүүлөрдөн корголуп турасыз</translation> <translation id="957960681186851048">Бул сайт бир нече файлды автоматтык түрдө жүктөп алууга аракет кылды</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb index a8c9aa6..2cf3087 100644 --- a/chrome/app/resources/generated_resources_lo.xtb +++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -573,6 +573,7 @@ <translation id="1627408615528139100">ດາວໂຫຼດຮຽບຮ້ອຍແລ້ວ</translation> <translation id="1628948239858170093">ສະແກນໄຟລ໌ກ່ອນທີ່ຈະເປີດບໍ?</translation> <translation id="1629314197035607094">ລະຫັດຜ່ານໝົດອາຍຸແລ້ວ</translation> +<translation id="1629521517399325891">ບໍ່ສາມາດໃຊ້ໃບຮັບຮອງຜູ້ໃຊ້ສຳລັບການພິສູດຢືນຢັນເຄືອຂ່າຍໄດ້.</translation> <translation id="163072119192489970">ໄດ້ຮັບອະນຸຍາດໃຫ້ເຮັດສຳເລັດການສົ່ງ ແລະ ຮັບຂໍ້ມູນ</translation> <translation id="1630768113285622200">ຣີສະຕາດ ແລະ ສືບຕໍ່</translation> <translation id="1632082166874334883">ເກັບລະຫັດຜ່ານໄວ້ໃນບັນຊີ Google ຂອງທ່ານແລ້ວ</translation> @@ -1177,6 +1178,7 @@ <translation id="2300383962156589922">ປັບແຕ່ງ ແລະ ຄວບຄຸມ <ph name="APP_NAME" /></translation> <translation id="2301382460326681002">ໄດເຣັກຕໍຣີພື້ນຖານສ່ວນຂະຫຍາຍໃຊ້ບໍ່ໄດ້.</translation> <translation id="23030561267973084">"<ph name="EXTENSION_NAME" />" ຂໍການອະນຸຍາດເພີ່ມເຕີມແລ້ວ.</translation> +<translation id="230529452743010958">ທ່ານເຫັນລາຍການນີ້ໂດຍອ້າງອີງຕາມການເຄື່ອນໄຫວທີ່ຜ່ານມາຂອງທ່ານໃນການໃຊ້ການບໍລິການ Google. ທ່ານສາມາດເບິ່ງຂໍ້ມູນຂອງທ່ານ, ລຶບມັນ ແລະ ປ່ຽນການຕັ້ງຄ່າຂອງທ່ານໄດ້ຢູ່ <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="23055578400314116">ເລືອກຊື່ຜູ້ໃຊ້</translation> <translation id="2307462900900812319">ປັບຕັ້ງຄ່າເຄືອຂ່າຍ</translation> <translation id="230927227160767054">ໜ້ານີ້ຕ້ອງການຕິດຕັ້ງຕົວຈັດການເລື່ອງການບໍລິການ.</translation> @@ -1403,6 +1405,7 @@ <translation id="2541706104884128042">ຕັ້ງເວລານອນໃໝ່ແລ້ວ</translation> <translation id="2542050502251273923">ຕັ້ງຄ່າລະດັບການດີບັກຂອງຕົວຈັດການເຊື່ອມຕໍ່ເຄືອຂ່າຍ ແລະ ການບໍລິການອື່ນໂດຍໃຊ້ ff_debug.</translation> <translation id="2544292303401268586">ຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານໄດ້ຂໍຣິສະຕາດອຸປະກອນຂອງທ່ານເພື່ອອັບເດດແອັບ. ຂັ້ນຕອນນີ້ອາດໃຊ້ເວລາຫຼາຍນາທີຈຶ່ງຈະສຳເລັດ.</translation> +<translation id="2544352060595557290">ແຖບນີ້</translation> <translation id="2544853746127077729">ໃບຢັ້ງຢືນການຮັບຮອງຖືກເຄືອຂ່າຍປະຕິເສດ</translation> <translation id="2546283357679194313">ຄຸກກີ້ ແລະຂໍ້ມູນເວັບໄຊທ໌...</translation> <translation id="2548347166720081527">ອະນຸຍາດ <ph name="PERMISSION" /> ແລ້ວ</translation> @@ -1568,6 +1571,7 @@ <translation id="2734760316755174687">ເວັບໄຊພາຍໃຕ້ <ph name="SITE_GROUP_NAME" /> ຈະຖືກຣີເຊັດເຊັ່ນກັນ.</translation> <translation id="2735712963799620190">ກຳນົດເວລາ</translation> <translation id="2737363922397526254">ຍຸບລົງ...</translation> +<translation id="2737916598897808047"><ph name="APP_NAME" /> ຕ້ອງການແບ່ງປັນເນື້ອຫາໜ້າຈໍຂອງທ່ານນຳ <ph name="TARGET_NAME" />.</translation> <translation id="2738771556149464852">ບໍ່ຫຼັງຈາກ</translation> <translation id="2739191690716947896">ແກ້ໄຂບັນຫາ</translation> <translation id="2739240477418971307">ປ່ຽນການຕັ້ງຄ່າຄວາມສາມາດເຂົ້າຫາຂອງທ່ານ</translation> @@ -2396,6 +2400,7 @@ <translation id="3677911431265050325">ຮ້ອງຂໍເວັບໄຊມືຖື</translation> <translation id="3677959414150797585">ຮວມມີແອັບ, ໜ້າເວັບ ແລະ ອື່ນໆອີກ. ສົ່ງສະຖິຕິເພື່ອປັບປຸງການແນະນຳພຽງແຕ່ຖ້າທ່ານໄດ້ເລືອກແບ່ງປັນຂໍ້ມູນການນຳໃຊ້ເທົ່ານັ້ນ.</translation> <translation id="3678156199662914018">ສ່ວນຂະຫຍາຍ: <ph name="EXTENSION_NAME" /></translation> +<translation id="3678188444105291936">ໜ້າເວັບຕ່າງໆທີ່ທ່ານເບິ່ງຢູ່ໜ້າຈໍນີ້ຈະບໍ່ປາກົດໃນປະຫວັດການທ່ອງເວັບ ແລະ ພວກມັນຈະບໍ່ມີຮ່ອງຮອຍອື່ນໆ ເຊັ່ນ: ຄຸກກີ້ ຢູ່ຄອມພິວເຕີຫຼັງຈາກທີ່ທ່ານອອກຈາກລະບົບ. ໄຟລ໌ທີ່ທ່ານດາວໂຫຼດ ແລະ ບຸກມາກທີ່ທ່ານສ້າງຈະບໍ່ຖືກຈັດເກັບໄວ້.</translation> <translation id="3680683624079082902">ສຽງຂອງການປ່ຽນຂໍ້ຄວາມເປັນສຽງເວົ້າ</translation> <translation id="3681311097828166361">ຂໍຂອບໃຈສຳລັບຄຳຕິຊົມຂອງທ່ານ. ທ່ານອອບລາຍຢູ່ຕອນນີ້ ແລະ ລາຍງານຂອງທ່ານຈະຖືກສົ່ງໃນພາຍຫຼັງ.</translation> <translation id="3682824389861648626">ຂີດຈຳກັດການເຄື່ອນຍ້າຍ</translation> @@ -2597,6 +2602,7 @@ <translation id="3884152383786131369">ເນື້ອຫາເວັບທີ່ມີໃຫ້ເປັນຫຼາຍພາສາຈະໃຊ້ພາສາທີ່ຮອງຮັບທຳອິດຈາກລາຍຊື່ນີ້. ການຕັ້ງຄ່າເຫຼົ່ານີ້ຊິ້ງຂໍ້ມູນກັບການຕັ້ງຄ່າໂປຣແກຣມທ່ອງເວັບຂອງທ່ານ. <ph name="BEGIN_LINK_LEARN_MORE" />ສຶກສາເພີ່ມເຕີມ<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3886446263141354045">ຄຳຂໍເຂົ້າຫາເວັບໄຊນີ້ຂອງທ່ານໄດ້ຖືກສົ່ງຫາ <ph name="NAME" /> ແລ້ວ</translation> <translation id="3888550877729210209">ກຳລັງຈົດບັນທຶກດ້ວຍ <ph name="LOCK_SCREEN_APP_NAME" /></translation> +<translation id="3888586133700543064">ຂໍ້ມູນນີ້ຊ່ວຍພວກເຮົາເຂົ້າໃຈບັນຫາຂອງຜູ້ຊ່ວຍຂອງທ່ານໄດ້ດີຂຶ້ນ. ມັນຈະຖືກເກັບໄວ້ບໍ່ເກີນ 90 ມື້ ແລະ ມີແຕ່ທີມວິສະວະກອນ ແລະ ທີມຮັບຄຳຕິຊົມທີ່ເໝາະສົມເທົ່ານັ້ນທີ່ເຂົ້າເຖິງໄດ້.</translation> <translation id="3890064827463908288">ເປີດ Chrome Sync ເພື່ອໃຊ້ Wi-Fi Sync</translation> <translation id="3892414795099177503">ເພີ່ມ OpenVPN / L2TP...</translation> <translation id="3893536212201235195">ອ່ານ ແລະປ່ຽນການຕັ້ງຄ່າຄວາມສາມາດເຂົ້າໃຊ້ຂອງໜ້າ</translation> @@ -2628,6 +2634,7 @@ <translation id="3916445069167113093">ໄຟລ໌ປະເພດນີ້ສາມາດເປັນອັນຕະລາຍຕໍ່ຄອມພິວເຕີຂອງທ່ານໄດ້. ແນວໃດທ່ານກໍ່ຕ້ອງການເກັບ <ph name="FILE_NAME" /> ໄວ້ບໍ?</translation> <translation id="3918972485393593704">ລາຍງານລາຍລະອຽດຫາ Google</translation> <translation id="3919145445993746351">ເພື່ອຮັບເອົາສ່ວນຂະຫຍາຍຂອງທ່ານຢູ່ໃນຄອມພິວເຕີທັງໝົດຂອງທ່ານ, ກະລຸນາເປີດການຊິ້ງຂໍ້ມູນ</translation> +<translation id="3919798653937160644">ໜ້າເວັບຕ່າງໆທີ່ທ່ານເບິ່ງຢູ່ໜ້າຈໍນີ້ຈະບໍ່ປາກົດໃນປະຫວັດການທ່ອງເວັບ ແລະ ພວກມັນຈະບໍ່ມີຮ່ອງຮອຍອື່ນໆ ເຊັ່ນ: ຄຸກກີ້ ຢູ່ຄອມພິວເຕີຫຼັງຈາກທີ່ທ່ານປິດໜ້າຈໍແຂກທັງໝົດ. ຢ່າງໃດກໍຕາມ, ໄຟລ໌ທີ່ທ່ານດາວໂຫຼດມາຈະຖືກເກັບໄວ້.</translation> <translation id="3920504717067627103">ນະໂຍບາຍວ່າດ້ວຍໃບຢັ້ງຢືນ</translation> <translation id="392089482157167418">ເປີດໃຊ້ງານ ChromeVox (ຄໍາຄິດເຫັນທີ່ເວົ້າມາ)່</translation> <translation id="3920909973552939961">ບໍ່ໄດ້ຮັບອະນຸຍາດໃຫ້ຕິດຕັ້ງຕົວຈັດການການຈ່າຍເງິນ</translation> @@ -2965,6 +2972,7 @@ <translation id="4332976768901252016">ຕັ້ງຄ່າການຄວບຄຸມສຳລັບພໍ່ແມ່</translation> <translation id="4333854382783149454">PKCS #1 SHA-1 ດ້ວຍການໃສ່ລະຫັດ RSA</translation> <translation id="4336434711095810371">ລຶບລ້າງຂໍ້ມູນທັງໝົດ</translation> +<translation id="4340125850502689798">ຊື່ຜູ້ໃຊ້ບໍ່ຖືກຕ້ອງ</translation> <translation id="4340515029017875942"><ph name="ORIGIN" /> ຕ້ອງການສື່ສານກັບແອັບ "<ph name="EXTENSION_NAME" />"</translation> <translation id="4340575312453649552">ໂຄສະນານີ້ໃຊ້ຊັບພະຍາກອນຫຼາຍເກີນໄປສຳລັບອຸປະກອນຂອງທ່ານ, ສະນັ້ນ Chrome ໄດ້ລຶບມັນອອກແລ້ວ.</translation> <translation id="4341577178275615435">ເພື່ອເປີດ ຫຼື ປິດການຮຽກເບິ່ງດ້ວຍແປ້ນພິມ, ກະລຸນາໃຊ້ທາງລັດ F7</translation> @@ -3579,6 +3587,7 @@ <translation id="5057110919553308744">ເມື່ອທ່ານຄລິກສ່ວນຂະຫຍາຍ</translation> <translation id="5057403786441168405">ຈັດການບັນຊີທີ່ເຂົ້າສູ່ລະບົບຂອງທ່ານ. ເວັບໄຊ, ແອັບ ແລະ ສ່ວນຂະຫຍາຍໃນ Chrome ແລະ Google Play ອາດຈະໃຊ້ບັນຊີເຫຼົ່ານີ້ເພື່ອປັບແຕ່ງປະສົບການຂອງທ່ານ, ໂດຍຂຶ້ນກັບການອະນຸຍາດ. <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation> <translation id="5059241099014281248">ຈຳກັດການເຂົ້າສູ່ລະບົບ</translation> +<translation id="5059526285558225588">ເລືອກສິ່ງທີ່ຈະແບ່ງປັນ</translation> <translation id="5060332552815861872">ມີເຄື່ອງພິມ 1 ເຄື່ອງພ້ອມໃຫ້ບັນທຶກໄວ້.</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{ໂຟນເດີນີ້ປະກອບມີໜຶ່ງບຸກມາກ. ທ່ານແນ່ໃຈບໍວ່າທ່ານຕ້ອງການລຶບມັນ?}other{ໂຟນເດີນີ້ປະກອບມີ # ບຸກມາກ. ທ່ານແນ່ໃຈບໍວ່າທ່ານຕ້ອງການລຶບມັນ?}}</translation> <translation id="5062930723426326933">ລົງຊື່ເຂົ້າໃຊ້ບໍ່ສໍາເລັດ, ກະລຸນາເຊື່ອມຕໍ່ກັບອິນເຕີເນັດ ແລະລອງໃໝ່ອີກ.</translation> @@ -3695,6 +3704,7 @@ <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">ຫວນຄືນຄວາມຊົງຈຳທີ່ທ່ານມັກ. ເພື່ອເພີ່ມ ຫຼື ແກ້ໄຂອະລະບໍ້າ, ກະລຸນາໄປທີ່ <ph name="LINK_BEGIN" />Google ຮູບພາບ<ph name="LINK_END" />.</translation> <translation id="5190926251776387065">ເປີດນຳໃຊ້ຜອດ</translation> +<translation id="5191094172448199359">PIN ທີ່ທ່ານປ້ອນເຂົ້ານັ້ນບໍ່ກົງກັນ</translation> <translation id="5191251636205085390">ສຶກສາກ່ຽວກັບ ແລະ ຄວບຄຸມເທັກໂນໂລຢີໃໝ່ທີ່ມີຈຸດປະສົງປ່ຽນແທນຄຸກກີ້ພາກສ່ວນທີສາມ</translation> <translation id="51918995459521422"><ph name="ORIGIN" /> ຕ້ອງການດາວໂຫຼດຫຼາຍໄຟລ໌</translation> <translation id="5192062846343383368">ເປີດແອັບ Family Link ເພື່ອເບິ່ງການຕັ້ງຄ່າການຄວບຄຸມເບິ່ງແຍງຂອງທ່ານ</translation> @@ -3707,6 +3717,7 @@ <translation id="5204673965307125349">ກະລຸນາ Powerwash ອຸປະກອນ ແລ້ວລອງອີກຄັ້ງ.</translation> <translation id="5204967432542742771">ໃສ່ລະຫັດຜ່ານ</translation> <translation id="5205484256512407285">ຢ່າໃຊ້ອິນເຕີເນັດມືຖືເພື່ອໂອນຍ້າຍ</translation> +<translation id="520568280985468584">ເພີ່ມເຄືອຂ່າຍສຳເລັດແລ້ວ. ມັນອາດໃຊ້ເວລາຫຼາຍນາທີເພື່ອເປີດນຳໃຊ້ເຄືອຂ່າຍມືຖືຂອງທ່ານ.</translation> <translation id="5206215183583316675">ລຶບ "<ph name="CERTIFICATE_NAME" />" ບໍ?</translation> <translation id="520621735928254154">ການນຳເຂົ້າໃບຢັ້ງຢືນຜິດພາດ</translation> <translation id="5206787458656075734">{COUNT,plural, =1{ປ່ຽນລະຫັດຜ່ານທີ່ຖືກລະເມີດສຳເລັດແລ້ວ. ທ່ານມີລະຫັດຜ່ານທີ່ຖືກລະເມີດອີກ # ລາຍການ. Chrome ແນະນຳໃຫ້ກວດເບິ່ງລະຫັດຜ່ານນີ້ໃນຕອນນີ້ເລີຍ.}other{ປ່ຽນລະຫັດຜ່ານທີ່ຖືກລະເມີດສຳເລັດແລ້ວ. ທ່ານມີລະຫັດຜ່ານທີ່ຖືກລະເມີດອີກ # ລາຍການ. Chrome ແນະນຳໃຫ້ກວດເບິ່ງລະຫັດຜ່ານເຫຼົ່ານີ້ໃນຕອນນີ້ເລີຍ.}}</translation> @@ -4341,6 +4352,7 @@ <translation id="5935656526031444304">ຈັດການ Safe Browsing</translation> <translation id="5938002010494270685">ມີການອັບເກຣດຄວາມປອດໄພ</translation> <translation id="5939518447894949180">ຕັ້ງຄ່າຄືນໃໝ່</translation> +<translation id="5939719276406088041">ບໍ່ສາມາດສ້າງທາງລັດໄດ້</translation> <translation id="5941153596444580863">ເພີ່ມບຸກຄົນ...</translation> <translation id="5941343993301164315">ກະລຸນາລົງຊື່ເຂົ້າໃຊ້<ph name="TOKEN_NAME" />.</translation> <translation id="5941711191222866238">ຫຍໍ້ລົງ</translation> @@ -4428,6 +4440,7 @@ <translation id="6043994281159824495">ອອກຈາກລະບົບ ດຽວນີ້</translation> <translation id="6044805581023976844"><ph name="APP_NAME" /> ກຳລັງແບ່ງປັນແຖບ Chrome ແລະ ສຽງກັບ <ph name="TAB_NAME" />.</translation> <translation id="6045114302329202345">ປຸ່ມ TrackPoint ຫຼັກ</translation> +<translation id="6047632800149092791">ການຊິ້ງຂໍ້ມູນໃຊ້ບໍ່ໄດ້. ລອງອອກຈາກລະບົບແລ້ວເຂົ້າສູ່ລະບົບຄືນໃໝ່.</translation> <translation id="6049004884579590341">ກົດ |<ph name="ACCELERATOR" />| ຄ້າງໄວ້ເພື່ອອອກຈາກໜ້າຈໍເຕັມ</translation> <translation id="6051354611314852653">ອຸ້ຍ! ລະບົບໃຫ້ສິດການເຂົ້າຫາ API ສໍາລັບອຸປະກອນນີ້ບໍ່ໄດ້.</translation> <translation id="6052976518993719690">ໜ່ວຍງານໃຫ້ການຢັ້ງຢືນ SSL</translation> @@ -4520,6 +4533,7 @@ <translation id="6143186082490678276">ເອົາການຊ່ວຍເຫຼືອ</translation> <translation id="6143366292569327983">ເລືອກພາສາຂອງໜ້າທີ່ຈະແປຈາກ</translation> <translation id="6144938890088808325">ຊ່ວຍພວກເຮົາປັບປຸງ Chromebooks</translation> +<translation id="6146409560350811147">ການຊິ້ງຂໍ້ມູນໃຊ້ບໍ່ໄດ້. ກະລຸນາລອງເຂົ້າສູ່ລະບົບອີກເທື່ອໜຶ່ງ.</translation> <translation id="6147020289383635445">ເບິ່ງຕົວຢ່າງກ່ອນພິມບໍ່ສໍາເລັດ.</translation> <translation id="6148576794665275391">ເປີດດຽວນີ້</translation> <translation id="6149015141270619212">ບໍ່ສາມາດເຊື່ອມຕໍ່ກັບອິນເຕີເນັດໄດ້</translation> @@ -4587,6 +4601,7 @@ <translation id="6232017090690406397">ແບັດເຕີຣີ</translation> <translation id="6232116551750539448">ການເຊື່ອມຕໍ່ກັບ <ph name="NAME" /> ຖືກຕັດໄປແລ້ວ</translation> <translation id="6233154960150021497">ເຮັດໃຫ້ການໃຊ້ສຽງແທນແປ້ນພິມເປັນຄ່າເລີ່ມຕົ້ນ</translation> +<translation id="6234108445915742946">ຂໍ້ກຳນົດບໍລິການຂອງ Chrome ຈະມີການປ່ຽນແປງໃນວັນທີ 31 ມີນາ</translation> <translation id="6234474535228214774">ລໍຖ້າການຕິດຕັ້ງ</translation> <translation id="6237474966939441970">ແອັບຈົດບັນທຶກດ້ວຍປາຍປາກກາ</translation> <translation id="6237816943013845465">ອະນຸຍາດໃຫ້ທ່ານປັບຄວາມລະອຽດໜ້າຈໍຂອງທ່ານ</translation> @@ -4886,6 +4901,7 @@ <translation id="656293578423618167">ຊ່ອງທາງ ຫຼືຊື່ໄຟລ໌ຍາວເກີນໄປ. ກະລຸນາບັນທຶກດ້ວຍຊື່ທີ່ສັ້ນກ່ວາ ຫຼືໄປໃສ່ທີ່ຕັ້ງອື່ນ.</translation> <translation id="6563469144985748109">ຜູ້ຈັດການຂອງທ່ານຍັງບໍ່ທັນອະນຸມັດມັນເທື່ອ</translation> <translation id="6569934958368283244">ບຸກຄົນອື່ນ</translation> +<translation id="6573497332121198392">ບໍ່ສາມາດລຶບທາງລັດອອກໄດ້</translation> <translation id="657402800789773160">ໂຫຼດຫນ້ານີ້ຄືນອີກ</translation> <translation id="6577284282025554716">ຍົກເລີກການດາວໂຫຼດແລ້ວ: <ph name="FILE_NAME" /></translation> <translation id="657866106756413002">ສະແນັບຊັອດສະຖານະພາບເຄືອຂ່າຍ</translation> @@ -4893,6 +4909,7 @@ <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> - ແບ່ງປັນເນື້ອຫາໃນເດັສທັອບແລ້ວ</translation> <translation id="6580203076670148210">ຄວາມໄວການສະແກນ</translation> <translation id="6582080224869403177">ຣິເຊັດ <ph name="DEVICE_TYPE" /> ຂອງທ່ານເພື່ອອັບເກຣດຄວາມປອດໄພຂອງທ່ານ.</translation> +<translation id="6582274660680936615">ທ່ານກໍາລັງທ່ອງເວັບໃນຖານະແຂກ</translation> <translation id="6584878029876017575">ການເຊັນຕະຫຼອດຊີວິດຂອງ Microsoft</translation> <translation id="6586099239452884121">ການທ່ອງເວັບແບບເປັນແຂກ</translation> <translation id="6586451623538375658">ແລກປ່ຽນປຸ່ມເມົາສ໌ຕົ້ນຕໍ</translation> @@ -5062,6 +5079,7 @@ <translation id="6782468519961184511">ຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານບໍ່ອະນຸຍາດໃຫ້ໃຊ້ບັນຊີ Google ເພີ່ມເຕີມ</translation> <translation id="6785518634832172390">PIN ຕ້ອງມີ 12 ຕົວເລກລົງມາ</translation> <translation id="6786747875388722282">ສ່ວນຂະຫຍາຍ</translation> +<translation id="6787097042755590313">ແຖບອື່ນໆ</translation> <translation id="6787839852456839824">ທາງລັດຄີບອດ</translation> <translation id="6788210894632713004">ສ່ວນຂະຫຍາຍທີ່ແກະກ່ອງແລ້ວ</translation> <translation id="6789592661892473991">ແຍກຕາມລວງນອນ</translation> @@ -5072,6 +5090,7 @@ <translation id="6793723358811598107">ມີການກຳນົດ '<ph name="CURRENTKEY" />' ໃຫ້ຄຳສັ່ງ '<ph name="ACTION" />' ແລ້ວ. ກົດປຸ່ມໃດໆກໍໄດ້ເພື່ອອອກ.</translation> <translation id="6795884519221689054">ແພນດ້າ</translation> <translation id="6797493596609571643">ອຸ້ຍ, ມີບາງອັນຜິດພາດ.</translation> +<translation id="6798420440063423019">ກະແຈຄວາມປອດໄພຖືກລັອກໄວ້ເນື່ອງຈາກມີການປ້ອນ PIN ບໍ່ຖືກຕ້ອງຫຼາຍເທື່ອເກີນໄປ. ທ່ານຈະຕ້ອງຣີເຊັດກະແຈຄວາມປອດໄພຂອງທ່ານ.</translation> <translation id="6798578729981748444">ເພື່ອສຳເລັດການນຳເຂົ້າ, ກະລຸນາປິດໜ້າຈໍ Firefox ທັງໝົດ.</translation> <translation id="6798780071646309401">Caps Lock ເປີດຢູ່</translation> <translation id="6798954102094737107">ປລັກອິນ: <ph name="PLUGIN_NAME" /></translation> @@ -5417,6 +5436,7 @@ <translation id="7180865173735832675">ກໍານົດເອງ</translation> <translation id="7182791023900310535">ຍ້າຍລະຫັດຜ່ານຂອງທ່ານ</translation> <translation id="7186088072322679094">ຮັກສາໄວ້ຢູ່ໃນແຖບເຄື່ອງມື</translation> +<translation id="7186303001964993981"><ph name="ORIGIN" /> ບໍ່ສາມາດເປີດໂຟນເດີນີ້ໄດ້ເນື່ອງຈາກມັນມີໄຟລ໌ລະບົບ</translation> <translation id="7187428571767585875">ລາຍການໃນທະບຽນທີ່ຈະຖືກລຶບອອກ ຫຼື ປ່ຽນແປງ:</translation> <translation id="7187855807420906517">ຫຼັງຈາກທີ່ທ່ານອອກໄປ ຫຼື ອອບລາຍແລ້ວ, ໂດຍປົກກະຕິ ເວັບໄຊຈະສືບຕໍ່ຊິ້ງຂໍ້ມູນເພື່ອເຮັດສຳເລັດໜ້າວຽກ ເຊັ່ນ: ໂຫຼດຮູບພາບ ຫຼື ສົ່ງຂໍ້ຄວາມສົນທະນາ</translation> <translation id="7189234443051076392">ກວດໃຫ້ແນ່ໃຈວ່າມີພື້ນທີ່ຫວ່າງພຽງພໍໃນອຸປະກອນຂອງທ່ານ</translation> @@ -6036,6 +6056,7 @@ <translation id="7871109039747854576">ໃຊ້ປຸ່ມ <ph name="COMMA" /> ແລະ <ph name="PERIOD" /> ເພື່ອສົ່ງສັນຍານຕິດຕາມລາຍຊື່ຕົວເລືອກ</translation> <translation id="787268756490971083">ປິດ</translation> <translation id="7874257161694977650">ພື້ນຫຼັງ Chrome</translation> +<translation id="7876027585589532670">ບໍ່ສາມາດແກ້ໄຂທາງລັດໄດ້</translation> <translation id="7877451762676714207">ການຜິດພາດຂອງເຊີບເວີທີ່ບໍ່ຮູ້ຈັກ. ກະລຸນາລອງໃໝ່ອີກ, ຫຼືຕິດຕໍ່ຫາຜູ້ຄວບຄຸມເຊີບເວີ.</translation> <translation id="7879631849810108578">ທາງລັດທີ່ຕັ້ງຄ່າ: <ph name="IDS_SHORT_SET_COMMAND" /></translation> <translation id="7880823633812189969">ຂໍ້ມູນພາຍໃນເຄື່ອງຈະຖືກລຶບເມື່ອທ່ານປິດເປີດຄືນໃໝ່</translation> @@ -6321,6 +6342,7 @@ <translation id="8189750580333936930">ກ່ອງຊາຍຄວາມເປັນສ່ວນຕົວ</translation> <translation id="8190193592390505034">ກໍາລັງເຊື່ອມຕໍ່ກັບ <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">ຈັດການແອັບ, ສ່ວນຂະຫຍາຍ, ແລະເທມຂອງທ່ານ</translation> +<translation id="8192944472786724289"><ph name="APP_NAME" /> ຕ້ອງການແບ່ງປັນເນື້ອຫາໜ້າຈໍຂອງທ່ານ.</translation> <translation id="8195027750202970175">ຂະໜາດໃນດິສ</translation> <translation id="8198323535106903877">ພວກເຮົາຈະຕິດຕັ້ງແອັບ <ph name="NUMBER_OF_APPS" /> ເຫຼົ່ານີ້ໃຫ້ທ່ານ</translation> <translation id="8199300056570174101">ຄຸນລັກສະນະຂອງເຄືອຂ່າຍ (ການບໍລິການ) ແລະ ອຸປະກອນ</translation> @@ -6970,6 +6992,7 @@ <translation id="8931475688782629595">ຈັດການສິ່ງທີ່ທ່ານຊິ້ງຂໍ້ມູນ</translation> <translation id="8932654652795262306">ລາຍລະອຽດການປ່ອຍສັນຍານທັນທີ</translation> <translation id="8932894639908691771">ຕົວເລືອກການເຂົ້າເຖິງດ້ວຍປຸ່ມ</translation> +<translation id="893298445929867520">ເຊື່ອງກະຕ່າໄວ້ແລ້ວ. ພວກມັນຈະປາກົດຂຶ້ນມາອີກເມື່ອທ່ານສ້າງການປ່ຽນແປງ.</translation> <translation id="8933960630081805351">ສະແດງຢູ່ໃນຕົວຊອກຫາ</translation> <translation id="8934732568177537184">ສືບຕໍ່</translation> <translation id="8938306522009698937">ຕົວຈັດການ</translation> @@ -7246,6 +7269,7 @@ <translation id="942532530371314860"><ph name="APP_NAME" /> ກຳລັງແບ່ງປັນແຖບ Chrome ແລະ ສຽງ.</translation> <translation id="945522503751344254">ສົ່ງຄໍາຄິດເຫັນ</translation> <translation id="947329552760389097">&ກວດກາອົງປະກອບ</translation> +<translation id="947667444780368238"><ph name="ORIGIN" /> ບໍ່ສາມາດເປີດໄຟລ໌ໃນໂຟນເດີນີ້ໄດ້ເນື່ອງຈາກມັນມີໄຟລ໌ລະບົບ</translation> <translation id="951991426597076286">ປະຕິເສດ</translation> <translation id="956500788634395331">ທ່ານໄດ້ຮັບການປົກປ້ອງຈາກສ່ວນຂະຫຍາຍທີ່ອາດຈະເປັນອັນຕະລາຍ</translation> <translation id="957960681186851048">ເວັບໄຊນີ້ໄດ້ພະຍາຍາມດາວໂຫຼດຫຼາຍໄຟລ໌ໂດຍອັດຕະໂນມັດ</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index 6e6a42f..f21f11c 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -578,6 +578,7 @@ <translation id="1627408615528139100">Jau atsisiųsta</translation> <translation id="1628948239858170093">Nuskaityti failą prieš atidarant?</translation> <translation id="1629314197035607094">Slaptažodis nebegalioja</translation> +<translation id="1629521517399325891">Naudotojo sertifikatas nepasiekiamas tinklo autentifikavimui.</translation> <translation id="163072119192489970">Leidžiama baigti siųsti ar gauti duomenis</translation> <translation id="1630768113285622200">Paleisti iš naujo ir tęsti</translation> <translation id="1632082166874334883">Slaptažodis išsaugotas „Google“ paskyroje</translation> @@ -1182,6 +1183,7 @@ <translation id="2300383962156589922">„<ph name="APP_NAME" />“ tinkinimas ir valdymas</translation> <translation id="2301382460326681002">Plėtinio šakninis katalogas neteisingas.</translation> <translation id="23030561267973084">„<ph name="EXTENSION_NAME" />“ pateikė papildomų leidimų užklausą.</translation> +<translation id="230529452743010958">Šis elementas rodomas atsižvelgiant į jūsų ankstesnę veiklą naudojant „Google“ paslaugas. Galite peržiūrėti ar ištrinti duomenis bei keisti nustatymus apsilankę adresu <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="23055578400314116">Pasirinkite naudotojo vardą</translation> <translation id="2307462900900812319">Konfigūruoti tinklą</translation> <translation id="230927227160767054">Puslapis prašo leidimo įdiegti paslaugos doroklę.</translation> @@ -1408,6 +1410,7 @@ <translation id="2541706104884128042">Nustatytas naujas laikas eiti miegoti</translation> <translation id="2542050502251273923">Nustato tinklo ryšio valdytojo derinimo lygį ir kitas paslaugas, naudojančias „ff_debug“.</translation> <translation id="2544292303401268586">Administratorius pateikė užklausą paleisti įrenginį iš naujo, kad būtų atnaujintos programos. Tai gali užtrukti kelias minutes.</translation> +<translation id="2544352060595557290">Šis skirtukas</translation> <translation id="2544853746127077729">Autentifikavimo sertifikatą atmetė tinklas</translation> <translation id="2546283357679194313">Slapukai ir svetainės duomenys</translation> <translation id="2548347166720081527">Leidžiama: <ph name="PERMISSION" /></translation> @@ -1573,6 +1576,7 @@ <translation id="2734760316755174687"><ph name="SITE_GROUP_NAME" /> svetainės taip pat bus nustatytos iš naujo.</translation> <translation id="2735712963799620190">Tvarkaraštis</translation> <translation id="2737363922397526254">Sutraukti...</translation> +<translation id="2737916598897808047">„<ph name="APP_NAME" />“ nori bendrinti ekrano turinį su <ph name="TARGET_NAME" />.</translation> <translation id="2738771556149464852">Iki</translation> <translation id="2739191690716947896">Derinti</translation> <translation id="2739240477418971307">Keisti pasiekiamumo nustatymus</translation> @@ -2401,6 +2405,7 @@ <translation id="3677911431265050325">Pateikti užklausą dėl svetainės mobiliesiems</translation> <translation id="3677959414150797585">Įtraukiami tinklalapiai, programos ir daugiau. Siunčiama statistika siekiant patobulinti pasiūlymus, tik jei pasirinkote bendrinti naudojimo duomenis.</translation> <translation id="3678156199662914018">Plėtinys: <ph name="EXTENSION_NAME" /></translation> +<translation id="3678188444105291936">Puslapiai, kuriuos peržiūrite šiame lange, nerodomi naršyklės istorijoje. Kai atsijungsite, kompiuteryje neliks ir kitų jų pėdsakų, pvz., slapukų. Atsisiųsti failai ir sukurtos žymės nebus išsaugoti.</translation> <translation id="3680683624079082902">Teksto į kalbą balsas</translation> <translation id="3681311097828166361">Dėkojame už atsiliepimus. Dabar esate neprisijungę, todėl jūsų pranešimas bus išsiųstas vėliau.</translation> <translation id="3682824389861648626">Judesių slenkstis</translation> @@ -2602,6 +2607,7 @@ <translation id="3884152383786131369">Žiniatinklio turiniui, kuris pasiekiamas keliomis kalbomis, bus naudojama pirma palaikoma kalba iš šio sąrašo. Šios nuostatos sinchronizuojamos su naršyklės nustatymais. <ph name="BEGIN_LINK_LEARN_MORE" />Sužinokite daugiau<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3886446263141354045">Jūsų užklausa pasiekti šią svetainę išsiųsta <ph name="NAME" />.</translation> <translation id="3888550877729210209">Užrašų kūrimas naudojant „<ph name="LOCK_SCREEN_APP_NAME" />“</translation> +<translation id="3888586133700543064">Ši informacija padeda mums geriau suprasti jums iškilusią Padėjėjo problemą. Ji saugoma iki 90 dienų ir ją gali pasiekti tik atitinkami inžinierių ir atsiliepimų komandų nariai.</translation> <translation id="3890064827463908288">Norėdami naudoti „Wi-Fi“ sinchronizavimą, įjunkite „Chrome“ sinchronizavimo funkciją</translation> <translation id="3892414795099177503">Atidaryti „OpenVPN“ / L2TP...</translation> <translation id="3893536212201235195">Skaityti ir keisti pritaikymo neįgaliesiems nustatymus</translation> @@ -2633,6 +2639,7 @@ <translation id="3916445069167113093">Šio tipo failai gali pažeisti kompiuterį. Ar vis tiek norite palikti <ph name="FILE_NAME" />?</translation> <translation id="3918972485393593704">Pranešti išsamią informaciją „Google“</translation> <translation id="3919145445993746351">Jei norite naudoti plėtinius visuose kompiuteriuose, įjunkite sinchronizavimą</translation> +<translation id="3919798653937160644">Puslapiai, kuriuos peržiūrite šiame lange, nerodomi naršyklės istorijoje. Kai uždarysite visus svečio langus, kompiuteryje neliks ir kitų jų pėdsakų, pvz., slapukų, tačiau atsisiųsti failai bus išsaugoti.</translation> <translation id="3920504717067627103">Sertifikato politika</translation> <translation id="392089482157167418">Įgalinti „ChromeVox“ (ekrano skaitymą balsu)</translation> <translation id="3920909973552939961">Neleidžiama įdiegti mokėjimų doroklių</translation> @@ -2970,6 +2977,7 @@ <translation id="4332976768901252016">Tėvų kontrolės nustatymas</translation> <translation id="4333854382783149454">PKCS Nr. 1 SHA-1 su RSA šifruote</translation> <translation id="4336434711095810371">Išvalyti visus duomenis</translation> +<translation id="4340125850502689798">Neteisingas naudotojo vardas</translation> <translation id="4340515029017875942"><ph name="ORIGIN" /> nori užmegzti ryšį su programa „<ph name="EXTENSION_NAME" />“</translation> <translation id="4340575312453649552">Šis skelbimas naudojo per daug įrenginio išteklių, tad „Chrome“ jį pašalino.</translation> <translation id="4341577178275615435">Jei norite įjungti arba išjungti „Caret Browsing“, naudokite spartųjį klavišą F7</translation> @@ -3584,6 +3592,7 @@ <translation id="5057110919553308744">Spustelėjus plėtinį</translation> <translation id="5057403786441168405">Tvarkykite paskyras, prie kurių esate prisijungę. Svetainės, programos ir plėtiniai naršyklėje „Chrome“ ir „Google Play“ gali naudoti šias paskyras jums teikiamoms funkcijoms tinkinti pagal jūsų leidimus. <ph name="LINK_BEGIN" />Sužinokite daugiau<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Prisijungimo apribojimas</translation> +<translation id="5059526285558225588">Pasirinkite, ką norite bendrinti</translation> <translation id="5060332552815861872">Galima išsaugoti 1 spausdintuvą.</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{Šiame aplanke yra žymė. Ar tikrai norite ją ištrinti?}one{Šiame aplanke yra # žymė. Ar tikrai norite jas ištrinti?}few{Šiame aplanke yra # žymės. Ar tikrai norite jas ištrinti?}many{Šiame aplanke yra # žymės. Ar tikrai norite jas ištrinti?}other{Šiame aplanke yra # žymių. Ar tikrai norite jas ištrinti?}}</translation> <translation id="5062930723426326933">Prisijungiant įvyko klaida. Prisijunkite prie interneto ir bandykite dar kartą.</translation> @@ -3700,6 +3709,7 @@ <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">Atgaivinkite mėgstamiausius prisiminimus. Norėdami pridėti ar redaguoti albumus, eikite į <ph name="LINK_BEGIN" />„Google“ nuotraukas<ph name="LINK_END" />.</translation> <translation id="5190926251776387065">Suaktyvinti prievadą</translation> +<translation id="5191094172448199359">Įvesti PIN kodai neatitinka</translation> <translation id="5191251636205085390">Sužinokite apie naujas technologijas, kurios pakeis trečiųjų šalių slapukus, ir valdykite jas</translation> <translation id="51918995459521422"><ph name="ORIGIN" /> nori atsisiųsti kelis failus</translation> <translation id="5192062846343383368">Atidarykite programą „Family Link“ ir peržiūrėkite priežiūros nustatymus</translation> @@ -3712,6 +3722,7 @@ <translation id="5204673965307125349">Vykdykite „Powerwash“ ir bandykite dar kartą.</translation> <translation id="5204967432542742771">Įveskite slaptažodį</translation> <translation id="5205484256512407285">Niekada nenaudoti mobiliojo ryšio duomenų perkeliant</translation> +<translation id="520568280985468584">Tinklas pridėtas sėkmingai. Gali užtrukti kelias minutes, kol mobiliojo ryšio tinklas taps aktyvus.</translation> <translation id="5206215183583316675">Ištrinti „<ph name="CERTIFICATE_NAME" />“?</translation> <translation id="520621735928254154">Sertifikato importavimo klaida</translation> <translation id="5206787458656075734">{COUNT,plural, =1{Pažeistas slaptažodis sėkmingai pakeistas. Turite dar # pažeistą slaptažodį. „Chrome“ rekomenduoja patikrinti šį slaptažodį dabar.}one{Pažeistas slaptažodis sėkmingai pakeistas. Turite dar # pažeistą slaptažodį. „Chrome“ rekomenduoja patikrinti šiuos slaptažodžius dabar.}few{Pažeistas slaptažodis sėkmingai pakeistas. Turite dar # pažeistus slaptažodžius. „Chrome“ rekomenduoja patikrinti šiuos slaptažodžius dabar.}many{Pažeistas slaptažodis sėkmingai pakeistas. Turite dar # pažeisto slaptažodžio. „Chrome“ rekomenduoja patikrinti šiuos slaptažodžius dabar.}other{Pažeistas slaptažodis sėkmingai pakeistas. Turite dar # pažeistų slaptažodžių. „Chrome“ rekomenduoja patikrinti šiuos slaptažodžius dabar.}}</translation> @@ -4347,6 +4358,7 @@ <translation id="5935656526031444304">Tvarkyti Saugaus naršymo funkciją</translation> <translation id="5938002010494270685">Yra saugos naujovinimas</translation> <translation id="5939518447894949180">Nustatyti iš naujo</translation> +<translation id="5939719276406088041">Nepavyksta sukurti sparčiojo klavišo</translation> <translation id="5941153596444580863">Pridėti asmenį...</translation> <translation id="5941343993301164315">Prisijunkite prie <ph name="TOKEN_NAME" />.</translation> <translation id="5941711191222866238">Sumažinti</translation> @@ -4434,6 +4446,7 @@ <translation id="6043994281159824495">Atsijungti dabar</translation> <translation id="6044805581023976844">„<ph name="APP_NAME" />“ bendrina „Chrome“ skirtuką ir garsą su <ph name="TAB_NAME" />.</translation> <translation id="6045114302329202345">Pagrindinis „TrackPoint“ mygtukas</translation> +<translation id="6047632800149092791">Sinchronizavimas neveikia. Bandykite atsijungti ir vėl prisijungti.</translation> <translation id="6049004884579590341">Paspauskite ir palaikykite |<ph name="ACCELERATOR" />|, kad išeitumėte iš viso ekrano režimo.</translation> <translation id="6051354611314852653">Oi, sistemai suteikiant prieigą prie šio įrenginio API įvyko klaida.</translation> <translation id="6052976518993719690">SSL sertifikavimo įstaiga</translation> @@ -4526,6 +4539,7 @@ <translation id="6143186082490678276">Gauti pagalbos</translation> <translation id="6143366292569327983">Pasirinkite puslapio kalbą, iš kurios norite versti</translation> <translation id="6144938890088808325">Padėkite mums tobulinti „Chromebook“ kompiuterius</translation> +<translation id="6146409560350811147">Sinchronizavimas neveikia. Bandykite prisijungti dar kartą.</translation> <translation id="6147020289383635445">Įvyko spaudinio peržiūros klaida.</translation> <translation id="6148576794665275391">Atidaryti dabar</translation> <translation id="6149015141270619212">Nepavyksta prisijungti prie interneto</translation> @@ -4593,6 +4607,7 @@ <translation id="6232017090690406397">Akumuliatorius</translation> <translation id="6232116551750539448">Ryšys su „<ph name="NAME" />“ nutrūko</translation> <translation id="6233154960150021497">Numatyta naudoti balsą, o ne klaviatūrą</translation> +<translation id="6234108445915742946">Kovo 31 d. bus pakeistos „Chrome“ paslaugų teikimo sąlygos</translation> <translation id="6234474535228214774">Laukiama, kol bus įdiegta</translation> <translation id="6237474966939441970">Užrašų rašymo rašikliu programa</translation> <translation id="6237816943013845465">Leidžiama koreguoti ekrano skyrą</translation> @@ -4892,6 +4907,7 @@ <translation id="656293578423618167">Failo kelias arba pavadinimas per ilgas. Išsaugokite nurodę trumpesnį pavadinimą arba kitoje vietoje.</translation> <translation id="6563469144985748109">Jūsų valdytojas dar jos nepatvirtino</translation> <translation id="6569934958368283244">Kiti žmonės</translation> +<translation id="6573497332121198392">Negalima pašalinti sparčiojo klavišo</translation> <translation id="657402800789773160">&Iš naujo įkelti šį puslapį</translation> <translation id="6577284282025554716">Atsisiuntimas atšauktas: <ph name="FILE_NAME" /></translation> <translation id="657866106756413002">Tinklo būsenos glausta informacija</translation> @@ -4899,6 +4915,7 @@ <translation id="6579705087617859690">„<ph name="WINDOW_TITLE" />“ – darbalaukio turinys bendrinamas</translation> <translation id="6580203076670148210">Nuskaitymo sparta</translation> <translation id="6582080224869403177">Nustatykite „<ph name="DEVICE_TYPE" />“ įrenginį iš naujo, kad būtų galima naujovinti saugos sistemą.</translation> +<translation id="6582274660680936615">Naršote kaip svečias</translation> <translation id="6584878029876017575">„Microsoft“ pasirašymas visam laikui</translation> <translation id="6586099239452884121">Svečio naršymas</translation> <translation id="6586451623538375658">Sukeisti pagrindinį pelės klavišą</translation> @@ -5068,6 +5085,7 @@ <translation id="6782468519961184511">Jūsų administratorius neleidžia naudoti papildomų „Google“ paskyrų</translation> <translation id="6785518634832172390">PIN kodą turi sudaryti ne daugiau nei 12 skaitmenų</translation> <translation id="6786747875388722282">Plėtiniai</translation> +<translation id="6787097042755590313">Kitas skirtukas</translation> <translation id="6787839852456839824">Spartieji klavišai</translation> <translation id="6788210894632713004">Nesupakuotas plėtinys</translation> <translation id="6789592661892473991">Horizontalus skaidymas</translation> @@ -5078,6 +5096,7 @@ <translation id="6793723358811598107">Klavišas „<ph name="CURRENTKEY" />“ jau priskirtas veiksmui „<ph name="ACTION" />“. Paspauskite bet kurį klavišą, kad išeitumėte.</translation> <translation id="6795884519221689054">Panda</translation> <translation id="6797493596609571643">Oi, kažkas ne taip.</translation> +<translation id="6798420440063423019">Saugos raktas užblokuotas, nes per daug kartų įvestas neteisingas PIN kodas. Turėsite nustatyti saugos raktą iš naujo.</translation> <translation id="6798578729981748444">Kad užbaigtumėte importuoti, uždarykite visus „Firefox“ langus.</translation> <translation id="6798780071646309401">didžiųjų raidžių klavišas paspaustas</translation> <translation id="6798954102094737107">Papildinys: „<ph name="PLUGIN_NAME" />“</translation> @@ -5423,6 +5442,7 @@ <translation id="7180865173735832675">Tinkinti</translation> <translation id="7182791023900310535">Perkelti slaptažodį</translation> <translation id="7186088072322679094">Laikyti įrankių juostoje</translation> +<translation id="7186303001964993981"><ph name="ORIGIN" /> negali atidaryti šio aplanko, nes jame yra sistemos failų</translation> <translation id="7187428571767585875">Registro vertės, kurios bus pašalintos arba pakeistos:</translation> <translation id="7187855807420906517">Jums išėjus ar atsijungus, paprastai svetainėse toliau sinchronizuojama, kad būtų užbaigtos užduotys, pvz., įkeltos nuotraukos arba išsiųstas pokalbio pranešimas</translation> <translation id="7189234443051076392">Įsitikinkite, kad įrenginyje yra pakankamai vietos</translation> @@ -6043,6 +6063,7 @@ <translation id="7871109039747854576">Naudokite klavišus „<ph name="COMMA" />“ ir „<ph name="PERIOD" />“, jei norite peržiūrėti kandidatų sąrašą</translation> <translation id="787268756490971083">Išjungta</translation> <translation id="7874257161694977650">„Chrome“ fonai</translation> +<translation id="7876027585589532670">Negalima redaguoti sparčiojo klavišo</translation> <translation id="7877451762676714207">Nežinoma serverio klaida. Bandykite dar kartą arba susisiekite su serverio administratoriumi.</translation> <translation id="7879631849810108578">Spartusis klavišas nustatytas: <ph name="IDS_SHORT_SET_COMMAND" /></translation> <translation id="7880823633812189969">Vietiniai duomenys bus ištrinti paleidus iš naujo</translation> @@ -6329,6 +6350,7 @@ <translation id="8189750580333936930">Privatumo „sandbox“ (smėlio dėžė)</translation> <translation id="8190193592390505034">Jungiamasi prie „<ph name="PROVIDER_NAME" />“</translation> <translation id="8191230140820435481">Valdyti programas, plėtinius ir temas</translation> +<translation id="8192944472786724289">„<ph name="APP_NAME" />“ nori bendrinti ekrano turinį.</translation> <translation id="8195027750202970175">Diske užimama vieta</translation> <translation id="8198323535106903877">Įdiegsime jums šias programas (iš viso: <ph name="NUMBER_OF_APPS" />)</translation> <translation id="8199300056570174101">Tinklo (paslaugos) ir įrenginio nuosavybės</translation> @@ -6981,6 +7003,7 @@ <translation id="8931475688782629595">Sinchronizuojamo turinio tvarkymas</translation> <translation id="8932654652795262306">Išsami momentinio įrenginio kaip modemo naudojimo informacija</translation> <translation id="8932894639908691771">Prieigos jungikliu parinktys</translation> +<translation id="893298445929867520">Krepšeliai paslėpti. Jie bus vėl rodomi, kai atliksite pakeitimus.</translation> <translation id="8933960630081805351">&Rodyti ieškojimo priemonėje</translation> <translation id="8934732568177537184">Tęsti</translation> <translation id="8938306522009698937">doroklės</translation> @@ -7257,6 +7280,7 @@ <translation id="942532530371314860">„<ph name="APP_NAME" />“ bendrina „Chrome“ skirtuką ir garsą.</translation> <translation id="945522503751344254">Siųsti atsiliepimą</translation> <translation id="947329552760389097">&Tikrinti elementus</translation> +<translation id="947667444780368238"><ph name="ORIGIN" /> negali atidaryti šiame aplanke esančių failų, nes aplanke yra sistemos failų</translation> <translation id="951991426597076286">Atmesti</translation> <translation id="956500788634395331">Esate apsaugoti nuo potencialiai žalingų plėtinių</translation> <translation id="957960681186851048">Ši svetainė bandė automatiškai atsisiųsti kelis failus</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index f7469f0d..2a898f2e 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -572,6 +572,7 @@ <translation id="1627408615528139100">നേരത്തേതന്നെ ഡൗൺലോഡുചെയ്തിട്ടുണ്ട്</translation> <translation id="1628948239858170093">തുറക്കുന്നതിന് മുമ്പ് ഫയൽ സ്കാൻ ചെയ്യണോ?</translation> <translation id="1629314197035607094">പാസ്വേഡ് കാലഹരണപ്പെട്ടു</translation> +<translation id="1629521517399325891">നെറ്റ്വർക്ക് പരിശോധിച്ചുറപ്പിക്കലിന് ഉപയോക്തൃ സർട്ടിഫിക്കറ്റ് ലഭ്യമല്ല.</translation> <translation id="163072119192489970">ഡാറ്റ അയയ്ക്കുന്നതും സ്വീകരിക്കുന്നതും പൂർത്തിയാക്കാൻ അനുവദിച്ചിരിക്കുന്നു</translation> <translation id="1630768113285622200">റീസ്റ്റാർട്ട് ചെയ്ത ശേഷം തുടരുക</translation> <translation id="1632082166874334883">പാസ്വേഡ് നിങ്ങളുടെ Google അക്കൗണ്ടിൽ സംഭരിച്ചിരിക്കുന്നു</translation> @@ -1176,6 +1177,7 @@ <translation id="2300383962156589922"><ph name="APP_NAME" /> ഇഷ്ടാനുസൃതമാക്കുകയും നിയന്ത്രിക്കുകയും ചെയ്യുക</translation> <translation id="2301382460326681002">വിപുലീകരണ റൂട്ട് ഡയറക്റ്ററി അസാധുവാണ്.</translation> <translation id="23030561267973084">"<ph name="EXTENSION_NAME" />" കൂടുതൽ അനുമതികൾ അഭ്യർത്ഥിച്ചു.</translation> +<translation id="230529452743010958">Google സേവനങ്ങൾ ഉപയോഗിച്ചപ്പോഴുള്ള നിങ്ങളുടെ മുമ്പത്തെ ആക്റ്റിവിറ്റിയുടെ അടിസ്ഥാനത്തിലാണ് നിങ്ങൾ ഈ ഇനം കാണുന്നത്. <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> -ൽ നിങ്ങളുടെ ഡാറ്റ കാണാനും ഇല്ലാതാക്കാനും ക്രമീകരണം മാറ്റാനും കഴിയും.</translation> <translation id="23055578400314116">ഒരു ഉപയോക്തൃനാമം തിരഞ്ഞെടുക്കുക</translation> <translation id="2307462900900812319">നെറ്റ്വർക്ക് കോൺഫിഗർ ചെയ്യുക</translation> <translation id="230927227160767054">ഈ പേജ് ഒരു സേവന ഹാൻഡ്ലർ ഇൻസ്റ്റാൾ ചെയ്യാൻ താൽപ്പര്യപ്പെടുന്നു.</translation> @@ -1402,6 +1404,7 @@ <translation id="2541706104884128042">പുതിയ ഉറക്ക സമയം സജ്ജീകരിച്ചു</translation> <translation id="2542050502251273923">ff_debug ഉപയോഗിച്ച് നെറ്റ്വർക്ക് കണക്ഷൻ മാനേജരുടെയും മറ്റ് സേവനങ്ങളുടെയും ഡീബഗ്ഗ് ചെയ്യൽ നില സജ്ജീകരിക്കുന്നു.</translation> <translation id="2544292303401268586">ആപ്പുകൾ അപ്ഡേറ്റ് ചെയ്യുന്നതിന്, ഉപകരണം റീസ്റ്റാർട്ട് ചെയ്യാൻ നിങ്ങളുടെ അഡ്മിൻ അഭ്യർത്ഥിച്ചു. ഇത് പൂർത്തിയാകാൻ കുറച്ച് സമയമെടുത്തേക്കാം.</translation> +<translation id="2544352060595557290">ഈ ടാബ്</translation> <translation id="2544853746127077729">നെറ്റ്വർക്ക്, പരിശോധിച്ചുറപ്പിക്കൽ സർട്ടിഫിക്കറ്റ് നിരസിച്ചു</translation> <translation id="2546283357679194313">കുക്കികളും സൈറ്റ് ഡാറ്റയും</translation> <translation id="2548347166720081527"><ph name="PERMISSION" /> അനുവദിച്ചിരിക്കുന്നു</translation> @@ -1567,6 +1570,7 @@ <translation id="2734760316755174687"><ph name="SITE_GROUP_NAME" /> എന്നതിന് കീഴിലുള്ള സൈറ്റുകളും പുനഃസജ്ജീകരിക്കപ്പെടും.</translation> <translation id="2735712963799620190">ഷെഡ്യൂള്</translation> <translation id="2737363922397526254">ചുരുക്കുക...</translation> +<translation id="2737916598897808047">നിങ്ങളുടെ സ്ക്രീനിലെ ഉള്ളടക്കങ്ങൾ <ph name="TARGET_NAME" /> എന്നതുമായി പങ്കിടാൻ <ph name="APP_NAME" /> ആഗ്രഹിക്കുന്നു.</translation> <translation id="2738771556149464852">അതിനുശേഷമല്ല</translation> <translation id="2739191690716947896">ഡീബഗ് ചെയ്യുക</translation> <translation id="2739240477418971307">നിങ്ങളുടെ ഉപയോഗസഹായി ക്രമീകരണങ്ങൾ മാറ്റുക</translation> @@ -2395,6 +2399,7 @@ <translation id="3677911431265050325">മൊബൈൽ സൈറ്റ് അഭ്യർത്ഥിക്കുക</translation> <translation id="3677959414150797585">ആപ്പുകൾ, വെബ്പേജുകൾ തുടങ്ങിയവ ഉൾപ്പെടുന്നു. ഉപയോഗ ഡാറ്റ പങ്കിടാൻ നിങ്ങൾ തിരഞ്ഞെടുത്തിട്ടുണ്ടെങ്കിൽ മാത്രം, നിർദ്ദേശങ്ങൾ മെച്ചപ്പെടുത്താനായി സ്ഥിതിവിവരക്കണക്കുകൾ അയയ്ക്കുന്നു.</translation> <translation id="3678156199662914018">വിപുലീകരണം: <ph name="EXTENSION_NAME" /></translation> +<translation id="3678188444105291936">ഈ വിൻഡോയിൽ കാണുന്ന പേജുകൾ നിങ്ങൾ സൈൻ ഔട്ട് ചെയ്ത ശേഷം ബ്രൗസർ ചരിത്രത്തിൽ ദൃശ്യമാകില്ല, അവ കുക്കികൾ പോലുള്ള മറ്റ് അടയാളങ്ങൾ കമ്പ്യൂട്ടറിൽ അവശേഷിപ്പിക്കുകയുമില്ല. നിങ്ങൾ ഡൗൺലോഡ് ചെയ്യുന്ന ഫയലുകളും സൃഷ്ടിക്കുന്ന ബുക്ക്മാർക്കുകളും സംരക്ഷിക്കില്ല.</translation> <translation id="3680683624079082902">ടെക്സ്റ്റ് ടു സ്പീച്ച് ശബ്ദം</translation> <translation id="3681311097828166361">നിങ്ങളുടെ ഫീഡ്ബാക്കിന് നന്ദി. നിങ്ങളിപ്പോൾ ഓഫ്ലൈനായതിനാൽ, റിപ്പോർട്ട് പിന്നീട് അയയ്ക്കുന്നതാണ്.</translation> <translation id="3682824389861648626">ചലന പരിധി</translation> @@ -2596,6 +2601,7 @@ <translation id="3884152383786131369">ഒന്നിലധികം ഭാഷകളിൽ ലഭ്യമായ വെബ് ഉള്ളടക്കം, ഈ ലിസ്റ്റിലുള്ള പിന്തുണയ്ക്കുന്ന ആദ്യത്തെ ഭാഷ ഉപയോഗിക്കും. ഈ മുൻഗണനകൾ നിങ്ങളുടെ ബ്രൗസർ ക്രമീകരണവുമായി സമന്വയിപ്പിക്കുന്നു. <ph name="BEGIN_LINK_LEARN_MORE" />കൂടുതലറിയുക<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3886446263141354045"><ph name="NAME" /> എന്നയാൾക്ക് ഈ സൈറ്റ് ആക്സസ് ചെയ്യാനുള്ള നിങ്ങളുടെ അഭ്യർത്ഥന അയച്ചു</translation> <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" /> ഉപയോഗിച്ച് കുറിപ്പുകൾ എടുക്കുന്നു</translation> +<translation id="3888586133700543064">Assistant-മായി ബന്ധപ്പെട്ട നിങ്ങളുടെ പ്രശ്നങ്ങൾ കൂടുതൽ മനസ്സിലാക്കാൻ ഈ വിവരങ്ങൾ ഞങ്ങളെ സഹായിക്കുന്നു. ഇത് 90 ദിവസം വരെ സംഭരിക്കുന്നു, ഇതിലേക്കുള്ള ആക്സസ് അനുയോജ്യമായ എഞ്ചിനീയറിംഗ്, ഫീഡ്ബാക്ക് ടീമുകൾക്ക് മാത്രമായി പരിമിതപ്പെടുത്തിയിരിക്കുന്നു.</translation> <translation id="3890064827463908288">വൈഫൈ സമന്വയം ഉപയോഗിക്കാൻ Chrome സമന്വയം ഓണാക്കുക</translation> <translation id="3892414795099177503">OpenVPN / L2TP ചേർക്കുക...</translation> <translation id="3893536212201235195">നിങ്ങളുടെ ഉപയോഗസഹായിയുടെ ക്രമീകരണങ്ങൾ വായിച്ചശേഷം മാറ്റുക</translation> @@ -2627,6 +2633,7 @@ <translation id="3916445069167113093">നിങ്ങളുടെ കമ്പ്യൂട്ടറിനെ ഇത്തരത്തിലുള്ള ഫയൽ ദ്രോഹിച്ചേക്കാം. <ph name="FILE_NAME" /> എന്നത് എന്തായാലും സൂക്ഷിക്കണമെന്നത് തീർച്ചയാണോ?</translation> <translation id="3918972485393593704">വിശദാംശങ്ങൾ Google-ന് റിപ്പോർട്ട് ചെയ്യുക</translation> <translation id="3919145445993746351">എല്ലാ കമ്പ്യൂട്ടറുകളിലും നിങ്ങളുടെ വിപുലീകരണങ്ങൾ ലഭിക്കാൻ, സമന്വയം ഓണാക്കുക</translation> +<translation id="3919798653937160644">ഈ വിൻഡോയിൽ കാണുന്ന പേജുകൾ, നിങ്ങൾ തുറന്ന എല്ലാ അതിഥി വിൻഡോകളും അടച്ച ശേഷം ബ്രൗസർ ചരിത്രത്തിൽ ദൃശ്യമാകില്ല, അവ കുക്കികൾ പോലുള്ള മറ്റ് അടയാളങ്ങൾ കമ്പ്യൂട്ടറിൽ അവശേഷിപ്പിക്കുകയുമില്ല. എന്നിരുന്നാലും നിങ്ങൾ ഡൗൺലോഡ് ചെയ്യുന്ന എല്ലാ ഫയലുകളും സംരക്ഷിക്കും.</translation> <translation id="3920504717067627103">സര്ട്ടിഫിക്കറ്റ് നയങ്ങള്</translation> <translation id="392089482157167418">ChromeVox (സ്പോക്കൺ ഫീഡ്ബാക്ക്) പ്രവർത്തനക്ഷമമാക്കുക</translation> <translation id="3920909973552939961">പേയ്മെന്റ് കൈകാര്യം ചെയ്യുന്ന സംവിധാനങ്ങൾ ഇൻസ്റ്റാൾ ചെയ്യാൻ അനുവാദമില്ല</translation> @@ -2963,6 +2970,7 @@ <translation id="4332976768901252016">രക്ഷാകർതൃ നിയന്ത്രണങ്ങൾ സജ്ജീകരിക്കുക</translation> <translation id="4333854382783149454">RSA എന്ക്രിപ്ഷനോടുകൂടിയ PKCS #1 SHA-1</translation> <translation id="4336434711095810371">എല്ലാ ഡാറ്റയും മായ്ക്കുക</translation> +<translation id="4340125850502689798">ഉപയോക്തൃനാമം അസാധുവാണ്</translation> <translation id="4340515029017875942">"<ph name="EXTENSION_NAME" />" ആപ്പ് ഉപയോഗിച്ച് <ph name="ORIGIN" /> എന്നത് ആശയവിനിമയം നടത്താൻ താൽപ്പര്യപ്പെടുന്നു</translation> <translation id="4340575312453649552">ഈ പരസ്യം നിങ്ങളുടെ ഉപകരണത്തിനുള്ള നിരവധി ഉറവിടങ്ങൾ ഉപയോഗിച്ചതിനാൽ, Chrome അത് നീക്കം ചെയ്തു.</translation> <translation id="4341577178275615435">കാരറ്റ് ബ്രൗസ് ചെയ്യൽ ഓണാക്കാനോ ഓഫാക്കാനോ, F7 എന്ന കുറുക്കുവഴി ഉപയോഗിക്കുക</translation> @@ -3577,6 +3585,7 @@ <translation id="5057110919553308744">നിങ്ങൾ വിപുലീകരണം ക്ലിക്ക് ചെയ്യുമ്പോൾ</translation> <translation id="5057403786441168405">നിങ്ങളുടെ സൈൻ ഇൻ ചെയ്തിരിക്കുന്ന അക്കൗണ്ടുകൾ മാനേജ് ചെയ്യുക. നിങ്ങളുടെ അനുഭവം ഇഷ്ടാനുസൃതമാക്കാൻ Chrome, Google Play എന്നിവയിലെ വെബ്സൈറ്റുകളും ആപ്പുകളും വിപുലീകരണങ്ങളും അനുമതികൾക്കനുസരിച്ച് ഈ അക്കൗണ്ടുകൾ ഉപയോഗിച്ചേക്കാം. <ph name="LINK_BEGIN" />കൂടുതലറിയുക<ph name="LINK_END" /></translation> <translation id="5059241099014281248">സൈൻ ഇൻ ചെയ്യൽ നിയന്ത്രിക്കുക</translation> +<translation id="5059526285558225588">എന്ത് പങ്കിടണമെന്ന് തിരഞ്ഞെടുക്കൂ</translation> <translation id="5060332552815861872">സംരക്ഷിക്കുന്നതിനായി ഒരു പ്രിന്റർ ലഭ്യമാണ്.</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{ഈ ഫോൾഡറിൽ ഒരു ബുക്ക്മാർക്ക് അടങ്ങിയിരിക്കുന്നു. ഇത് ഇല്ലാതാക്കണമെന്ന് നിങ്ങൾക്കുറപ്പാണോ?}other{ഈ ഫോൾഡറിൽ # ബുക്ക്മാർക്കുകൾ അടങ്ങിയിരിക്കുന്നു. ഇത് ഇല്ലാതാക്കണമെന്ന് നിങ്ങൾക്കുറപ്പാണോ?}}</translation> <translation id="5062930723426326933">സൈൻ ഇൻ പരാജയപ്പെട്ടു, ഇന്റർനെറ്റിൽ കണക്റ്റ് ചെയ്തതിനുശേഷം വീണ്ടും ശ്രമിക്കുക.</translation> @@ -3693,6 +3702,7 @@ <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">നിങ്ങളുടെ പ്രിയപ്പെട്ട ഓർമ്മകളെ പുനരുജ്ജീവിപ്പിക്കുക. ആൽബങ്ങൾ ചേർക്കാനോ എഡിറ്റ് ചെയ്യാനോ <ph name="LINK_BEGIN" />Google Photos-ലേക്ക്<ph name="LINK_END" /> പോകുക.</translation> <translation id="5190926251776387065">പോർട്ട് സജീവമാക്കുക</translation> +<translation id="5191094172448199359">നിങ്ങൾ നൽകിയ പിൻ നമ്പറുകൾ പൊരുത്തപ്പെടുന്നില്ല</translation> <translation id="5191251636205085390">മൂന്നാം കക്ഷി കുക്കികൾക്ക് പകരം നിലവിൽ വരാൻ പോകുന്ന പുതിയ സാങ്കേതികവിദ്യകളെക്കുറിച്ച് അറിയുകയും അവയെ നിയന്ത്രിക്കുകയും ചെയ്യുക</translation> <translation id="51918995459521422"><ph name="ORIGIN" />, ഒന്നിലധികം ഫയലുകൾ ഡൗൺലോഡ് ചെയ്യാൻ താൽപ്പര്യപ്പെടുന്നു</translation> <translation id="5192062846343383368">നിങ്ങളുടെ മേൽനോട്ട ക്രമീകരണം കാണാൻ Family Link ആപ്പ് തുറക്കുക</translation> @@ -3705,6 +3715,7 @@ <translation id="5204673965307125349">ഉപകരണം Powerwash ചെയ്ത ശേഷം വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="5204967432542742771">പാസ്വേഡ് നല്കുക</translation> <translation id="5205484256512407285">കൈമാറാൻ ഒരിക്കലും മൊബൈൽ ഡാറ്റ ഉപയോഗിക്കരുത്</translation> +<translation id="520568280985468584">നെറ്റ്വർക്ക് ചേർത്തു. നിങ്ങളുടെ സെല്ലുലാർ നെറ്റ്വർക്ക് സജീവമാകാൻ കുറച്ച് മനിറ്റ് എടുത്തേക്കാം.</translation> <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />" ഇല്ലാതാക്കണോ?</translation> <translation id="520621735928254154">സർട്ടിഫിക്കറ്റ് ഇമ്പോർട്ട് ചെയ്യുന്നതിൽ പിശക്</translation> <translation id="5206787458656075734">{COUNT,plural, =1{അപഹരിക്കപ്പെട്ട പാസ്വേഡ് മാറ്റി. അപഹരിക്കപ്പെട്ട # പാസ്വേഡ് കൂടി നിങ്ങൾക്കുണ്ട്. ഈ പാസ്വേഡ് ഇപ്പോൾ തന്നെ പരിശോധിക്കാൻ Chrome നിർദ്ദേശിക്കുന്നു.}other{അപഹരിക്കപ്പെട്ട പാസ്വേഡ് മാറ്റി. അപഹരിക്കപ്പെട്ട # പാസ്വേഡുകൾ കൂടി നിങ്ങൾക്കുണ്ട്. ഈ പാസ്വേഡുകൾ ഇപ്പോൾ തന്നെ പരിശോധിക്കാൻ Chrome നിർദ്ദേശിക്കുന്നു.}}</translation> @@ -4340,6 +4351,7 @@ <translation id="5935656526031444304">സുരക്ഷിത ബ്രൗസിംഗ് മാനേജ് ചെയ്യുക</translation> <translation id="5938002010494270685">സുരക്ഷാ അപ്ഗ്രേഡ് ലഭ്യമാണ്</translation> <translation id="5939518447894949180">റീസെറ്റ് ചെയ്യുക</translation> +<translation id="5939719276406088041">കുറുക്കുവഴി സൃഷ്ടിക്കാനാകില്ല</translation> <translation id="5941153596444580863">ഉപയോക്താവിനെ ചേർക്കുക...</translation> <translation id="5941343993301164315"><ph name="TOKEN_NAME" /> എന്നതിലേക്ക് ദയവായി പ്രവേശിക്കുക.</translation> <translation id="5941711191222866238">ചെറുതാക്കുക</translation> @@ -4427,6 +4439,7 @@ <translation id="6043994281159824495">ഇപ്പോൾ സൈൻ ഔട്ട് ചെയ്യുക</translation> <translation id="6044805581023976844"><ph name="APP_NAME" />, <ph name="TAB_NAME" /> എന്നതുമായി Chrome ടാബും ഓഡിയോയും പങ്കിടുന്നു.</translation> <translation id="6045114302329202345">പ്രാഥമിക TrackPoint ബട്ടൺ</translation> +<translation id="6047632800149092791">സമന്വയിപ്പിക്കൽ പ്രവർത്തിക്കുന്നില്ല. സൈൻ ഔട്ട് ചെയ്ത ശേഷം വീണ്ടും സൈൻ ഇൻ ചെയ്ത് നോക്കുക.</translation> <translation id="6049004884579590341">പൂർണ്ണ സ്ക്രീനിൽ നിന്ന് പുറത്തുകടക്കാൻ, |<ph name="ACCELERATOR" />| അമർത്തിപ്പിടിക്കുക</translation> <translation id="6051354611314852653">ക്ഷമിക്കണം! ഈ ഉപകരണത്തിന്റെ API ആക്സസ് അംഗീകൃതമാക്കുന്നതിൽ സിസ്റ്റം പരാജയപ്പെട്ടു.</translation> <translation id="6052976518993719690">SSL സര്ട്ടിഫിക്കേഷന് അതോറിറ്റി</translation> @@ -4520,6 +4533,7 @@ <translation id="6143186082490678276">സഹായം നേടുക</translation> <translation id="6143366292569327983">വിവർത്തനം ചെയ്യാൻ പേജ് ഭാഷ തിരഞ്ഞെടുക്കുക</translation> <translation id="6144938890088808325">Chromebooks മെച്ചപ്പെടുത്താൻ ഞങ്ങളെ സഹായിക്കൂ</translation> +<translation id="6146409560350811147">സമന്വയിപ്പിക്കൽ പ്രവർത്തിക്കുന്നില്ല. വീണ്ടും സൈൻ ഇൻ ചെയ്ത് നോക്കുക.</translation> <translation id="6147020289383635445">അച്ചടി പ്രിവ്യൂ പരാജയപ്പെട്ടു.</translation> <translation id="6148576794665275391">ഇപ്പോള് തുറക്കുക</translation> <translation id="6149015141270619212">ഇന്റർനെറ്റ് കണക്റ്റ് ചെയ്യാനാവുന്നില്ല</translation> @@ -4587,6 +4601,7 @@ <translation id="6232017090690406397">ബാറ്ററി</translation> <translation id="6232116551750539448"><ph name="NAME" /> എന്നതിലേക്കുള്ള കണക്ഷൻ നഷ്ടമായി</translation> <translation id="6233154960150021497">കീബോഡിന് പകരം ശബ്ദം ഉപയോഗിക്കുന്നത് ഡിഫോൾട്ടാക്കുക</translation> +<translation id="6234108445915742946">Chrome-ന്റെ സേവന നിബന്ധനകളിൽ മാർച്ച് 31-ന് മാറ്റം വരുന്നു</translation> <translation id="6234474535228214774">ഇൻസ്റ്റാൾ ചെയ്യൽ പൂർത്തിയാക്കിയിട്ടില്ല</translation> <translation id="6237474966939441970">സ്റ്റൈലസ് കുറിപ്പെടുക്കൽ ആപ്പ്</translation> <translation id="6237816943013845465">സ്ക്രീൻ റെസല്യൂഷൻ ക്രമീകരിക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു</translation> @@ -4886,6 +4901,7 @@ <translation id="656293578423618167">ഫയലിന്റെ പാതയോ പേരോ ദൈർഘ്യമേറിയതാണ്. ഹ്രസ്വമായ പേര് ഉപയോഗിച്ചോ മറ്റൊരു ലൊക്കേഷനിലേക്കോ സംരക്ഷിക്കുക.</translation> <translation id="6563469144985748109">നിങ്ങളുടെ മാനേജർ ഇതുവരെ അംഗീകാരം നൽകിയിട്ടില്ല</translation> <translation id="6569934958368283244">മറ്റ് ആളുകൾ</translation> +<translation id="6573497332121198392">കുറുക്കുവഴി നീക്കം ചെയ്യാനാകില്ല</translation> <translation id="657402800789773160">&ഈ പേജ് വീണ്ടും ലോഡ് ചെയ്യുക</translation> <translation id="6577284282025554716">ഡൗൺലോഡ് റദ്ദാക്കി: <ph name="FILE_NAME" /></translation> <translation id="657866106756413002">നെറ്റ്വർക്ക് ഹെൽത്ത് സ്നാപ്പ്ഷോട്ട്</translation> @@ -4893,6 +4909,7 @@ <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> - ഡെസ്ക്ടോപ്പ് ഉള്ളടക്കം പങ്കിട്ടു</translation> <translation id="6580203076670148210">സ്കാനിംഗ് വേഗത</translation> <translation id="6582080224869403177">സുരക്ഷ അപ്ഗ്രേഡ് ചെയ്യാനായി നിങ്ങളുടെ <ph name="DEVICE_TYPE" /> പുനഃക്രമീകരിക്കുക.</translation> +<translation id="6582274660680936615">നിങ്ങൾ ഒരു അതിഥിയായി ബ്രൗസ് ചെയ്യുന്നു</translation> <translation id="6584878029876017575">Microsoft Lifetime Signing</translation> <translation id="6586099239452884121">അതിഥി ബ്രൗസിംഗ്</translation> <translation id="6586451623538375658">പ്രാഥമിക മൗസ് ബട്ടൺ സ്വാപ്പ് ചെയ്യുക</translation> @@ -5062,6 +5079,7 @@ <translation id="6782468519961184511">നിങ്ങളുടെ അഡ്മിൻ കൂടുതൽ Google അക്കൗണ്ടുകൾ അനുവദിക്കുന്നില്ല</translation> <translation id="6785518634832172390">പിൻ 12 അക്കങ്ങളോ അതിൽ കുറവോ ആയിരിക്കണം</translation> <translation id="6786747875388722282">വിപുലീകരണങ്ങള്</translation> +<translation id="6787097042755590313">മറ്റ് ടാബ്</translation> <translation id="6787839852456839824">കീബോർഡ് കുറുക്കുവഴികൾ</translation> <translation id="6788210894632713004">പായ്ക്ക് ചെയ്യാത്ത വിപുലീകരണം</translation> <translation id="6789592661892473991">തിരശ്ചീനമായി വിഭജിക്കുക</translation> @@ -5072,6 +5090,7 @@ <translation id="6793723358811598107">'<ph name="CURRENTKEY" />' മുമ്പേ '<ph name="ACTION" />' എന്ന പ്രവർത്തനത്തിന് അസൈൻ ചെയ്തിരിക്കുന്നു. പുറത്ത് കടക്കാൻ ഏതെങ്കിലും കീ അമർത്തുക.</translation> <translation id="6795884519221689054">Panda</translation> <translation id="6797493596609571643">ക്ഷമിക്കണം, എന്തോ കുഴപ്പം സംഭവിച്ചു.</translation> +<translation id="6798420440063423019">തെറ്റായ പിൻ നിരവധി തവണ നൽകിയതിനാൽ സുരക്ഷാ കീ ലോക്ക് ചെയ്തിരിക്കുന്നു. നിങ്ങൾ സുരക്ഷാ കീ റീസെറ്റ് ചെയ്യേണ്ടതുണ്ട്.</translation> <translation id="6798578729981748444">ഇമ്പോർട്ട് ചെയ്യൽ പൂർത്തിയാക്കാൻ, എല്ലാ Firefox വിന്ഡോകളും അടയ്ക്കുക.</translation> <translation id="6798780071646309401">ക്യാപ്സ് ലോക്ക് ഓണാണ്</translation> <translation id="6798954102094737107">പ്ലഗിൻ: <ph name="PLUGIN_NAME" /></translation> @@ -5417,6 +5436,7 @@ <translation id="7180865173735832675">ഇച്ഛാനുസൃതമാക്കുക</translation> <translation id="7182791023900310535">നിങ്ങളുടെ പാസ്വേഡ് നീക്കുക</translation> <translation id="7186088072322679094">ടൂൾബാറിൽ സൂക്ഷിക്കുക</translation> +<translation id="7186303001964993981">സിസ്റ്റം ഫയലുകൾ അടങ്ങിയിരിക്കുന്നതിനാൽ <ph name="ORIGIN" /> എന്നതിന് ഈ ഫോൾഡർ തുറക്കാനാകില്ല</translation> <translation id="7187428571767585875">നീക്കം ചെയ്യേണ്ടതോ മാറ്റേണ്ടതോ ആയ രജിസ്ട്രി എൻട്രികൾ:</translation> <translation id="7187855807420906517">നിങ്ങൾ സൈറ്റ് വിട്ടതിനോ ഓഫ്ലൈൻ ആയതിനോ ശേഷം, ഫോട്ടോകൾ അപ്ലോഡ് ചെയ്യുന്നതോ ചാറ്റ് സന്ദേശം അയയ്ക്കുന്നതോ പോലുള്ള ടാസ്ക്കുകൾ പൂർത്തിയാക്കാൻ സൈറ്റുകൾ സാധാരണയായി സമന്വയിപ്പിക്കൽ തുടരും</translation> <translation id="7189234443051076392">നിങ്ങളുടെ ഉപകരണത്തിൽ ആവശ്യമായ ഇടം ഉണ്ടെന്ന് ഉറപ്പാക്കുക</translation> @@ -6037,6 +6057,7 @@ <translation id="7871109039747854576">കാൻഡിഡേറ്റ് ലിസ്റ്റ് പേജ് ചെയ്യാൻ <ph name="COMMA" /> കീയും <ph name="PERIOD" /> കീയും ഉപയോഗിക്കൽ</translation> <translation id="787268756490971083">ഓഫാണ്</translation> <translation id="7874257161694977650">Chrome പശ്ചാത്തലങ്ങൾ</translation> +<translation id="7876027585589532670">കുറുക്കുവഴി എഡിറ്റ് ചെയ്യാനാകില്ല</translation> <translation id="7877451762676714207">അജ്ഞാതമായ സെർവർ പിശക്. വീണ്ടും ശ്രമിക്കുകയോ സെർവർ അഡ്മിനിസ്ട്രേറ്ററെ ബന്ധപ്പെടുകയോ ചെയ്യുക.</translation> <translation id="7879631849810108578">കുറുക്കുവഴി സജ്ജീകരിച്ചു: <ph name="IDS_SHORT_SET_COMMAND" /></translation> <translation id="7880823633812189969">നിങ്ങൾ റീസ്റ്റാർട്ട് ചെയ്യുമ്പോൾ ലോക്കൽ ഡാറ്റ ഇല്ലാതാക്കപ്പെടും</translation> @@ -6323,6 +6344,7 @@ <translation id="8189750580333936930">സ്വകാര്യതാ സാൻഡ്ബോക്സ്</translation> <translation id="8190193592390505034"><ph name="PROVIDER_NAME" /> ലേക്ക് ബന്ധിപ്പിക്കുന്നു</translation> <translation id="8191230140820435481">നിങ്ങളുടെ അപ്ലിക്കേഷനുകൾ, വിപുലീകരണങ്ങൾ, തീമുകൾ എന്നിവ നിയന്ത്രിക്കുക</translation> +<translation id="8192944472786724289">നിങ്ങളുടെ സ്ക്രീനിലെ ഉള്ളടക്കങ്ങൾ പങ്കിടാൻ <ph name="APP_NAME" /> ആഗ്രഹിക്കുന്നു.</translation> <translation id="8195027750202970175">ഡിസ്കിലെ വലുപ്പം</translation> <translation id="8198323535106903877">നിങ്ങൾക്കായി ആ <ph name="NUMBER_OF_APPS" /> ആപ്പുകൾ ഞങ്ങൾ ഇൻസ്റ്റാൾ ചെയ്യും</translation> <translation id="8199300056570174101">നെറ്റ്വർക്കും (സേവനം) ഉപകരണ പ്രോപ്പർട്ടികളും</translation> @@ -6971,6 +6993,7 @@ <translation id="8931475688782629595">നിങ്ങൾ സമന്വയിപ്പിക്കുന്നത് മാനേജ് ചെയ്യുക</translation> <translation id="8932654652795262306">തൽക്ഷണ ടെതറിംഗ് വിശദാംശങ്ങള്</translation> <translation id="8932894639908691771">ആക്സസ് ഓപ്ഷനുകൾ മാറുക</translation> +<translation id="893298445929867520">കാർട്ടുകൾ മറച്ചിരിക്കുന്നു. നിങ്ങൾ മാറ്റങ്ങൾ വരുത്തുമ്പോൾ അവ വീണ്ടും ദൃശ്യമാകും.</translation> <translation id="8933960630081805351">&ഫൈന്ഡറില് കാണിക്കുക</translation> <translation id="8934732568177537184">തുടരുക</translation> <translation id="8938306522009698937">കൈകാര്യം ചെയ്യുന്ന സംവിധാനങ്ങൾ</translation> @@ -7247,6 +7270,7 @@ <translation id="942532530371314860"><ph name="APP_NAME" /> Chrome ടാബും ഓഡിയോയും പങ്കിടുന്നു.</translation> <translation id="945522503751344254">ഫീഡ്ബാക്ക് അയയ്ക്കുക</translation> <translation id="947329552760389097">&ഘടകങ്ങൾ പരിശോധിക്കുക</translation> +<translation id="947667444780368238">സിസ്റ്റം ഫയലുകൾ അടങ്ങിയിരിക്കുന്നതിനാൽ <ph name="ORIGIN" /> എന്നതിന് ഈ ഫോൾഡറിലെ ഫയലുകൾ തുറക്കാനാകില്ല</translation> <translation id="951991426597076286">നിരസിക്കുക</translation> <translation id="956500788634395331">ദോഷകരമാകാൻ സാധ്യതയുള്ള വിപുലീകരണങ്ങളിൽ നിന്ന് നിങ്ങളെ സംരക്ഷിച്ചിരിക്കുന്നു</translation> <translation id="957960681186851048">ഈ സൈറ്റ് ഒന്നിലധികം ഫയലുകൾ സ്വയമേവ ഡൗൺലോഡ് ചെയ്യാൻ ശ്രമിച്ചു</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index 3e1e3576..a7269156 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -575,6 +575,7 @@ <translation id="1627408615528139100">Telah pun dimuat turun</translation> <translation id="1628948239858170093">Imbas fail sebelum dibuka?</translation> <translation id="1629314197035607094">Kata laluan tamat tempoh</translation> +<translation id="1629521517399325891">Sijil pengguna tidak tersedia untuk pengesahan rangkaian.</translation> <translation id="163072119192489970">Dibenarkan untuk menyelesaikan penghantaran dan penerimaan data</translation> <translation id="1630768113285622200">Mulakan semula dan teruskan</translation> <translation id="1632082166874334883">Kata laluan disimpan dalam akaun Google anda</translation> @@ -1179,6 +1180,7 @@ <translation id="2300383962156589922">Sesuaikan dan kawal <ph name="APP_NAME" /></translation> <translation id="2301382460326681002">Direktori akar sambungan adalah tidak sah.</translation> <translation id="23030561267973084">"<ph name="EXTENSION_NAME" />" telah meminta kebenaran tambahan.</translation> +<translation id="230529452743010958">Anda melihat item ini berdasarkan aktiviti terdahulu anda menggunakan perkhidmatan Google. Anda dapat melihat data anda, memadamkan data tersebut dan menukar tetapan di <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="23055578400314116">Pilih nama pengguna</translation> <translation id="2307462900900812319">Konfigurasikan rangkaian</translation> <translation id="230927227160767054">Halaman ini mahu memasang pengendali perkhidmatan.</translation> @@ -1405,6 +1407,7 @@ <translation id="2541706104884128042">Waktu tidur baharu ditetapkan</translation> <translation id="2542050502251273923">Menetapkan tahap penyahpepijatan pengurus sambungan rangkaian dan perkhidmatan lain yang menggunakan ff_debug.</translation> <translation id="2544292303401268586">Pentadbir anda meminta untuk memulakan semula peranti anda untuk mengemas kini apl. Proses ini mungkin mengambil masa beberapa minit untuk diselesaikan.</translation> +<translation id="2544352060595557290">Tab Ini</translation> <translation id="2544853746127077729">Sijil pengesahan ditolak oleh rangkaian</translation> <translation id="2546283357679194313">Kuki dan data tapak</translation> <translation id="2548347166720081527"><ph name="PERMISSION" /> dibenarkan</translation> @@ -1570,6 +1573,7 @@ <translation id="2734760316755174687">Tapak di bawah <ph name="SITE_GROUP_NAME" /> akan ditetapkan semula juga.</translation> <translation id="2735712963799620190">Jadual</translation> <translation id="2737363922397526254">Runtuhkan...</translation> +<translation id="2737916598897808047"><ph name="APP_NAME" /> mahu berkongsi kandungan skrin anda dengan <ph name="TARGET_NAME" />.</translation> <translation id="2738771556149464852">Bukan Selepas</translation> <translation id="2739191690716947896">Nyahpepijat</translation> <translation id="2739240477418971307">Ubah tetapan kebolehaksesan anda</translation> @@ -2398,6 +2402,7 @@ <translation id="3677911431265050325">Minta tapak mudah alih</translation> <translation id="3677959414150797585">Termasuk apl, halaman web dan pelbagai lagi. Menghantar statistik untuk meningkatkan cadangan hanya sekiranya anda telah memilih untuk berkongsi data penggunaan.</translation> <translation id="3678156199662914018">Sambungan: <ph name="EXTENSION_NAME" /></translation> +<translation id="3678188444105291936">Halaman yang anda lihat dalam tetingkap ini tidak akan dipaparkan dalam sejarah penyemak imbas dan halaman ini tidak akan meninggalkan surih lain, seperti kuki, pada komputer selepas anda log keluar. Fail yang anda muat turun dan penanda halaman yang anda buat tidak akan dikekalkan.</translation> <translation id="3680683624079082902">Suara teks ke pertuturan</translation> <translation id="3681311097828166361">Terima kasih atas maklum balas anda. Anda berada di luar talian sekarang dan laporan anda akan dihantar sebentar lagi.</translation> <translation id="3682824389861648626">Ambang pergerakan</translation> @@ -2599,6 +2604,7 @@ <translation id="3884152383786131369">Kandungan web yang tersedia dalam berbilang bahasa akan menggunakan bahasa pertama yang disokong daripada senarai ini. Pilihan ini disegerakkan dengan tetapan penyemak imbas anda. <ph name="BEGIN_LINK_LEARN_MORE" />Ketahui lebih lanjut<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3886446263141354045">Permintaan anda untuk mengakses tapak ini telah dihantar kepada <ph name="NAME" />.</translation> <translation id="3888550877729210209">Mencatat nota dengan <ph name="LOCK_SCREEN_APP_NAME" /></translation> +<translation id="3888586133700543064">Maklumat ini membantu kami memahami isu Assistant anda dengan lebih baik. Maklumat ini akan disimpan selama maksimum 90 hari dan akses dihadkan kepada pasukan kejuruteraan dan maklum balas yang berkenaan.</translation> <translation id="3890064827463908288">Hidupkan Penyegerakan Chrome untuk menggunakan Penyegerakan Wi-Fi</translation> <translation id="3892414795099177503">Tambahkan OpenVPN / L2TP...</translation> <translation id="3893536212201235195">Baca dan tukar tetapan kebolehaksesan anda</translation> @@ -2630,6 +2636,7 @@ <translation id="3916445069167113093">Jenis fail ini boleh membahayakan komputer anda. Adakah anda mahu terus menyimpan <ph name="FILE_NAME" />?</translation> <translation id="3918972485393593704">Laporkan butiran kepada Google</translation> <translation id="3919145445993746351">Hidupkan penyegerakan untuk mendapatkan sambungan anda pada semua komputer anda</translation> +<translation id="3919798653937160644">Halaman yang anda lihat dalam tetingkap ini tidak akan dipaparkan dalam sejarah penyemak imbas dan halaman ini tidak akan meninggalkan surih lain, seperti kuki, pada komputer selepas anda menutup semua tetingkap Tetamu yang terbuka. Walau bagaimanapun, sebarang fail yang anda muat turun akan dikekalkan.</translation> <translation id="3920504717067627103">Dasar Sijil</translation> <translation id="392089482157167418">Dayakan ChromeVox (maklum balas dituturkan)</translation> <translation id="3920909973552939961">Tidak dibenarkan untuk memasang pengendali pembayaran</translation> @@ -2967,6 +2974,7 @@ <translation id="4332976768901252016">Sediakan Kawalan Ibu Bapa</translation> <translation id="4333854382783149454">PKCS #1 SHA-1 Dengan Penyulitan RSA</translation> <translation id="4336434711095810371">Kosongkan semua data</translation> +<translation id="4340125850502689798">Nama pengguna tidak sah</translation> <translation id="4340515029017875942"><ph name="ORIGIN" /> ingin berkomunikasi dengan apl "<ph name="EXTENSION_NAME" />"</translation> <translation id="4340575312453649552">Iklan ini menggunakan terlalu banyak sumber untuk peranti anda, maka Chrome mengalih keluar iklan ini.</translation> <translation id="4341577178275615435">Untuk menghidupkan atau mematikan semak imbas karet, gunakan pintasan F7</translation> @@ -3581,6 +3589,7 @@ <translation id="5057110919553308744">Apabila anda mengklik sambungan</translation> <translation id="5057403786441168405">Urus akaun log masuk anda. Tapak web, apl dan sambungan dalam Chrome dan Google Play mungkin menggunakan akaun ini untuk menyesuaikan pengalaman anda, bergantung pada kebenaran. <ph name="LINK_BEGIN" />Ketahui lebih lanjut<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Sekat log masuk</translation> +<translation id="5059526285558225588">Pilih kandungan untuk dikongsi</translation> <translation id="5060332552815861872">Terdapat 1 pencetak tersedia untuk disimpan.</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{Folder ini mengandungi penanda halaman. Adakah anda pasti mahu memadamnya?}other{Folder ini mengandungi # penanda halaman. Adakah anda pasti mahu memadamnya?}}</translation> <translation id="5062930723426326933">Log masuk gagal, sila sambungkan ke internet dan cuba lagi.</translation> @@ -3697,6 +3706,7 @@ <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">Kenang kembali memori kegemaran anda. Untuk menambah atau mengedit album, pergi ke <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" />.</translation> <translation id="5190926251776387065">Aktifkan port</translation> +<translation id="5191094172448199359">PIN yang anda masukkan tidak sepadan</translation> <translation id="5191251636205085390">Ketahui tentang teknologi baharu yang disasarkan untuk menggantikan kuki pihak ketiga dan kawal teknologi tersebut</translation> <translation id="51918995459521422"><ph name="ORIGIN" /> mahu memuat turun berbilang fail</translation> <translation id="5192062846343383368">Buka apl Family Link untuk melihat tetapan pengawasan anda</translation> @@ -3709,6 +3719,7 @@ <translation id="5204673965307125349">Sila lakukan powerwash pada peranti dan cuba lagi.</translation> <translation id="5204967432542742771">Masukkan kata laluan</translation> <translation id="5205484256512407285">Jangan sekali-kali menggunakan data mudah alih untuk memindahkan fail</translation> +<translation id="520568280985468584">Rangkaian telah berjaya ditambah. Rangkaian selular anda mungkin mengambil masa beberapa minit untuk menjadi aktif.</translation> <translation id="5206215183583316675">Padam "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="520621735928254154">Ralat Pengimportan Sijil</translation> <translation id="5206787458656075734">{COUNT,plural, =1{Berjaya menukar kata laluan yang terjejas. Anda mempunyai # lagi kata laluan yang terjejas. Chrome mengesyorkan agar anda menyemak kata laluan ini sekarang.}other{Berjaya menukar kata laluan yang terjejas. Anda mempunyai # lagi kata laluan yang terjejas. Chrome mengesyorkan agar anda menyemak kata laluan ini sekarang.}}</translation> @@ -4343,6 +4354,7 @@ <translation id="5935656526031444304">Urus Penyemakan Imbas Selamat</translation> <translation id="5938002010494270685">Peningkatan keselamatan tersedia</translation> <translation id="5939518447894949180">Tetapkan semula</translation> +<translation id="5939719276406088041">Tidak dapat membuat pintasan</translation> <translation id="5941153596444580863">Tambah orang...</translation> <translation id="5941343993301164315">Sila log masuk ke <ph name="TOKEN_NAME" />.</translation> <translation id="5941711191222866238">Minimumkan</translation> @@ -4430,6 +4442,7 @@ <translation id="6043994281159824495">Log keluar sekarang</translation> <translation id="6044805581023976844"><ph name="APP_NAME" /> berkongsi tab dan audio Chrome dengan <ph name="TAB_NAME" />.</translation> <translation id="6045114302329202345">Butang TrackPoint utama</translation> +<translation id="6047632800149092791">Penyegerakan tidak berfungsi. Cuba log keluar dan log masuk semula.</translation> <translation id="6049004884579590341">Tekan dan tahan |<ph name="ACCELERATOR" />| untuk keluar daripada skrin penuh</translation> <translation id="6051354611314852653">Op! Sistem gagal membenarkan akses API untuk peranti ini.</translation> <translation id="6052976518993719690">Pihak Berkuasa Pensijilan SSL</translation> @@ -4522,6 +4535,7 @@ <translation id="6143186082490678276">Dapatkan Bantuan</translation> <translation id="6143366292569327983">Pilih bahasa halaman yang perlu diterjemahkan</translation> <translation id="6144938890088808325">Bantu kami memperbaik Chromebook</translation> +<translation id="6146409560350811147">Penyegerakan tidak berfungsi. Cuba log masuk semula.</translation> <translation id="6147020289383635445">Gagal pratonton cetakan.</translation> <translation id="6148576794665275391">Buka sekarang</translation> <translation id="6149015141270619212">Tidak dapat menyambung ke Internet</translation> @@ -4589,6 +4603,7 @@ <translation id="6232017090690406397">Bateri</translation> <translation id="6232116551750539448">Sambungan ke <ph name="NAME" /> telah hilang</translation> <translation id="6233154960150021497">Gunakan pilihan lalai yang menggunakan suara dan bukannya papan kekunci</translation> +<translation id="6234108445915742946">Syarat Perkhidmatan Chrome akan berubah pada 31 Mac</translation> <translation id="6234474535228214774">Pemasangan belum selesai</translation> <translation id="6237474966939441970">Apl pengambilan nota stilus</translation> <translation id="6237816943013845465">Membolehkan anda melaraskan peleraian skrin anda</translation> @@ -4888,6 +4903,7 @@ <translation id="656293578423618167">Laluan atau nama fail terlalu panjang. Sila simpan dengan nama yang lebih pendek atau ke lokasi lain.</translation> <translation id="6563469144985748109">Pengurus anda belum meluluskannya</translation> <translation id="6569934958368283244">Orang lain</translation> +<translation id="6573497332121198392">Tidak dapat mengalih keluar pintasan</translation> <translation id="657402800789773160">&Muatkan Semula Halaman Ini</translation> <translation id="6577284282025554716">Muat turun dibatalkan: <ph name="FILE_NAME" /></translation> <translation id="657866106756413002">Gambar Kesihatan Rangkaian</translation> @@ -4895,6 +4911,7 @@ <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> - Kandungan desktop dikongsi</translation> <translation id="6580203076670148210">Kelajuan mengimbas</translation> <translation id="6582080224869403177">Tetapkan semula <ph name="DEVICE_TYPE" /> anda untuk meningkatkan keselamatan anda.</translation> +<translation id="6582274660680936615">Anda sedang menyemak imbas sebagai Tetamu</translation> <translation id="6584878029876017575">Menandatangani Microsoft Sepanjang Hayat</translation> <translation id="6586099239452884121">Penyemakan imbas tetamu</translation> <translation id="6586451623538375658">Tukar butang tetikus utama</translation> @@ -5064,6 +5081,7 @@ <translation id="6782468519961184511">Pentadbir anda tidak membenarkan Akaun Google tambahan</translation> <translation id="6785518634832172390">PIN mestilah 12 angka atau kurang</translation> <translation id="6786747875388722282">Pelanjutan</translation> +<translation id="6787097042755590313">Tab Lain</translation> <translation id="6787839852456839824">Pintasan papan kekunci</translation> <translation id="6788210894632713004">Sambungan dinyahpek</translation> <translation id="6789592661892473991">Pisah Mendatar</translation> @@ -5074,6 +5092,7 @@ <translation id="6793723358811598107">'<ph name="CURRENTKEY" />' telah pun ditetapkan untuk tindakan '<ph name="ACTION" />'. Tekan mana-mana kekunci untuk keluar.</translation> <translation id="6795884519221689054">Panda</translation> <translation id="6797493596609571643">Op, sesuatu telah berlaku.</translation> +<translation id="6798420440063423019">Kunci keselamatan dikunci kerana PIN yang salah dimasukkan terlalu banyak kali. Anda perlu menetapkan semula kunci keselamatan itu.</translation> <translation id="6798578729981748444">Untuk menyelesaikan import, tutup semua tetingkap Firefox.</translation> <translation id="6798780071646309401">kunci huruf besar dihidupkan</translation> <translation id="6798954102094737107">Pemalam: <ph name="PLUGIN_NAME" /></translation> @@ -5419,6 +5438,7 @@ <translation id="7180865173735832675">Peribadikan</translation> <translation id="7182791023900310535">Alihkan kata laluan anda</translation> <translation id="7186088072322679094">Simpan dalam Bar Alat</translation> +<translation id="7186303001964993981"><ph name="ORIGIN" /> tidak dapat membuka folder ini kerana folder ini mengandungi fail sistem</translation> <translation id="7187428571767585875">Masukan daftaran yang hendak dialih keluar atau diubah:</translation> <translation id="7187855807420906517">Selepas anda meninggalkan tapak atau beralih kepada mod luar talian, biasanya tapak terus menjalankan penyegerakan untuk menyelesaikan tugas, seperti memuat naik foto atau menghantar mesej sembang</translation> <translation id="7189234443051076392">Pastikan ruang pada peranti anda mencukupi</translation> @@ -6039,6 +6059,7 @@ <translation id="7871109039747854576">Gunakan kekunci <ph name="COMMA" /> dan <ph name="PERIOD" /> untuk menjadikan senarai calon halaman</translation> <translation id="787268756490971083">Mati</translation> <translation id="7874257161694977650">Latar Chrome</translation> +<translation id="7876027585589532670">Tidak dapat mengedit pintasan</translation> <translation id="7877451762676714207">Ralat pelayan tidak diketahui. Sila cuba lagi atau hubungi pentadbir pelayan.</translation> <translation id="7879631849810108578">Pintasan ditetapkan: <ph name="IDS_SHORT_SET_COMMAND" /></translation> <translation id="7880823633812189969">Data setempat akan dipadamkan apabila anda memulakan semula peranti</translation> @@ -6325,6 +6346,7 @@ <translation id="8189750580333936930">Kotak Pasir Privasi</translation> <translation id="8190193592390505034">Disambungkan ke <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">Uruskan apl, sambungan dan tema anda</translation> +<translation id="8192944472786724289"><ph name="APP_NAME" /> mahu berkongsi kandungan skrin anda.</translation> <translation id="8195027750202970175">Saiz pada cakera</translation> <translation id="8198323535106903877">Kami akan memasang <ph name="NUMBER_OF_APPS" /> apl itu untuk anda</translation> <translation id="8199300056570174101">Sifat Rangkaian (Perkhidmatan) dan Peranti</translation> @@ -6975,6 +6997,7 @@ <translation id="8931475688782629595">Urus data yang disegerakkan</translation> <translation id="8932654652795262306">Butiran Penambatan Segera</translation> <translation id="8932894639908691771">Pilihan Akses Suis</translation> +<translation id="893298445929867520">Troli disembunyikan. Troli akan dipaparkan semula apabila anda membuat perubahan.</translation> <translation id="8933960630081805351">&Paparkan dalam Pencari</translation> <translation id="8934732568177537184">Teruskan</translation> <translation id="8938306522009698937">pengendali</translation> @@ -7251,6 +7274,7 @@ <translation id="942532530371314860"><ph name="APP_NAME" /> berkongsi tab dan audio Chrome.</translation> <translation id="945522503751344254">Hantar maklum balas</translation> <translation id="947329552760389097">&Periksa Unsur</translation> +<translation id="947667444780368238"><ph name="ORIGIN" /> tidak dapat membuka fail dalam folder ini kerana folder ini mengandungi fail sistem</translation> <translation id="951991426597076286">Tolak</translation> <translation id="956500788634395331">Anda dilindungi daripada sambungan yang mungkin berbahaya</translation> <translation id="957960681186851048">Tapak ini cuba memuat turun berbilang fail secara automatik</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb index d7e9739..4218991 100644 --- a/chrome/app/resources/generated_resources_my.xtb +++ b/chrome/app/resources/generated_resources_my.xtb
@@ -575,6 +575,7 @@ <translation id="1627408615528139100">ဒေါင်းလုဒ်လုပ်ထားပြီးသား ဖြစ်ပါသည်</translation> <translation id="1628948239858170093">မဖွင့်မီ ဖိုင်ကို စစ်ဆေးမလား။</translation> <translation id="1629314197035607094">စကားဝှက် သက်တမ်းကုန်သွားပြီ</translation> +<translation id="1629521517399325891">ကွန်ရက်အထောက်အထားစိစစ်ခြင်း အတွက် အသုံးပြုသူအသိအမှတ်ပြုလက်မှတ် မရနိုင်ပါ။</translation> <translation id="163072119192489970">ဒေတာပို့ခြင်းနှင့် လက်ခံခြင်းတို့ကို အပြီးသတ်ရန် ခွင့်ပြုထားသည်</translation> <translation id="1630768113285622200">ပြန်လည်စတင်ပြီး ရှေ့ဆက်ရန်</translation> <translation id="1632082166874334883">စကားဝှက်ကို သင့် Google အကောင့်တွင် သိမ်းလိုက်သည်</translation> @@ -1180,6 +1181,7 @@ <translation id="2300383962156589922"><ph name="APP_NAME" /> ကို စိတ်ကြိုက်ပြင်ဆင်ပြီး ထိန်းချုပ်ပါ</translation> <translation id="2301382460326681002">အိတ်စတန်းရှင်း ရင်းမြစ် ဒါရိုက်ထရီ မမှန်ကန်ပါ။</translation> <translation id="23030561267973084">"<ph name="EXTENSION_NAME" />" သည်နောက်ထပ် ခွင့်ပြုချက်များကို တောင်းဆိုခဲ့သည်။</translation> +<translation id="230529452743010958">Google ဝန်ဆောင်မှုများကို အသုံးပြုထားသော သင်၏ ယခင်ကလုပ်ဆောင်ချက်အပေါ် အခြေခံပြီး ဤအရာကို မြင်ရခြင်းဖြစ်ပါသည်။ သင်၏ဒေတာများကို ကြည့်ခြင်း၊ ဖျက်ခြင်းနှင့် ဆက်တင်များပြောင်းခြင်းတို့ကို <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> တွင် ပြုလုပ်နိုင်သည်။</translation> <translation id="23055578400314116">အသုံးပြုသူအမည်တစ်ခု ရွေးပါ</translation> <translation id="2307462900900812319">ကွန်ရက် ပြုပြင်ရန်</translation> <translation id="230927227160767054">ဤစာမျက်နှာသည် ဝန်ဆောင်မှု ကိုင်တွယ်ကိရိယာအား ထည့်သွင်းလိုသည်။</translation> @@ -1406,6 +1408,7 @@ <translation id="2541706104884128042">အိပ်ချိန်သစ် သတ်မှတ်ရန်</translation> <translation id="2542050502251273923">ff_debug အသုံးပြုပြီး ကွန်ရက်ချိတ်ဆက်မှုမန်နေဂျာနှင့် အခြားဝန်ဆောင်မှုများ၏ အမှားရှာပြင်သည့် အဆင့်ကို သတ်မှတ်ပေးသည်။</translation> <translation id="2544292303401268586">အက်ပ်များအပ်ဒိတ်လုပ်ရန်အတွက် သင့်စက်ကိုပြန်စရန် စီမံခန့်ခွဲသူက သတ်မှတ်ထားသည်။ အပြီးသတ်ရန် မိနစ်များစွာ ကြာနိုင်သည်။</translation> +<translation id="2544352060595557290">ဤတဘ်</translation> <translation id="2544853746127077729">ကွန်ရက်မှ စစ်မှန်ကြောင်းသက်သေပြချက်လက်မှတ်ကို ငြင်းပယ်ခဲ့သည်</translation> <translation id="2546283357679194313">ကူကီးများ နှင့် ဆိုက် ဒေတာ</translation> <translation id="2548347166720081527"><ph name="PERMISSION" /> ကို ခွင့်ပြုထားသည်</translation> @@ -1571,6 +1574,7 @@ <translation id="2734760316755174687"><ph name="SITE_GROUP_NAME" /> အောက်ရှိ ဝဘ်ဆိုက်များကိုလည်း ပြင်ဆင်သတ်မှတ်လိုက်ပါမည်။</translation> <translation id="2735712963799620190">အချိန်ဇယား</translation> <translation id="2737363922397526254">ခေါက်သိမ်းရန်...</translation> +<translation id="2737916598897808047"><ph name="APP_NAME" /> သည် သင့်ဖန်သားပြင် အကြောင်းအရာများကို <ph name="TARGET_NAME" /> အား မျှဝေလိုသည်။</translation> <translation id="2738771556149464852">နောက်မှ မဟုတ်ပါ</translation> <translation id="2739191690716947896">အမှားရှာပြင်ခြင်း</translation> <translation id="2739240477418971307">သင်၏ ရယူသုံးနိုင်မှု ဆက်တင်များကို ပြောင်းလဲရန်</translation> @@ -2399,6 +2403,7 @@ <translation id="3677911431265050325">မိုဘိုင်းဝဘ်ဆိုက်ကို တောင်းဆိုရန်</translation> <translation id="3677959414150797585">အက်ပ်၊ ဝဘ်စာမျက်နှာနှင့် အခြားအရာများ ပါဝင်သည်။ သုံးစွဲမှုဒေတာများကို မျှဝေရန် သင်ရွေးချယ်ထားမှသာ အကြံပြုချက်များ ပိုမိုကောင်းမွန်လာစေရန် ကိန်းဂဏန်းစာရင်းများ ပို့ပါမည်။</translation> <translation id="3678156199662914018">တိုးချဲ့မှု: <ph name="EXTENSION_NAME" /></translation> +<translation id="3678188444105291936">ဤဝင်းဒိုးတွင်ကြည့်သည့် စာမျက်နှာများကို ကြည့်ရှုခြင်းမှတ်တမ်းတွင် ပြမည်မဟုတ်ပါ။ ထို့ပြင် အကောင့်မှထွက်လိုက်ပြီးနောက် ကွန်ပျူတာတွင် ၎င်းတို့က ကွတ်ကီးများကဲ့သို့ အခြားသဲလွန်စများ ချန်ခဲ့မည်မဟုတ်ပါ။ သင်ဒေါင်းလုဒ်လုပ်သော ဖိုင်များနှင့် လိပ်စာများကို သိမ်းထားမည်မဟုတ်ပါ။</translation> <translation id="3680683624079082902">စာသားမှ စကားပြော အသံ</translation> <translation id="3681311097828166361">အကြံပြုပေးသည့်အတွက် ကျေးဇူးတင်ပါသည်။ သင်ယခုအော့ဖ်လိုင်းဖြစ်နေလျှင် သင့်အစီရင်ခံစာကို နောက်မှ ပို့ပါမည်။</translation> <translation id="3682824389861648626">လှုပ်ရှားမှု ခံနိုင်စွမ်း</translation> @@ -2600,6 +2605,7 @@ <translation id="3884152383786131369">ဘာသာစကားအမျိုးမျိုး အသုံးပြုနိုင်သော ဝဘ်အကြောင်းအရာများက ဤစာရင်းထဲမှ ပထမဆုံးပံ့ပိုးထားသော ဘာသာစကားကို အသုံးပြုပါမည်။ ဤသတ်မှတ်ချက်များကို သင့်ဘရောင်ဇာဆက်တင်များနှင့် စင့်ခ်လုပ်ထားသည်။ <ph name="BEGIN_LINK_LEARN_MORE" />ပိုမိုလေ့လာရန်<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3886446263141354045">ဤဆိုက်အား အသုံးပြုရန် သင့်တောင်းဆိုချက်ကို <ph name="NAME" /> သို့ ပို့လိုက်ပါပြီ</translation> <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" /> ဖြင့် မှတ်စုရေးခြင်း</translation> +<translation id="3888586133700543064">ဤအချက်အလက်က သင်၏ Assistant ဆိုင်ရာ ပြဿနာကို ကျွန်ုပ်တို့ ပိုမိုနားလည်စေရန် အထောက်အကူပြုပါသည်။ ၎င်းကို ရက် ၉၀ အထိသိမ်းထားပြီး သက်ဆိုင်ရာ အင်ဂျင်နီယာနှင့် အကြံပြုအဖွဲ့များကသာ ဝင်ရောက်ကြည့်ရှုနိုင်သည်။</translation> <translation id="3890064827463908288">'Wi-Fi စင့်ခ်' အသုံးပြုရန် 'Chrome စင့်ခ်' ဖွင့်ပါ</translation> <translation id="3892414795099177503">OpenVPN / L2TP ထည့်ရန်...</translation> <translation id="3893536212201235195">သင်၏ ရယူသုံးရေး ဆက်တင်များကို ဖတ်ကြည့်ပြီး ပြောင်းလဲရန်</translation> @@ -2631,6 +2637,7 @@ <translation id="3916445069167113093">ဒီိဖိုင် ပုံစံက သင့် ကွန်ပျူတာကို အန္တရာယ်ပြုနိုင်သည်။ သင်သည် ဘယ်လိုပဲဖြစ်ဖြစ် <ph name="FILE_NAME" />ကို သိမ်းထားလိုပါသလား?</translation> <translation id="3918972485393593704">အသေးစိတ်ကို Google သို့ အကြောင်းကြားပါ</translation> <translation id="3919145445993746351">သင်၏နောက်ဆက်တွဲများကို သင့်ကွန်ပျူတာအားလုံးတွင် ရယူနိုင်ရန် စင့်ခ်လုပ်ခြင်းကို ဖွင့်ပါ</translation> +<translation id="3919798653937160644">ဤဝင်းဒိုးတွင်ကြည့်သည့် စာမျက်နှာများကို ကြည့်ရှုခြင်းမှတ်တမ်းတွင် ပြမည်မဟုတ်ပါ။ ထို့ပြင် ဖွင့်ထားသော ‘ဧည့်သည်ဝင်းဒိုး’ အားလုံးကို ပိတ်လိုက်ပြီးနောက် ကွန်ပျူတာတွင် ၎င်းတို့က ကွတ်ကီးများကဲ့သို့ အခြားသဲလွန်စများ ချန်ခဲ့မည်မဟုတ်ပါ။ သို့သော် သင်ဒေါင်းလုဒ်လုပ်သော ဖိုင်များကိုမူ သိမ်းထားပါမည်။</translation> <translation id="3920504717067627103">လက်မှတ်ဆိုင်ရာ မူဝါဒများ</translation> <translation id="392089482157167418">ChromeVox ကို ဖွင့်ထားရန်(နှုတ်ပြော အကြံပြုချက်)</translation> <translation id="3920909973552939961">ငွေပေးချေမှုစီမံသူများ ထည့်သွင်းရန် ခွင့်ပြုမထားပါ</translation> @@ -2967,6 +2974,7 @@ <translation id="4332976768901252016">'မိဘ အထိန်းအချုပ်များ' ကို စနစ်ထည့်သွင်းခြင်း</translation> <translation id="4333854382783149454">PKCS #1 SHA-1 RSA လျှို့ဝှက်ကုဒ်သွင်းမှု နှင့်အတူ</translation> <translation id="4336434711095810371">ဒေတာအားလုံး ရှင်းထုတ်ရန်</translation> +<translation id="4340125850502689798">အသုံးပြုသူအမည် မမှန်ပါ</translation> <translation id="4340515029017875942"><ph name="ORIGIN" /> သည် "<ph name="EXTENSION_NAME" />" အက်ပ် နှင့် ဆက်သွယ် လိုသည်</translation> <translation id="4340575312453649552">ဤကြော်ငြာသည် သင့်စက်ပစ္စည်းမှ အရင်းအမြစ်များစွာကို အသုံးပြုထားသည့်အတွက် Chrome က ၎င်းကို ဖယ်ရှားထားသည်။</translation> <translation id="4341577178275615435">Caret ဖြင့် ရှာကြည့်ခြင်းကို ဖွင့်ရန် သို့မဟုတ် ပိတ်ရန် ဖြတ်လမ်းလင့်ခ် F7 သုံးပါ</translation> @@ -3581,6 +3589,7 @@ <translation id="5057110919553308744">နောက်ဆက်တွဲကို သင်နှိပ်သည့်အခါ</translation> <translation id="5057403786441168405">သင်လက်မှတ်ထိုးဝင်ထားသည့် အကောင့်များကို စီမံခန့်ခွဲပါ။ ခွင့်ပြုချက်များအပေါ် အခြေခံပြီး သင့်စိတ်ကြိုက်ပြင်ဆင် အသုံးပြုနိုင်ရန် Chrome နှင့် Google Play ရှိ ဝဘ်ဆိုက်၊ အက်ပ်၊ နောက်ဆက်တွဲများက ဤအကောင့်များကို အသုံးပြုနိုင်သည်။ <ph name="LINK_BEGIN" />ပိုမိုလေ့လာရန်<ph name="LINK_END" /></translation> <translation id="5059241099014281248">လက်မှတ်ထိုးဝင်မှု ကန့်သတ်ရန်</translation> +<translation id="5059526285558225588">မျှဝေလိုသည်များကို ရွေးပါ</translation> <translation id="5060332552815861872">သိမ်းဆည်းရန် ပုံနှိပ်စက် ၁ ခုရှိသည်။</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{ဤဖိုင်တွဲတွင် ဝဘ်လိပ်စာ တစ်ခု ပါဝင်သည်။ ဖျက်လိုသည်မှာ သေချာပါသလား။}other{ဤဖိုင်တွဲတွင် ဝဘ်လိပ်စာ # ခု ပါဝင်သည်။ ဖျက်လိုသည်မှာ သေချာပါသလား။}}</translation> <translation id="5062930723426326933">လက်မှတ်ထိုး ဝင်မှု မအောင်မြင်ခဲ့ပါ၊ ကျေးဇူးပြုပြီး အင်တာနက်သို့ ဆက်ပြီး ထပ်စမ်းပါ။</translation> @@ -3697,6 +3706,7 @@ <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">သင့်အကြိုက်ဆုံး အမှတ်တရအချိန်များကို ပြန်လည်ခံစားကြည့်ပါ။ အယ်လ်ဘမ်များ ထည့်ရန် သို့မဟုတ် တည်းဖြတ်ရန် <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" /> သို့သွားပါ။</translation> <translation id="5190926251776387065">ပို့တ်စဖွင့်ရန်</translation> +<translation id="5191094172448199359">သင်ထည့်ထားသော ပင်နံပါတ်များ မတူညီပါ</translation> <translation id="5191251636205085390">ပြင်ပကုမ္ပဏီကွတ်ကီးများကို အစားထိုးမည့် နည်းပညာသစ်များအကြောင်း လေ့လာပြီး စီမံပါ</translation> <translation id="51918995459521422"><ph name="ORIGIN" /> က ဖိုင်အများအပြားကို ဒေါင်းလုဒ်လုပ်လိုသည်</translation> <translation id="5192062846343383368">သင်၏ကြီးကြပ်မှုဆက်တင်များ ကြည့်ရန် Family Link အက်ပ် ဖွင့်ပါ</translation> @@ -3709,6 +3719,7 @@ <translation id="5204673965307125349">စက်ပစ္စည်းကို အစအဆုံးပြန်သွင်း၍ ထပ်စမ်းကြည့်ပါ။</translation> <translation id="5204967432542742771">လျှို့ဝှက်စကားလုံး ရိုက်ထည့်</translation> <translation id="5205484256512407285">ပြောင်းရွှေ့ရန်အတွက် မိုဘိုင်းဒေတာကို ဘယ်တော့မှမသုံးပါ</translation> +<translation id="520568280985468584">ကွန်ရက်ကို ထည့်လိုက်ပါပြီ။ ဆယ်လူလာကွန်ရက် စတင်ရန် မိနစ်များစွာ ကြာနိုင်သည်။</translation> <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />" ကို ဖျက်မလား။</translation> <translation id="520621735928254154">လက်မှတ် တင်သွင်းမှု အမှား</translation> <translation id="5206787458656075734">{COUNT,plural, =1{ကျိုးပေါက်ထားသည့် စကားဝှက်ကို ပြောင်းပြီးပါပြီ။ သင့်တွင် ကျိုးပေါက်ထားသည့် စကားဝှက် နောက် # ခု ရှိပါသည်။ ဤစကားဝှက်ကို ယခု စစ်ဆေးရန် Chrome က အကြံပြုပါသည်။}other{ကျိုးပေါက်ထားသည့် စကားဝှက်ကို ပြောင်းပြီးပါပြီ။ သင့်တွင် ကျိုးပေါက်ထားသည့် စကားဝှက် နောက် # ခု ရှိပါသည်။ ဤစကားဝှက်များကို ယခု စစ်ဆေးရန် Chrome က အကြံပြုပါသည်။}}</translation> @@ -4342,6 +4353,7 @@ <translation id="5935656526031444304">'လုံခြုံစွာ ကြည့်ရှုခြင်း' ကို စီမံရန်</translation> <translation id="5938002010494270685">လုံခြုံရေး အဆင့်မြှင့်နိုင်ပါသည်</translation> <translation id="5939518447894949180">ပြန်ညှိ</translation> +<translation id="5939719276406088041">ဖြတ်လမ်းလင့်ခ် ပြုလုပ်၍မရပါ</translation> <translation id="5941153596444580863">လူကို ထည့်ရန်...</translation> <translation id="5941343993301164315">ကျေးဇူးပြု၍ <ph name="TOKEN_NAME" /> သို့ ၐင်ရောက်ပါ။</translation> <translation id="5941711191222866238">အနည်းဆုံး လုပ်ရန်</translation> @@ -4429,6 +4441,7 @@ <translation id="6043994281159824495">ယခု ထွက်ခွာရန်</translation> <translation id="6044805581023976844"><ph name="APP_NAME" /> သည် Chrome တဘ်နှင့် အသံကို <ph name="TAB_NAME" /> ဖြင့်မျှဝေနေသည်။</translation> <translation id="6045114302329202345">ပင်မ TrackPoint ခလုတ်</translation> +<translation id="6047632800149092791">စင့်ခ်လုပ်၍ မရပါ။ ထွက်ပြီး ပြန်လည်၍ လက်မှတ်ထိုးဝင်ကြည့်ပါ။</translation> <translation id="6049004884579590341">မျက်နှာပြင်အပြည့်ဖွင့်ခြင်းမှ ထွက်ရန် <ph name="ACCELERATOR" /> ကို နှိပ်ထားပါ</translation> <translation id="6051354611314852653">အူးပ်စ်! စနစ်က ဒီကိရိယာ အတွက် API ရယူသုံးမှုကို ခွင့်ပြု မရခဲ့ပါ။</translation> <translation id="6052976518993719690">SSL အသိမှတ်ပြုလက်မှတ် အာဏာ</translation> @@ -4521,6 +4534,7 @@ <translation id="6143186082490678276">အကူအညီ ရယူရန်</translation> <translation id="6143366292569327983">ပြန်ဆိုရန်စာမျက်နှာ၏ ဘာသာစကားကို ရွေးပါ</translation> <translation id="6144938890088808325">Chromebooks တိုးတက်ကောင်းမွန်လာစေရန် ကူညီပါ</translation> +<translation id="6146409560350811147">စင့်ခ်လုပ်၍ မရပါ။ ထပ်မံ၍ လက်မှတ်ထိုးဝင်ကြည့်ပါ။</translation> <translation id="6147020289383635445">ပရင့်အစမ်းကြည့် မအောင်မြင်ပါ။</translation> <translation id="6148576794665275391">ယခုဖွင့်ရန်</translation> <translation id="6149015141270619212">အင်တာနက်သို့ ချိတ်ဆက်၍မရပါ</translation> @@ -4589,6 +4603,7 @@ <translation id="6232017090690406397">ဘက်ထရီ</translation> <translation id="6232116551750539448"><ph name="NAME" /> သို့ချိတ်ဆက်မှု ပျောက်သွားပါသည်</translation> <translation id="6233154960150021497">ကီးဘုတ်အစား အသံကို မူရင်းအဖြစ် သတ်မှတ်ရန်</translation> +<translation id="6234108445915742946">‘Chrome ၏ ဝန်ဆောင်မှုစည်းမျဉ်းများ’ ကို မတ် ၃၁ တွင် ပြောင်းပါမည်</translation> <translation id="6234474535228214774">ထည့်သွင်းမှု ဆိုင်းငံ့နေသည်</translation> <translation id="6237474966939441970">စတိုင်လပ်စ် မှတ်စုရေးသည့်အက်ပ်</translation> <translation id="6237816943013845465">သင်၏ ဖန်သားပြင်ပုံရိပ်ပြတ်သားမှုကို ချိန်ညှိခွင့်ပြုသည်</translation> @@ -4886,6 +4901,7 @@ <translation id="656293578423618167">ဖိုင်လမ်းကြောင်း သို့မဟုတ် အမည်သည် ရှည်လွန်းနေပါသည်။ ကျေးဇူးပြုပြီး အမည်တို သို့မဟုတ် အခြား တစ်နေရာတွင် တွင် သိမ်းဆည်းပေးပါ။</translation> <translation id="6563469144985748109">သင့်စီမံခန့်ခွဲသူသည် ၎င်းကို အတည်မပြုသေးပါ</translation> <translation id="6569934958368283244">အခြားလူများ</translation> +<translation id="6573497332121198392">ဖြတ်လမ်းလင့်ခ်ကို ဖယ်ရှား၍မရပါ</translation> <translation id="657402800789773160">&ဒီစာမျက်နှာကို ပြန်တင်ရန်</translation> <translation id="6577284282025554716">ဒေါင်းလုဒ်လုပ်ခြင်းကို ပယ်ဖျက်ထားသည်− <ph name="FILE_NAME" /></translation> <translation id="657866106756413002">ကွန်ရက်အခြေအနေ လျှပ်တစ်ပြက်</translation> @@ -4893,6 +4909,7 @@ <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> - ဒက်စ်တော့အကြောင်းအရာကို မျှဝေထားသည်</translation> <translation id="6580203076670148210">စကင်ဖတ်သည့် မြန်နှုန်း</translation> <translation id="6582080224869403177">သင့်လုံခြုံရေးကို အဆင့်မြှင့်ရန် <ph name="DEVICE_TYPE" /> ကို ပြင်ဆင်သတ်မှတ်ပါ။</translation> +<translation id="6582274660680936615">သင်သည် ‘ဧည့်သည်’ အဖြစ် ဝင်ကြည့်နေသည်</translation> <translation id="6584878029876017575">Microsoft တစ်ဘဝစာ လက်မှတ်ထိုးခြင်း</translation> <translation id="6586099239452884121">ဧည့်သည်အဖြစ် ဝင်ရောက်ကြည့်ရှုရန်</translation> <translation id="6586451623538375658">အခြေခံ မောက်စ် ခလုတ် ဖလှယ်ရန်</translation> @@ -5062,6 +5079,7 @@ <translation id="6782468519961184511">သင့်စီမံခန့်ခွဲသူက နောက်ထပ် Google Account များကို ခွင့်မပြုပါ</translation> <translation id="6785518634832172390">ပင်နံပါတ်သည် ဂဏန်း ၁၂ လုံး သို့မဟုတ် ၎င်းထက်နည်းရပါမည်</translation> <translation id="6786747875388722282">အိတ်စတန်းရှင်းများ</translation> +<translation id="6787097042755590313">အခြားတဘ်</translation> <translation id="6787839852456839824">ကီးဘုတ် ဖြတ်လမ်းများ</translation> <translation id="6788210894632713004">နောက်ဆက်တွဲကို အထုပ်ဖြေထားသည်</translation> <translation id="6789592661892473991">အလျားလိုက် ခွဲရန်</translation> @@ -5072,6 +5090,7 @@ <translation id="6793723358811598107">'<ph name="CURRENTKEY" />' ကို '<ph name="ACTION" />' လုပ်ဆောင်ချက်အတွက် သတ်မှတ်ပြီးဖြစ်သည်။ ထွက်ရန် ကီးတစ်ခုခုကို နှိပ်ပါ။</translation> <translation id="6795884519221689054">ပန်ဒါဝက်ဝံ</translation> <translation id="6797493596609571643">အူးပ်စ်၊ တစ်ခုခု မှားသွားပြီ။</translation> +<translation id="6798420440063423019">ပင်နံပါတ်အမှားကို အကြိမ်များစွာထည့်သဖြင့် လုံခြုံရေးကီးကို လော့ခ်ချလိုက်ပါသည်။ လုံခြုံရေးကီးကို ပြင်ဆင်သတ်မှတ်ရပါမည်။</translation> <translation id="6798578729981748444">တင်သွင်းခြင်းကို အပြီးသတ်ရန် Firefox ဝင်းဒိုများအားလုံးကို ပိတ်ပါ။</translation> <translation id="6798780071646309401">စာလုံးကြီး ခလုတ် ဖွင့်ထားသည်</translation> <translation id="6798954102094737107">ပလတ်အင်- <ph name="PLUGIN_NAME" /></translation> @@ -5417,6 +5436,7 @@ <translation id="7180865173735832675">ပြုပြင်ရန်</translation> <translation id="7182791023900310535">သင့်စကားဝှက် ရွှေ့ရန်</translation> <translation id="7186088072322679094">ကိရိယာဘားတွင် သိမ်းရန်</translation> +<translation id="7186303001964993981">ဤဖိုင်တွဲတွင် စနစ်ဖိုင်များ ပါဝင်သဖြင့် <ph name="ORIGIN" /> က ၎င်းကို ဖွင့်၍မရပါ</translation> <translation id="7187428571767585875">ဖယ်ရှားရန် သို့မဟုတ် ပြောင်းလဲရန် မှတ်ပုံတင်ခြင်း စာရင်းများ-</translation> <translation id="7187855807420906517">သင်ထွက်သွားသောအခါ (သို့) အော့ဖ်လိုင်းဖြစ်သွားသောအခါ ဓာတ်ပုံအပ်လုဒ်လုပ်ခြင်း (သို့) ချတ်မက်ဆေ့ဂျ်ပို့ခြင်းကဲ့သို့ လုပ်ဆောင်စရာများအပြီးသတ်ရန် ဝဘ်ဆိုက်များက ဆက်လက်၍စင့်ခ်လုပ်လေ့ရှိသည်</translation> <translation id="7189234443051076392">သင့်စက်ပစ္စည်းပေါ်တွင် နေရာအလုံအလောက်ရှိမရှိ သေချာစစ်ဆေးပါ</translation> @@ -6037,6 +6057,7 @@ <translation id="7871109039747854576">လျှောက်ထားသူစာရင်း စာမျက်နှာဖွဲ့ရန် <ph name="COMMA" /> နှင့် <ph name="PERIOD" /> ကီးများကို အသုံးပြုပါ</translation> <translation id="787268756490971083">ပိတ်ထားသည်</translation> <translation id="7874257161694977650">Chrome နောက်ခံပုံများ</translation> +<translation id="7876027585589532670">ဖြတ်လမ်းလင့်ခ်ကို တည်းဖြတ်၍မရပါ</translation> <translation id="7877451762676714207">မသိရ ဆာဗာ အမှား။ ကျေးဇူးပြုပြီး ထပ်စမ်းပါ၊ သို့မဟုတ် ဆာဗာ စီမံအု်ပချုပ်သူကို ဆက်သွယ်ပါ။</translation> <translation id="7879631849810108578">သတ်မှတ်ထားသည့် ဖြတ်လမ်းလင့်ခ်- <ph name="IDS_SHORT_SET_COMMAND" /></translation> <translation id="7880823633812189969">သင်ပြန်စတင်သည့်အခါ စက်အတွင်းဒေတာများကို ဖျက်လိုက်ပါမည်</translation> @@ -6322,6 +6343,7 @@ <translation id="8189750580333936930">ပုဂ္ဂိုလ်ရေးဆိုင်ရာ လုံခြုံသည့်နေရာ</translation> <translation id="8190193592390505034"><ph name="PROVIDER_NAME" />သို့ ချိတ်ဆက်နေ</translation> <translation id="8191230140820435481">သင်၏ အက်ပ်များ၊ တိုးချဲ့မှုများ၊ နှင့် အပြင်အဆင်များကို စီမံကွပ်ကဲရန်</translation> +<translation id="8192944472786724289"><ph name="APP_NAME" /> သည် သင့်ဖန်သားပြင် အကြောင်းအရာများကို မျှဝေလိုသည်။</translation> <translation id="8195027750202970175">ဖိုင်အရွယ်အစား</translation> <translation id="8198323535106903877">၎င်း <ph name="NUMBER_OF_APPS" /> အက်ပ်များကို သင့်အတွက် ထည့်သွင်းပေးပါမည်</translation> <translation id="8199300056570174101">ကွန်ရက် (ဝန်ဆောင်မှု) နှင့် စက်ပစ္စည်း သတ်မှတ်ချက်များ</translation> @@ -6971,6 +6993,7 @@ <translation id="8931475688782629595">သင်စင့်ခ်လုပ်သည့် အရာများကို စီမံရန်</translation> <translation id="8932654652795262306">အလိုအလျောက် ချိတ်ဆက်မျှဝေခြင်း အသေးစိတ်</translation> <translation id="8932894639908691771">'ခလုတ်သုံးခြင်း' ရွေးစရာများ</translation> +<translation id="893298445929867520">ဈေးခြင်းတောင်းများ ဖျောက်ထားသည်။ အပြောင်းအလဲများလုပ်သောအခါ ပေါ်လာမည်။</translation> <translation id="8933960630081805351">&တွေ့ရှိချက် ထဲမှာ ပြရန်</translation> <translation id="8934732568177537184">ဆက်လုပ်ရန်</translation> <translation id="8938306522009698937">စီမံသူများ</translation> @@ -7247,6 +7270,7 @@ <translation id="942532530371314860"><ph name="APP_NAME" /> သည် Chrome တဘ်နှင့် အသံကို မျှဝေနေသည်။</translation> <translation id="945522503751344254">အကြံပြုချက် ပေးပို့မည်</translation> <translation id="947329552760389097">&စာမျက်နှာအတွင်းရှိ အရာများကို စစ်ဆေးရန်</translation> +<translation id="947667444780368238">ဤဖိုင်တွဲတွင် စနစ်ဖိုင်များ ပါဝင်သဖြင့် <ph name="ORIGIN" /> က ၎င်းထဲရှိ ဖိုင်များကို ဖွင့်၍မရပါ</translation> <translation id="951991426597076286">ပယ်ချရန်</translation> <translation id="956500788634395331">အန္တရာယ်ရှိနိုင်သော နောက်ဆက်တွဲများ၏ရန်မှ သင့်ကို ကာကွယ်ပေးထားသည်</translation> <translation id="957960681186851048">ဤဝဘ်ဆိုက်သည် ဖိုင်အမြောက်အများကို အလိုအလျောက် ဒေါင်းလုဒ်လုပ်ရန် ကြိုးပမ်းခဲ့သည်</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb index c6ca81f..2edd2b87 100644 --- a/chrome/app/resources/generated_resources_or.xtb +++ b/chrome/app/resources/generated_resources_or.xtb
@@ -571,6 +571,7 @@ <translation id="1627408615528139100">ପୂର୍ବରୁ ଡାଉନ୍ଲୋଡ୍ କରାଯାଇଛି</translation> <translation id="1628948239858170093">ଖୋଲିବା ପୂର୍ବରୁ ଫାଇଲ୍ ସ୍କାନ୍ କରିବେ?</translation> <translation id="1629314197035607094">ପାସ୍ୱାର୍ଡର ମିଆଦ ସମାପ୍ତ ହୋଇଯାଇଛି</translation> +<translation id="1629521517399325891">ନେଟୱାର୍କ ପ୍ରମାଣୀକରଣ ପାଇଁ ଉପଯୋଗକର୍ତ୍ତା ସାର୍ଟିଫିକେଟ୍ ଉପଲବ୍ଧ ନାହିଁ।</translation> <translation id="163072119192489970">ଡାଟା ପଠାଇବା କିମ୍ବା ଗ୍ରହଣ କରିବା ସମ୍ପୂର୍ଣ୍ଣ କରିବାକୁ ଅନୁମତି ଦିଆଯାଇଛି</translation> <translation id="1630768113285622200">ରିଷ୍ଟାର୍ଟ କରି ଜାରି ରଖନ୍ତୁ</translation> <translation id="1632082166874334883">ଆପଣଙ୍କ Google ଆକାଉଣ୍ଟରେ ପାସୱାର୍ଡ ଷ୍ଟୋର୍ କରାଯାଇଛି</translation> @@ -1173,6 +1174,7 @@ <translation id="2300383962156589922"><ph name="APP_NAME" />କୁ କଷ୍ଟମାଇଜ୍ କରି ନିୟନ୍ତ୍ରଣ କରନ୍ତୁ</translation> <translation id="2301382460326681002">ଏକ୍ସଟେନ୍ସନ୍ ରୁଟ୍ ଡିରେକ୍ଟୋରୀ ଅବୈଧ ଅଟେ।</translation> <translation id="23030561267973084">"<ph name="EXTENSION_NAME" />" ଅତିରିକ୍ତ ଅନୁମତିଗୁଡ଼ିକ ଅନୁରୋଧ କରିଛନ୍ତି।</translation> +<translation id="230529452743010958">Google ସେବାଗୁଡ଼ିକୁ ବ୍ୟବହାର କରି ଆପଣଙ୍କ ପୂର୍ବର କାର୍ଯ୍ୟକଳାପ ଆଧାରରେ ଆପଣ ଏହି ଆଇଟମକୁ ଦେଖୁଛନ୍ତି। ଆପଣ <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />ରେ ଆପଣଙ୍କ ଡାଟାକୁ ଦେଖିପାରିବେ, ଏହାକୁ ଡିଲିଟ୍ କରିପାରିବେ ଏବଂ ଆପଣଙ୍କ ସେଟିଂସ୍ ପରିବର୍ତ୍ତନ କରିପାରିବେ।</translation> <translation id="23055578400314116">ଏକ ଉପଯୋଗକର୍ତ୍ତାନାମ ଚୟନ କରନ୍ତୁ</translation> <translation id="2307462900900812319">ନେଟ୍ୱର୍କ କନ୍ଫିଗର୍ କରନ୍ତୁ</translation> <translation id="230927227160767054">ଏହି ପୃଷ୍ଠା ଏକ ସେବା ହ୍ୟାଣ୍ଡଲର୍ ଇନ୍ଷ୍ଟଲ୍ କରିବାକୁ ଚାହୁଁଛି।</translation> @@ -1398,6 +1400,7 @@ <translation id="2541706104884128042">ଶୋଇବାର ନୂଆ ସମୟ ସେଟ୍ କରାଯାଇଛି</translation> <translation id="2542050502251273923">Ff_debug ବ୍ୟବହାର କରି ନେଟୱାର୍କ ସଂଯୋଗ ପରିଚାଳକ ଏବଂ ଅନ୍ୟ ସେବାଗୁଡ଼ିକର ଡିବଗିଂ ସ୍ତରକୁ ସେଟ୍ କରେ।</translation> <translation id="2544292303401268586">ଆପଣଙ୍କ ଆଡମିନିଷ୍ଟ୍ରେଟର୍ ଆପଗୁଡ଼ିକୁ ଅପଡେଟ୍ କରିବା ପାଇଁ ଆପଣଙ୍କ ଡିଭାଇସକୁ ରିଷ୍ଟାର୍ଟ କରିବାକୁ ଅନୁରୋଧ କରିଛନ୍ତି। ଏହା ସମ୍ପୂର୍ଣ୍ଣ ହେବାକୁ କିଛି ସମୟ ଲାଗିପାରେ।</translation> +<translation id="2544352060595557290">ଏହି ଟାବ୍</translation> <translation id="2544853746127077729">ନେଟ୍ୱର୍କ ଦ୍ବାରା ପ୍ରମାଣିକିକରଣ ସର୍ଟିଫିକେଟ୍ ଖାରଜ କରାଯାଇଛି</translation> <translation id="2546283357679194313">କୁକିସ୍ ଏବଂ ସାଇଟ୍ ଡାଟା</translation> <translation id="2548347166720081527">ଅନୁମୋଦିତ <ph name="PERMISSION" /></translation> @@ -1563,6 +1566,7 @@ <translation id="2734760316755174687"><ph name="SITE_GROUP_NAME" /> ଅଧୀନରେ ଥିବା ସାଇଟ୍ଗୁଡ଼ିକ ମଧ୍ୟ ରିସେଟ୍ ହୋଇଯିବ।</translation> <translation id="2735712963799620190">ସମୟସୂଚୀ ନିର୍ଦ୍ଧାରଣ କରନ୍ତୁ</translation> <translation id="2737363922397526254">ସଙ୍କୁଚିତ କରନ୍ତୁ...</translation> +<translation id="2737916598897808047"><ph name="APP_NAME" /> ଆପଣଙ୍କ ସ୍କ୍ରିନର ବିଷୟବସ୍ତୁକୁ <ph name="TARGET_NAME" /> ସହ ସେୟାର୍ କରିବାକୁ ଚାହେଁ।</translation> <translation id="2738771556149464852">ପରେ ନୁହେଁ</translation> <translation id="2739191690716947896">ଡିବଗ୍ କରନ୍ତୁ</translation> <translation id="2739240477418971307">ଆପଣଙ୍କର ଆକ୍ସେସିବିଲିଟି ସେଟିଂସ୍ ପରିବର୍ତ୍ତନ କରନ୍ତୁ</translation> @@ -2391,6 +2395,7 @@ <translation id="3677911431265050325">ମୋବାଇଲ୍ ସାଇଟ୍ ପାଇଁ ଅନୁରୋଧ କରନ୍ତୁ</translation> <translation id="3677959414150797585">ଆପ୍, ୱେବପୃଷ୍ଠା ଏବଂ ଆହୁରି ଅନେକ କିଛି ଅନ୍ତର୍ଭୁକ୍ତ କରେ। ଯଦି ଆପଣ ବ୍ୟବହାର ଡାଟା ସେୟାର୍ କରିବାକୁ ବାଛିଥାଆନ୍ତି ତେବେ କେବଳ ପରାମର୍ଶକୁ ଉନ୍ନତ କରିବା ପାଇଁ ପରିସଂଖ୍ୟାନ ପଠାଏ।</translation> <translation id="3678156199662914018">ପରିବର୍ଦ୍ଧନ: <ph name="EXTENSION_NAME" /></translation> +<translation id="3678188444105291936">ଏହି ୱିଣ୍ଡୋରେ ଆପଣ ଦେଖୁଥିବା ପୃଷ୍ଠାଗୁଡ଼ିକ ବ୍ରାଉଜର୍ ଇତିହାସରେ ଦେଖାଯିବ ନାହିଁ ଏବଂ ଆପଣ ସାଇନ୍ ଆଉଟ୍ କରିବା ପରେ କମ୍ପ୍ୟୁଟରରେ ସେଗୁଡ଼ିକ କୁକୀ ପରି ଅନ୍ୟ ଟ୍ରେସ୍ ଛାଡ଼ିବ ନାହିଁ। ଆପଣ ଡାଉନଲୋଡ୍ କରିଥିବା ଫାଇଲଗୁଡ଼ିକ କିମ୍ବା ତିଆରି କରିଥିବା ବୁକମାର୍କଗୁଡ଼ିକ ସଂରକ୍ଷିତ କରାଯାଇପାରିବ ନାହିଁ।</translation> <translation id="3680683624079082902">ଟେକ୍ସଟ୍-ଟୁ-ସ୍ପିଚ୍ ଭଏସ୍</translation> <translation id="3681311097828166361">ଆପଣଙ୍କର ମତାମତ ପାଇଁ ଧନ୍ୟବାଦ। ଆପଣ ବର୍ତ୍ତମାନ ଅଫ୍ଲାଇନ୍ ଅଛନ୍ତି, ଏବଂ ଆପଣଙ୍କ ରିପୋର୍ଟ ପରେ ପଠାଯିବ।</translation> <translation id="3682824389861648626">ଗତିଶୀଳ ଥ୍ରେସ୍ହୋଲ୍ଡ</translation> @@ -2592,6 +2597,7 @@ <translation id="3884152383786131369">ଏକାଧିକ ଭାଷାରେ ଉପଲବ୍ଧ ୱେବ୍ ବିଷୟବସ୍ତୁ ଏହି ତାଲିକାରୁ ପ୍ରଥମ ସମର୍ଥିତ ଭାଷାକୁ ବ୍ୟବହାର କରିବ। ଆପଣଙ୍କ ବ୍ରାଉଜର୍ ସେଟିଂସ୍ ସହିତ ଏହି ପସନ୍ଦଗୁଡ଼ିକୁ ସିଙ୍କ୍ କରାଯାଇଛି। <ph name="BEGIN_LINK_LEARN_MORE" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3886446263141354045">ଏହି ସାଇଟ୍କୁ ଆକ୍ସେସ୍ କରିବାକୁ ଆପଣଙ୍କର ଅନୁରୋଧ <ph name="NAME" />ଙ୍କୁ ପଠାଯାଇଛି</translation> <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" />ରୁ ନୋଟ୍ ନେବା</translation> +<translation id="3888586133700543064">ଆପଣଙ୍କ Assitantର ସମସ୍ୟାକୁ ଆହୁରି ଭଲ ଭାବେ ବୁଝିବାରେ ଏହି ସୂଚନା ଆମକୁ ସାହାଯ୍ୟ କରେ। ଏହାକୁ 90 ଦିନ ପର୍ଯ୍ୟନ୍ତ ଷ୍ଟୋର୍ କରାଯାଇଥାଏ ଏବଂ ଏହାର ଆକ୍ସେସ୍ କେବଳ ଉପଯୁକ୍ତ ଇଞ୍ଜିନିୟରିଂ ଏବଂ ମତାମତ ଟିମ୍ ପାଇଁ ଉଦ୍ଦିଷ୍ଟ ହୋଇଥାଏ।</translation> <translation id="3890064827463908288">ୱାଇ-ଫାଇ ସିଙ୍କ୍ ବ୍ୟବହାର କରିବାକୁ Chrome ସିଙ୍କ୍ ଚାଲୁ କରନ୍ତୁ</translation> <translation id="3892414795099177503">OpenVPN / L2TP ଯୋଗ କରନ୍ତୁ...</translation> <translation id="3893536212201235195">ଆପଣଙ୍କର ଆକ୍ସେସିବିଲିଟୀ ସେଟିଂସ୍ ପଢ଼ନ୍ତୁ ଏବଂ ପରିବର୍ତ୍ତନ କରନ୍ତୁ</translation> @@ -2623,6 +2629,7 @@ <translation id="3916445069167113093">ଏହି ପ୍ରକାର ଫାଇଲ୍ ଆପଣଙ୍କର କମ୍ପ୍ୟୁଟରକୁ କ୍ଷତି କରିପାରେ। ଯେକୌଣସି ମତେ ଆପଣ <ph name="FILE_NAME" /> ରଖିବାକୁ ଚାହୁଁଛନ୍ତି କି?</translation> <translation id="3918972485393593704">Googleକୁ ବିବରଣୀ ରିପୋର୍ଟ କରନ୍ତୁ</translation> <translation id="3919145445993746351">ଆପଣଙ୍କର ସମସ୍ତ କମ୍ପ୍ୟୁଟର୍ରେ ଆପଣଙ୍କର ଏକ୍ସଟେନ୍ସନ୍ ପାଇବା ପାଇଁ, ସିଙ୍କ୍ ଚାଲୁ କରନ୍ତୁ</translation> +<translation id="3919798653937160644">ଏହି ୱିଣ୍ଡୋରେ ଆପଣ ଦେଖୁଥିବା ପୃଷ୍ଠାଗୁଡ଼ିକ ବ୍ରାଉଜର୍ ଇତିହାସରେ ଦେଖାଯିବ ନାହିଁ ଏବଂ କମ୍ପ୍ୟୁଟରରେ ଖୋଲାଥିବା ସମସ୍ତ ଅତିଥି ୱିଣ୍ଡୋକୁ ଆପଣ ବନ୍ଦ କରିବା ପରେ ସେଗୁଡ଼ିକ କୁକୀ ପରି ଅନ୍ୟ ଟ୍ରେସ୍ ଛାଡ଼ିବ ନାହିଁ। କିନ୍ତୁ, ଆପଣ ଡାଉନଲୋଡ୍ କରିଥିବା ଯେ କୌଣସି ଫାଇଲକୁ ସଂରକ୍ଷିତ ରଖାଯିବ।</translation> <translation id="3920504717067627103">ସାର୍ଟିଫିକେଟ୍ ନୀତିଗୁଡ଼ିକ</translation> <translation id="392089482157167418">ChromeVox ସକ୍ଷମ କରନ୍ତୁ (କଥିତ ମତାମତ)</translation> <translation id="3920909973552939961">ପେମେଣ୍ଟ ହ୍ୟାଣ୍ଡଲରଗୁଡ଼ିକ ଇନଷ୍ଟଲ୍ କରିବାକୁ ଅନୁମତି ଦିଆଯାଇନାହିଁ</translation> @@ -2959,6 +2966,7 @@ <translation id="4332976768901252016">ବାପାମାଙ୍କ ନିୟନ୍ତ୍ରଣ ସେଟ୍ ଅପ୍ କରନ୍ତୁ</translation> <translation id="4333854382783149454">RSA ଏନକ୍ରିପ୍ସନ୍ ସହିତ PKCS #1 SHA-1</translation> <translation id="4336434711095810371">ସମସ୍ତ ଡାଟା ଖାଲି କରନ୍ତୁ</translation> +<translation id="4340125850502689798">ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ନାମ ଅବୈଧ ଅଟେ</translation> <translation id="4340515029017875942"><ph name="ORIGIN" />, "<ph name="EXTENSION_NAME" />" ଆପ୍ ସହିତ ବାର୍ତ୍ତାଳାପ କରିବାକୁ ଚାହୁଁଛନ୍ତି</translation> <translation id="4340575312453649552">ଏହି ବିଜ୍ଞାପନ ଆପଣଙ୍କ ଡିଭାଇସ ପାଇଁ ଅନେକଗୁଡ଼ିଏ ରିସୋର୍ସ୍ ବ୍ୟବହାର କରିଛି, ଯାହା ଫଳରେ Chrome ଏହାକୁ କାଢ଼ି ଦେଇଛି।</translation> <translation id="4341577178275615435">କ୍ୟାରେଟ୍ ବ୍ରାଉଜିଂ ଚାଲୁ କିମ୍ବା ବନ୍ଦ କରିବାକୁ, F7 ସର୍ଟକଟ୍ କୀ ବ୍ୟବହାର କରନ୍ତୁ</translation> @@ -3573,6 +3581,7 @@ <translation id="5057110919553308744">ଆପଣ ଯେତେବେଳେ ଏକ୍ସଟେନ୍ସନ୍କୁ କ୍ଲିକ୍ କରିବେ</translation> <translation id="5057403786441168405">ଆପଣଙ୍କର ସାଇନ୍-ଇନ୍ କରାଯାଇଥିବା ଆକାଉଣ୍ଟଗୁଡ଼ିକୁ ପରିଚାଳନା କରନ୍ତୁ। Chrome ଏବଂ Google Playରେ ଥିବା ୱେବସାଇଟ, ଆପ୍ ଏବଂ ଏକ୍ସଟେନସନଗୁଡ଼ିକ ଆପଣଙ୍କ ଅନୁଭୂତିକୁ କଷ୍ଟମାଇଜ୍ କରିବା ପାଇଁ, ଅନୁମତିଗୁଡ଼ିକ ଆଧାରରେ ଏହି ଆକାଉଣ୍ଟଗୁଡ଼ିକୁ ବ୍ୟବହାର କରିପାରେ। <ph name="LINK_BEGIN" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="LINK_END" /></translation> <translation id="5059241099014281248">ସାଇନ୍-ଇନ୍ ପ୍ରତିବନ୍ଧିତ କରନ୍ତୁ</translation> +<translation id="5059526285558225588">କଣ ସେୟାର୍ କରିବେ ତାହା ବାଛନ୍ତୁ</translation> <translation id="5060332552815861872">ସେଭ୍ କରିବା ପାଇଁ 1ଟି ପ୍ରିଣ୍ଟର୍ ଉପଲବ୍ଧ ଅଛି।</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{ଏହି ଫୋଲ୍ଡର୍ରେ ଗୋଟିଏ ବୁକ୍ମାର୍କ ଅଛି। ଆପଣ ଏହାକୁ ଡିଲିଟ୍ କରିବାକୁ ନିଶ୍ଚିତ କି?}other{ଏହି ଫୋଲ୍ଡର୍ରେ #ଟି ବୁକ୍ମାର୍କ ଅଛି। ଆପଣ ଏହାକୁ ଡିଲିଟ୍ କରିବାକୁ ନିଶ୍ଚିତ କି?}}</translation> <translation id="5062930723426326933">ସାଇନ୍-ଇନ୍ କରିବା ବିଫଳ ହେଲା, ଦୟାକରି ଇଣ୍ଟର୍ନେଟ୍କୁ ସଂଯୋଗ କରନ୍ତୁ ଏବଂ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation> @@ -3689,6 +3698,7 @@ <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">ଆପଣଙ୍କର ପ୍ରିୟ ସ୍ମୃତିଗୁଡ଼ିକୁ ପୁନର୍ଜୀବିତ କରନ୍ତୁ। ଆଲବମଗୁଡ଼ିକ ଯୋଗ କରିବା କିମ୍ବା ସେଗୁଡ଼ିକୁ ଏଡିଟ୍ କରିବା ପାଇଁ <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" />କୁ ଯାଆନ୍ତୁ।</translation> <translation id="5190926251776387065">ପୋର୍ଟ ସକ୍ରିୟ କରନ୍ତୁ</translation> +<translation id="5191094172448199359">ଆପଣ ଲେଖିଥିବା PINଗୁଡ଼ିକ ମେଳ ହେଉ ନାହିଁ</translation> <translation id="5191251636205085390">ତୃତୀୟ-ପକ୍ଷ କୁକୀଗୁଡ଼ିକୁ ପରିବର୍ତ୍ତନ କରିବାକୁ ଲକ୍ଷ୍ୟ ରଖୁଥିବା ନୂଆ ଟେକ୍ନୋଲୋଜିଗୁଡ଼ିକ ବିଷୟରେ ଜାଣନ୍ତୁ ଏବଂ ସେଗୁଡ଼ିକୁ ନିୟନ୍ତ୍ରଣ କରନ୍ତୁ</translation> <translation id="51918995459521422"><ph name="ORIGIN" /> ଏକାଧିକ ଫାଇଲ୍ ଡାଉନ୍ଲୋଡ୍ କରିବାକୁ ଚାହୁଁଛି</translation> <translation id="5192062846343383368">ଆପଣଙ୍କର ନିରୀକ୍ଷଣ ସେଟିଂସ୍ ଦେଖିବାକୁ Family Link ଆପ୍ ଖୋଲନ୍ତୁ</translation> @@ -3701,6 +3711,7 @@ <translation id="5204673965307125349">ଦୟାକରି ଡିଭାଇସ୍କୁ ପାୱାର୍ୱାସ୍ କରନ୍ତୁ ଏବଂ ପୁଣି ଥରେ ଚେଷ୍ଟା କରନ୍ତୁ।</translation> <translation id="5204967432542742771">ପାସ୍ୱର୍ଡ ଲେଖନ୍ତୁ</translation> <translation id="5205484256512407285">ସ୍ଥାନାନ୍ତର କରିବାକୁ କେବେ ବି ମୋବାଇଲ ଡାଟା ବ୍ୟବହାର କରନ୍ତୁ ନାହିଁ</translation> +<translation id="520568280985468584">ନେଟୱାର୍କ ସଫଳତାର ସହ ଯୋଗ କରାଯାଇଛି। ଆପଣଙ୍କ ସେଲ୍ୟୁଲାର୍ ନେଟୱାର୍କ ସକ୍ରିୟ ହେବା ପାଇଁ କିଛି ସମୟ ଲାଗିପାରେ।</translation> <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />" ଡିଲିଟ୍ କରିବେ କି?</translation> <translation id="520621735928254154">ସାର୍ଟିଫିକେଟ୍ ଇମ୍ପୋର୍ଟ ତ୍ରୁଟି</translation> <translation id="5206787458656075734">{COUNT,plural, =1{ଚୋରି ହୋଇଯାଇଥିବା ପାସୱାର୍ଡ ସଫଳତାର ସହ ପରିବର୍ତ୍ତନ କରାଯାଇଛି। ଆପଣଙ୍କର #ଟି ଅଧିକ ଚୋରି ହୋଇଯାଇଥିବା ପାସୱାର୍ଡ ଅଛି। Chrome ଏହି ପାସୱାର୍ଡକୁ ବର୍ତ୍ତମାନ ଯାଞ୍ଚ କରିବା ପାଇଁ ସୁପାରିଶ କରେ।}other{ଚୋରି ହୋଇଯାଇଥିବା ପାସୱାର୍ଡ ସଫଳତାର ସହ ପରିବର୍ତ୍ତନ କରାଯାଇଛି। ଆପଣଙ୍କର #ଟି ଅଧିକ ଚୋରି ହୋଇଯାଇଥିବା ପାସୱାର୍ଡ ଅଛି। Chrome ଏହି ପାସୱାର୍ଡଗୁଡ଼ିକୁ ବର୍ତ୍ତମାନ ଯାଞ୍ଚ କରିବା ପାଇଁ ସୁପାରିଶ କରେ।}}</translation> @@ -4335,6 +4346,7 @@ <translation id="5935656526031444304">ସେଫ୍ ବ୍ରାଉଜିଂ ପରିଚାଳନା କରନ୍ତୁ</translation> <translation id="5938002010494270685">ସୁରକ୍ଷା ଅପ୍ଗ୍ରେଡ୍ ଉପଲବ୍ଧ ଅଛି</translation> <translation id="5939518447894949180">ପୁନଃସେଟ୍</translation> +<translation id="5939719276406088041">ସର୍ଟକଟ୍ ତିଆରି କରାଯାଇପାରିବ ନାହିଁ</translation> <translation id="5941153596444580863">ଲୋକଙ୍କୁ ଯୋଗ କରନ୍ତୁ...</translation> <translation id="5941343993301164315"><ph name="TOKEN_NAME" />ରେ ସାଇନ୍ ଇନ୍ କରନ୍ତୁ।</translation> <translation id="5941711191222866238">ସର୍ବନିମ୍ନ କରନ୍ତୁ</translation> @@ -4422,6 +4434,7 @@ <translation id="6043994281159824495">ବର୍ତ୍ତମାନ ସାଇନ୍ ଆଉଟ୍ କରନ୍ତୁ</translation> <translation id="6044805581023976844"><ph name="APP_NAME" />, <ph name="TAB_NAME" /> ସହିତ ଏକ Chrome ଟାବ୍ ଏବଂ ଅଡିଓ ସେୟାର୍ କରୁଛି।</translation> <translation id="6045114302329202345">ପ୍ରାଥମିକ TrackPoint ବଟନ୍</translation> +<translation id="6047632800149092791">ସିଙ୍କ୍ କାମ କରୁନାହିଁ। ସାଇନ୍ ଆଉଟ୍ କରି ପୁଣି ସାଇନ୍ ଇନ୍ କରିବାକୁ ଚେଷ୍ଟା କରନ୍ତୁ।</translation> <translation id="6049004884579590341">ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନ୍ରୁ ପ୍ରସ୍ଥାନ କରିବାକୁ |<ph name="ACCELERATOR" />|କୁ ଦବାଇ ଧରନ୍ତୁ</translation> <translation id="6051354611314852653">ଓହୋଃ! ଏହି ଡିଭାଇସ୍ ପାଇଁ API ଆକ୍ସେସ୍ ଅଧିକୃତ କରିବାରେ ସିଷ୍ଟମ୍ ବିଫଳ ହେଲା।</translation> <translation id="6052976518993719690">SSL ସାର୍ଟିଫିକେସନ୍ କର୍ତ୍ତୃପକ୍ଷ</translation> @@ -4514,6 +4527,7 @@ <translation id="6143186082490678276">ସାହାଯ୍ୟ ପାଆନ୍ତୁ</translation> <translation id="6143366292569327983">କେଉଁ ଭାଷାର ପୃଷ୍ଠାକୁ ଅନୁବାଦ କରିବେ ତାହା ବାଛନ୍ତୁ</translation> <translation id="6144938890088808325">Chromebooks ଉନ୍ନତ କରିବାରେ ଆମକୁ ସାହାଯ୍ୟ କରନ୍ତୁ</translation> +<translation id="6146409560350811147">ସିଙ୍କ୍ କାମ କରୁନାହିଁ। ପୁଣି ସାଇନ୍ ଇନ୍ କରିବାକୁ ଚେଷ୍ଟା କରନ୍ତୁ।</translation> <translation id="6147020289383635445">ପ୍ରିଣ୍ଟ ପୂର୍ବାବଲୋକନ ବିଫଳ ହେଲା।</translation> <translation id="6148576794665275391">ବର୍ତ୍ତମାନ ଖୋଲନ୍ତୁ</translation> <translation id="6149015141270619212">ଇଣ୍ଟର୍ନେଟ୍ ସହ ସଂଯୋଗ ହୋଇପାରୁ ନାହିଁ</translation> @@ -4581,6 +4595,7 @@ <translation id="6232017090690406397">ବ୍ୟାଟେରୀ</translation> <translation id="6232116551750539448"><ph name="NAME" /> ସହ ସଂଯୋଗ ବିଚ୍ଛିନ୍ନ ହୋଇଯାଇଛି</translation> <translation id="6233154960150021497">ଡିଫଲ୍ଟ ଭାବେ କୀବୋର୍ଡ ପରିବର୍ତ୍ତେ ଭଏସ୍ ବ୍ୟବହାର କରିବା</translation> +<translation id="6234108445915742946">ମାର୍ଚ୍ଚ 31ରୁ Chromeର ସେବାର ସର୍ତ୍ତାବଳୀ ବଦଳିବାକୁ ଯାଉଛି</translation> <translation id="6234474535228214774">ବାକିଗୁଡ଼ିକୁ ଇନ୍ଷ୍ଟଲ୍ କରନ୍ତୁ</translation> <translation id="6237474966939441970">ଷ୍ଟାଇଲସ୍ ନୋଟ୍-ଲେଖିବା ଆପ୍</translation> <translation id="6237816943013845465">ଆପଣଙ୍କୁ, ଆପଣଙ୍କର ସ୍କ୍ରିନ୍ ରିଜୋଲ୍ୟୁଶନ୍ ଆଡ୍ଜଷ୍ଟ କରିବା ପାଇଁ ଅନୁମତି ଦିଏ</translation> @@ -4881,6 +4896,7 @@ <translation id="656293578423618167">ଫାଇଲ୍ର ପାଥ୍ କିମ୍ବା ନାମ ବହୁତ ଲମ୍ବା ଅଟେ। ଦୟାକରି ଛୋଟ ନାମରେ କିମ୍ବା ଅନ୍ୟ ଏକ ଲୋକେସନ୍ରେ ସେଭ୍ କରନ୍ତୁ।</translation> <translation id="6563469144985748109">ଏପର୍ଯ୍ୟନ୍ତସୁଦ୍ଧା ଆପଣଙ୍କର ପରିଚାଳକ ଏହାକୁ ଅନୁମୋଦିତ କରିନାହାନ୍ତି</translation> <translation id="6569934958368283244">ଅନ୍ୟ ବ୍ୟକ୍ତି</translation> +<translation id="6573497332121198392">ସର୍ଟକଟକୁ କଢ଼ା ଯାଇପାରିବ ନାହିଁ</translation> <translation id="657402800789773160">ଏହି ପୃଷ୍ଠାକୁ &ରିଲୋଡ୍ କରନ୍ତୁ</translation> <translation id="6577284282025554716">ଏହି ଫାଇଲ୍ ଡାଉନ୍ଲୋଡ୍ ବାତିଲ୍ ହେଲା: <ph name="FILE_NAME" /></translation> <translation id="657866106756413002">ନେଟୱାର୍କ ହେଲଥ୍ ସ୍ନାପସଟ୍</translation> @@ -4888,6 +4904,7 @@ <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> - ଡେସ୍କଟପ୍ ବିଷୟବସ୍ତୁ ସେୟାର୍ କରାଯାଇଛି</translation> <translation id="6580203076670148210">ସ୍କାନିଂ ବେଗ</translation> <translation id="6582080224869403177">ଆପଣଙ୍କ ସୁରକ୍ଷାକୁ ଅପ୍ଗ୍ରେଡ୍ କରିବାକୁ ନିଜର <ph name="DEVICE_TYPE" />କୁ ରିସେଟ୍ କରନ୍ତୁ।</translation> +<translation id="6582274660680936615">ଆପଣ ଜଣେ ଅତିଥି ଭାବରେ ବ୍ରାଉଜ୍ କରୁଛନ୍ତି</translation> <translation id="6584878029876017575">Microsoft Lifetime Signing</translation> <translation id="6586099239452884121">ଗେଷ୍ଟ ବ୍ରାଉଜିଂ</translation> <translation id="6586451623538375658">ପ୍ରାଥମିକ ମାଉସ୍ ବଟନ୍ ସ୍ୱାପ୍ କରନ୍ତୁ</translation> @@ -5058,6 +5075,7 @@ <translation id="6782468519961184511">ଆପଣଙ୍କ ଆଡମିନିଷ୍ଟ୍ରେଟର୍ ଅତିରିକ୍ତ Google ଆକାଉଣ୍ଟଗୁଡ଼ିକୁ ଅନୁମତି ଦିଅନ୍ତି ନାହିଁ</translation> <translation id="6785518634832172390">PIN ନିଶ୍ଚିତ ଭାବେ 12ଟି ଅଙ୍କ କିମ୍ବା ତାଠାରୁ କମ୍ ହୋଇଥିବା ଆବଶ୍ୟକ</translation> <translation id="6786747875388722282">ପରିବର୍ଦ୍ଧନ</translation> +<translation id="6787097042755590313">ଅନ୍ୟ ଟାବ୍</translation> <translation id="6787839852456839824">କୀ'ବୋର୍ଡ ସର୍ଟକଟ୍ଗୁଡ଼ିକ</translation> <translation id="6788210894632713004">ଏକ୍ସଟେନ୍ସନ୍ ଖୋଲନ୍ତୁ</translation> <translation id="6789592661892473991">ହରିଜୋଣ୍ଟାଲ୍ ଭାବରେ ଭାଗ କରନ୍ତୁ</translation> @@ -5068,6 +5086,7 @@ <translation id="6793723358811598107">'<ph name="ACTION" />' କାର୍ଯ୍ୟକୁ ପୂର୍ବରୁ '<ph name="CURRENTKEY" />'କୁ ଆସାଇନ୍ କରାଯାଇଛି। ବାହାରି ଯିବା ପାଇଁ ଯେ କୌଣସି କୀକୁ ଦବାନ୍ତୁ।</translation> <translation id="6795884519221689054">ପାଣ୍ଡା</translation> <translation id="6797493596609571643">ଓହୋଃ, କିଛି ଭୁଲ୍ ହୋଇଗଲା!</translation> +<translation id="6798420440063423019">ଭୁଲ PIN ବହୁତ ଥର ଲେଖାଯାଇଥିବା ଯୋଗୁଁ ସୁରକ୍ଷା କୀ ଲକ୍ ହୋଇଯାଇଛି। ଆପଣଙ୍କୁ ସୁରକ୍ଷା କୀ ରିସେଟ୍ କରିବାକୁ ହେବ।</translation> <translation id="6798578729981748444">ଇମ୍ପୋର୍ଟିଂ ସମାପ୍ତ କରିବାକୁ ସମସ୍ତ Firefox ୱିଣ୍ଡୋ ବନ୍ଦ କରନ୍ତୁ।</translation> <translation id="6798780071646309401">caps lock ଚାଲୁ ଅଛି</translation> <translation id="6798954102094737107">ପ୍ଲଗ୍ଇନ୍: <ph name="PLUGIN_NAME" /></translation> @@ -5413,6 +5432,7 @@ <translation id="7180865173735832675">କଷ୍ଟୋମାଇଜ୍</translation> <translation id="7182791023900310535">ଆପଣଙ୍କ ପାସୱାର୍ଡ ମୁଭ୍ କରନ୍ତୁ</translation> <translation id="7186088072322679094">ଟୁଲ୍ବାର୍ରେ ରଖନ୍ତୁ</translation> +<translation id="7186303001964993981">ଏହି ଫୋଲ୍ଡରରେ ସିଷ୍ଟମ୍ ଫାଇଲଗୁଡ଼ିକ ଥିବା ଯୋଗୁଁ <ph name="ORIGIN" /> ଏହାକୁ ଖୋଲି ପାରିବ ନାହିଁ</translation> <translation id="7187428571767585875">ଏପରି ପଞ୍ଜୀକୃତ ଲେଖାଗୁଡ଼ିକୁ କଢ଼ାଯିବା କିମ୍ବା ପରିବର୍ତ୍ତନ କରିବା ଉଚିତ:</translation> <translation id="7187855807420906517">ଆପଣ ଛାଡ଼ି ଦେବା କିମ୍ବା ଅଫଲାଇନ୍ ହେବା ପରେ, ସାଇଟଗୁଡ଼ିକ ସାଧାରଣତଃ ଫଟୋଗୁଡ଼ିକୁ ଅପଲୋଡ୍ କରିବା କିମ୍ବା ଏକ ଚାଟ୍ ମେସେଜ୍ ପଠାଇବା ପରି, ଟାସ୍କଗୁଡ଼ିକୁ ସମାପ୍ତ କରିବାକୁ ସିଙ୍କ କରିବା ଜାରି ରଖିଥାଏ</translation> <translation id="7189234443051076392">ଏହା ସୁନିଶ୍ଚିତ କରନ୍ତୁ ଯେ ଆପଣଙ୍କର ଡିଭାଇସ୍ରେ ଯଥେଷ୍ଟ ସ୍ଥାନ ଅଛି।</translation> @@ -6033,6 +6053,7 @@ <translation id="7871109039747854576">ପ୍ରାର୍ଥୀଙ୍କ ତାଲିକାକୁ ପୃଷ୍ଠାରେ ନେବା ପାଇଁ <ph name="COMMA" /> ଓ <ph name="PERIOD" /> କୀ ବ୍ୟବହାର କରନ୍ତୁ</translation> <translation id="787268756490971083">ବନ୍ଦ ଅଛି</translation> <translation id="7874257161694977650">Chromeର ପୃଷ୍ଠପଟ</translation> +<translation id="7876027585589532670">ସର୍ଟକଟକୁ ଏଡିଟ୍ କରାଯାଇପାରିବ ନାହିଁ</translation> <translation id="7877451762676714207">ଅଜଣା ସର୍ଭର୍ ତ୍ରୁଟି। ଦୟାକରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ କିମ୍ବା ସର୍ଭର୍ ବ୍ୟବସ୍ଥାପକଙ୍କ ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ।</translation> <translation id="7879631849810108578">ସର୍ଟକଟ୍ ସେଟ୍ କରାଯାଇଛି: <ph name="IDS_SHORT_SET_COMMAND" /></translation> <translation id="7880823633812189969">ଯେତେବେଳେ ଆପଣ ରିଷ୍ଟାର୍ଟ କରିବେ ସେତେବେଳେ ସ୍ଥାନୀୟ ଡାଟା ଡିଲିଟ୍ ହୋଇଯିବ</translation> @@ -6316,6 +6337,7 @@ <translation id="8189750580333936930">Privacy Sandbox</translation> <translation id="8190193592390505034"><ph name="PROVIDER_NAME" /> ସହ ସଂଯୋଗ କରାଯାଉଛି</translation> <translation id="8191230140820435481">ନିଜର ଆପ୍ସ, ଏକ୍ସଟେନ୍ସନ୍ଗୁଡ଼ିକ ଓ ଥିମ୍ଗୁଡ଼ିକ ପରିଚାଳନା କରନ୍ତୁ</translation> +<translation id="8192944472786724289"><ph name="APP_NAME" /> ଆପଣଙ୍କ ସ୍କ୍ରିନର ବିଷୟବସ୍ତୁକୁ ସେୟାର୍ କରିବାକୁ ଚାହେଁ।</translation> <translation id="8195027750202970175">ଡିସ୍କରେ ଆକାର</translation> <translation id="8198323535106903877">ଆମେ ଆପଣଙ୍କ ପାଇଁ ସେହି <ph name="NUMBER_OF_APPS" />ଟି ଆପ୍ ଇନଷ୍ଟଲ୍ କରିବୁ</translation> <translation id="8199300056570174101">ନେଟ୍ୱାର୍କ (ସେବା) ଏବଂ ଡିଭାଇସ୍ର ଗୁଣଧର୍ମ</translation> @@ -6965,6 +6987,7 @@ <translation id="8931475688782629595">ଆପଣ କଣ ସିଙ୍କ୍ କରନ୍ତି ତାହା ପରିଚାଳନା କରନ୍ତୁ</translation> <translation id="8932654652795262306">ଇନଷ୍ଟାଣ୍ଟ ଟିଥରିଂ ବିବରଣୀ</translation> <translation id="8932894639908691771">ସ୍ୱିଚ୍ ଆକ୍ସେସ୍ ପାଇଁ ବିକଳ୍ପଗୁଡ଼ିକ</translation> +<translation id="893298445929867520">କାର୍ଟଗୁଡ଼ିକ ଲୁକ୍କାୟିତ ଅଛି। ଯେତେବେଳେ ଆପଣ ପରିବର୍ତ୍ତନ କରିବେ ସେଗୁଡ଼ିକ ପୁଣି ଦେଖାଯିବ।</translation> <translation id="8933960630081805351">&ଫାଇଣ୍ଡର୍ରେ ଦେଖାନ୍ତୁ</translation> <translation id="8934732568177537184">ଜାରି ରଖନ୍ତୁ</translation> <translation id="8938306522009698937">ହ୍ୟାଣ୍ଡଲରଗୁଡ଼ିକ</translation> @@ -7241,6 +7264,7 @@ <translation id="942532530371314860"><ph name="APP_NAME" /> ଏକ ଟାବ୍ ଏବଂ ଅଡ଼ିଓ ସେୟାର୍ କରୁଛି।</translation> <translation id="945522503751344254">ମତାମତ ପଠାନ୍ତୁ</translation> <translation id="947329552760389097">&ଉପାଦାନଗୁଡ଼ିକ ନିରୀକ୍ଷଣ କରନ୍ତୁ</translation> +<translation id="947667444780368238">ଏହି ଫୋଲ୍ଡରରେ ସିଷ୍ଟମ୍ ଫାଇଲଗୁଡ଼ିକ ଥିବା ଯୋଗୁଁ <ph name="ORIGIN" /> ଏଥିରେ ଥିବା ଫାଇଲଗୁଡ଼ିକୁ ଖୋଲି ପାରିବ ନାହିଁ</translation> <translation id="951991426597076286">ଅଗ୍ରାହ୍ୟ କରନ୍ତୁ</translation> <translation id="956500788634395331">ଆପଣ ସମ୍ଭାବ୍ୟ କ୍ଷତିକାରକ ଏକ୍ସଟେନସନଗୁଡ଼ିକରୁ ସୁରକ୍ଷିତ ଅଛନ୍ତି</translation> <translation id="957960681186851048">ଏହି ସାଇଟ୍ ସ୍ୱଚାଳିତ ଭାବେ ଏକାଧିକ ଫାଇଲ୍ ଡାଉନ୍ଲୋଡ୍ କରିବାକୁ ଚେଷ୍ଟା କରୁଛି</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index 97b388b..f5d6a68 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -7000,7 +7000,7 @@ <translation id="8931475688782629595">Gerenciar o que é sincronizado</translation> <translation id="8932654652795262306">Detalhes do tethering instantâneo</translation> <translation id="8932894639908691771">Opções do acesso com interruptor</translation> -<translation id="893298445929867520">Carrinhos ocultados. Eles aparecerão novamente quando mudanças forem aplicadas.</translation> +<translation id="893298445929867520">Carrinhos ocultados. Eles aparecerão novamente quando você fizer alguma mudança.</translation> <translation id="8933960630081805351">&Mostrar no Finder</translation> <translation id="8934732568177537184">Continuar</translation> <translation id="8938306522009698937">gerenciadores</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index 1b38e4d..5138b1e9 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -576,6 +576,7 @@ <translation id="1627408615528139100">Descărcat deja</translation> <translation id="1628948239858170093">Scanezi fișierul înainte să îl deschizi?</translation> <translation id="1629314197035607094">Parola a expirat</translation> +<translation id="1629521517399325891">Certificatul de utilizator nu este disponibil pentru autentificarea în rețea.</translation> <translation id="163072119192489970">Au permisiunea de a finaliza trimiterea și primirea datelor</translation> <translation id="1630768113285622200">Repornește și continuă</translation> <translation id="1632082166874334883">Parola a fost stocată în contul tău Google</translation> @@ -1180,6 +1181,7 @@ <translation id="2300383962156589922">Personalizează și controlează <ph name="APP_NAME" /></translation> <translation id="2301382460326681002">Directorul rădăcină pentru extensie este nevalid.</translation> <translation id="23030561267973084">„<ph name="EXTENSION_NAME" />” a solicitat permisiuni suplimentare.</translation> +<translation id="230529452743010958">Articolul afișat se bazează pe activitatea ta anterioară în serviciile Google. Poți să vezi datele, să le ștergi și să modifici setările la <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="23055578400314116">Selectează un nume de utilizator</translation> <translation id="2307462900900812319">Configurați rețeaua</translation> <translation id="230927227160767054">Această pagină dorește să instaleze un handler de serviciu.</translation> @@ -1406,6 +1408,7 @@ <translation id="2541706104884128042">A fost setată o nouă oră de culcare</translation> <translation id="2542050502251273923">Setează nivelul de remediere a erorilor al managerului conexiunilor de rețea și al altor servicii folosind ff_debug.</translation> <translation id="2544292303401268586">Administratorul a solicitat să repornești dispozitivul pentru a actualiza aplicațiile. Procesul poate dura câteva minute.</translation> +<translation id="2544352060595557290">Această filă</translation> <translation id="2544853746127077729">Certificatul de autentificare a fost respins de rețea</translation> <translation id="2546283357679194313">Cookie-uri și date privind site-ul</translation> <translation id="2548347166720081527">Se permite <ph name="PERMISSION" /></translation> @@ -1571,6 +1574,7 @@ <translation id="2734760316755174687">Site-urile din <ph name="SITE_GROUP_NAME" /> vor fi și ele resetate.</translation> <translation id="2735712963799620190">Program</translation> <translation id="2737363922397526254">Restrânge...</translation> +<translation id="2737916598897808047"><ph name="APP_NAME" /> solicită permisiunea de a trimite conținut de pe ecran la <ph name="TARGET_NAME" />.</translation> <translation id="2738771556149464852">Nu după</translation> <translation id="2739191690716947896">Remediați erorile</translation> <translation id="2739240477418971307">Modifică setările de accesibilitate</translation> @@ -2399,6 +2403,7 @@ <translation id="3677911431265050325">Solicită site mobil</translation> <translation id="3677959414150797585">Include aplicații, pagini web și altele. Trimite statistici pentru a îmbunătăți sugestiile numai dacă ai ales să permiți accesul la datele de utilizare.</translation> <translation id="3678156199662914018">Extensie: <ph name="EXTENSION_NAME" /></translation> +<translation id="3678188444105291936">Paginile pe care le accesezi în această fereastră nu vor apărea în istoricul browserului și nu vor lăsa alte urme pe computer (de exemplu, cookie-uri) după ce te deconectezi. Fișierele pe care le descarci și marcajele pe care le creezi nu se vor păstra.</translation> <translation id="3680683624079082902">Vocea pentru redarea vocală a textului</translation> <translation id="3681311097828166361">Îți mulțumim pentru feedback. Acum ești offline, iar raportul va fi trimis mai târziu.</translation> <translation id="3682824389861648626">Limită de mișcare</translation> @@ -2600,6 +2605,7 @@ <translation id="3884152383786131369">Conținutul web care este disponibil în mai multe limbi va folosi prima limbă acceptată din această listă. Aceste preferințe se sincronizează cu setările browserului. <ph name="BEGIN_LINK_LEARN_MORE" />Află mai multe<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3886446263141354045">Solicitarea de a accesa acest site a fost trimisă către <ph name="NAME" /></translation> <translation id="3888550877729210209">Scriere de notițe cu <ph name="LOCK_SCREEN_APP_NAME" /></translation> +<translation id="3888586133700543064">Aceste informații ne ajută să înțelegem mai bine problema cu Asistentul. Informațiile sunt stocate timp de cel mult 90 de zile, iar accesul la ele este restricționat la echipele de ingineri și de feedback adecvate.</translation> <translation id="3890064827463908288">Activează Sincronizarea Chrome pentru a folosi Sincronizarea Wi-Fi</translation> <translation id="3892414795099177503">Adaugă OpenVPN/L2TP…</translation> <translation id="3893536212201235195">Citește și modifică setările de accesibilitate</translation> @@ -2631,6 +2637,7 @@ <translation id="3916445069167113093">Acest tip de fișier poate dăuna computerului. Vrei să păstrezi <ph name="FILE_NAME" /> totuși?</translation> <translation id="3918972485393593704">Raportează detaliile la Google</translation> <translation id="3919145445993746351">Pentru a accesa extensiile pe toate computerele, activează sincronizarea</translation> +<translation id="3919798653937160644">Paginile pe care le accesezi în această fereastră nu vor apărea în istoricul browserului și nu vor lăsa alte urme pe computer (de exemplu, cookie-uri) după ce închizi toate ferestrele deschise în modul pentru invitați. Însă fișierele pe care le descarci vor fi păstrate.</translation> <translation id="3920504717067627103">Politici de certificat</translation> <translation id="392089482157167418">Activați ChromeVox (feedback rostit)</translation> <translation id="3920909973552939961">Nu au permisiunea de a instala handlere pentru plăți</translation> @@ -2968,6 +2975,7 @@ <translation id="4332976768901252016">Configurează controlul parental</translation> <translation id="4333854382783149454">PKCS #1 SHA-1 cu criptare RSA</translation> <translation id="4336434711095810371">Șterge toate datele</translation> +<translation id="4340125850502689798">Nume de utilizator nevalid</translation> <translation id="4340515029017875942"><ph name="ORIGIN" /> dorește să comunice cu aplicația „<ph name="EXTENSION_NAME" />”</translation> <translation id="4340575312453649552">Anunțul folosea prea multe resurse pentru dispozitivul tău, așa că Chrome l-a eliminat.</translation> <translation id="4341577178275615435">Pentru a activa sau a dezactiva navigarea cu tastatura, folosește comanda rapidă F7</translation> @@ -3582,6 +3590,7 @@ <translation id="5057110919553308744">Când dai clic pe extensie</translation> <translation id="5057403786441168405">Gestionează-ți conturile conectate. Site-urile, aplicațiile și extensiile din Chrome și Google Play pot folosi aceste conturi pentru a-ți personaliza experiența, în funcție de permisiuni. <ph name="LINK_BEGIN" />Află mai multe<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Restricționează conectarea</translation> +<translation id="5059526285558225588">Alege ce să distribui</translation> <translation id="5060332552815861872">Există o imprimantă de salvat.</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{Acest dosar conține un marcaj. Sigur dorești să îl ștergi?}few{Acest dosar conține # marcaje. Sigur dorești să îl ștergi?}other{Acest dosar conține # de marcaje. Sigur dorești să îl ștergi?}}</translation> <translation id="5062930723426326933">Conectarea nu a reușit, conectați-vă la internet și încercați din nou.</translation> @@ -3698,6 +3707,7 @@ <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">Retrăiește amintirile preferate. Pentru a adăuga sau a edita albume, accesează <ph name="LINK_BEGIN" />Google Foto<ph name="LINK_END" />.</translation> <translation id="5190926251776387065">Activează portul</translation> +<translation id="5191094172448199359">Codurile PIN introduse nu sunt identice</translation> <translation id="5191251636205085390">Află despre și folosește tehnologii noi, destinate să înlocuiască cookie-urile terță parte</translation> <translation id="51918995459521422"><ph name="ORIGIN" /> vrea să descarce mai multe fișiere</translation> <translation id="5192062846343383368">Deschide aplicația Family Link și vezi setările de supraveghere</translation> @@ -3710,6 +3720,7 @@ <translation id="5204673965307125349">Folosește funcția Powerwash pe dispozitiv și încearcă din nou.</translation> <translation id="5204967432542742771">Introdu parola</translation> <translation id="5205484256512407285">Nu folosi niciodată date mobile pentru transfer</translation> +<translation id="520568280985468584">Rețeaua a fost adăugată. Este posibil ca activarea rețelei de date mobile să dureze câteva minute.</translation> <translation id="5206215183583316675">Ștergi „<ph name="CERTIFICATE_NAME" />”?</translation> <translation id="520621735928254154">Eroare la importul certificatului</translation> <translation id="5206787458656075734">{COUNT,plural, =1{Parola compromisă a fost schimbată. Mai ai # parolă compromisă. Chrome recomandă să verifici acum parola.}few{Parola compromisă a fost schimbată. Mai ai # parole compromise. Chrome recomandă să verifici acum parolele.}other{Parola compromisă a fost schimbată. Mai ai # de parole compromise. Chrome recomandă să verifici acum parolele.}}</translation> @@ -4344,6 +4355,7 @@ <translation id="5935656526031444304">Gestionează Navigarea sigură</translation> <translation id="5938002010494270685">Este disponibilă o actualizare de securitate</translation> <translation id="5939518447894949180">Resetează</translation> +<translation id="5939719276406088041">Nu se poate crea comanda rapidă</translation> <translation id="5941153596444580863">Adaugă o persoană...</translation> <translation id="5941343993301164315">Conectează-te la <ph name="TOKEN_NAME" />.</translation> <translation id="5941711191222866238">Minimizează</translation> @@ -4431,6 +4443,7 @@ <translation id="6043994281159824495">Deconectați-vă acum</translation> <translation id="6044805581023976844"><ph name="APP_NAME" /> trimite conținutul unei file Chrome și conținutul audio către <ph name="TAB_NAME" />.</translation> <translation id="6045114302329202345">Butonul TrackPoint principal</translation> +<translation id="6047632800149092791">Sincronizarea nu funcționează. Deconectează-te și conectează-te din nou.</translation> <translation id="6049004884579590341">Pentru a ieși din ecranul complet, apasă lung |<ph name="ACCELERATOR" />|</translation> <translation id="6051354611314852653">Hopa! Sistemul nu a putut să autorizeze accesul la API pentru acest dispozitiv.</translation> <translation id="6052976518993719690">Autoritate de certificare SSL</translation> @@ -4523,6 +4536,7 @@ <translation id="6143186082490678276">Primiți ajutor</translation> <translation id="6143366292569327983">Alege limba paginii din care vrei să traduci</translation> <translation id="6144938890088808325">Ajută-ne să îmbunătățim Chromebookurile</translation> +<translation id="6146409560350811147">Sincronizarea nu funcționează. Încearcă să te conectezi din nou.</translation> <translation id="6147020289383635445">Previzualizarea înainte de printare nu a reușit.</translation> <translation id="6148576794665275391">Deschide acum</translation> <translation id="6149015141270619212">Nu se poate conecta la internet</translation> @@ -4590,6 +4604,7 @@ <translation id="6232017090690406397">Baterie</translation> <translation id="6232116551750539448">S-a pierdut conexiunea la <ph name="NAME" /></translation> <translation id="6233154960150021497">Setarea prestabilită este de a folosi vocea în locul tastaturii</translation> +<translation id="6234108445915742946">Termenii și condițiile Chrome se modifică la 31 martie</translation> <translation id="6234474535228214774">Instalare în așteptare</translation> <translation id="6237474966939441970">Aplicație de creare a notelor cu creionul</translation> <translation id="6237816943013845465">Cu ajutorul acestei setări, poți să ajustezi rezoluția ecranului</translation> @@ -4889,6 +4904,7 @@ <translation id="656293578423618167">Calea sau numele fișierului sunt prea lungi. Salvați utilizând un nume mai scurt sau într-o altă locație.</translation> <translation id="6563469144985748109">Administratorul nu l-a aprobat încă</translation> <translation id="6569934958368283244">Alte persoane</translation> +<translation id="6573497332121198392">Nu se poate elimina comanda rapidă</translation> <translation id="657402800789773160">&Reîncarcă această pagină</translation> <translation id="6577284282025554716">Descărcare anulată: <ph name="FILE_NAME" /></translation> <translation id="657866106756413002">Captură de ecran pentru starea rețelei</translation> @@ -4896,6 +4912,7 @@ <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> – Conținut de pe desktop la care s-a permis accesul</translation> <translation id="6580203076670148210">Viteza de scanare</translation> <translation id="6582080224869403177">Resetează <ph name="DEVICE_TYPE" /> pentru a îmbunătăți securitatea.</translation> +<translation id="6582274660680936615">Navighezi ca invitat</translation> <translation id="6584878029876017575">Semnare Microsoft pe durata de viață</translation> <translation id="6586099239452884121">Navigare ca invitat</translation> <translation id="6586451623538375658">Comutați butonul principal al mouse-ului</translation> @@ -5065,6 +5082,7 @@ <translation id="6782468519961184511">Administratorul nu permite Conturi Google suplimentare</translation> <translation id="6785518634832172390">Codul PIN trebuie să aibă maximum 12 cifre</translation> <translation id="6786747875388722282">Extensii</translation> +<translation id="6787097042755590313">Altă filă</translation> <translation id="6787839852456839824">Comenzi rapide de la tastatură</translation> <translation id="6788210894632713004">Extensie neîmpachetată</translation> <translation id="6789592661892473991">Împarte pe orizontală</translation> @@ -5075,6 +5093,7 @@ <translation id="6793723358811598107">Tasta „<ph name="CURRENTKEY" />” a fost deja asociată acțiunii „<ph name="ACTION" />”. Apasă pe orice tastă pentru a ieși.</translation> <translation id="6795884519221689054">Panda</translation> <translation id="6797493596609571643">Hopa! A apărut o eroare.</translation> +<translation id="6798420440063423019">Cheia de securitate este blocată deoarece codul PIN a fost introdus greșit de prea multe ori. Trebuie să resetezi cheia de securitate.</translation> <translation id="6798578729981748444">Pentru a finaliza importul, închide toate ferestrele Firefox.</translation> <translation id="6798780071646309401">tasta Caps Lock este activată</translation> <translation id="6798954102094737107">Plugin: <ph name="PLUGIN_NAME" /></translation> @@ -5420,6 +5439,7 @@ <translation id="7180865173735832675">Personalizează</translation> <translation id="7182791023900310535">Mută parola</translation> <translation id="7186088072322679094">Păstrează în bara de instrumente</translation> +<translation id="7186303001964993981"><ph name="ORIGIN" /> nu poate deschide acest dosar, deoarece conține fișiere de sistem</translation> <translation id="7187428571767585875">Intrări din registry care trebuie eliminate sau modificate:</translation> <translation id="7187855807420906517">După ce închizi sau te deconectezi, site-urile continuă de obicei sincronizarea pentru a finaliza activități, cum ar fi încărcarea fotografiilor sau trimiterea unui mesaj de chat</translation> <translation id="7189234443051076392">Asigură-te că există spațiu suficient pe dispozitiv</translation> @@ -6040,6 +6060,7 @@ <translation id="7871109039747854576">Folosește tastele <ph name="COMMA" /> și <ph name="PERIOD" /> pentru a pagina o listă de sugestii</translation> <translation id="787268756490971083">Dezactivat</translation> <translation id="7874257161694977650">Fundaluri Chrome</translation> +<translation id="7876027585589532670">Nu se poate modifica această comandă rapidă</translation> <translation id="7877451762676714207">Eroare de server necunoscută. Încercați din nou sau contactați administratorul serverului.</translation> <translation id="7879631849810108578">Set de comenzi rapide: <ph name="IDS_SHORT_SET_COMMAND" /></translation> <translation id="7880823633812189969">Datele locale vor fi șterse când repornești</translation> @@ -6326,6 +6347,7 @@ <translation id="8189750580333936930">Mediul de testare securizat pentru confidențialitate</translation> <translation id="8190193592390505034">Se conectează la <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">Gestionează aplicațiile, extensiile și temele dvs.</translation> +<translation id="8192944472786724289"><ph name="APP_NAME" /> solicită permisiunea de a trimite conținut de pe ecran.</translation> <translation id="8195027750202970175">Dimensiune pe disc</translation> <translation id="8198323535106903877">Vom instala aceste <ph name="NUMBER_OF_APPS" /> aplicații pentru tine</translation> <translation id="8199300056570174101">Proprietăți pentru dispozitiv și rețea (serviciu)</translation> @@ -6976,6 +6998,7 @@ <translation id="8931475688782629595">Gestionează conținutul sincronizat</translation> <translation id="8932654652795262306">Detalii despre Tetheringul instantaneu</translation> <translation id="8932894639908691771">Opțiunile Accesului prin comutare</translation> +<translation id="893298445929867520">Coșurile de cumpărături au fost ascunse. Acestea vor fi afișate din nou dacă modifici opțiunea.</translation> <translation id="8933960630081805351">&Afișează în Finder</translation> <translation id="8934732568177537184">Continuați</translation> <translation id="8938306522009698937">Handlere</translation> @@ -7252,6 +7275,7 @@ <translation id="942532530371314860"><ph name="APP_NAME" /> trimite conținutul unei file Chrome și conținutul audio.</translation> <translation id="945522503751344254">Trimite feedback</translation> <translation id="947329552760389097">&Inspectează elementele</translation> +<translation id="947667444780368238"><ph name="ORIGIN" /> nu poate deschide fișiere din acest dosar, deoarece conține fișiere de sistem</translation> <translation id="951991426597076286">Refuză</translation> <translation id="956500788634395331">Beneficiezi de protecție împotriva extensiilor potențial dăunătoare</translation> <translation id="957960681186851048">Acest site a încercat să descarce automat mai multe fișiere</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index 062462f4..137141d 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -577,6 +577,7 @@ <translation id="1627408615528139100">Файл уже скачан</translation> <translation id="1628948239858170093">Проверить файл перед открытием?</translation> <translation id="1629314197035607094">Срок действия пароля истек.</translation> +<translation id="1629521517399325891">Сертификат пользователя нельзя использовать для аутентификации сети.</translation> <translation id="163072119192489970">Разрешить сайтам завершать отправку и получение данных</translation> <translation id="1630768113285622200">Перезапустить и продолжить</translation> <translation id="1632082166874334883">Пароль, сохраненный в вашем аккаунте Google</translation> @@ -1181,6 +1182,7 @@ <translation id="2300383962156589922">Настройка приложения "<ph name="APP_NAME" />" и управление им</translation> <translation id="2301382460326681002">Недействительный корневой каталог расширения.</translation> <translation id="23030561267973084">Приложение "<ph name="EXTENSION_NAME" />" запросило дополнительные разрешения.</translation> +<translation id="230529452743010958">Этот контент предложен с учетом ваших предыдущих действий в сервисах Google. Вы можете посмотреть свои данные, удалить их и изменить настройки отслеживания действий на странице <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="23055578400314116">Выберите имя пользователя.</translation> <translation id="2307462900900812319">Настройка сети</translation> <translation id="230927227160767054">Эта страница пытается установить обработчик службы.</translation> @@ -1406,6 +1408,7 @@ <translation id="2541706104884128042">Время сна изменено.</translation> <translation id="2542050502251273923">Позволяет установить уровень отладки менеджера сетевых подключений и других сервисов при помощи команды ff_debug.</translation> <translation id="2544292303401268586">Администратор запросил перезапуск вашего устройства, чтобы обновить приложения. Это может занять несколько минут.</translation> +<translation id="2544352060595557290">Эта вкладка</translation> <translation id="2544853746127077729">Сертификат аутентификации отклонен сетью</translation> <translation id="2546283357679194313">Файлы сookie и данные сайтов</translation> <translation id="2548347166720081527">Предоставлено разрешение "<ph name="PERMISSION" />"</translation> @@ -1571,6 +1574,7 @@ <translation id="2734760316755174687">Разрешения будут также сброшены на всех сайтах <ph name="SITE_GROUP_NAME" />.</translation> <translation id="2735712963799620190">Расписание</translation> <translation id="2737363922397526254">Свернуть...</translation> +<translation id="2737916598897808047">Приложение "<ph name="APP_NAME" />" хочет предоставить сайту <ph name="TARGET_NAME" /> доступ к вашему экрану.</translation> <translation id="2738771556149464852">Не позже</translation> <translation id="2739191690716947896">Отладка</translation> <translation id="2739240477418971307">Изменение настроек специальных возможностей</translation> @@ -2399,6 +2403,7 @@ <translation id="3677911431265050325">Мобильная версия</translation> <translation id="3677959414150797585">Показывать рекомендуемые приложения, веб-страницы и другой контент. Статистику для улучшения рекомендаций мы будем собирать, только если вы разрешите отправку данных об использовании функции.</translation> <translation id="3678156199662914018">Расширение: <ph name="EXTENSION_NAME" /></translation> +<translation id="3678188444105291936">Страницы, открытые в этом окне, не сохранятся в истории браузера. Они не оставят на компьютере следов, таких как файлы cookie, после того как вы выйдете из аккаунта. Скачанные вами файлы и добавленные закладки будут удалены.</translation> <translation id="3680683624079082902">Голос для озвучивания текста</translation> <translation id="3681311097828166361">Благодарим за отзыв. Отчет будет отправлен, когда вы подключитесь к Интернету.</translation> <translation id="3682824389861648626">Порог перемещения</translation> @@ -2600,6 +2605,7 @@ <translation id="3884152383786131369">Для веб-контента, доступного на нескольких языках, будет использоваться первый подходящий вариант из списка ниже. Эти настройки синхронизированы с настройками браузера. <ph name="BEGIN_LINK_LEARN_MORE" />Подробнее…<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3886446263141354045">Ваш запрос на доступ к сайту отправлен пользователю <ph name="NAME" /></translation> <translation id="3888550877729210209">Заметки в приложении "<ph name="LOCK_SCREEN_APP_NAME" />"</translation> +<translation id="3888586133700543064">Эта информация поможет нам понять, в чем причина возникшей неполадки в работе Ассистента. Данные хранятся до 90 дней. Доступ к ним есть только у разработчиков и специалистов по работе с отзывами.</translation> <translation id="3890064827463908288">Чтобы использовать функцию "Синхронизация Wi-Fi", включите синхронизацию Chrome</translation> <translation id="3892414795099177503">Включить OpenVPN/L2TP...</translation> <translation id="3893536212201235195">Чтение и изменение настроек специальных возможностей</translation> @@ -2631,6 +2637,7 @@ <translation id="3916445069167113093">Файл этого типа может нанести вред компьютеру. Все равно сохранить <ph name="FILE_NAME" />?</translation> <translation id="3918972485393593704">Отправить данные в Google</translation> <translation id="3919145445993746351">Чтобы автоматически установить расширения на всех своих компьютерах, включите синхронизацию.</translation> +<translation id="3919798653937160644">Страницы, открытые в этом окне, не сохранятся в истории браузера и не оставят на компьютере следов, таких как файлы cookie. После того как вы закроете все окна, открытые в гостевом режиме, будут сохранены только скачанные вами файлы.</translation> <translation id="3920504717067627103">Политики сертификатов</translation> <translation id="392089482157167418">Включить ChromeVox (голосовое сопровождение)</translation> <translation id="3920909973552939961">Запретить сайтам устанавливать обработчики платежей</translation> @@ -2968,6 +2975,7 @@ <translation id="4332976768901252016">Настройка родительского контроля</translation> <translation id="4333854382783149454">PKCS #1 SHA-1 с шифрованием RSA</translation> <translation id="4336434711095810371">Удалить все данные</translation> +<translation id="4340125850502689798">Неверное имя пользователя.</translation> <translation id="4340515029017875942"><ph name="ORIGIN" /> запрашивает доступ к приложению "<ph name="EXTENSION_NAME" />"</translation> <translation id="4340575312453649552">Это объявление удалено, так как оно использовало слишком много системных ресурсов.</translation> <translation id="4341577178275615435">Чтобы включить или отключить режим активного курсора, нажмите F7</translation> @@ -3582,6 +3590,7 @@ <translation id="5057110919553308744">При нажатии на расширение</translation> <translation id="5057403786441168405">Управляйте аккаунтами, в которые вы вошли. При наличии разрешений сайты, приложения и расширения в Chrome и Google Play могут использовать данные этих аккаунтов для персонализации сервисов. <ph name="LINK_BEGIN" />Подробнее…<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Ограниченный вход</translation> +<translation id="5059526285558225588">Выберите часть экрана для демонстрации</translation> <translation id="5060332552815861872">Для сохранения доступен 1 принтер.</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{В папке есть закладка. Все равно удалить ее?}one{В папке есть # закладка. Все равно удалить ее?}few{В папке есть # закладки. Все равно удалить ее?}many{В папке есть # закладок. Все равно удалить ее?}other{В папке есть # закладки. Все равно удалить ее?}}</translation> <translation id="5062930723426326933">Вход не выполнен. Подключитесь к Интернету и повторите попытку.</translation> @@ -3698,6 +3707,7 @@ <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">Вспоминайте яркие моменты своей жизни. Чтобы добавить или изменить альбом, перейдите в <ph name="LINK_BEGIN" />Google Фото<ph name="LINK_END" />.</translation> <translation id="5190926251776387065">Активировать порт</translation> +<translation id="5191094172448199359">PIN-коды не совпадают.</translation> <translation id="5191251636205085390">Узнайте больше о новых технологиях, которые придут на смену сторонним файлам cookie.</translation> <translation id="51918995459521422"><ph name="ORIGIN" /> хочет скачать несколько файлов</translation> <translation id="5192062846343383368">Чтобы открыть настройки родительского контроля, запустите приложение Family Link.</translation> @@ -3710,6 +3720,7 @@ <translation id="5204673965307125349">Сбросьте настройки устройства и повторите попытку.</translation> <translation id="5204967432542742771">Введите пароль</translation> <translation id="5205484256512407285">Не использовать для передачи данных мобильный Интернет</translation> +<translation id="520568280985468584">Сеть добавлена. Она станет активна в течение нескольких минут.</translation> <translation id="5206215183583316675">Удалить "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="520621735928254154">Ошибка при импорте сертификата</translation> <translation id="5206787458656075734">{COUNT,plural, =1{Раскрытый пароль изменен. Остался # раскрытый пароль. Советуем проверить его.}one{Раскрытый пароль изменен. Остался # раскрытый пароль. Советуем проверить их.}few{Раскрытый пароль изменен. Осталось # раскрытых пароля. Советуем проверить их.}many{Раскрытый пароль изменен. Осталось # раскрытых паролей. Советуем проверить их.}other{Раскрытый пароль изменен. Осталось # раскрытого пароля. Советуем проверить их.}}</translation> @@ -4344,6 +4355,7 @@ <translation id="5935656526031444304">Настроить Безопасный просмотр</translation> <translation id="5938002010494270685">Доступно обновление системы безопасности</translation> <translation id="5939518447894949180">Сбросить</translation> +<translation id="5939719276406088041">Не удалось создать ярлык.</translation> <translation id="5941153596444580863">Добавить пользователя</translation> <translation id="5941343993301164315"><ph name="TOKEN_NAME" />: необходимо войти.</translation> <translation id="5941711191222866238">Свернуть</translation> @@ -4431,6 +4443,7 @@ <translation id="6043994281159824495">Выйти</translation> <translation id="6044805581023976844">Приложение "<ph name="APP_NAME" />" предоставило сайту <ph name="TAB_NAME" /> доступ к вкладке Chrome и к аудио.</translation> <translation id="6045114302329202345">Основная кнопка TrackPoint</translation> +<translation id="6047632800149092791">Ошибка синхронизации. Выйдите из системы и войдите снова.</translation> <translation id="6049004884579590341">Чтобы выйти из полноэкранного режима, нажмите и удерживайте клавишу |<ph name="ACCELERATOR" />|</translation> <translation id="6051354611314852653">Не удалось предоставить доступ API на этом устройстве.</translation> <translation id="6052976518993719690">Центр сертификации SSL</translation> @@ -4523,6 +4536,7 @@ <translation id="6143186082490678276">Справка</translation> <translation id="6143366292569327983">Выберите исходный язык страницы</translation> <translation id="6144938890088808325">Помогите нам улучшить Chromebook</translation> +<translation id="6146409560350811147">Ошибка синхронизации. Повторите попытку.</translation> <translation id="6147020289383635445">Произошла ошибка предварительного просмотра печати.</translation> <translation id="6148576794665275391">Открыть</translation> <translation id="6149015141270619212">Не удается подключиться к Интернету</translation> @@ -4590,6 +4604,7 @@ <translation id="6232017090690406397">Аккумулятор</translation> <translation id="6232116551750539448">Соединение с <ph name="NAME" /> прервано</translation> <translation id="6233154960150021497">Использовать голос вместо клавиатуры по умолчанию</translation> +<translation id="6234108445915742946">Условия использования Chrome будут обновлены 31 марта</translation> <translation id="6234474535228214774">Ожидание установки…</translation> <translation id="6237474966939441970">Приложение для создания заметок с помощью стилуса</translation> <translation id="6237816943013845465">Позволяет настроить разрешение экрана</translation> @@ -4889,6 +4904,7 @@ <translation id="656293578423618167">Слишком длинное название файла или путь к нему. Выберите другое название или каталог.</translation> <translation id="6563469144985748109">Ещё не одобрено администратором</translation> <translation id="6569934958368283244">Другие пользователи</translation> +<translation id="6573497332121198392">Не удалось удалить ярлык.</translation> <translation id="657402800789773160">&Обновить страницу</translation> <translation id="6577284282025554716">Скачивание файла <ph name="FILE_NAME" /> отменено</translation> <translation id="657866106756413002">Сводка о работоспособности сети</translation> @@ -4896,6 +4912,7 @@ <translation id="6579705087617859690"><ph name="WINDOW_TITLE" />: доступ к содержимому рабочего стола открыт</translation> <translation id="6580203076670148210">Скорость сканирования</translation> <translation id="6582080224869403177">Чтобы обновить систему безопасности, перезагрузите устройство <ph name="DEVICE_TYPE" />.</translation> +<translation id="6582274660680936615">Вы используете гостевой режим</translation> <translation id="6584878029876017575">Бессрочная подписка Microsoft</translation> <translation id="6586099239452884121">Гостевой режим</translation> <translation id="6586451623538375658">Поменять местами кнопки мыши</translation> @@ -5065,6 +5082,7 @@ <translation id="6782468519961184511">Администратор запретил добавлять другие аккаунты Google.</translation> <translation id="6785518634832172390">PIN-код должен быть не длиннее 12 символов.</translation> <translation id="6786747875388722282">Расширения</translation> +<translation id="6787097042755590313">Другая вкладка</translation> <translation id="6787839852456839824">Быстрые клавиши</translation> <translation id="6788210894632713004">Распакованное расширение</translation> <translation id="6789592661892473991">Разделить по горизонтали</translation> @@ -5075,6 +5093,7 @@ <translation id="6793723358811598107">Клавиша "<ph name="CURRENTKEY" />" уже используется для действия "<ph name="ACTION" />". Нажмите любую клавишу, чтобы выйти.</translation> <translation id="6795884519221689054">Панда</translation> <translation id="6797493596609571643">Произошла ошибка</translation> +<translation id="6798420440063423019">Слишком много попыток ввода PIN-кода. Электронный ключ заблокирован. Сбросьте настройки электронного ключа.</translation> <translation id="6798578729981748444">Чтобы завершить импорт, закройте все окна Firefox.</translation> <translation id="6798780071646309401">клавиша Caps Lock нажата</translation> <translation id="6798954102094737107">Плагин: <ph name="PLUGIN_NAME" /></translation> @@ -5420,6 +5439,7 @@ <translation id="7180865173735832675">Настроить</translation> <translation id="7182791023900310535">Перенести пароль</translation> <translation id="7186088072322679094">Сохранить на Панели инструментов</translation> +<translation id="7186303001964993981"><ph name="ORIGIN" /> не может открыть эту папку, поскольку она содержит системные файлы.</translation> <translation id="7187428571767585875">Записи реестра, которые будут удалены или изменены:</translation> <translation id="7187855807420906517">После того как вы закроете вкладку или вернетесь в онлайн-режим, сайты обычно продолжают выполнять синхронизацию, пока не завершат выполнение некоторых задач, например загрузку снимков или отправку сообщения в чате.</translation> <translation id="7189234443051076392">Убедитесь, что на вашем устройстве достаточно свободного места.</translation> @@ -6040,6 +6060,7 @@ <translation id="7871109039747854576">Пролистывать список вариантов клавишами "<ph name="COMMA" />" и "<ph name="PERIOD" />"</translation> <translation id="787268756490971083">Отключено</translation> <translation id="7874257161694977650">Фоновые изображения Chrome</translation> +<translation id="7876027585589532670">Не удалось изменить ярлык.</translation> <translation id="7877451762676714207">Обнаружена неизвестная ошибка сервера. Повторите попытку или свяжитесь с его администратором.</translation> <translation id="7879631849810108578">Добавлено сочетание клавиш: <ph name="IDS_SHORT_SET_COMMAND" /></translation> <translation id="7880823633812189969">Локальные данные будут удалены после перезапуска</translation> @@ -6325,6 +6346,7 @@ <translation id="8189750580333936930">Privacy Sandbox</translation> <translation id="8190193592390505034">Соединение с <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">Управление приложениями, расширениями и темами</translation> +<translation id="8192944472786724289">Приложение "<ph name="APP_NAME" />" запрашивает разрешение на доступ к вашему экрану.</translation> <translation id="8195027750202970175">Объем на диске</translation> <translation id="8198323535106903877">Эти приложения (<ph name="NUMBER_OF_APPS" />) будут установлены на ваше устройство</translation> <translation id="8199300056570174101">Настройки сети и устройства</translation> @@ -6977,6 +6999,7 @@ <translation id="8931475688782629595">Управление данными для синхронизации</translation> <translation id="8932654652795262306">Сведения о мгновенной точке доступа</translation> <translation id="8932894639908691771">Параметры функции Switch Access</translation> +<translation id="893298445929867520">Корзины скрыты. Они будут показаны снова, если вы внесете изменения.</translation> <translation id="8933960630081805351">Показать в Finder</translation> <translation id="8934732568177537184">Продолжить</translation> <translation id="8938306522009698937">Обработчики</translation> @@ -7253,6 +7276,7 @@ <translation id="942532530371314860">Приложение "<ph name="APP_NAME" />" предоставило доступ к вкладке Chrome и к аудио.</translation> <translation id="945522503751344254">Отправить отзыв</translation> <translation id="947329552760389097">&Проверить элементы</translation> +<translation id="947667444780368238"><ph name="ORIGIN" /> не может открыть файлы в этой папке, поскольку она содержит системные файлы.</translation> <translation id="951991426597076286">Отклонить</translation> <translation id="956500788634395331">Включена защита от потенциально опасных расширений.</translation> <translation id="957960681186851048">Этот сайт попытался автоматически скачать несколько файлов</translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb index acc2df0..12f48fa 100644 --- a/chrome/app/resources/generated_resources_sq.xtb +++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -673,7 +673,7 @@ <translation id="1734212868489994726">Blu e çelur</translation> <translation id="1734230530703461088">Ngarkimi i shtesave brenda kufirit kohor dështoi. Kontakto me administratorin tënd.</translation> <translation id="1734824808160898225"><ph name="PRODUCT_NAME" /> mund të mos jetë në gjendje të përditësohet vetë</translation> -<translation id="173522743738009831">Rreth "Kufizuesit të privatësisë"</translation> +<translation id="173522743738009831">Rreth "Nismës për mjedis uebi privat"</translation> <translation id="173628468822554835">E kuptova. Si parazgjedhje, sajtet e reja që viziton nuk do të të dërgojnë njoftime.</translation> <translation id="1736419249208073774">Eksploro</translation> <translation id="1737968601308870607">Gabim i skedarit</translation> @@ -2006,7 +2006,7 @@ <translation id="3238192140106069382">Po lidh dhe po verifikon</translation> <translation id="3239373508713281971">Kufiri kohor u hoq për <ph name="APP_NAME" /></translation> <translation id="3241680850019875542">Përzgjidh direktorinë kryesore të shtesës prej nga do të krijosh paketën. Për të përditësuar një shtesë, përzgjidh gjithashtu skedarin e çelësit privat për ripërdorim.</translation> -<translation id="3242905690080165035">"Kufizuesi i privatësisë" është ende në zhvillim aktiv dhe ofrohet në rajone të caktuara. Për momentin, sajtet mund të provojnë "Kufizuesin e privatësisë" ndërkohë që vazhdojnë të përdorin teknologjitë aktuale të uebit si kukit e palëve të treta. <ph name="BEGIN_LINK" />Mëso më shumë<ph name="END_LINK" /></translation> +<translation id="3242905690080165035">"Nisma për mjedis uebi privat" është ende në zhvillim aktiv dhe ofrohet në rajone të caktuara. Për momentin, sajtet mund të provojnë "Nismën për mjedis uebi privat" ndërkohë që vazhdojnë të përdorin teknologjitë aktuale të uebit, si p.sh. kukit e palëve të treta. <ph name="BEGIN_LINK" />Mëso më shumë<ph name="END_LINK" /></translation> <translation id="3244294424315804309">Vazhdo ta çaktivizosh tingullin</translation> <translation id="3246107497225150582">{0,plural, =1{Përditëso pajisjen brenda një dite}other{Përditëso pajisjen brenda # ditësh}}</translation> <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> - gabim i rrjetit</translation> @@ -2133,7 +2133,7 @@ <translation id="3390013585654699824">Detajet e aplikacioneve</translation> <translation id="3390741581549395454">Aplikacionet dhe skedarët e Linux janë rezervuar me sukses. Përditësimi do të fillojë së shpejti.</translation> <translation id="3391482648489541560">modifikimi i skedarëve</translation> -<translation id="3391512812407811893">Provat e "Kufizuesit të privatësisë"</translation> +<translation id="3391512812407811893">Provat e "Nismës për mjedis uebi privat"</translation> <translation id="339178315942519818">Shiko njoftimet nga aplikacionet e tua të bisedës në pajisjen tënde <ph name="DEVICE_TYPE" /></translation> <translation id="3396800784455899911">Duke klikuar butonin "Prano dhe vazhdo", bie njëherësh dakord me përpunimin e përshkruar më lart për këto shërbime të Google.</translation> <translation id="3399432415385675819">Njoftimet do të çaktivizohen</translation> @@ -4643,7 +4643,7 @@ <translation id="6271348838875430303">korrigjimi u zhbë</translation> <translation id="6272643420381259437">Ndodhi një gabim (<ph name="ERROR" />) gjatë shkarkimit të përbërësit shtesë.</translation> <translation id="6273677812470008672">Cilësia</translation> -<translation id="6275846828483490454">"Kufizuesi i privatësisë" është një nismë e vazhdueshme për të ruajtur uebin e hapur që do të të ndihmojë të mbrohesh nga mekanizmat e gjurmimit.</translation> +<translation id="6275846828483490454">"Nisma për mjedis uebi privat" është një nismë e vazhdueshme për të ruajtur uebin e hapur që do të të ndihmojë të mbrohesh nga mekanizmat e gjurmimit.</translation> <translation id="6276210637549544171">Përfaqësuesi <ph name="PROXY_SERVER" /> kërkon një emër përdoruesi dhe një fjalëkalim.</translation> <translation id="6277105963844135994">Rrjetit i kaloi afati</translation> <translation id="6277518330158259200">N&xjirr një pamje të ekranit</translation> @@ -5305,7 +5305,7 @@ <translation id="7018275672629230621">Lexo dhe ndrysho historikun e shfletimit</translation> <translation id="7019805045859631636">E shpejtë</translation> <translation id="7022562585984256452">Faqja jote kryesore është caktuar.</translation> -<translation id="7023206482239788111">"Kufizuesi i privatësisë" ruan vitalitetin e uebit të hapur duke krijuar mënyra më të mira për të kryer këto shërbime, pa prishur sajtet dhe duke parandaluar njëkohësisht që të mos gjurmohesh fshehtas nëpër ueb.</translation> +<translation id="7023206482239788111">"Nisma për mjedis uebi privat" ruan vitalitetin e uebit të hapur duke krijuar mënyra më të mira për të kryer këto shërbime, pa prishur sajtet dhe duke parandaluar njëkohësisht që të mos gjurmohesh fshehtas nëpër ueb.</translation> <translation id="7025082428878635038">Prezantimi i një mënyre të re për të naviguar me gjeste</translation> <translation id="7025190659207909717">Menaxhimi i shërbimit të të dhënave celulare</translation> <translation id="7025895441903756761">Siguria dhe privatësia</translation> @@ -6338,7 +6338,7 @@ <translation id="8186609076106987817">Serveri nuk mund të gjejë skedarin.</translation> <translation id="8188389033983459049">Kontrollo cilësimet e pajisjes dhe aktivizoje për të vazhduar</translation> <translation id="8189306097519446565">Llogaritë e shkollës</translation> -<translation id="8189750580333936930">Kufizuesi i privatësisë</translation> +<translation id="8189750580333936930">Nisma për mjedis uebi privat</translation> <translation id="8190193592390505034">Po lidhet me <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">Menaxho aplikacionet e tua, shtesat dhe temat</translation> <translation id="8192944472786724289"><ph name="APP_NAME" /> dëshiron të ndajë përmbajtjen e ekranit tënd.</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index 53d08a6..3d42840 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -575,6 +575,7 @@ <translation id="1627408615528139100">ஏற்கனவே பதிவிறக்கப்பட்டது</translation> <translation id="1628948239858170093">கோப்பினைத் திறப்பதற்கு முன்பு ஸ்கேன் செய்யவா?</translation> <translation id="1629314197035607094">கடவுச்சொல் காலாவதியாகிவிட்டது</translation> +<translation id="1629521517399325891">நெட்வொர்க் அங்கீகாரத்திற்குப் பயனர் சான்றிதழ் கிடைக்கவில்லை.</translation> <translation id="163072119192489970">தரவை அனுப்புவதையும் பெறுவதையும் நிறைவுசெய்ய அனுமதிக்கப்பட்டுள்ள தளங்கள்</translation> <translation id="1630768113285622200">மீண்டும் தொடங்கி தொடர்க</translation> <translation id="1632082166874334883">கடவுச்சொல் உங்கள் Google கணக்கில் சேமிக்கப்பட்டது</translation> @@ -1179,6 +1180,7 @@ <translation id="2300383962156589922"><ph name="APP_NAME" />ஐத் தனிப்பயனாக்கி, கட்டுப்படுத்தும்</translation> <translation id="2301382460326681002">நீட்டிப்பு மூல கோப்பகம் செல்லாதது.</translation> <translation id="23030561267973084">"<ph name="EXTENSION_NAME" />" ஆனது கூடுதல் அனுமதிகளைக் கோரியுள்ளது.</translation> +<translation id="230529452743010958">Google சேவைகளைப் பயன்படுத்தி நீங்கள் மேற்கொண்ட முந்தைய செயல்பாட்டின் அடிப்படையில் இந்தத் தயாரிப்பு காட்டப்படுகிறது. <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> தளத்திற்குச் சென்று உங்கள் தரவைப் பார்க்கலாம் நீக்கலாம், அத்துடன் அமைப்புகளையும் மாற்றலாம்.</translation> <translation id="23055578400314116">பயனர்பெயரைத் தேர்ந்தெடுக்கவும்</translation> <translation id="2307462900900812319">நெட்வொர்க்கை உள்ளமை</translation> <translation id="230927227160767054">இந்தப் பக்கம் சேவை ஹேண்ட்லரை நிறுவ உள்ளது.</translation> @@ -1405,6 +1407,7 @@ <translation id="2541706104884128042">புதிய உறக்க நேரம் அமைக்கப்பட்டது</translation> <translation id="2542050502251273923">நெட்வொர்க் இணைப்பு நிர்வாகி மற்றும் ff_debug என்பதைப் பயன்படுத்தும் பிற சேவைகளின் பிழைதிருத்த நிலையை அமைக்கும்.</translation> <translation id="2544292303401268586">ஆப்ஸைப் புதுப்பிக்க, சாதனத்தை மீண்டும் தொடங்குமாறு நிர்வாகி கோரியுள்ளார். இது நிறைவடைய சில நிமிடங்கள் ஆகலாம்.</translation> +<translation id="2544352060595557290">இந்தத் தாவல்</translation> <translation id="2544853746127077729">அங்கீகரிப்புச் சான்றிதழ் நெட்வொர்க்கால் நிராகரிக்கப்பட்டது</translation> <translation id="2546283357679194313">குக்கீகளும் தள தரவும்</translation> <translation id="2548347166720081527"><ph name="PERMISSION" /> அனுமதிக்கப்பட்டது</translation> @@ -1570,6 +1573,7 @@ <translation id="2734760316755174687"><ph name="SITE_GROUP_NAME" /> குழுவில் உள்ள எல்லா தளங்களும் மீட்டமைக்கப்படும்.</translation> <translation id="2735712963799620190">திட்ட அட்டவணை</translation> <translation id="2737363922397526254">சுருக்கு...</translation> +<translation id="2737916598897808047">உங்கள் திரையில் உள்ளவற்றை <ph name="TARGET_NAME" /> உடன் பகிர <ph name="APP_NAME" /> விரும்புகிறது.</translation> <translation id="2738771556149464852">இதன்பிறகு அல்ல</translation> <translation id="2739191690716947896">பிழைத்திருத்து</translation> <translation id="2739240477418971307">உங்கள் அணுகல்தன்மை அமைப்புகளை மாற்றலாம்</translation> @@ -2398,6 +2402,7 @@ <translation id="3677911431265050325">மொபைல் தளத்தைக் கோரு</translation> <translation id="3677959414150797585">ஆப்ஸ், இணையப் பக்கங்கள் மற்றும் பல அடங்கும். உபயோகத் தரவுப் பகிர்வை தேர்வுசெய்திருந்தால் மட்டுமே பரிந்துரைகளை மேம்படுத்துவதற்காகப் புள்ளிவிவரங்களை அனுப்பும்.</translation> <translation id="3678156199662914018">நீட்டிப்பு: <ph name="EXTENSION_NAME" /></translation> +<translation id="3678188444105291936">இந்தச் சாளரத்தில் நீங்கள் பார்க்கும் பக்கங்கள் உலாவியின் வரலாற்றில் தோன்றாது, மேலும் நீங்கள் வெளியேறியபிறகு அவை குக்கீகள் போன்ற பிற தடங்களைக் கம்ப்யூட்டரில் விட்டுச் செல்லாது. நீங்கள் பதிவிறக்கும் கோப்புகளும் உருவாக்கும் புக்மார்க்குகளும் பாதுகாக்கப்படாது.</translation> <translation id="3680683624079082902">’உரையிலிருந்து பேச்சு’ செயல்முறைக்கான குரல்</translation> <translation id="3681311097828166361">உங்கள் கருத்திற்கு நன்றி. இப்போது ஆஃப்லைனில் உள்ளீர்கள், உங்கள் அறிக்கை பின்னர் அனுப்பப்படும்.</translation> <translation id="3682824389861648626">நகர்வு வரம்பு</translation> @@ -2599,6 +2604,7 @@ <translation id="3884152383786131369">பல மொழிகளில் கிடைக்கும் இணைய உள்ளடக்கம், இந்தப் பட்டியலில் முதலில் உள்ள ஆதரிக்கப்படும் மொழியைப் பயன்படுத்தும். இந்த விருப்பத்தேர்வுகள் உங்கள் உலாவி அமைப்புகளுடன் ஒத்திசைக்கப்படும். <ph name="BEGIN_LINK_LEARN_MORE" />மேலும் அறிக<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3886446263141354045">இந்தத் தளத்தை அணுகுவதற்கான உங்கள் கோரிக்கை <ph name="NAME" />க்கு அனுப்பப்பட்டது</translation> <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" /> மூலம் குறிப்புகளை எடுத்தல்</translation> +<translation id="3888586133700543064">நீங்கள் எதிர்கொள்ளும் Assistant சிக்கலை நாங்கள் நன்றாகப் புரிந்துகொள்ள இந்தத் தகவல்கள் உதவும். இவை 90 நாட்கள் வரை சேமித்து வைக்கப்படுவதுடன் தகுந்த பொறியியல் மற்றும் கருத்துக் குழுக்களுக்கு மட்டுமே இவற்றுக்கான அணுகல் வழங்கப்படும்.</translation> <translation id="3890064827463908288">வைஃபை ஒத்திசைவைப் பயன்படுத்த Chrome ஒத்திசைவை இயக்க வேண்டும்</translation> <translation id="3892414795099177503">OpenVPN / L2TPஐச் சேர்...</translation> <translation id="3893536212201235195">உங்கள் அணுகல்தன்மை அமைப்புகளைப் படித்தல் மற்றும் மாற்றுதல்</translation> @@ -2630,6 +2636,7 @@ <translation id="3916445069167113093">இவ்வகையான கோப்பு உங்கள் கம்ப்யூட்டரைப் பாதிக்கக்கூடும். இருப்பினும் <ph name="FILE_NAME" /> ஐ வைத்திருக்க வேண்டுமா?</translation> <translation id="3918972485393593704">Googleளுக்கு விவரங்களை அனுப்பு</translation> <translation id="3919145445993746351">உங்கள் அனைத்துக் கணிணிகளிலும் நீட்டிப்புகளைப் பெற, ஒத்திசைவை இயக்கவும்</translation> +<translation id="3919798653937160644">இந்தச் சாளரத்தில் நீங்கள் பார்க்கும் பக்கங்கள் உலாவியின் வரலாற்றில் தோன்றாது, மேலும் திறக்கப்பட்டிருக்கும் கெஸ்ட் சாளரங்கள் அனைத்தையும் மூடியபிறகு அவை குக்கீகள் போன்ற பிற தடங்களைக் கம்ப்யூட்டரில் விட்டுச் செல்லாது. இருப்பினும், நீங்கள் பதிவிறக்கிய கோப்புகள் அனைத்தும் பாதுகாக்கப்படும்.</translation> <translation id="3920504717067627103">சான்றிதழ் கொள்கைகள்</translation> <translation id="392089482157167418">ChromeVox (பேச்சுவடிவ கருத்து) ஐ இயக்கு</translation> <translation id="3920909973552939961">பேமெண்ட் ஹேண்ட்லர்களை நிறுவ அனுமதி இல்லாத தளங்கள்</translation> @@ -2967,6 +2974,7 @@ <translation id="4332976768901252016">பெற்றோர் கட்டுப்பாடுகளை அமைத்தல்</translation> <translation id="4333854382783149454">RSA என்க்ரிப்ஷனுடன் PKCS #1 SHA-1</translation> <translation id="4336434711095810371">அனைத்துத் தரவையும் அழி</translation> +<translation id="4340125850502689798">தவறான பயனர்பெயர்</translation> <translation id="4340515029017875942"><ph name="ORIGIN" />, "<ph name="EXTENSION_NAME" />" பயன்பாட்டுடன் தொடர்புகொள்ள விழைகிறது</translation> <translation id="4340575312453649552">இந்த விளம்பரம் உங்கள் சாதனத்தின் செயல்திறனை பாதிப்பதால் அதனை Chrome அகற்றிவிட்டது.</translation> <translation id="4341577178275615435">சுட்டி உலாவலை இயக்கவோ முடக்கவோ ‘F7’ என்ற ஷார்ட்கட் விசையைப் பயன்படுத்தவும்</translation> @@ -3581,6 +3589,7 @@ <translation id="5057110919553308744">நீங்கள் நீட்டிப்பைக் கிளிக் செய்யும்போது</translation> <translation id="5057403786441168405">நீங்கள் உள்நுழைந்துள்ள கணக்குகளை நிர்வகியுங்கள். அனுமதிகளின் அடிப்படையில் உங்கள் அனுபவத்தைப் பிரத்தியேகமானதாக்க Chrome மற்றும் Google Playயில் இருக்கும் தளங்களும் ஆப்ஸும் நீட்டிப்புகளும் இந்தக் கணக்குகளைப் பயன்படுத்தலாம். <ph name="LINK_BEGIN" />மேலும் அறிக<ph name="LINK_END" /></translation> <translation id="5059241099014281248">உள்நுழைவைக் கட்டுப்படுத்துதல்</translation> +<translation id="5059526285558225588">எதைப் பகிர்வது எனத் தேர்வுசெய்யுங்கள்</translation> <translation id="5060332552815861872">சேமிப்பதற்கு ஒரு பிரிண்டர் உள்ளது.</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{இந்தக் கோப்புறையில் ஒரு புத்தகக்குறி உள்ளது. அதை நிச்சயமாக நீக்க விரும்புகிறீர்களா?}other{இந்தக் கோப்புறையில் # புக்மார்க்குகள் உள்ளன. அவற்றை நிச்சயமாக நீக்க விரும்புகிறீர்களா?}}</translation> <translation id="5062930723426326933">உள்நுழைவில் தோல்வி, இணையத்துடன் இணைத்து மீண்டும் முயற்சிக்கவும்.</translation> @@ -3697,6 +3706,7 @@ <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">உங்களின் மனதிற்கினிய நினைவுகளை அசைபோடுங்கள். ஆல்பங்களைச் சேர்க்கவோ திருத்தவோ <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" />ஸிற்குச் செல்லுங்கள்.</translation> <translation id="5190926251776387065">போர்ட்டைச் செயல்படுத்து</translation> +<translation id="5191094172448199359">உள்ளிட்ட பின்கள் (PIN) பொருந்தவில்லை</translation> <translation id="5191251636205085390">மூன்றாம் தரப்புக் குக்கீகளுக்கு மாற்றாகப் பயன்படுத்த உதவும் புதிய தொழில்நுட்பங்கள் குறித்தும் அவற்றைக் கட்டுப்படுத்துவது குறித்தும் மேலும் அறிக</translation> <translation id="51918995459521422"><ph name="ORIGIN" /> பல கோப்புகளைப் பதிவிறக்க விரும்புகிறது</translation> <translation id="5192062846343383368">கண்காணிப்பு அமைப்புகளைப் பார்க்க Family Link ஆப்ஸைத் திறக்கவும்</translation> @@ -3709,6 +3719,7 @@ <translation id="5204673965307125349">சாதனத்தைப் பவர்வாஷ் செய்து, மீண்டும் முயலவும்.</translation> <translation id="5204967432542742771">கடவுச்சொல்</translation> <translation id="5205484256512407285">பரிமாற்றத்திற்கு எப்போதும் மொபைல் டேட்டாவைப் பயன்படுத்தாது</translation> +<translation id="520568280985468584">நெட்வொர்க் சேர்க்கப்பட்டது. மொபைல் நெட்வொர்க் செயல்பட பல நிமிடங்கள் ஆகக்கூடும்.</translation> <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />"ஐ நீக்கவா?</translation> <translation id="520621735928254154">சான்றிதழ் இறக்குமதியாவதில் பிழை</translation> <translation id="5206787458656075734">{COUNT,plural, =1{களவாடப்பட்ட கடவுச்சொல் மாற்றப்பட்டது. இன்னும் # களவாடப்பட்ட கடவுச்சொல் உள்ளது. இப்போதே இந்தக் கடவுச்சொச்லைச் சரிபார்க்கும்படி Chrome பரிந்துரைக்கிறது.}other{களவாடப்பட்ட கடவுச்சொல் மாற்றப்பட்டது. இன்னும் # களவாடப்பட்ட கடவுச்சொற்கள் உள்ளன. இப்போதே இந்தக் கடவுச்சொற்களைச் சரிபார்க்கும்படி Chrome பரிந்துரைக்கிறது.}}</translation> @@ -4344,6 +4355,7 @@ <translation id="5935656526031444304">பாதுகாப்பு உலாவலை நிர்வகிக்க உதவும்</translation> <translation id="5938002010494270685">பாதுகாப்பு மேம்படுத்தல் புதுப்பிப்பு உள்ளது</translation> <translation id="5939518447894949180">மீட்டமை</translation> +<translation id="5939719276406088041">ஷார்ட்கட்டை உருவாக்க முடியவில்லை</translation> <translation id="5941153596444580863">நபரைச் சேர்...</translation> <translation id="5941343993301164315">தயவுசெய்து <ph name="TOKEN_NAME" /> இல் உள்நுழைக.</translation> <translation id="5941711191222866238">சிறிதாக்கு</translation> @@ -4431,6 +4443,7 @@ <translation id="6043994281159824495">இப்போது வெளியேறு</translation> <translation id="6044805581023976844"><ph name="APP_NAME" /> <ph name="TAB_NAME" /> உடன் Chrome தாவலையும் ஆடியோவையும் பகிர்கிறது.</translation> <translation id="6045114302329202345">முதன்மை TrackPoint பட்டன்</translation> +<translation id="6047632800149092791">ஒத்திசைவு செயல்படவில்லை. வெளியேறி, மீண்டும் உள்நுழையவும்.</translation> <translation id="6049004884579590341">முழுத் திரையிலிருந்து வெளியேற, |<ph name="ACCELERATOR" />| என்பதை அழுத்திப் பிடித்திருக்கவும்</translation> <translation id="6051354611314852653">அச்சச்சோ! இந்தச் சாதனத்திற்கான API அணுகலை சிஸ்டம் அங்கீகரிக்கத் தவறியது.</translation> <translation id="6052976518993719690">SSL சான்றிதழ் அங்கீகாரம்</translation> @@ -4523,6 +4536,7 @@ <translation id="6143186082490678276">உதவிப் பெறுக</translation> <translation id="6143366292569327983">பக்கத்தை மொழிபெயர்ப்பதற்கான மொழியைத் தேர்வுசெய்யலாம்</translation> <translation id="6144938890088808325">Chromebookகளை இன்னும் சிறப்பானதாக்க உதவவும்</translation> +<translation id="6146409560350811147">ஒத்திசைவு செயல்படவில்லை. மீண்டும் உள்நுழையவும்.</translation> <translation id="6147020289383635445">அச்சு மாதிரிக்காட்சி தோல்வி.</translation> <translation id="6148576794665275391">இப்போது திறக்கவும்</translation> <translation id="6149015141270619212">இணையத்துடன் இணைக்க முடியவில்லை</translation> @@ -4590,6 +4604,7 @@ <translation id="6232017090690406397">பேட்டரி</translation> <translation id="6232116551750539448"><ph name="NAME" /> உடனான இணைப்பு துண்டிக்கப்பட்டது</translation> <translation id="6233154960150021497">கீபோர்டுக்குப் பதிலாகக் குரலை இயல்பாகப் பயன்படுத்து</translation> +<translation id="6234108445915742946">மார்ச் 31 அன்று Chromeமின் சேவை விதிமுறைகள் மாறவுள்ளன</translation> <translation id="6234474535228214774">நிறுவுவது நிலுவையில் உள்ளது</translation> <translation id="6237474966939441970">ஸ்டைலஸ் குறிப்பெடுக்கும் ஆப்ஸ்</translation> <translation id="6237816943013845465">திரையின் தெளிவுத்திறனைச் சரிசெய்ய அனுமதிக்கும்</translation> @@ -4889,6 +4904,7 @@ <translation id="656293578423618167">கோப்பு பாதை அல்லது பெயர் மிக நீளமாக உள்ளது. பெயரைச் சுருக்கியோ அல்லது மற்றொரு இடத்திலோ சேமிக்கவும்.</translation> <translation id="6563469144985748109">இன்னும் உங்கள் நிர்வாகி அனுமதிக்கவில்லை</translation> <translation id="6569934958368283244">பிறர்</translation> +<translation id="6573497332121198392">ஷார்ட்கட்டை அகற்ற முடியவில்லை</translation> <translation id="657402800789773160">&இந்த பக்கத்தை மீண்டும் ஏற்றுக</translation> <translation id="6577284282025554716">பதிவிறக்கம் ரத்துசெய்யப்பட்டது: <ph name="FILE_NAME" /></translation> <translation id="657866106756413002">நெட்வொர்க் ஹெல்த் ஸ்னாப்ஷாட்</translation> @@ -4896,6 +4912,7 @@ <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> - டெஸ்க்டாப் உள்ளடக்கம் பகிரப்படுகிறது</translation> <translation id="6580203076670148210">ஸ்கேனிங் வேகம்</translation> <translation id="6582080224869403177">உங்கள் <ph name="DEVICE_TYPE" /> இன் பாதுகாப்பை மேம்படுத்த, அதை மீட்டமைக்கவும்.</translation> +<translation id="6582274660680936615">கெஸ்ட் பயன்முறையில் உலாவுகிறீர்கள்</translation> <translation id="6584878029876017575">Microsoft Lifetime Signing</translation> <translation id="6586099239452884121">கெஸ்ட் உலாவல்</translation> <translation id="6586451623538375658">முதன்மை சுட்டிப் பொத்தானை மாற்று</translation> @@ -5065,6 +5082,7 @@ <translation id="6782468519961184511">கூடுதல் Google கணக்குகளைச் சேர்க்க உங்கள் நிர்வாகி அனுமதிக்கவில்லை</translation> <translation id="6785518634832172390">பின்னில் 12 இலக்கங்களோ அதற்கும் குறைவாகவோ இருக்க வேண்டும்</translation> <translation id="6786747875388722282">நீட்டிப்புகள்</translation> +<translation id="6787097042755590313">பிற தாவல்</translation> <translation id="6787839852456839824">கீபோர்டு ஷார்ட்கட்கள்</translation> <translation id="6788210894632713004">தொகுக்கப்படாத நீட்டிப்பு</translation> <translation id="6789592661892473991">கிடைமட்டமாகப் பிரி</translation> @@ -5075,6 +5093,7 @@ <translation id="6793723358811598107">'<ph name="CURRENTKEY" />' விசை ஏற்கெனவே '<ph name="ACTION" />' செயலுக்கு ஒதுக்கப்பட்டுள்ளது. வெளியேற, ஏதாவது ஒரு விசையை அழுத்தவும்.</translation> <translation id="6795884519221689054">பாண்டா</translation> <translation id="6797493596609571643">அச்சச்சோ, ஏதோ தவறு ஏற்பட்டது.</translation> +<translation id="6798420440063423019">தவறான பின் (PIN) பல முறை உள்ளிடப்பட்டதால் பாதுகாப்பு விசை பூட்டப்பட்டது. அதை மீட்டமைக்க வேண்டும்.</translation> <translation id="6798578729981748444">இறக்குவதை முடிக்க, எல்லா Firefox சாளரங்களையும் மூடவும்.</translation> <translation id="6798780071646309401">கேப்ஸ்லாக் இயக்கப்பட்டுள்ளது</translation> <translation id="6798954102094737107">செருகுநிரல்: <ph name="PLUGIN_NAME" /></translation> @@ -5420,6 +5439,7 @@ <translation id="7180865173735832675">பிரத்தியேகமாக்கு</translation> <translation id="7182791023900310535">உங்கள் கடவுச்சொல்லை நகற்றுக</translation> <translation id="7186088072322679094">கருவிப்பட்டியில் வை</translation> +<translation id="7186303001964993981">இந்தக் கோப்புறையில் சிஸ்டம் கோப்புகள் இருப்பதால் அதை <ph name="ORIGIN" /> தளத்தால் திறக்க முடியவில்லை</translation> <translation id="7187428571767585875">அகற்ற வேண்டிய அல்லது மாற்ற வேண்டிய பதிவக உள்ளீடுகள்:</translation> <translation id="7187855807420906517">நீங்கள் வெளியேறிய பிறகோ ஆஃப்லைனுக்குச் சென்ற பிறகோ படங்களை ஏற்றுவது, அரட்டை மெசேஜை அனுப்புவது போன்ற பணிகளை நிறைவுசெய்ய, தளங்கள் வழக்கமாகத் தொடர்ந்து ஒத்திசைவிலேயே இருக்கும்</translation> <translation id="7189234443051076392">சாதனத்தில் போதுமான சேமிப்பிடம் இருப்பதை உறுதிப்படுத்திக்கொள்ளவும்</translation> @@ -6040,6 +6060,7 @@ <translation id="7871109039747854576">நபர் பட்டியலைப் பக்கமாக்க <ph name="COMMA" /> மற்றும் <ph name="PERIOD" /> விசைகளைப் பயன்படுத்துக</translation> <translation id="787268756490971083">ஆஃப்</translation> <translation id="7874257161694977650">Chrome பின்னணிகள்</translation> +<translation id="7876027585589532670">ஷார்ட்கட்டைத் திருத்த முடியவில்லை</translation> <translation id="7877451762676714207">அறியாத சேவையகப் பிழை. மீண்டும் முயலவும் அல்லது சேவையக நிர்வாகியை தொடர்பு கொள்ளவும்.</translation> <translation id="7879631849810108578">ஷார்ட்கட் அமைக்கப்பட்டது: <ph name="IDS_SHORT_SET_COMMAND" /></translation> <translation id="7880823633812189969">ரீஸ்டார்ட் செய்யும்போது அகத் தரவு நீக்கப்படும்</translation> @@ -6326,6 +6347,7 @@ <translation id="8189750580333936930">தனியுரிமை சாண்ட்பாக்ஸ்</translation> <translation id="8190193592390505034"><ph name="PROVIDER_NAME" /> உடன் இணைக்கிறது</translation> <translation id="8191230140820435481">உங்கள் ஆப்ஸ், நீட்டிப்புகள் மற்றும் தீம்களை நிர்வகிக்கலாம்</translation> +<translation id="8192944472786724289">உங்கள் திரையில் உள்ளவற்றை <ph name="APP_NAME" /> பகிர விரும்புகிறது.</translation> <translation id="8195027750202970175">வட்டில் உள்ள அளவு</translation> <translation id="8198323535106903877">உங்களுக்காக அந்த <ph name="NUMBER_OF_APPS" /> ஆப்ஸை நிறுவுவோம்</translation> <translation id="8199300056570174101">நெட்வொர்க் (சேவை) மற்றும் சாதனப் பண்புகள்</translation> @@ -6975,6 +6997,7 @@ <translation id="8931475688782629595">ஒத்திசைத்த தரவை நிர்வகித்தல்</translation> <translation id="8932654652795262306">உடனடி இணைப்பு முறை குறித்த விவரங்கள்</translation> <translation id="8932894639908691771">ஸ்விட்ச் அணுகல் விருப்பங்கள்</translation> +<translation id="893298445929867520">கார்ட்டுகள் மறைக்கப்பட்டுள்ளன. நீங்கள் மாற்றங்களைச் செய்யும்போது அவை மீண்டும் காட்டப்படும்.</translation> <translation id="8933960630081805351">&கண்டுபிடிப்பானில் காண்பி</translation> <translation id="8934732568177537184">தொடரவும்</translation> <translation id="8938306522009698937">ஹேண்ட்லர்கள்</translation> @@ -7251,6 +7274,7 @@ <translation id="942532530371314860">Chrome தாவலையும் ஆடியோவையும் <ph name="APP_NAME" /> பகிர்கிறது.</translation> <translation id="945522503751344254">கருத்தை அனுப்பு</translation> <translation id="947329552760389097">&கூறுகளை ஆய்வு செய்</translation> +<translation id="947667444780368238">இந்தக் கோப்புறையில் சிஸ்டம் கோப்புகள் இருப்பதால் அதிலுள்ள கோப்புகளை <ph name="ORIGIN" /> தளத்தால் திறக்க முடியவில்லை</translation> <translation id="951991426597076286">நிராகரி</translation> <translation id="956500788634395331">தீங்கிழைக்க சாத்தியமுள்ள நீட்டிப்புகளில் இருந்து பாதுகாக்கப்படுகிறீர்கள்</translation> <translation id="957960681186851048">இந்தத் தளம் பல கோப்புகளைத் தானாகப் பதிவிறக்க முயன்றது</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb index 05c0a233..d518017 100644 --- a/chrome/app/resources/generated_resources_ur.xtb +++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -576,6 +576,7 @@ <translation id="1627408615528139100">پہلے ہی ڈاؤن لوڈ کردہ ہے</translation> <translation id="1628948239858170093">کھولنے سے پہلے فائل کو اسکین کریں؟</translation> <translation id="1629314197035607094">پاس ورڈ کی میعاد ختم ہو گئی</translation> +<translation id="1629521517399325891">صارف کا سرٹیفیکیٹ نیٹ ورک کی تصدیق کے لئے دستیاب نہیں ہے۔</translation> <translation id="163072119192489970">ڈیٹا بھیجنے اور موصول کرنے کو مکمل کرنے کی اجازت ہے</translation> <translation id="1630768113285622200">ری سٹارٹ کریں اور جاری رکھیں</translation> <translation id="1632082166874334883">آپ کے Google اکاؤنٹ میں اسٹور کردہ پاس ورڈ</translation> @@ -1180,6 +1181,7 @@ <translation id="2300383962156589922"><ph name="APP_NAME" /> کو ذاتی نوعیت کا بنائیں اور کنٹرول کريں</translation> <translation id="2301382460326681002">ایکسٹینشن روٹ ڈائریکٹری غلط ہے۔</translation> <translation id="23030561267973084">"<ph name="EXTENSION_NAME" />" نے اضافی اجازتوں کی درخواست کی ہے۔</translation> +<translation id="230529452743010958">آپ Google سروسز کا استعمال کر کے اپنی گزشتہ سرگرمی کی بنیاد پر اس آئٹم کو دیکھ رہے ہیں۔ آپ <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> پر اپنا ڈیٹا دیکھ، حذف اور اپنی ترتیبات کو تبدیل کر سکتے ہیں۔</translation> <translation id="23055578400314116">صارف نام منتخب کریں</translation> <translation id="2307462900900812319">نیٹ ورک کنفیگر کریں</translation> <translation id="230927227160767054">یہ صفحہ ایک سرور ہینڈلر انسٹال کرنا چاہتا ہے۔</translation> @@ -1406,6 +1408,7 @@ <translation id="2541706104884128042">سونے کا نیا وقت سیٹ کیا گیا ہے</translation> <translation id="2542050502251273923">نیٹ ورک کنکشن مینیجراور ff_debug. استعمال کرنے والی دیگر سروسز کے ڈیبگنگ لیول کا تعین کرتا ہے۔</translation> <translation id="2544292303401268586">ایپس کو اپ ڈیٹ کرنے کیلئے آپ کے منتظم نے آپ کے آلے کو ری اسٹارٹ کرنے کی درخواست کی ہے۔ اسے مکمل ہونے میں کچھ منٹ لگ سکتے ہیں۔</translation> +<translation id="2544352060595557290">یہ ٹیب</translation> <translation id="2544853746127077729">نیٹ ورک نے توثیق کا سرٹیفکیٹ مسترد کر دیا گیا</translation> <translation id="2546283357679194313">کوکیز اور سائٹ ڈیٹا</translation> <translation id="2548347166720081527"><ph name="PERMISSION" /> کی اجازت ہے</translation> @@ -1571,6 +1574,7 @@ <translation id="2734760316755174687"><ph name="SITE_GROUP_NAME" /> کے تحت موجود سائٹس کو بھی دوبارہ سیٹ کر دیا جائے گا۔</translation> <translation id="2735712963799620190">شیڈول</translation> <translation id="2737363922397526254">سکیڑیں…</translation> +<translation id="2737916598897808047"><ph name="APP_NAME" /> آپ کی اسکرین کے مواد کا <ph name="TARGET_NAME" /> کے ساتھ اشتراک کرنا چاہتی ہے۔</translation> <translation id="2738771556149464852">بعد میں نہیں</translation> <translation id="2739191690716947896">ڈیبگ کریں</translation> <translation id="2739240477418971307">اپنی ایکسیسبیلٹی ترتیبات تبدیل کریں</translation> @@ -2399,6 +2403,7 @@ <translation id="3677911431265050325">موبائل سائٹ کی درخواست کریں</translation> <translation id="3677959414150797585">ایپس، ویب صفحات اور مزید شامل ہے۔ یہ تجاویز کو بہتر بنانے کے لیے اعداد و شمار صرف تب بھیجتا ہے جب آپ نے استعمال کے ڈیٹا کا اشتراک کرنے کو منتخب کیا ہو۔</translation> <translation id="3678156199662914018">ایکسٹینشن: <ph name="EXTENSION_NAME" /></translation> +<translation id="3678188444105291936">آپ اس ونڈو میں جو صفحات دیکھتے ہیں وہ براؤزر کی سرگزشت میں ظاہر نہیں ہوں گے اور وہ آپ کے سائن آؤٹ ہو جانے کے بعد کوکیز جیسے دیگر نشانات کمپیوٹر پر نہیں چھوڑیں گے۔ آپ جو فائلیں ڈاؤن لوڈ کرتے ہیں اور جو بُک مارکس بناتے ہیں انہیں برقرار نہیں رکھا جائے گا۔</translation> <translation id="3680683624079082902">ٹیکسٹ ٹو اسپیچ آواز</translation> <translation id="3681311097828166361">آپ کے تاثرات کا شکریہ۔ آپ ابھی آف لائن ہیں اور آپ کی رپورٹ بعد میں بھیجی جائے گی۔</translation> <translation id="3682824389861648626">حرکت کی حد</translation> @@ -2600,6 +2605,7 @@ <translation id="3884152383786131369">متعدد زبانوں میں دستیاب ویب مواد اس فہرست سے پہلی سپورٹ کی جانے والی زبان استعمال کرے گا۔ یہ ترجیحات آپ کے براؤزر کی ترتیبات کے ساتھ مطابقت پذیر ہیں۔ <ph name="BEGIN_LINK_LEARN_MORE" />مزید جانیں<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3886446263141354045">اس سائٹ تک رسائی حاصل کرنے کی آپ کی درخواست <ph name="NAME" /> کو بھیج دی گئی ہے</translation> <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" /> کے ساتھ نوٹس لیے جا رہے ہیں</translation> +<translation id="3888586133700543064">اس معلومات سے آپ کی اسسٹنٹ سے متعلق مسئلے کو بہتر طریقے سے سمجھنے میں ہمیں مدد ملتی ہے۔ اسے 90 دنوں تک کیلئے اسٹور کیا جاتا ہے اور اس تک رسائی انجینیئرنگ اور تاثرات کی مناسب ٹیموں تک محدود ہوتی ہے۔</translation> <translation id="3890064827463908288">Wi-Fi سِنک استعمال کرنے کے لئے Chrome Sync کو آن کریں</translation> <translation id="3892414795099177503">OpenVPN / L2TP شامل کریں…</translation> <translation id="3893536212201235195">اپنی ایکسیسبیلٹی کی ترتیبات پڑھیں اور تبدیل کریں</translation> @@ -2631,6 +2637,7 @@ <translation id="3916445069167113093">اس قسم کی فائل سے آپ کے کمپیوٹر کو نقصان پہنچ سکتا ہے۔ کیا آپ <ph name="FILE_NAME" /> کو بہر صورت رکھنا چاہتے ہیں؟</translation> <translation id="3918972485393593704">Google کو تفصیلات کی اطلاع دیں</translation> <translation id="3919145445993746351">اپنے سبھی کمپیوٹرز پر اپنی ایکسٹینشنز حاصل کرنے کے لیے، مطابقت پذیری کو آن کریں</translation> +<translation id="3919798653937160644">جو صفحات آپ اس ونڈو میں دیکھتے ہیں وہ براؤزر کی سرگزشت میں ظاہر نہیں ہوں گے اور جب آپ سبھی کھلے ہوئے مہمان ونڈوز بند کر دیں گے تو وہ آپ کے کمپیوٹر پر کوکیز جیسے دیگر نشانات نہیں چھوڑیں گے۔ تاہم، جو بھی فائلیں آپ ڈاؤن لوڈ کریں گے انہیں برقرار رکھا جائے گا۔</translation> <translation id="3920504717067627103">سرٹیفکیٹ کی پالیسیاں</translation> <translation id="392089482157167418">ChromeVox فعال کریں (بولے جانے والے تاثرات)</translation> <translation id="3920909973552939961">ادائیگی کے ہینڈلرز انسٹال کرنے کی اجازت نہیں ہے</translation> @@ -2968,6 +2975,7 @@ <translation id="4332976768901252016">پیرنٹل کنٹرولز ترتیب دیں</translation> <translation id="4333854382783149454">PKCS #1 SHA-1 مع RSA مرموز کاری</translation> <translation id="4336434711095810371">سبھی ڈیٹا صاف کریں</translation> +<translation id="4340125850502689798">غلط صارف نام</translation> <translation id="4340515029017875942"><ph name="ORIGIN" /> ایپ "<ph name="EXTENSION_NAME" />" کے ساتھ مواصلت کرنا چاہتی ہے</translation> <translation id="4340575312453649552">اس اشتہار نے آپ کے آلہ کے لیے بہت سے وسائل کا استعمال کیا، لہذا Chrome نے اسے ہٹا دیا ہے۔</translation> <translation id="4341577178275615435">کیرٹ براؤزنگ کو آن یا آف کرنے کے لیے F7 شارٹ کٹ کا استعمال کریں</translation> @@ -3582,6 +3590,7 @@ <translation id="5057110919553308744">جب آپ ایکسٹینشن پر کلک کرتے ہیں</translation> <translation id="5057403786441168405">اپنے سائن ان کردہ اکاؤنٹس کا نظم کریں۔ ویب سائٹس، ایپس اور Chrome اور Google Play میں ایکسٹینشنز اجازتوں کی بنیاد پر آپ کے تجربہ کو حسب ضرورت بنانے کیلئے ان اکاؤنٹس کا استعمال کر سکتی ہیں۔ <ph name="LINK_BEGIN" />مزید جانیں<ph name="LINK_END" /></translation> <translation id="5059241099014281248">سائن ان کو محدود کریں</translation> +<translation id="5059526285558225588">منتخب کریں کہ کیا اشتراک کرنا ہے</translation> <translation id="5060332552815861872">محفوظ کرنے کے لیے 1 پرنٹر دستیاب ہے۔</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{اس فولڈر میں ایک بُک مارک شامل ہے۔ کیا آپ واقعی اسے حذف کرنا چاہتے ہیں؟}other{اس فولڈر میں # بُک مارکس شامل ہیں۔ کیا آپ واقعی اسے حذف کرنا چاہتے ہیں؟}}</translation> <translation id="5062930723426326933">سائن ان ناکام ہوگیا، براہ کرم انٹرنیٹ سے منسلک ہوں اور دوبارہ کوشش کریں۔</translation> @@ -3698,6 +3707,7 @@ <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">اپنی پسندیدہ میموریز کو دوبارہ زندہ کریں۔ البمز کو شامل یا ان میں ترمیم کرنے کے لیے، <ph name="LINK_BEGIN" />Google تصاویر<ph name="LINK_END" /> پر جائیں۔</translation> <translation id="5190926251776387065">پورٹ فعال کریں</translation> +<translation id="5191094172448199359">آپ کے درج کردہ PINs مماثل نہیں ہیں</translation> <translation id="5191251636205085390">ان نئی ٹیکنالوجیز کے بارے میں جانیں اور کنٹرول کریں جن کا مقصد فریق ثالث کے کوکیز کو تبدیل کرنا ہے</translation> <translation id="51918995459521422"><ph name="ORIGIN" /> متعدد فائلز ڈاؤن لوڈ کرنا چاہتا ہے</translation> <translation id="5192062846343383368">اپنی نگرانی کی ترتیبات دیکھنے کیلئے، Family Link ایپ کھولیں</translation> @@ -3710,6 +3720,7 @@ <translation id="5204673965307125349">براہ کرم آلہ کو پاور واش کریں اور دوبارہ کوشش کریں۔</translation> <translation id="5204967432542742771">پاس ورڈ درج کریں</translation> <translation id="5205484256512407285">منتقلی کے لیے کبھی بھی موبائل ڈیٹا کا استعمال نہ کریں</translation> +<translation id="520568280985468584">نیٹ ورک کامیابی کے ساتھ شامل کر دیا گیا ہے۔ آپ کے سیلولر نیٹ ورک کے فعال ہونے میں کئی منٹ لگ سکتے ہیں۔</translation> <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />" کو حذف کریں؟</translation> <translation id="520621735928254154">سرٹیفکیٹ درآمد کرنے میں خرابی</translation> <translation id="5206787458656075734">{COUNT,plural, =1{متاثرہ پاس ورڈ کو کامیابی کے ساتھ تبدیل کر دیا گیا۔ آپ کے پاس # متاثرہ پاس ورڈ ہے۔ Chrome اس پاس ورڈ کو ابھی چیک کرنے کی تجویز کرتا ہے۔}other{متاثرہ پاس ورڈ کو کامیابی کے ساتھ تبدیل کر دیا گیا۔ آپ کے پاس # متاثرہ پاس ورڈز ہیں۔ Chrome ان پاس ورڈز کو ابھی چیک کرنے کی تجویز کرتا ہے۔}}</translation> @@ -4344,6 +4355,7 @@ <translation id="5935656526031444304">محفوظ براؤزنگ کا نظم کریں</translation> <translation id="5938002010494270685">سیکورٹی اپ گریڈ دستیاب ہے</translation> <translation id="5939518447894949180">دوبارہ ترتیب دیں</translation> +<translation id="5939719276406088041">شارٹ کٹ تخلیق نہیں کیا جا سکتا</translation> <translation id="5941153596444580863">شخص کو شامل کریں…</translation> <translation id="5941343993301164315">براہ کرم <ph name="TOKEN_NAME" /> میں سائن ان کریں۔</translation> <translation id="5941711191222866238">چھوٹا کریں</translation> @@ -4431,6 +4443,7 @@ <translation id="6043994281159824495">ابھی سائن آؤٹ کریں</translation> <translation id="6044805581023976844"><ph name="APP_NAME" /> ایک Chrome ٹیب اور آڈیو کا <ph name="TAB_NAME" /> کے ساتھ اشتراک کر رہی ہے۔</translation> <translation id="6045114302329202345">بنیادی TrackPoint بٹن</translation> +<translation id="6047632800149092791">مطابقت پذیری کام نہیں کر رہی ہے۔ سائن آؤٹ اور پھر دوبارہ سائن ان کر کے دیکھیں۔</translation> <translation id="6049004884579590341">پوری اسکرین سے باہر نکلنے کے لیے |<ph name="ACCELERATOR" />| کو دبائے رکھیں</translation> <translation id="6051354611314852653">افوہ! سسٹم اس آلہ کیلئے API رسائی کی اجازت دینے میں ناکام ہوگیا۔</translation> <translation id="6052976518993719690">SSL سرٹیفکیشن اتھارٹی</translation> @@ -4523,6 +4536,7 @@ <translation id="6143186082490678276">مدد حاصل کریں</translation> <translation id="6143366292569327983">اس سے ترجمہ کرنے کیلئے صفحے کی زبان منتخب کریں</translation> <translation id="6144938890088808325">Chromebooks کو بہتر بنانے میں ہماری مدد کریں</translation> +<translation id="6146409560350811147">مطابقت پذیری کام نہیں کر رہی ہے۔ دوبارہ سائن ان کرنے کی کوشش کریں۔</translation> <translation id="6147020289383635445">پرنٹ کا پیش منظر ناکام ہوگیا۔</translation> <translation id="6148576794665275391">ابھی کھلا ہے</translation> <translation id="6149015141270619212">انٹرنیٹ سے منسلک نہیں کیا جا سکتا</translation> @@ -4590,6 +4604,7 @@ <translation id="6232017090690406397">بیٹری</translation> <translation id="6232116551750539448"><ph name="NAME" /> سے کنکشن ختم ہو گیا ہے</translation> <translation id="6233154960150021497">کی بورڈ کی بجائے بطور ڈیفالٹ آواز کا استعمال کریں</translation> +<translation id="6234108445915742946">Chrome کی سروس کی شرائط 31 مارچ کو بدل رہی ہیں</translation> <translation id="6234474535228214774">انسٹال زیر التوا ہے</translation> <translation id="6237474966939441970">اسٹائلس نوٹ لینے والی ایپ</translation> <translation id="6237816943013845465">آپ کو آپ کی اسکرین ریزولیوشن کو ایڈجسٹ کرنے کی اجازت دیتی ہے</translation> @@ -4889,6 +4904,7 @@ <translation id="656293578423618167">فائل کا پاتھ یا نام کافی طویل ہیں۔ براہ کرم ایک چھوٹے نام کے ساتھ یا کسی دوسرے مقام میں محفوظ کریں۔</translation> <translation id="6563469144985748109">آپ کے مینیجر نے ابھی تک اسے منظور نہیں کیا ہے</translation> <translation id="6569934958368283244">دیگر لوگ</translation> +<translation id="6573497332121198392">شارٹ کٹ نہیں ہٹایا جا سکتا</translation> <translation id="657402800789773160">یہ صفحہ &دوبارہ لوڈ کریں</translation> <translation id="6577284282025554716">ڈاؤن لوڈ منسوخ ہو گیا: <ph name="FILE_NAME" /></translation> <translation id="657866106756413002">نیٹ ورک ہیلتھ اسنیپ شاٹ</translation> @@ -4896,6 +4912,7 @@ <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> - ڈیسک ٹاپ کے مواد کا اشتراک کیا گیا</translation> <translation id="6580203076670148210">اسکین کرنے کی رفتار</translation> <translation id="6582080224869403177">اپنی سیکورٹی کو اپ گریڈ کرنے کے لئے اپنا <ph name="DEVICE_TYPE" /> ری سیٹ کریں۔</translation> +<translation id="6582274660680936615">آپ ایک مہمان کے طور پر براؤز کر رہے ہیں</translation> <translation id="6584878029876017575">Microsoft لائف ٹائم سائننگ</translation> <translation id="6586099239452884121">مہمان براؤزنگ</translation> <translation id="6586451623538375658">ابتدائی ماؤس بٹن سویپ کریں</translation> @@ -5065,6 +5082,7 @@ <translation id="6782468519961184511">آپ کا منتظم اضافی Google اکاؤنٹس کی اجازت نہیں دیتا ہے</translation> <translation id="6785518634832172390">PIN 12 یا اس سے کم ہندسوں کا ہونا چاہیے</translation> <translation id="6786747875388722282">توسیعات</translation> +<translation id="6787097042755590313">دیگر ٹیب</translation> <translation id="6787839852456839824">کی بورڈ شارٹ کٹس</translation> <translation id="6788210894632713004">غیر پیک شدہ ایکسٹینشن</translation> <translation id="6789592661892473991">افقی تقسیم کریں</translation> @@ -5075,6 +5093,7 @@ <translation id="6793723358811598107">'<ph name="CURRENTKEY" />' پہلے سے ہی '<ph name="ACTION" />' کارروائی کو تفویض کردہ ہے۔ باہر نکلنے کے لیے کوئی بھی کلید دبائیں۔</translation> <translation id="6795884519221689054">پانڈا</translation> <translation id="6797493596609571643">افوہ، کچھ غلط ہو گیا۔</translation> +<translation id="6798420440063423019">کئی مرتبہ غلط PIN درج کرنے کی وجہ سے سیکیورٹی کلید مقفل ہو گئی ہے۔ آپ کو سیکیورٹی کلید ری سیٹ کرنی ہوگی۔</translation> <translation id="6798578729981748444">درآمد ختم کرنے کے لئے، تمام Firefox ونڈوز کو بند کریں۔</translation> <translation id="6798780071646309401">caps lock آن ہے</translation> <translation id="6798954102094737107">پلگ ان: <ph name="PLUGIN_NAME" /></translation> @@ -5420,6 +5439,7 @@ <translation id="7180865173735832675">حسب ضرورت بنائیں</translation> <translation id="7182791023900310535">اپنا پاس ورڈ منتقل کریں</translation> <translation id="7186088072322679094">ٹول بار میں رکھیں</translation> +<translation id="7186303001964993981"><ph name="ORIGIN" /> اس فولڈر کو نہیں کھول سکتا کیونکہ اس میں سسٹم کی فائلیں ہیں</translation> <translation id="7187428571767585875">ہٹائے جانے یا تبدیل کیے جانے والے رجسٹری کے اندراجات:</translation> <translation id="7187855807420906517">آپ کے جانے یا آف لائن ہونے کے بعد سائٹس عام طور پر تصاویر اپ لوڈ کرنے یا چیٹ پیغام بھیجنے جیسے کام مکمل کرنے کے لیے سنک کا عمل جاری رکھتی ہے</translation> <translation id="7189234443051076392">یقینی بنائیں کہ آپ کے آلہ پر کافی جگہ ہے</translation> @@ -6041,6 +6061,7 @@ <translation id="7871109039747854576">امیدواروں کی فہرست کا صفحہ بنانے کیلئے، <ph name="COMMA" /> اور <ph name="PERIOD" /> کلیدوں کا استعمال کریں</translation> <translation id="787268756490971083">آف</translation> <translation id="7874257161694977650">Chrome کے پس منظر</translation> +<translation id="7876027585589532670">شارٹ کٹ میں ترمیم نہیں ہو سکتی</translation> <translation id="7877451762676714207">سرور کی نامعلوم خرابی۔ براہ کرم دوبارہ کوشش کریں یا سرور کے منتظم سے رابطہ کریں۔</translation> <translation id="7879631849810108578">شارٹ کٹ کا سیٹ: <ph name="IDS_SHORT_SET_COMMAND" /></translation> <translation id="7880823633812189969">جب آپ دوبارہ شروع کریں گے تو مقامی ڈیٹا حذف ہو جائے گا</translation> @@ -6326,6 +6347,7 @@ <translation id="8189750580333936930">رازداری سینڈ باکس</translation> <translation id="8190193592390505034"><ph name="PROVIDER_NAME" /> سے منسلک کیا جا رہا ہے</translation> <translation id="8191230140820435481">اپنی ایپس، ایکسٹینشنز اور تھیمز کا نظم کریں</translation> +<translation id="8192944472786724289"><ph name="APP_NAME" /> آپ کی اسکرین کے مواد کا اشتراک کرنا چاہتی ہے۔</translation> <translation id="8195027750202970175">ڈسک پر سائز</translation> <translation id="8198323535106903877">ہم آپ کے لیے وہ <ph name="NUMBER_OF_APPS" /> ایپس انسٹال کریں گے</translation> <translation id="8199300056570174101">نیٹ ورک (سروس) اور آلہ کی خصوصیات</translation> @@ -6975,6 +6997,7 @@ <translation id="8931475688782629595">جو آپ سِنک کرتے ہیں اس کا نظم کریں</translation> <translation id="8932654652795262306">فوری ٹیدرنگ کی تفصیلات</translation> <translation id="8932894639908691771">سوئچ رسائی کے اختیارات</translation> +<translation id="893298445929867520">کارٹس چھپا دئے گئے۔ آپ کے تبدیلیاں کرنے پر وہ دوبارہ دکھائی دیں گے۔</translation> <translation id="8933960630081805351">تلاش کنندہ میں &دکھائیں</translation> <translation id="8934732568177537184">جاری رکھیں</translation> <translation id="8938306522009698937">ہینڈلرز</translation> @@ -7251,6 +7274,7 @@ <translation id="942532530371314860"><ph name="APP_NAME" /> ایک Chrome ٹیب اور آڈیو کا اشتراک کر رہی ہے۔</translation> <translation id="945522503751344254">تاثرات بھیجیں</translation> <translation id="947329552760389097">&عناصر کا معائنہ کریں</translation> +<translation id="947667444780368238"><ph name="ORIGIN" /> اس فولڈر میں فائلیں نہیں کھول سکتا کیونکہ اس میں سسٹم کی فائلیں ہیں</translation> <translation id="951991426597076286">مسترد کریں</translation> <translation id="956500788634395331">آپ ممکنہ طور پر نقصان دہ ایکسٹینشنز سے محفوظ ہیں</translation> <translation id="957960681186851048">اس سائٹ نے متعدد فائلز کو خودکار طور پر ڈاؤن لوڈ کرنے کی کوشش کی ہے</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index 19e5f90..9d0959df 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -575,6 +575,7 @@ <translation id="1627408615528139100">Đã tải xuống</translation> <translation id="1628948239858170093">Quét tệp trước khi mở?</translation> <translation id="1629314197035607094">Mật khẩu đã hết hạn</translation> +<translation id="1629521517399325891">Không có chứng chỉ người dùng để xác thực mạng.</translation> <translation id="163072119192489970">Được phép kết thúc quá trình gửi và nhận dữ liệu</translation> <translation id="1630768113285622200">Khởi động lại và tiếp tục</translation> <translation id="1632082166874334883">Mật khẩu đã lưu trữ trong Tài khoản Google của bạn</translation> @@ -1179,6 +1180,7 @@ <translation id="2300383962156589922">Tùy chỉnh và kiểm soát <ph name="APP_NAME" /></translation> <translation id="2301382460326681002">Thư mục gốc của tiện ích không hợp lệ.</translation> <translation id="23030561267973084">"<ph name="EXTENSION_NAME" />" đã yêu cầu thêm quyền.</translation> +<translation id="230529452743010958">Mục này hiển thị dựa trên hoạt động mà bạn thực hiện trước đây trên các dịch vụ của Google. Bạn có thể xem hoặc xóa dữ liệu của mình và thay đổi chế độ cài đặt tại <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />.</translation> <translation id="23055578400314116">Chọn tên người dùng</translation> <translation id="2307462900900812319">Định cấu hình mạng</translation> <translation id="230927227160767054">Trang này muốn cài đặt trình xử lý dịch vụ.</translation> @@ -1405,6 +1407,7 @@ <translation id="2541706104884128042">Đã đặt giờ đi ngủ mới</translation> <translation id="2542050502251273923">Đặt cấp gỡ lỗi cho trình quản lý kết nối mạng và các dịch vụ khác bằng ff_debug.</translation> <translation id="2544292303401268586">Quản trị viên đã yêu cầu khởi động lại thiết bị của bạn để cập nhật ứng dụng. Có thể mất vài phút để hoàn tất quá trình này.</translation> +<translation id="2544352060595557290">Thẻ này</translation> <translation id="2544853746127077729">Chứng chỉ xác thực bị mạng từ chối</translation> <translation id="2546283357679194313">Cookie và dữ liệu trang web</translation> <translation id="2548347166720081527">Đã cho phép <ph name="PERMISSION" /></translation> @@ -1570,6 +1573,7 @@ <translation id="2734760316755174687">Các trang web trong <ph name="SITE_GROUP_NAME" /> cũng sẽ được đặt lại.</translation> <translation id="2735712963799620190">Lịch biểu</translation> <translation id="2737363922397526254">Thu gọn...</translation> +<translation id="2737916598897808047"><ph name="APP_NAME" /> muốn chia sẻ nội dung trên màn hình của bạn với <ph name="TARGET_NAME" />.</translation> <translation id="2738771556149464852">Không được Sau</translation> <translation id="2739191690716947896">Gỡ lỗi</translation> <translation id="2739240477418971307">Thay đổi cài đặt trợ năng của bạn</translation> @@ -2398,6 +2402,7 @@ <translation id="3677911431265050325">Yêu cầu trang web dành cho thiết bị di động</translation> <translation id="3677959414150797585">Bao gồm ứng dụng, trang web và nhiều nội dung khác. Chỉ gửi số liệu thống kê để cải thiện nội dung đề xuất nếu bạn chọn chia sẻ dữ liệu sử dụng.</translation> <translation id="3678156199662914018">Tiện ích: <ph name="EXTENSION_NAME" /></translation> +<translation id="3678188444105291936">Những trang bạn xem trong cửa sổ này sẽ không xuất hiện trong nhật ký duyệt web của trình duyệt, cũng như không để lại dấu vết khác (chẳng hạn như cookie) trên máy tính sau khi bạn đăng xuất. Hệ thống sẽ không lưu giữ các tệp bạn tải xuống và dấu trang bạn tạo.</translation> <translation id="3680683624079082902">Giọng nói của tính năng chuyển văn bản sang lời nói</translation> <translation id="3681311097828166361">Cảm ơn bạn đã phản hồi. Bạn hiện đang ngoại tuyến và báo cáo của bạn sẽ được gửi sau.</translation> <translation id="3682824389861648626">Ngưỡng chuyển động</translation> @@ -2599,6 +2604,7 @@ <translation id="3884152383786131369">Nội dung web có nhiều phiên bản ngôn ngữ sẽ dùng ngôn ngữ đầu tiên được hỗ trợ trong danh sách này. Những tùy chọn này được đồng bộ hóa với tùy chọn cài đặt của trình duyệt. <ph name="BEGIN_LINK_LEARN_MORE" />Tìm hiểu thêm<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3886446263141354045">Yêu cầu truy cập trang web này của bạn đã được gửi tới <ph name="NAME" /></translation> <translation id="3888550877729210209">Ghi chú bằng <ph name="LOCK_SCREEN_APP_NAME" /></translation> +<translation id="3888586133700543064">Thông tin này sẽ giúp chúng tôi hiểu rõ hơn vấn đề liên quan đến Trợ lý của bạn. Chúng tôi lưu trữ thông tin này trong tối đa 90 ngày và chỉ các nhóm liên quan phụ trách kỹ thuật và phản hồi mới được phép truy cập.</translation> <translation id="3890064827463908288">Bật Chrome Sync để dùng tính năng Đồng bộ hóa Wi-Fi</translation> <translation id="3892414795099177503">Thêm OpenVPN / L2TP...</translation> <translation id="3893536212201235195">Đọc và thay đổi cài đặt khả năng truy cập của bạn</translation> @@ -2630,6 +2636,7 @@ <translation id="3916445069167113093">Loại tệp này có thể gây hại cho máy tính của bạn. Bạn có muốn giữ tệp <ph name="FILE_NAME" /> không?</translation> <translation id="3918972485393593704">Báo cáo chi tiết cho Google</translation> <translation id="3919145445993746351">Để có các tiện ích trên tất cả các máy tính, hãy bật tính năng đồng bộ hóa</translation> +<translation id="3919798653937160644">Những trang bạn xem trong cửa sổ này sẽ không xuất hiện trong nhật ký duyệt web của trình duyệt, cũng như không để lại dấu vết khác (chẳng hạn như cookie) trên máy tính sau khi bạn đóng tất cả cửa sổ Khách đang mở. Tuy nhiên, hệ thống vẫn sẽ lưu giữ mọi tệp mà bạn tải xuống.</translation> <translation id="3920504717067627103">Chính sách Chứng chỉ</translation> <translation id="392089482157167418">Bật ChromeVox (phản hồi bằng giọng nói)</translation> <translation id="3920909973552939961">Không được phép cài đặt trình xử lý thanh toán</translation> @@ -2967,6 +2974,7 @@ <translation id="4332976768901252016">Thiết lập quyền kiểm soát của cha mẹ</translation> <translation id="4333854382783149454">PKCS #1 SHA-1 Với Mã hóa RSA</translation> <translation id="4336434711095810371">Xóa tất cả dữ liệu</translation> +<translation id="4340125850502689798">Tên người dùng không hợp lệ</translation> <translation id="4340515029017875942"><ph name="ORIGIN" /> muốn giao tiếp với ứng dụng "<ph name="EXTENSION_NAME" />"</translation> <translation id="4340575312453649552">Chrome đã xóa quảng cáo này vì quảng cáo sử dụng quá nhiều tài nguyên của thiết bị.</translation> <translation id="4341577178275615435">Để bật hoặc tắt tính năng duyệt web có con nháy, hãy dùng phím tắt F7</translation> @@ -3581,6 +3589,7 @@ <translation id="5057110919553308744">Khi bạn nhấp vào tiện ích</translation> <translation id="5057403786441168405">Quản lý các tài khoản bạn đã đăng nhập. Các trang web, ứng dụng và tiện ích trong Chrome cũng như Google Play có thể dùng những tài khoản này để mang lại trải nghiệm phù hợp cho bạn, tùy theo sự cho phép. <ph name="LINK_BEGIN" />Tìm hiểu thêm<ph name="LINK_END" /></translation> <translation id="5059241099014281248">Hạn chế khả năng đăng nhập</translation> +<translation id="5059526285558225588">Chọn nội dung bạn muốn chia sẻ</translation> <translation id="5060332552815861872">Hiện có 1 máy in để bạn lưu.</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{Thư mục này chứa một dấu trang. Bạn có chắc chắn muốn xóa thư mục không?}other{Thư mục này chứa # dấu trang. Bạn có chắc chắn muốn xóa thư mục không?}}</translation> <translation id="5062930723426326933">Không đăng nhập được, vui lòng kết nối với internet và thử lại.</translation> @@ -3697,6 +3706,7 @@ <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">Hồi tưởng lại những kỷ niệm đáng nhớ của bạn. Để thêm hoặc chỉnh sửa album, hãy chuyển đến <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" />.</translation> <translation id="5190926251776387065">Kích hoạt cổng</translation> +<translation id="5191094172448199359">Mã PIN bạn nhập không khớp</translation> <translation id="5191251636205085390">Tìm hiểu và kiểm soát các công nghệ mới giúp thay thế cookie của bên thứ ba</translation> <translation id="51918995459521422"><ph name="ORIGIN" /> muốn tải nhiều tệp xuống</translation> <translation id="5192062846343383368">Mở ứng dụng Family Link để xem các tùy chọn cài đặt giám sát của bạn</translation> @@ -3709,6 +3719,7 @@ <translation id="5204673965307125349">Vui lòng powerwash thiết bị và thử lại.</translation> <translation id="5204967432542742771">Nhập mật khẩu</translation> <translation id="5205484256512407285">Không bao giờ dùng dữ liệu di động để chuyển</translation> +<translation id="520568280985468584">Đã thêm mạng thành công. Có thể mất ít phút để kích hoạt mạng di động của bạn.</translation> <translation id="5206215183583316675">Xóa "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="520621735928254154">Lỗi nhập chứng chỉ</translation> <translation id="5206787458656075734">{COUNT,plural, =1{Đã đổi thành công mật khẩu bị lộ. Bạn còn # mật khẩu bị lộ nữa. Chrome khuyên bạn nên kiểm tra ngay mật khẩu này.}other{Đã đổi thành công mật khẩu bị lộ. Bạn còn # mật khẩu bị lộ nữa. Chrome khuyên bạn nên kiểm tra ngay những mật khẩu này.}}</translation> @@ -4343,6 +4354,7 @@ <translation id="5935656526031444304">Quản lý tính năng Duyệt web an toàn</translation> <translation id="5938002010494270685">Hiện đã có bản nâng cấp bảo mật</translation> <translation id="5939518447894949180">Đặt lại</translation> +<translation id="5939719276406088041">Không thể tạo lối tắt</translation> <translation id="5941153596444580863">Thêm người...</translation> <translation id="5941343993301164315">Vui lòng đăng nhập vào <ph name="TOKEN_NAME" />.</translation> <translation id="5941711191222866238">Thu nhỏ</translation> @@ -4430,6 +4442,7 @@ <translation id="6043994281159824495">Đăng xuất bây giờ</translation> <translation id="6044805581023976844"><ph name="APP_NAME" /> đang chia sẻ âm thanh và một thẻ trong Chrome với <ph name="TAB_NAME" />.</translation> <translation id="6045114302329202345">Nút TrackPoint chính</translation> +<translation id="6047632800149092791">Tính năng đồng bộ hóa hiện không hoạt động. Hãy thử đăng xuất rồi đăng nhập lại.</translation> <translation id="6049004884579590341">Hãy nhấn và giữ |<ph name="ACCELERATOR" />| để thoát khỏi toàn màn hình</translation> <translation id="6051354611314852653">Rất tiếc! Hệ thống không cho phép truy cập API cho thiết bị này.</translation> <translation id="6052976518993719690">Tổ chức Cấp Chứng chỉ SSK</translation> @@ -4522,6 +4535,7 @@ <translation id="6143186082490678276">Nhận trợ giúp</translation> <translation id="6143366292569327983">Chọn ngôn ngữ trang để dịch</translation> <translation id="6144938890088808325">Giúp chúng tôi cải thiện Chromebook</translation> +<translation id="6146409560350811147">Tính năng đồng bộ hóa hiện không hoạt động. Hãy thử đăng nhập lại.</translation> <translation id="6147020289383635445">Không thể xem trước bản in.</translation> <translation id="6148576794665275391">Mở ngay</translation> <translation id="6149015141270619212">Không thể kết nối Internet</translation> @@ -4589,6 +4603,7 @@ <translation id="6232017090690406397">Pin</translation> <translation id="6232116551750539448">Đã mất kết nối với <ph name="NAME" /></translation> <translation id="6233154960150021497">Đặt chế độ mặc định là sử dụng giọng nói thay cho bàn phím</translation> +<translation id="6234108445915742946">Điều khoản dịch vụ của Chrome sẽ thay đổi từ ngày 31 tháng 3</translation> <translation id="6234474535228214774">Đang chờ cài đặt</translation> <translation id="6237474966939441970">Ứng dụng ghi chú bằng bút cảm ứng</translation> <translation id="6237816943013845465">Cho phép bạn điều chỉnh độ phân giải màn hình</translation> @@ -4888,6 +4903,7 @@ <translation id="656293578423618167">Tên hoặc đường dẫn của tệp quá dài. Hãy lưu với tên ngắn hơn hoặc lưu vào một vị trí khác.</translation> <translation id="6563469144985748109">Người quản lý của bạn chưa phê duyệt trang web</translation> <translation id="6569934958368283244">Người khác</translation> +<translation id="6573497332121198392">Không thể xóa lối tắt</translation> <translation id="657402800789773160">&Tải lại trang này</translation> <translation id="6577284282025554716">Đã hủy tải xuống: <ph name="FILE_NAME" /></translation> <translation id="657866106756413002">Tổng quan nhanh về tình trạng mạng</translation> @@ -4895,6 +4911,7 @@ <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> - Đã chia sẻ nội dung trên màn hình</translation> <translation id="6580203076670148210">Tốc độ quét</translation> <translation id="6582080224869403177">Đặt lại <ph name="DEVICE_TYPE" /> của bạn để nâng cấp bảo mật.</translation> +<translation id="6582274660680936615">Bạn đang duyệt web với tư cách Khách</translation> <translation id="6584878029876017575">Ký Trọn đời của Microsoft</translation> <translation id="6586099239452884121">Duyệt với tư cách khách</translation> <translation id="6586451623538375658">Hoán đổi nút chuột chính</translation> @@ -5064,6 +5081,7 @@ <translation id="6782468519961184511">Quản trị viên của bạn không cho phép dùng các Tài khoản Google khác</translation> <translation id="6785518634832172390">Mã PIN chỉ được dài tối đa 12 chữ số</translation> <translation id="6786747875388722282">Tiện ích</translation> +<translation id="6787097042755590313">Thẻ khác</translation> <translation id="6787839852456839824">Phím tắt</translation> <translation id="6788210894632713004">Tiện ích đã giải nén</translation> <translation id="6789592661892473991">Chia ngang</translation> @@ -5074,6 +5092,7 @@ <translation id="6793723358811598107">Phím "<ph name="CURRENTKEY" />" đã được chỉ định cho thao tác "<ph name="ACTION" />". Hãy nhấn phím bất kỳ để thoát.</translation> <translation id="6795884519221689054">Gấu trúc</translation> <translation id="6797493596609571643">Rất tiếc, đã xảy ra lỗi.</translation> +<translation id="6798420440063423019">Khóa bảo mật đã bị khóa do bạn nhập sai mã PIN quá nhiều lần. Bạn cần đặt lại khóa bảo mật.</translation> <translation id="6798578729981748444">Để hoàn tất quá trình nhập, hãy đóng tất cả cửa sổ Firefox.</translation> <translation id="6798780071646309401">caps lock bật</translation> <translation id="6798954102094737107">Plugin: <ph name="PLUGIN_NAME" /></translation> @@ -5419,6 +5438,7 @@ <translation id="7180865173735832675">Tùy chỉnh</translation> <translation id="7182791023900310535">Di chuyển mật khẩu của bạn</translation> <translation id="7186088072322679094">Giữ trong thanh công cụ</translation> +<translation id="7186303001964993981"><ph name="ORIGIN" /> không thể mở thư mục này vì thư mục này chứa tệp hệ thống</translation> <translation id="7187428571767585875">Các mục sổ đăng ký sẽ bị xóa hoặc thay đổi:</translation> <translation id="7187855807420906517">Sau khi bạn thoát ra hoặc ngắt kết nối mạng, các trang web thường tiếp tục đồng bộ hóa để hoàn thành những tác vụ như tải ảnh lên hay gửi tin nhắn trò chuyện</translation> <translation id="7189234443051076392">Hãy đảm bảo thiết bị của bạn có đủ dung lượng</translation> @@ -6039,6 +6059,7 @@ <translation id="7871109039747854576">Dùng phím <ph name="COMMA" /> và <ph name="PERIOD" /> để chuyển đến danh sách các tùy chọn</translation> <translation id="787268756490971083">Đang tắt</translation> <translation id="7874257161694977650">Nền trong Chrome</translation> +<translation id="7876027585589532670">Không thể chỉnh sửa lối tắt</translation> <translation id="7877451762676714207">Lỗi máy chủ không xác định. Vui lòng thử lại hoặc liên hệ với quản trị viên máy chủ.</translation> <translation id="7879631849810108578">Đã đặt phím tắt: <ph name="IDS_SHORT_SET_COMMAND" /></translation> <translation id="7880823633812189969">Dữ liệu trên thiết bị sẽ bị xóa khi bạn khởi động lại</translation> @@ -6325,6 +6346,7 @@ <translation id="8189750580333936930">Hộp cát về quyền riêng tư</translation> <translation id="8190193592390505034">Đang kết nối đến <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">Quản lý ứng dụng, tiện ích và chủ đề của bạn</translation> +<translation id="8192944472786724289"><ph name="APP_NAME" /> muốn chia sẻ nội dung trên màn hình của bạn.</translation> <translation id="8195027750202970175">Dung lượng trên đĩa</translation> <translation id="8198323535106903877">Chúng tôi sẽ cài đặt <ph name="NUMBER_OF_APPS" /> ứng dụng đó cho bạn</translation> <translation id="8199300056570174101">Thuộc tính của thiết bị và mạng (dịch vụ)</translation> @@ -6974,6 +6996,7 @@ <translation id="8931475688782629595">Quản lý dữ liệu đồng bộ hóa</translation> <translation id="8932654652795262306">Thông tin chi tiết về tính năng Chia sẻ Internet tức thì</translation> <translation id="8932894639908691771">Tùy chọn Tiếp cận bằng công tắc</translation> +<translation id="893298445929867520">Đã ẩn các giỏ hàng. Các giỏ hàng sẽ xuất hiện trở lại khi bạn thay đổi.</translation> <translation id="8933960630081805351">&Hiển thị trong Trình tìm kiếm</translation> <translation id="8934732568177537184">Tiếp tục</translation> <translation id="8938306522009698937">trình xử lý</translation> @@ -7250,6 +7273,7 @@ <translation id="942532530371314860"><ph name="APP_NAME" /> đang chia sẻ âm thanh và một thẻ trong Chrome.</translation> <translation id="945522503751344254">Gửi phản hồi</translation> <translation id="947329552760389097">&Kiểm tra các yếu tố</translation> +<translation id="947667444780368238"><ph name="ORIGIN" /> không thể mở các tệp trong thư mục này vì thư mục này chứa tệp hệ thống</translation> <translation id="951991426597076286">Từ chối</translation> <translation id="956500788634395331">Bạn sẽ được bảo vệ khỏi các tiện ích có thể gây hại</translation> <translation id="957960681186851048">Trang web này đã cố gắng tự động tải nhiều tệp xuống</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb index 50a12db..cc245e6 100644 --- a/chrome/app/resources/generated_resources_zh-HK.xtb +++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -575,6 +575,7 @@ <translation id="1627408615528139100">已下載</translation> <translation id="1628948239858170093">要先掃瞄檔案再開啟嗎?</translation> <translation id="1629314197035607094">密碼已過期</translation> +<translation id="1629521517399325891">使用者憑證不適用於網絡驗證。</translation> <translation id="163072119192489970">已允許完成傳送和接收資料</translation> <translation id="1630768113285622200">重新啟動及繼續</translation> <translation id="1632082166874334883">儲存在 Google 帳戶中的密碼</translation> @@ -1179,6 +1180,7 @@ <translation id="2300383962156589922">自訂和控制 <ph name="APP_NAME" /></translation> <translation id="2301382460326681002">擴充功能根目錄無效。</translation> <translation id="23030561267973084">「<ph name="EXTENSION_NAME" />」要求其他權限。</translation> +<translation id="230529452743010958">系統根據您以前使用 Google 服務的活動顯示這個項目。您可以前往 <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> 查看和刪除資料以及變更設定。</translation> <translation id="23055578400314116">請選取使用者名稱</translation> <translation id="2307462900900812319">設定網絡</translation> <translation id="230927227160767054">這個網頁想要安裝服務處理常式。</translation> @@ -1404,6 +1406,7 @@ <translation id="2541706104884128042">已設定新的就寢時間</translation> <translation id="2542050502251273923">使用 ff_debug 設定網絡連線管理員及其他服務的偵錯等級。</translation> <translation id="2544292303401268586">管理員已要求重新啟動裝置並更新應用程式。此操作可能需要幾分鐘才能完成。</translation> +<translation id="2544352060595557290">這個分頁</translation> <translation id="2544853746127077729">網絡已拒絕驗證憑證</translation> <translation id="2546283357679194313">Cookie 和網站數據</translation> <translation id="2548347166720081527">已允許使用<ph name="PERMISSION" /></translation> @@ -1569,6 +1572,7 @@ <translation id="2734760316755174687">屬於「<ph name="SITE_GROUP_NAME" />」的網站將會重設。</translation> <translation id="2735712963799620190">設定時段</translation> <translation id="2737363922397526254">收合…</translation> +<translation id="2737916598897808047">「<ph name="APP_NAME" />」要求與 <ph name="TARGET_NAME" /> 分享螢幕內容。</translation> <translation id="2738771556149464852">此日期之前</translation> <translation id="2739191690716947896">偵錯</translation> <translation id="2739240477418971307">變更您的協助工具設定</translation> @@ -2397,6 +2401,7 @@ <translation id="3677911431265050325">切換至流動網站</translation> <translation id="3677959414150797585">包括應用程式、網頁,以及更多。只有在您選擇分享使用情況資料時,系統才會傳送統計資料以改善建議內容。</translation> <translation id="3678156199662914018">擴充功能:<ph name="EXTENSION_NAME" /></translation> +<translation id="3678188444105291936">您在這個視窗瀏覽的網頁不會在瀏覽器記錄中顯示,而在登出之後,電腦也不會保留 Cookie 等資料。此外,系統不會保留您下載的檔案和建立的書籤。</translation> <translation id="3680683624079082902">「文字轉語音」語音</translation> <translation id="3681311097828166361">多謝您提供的意見反映。您目前處於離線狀態,系統會稍後傳送您的報告。</translation> <translation id="3682824389861648626">移動限制</translation> @@ -2598,6 +2603,7 @@ <translation id="3884152383786131369">支援多種語言的網站內容會使用此清單上的第一個支援語言。這些偏好設定會與您的瀏覽器設定同步。<ph name="BEGIN_LINK_LEARN_MORE" />瞭解詳情<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3886446263141354045">您想存取此網站的要求已傳送至<ph name="NAME" /></translation> <translation id="3888550877729210209">正在使用「<ph name="LOCK_SCREEN_APP_NAME" />」寫筆記</translation> +<translation id="3888586133700543064">這項資料可讓我們進一步瞭解「Google 助理」的問題,並會在系統中儲存最多 90 天,且只有相關的工程團隊和意見團隊才能存取。</translation> <translation id="3890064827463908288">開啟 Chrome 同步功能以使用 Wi-Fi Sync</translation> <translation id="3892414795099177503">新增 OpenVPN/L2TP…</translation> <translation id="3893536212201235195">讀取及變更您的協助工具設定</translation> @@ -2629,6 +2635,7 @@ <translation id="3916445069167113093">這種類型的檔案可能會損害您的電腦,您仍要保留 <ph name="FILE_NAME" /> 嗎?</translation> <translation id="3918972485393593704">向 Google 報告詳情</translation> <translation id="3919145445993746351">如要在所有電腦上取得您的擴充程式,請開啟同步功能</translation> +<translation id="3919798653937160644">您在這個視窗瀏覽的網頁不會顯示在瀏覽器記錄中,並且在您關閉所有開啟的訪客視窗後,電腦也不會留下 Cookie 等其他記錄。不過,系統將會保留您下載的所有檔案。</translation> <translation id="3920504717067627103">憑證政策</translation> <translation id="392089482157167418">啟用 ChromeVox (互動朗讀)</translation> <translation id="3920909973552939961">不允許安裝付款處理常式</translation> @@ -2966,6 +2973,7 @@ <translation id="4332976768901252016">設定家長監控設定</translation> <translation id="4333854382783149454">PKCS #1 SHA-1 (使用 RSA 加密)</translation> <translation id="4336434711095810371">清除所有資料</translation> +<translation id="4340125850502689798">使用者名稱無效</translation> <translation id="4340515029017875942"><ph name="ORIGIN" /> 想與「<ph name="EXTENSION_NAME" />」應用程式保持通訊</translation> <translation id="4340575312453649552">此廣告使用了太多裝置資源,因此已被 Chrome 移除。</translation> <translation id="4341577178275615435">如要開啟或關閉「鍵盤瀏覽」功能,請使用快速鍵 F7</translation> @@ -3580,6 +3588,7 @@ <translation id="5057110919553308744">當您點擊擴充程式時</translation> <translation id="5057403786441168405">管理已登入的帳戶。視乎權限而定,Chrome 和 Google Play 的網站、應用程式和擴充程式可能使用這些帳戶自訂您的體驗。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="5059241099014281248">限制登入</translation> +<translation id="5059526285558225588">選擇分享內容</translation> <translation id="5060332552815861872">有 1 部可以儲存嘅打印機。</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{此資料夾含有 1 個書籤。您確定要刪除這個書籤嗎?}other{此資料夾含有 # 個書籤。您確定要刪除這些書籤嗎?}}</translation> <translation id="5062930723426326933">無法登入,請重新連線至互聯網,然後再試一次。</translation> @@ -3696,6 +3705,7 @@ <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">重溫美好回憶。如要新增或編輯相簿,請前往「<ph name="LINK_BEGIN" />Google 相片<ph name="LINK_END" />」。</translation> <translation id="5190926251776387065">啟用連接埠</translation> +<translation id="5191094172448199359">您輸入的 PIN 不符</translation> <translation id="5191251636205085390">瞭解及控制用於取代第三方 Cookie 的全新技術</translation> <translation id="51918995459521422"><ph name="ORIGIN" /> 想下載多個檔案</translation> <translation id="5192062846343383368">開啟 Family Link 應用程式以查看監控設定</translation> @@ -3708,6 +3718,7 @@ <translation id="5204673965307125349">請在裝置上執行 Powerwash,然後再試一次。</translation> <translation id="5204967432542742771">輸入密碼</translation> <translation id="5205484256512407285">一律不使用流動數據進行傳輸</translation> +<translation id="520568280985468584">已成功新增網絡。流動網絡可能需時幾分鐘才能啟用。</translation> <translation id="5206215183583316675">要刪除「<ph name="CERTIFICATE_NAME" />」嗎?</translation> <translation id="520621735928254154">憑證匯入錯誤</translation> <translation id="5206787458656075734">{COUNT,plural, =1{已成功變更被盜用的密碼。您還有 # 個被盜用的密碼。Chrome 建議您立即檢查此密碼。}other{已成功變更被盜用的密碼。您還有 # 個被盜用的密碼。Chrome 建議您立即檢查這些密碼。}}</translation> @@ -4342,6 +4353,7 @@ <translation id="5935656526031444304">管理「安全瀏覽」功能</translation> <translation id="5938002010494270685">有可用的安全性升級</translation> <translation id="5939518447894949180">重設</translation> +<translation id="5939719276406088041">無法建立捷徑</translation> <translation id="5941153596444580863">新增使用者…</translation> <translation id="5941343993301164315">請登入 <ph name="TOKEN_NAME" />。</translation> <translation id="5941711191222866238">最小化</translation> @@ -4429,6 +4441,7 @@ <translation id="6043994281159824495">立即登出</translation> <translation id="6044805581023976844"><ph name="APP_NAME" /> 正在與 <ph name="TAB_NAME" /> 共用 Chrome 分頁和音效。</translation> <translation id="6045114302329202345">主要 TrackPoint 按鈕</translation> +<translation id="6047632800149092791">同步功能無法正常運作。請嘗試登出,然後重新登入。</translation> <translation id="6049004884579590341">按住 |<ph name="ACCELERATOR" />| 即可退出全螢幕模式</translation> <translation id="6051354611314852653">糟糕!系統無法將 API 存取權授予這部裝置。</translation> <translation id="6052976518993719690">SSL 憑證授權單位</translation> @@ -4521,6 +4534,7 @@ <translation id="6143186082490678276">取得說明</translation> <translation id="6143366292569327983">揀要翻譯邊種語言嘅網頁</translation> <translation id="6144938890088808325">協助我們改善 Chromebook</translation> +<translation id="6146409560350811147">同步功能無法正常運作。請嘗試再次登入。</translation> <translation id="6147020289383635445">列印預覽失敗。</translation> <translation id="6148576794665275391">立即開啟</translation> <translation id="6149015141270619212">無法連線至互聯網</translation> @@ -4588,6 +4602,7 @@ <translation id="6232017090690406397">電池</translation> <translation id="6232116551750539448">與 <ph name="NAME" /> 的連線已中斷</translation> <translation id="6233154960150021497">預設使用語音取代鍵盤</translation> +<translation id="6234108445915742946">Chrome 的《服務條款》將於 3 月 31 日變更</translation> <translation id="6234474535228214774">正在等待安裝</translation> <translation id="6237474966939441970">觸控筆筆記應用程式</translation> <translation id="6237816943013845465">讓您調整螢幕解像度</translation> @@ -4887,6 +4902,7 @@ <translation id="656293578423618167">檔案路徑或名稱太長。請選用較短的名稱或將其儲存至其他位置。</translation> <translation id="6563469144985748109">您的管理員尚未批准瀏覽此網站</translation> <translation id="6569934958368283244">其他人</translation> +<translation id="6573497332121198392">無法移除捷徑</translation> <translation id="657402800789773160">重新載入這個網頁(&R)</translation> <translation id="6577284282025554716"><ph name="FILE_NAME" /> 已經取消下載</translation> <translation id="657866106756413002">網絡健康快覽</translation> @@ -4894,6 +4910,7 @@ <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> - 已共用桌面內容</translation> <translation id="6580203076670148210">掃瞄速度</translation> <translation id="6582080224869403177">重設您的 <ph name="DEVICE_TYPE" />,以進行安全性升級。</translation> +<translation id="6582274660680936615">您目前是以訪客身分瀏覽</translation> <translation id="6584878029876017575">Microsoft 永久簽署</translation> <translation id="6586099239452884121">訪客瀏覽</translation> <translation id="6586451623538375658">調換滑鼠主按鈕</translation> @@ -5063,6 +5080,7 @@ <translation id="6782468519961184511">管理員禁止新增其他 Google 帳戶</translation> <translation id="6785518634832172390">PIN 不可超出 12 個數字</translation> <translation id="6786747875388722282">擴充功能</translation> +<translation id="6787097042755590313">其他分頁</translation> <translation id="6787839852456839824">鍵盤快速鍵</translation> <translation id="6788210894632713004">已解除壓縮的擴充程式</translation> <translation id="6789592661892473991">水平分割</translation> @@ -5073,6 +5091,7 @@ <translation id="6793723358811598107">「<ph name="CURRENTKEY" />」鍵已指派給「<ph name="ACTION" />」動作。請按任何按鍵以離開。</translation> <translation id="6795884519221689054">熊貓</translation> <translation id="6797493596609571643">糟糕,發生錯誤。</translation> +<translation id="6798420440063423019">由於您輸入太多次錯誤的 PIN,因此安全密鑰已被鎖定。您需要重設安全密鑰。</translation> <translation id="6798578729981748444">如要完成匯入,請關閉所有 Firefox 視窗。</translation> <translation id="6798780071646309401">大寫鎖定已開啟</translation> <translation id="6798954102094737107">外掛程式:<ph name="PLUGIN_NAME" /></translation> @@ -5418,6 +5437,7 @@ <translation id="7180865173735832675">自訂</translation> <translation id="7182791023900310535">遷移密碼</translation> <translation id="7186088072322679094">保留在工具列上</translation> +<translation id="7186303001964993981">由於資料夾中包含系統檔案,<ph name="ORIGIN" /> 無法開啟此資料夾</translation> <translation id="7187428571767585875">系統將移除或變更以下的登錄項目:</translation> <translation id="7187855807420906517">在您離開或離線後,網站通常會保持同步以完成工作,例如上載相片或傳送即時通訊訊息</translation> <translation id="7189234443051076392">確保您的裝置上有足夠的儲存空間</translation> @@ -6038,6 +6058,7 @@ <translation id="7871109039747854576">使用「<ph name="COMMA" />」和「<ph name="PERIOD" />」鍵顯示候選字詞名單</translation> <translation id="787268756490971083">關閉</translation> <translation id="7874257161694977650">Chrome 背景</translation> +<translation id="7876027585589532670">無法編輯捷徑</translation> <translation id="7877451762676714207">不明的伺服器錯誤。請再試一次,或與伺服器管理員聯絡。</translation> <translation id="7879631849810108578">快速鍵組合:<ph name="IDS_SHORT_SET_COMMAND" /></translation> <translation id="7880823633812189969">系統會在您重新啟動時刪除本機資料</translation> @@ -6323,6 +6344,7 @@ <translation id="8189750580333936930">私隱沙箱</translation> <translation id="8190193592390505034">正在連線至 <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">管理您的應用程式、擴充功能和主題</translation> +<translation id="8192944472786724289">「<ph name="APP_NAME" />」要求分享螢幕內容。</translation> <translation id="8195027750202970175">磁碟大小</translation> <translation id="8198323535106903877">我們將為您安裝這 <ph name="NUMBER_OF_APPS" /> 個應用程式</translation> <translation id="8199300056570174101">網絡 (服務) 和裝置屬性元件</translation> @@ -6971,6 +6993,7 @@ <translation id="8931475688782629595">管理同步處理的項目</translation> <translation id="8932654652795262306">「即時網絡共享」詳情</translation> <translation id="8932894639908691771">「按鈕控制」選項</translation> +<translation id="893298445929867520">已隱藏購物車。當您作出變更時,購物車就會重新顯示。</translation> <translation id="8933960630081805351">在 Finder 中顯示(&S)</translation> <translation id="8934732568177537184">繼續</translation> <translation id="8938306522009698937">處理常式</translation> @@ -7247,6 +7270,7 @@ <translation id="942532530371314860"><ph name="APP_NAME" /> 正在共用 Chrome 分頁和音效。</translation> <translation id="945522503751344254">提供意見反映</translation> <translation id="947329552760389097">檢查元素 (&I)</translation> +<translation id="947667444780368238">由於資料夾中包含系統檔案,<ph name="ORIGIN" /> 無法開啟此資料夾中的檔案</translation> <translation id="951991426597076286">拒絕</translation> <translation id="956500788634395331">保護您免受可能有害的擴充程式影響</translation> <translation id="957960681186851048">此網站曾嘗試自動下載多個檔案</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index 966d0495..dd92570 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -575,6 +575,7 @@ <translation id="1627408615528139100">已下載</translation> <translation id="1628948239858170093">要先掃描檔案再開啟嗎?</translation> <translation id="1629314197035607094">密碼已過期</translation> +<translation id="1629521517399325891">使用者憑證不適用於網路驗證。</translation> <translation id="163072119192489970">可以完成資料的傳送和接收</translation> <translation id="1630768113285622200">重新啟動並繼續</translation> <translation id="1632082166874334883">儲存在 Google 帳戶中的密碼</translation> @@ -1179,6 +1180,7 @@ <translation id="2300383962156589922">自訂及控制 <ph name="APP_NAME" /></translation> <translation id="2301382460326681002">擴充功能根目錄無效。</translation> <translation id="23030561267973084">「<ph name="EXTENSION_NAME" />」要求其他權限。</translation> +<translation id="230529452743010958">這是根據你使用 Google 服務的活動記錄而顯示的項目。你可以前往 <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> 查看或刪除自己的資料,也可以變更設定。</translation> <translation id="23055578400314116">請選取使用者名稱</translation> <translation id="2307462900900812319">設定網路</translation> <translation id="230927227160767054">這個網頁想要安裝服務處理常式。</translation> @@ -1404,6 +1406,7 @@ <translation id="2541706104884128042">已設定新的就寢時間</translation> <translation id="2542050502251273923">使用 ff_debug 設定網路連線管理員和其他服務的偵錯等級。</translation> <translation id="2544292303401268586">管理員已要求重新啟動裝置並更新應用程式。這項作業可能需要幾分鐘才能完成。</translation> +<translation id="2544352060595557290">這個分頁</translation> <translation id="2544853746127077729">網路已拒絕驗證憑證</translation> <translation id="2546283357679194313">Cookie 和網站資料</translation> <translation id="2548347166720081527">已允許使用<ph name="PERMISSION" /></translation> @@ -1569,6 +1572,7 @@ <translation id="2734760316755174687"><ph name="SITE_GROUP_NAME" /> 之下的網站也會進行重設。</translation> <translation id="2735712963799620190">設定時間</translation> <translation id="2737363922397526254">收合...</translation> +<translation id="2737916598897808047">「<ph name="APP_NAME" />」要求與 <ph name="TARGET_NAME" /> 分享螢幕內容。</translation> <translation id="2738771556149464852">此日期之前:</translation> <translation id="2739191690716947896">偵錯</translation> <translation id="2739240477418971307">變更你的無障礙設定</translation> @@ -2397,6 +2401,7 @@ <translation id="3677911431265050325">切換為行動版網站</translation> <translation id="3677959414150797585">包括應用程式、網頁等。只有當你選擇提供使用資料時,系統才會傳送統計資料用來改善建議項目。</translation> <translation id="3678156199662914018">擴充功能:<ph name="EXTENSION_NAME" /></translation> +<translation id="3678188444105291936">你在這個視窗瀏覽的網頁不會顯示在瀏覽器記錄中,而且在你登出後,電腦上也不會留下 Cookie 等其他追蹤記錄。此外,系統不會保留你下載的檔案和建立的書籤。</translation> <translation id="3680683624079082902">文字轉語音的聲音</translation> <translation id="3681311097828166361">感謝你提供意見!你目前處於離線狀態,重新上線後系統就會傳送你的意見回饋報告。</translation> <translation id="3682824389861648626">滑鼠移動限額</translation> @@ -2598,6 +2603,7 @@ <translation id="3884152383786131369">支援多種語言的網站內容會使用這個清單上第一個支援的語言。這些偏好設定會與你的瀏覽器設定同步。<ph name="BEGIN_LINK_LEARN_MORE" />瞭解詳情<ph name="END_LINK_LEARN_MORE" /></translation> <translation id="3886446263141354045">你想存取這個網站的要求已傳送給<ph name="NAME" /></translation> <translation id="3888550877729210209">使用「<ph name="LOCK_SCREEN_APP_NAME" />」寫筆記</translation> +<translation id="3888586133700543064">這項資訊可協助我們進一步瞭解 Google 助理的問題。此資訊最多會保存 90 天,而且僅開放相關的工程團隊和意見回饋團隊存取。</translation> <translation id="3890064827463908288">開啟 Chrome 同步功能以使用 Wi-Fi 同步功能</translation> <translation id="3892414795099177503">新增 OpenVPN/L2TP...</translation> <translation id="3893536212201235195">讀取及變更你的無障礙設定</translation> @@ -2629,6 +2635,7 @@ <translation id="3916445069167113093">這種類型的檔案可能會損害你的電腦,你要保留 <ph name="FILE_NAME" /> 這個檔案嗎?</translation> <translation id="3918972485393593704">向 Google 回報詳細資料</translation> <translation id="3919145445993746351">如要在所有電腦上使用你的擴充功能,請開啟同步功能</translation> +<translation id="3919798653937160644">你在這個視窗瀏覽的網頁不會顯示在瀏覽器記錄中,而且所有開啟的訪客視窗都關閉後,電腦上也不會留下 Cookie 等其他追蹤記錄。不過,系統將保留你下載的所有檔案。</translation> <translation id="3920504717067627103">憑證原則</translation> <translation id="392089482157167418">啟用 ChromeVox (互動朗讀)</translation> <translation id="3920909973552939961">不得安裝付款處理常式</translation> @@ -2965,6 +2972,7 @@ <translation id="4332976768901252016">設定家長監護功能</translation> <translation id="4333854382783149454">PKCS #1 SHA-1 (使用 RSA 加密)</translation> <translation id="4336434711095810371">清除所有資料</translation> +<translation id="4340125850502689798">使用者名稱無效</translation> <translation id="4340515029017875942"><ph name="ORIGIN" /> 要求與「<ph name="EXTENSION_NAME" />」應用程式通訊</translation> <translation id="4340575312453649552">這個廣告使用了太多裝置資源,因此 Chrome 已將其移除。</translation> <translation id="4341577178275615435">如要開啟或關閉鍵盤瀏覽功能,請使用快速鍵 F7</translation> @@ -3579,6 +3587,7 @@ <translation id="5057110919553308744">當你點選擴充功能時</translation> <translation id="5057403786441168405">管理已登入的帳戶。Chrome 和 Google Play 的網站、應用程式和擴充功能可能會使用這些帳戶為你提供個人化的使用體驗 (依權限而定)。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="5059241099014281248">限制登入</translation> +<translation id="5059526285558225588">選擇要分享的內容</translation> <translation id="5060332552815861872">有 1 台可供儲存的印表機。</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{這個資料夾內含 1 個書籤。確定要刪除該書籤嗎?}other{這個資料夾內含 # 個書籤。確定要刪除這些書籤嗎?}}</translation> <translation id="5062930723426326933">無法登入,請重新連線至網際網路並再試一次。</translation> @@ -3695,6 +3704,7 @@ <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation> <translation id="5190187232518914472">重溫你最珍視的美好回憶。如要新增或編輯相簿,請前往 <ph name="LINK_BEGIN" />Google 相簿<ph name="LINK_END" />。</translation> <translation id="5190926251776387065">啟用連接埠</translation> +<translation id="5191094172448199359">你輸入的 PIN 碼不相符</translation> <translation id="5191251636205085390">進一步瞭解用於取代第三方 Cookie 的全新技術並進行控管</translation> <translation id="51918995459521422"><ph name="ORIGIN" /> 想要下載多個檔案</translation> <translation id="5192062846343383368">開啟 Family Link 應用程式以查看監督功能設定</translation> @@ -3707,6 +3717,7 @@ <translation id="5204673965307125349">請在裝置上執行 Powerwash,然後再試一次。</translation> <translation id="5204967432542742771">輸入密碼</translation> <translation id="5205484256512407285">一律不使用行動數據進行傳輸</translation> +<translation id="520568280985468584">已成功新增網路。行動網路可能要過幾分鐘才會啟用。</translation> <translation id="5206215183583316675">要刪除「<ph name="CERTIFICATE_NAME" />」嗎?</translation> <translation id="520621735928254154">憑證匯入錯誤</translation> <translation id="5206787458656075734">{COUNT,plural, =1{已成功變更遭外洩的密碼。你還有 # 組遭外洩的密碼。Chrome 建議你立即檢查這組密碼。}other{已成功變更遭外洩的密碼。你還有 # 組遭外洩的密碼。Chrome 建議你立即檢查這些密碼。}}</translation> @@ -4341,6 +4352,7 @@ <translation id="5935656526031444304">管理安全瀏覽功能</translation> <translation id="5938002010494270685">可進行安全性更新</translation> <translation id="5939518447894949180">重設</translation> +<translation id="5939719276406088041">無法建立捷徑</translation> <translation id="5941153596444580863">新增使用者...</translation> <translation id="5941343993301164315">請登入 <ph name="TOKEN_NAME" />。</translation> <translation id="5941711191222866238">最小化</translation> @@ -4428,6 +4440,7 @@ <translation id="6043994281159824495">立即登出</translation> <translation id="6044805581023976844"><ph name="APP_NAME" /> 正在與 <ph name="TAB_NAME" /> 共用 Chrome 分頁和音訊。</translation> <translation id="6045114302329202345">主要 TrackPoint 按鈕</translation> +<translation id="6047632800149092791">同步功能無法正常運作。請嘗試登出,再重新登入。</translation> <translation id="6049004884579590341">按住 |<ph name="ACCELERATOR" />| 即可結束全螢幕模式</translation> <translation id="6051354611314852653">糟糕!系統無法將 API 存取權授予這個裝置。</translation> <translation id="6052976518993719690">SSL 憑證授權單位</translation> @@ -4520,6 +4533,7 @@ <translation id="6143186082490678276">取得說明</translation> <translation id="6143366292569327983">選擇網頁的原文語言</translation> <translation id="6144938890088808325">協助我們改善 Chromebook</translation> +<translation id="6146409560350811147">同步功能無法正常運作。請嘗試重新登入。</translation> <translation id="6147020289383635445">列印預覽失敗。</translation> <translation id="6148576794665275391">立即開啟</translation> <translation id="6149015141270619212">無法連線至網際網路</translation> @@ -4587,6 +4601,7 @@ <translation id="6232017090690406397">電池</translation> <translation id="6232116551750539448">「<ph name="NAME" />」的連線已中斷</translation> <translation id="6233154960150021497">預設使用語音,而不使用鍵盤</translation> +<translation id="6234108445915742946">Chrome《服務條款》將於 3 月 31 日變更</translation> <translation id="6234474535228214774">等待安裝中</translation> <translation id="6237474966939441970">觸控筆做筆記應用程式</translation> <translation id="6237816943013845465">讓你調整螢幕解析度</translation> @@ -4886,6 +4901,7 @@ <translation id="656293578423618167">檔案路徑或檔案名稱過長。請縮短檔案名稱或選擇其他儲存位置。</translation> <translation id="6563469144985748109">你的管理員尚未核准這個網站</translation> <translation id="6569934958368283244">其他人</translation> +<translation id="6573497332121198392">無法移除捷徑</translation> <translation id="657402800789773160">重新載入這個網頁(&R)</translation> <translation id="6577284282025554716">已取消下載:<ph name="FILE_NAME" /></translation> <translation id="657866106756413002">網路健康狀態數據匯報</translation> @@ -4893,6 +4909,7 @@ <translation id="6579705087617859690"><ph name="WINDOW_TITLE" /> - 已分享桌面內容</translation> <translation id="6580203076670148210">掃描速度</translation> <translation id="6582080224869403177">請重設 <ph name="DEVICE_TYPE" />,以便進行安全性更新。</translation> +<translation id="6582274660680936615">你目前是以訪客身分瀏覽</translation> <translation id="6584878029876017575">Microsoft 永久簽署</translation> <translation id="6586099239452884121">訪客瀏覽</translation> <translation id="6586451623538375658">調換滑鼠主按鈕</translation> @@ -5062,6 +5079,7 @@ <translation id="6782468519961184511">管理員已禁止新增其他 Google 帳戶</translation> <translation id="6785518634832172390">PIN 碼不能超過 12 個數字</translation> <translation id="6786747875388722282">擴充功能</translation> +<translation id="6787097042755590313">其他分頁</translation> <translation id="6787839852456839824">鍵盤快速鍵</translation> <translation id="6788210894632713004">未封裝擴充功能</translation> <translation id="6789592661892473991">水平分割</translation> @@ -5072,6 +5090,7 @@ <translation id="6793723358811598107">「<ph name="CURRENTKEY" />」鍵已指派給「<ph name="ACTION" />」動作。請按下任何按鍵以離開。</translation> <translation id="6795884519221689054">熊貓</translation> <translation id="6797493596609571643">糟糕,發生錯誤。</translation> +<translation id="6798420440063423019">輸入錯誤 PIN 碼的次數太多,因此安全金鑰已遭到鎖定。你必須重設安全金鑰。</translation> <translation id="6798578729981748444">如要結束匯入作業,請關閉所有 Firefox 視窗。</translation> <translation id="6798780071646309401">大寫鎖定模式已開啟</translation> <translation id="6798954102094737107">外掛程式:<ph name="PLUGIN_NAME" /></translation> @@ -5417,6 +5436,7 @@ <translation id="7180865173735832675">自訂</translation> <translation id="7182791023900310535">轉移你的密碼</translation> <translation id="7186088072322679094">固定在工具列中</translation> +<translation id="7186303001964993981"><ph name="ORIGIN" /> 無法開啟這個資料夾,因為資料夾中包含系統檔案</translation> <translation id="7187428571767585875">系統將移除或變更下列登錄檔項目:</translation> <translation id="7187855807420906517">在你離開或離線後,網站通常會繼續進行同步作業,以完成各項工作,例如上傳相片或傳送聊天訊息等等</translation> <translation id="7189234443051076392">確認你的裝置上有足夠空間</translation> @@ -6037,6 +6057,7 @@ <translation id="7871109039747854576">使用 <ph name="COMMA" /> 鍵與 <ph name="PERIOD" /> 鍵呼叫候選字清單</translation> <translation id="787268756490971083">關閉</translation> <translation id="7874257161694977650">Chrome 背景</translation> +<translation id="7876027585589532670">無法編輯捷徑</translation> <translation id="7877451762676714207">不明的伺服器錯誤。請再試一次,或與伺服器管理員聯絡。</translation> <translation id="7879631849810108578">已設定快速鍵:<ph name="IDS_SHORT_SET_COMMAND" /></translation> <translation id="7880823633812189969">系統會在你重新啟動時刪除本機資料</translation> @@ -6322,6 +6343,7 @@ <translation id="8189750580333936930">Privacy Sandbox</translation> <translation id="8190193592390505034">正在連線至 <ph name="PROVIDER_NAME" /></translation> <translation id="8191230140820435481">管理你的應用程式、擴充功能和主題</translation> +<translation id="8192944472786724289">「<ph name="APP_NAME" />」要求分享螢幕內容。</translation> <translation id="8195027750202970175">佔磁碟容量</translation> <translation id="8198323535106903877">系統將為你安裝這 <ph name="NUMBER_OF_APPS" /> 個應用程式</translation> <translation id="8199300056570174101">網路 (服務) 與裝置屬性</translation> @@ -6971,6 +6993,7 @@ <translation id="8931475688782629595">管理同步處理的項目</translation> <translation id="8932654652795262306">即時網路共用詳細資料</translation> <translation id="8932894639908691771">開關功能選項</translation> +<translation id="893298445929867520">已隱藏購物車。變更設定即可讓購物車再次出現。</translation> <translation id="8933960630081805351">在 Finder 中顯示(&S)</translation> <translation id="8934732568177537184">繼續</translation> <translation id="8938306522009698937">處理常式</translation> @@ -7247,6 +7270,7 @@ <translation id="942532530371314860"><ph name="APP_NAME" /> 正在共用 Chrome 分頁和音訊。</translation> <translation id="945522503751344254">提供意見</translation> <translation id="947329552760389097">檢查元素 (&I)</translation> +<translation id="947667444780368238"><ph name="ORIGIN" /> 無法開啟此資料夾的檔案,因為資料夾中包含系統檔案</translation> <translation id="951991426597076286">拒絕</translation> <translation id="956500788634395331">系統已限制可能有害的擴充功能</translation> <translation id="957960681186851048">這個網站試圖自動下載多個檔案</translation>
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp index 2eb90cd..5c1d0693 100644 --- a/chrome/app/settings_strings.grdp +++ b/chrome/app/settings_strings.grdp
@@ -2421,19 +2421,19 @@ <message name="IDS_SETTINGS_SITE_SETTINGS_SERIAL_PORTS_BLOCK" desc="The block label for serial ports in site settings."> Do not allow any sites to access serial ports </message> - <message name="IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_ACCESS_WRITE" desc="Label for File System Access write permission, which enables sites to save changes to the original files that were selected by the user."> + <message name="IDS_SETTINGS_SITE_SETTINGS_NATIVE_FILE_SYSTEM_WRITE" desc="Label for native file system write permission, which enables sites to save changes to the original files that were selected by the user."> File editing </message> - <message name="IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_ACCESS_WRITE_MID_SENTENCE" desc="Label for File System Access write permission when used mid-sentence, which enables sites to save changes to the original files that were selected by the user."> + <message name="IDS_SETTINGS_SITE_SETTINGS_NATIVE_FILE_SYSTEM_WRITE_MID_SENTENCE" desc="Label for native file system write permission when used mid-sentence, which enables sites to save changes to the original files that were selected by the user."> file editing </message> - <message name="IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_ACCESS_WRITE_ASK" desc="The ask label for File System Access write permission in site settings."> + <message name="IDS_SETTINGS_SITE_SETTINGS_NATIVE_FILE_SYSTEM_WRITE_ASK" desc="The ask label for native file system write permission in site settings."> Ask when a site wants to edit files or folders on your device </message> - <message name="IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_ACCESS_WRITE_ASK_RECOMMENDED" desc="The ask label for File System Access write permission in site settings (with the 'recommended' suffix)."> + <message name="IDS_SETTINGS_SITE_SETTINGS_NATIVE_FILE_SYSTEM_WRITE_ASK_RECOMMENDED" desc="The ask label for native file system write permission in site settings (with the 'recommended' suffix)."> Ask when a site wants to edit files or folders on your device (recommended) </message> - <message name="IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_ACCESS_WRITE_BLOCK" desc="The block label for File System Access write permission in site settings."> + <message name="IDS_SETTINGS_SITE_SETTINGS_NATIVE_FILE_SYSTEM_WRITE_BLOCK" desc="The block label for native file system write permission in site settings."> Do not allow any sites to edit files or folders on your device </message> <message name="IDS_SETTINGS_SITE_SETTINGS_REMOVE_ZOOM_LEVEL" desc="Title tooltip and accessibility text for the button to remove zoom levels in site settings">
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_ACCESS_WRITE.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_ACCESS_WRITE.png.sha1 deleted file mode 100644 index 56f2967..0000000 --- a/chrome/app/settings_strings_grdp/IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_ACCESS_WRITE.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -b7e73e00e404768da890f00385ba0c2461932031components/page_info/page_info_ui.cc \ No newline at end of file
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_SITE_SETTINGS_NATIVE_FILE_SYSTEM_WRITE.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_SITE_SETTINGS_NATIVE_FILE_SYSTEM_WRITE.png.sha1 new file mode 100644 index 0000000..1b7b004 --- /dev/null +++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_SITE_SETTINGS_NATIVE_FILE_SYSTEM_WRITE.png.sha1
@@ -0,0 +1 @@ +b7e73e00e404768da890f00385ba0c2461932031 \ No newline at end of file
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_ACCESS_WRITE_ASK.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_SITE_SETTINGS_NATIVE_FILE_SYSTEM_WRITE_ASK.png.sha1 similarity index 100% rename from chrome/app/settings_strings_grdp/IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_ACCESS_WRITE_ASK.png.sha1 rename to chrome/app/settings_strings_grdp/IDS_SETTINGS_SITE_SETTINGS_NATIVE_FILE_SYSTEM_WRITE_ASK.png.sha1
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_ACCESS_WRITE_ASK_RECOMMENDED.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_SITE_SETTINGS_NATIVE_FILE_SYSTEM_WRITE_ASK_RECOMMENDED.png.sha1 similarity index 100% rename from chrome/app/settings_strings_grdp/IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_ACCESS_WRITE_ASK_RECOMMENDED.png.sha1 rename to chrome/app/settings_strings_grdp/IDS_SETTINGS_SITE_SETTINGS_NATIVE_FILE_SYSTEM_WRITE_ASK_RECOMMENDED.png.sha1
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_ACCESS_WRITE_BLOCK.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_SITE_SETTINGS_NATIVE_FILE_SYSTEM_WRITE_BLOCK.png.sha1 similarity index 100% rename from chrome/app/settings_strings_grdp/IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_ACCESS_WRITE_BLOCK.png.sha1 rename to chrome/app/settings_strings_grdp/IDS_SETTINGS_SITE_SETTINGS_NATIVE_FILE_SYSTEM_WRITE_BLOCK.png.sha1
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_ACCESS_WRITE_MID_SENTENCE.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_SITE_SETTINGS_NATIVE_FILE_SYSTEM_WRITE_MID_SENTENCE.png.sha1 similarity index 100% rename from chrome/app/settings_strings_grdp/IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_ACCESS_WRITE_MID_SENTENCE.png.sha1 rename to chrome/app/settings_strings_grdp/IDS_SETTINGS_SITE_SETTINGS_NATIVE_FILE_SYSTEM_WRITE_MID_SENTENCE.png.sha1
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 00c190f..c65faf40 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -1678,6 +1678,8 @@ "speech/chrome_speech_recognition_manager_delegate.h", "speech/network_speech_recognizer.cc", "speech/network_speech_recognizer.h", + "speech/on_device_speech_recognizer.cc", + "speech/on_device_speech_recognizer.h", "speech/speech_recognizer.cc", "speech/speech_recognizer.h", "speech/speech_recognizer_delegate.cc", @@ -3294,7 +3296,6 @@ "//components/payments/content/android", "//components/payments/content/android:jni_headers", "//components/permissions/android:native", - "//components/power_metrics", "//components/power_scheduler", "//components/query_tiles", "//components/reading_list/features:flags", @@ -4003,8 +4004,6 @@ # to extensions # section ? "speech/extension_api/tts_extension_api_constants.h", - "speech/on_device_speech_recognizer.cc", - "speech/on_device_speech_recognizer.h", "speech/speech_recognition_client_browser_interface.cc", "speech/speech_recognition_client_browser_interface.h", "speech/speech_recognition_client_browser_interface_factory.cc", @@ -6926,6 +6925,7 @@ "//extensions:test_support", "//extensions/browser", "//extensions/browser:test_support", + "//extensions/common:mojom", "//google_apis:test_support", "//services/data_decoder/public/cpp:test_support", ]
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index a572f14..ccf1f39 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -1794,6 +1794,13 @@ {"exclude_mv_tiles", "true"}, {"open_ntp_instead_of_start", "true"}}; +const FeatureEntry::FeatureParam kStartSurfaceAndroid_SingleSurface_V2Finale[] = + {{"start_surface_variation", "single"}, + {"show_last_active_tab_only", "true"}, + {"omnibox_focused_on_new_tab", "true"}, + {"home_button_on_grid_tab_switcher", "true"}, + {"new_home_surface_from_home_button", "hide_tab_switcher_only"}}; + const FeatureEntry::FeatureParam kStartSurfaceAndroid_SingleSurfaceWithoutMvTiles[] = { {"start_surface_variation", "single"}, @@ -1846,6 +1853,8 @@ base::size(kStartSurfaceAndroid_SingleSurfaceFinale), nullptr}, {"Single Surface V2", kStartSurfaceAndroid_SingleSurface_V2, base::size(kStartSurfaceAndroid_SingleSurface_V2), nullptr}, + {"Single Surface V2 Finale", kStartSurfaceAndroid_SingleSurface_V2Finale, + base::size(kStartSurfaceAndroid_SingleSurface_V2Finale), nullptr}, {"Single Surface without MV Tiles", kStartSurfaceAndroid_SingleSurfaceWithoutMvTiles, base::size(kStartSurfaceAndroid_SingleSurfaceWithoutMvTiles), nullptr}, @@ -6487,6 +6496,9 @@ #endif // defined(OS_WIN) #if BUILDFLAG(IS_CHROMEOS_ASH) + {"scan-app-media-link", flag_descriptions::kScanAppMediaLinkName, + flag_descriptions::kScanAppMediaLinkDescription, kOsCrOS, + FEATURE_VALUE_TYPE(chromeos::features::kScanAppMediaLink)}, {"scanning-ui", flag_descriptions::kScanningUIName, flag_descriptions::kScanningUIDescription, kOsCrOS, FEATURE_VALUE_TYPE(chromeos::features::kScanningUI)},
diff --git a/chrome/browser/accessibility/caption_controller.cc b/chrome/browser/accessibility/caption_controller.cc index d28a30e..467a0db 100644 --- a/chrome/browser/accessibility/caption_controller.cc +++ b/chrome/browser/accessibility/caption_controller.cc
@@ -156,7 +156,7 @@ CreateUI(); } else { speech::SodaInstaller::GetInstance()->AddObserver(this); - speech::SodaInstaller::GetInstance()->Init(profile_->GetPrefs()); + speech::SodaInstaller::GetInstance()->InitForProfileIfAppropriate(profile_); } }
diff --git a/chrome/browser/accessibility/soda_installer.cc b/chrome/browser/accessibility/soda_installer.cc index 1607917..9933f1ea 100644 --- a/chrome/browser/accessibility/soda_installer.cc +++ b/chrome/browser/accessibility/soda_installer.cc
@@ -4,9 +4,12 @@ #include "chrome/browser/accessibility/soda_installer.h" +#include "base/feature_list.h" +#include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/browser/browser_process.h" #include "chrome/common/pref_names.h" #include "components/prefs/pref_service.h" +#include "media/base/media_switches.h" namespace speech { @@ -14,7 +17,19 @@ SodaInstaller::~SodaInstaller() = default; -void SodaInstaller::Init(PrefService* prefs) { +void SodaInstaller::InitForProfileIfAppropriate(Profile* profile) { + if (!base::FeatureList::IsEnabled(media::kLiveCaption) || + !base::FeatureList::IsEnabled(media::kUseSodaForLiveCaption)) + return; + +#if BUILDFLAG(IS_CHROMEOS_ASH) + // Exclude signin profile because Live Captions can only be used when + // signed in with a regular profile. + if (ash::ProfileHelper::IsSigninProfile(profile)) + return; +#endif // BUILDFLAG(IS_CHROMEOS_ASH) + + PrefService* prefs = profile->GetPrefs(); if (prefs->GetBoolean(prefs::kLiveCaptionEnabled)) { g_browser_process->local_state()->SetTime(prefs::kSodaScheduledDeletionTime, base::Time());
diff --git a/chrome/browser/accessibility/soda_installer.h b/chrome/browser/accessibility/soda_installer.h index ae43b74..37a0cd2 100644 --- a/chrome/browser/accessibility/soda_installer.h +++ b/chrome/browser/accessibility/soda_installer.h
@@ -7,6 +7,7 @@ #include "base/files/file_path.h" #include "base/observer_list.h" +#include "chrome/browser/profiles/profile.h" class PrefService; @@ -39,10 +40,10 @@ // instance. static SodaInstaller* GetInstance(); - // Initialize SODA. Called by ChromeBrowserMainParts during browser startup. - // Checks whether SODA is due for uninstallation, and if so, triggers - // uninstallation. - void Init(PrefService* prefs); + // Initialize SODA if appropriate for profile type. Called by + // ChromeBrowserMainParts during browser startup. Checks whether SODA is due + // for uninstallation, and if so, triggers uninstallation. + void InitForProfileIfAppropriate(Profile* profile); // Gets the directory path of the installed SODA lib bundle, or an empty path // if not installed. Currently Chrome OS only, returns empty path on other
diff --git a/chrome/browser/apps/app_service/borealis_apps.cc b/chrome/browser/apps/app_service/borealis_apps.cc index c8abd1b..228dc88 100644 --- a/chrome/browser/apps/app_service/borealis_apps.cc +++ b/chrome/browser/apps/app_service/borealis_apps.cc
@@ -9,12 +9,12 @@ #include "base/callback_helpers.h" #include "chrome/browser/apps/app_service/app_icon_factory.h" #include "chrome/browser/apps/app_service/menu_util.h" -#include "chrome/browser/chromeos/borealis/borealis_app_launcher.h" -#include "chrome/browser/chromeos/borealis/borealis_app_uninstaller.h" -#include "chrome/browser/chromeos/borealis/borealis_context_manager.h" -#include "chrome/browser/chromeos/borealis/borealis_features.h" -#include "chrome/browser/chromeos/borealis/borealis_service.h" -#include "chrome/browser/chromeos/borealis/borealis_util.h" +#include "chrome/browser/ash/borealis/borealis_app_launcher.h" +#include "chrome/browser/ash/borealis/borealis_app_uninstaller.h" +#include "chrome/browser/ash/borealis/borealis_context_manager.h" +#include "chrome/browser/ash/borealis/borealis_features.h" +#include "chrome/browser/ash/borealis/borealis_service.h" +#include "chrome/browser/ash/borealis/borealis_util.h" #include "chrome/browser/chromeos/guest_os/guest_os_registry_service.h" #include "chrome/browser/chromeos/guest_os/guest_os_registry_service_factory.h" #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/apps/app_service/borealis_apps.h b/chrome/browser/apps/app_service/borealis_apps.h index 8e401b2..87cefa40a 100644 --- a/chrome/browser/apps/app_service/borealis_apps.h +++ b/chrome/browser/apps/app_service/borealis_apps.h
@@ -10,7 +10,7 @@ #include "base/scoped_observation.h" #include "chrome/browser/apps/app_service/icon_key_util.h" -#include "chrome/browser/chromeos/borealis/borealis_window_manager.h" +#include "chrome/browser/ash/borealis/borealis_window_manager.h" #include "chrome/browser/chromeos/guest_os/guest_os_registry_service.h" #include "components/services/app_service/public/cpp/publisher_base.h" #include "components/services/app_service/public/mojom/app_service.mojom.h"
diff --git a/chrome/browser/ash/accessibility/accessibility_manager.cc b/chrome/browser/ash/accessibility/accessibility_manager.cc index aa4e4dc..921d7fb 100644 --- a/chrome/browser/ash/accessibility/accessibility_manager.cc +++ b/chrome/browser/ash/accessibility/accessibility_manager.cc
@@ -82,7 +82,6 @@ #include "extensions/common/extension.h" #include "extensions/common/extension_messages.h" #include "extensions/common/extension_resource.h" -#include "extensions/common/host_id.h" #include "services/audio/public/cpp/sounds/sounds_manager.h" #include "ui/accessibility/accessibility_switches.h" #include "ui/accessibility/ax_enum_util.h"
diff --git a/chrome/browser/ash/accessibility/dictation.cc b/chrome/browser/ash/accessibility/dictation.cc index d8583732..56f5fb4 100644 --- a/chrome/browser/ash/accessibility/dictation.cc +++ b/chrome/browser/ash/accessibility/dictation.cc
@@ -9,14 +9,12 @@ #include "chrome/browser/ash/accessibility/accessibility_manager.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/speech/network_speech_recognizer.h" -#include "chrome/browser/speech/on_device_speech_recognizer.h" #include "chrome/common/pref_names.h" #include "components/language/core/browser/pref_names.h" #include "components/prefs/pref_service.h" #include "content/public/browser/storage_partition.h" #include "services/audio/public/cpp/sounds/sounds_manager.h" #include "services/network/public/cpp/shared_url_loader_factory.h" -#include "ui/accessibility/accessibility_switches.h" #include "ui/base/ime/chromeos/extension_ime_util.h" #include "ui/base/ime/chromeos/ime_bridge.h" #include "ui/base/ime/chromeos/ime_input_context_handler_interface.h" @@ -60,9 +58,7 @@ } // namespace Dictation::Dictation(Profile* profile) - : current_state_(SPEECH_RECOGNIZER_OFF), - composition_(std::make_unique<ui::CompositionText>()), - profile_(profile) { + : composition_(std::make_unique<ui::CompositionText>()), profile_(profile) { if (GetInputContext() && GetInputContext()->GetInputMethod()) GetInputContext()->GetInputMethod()->AddObserver(this); } @@ -78,20 +74,13 @@ return false; } - if (OnDeviceSpeechRecognizer::IsOnDeviceSpeechRecognizerAvailable() && - switches::IsExperimentalAccessibilityDictationOfflineEnabled()) { - // On-device recognition is behind a flag and then only available if - // SODA is installed on-device. - speech_recognizer_ = std::make_unique<OnDeviceSpeechRecognizer>( - weak_ptr_factory_.GetWeakPtr(), profile_); - } else { - speech_recognizer_ = std::make_unique<NetworkSpeechRecognizer>( - weak_ptr_factory_.GetWeakPtr(), - content::BrowserContext::GetDefaultStoragePartition(profile_) - ->GetURLLoaderFactoryForBrowserProcessIOThread(), - profile_->GetPrefs()->GetString(language::prefs::kAcceptLanguages), - GetUserLanguage(profile_)); - } + speech_recognizer_ = std::make_unique<NetworkSpeechRecognizer>( + weak_ptr_factory_.GetWeakPtr(), + content::BrowserContext::GetDefaultStoragePartition(profile_) + ->GetURLLoaderFactoryForBrowserProcessIOThread(), + profile_->GetPrefs()->GetString(language::prefs::kAcceptLanguages), + GetUserLanguage(profile_)); + speech_recognizer_->Start(); return true; } @@ -119,26 +108,12 @@ void Dictation::OnSpeechRecognitionStateChanged( SpeechRecognizerStatus new_state) { - SpeechRecognizerStatus next_state = new_state; - if (new_state == SPEECH_RECOGNIZER_RECOGNIZING) { - // If we are starting to listen to audio, play a tone for the user. + if (new_state == SPEECH_RECOGNIZER_RECOGNIZING) audio::SoundsManager::Get()->Play(static_cast<int>(Sound::kDictationStart)); - } else if (new_state == SPEECH_RECOGNIZER_ERROR) { + else if (new_state == SPEECH_RECOGNIZER_READY) + // This state is only reached when nothing has been said for a fixed time. + // In this case, the expected behavior is for dictation to terminate. DictationOff(); - next_state = SPEECH_RECOGNIZER_OFF; - } else if (new_state == SPEECH_RECOGNIZER_READY) { - if (current_state_ == SPEECH_RECOGNIZER_OFF) { - // The SpeechRecognizer was initialized after being created, and - // is ready to start recognizing speech. - speech_recognizer_->Start(); - } else { - // This state is only reached when nothing has been said for a fixed time. - // In this case, the expected behavior is for dictation to terminate. - DictationOff(); - next_state = SPEECH_RECOGNIZER_OFF; - } - } - current_state_ = next_state; } void Dictation::OnTextInputStateChanged(const ui::TextInputClient* client) { @@ -153,7 +128,6 @@ } void Dictation::DictationOff() { - current_state_ = SPEECH_RECOGNIZER_OFF; if (!speech_recognizer_) return;
diff --git a/chrome/browser/ash/accessibility/dictation.h b/chrome/browser/ash/accessibility/dictation.h index 961899527..e43e9c9 100644 --- a/chrome/browser/ash/accessibility/dictation.h +++ b/chrome/browser/ash/accessibility/dictation.h
@@ -57,8 +57,6 @@ // Saves current dictation result and stops listening. void DictationOff(); - SpeechRecognizerStatus current_state_; - std::unique_ptr<SpeechRecognizer> speech_recognizer_; std::unique_ptr<ui::CompositionText> composition_;
diff --git a/chrome/browser/ash/accessibility/dictation_browsertest.cc b/chrome/browser/ash/accessibility/dictation_browsertest.cc index 7ffaf3d..6258ad44 100644 --- a/chrome/browser/ash/accessibility/dictation_browsertest.cc +++ b/chrome/browser/ash/accessibility/dictation_browsertest.cc
@@ -32,8 +32,6 @@ .composition_text; } ~DictationTest() override = default; - DictationTest(const DictationTest&) = delete; - DictationTest& operator=(const DictationTest&) = delete; void SetUpOnMainThread() override { ui::IMEBridge::Get()->SetInputContextHandler(input_context_handler_.get()); @@ -52,12 +50,6 @@ GetManager()->dictation_->OnTextInputStateChanged(client); } - void ToggleDictation() { - GetManager()->ToggleDictation(); - base::RunLoop run_loop; - run_loop.RunUntilIdle(); - } - ui::CompositionText GetLastCompositionText() { return input_context_handler_->last_update_composition_arg() .composition_text; @@ -68,7 +60,9 @@ }; IN_PROC_BROWSER_TEST_F(DictationTest, RecognitionEnds) { - ToggleDictation(); + AccessibilityManager* manager = GetManager(); + + manager->ToggleDictation(); EXPECT_EQ(GetLastCompositionText().text, empty_composition_text_.text); SendSpeechResult(kFirstSpeechResult, false /* is_final */); @@ -87,10 +81,11 @@ IN_PROC_BROWSER_TEST_F(DictationTest, RecognitionEndsWithChromeVoxEnabled) { AccessibilityManager* manager = GetManager(); + EnableChromeVox(); EXPECT_TRUE(manager->IsSpokenFeedbackEnabled()); - ToggleDictation(); + manager->ToggleDictation(); EXPECT_EQ(GetLastCompositionText().text, empty_composition_text_.text); SendSpeechResult(kFirstSpeechResult, false /* is_final */); @@ -105,22 +100,17 @@ input_context_handler_->last_commit_text()); } -IN_PROC_BROWSER_TEST_F(DictationTest, UserEndsDictationBeforeSpeech) { - ToggleDictation(); - ToggleDictation(); - EXPECT_EQ(GetLastCompositionText().text, empty_composition_text_.text); - EXPECT_EQ(0, input_context_handler_->commit_text_call_count()); -} - IN_PROC_BROWSER_TEST_F(DictationTest, UserEndsDictation) { - ToggleDictation(); + AccessibilityManager* manager = GetManager(); + + manager->ToggleDictation(); EXPECT_EQ(GetLastCompositionText().text, empty_composition_text_.text); SendSpeechResult(kFinalSpeechResult, false /* is_final */); EXPECT_EQ(base::ASCIIToUTF16(kFinalSpeechResult), GetLastCompositionText().text); - ToggleDictation(); + manager->ToggleDictation(); EXPECT_EQ(1, input_context_handler_->commit_text_call_count()); EXPECT_EQ(base::ASCIIToUTF16(kFinalSpeechResult), input_context_handler_->last_commit_text()); @@ -132,13 +122,13 @@ EnableChromeVox(); EXPECT_TRUE(manager->IsSpokenFeedbackEnabled()); - ToggleDictation(); + manager->ToggleDictation(); EXPECT_EQ(GetLastCompositionText().text, empty_composition_text_.text); SendSpeechResult(kFinalSpeechResult, false /* is_final */); EXPECT_EQ(GetLastCompositionText().text, empty_composition_text_.text); - ToggleDictation(); + manager->ToggleDictation(); EXPECT_EQ(1, input_context_handler_->commit_text_call_count()); EXPECT_EQ(base::ASCIIToUTF16(kFinalSpeechResult), input_context_handler_->last_commit_text()); @@ -146,7 +136,7 @@ IN_PROC_BROWSER_TEST_F(DictationTest, SwitchInputContext) { // Turn on dictation and say something. - ToggleDictation(); + AccessibilityManager::Get()->ToggleDictation(); SendSpeechResult(kFirstSpeechResult, true /* is_final */); // Speech goes to the default IMEInputContextHandler. @@ -159,7 +149,7 @@ ui::IMEBridge::Get()->SetInputContextHandler(&input_context_handler2); // Turn on dictation and say something else. - ToggleDictation(); + AccessibilityManager::Get()->ToggleDictation(); SendSpeechResult(kSecondSpeechResult, true /* is_final */); // Speech goes to the new IMEInputContextHandler. @@ -171,7 +161,7 @@ IN_PROC_BROWSER_TEST_F(DictationTest, ChangeInputField) { // Turn on dictation and start speaking. - ToggleDictation(); + AccessibilityManager::Get()->ToggleDictation(); SendSpeechResult(kFinalSpeechResult, false /* is_final */); // Change the input state to a new client.
diff --git a/chrome/browser/chromeos/borealis/OWNERS b/chrome/browser/ash/borealis/OWNERS similarity index 100% rename from chrome/browser/chromeos/borealis/OWNERS rename to chrome/browser/ash/borealis/OWNERS
diff --git a/chrome/browser/chromeos/borealis/borealis_app_launcher.cc b/chrome/browser/ash/borealis/borealis_app_launcher.cc similarity index 91% rename from chrome/browser/chromeos/borealis/borealis_app_launcher.cc rename to chrome/browser/ash/borealis/borealis_app_launcher.cc index f45a2a8..a7e12ca 100644 --- a/chrome/browser/chromeos/borealis/borealis_app_launcher.cc +++ b/chrome/browser/ash/borealis/borealis_app_launcher.cc
@@ -2,15 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/borealis/borealis_app_launcher.h" +#include "chrome/browser/ash/borealis/borealis_app_launcher.h" #include "base/bind.h" +#include "chrome/browser/ash/borealis/borealis_context.h" +#include "chrome/browser/ash/borealis/borealis_context_manager.h" +#include "chrome/browser/ash/borealis/borealis_features.h" +#include "chrome/browser/ash/borealis/borealis_service.h" +#include "chrome/browser/ash/borealis/borealis_util.h" #include "chrome/browser/ash/profiles/profile_helper.h" -#include "chrome/browser/chromeos/borealis/borealis_context.h" -#include "chrome/browser/chromeos/borealis/borealis_context_manager.h" -#include "chrome/browser/chromeos/borealis/borealis_features.h" -#include "chrome/browser/chromeos/borealis/borealis_service.h" -#include "chrome/browser/chromeos/borealis/borealis_util.h" #include "chrome/browser/chromeos/guest_os/guest_os_registry_service.h" #include "chrome/browser/chromeos/guest_os/guest_os_registry_service_factory.h" #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/chromeos/borealis/borealis_app_launcher.h b/chrome/browser/ash/borealis/borealis_app_launcher.h similarity index 84% rename from chrome/browser/chromeos/borealis/borealis_app_launcher.h rename to chrome/browser/ash/borealis/borealis_app_launcher.h index ff0a7b5..98941d1 100644 --- a/chrome/browser/chromeos/borealis/borealis_app_launcher.h +++ b/chrome/browser/ash/borealis/borealis_app_launcher.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_APP_LAUNCHER_H_ -#define CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_APP_LAUNCHER_H_ +#ifndef CHROME_BROWSER_ASH_BOREALIS_BOREALIS_APP_LAUNCHER_H_ +#define CHROME_BROWSER_ASH_BOREALIS_BOREALIS_APP_LAUNCHER_H_ #include <string> @@ -45,4 +45,4 @@ } // namespace borealis -#endif // CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_APP_LAUNCHER_H_ +#endif // CHROME_BROWSER_ASH_BOREALIS_BOREALIS_APP_LAUNCHER_H_
diff --git a/chrome/browser/chromeos/borealis/borealis_app_launcher_unittest.cc b/chrome/browser/ash/borealis/borealis_app_launcher_unittest.cc similarity index 96% rename from chrome/browser/chromeos/borealis/borealis_app_launcher_unittest.cc rename to chrome/browser/ash/borealis/borealis_app_launcher_unittest.cc index 98bce64..399eca0 100644 --- a/chrome/browser/chromeos/borealis/borealis_app_launcher_unittest.cc +++ b/chrome/browser/ash/borealis/borealis_app_launcher_unittest.cc
@@ -2,14 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/borealis/borealis_app_launcher.h" +#include "chrome/browser/ash/borealis/borealis_app_launcher.h" + #include <memory> #include "base/bind.h" #include "base/callback_forward.h" #include "base/test/bind.h" -#include "chrome/browser/chromeos/borealis/borealis_context.h" -#include "chrome/browser/chromeos/borealis/borealis_util.h" +#include "chrome/browser/ash/borealis/borealis_context.h" +#include "chrome/browser/ash/borealis/borealis_util.h" #include "chrome/browser/chromeos/guest_os/guest_os_registry_service.h" #include "chrome/browser/chromeos/guest_os/guest_os_registry_service_factory.h" #include "chrome/test/base/testing_profile.h"
diff --git a/chrome/browser/chromeos/borealis/borealis_app_uninstaller.cc b/chrome/browser/ash/borealis/borealis_app_uninstaller.cc similarity index 71% rename from chrome/browser/chromeos/borealis/borealis_app_uninstaller.cc rename to chrome/browser/ash/borealis/borealis_app_uninstaller.cc index fe5c1eb..35aec43 100644 --- a/chrome/browser/chromeos/borealis/borealis_app_uninstaller.cc +++ b/chrome/browser/ash/borealis/borealis_app_uninstaller.cc
@@ -2,12 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/borealis/borealis_app_uninstaller.h" +#include "chrome/browser/ash/borealis/borealis_app_uninstaller.h" #include "base/logging.h" -#include "chrome/browser/chromeos/borealis/borealis_installer.h" -#include "chrome/browser/chromeos/borealis/borealis_service.h" -#include "chrome/browser/chromeos/borealis/borealis_util.h" +#include "chrome/browser/ash/borealis/borealis_installer.h" +#include "chrome/browser/ash/borealis/borealis_service.h" +#include "chrome/browser/ash/borealis/borealis_util.h" namespace borealis {
diff --git a/chrome/browser/chromeos/borealis/borealis_app_uninstaller.h b/chrome/browser/ash/borealis/borealis_app_uninstaller.h similarity index 82% rename from chrome/browser/chromeos/borealis/borealis_app_uninstaller.h rename to chrome/browser/ash/borealis/borealis_app_uninstaller.h index 191d34fd..1ccf8fe 100644 --- a/chrome/browser/chromeos/borealis/borealis_app_uninstaller.h +++ b/chrome/browser/ash/borealis/borealis_app_uninstaller.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_APP_UNINSTALLER_H_ -#define CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_APP_UNINSTALLER_H_ +#ifndef CHROME_BROWSER_ASH_BOREALIS_BOREALIS_APP_UNINSTALLER_H_ +#define CHROME_BROWSER_ASH_BOREALIS_BOREALIS_APP_UNINSTALLER_H_ #include <string> @@ -37,4 +37,4 @@ } // namespace borealis -#endif // CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_APP_UNINSTALLER_H_ +#endif // CHROME_BROWSER_ASH_BOREALIS_BOREALIS_APP_UNINSTALLER_H_
diff --git a/chrome/browser/chromeos/borealis/borealis_context.cc b/chrome/browser/ash/borealis/borealis_context.cc similarity index 86% rename from chrome/browser/chromeos/borealis/borealis_context.cc rename to chrome/browser/ash/borealis/borealis_context.cc index dfe0be6e..042f68c 100644 --- a/chrome/browser/chromeos/borealis/borealis_context.cc +++ b/chrome/browser/ash/borealis/borealis_context.cc
@@ -2,14 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/borealis/borealis_context.h" +#include "chrome/browser/ash/borealis/borealis_context.h" #include "base/memory/ptr_util.h" #include "base/scoped_observation.h" -#include "chrome/browser/chromeos/borealis/borealis_metrics.h" -#include "chrome/browser/chromeos/borealis/borealis_service.h" -#include "chrome/browser/chromeos/borealis/borealis_shutdown_monitor.h" -#include "chrome/browser/chromeos/borealis/borealis_window_manager.h" +#include "chrome/browser/ash/borealis/borealis_metrics.h" +#include "chrome/browser/ash/borealis/borealis_service.h" +#include "chrome/browser/ash/borealis/borealis_shutdown_monitor.h" +#include "chrome/browser/ash/borealis/borealis_window_manager.h" #include "chrome/browser/chromeos/guest_os/guest_os_stability_monitor.h" namespace borealis {
diff --git a/chrome/browser/chromeos/borealis/borealis_context.h b/chrome/browser/ash/borealis/borealis_context.h similarity index 91% rename from chrome/browser/chromeos/borealis/borealis_context.h rename to chrome/browser/ash/borealis/borealis_context.h index cf0492d..e0a9ccbd 100644 --- a/chrome/browser/chromeos/borealis/borealis_context.h +++ b/chrome/browser/ash/borealis/borealis_context.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_CONTEXT_H_ -#define CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_CONTEXT_H_ +#ifndef CHROME_BROWSER_ASH_BOREALIS_BOREALIS_CONTEXT_H_ +#define CHROME_BROWSER_ASH_BOREALIS_BOREALIS_CONTEXT_H_ #include <memory> #include <string> @@ -67,4 +67,4 @@ } // namespace borealis -#endif // CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_CONTEXT_H_ +#endif // CHROME_BROWSER_ASH_BOREALIS_BOREALIS_CONTEXT_H_
diff --git a/chrome/browser/chromeos/borealis/borealis_context_manager.h b/chrome/browser/ash/borealis/borealis_context_manager.h similarity index 81% rename from chrome/browser/chromeos/borealis/borealis_context_manager.h rename to chrome/browser/ash/borealis/borealis_context_manager.h index 4d30735..065454bc 100644 --- a/chrome/browser/chromeos/borealis/borealis_context_manager.h +++ b/chrome/browser/ash/borealis/borealis_context_manager.h
@@ -2,16 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_CONTEXT_MANAGER_H_ -#define CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_CONTEXT_MANAGER_H_ +#ifndef CHROME_BROWSER_ASH_BOREALIS_BOREALIS_CONTEXT_MANAGER_H_ +#define CHROME_BROWSER_ASH_BOREALIS_BOREALIS_CONTEXT_MANAGER_H_ #include <string> #include "base/callback.h" #include "base/callback_helpers.h" -#include "chrome/browser/chromeos/borealis/borealis_metrics.h" -#include "chrome/browser/chromeos/borealis/infra/described.h" -#include "chrome/browser/chromeos/borealis/infra/expected.h" +#include "chrome/browser/ash/borealis/borealis_metrics.h" +#include "chrome/browser/ash/borealis/infra/described.h" +#include "chrome/browser/ash/borealis/infra/expected.h" #include "components/keyed_service/core/keyed_service.h" namespace borealis { @@ -51,4 +51,4 @@ } // namespace borealis -#endif // CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_CONTEXT_MANAGER_H_ +#endif // CHROME_BROWSER_ASH_BOREALIS_BOREALIS_CONTEXT_MANAGER_H_
diff --git a/chrome/browser/chromeos/borealis/borealis_context_manager_impl.cc b/chrome/browser/ash/borealis/borealis_context_manager_impl.cc similarity index 95% rename from chrome/browser/chromeos/borealis/borealis_context_manager_impl.cc rename to chrome/browser/ash/borealis/borealis_context_manager_impl.cc index fab503e..e6eaa3e 100644 --- a/chrome/browser/chromeos/borealis/borealis_context_manager_impl.cc +++ b/chrome/browser/ash/borealis/borealis_context_manager_impl.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/borealis/borealis_context_manager_impl.h" +#include "chrome/browser/ash/borealis/borealis_context_manager_impl.h" #include <memory> #include <ostream> @@ -10,12 +10,12 @@ #include "base/bind.h" #include "base/logging.h" #include "base/memory/ptr_util.h" +#include "chrome/browser/ash/borealis/borealis_context.h" +#include "chrome/browser/ash/borealis/borealis_context_manager.h" +#include "chrome/browser/ash/borealis/borealis_metrics.h" +#include "chrome/browser/ash/borealis/borealis_task.h" +#include "chrome/browser/ash/borealis/infra/described.h" #include "chrome/browser/ash/profiles/profile_helper.h" -#include "chrome/browser/chromeos/borealis/borealis_context.h" -#include "chrome/browser/chromeos/borealis/borealis_context_manager.h" -#include "chrome/browser/chromeos/borealis/borealis_metrics.h" -#include "chrome/browser/chromeos/borealis/borealis_task.h" -#include "chrome/browser/chromeos/borealis/infra/described.h" #include "chromeos/dbus/dbus_thread_manager.h" namespace {
diff --git a/chrome/browser/chromeos/borealis/borealis_context_manager_impl.h b/chrome/browser/ash/borealis/borealis_context_manager_impl.h similarity index 87% rename from chrome/browser/chromeos/borealis/borealis_context_manager_impl.h rename to chrome/browser/ash/borealis/borealis_context_manager_impl.h index b2b7a7e..4f8cec5 100644 --- a/chrome/browser/chromeos/borealis/borealis_context_manager_impl.h +++ b/chrome/browser/ash/borealis/borealis_context_manager_impl.h
@@ -2,17 +2,17 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_CONTEXT_MANAGER_IMPL_H_ -#define CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_CONTEXT_MANAGER_IMPL_H_ +#ifndef CHROME_BROWSER_ASH_BOREALIS_BOREALIS_CONTEXT_MANAGER_IMPL_H_ +#define CHROME_BROWSER_ASH_BOREALIS_BOREALIS_CONTEXT_MANAGER_IMPL_H_ #include <memory> #include "base/containers/queue.h" #include "base/memory/weak_ptr.h" -#include "chrome/browser/chromeos/borealis/borealis_context.h" -#include "chrome/browser/chromeos/borealis/borealis_context_manager.h" -#include "chrome/browser/chromeos/borealis/infra/described.h" -#include "chrome/browser/chromeos/borealis/infra/transition.h" +#include "chrome/browser/ash/borealis/borealis_context.h" +#include "chrome/browser/ash/borealis/borealis_context_manager.h" +#include "chrome/browser/ash/borealis/infra/described.h" +#include "chrome/browser/ash/borealis/infra/transition.h" #include "chrome/browser/profiles/profile.h" #include "chromeos/dbus/concierge_client.h" @@ -100,4 +100,4 @@ } // namespace borealis -#endif // CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_CONTEXT_MANAGER_IMPL_H_ +#endif // CHROME_BROWSER_ASH_BOREALIS_BOREALIS_CONTEXT_MANAGER_IMPL_H_
diff --git a/chrome/browser/chromeos/borealis/borealis_context_manager_mock.cc b/chrome/browser/ash/borealis/borealis_context_manager_mock.cc similarity index 82% rename from chrome/browser/chromeos/borealis/borealis_context_manager_mock.cc rename to chrome/browser/ash/borealis/borealis_context_manager_mock.cc index ceef4c9..2edda0b9 100644 --- a/chrome/browser/chromeos/borealis/borealis_context_manager_mock.cc +++ b/chrome/browser/ash/borealis/borealis_context_manager_mock.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/borealis/borealis_context_manager_mock.h" +#include "chrome/browser/ash/borealis/borealis_context_manager_mock.h" namespace borealis {
diff --git a/chrome/browser/chromeos/borealis/borealis_context_manager_mock.h b/chrome/browser/ash/borealis/borealis_context_manager_mock.h similarity index 70% rename from chrome/browser/chromeos/borealis/borealis_context_manager_mock.h rename to chrome/browser/ash/borealis/borealis_context_manager_mock.h index ba8e7e6..dbc4483 100644 --- a/chrome/browser/chromeos/borealis/borealis_context_manager_mock.h +++ b/chrome/browser/ash/borealis/borealis_context_manager_mock.h
@@ -2,11 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_CONTEXT_MANAGER_MOCK_H_ -#define CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_CONTEXT_MANAGER_MOCK_H_ +#ifndef CHROME_BROWSER_ASH_BOREALIS_BOREALIS_CONTEXT_MANAGER_MOCK_H_ +#define CHROME_BROWSER_ASH_BOREALIS_BOREALIS_CONTEXT_MANAGER_MOCK_H_ -#include "chrome/browser/chromeos/borealis/borealis_context_manager.h" - +#include "chrome/browser/ash/borealis/borealis_context_manager.h" #include "testing/gmock/include/gmock/gmock.h" namespace borealis { @@ -32,4 +31,4 @@ } // namespace borealis -#endif // CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_CONTEXT_MANAGER_MOCK_H_ +#endif // CHROME_BROWSER_ASH_BOREALIS_BOREALIS_CONTEXT_MANAGER_MOCK_H_
diff --git a/chrome/browser/chromeos/borealis/borealis_context_manager_unittest.cc b/chrome/browser/ash/borealis/borealis_context_manager_unittest.cc similarity index 98% rename from chrome/browser/chromeos/borealis/borealis_context_manager_unittest.cc rename to chrome/browser/ash/borealis/borealis_context_manager_unittest.cc index 7f4b97bd..ca0d2de 100644 --- a/chrome/browser/chromeos/borealis/borealis_context_manager_unittest.cc +++ b/chrome/browser/ash/borealis/borealis_context_manager_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/borealis/borealis_context_manager_impl.h" +#include "chrome/browser/ash/borealis/borealis_context_manager_impl.h" #include <memory> @@ -11,11 +11,11 @@ #include "base/containers/queue.h" #include "base/test/bind.h" #include "base/test/metrics/histogram_tester.h" +#include "chrome/browser/ash/borealis/borealis_context_manager.h" +#include "chrome/browser/ash/borealis/borealis_metrics.h" +#include "chrome/browser/ash/borealis/borealis_task.h" #include "chrome/browser/ash/login/users/mock_user_manager.h" #include "chrome/browser/ash/profiles/profile_helper.h" -#include "chrome/browser/chromeos/borealis/borealis_context_manager.h" -#include "chrome/browser/chromeos/borealis/borealis_metrics.h" -#include "chrome/browser/chromeos/borealis/borealis_task.h" #include "chrome/browser/chromeos/guest_os/guest_os_stability_monitor.h" #include "chrome/test/base/testing_profile.h" #include "chromeos/dbus/concierge/concierge_service.pb.h"
diff --git a/chrome/browser/chromeos/borealis/borealis_context_unittest.cc b/chrome/browser/ash/borealis/borealis_context_unittest.cc similarity index 93% rename from chrome/browser/chromeos/borealis/borealis_context_unittest.cc rename to chrome/browser/ash/borealis/borealis_context_unittest.cc index dd879e837..670f9a58 100644 --- a/chrome/browser/chromeos/borealis/borealis_context_unittest.cc +++ b/chrome/browser/ash/borealis/borealis_context_unittest.cc
@@ -9,11 +9,11 @@ #include "base/barrier_closure.h" #include "base/run_loop.h" #include "base/test/metrics/histogram_tester.h" -#include "chrome/browser/chromeos/borealis/borealis_context.h" -#include "chrome/browser/chromeos/borealis/borealis_metrics.h" -#include "chrome/browser/chromeos/borealis/borealis_service_fake.h" -#include "chrome/browser/chromeos/borealis/borealis_shutdown_monitor.h" -#include "chrome/browser/chromeos/borealis/borealis_window_manager.h" +#include "chrome/browser/ash/borealis/borealis_context.h" +#include "chrome/browser/ash/borealis/borealis_metrics.h" +#include "chrome/browser/ash/borealis/borealis_service_fake.h" +#include "chrome/browser/ash/borealis/borealis_shutdown_monitor.h" +#include "chrome/browser/ash/borealis/borealis_window_manager.h" #include "chrome/test/base/testing_profile.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/dbus/fake_chunneld_client.h"
diff --git a/chrome/browser/chromeos/borealis/borealis_features.cc b/chrome/browser/ash/borealis/borealis_features.cc similarity index 84% rename from chrome/browser/chromeos/borealis/borealis_features.cc rename to chrome/browser/ash/borealis/borealis_features.cc index 6c7842c..2ad28ba 100644 --- a/chrome/browser/chromeos/borealis/borealis_features.cc +++ b/chrome/browser/ash/borealis/borealis_features.cc
@@ -2,9 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/borealis/borealis_features.h" +#include "chrome/browser/ash/borealis/borealis_features.h" -#include "chrome/browser/chromeos/borealis/borealis_prefs.h" +#include "chrome/browser/ash/borealis/borealis_prefs.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/chrome_features.h" #include "components/prefs/pref_service.h"
diff --git a/chrome/browser/chromeos/borealis/borealis_features.h b/chrome/browser/ash/borealis/borealis_features.h similarity index 77% rename from chrome/browser/chromeos/borealis/borealis_features.h rename to chrome/browser/ash/borealis/borealis_features.h index a3880d0a..fbbe5d12 100644 --- a/chrome/browser/chromeos/borealis/borealis_features.h +++ b/chrome/browser/ash/borealis/borealis_features.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_FEATURES_H_ -#define CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_FEATURES_H_ +#ifndef CHROME_BROWSER_ASH_BOREALIS_BOREALIS_FEATURES_H_ +#define CHROME_BROWSER_ASH_BOREALIS_BOREALIS_FEATURES_H_ class Profile; @@ -27,4 +27,4 @@ } // namespace borealis -#endif // CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_FEATURES_H_ +#endif // CHROME_BROWSER_ASH_BOREALIS_BOREALIS_FEATURES_H_
diff --git a/chrome/browser/chromeos/borealis/borealis_features_unittest.cc b/chrome/browser/ash/borealis/borealis_features_unittest.cc similarity index 92% rename from chrome/browser/chromeos/borealis/borealis_features_unittest.cc rename to chrome/browser/ash/borealis/borealis_features_unittest.cc index a471206b..9b6ca76 100644 --- a/chrome/browser/chromeos/borealis/borealis_features_unittest.cc +++ b/chrome/browser/ash/borealis/borealis_features_unittest.cc
@@ -2,10 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/borealis/borealis_features.h" +#include "chrome/browser/ash/borealis/borealis_features.h" #include "base/test/scoped_feature_list.h" -#include "chrome/browser/chromeos/borealis/borealis_prefs.h" +#include "chrome/browser/ash/borealis/borealis_prefs.h" #include "chrome/common/chrome_features.h" #include "chrome/test/base/testing_profile.h" #include "components/prefs/pref_service.h"
diff --git a/chrome/browser/chromeos/borealis/borealis_installer.cc b/chrome/browser/ash/borealis/borealis_installer.cc similarity index 89% rename from chrome/browser/chromeos/borealis/borealis_installer.cc rename to chrome/browser/ash/borealis/borealis_installer.cc index b1470f6..3b2ef73 100644 --- a/chrome/browser/chromeos/borealis/borealis_installer.cc +++ b/chrome/browser/ash/borealis/borealis_installer.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/borealis/borealis_installer.h" +#include "chrome/browser/ash/borealis/borealis_installer.h" namespace borealis {
diff --git a/chrome/browser/chromeos/borealis/borealis_installer.h b/chrome/browser/ash/borealis/borealis_installer.h similarity index 86% rename from chrome/browser/chromeos/borealis/borealis_installer.h rename to chrome/browser/ash/borealis/borealis_installer.h index 31728b58..c7a0e9ad 100644 --- a/chrome/browser/chromeos/borealis/borealis_installer.h +++ b/chrome/browser/ash/borealis/borealis_installer.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_INSTALLER_H_ -#define CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_INSTALLER_H_ +#ifndef CHROME_BROWSER_ASH_BOREALIS_BOREALIS_INSTALLER_H_ +#define CHROME_BROWSER_ASH_BOREALIS_BOREALIS_INSTALLER_H_ #include <memory> #include <string> @@ -12,7 +12,7 @@ #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "base/observer_list.h" -#include "chrome/browser/chromeos/borealis/borealis_metrics.h" +#include "chrome/browser/ash/borealis/borealis_metrics.h" #include "components/keyed_service/core/keyed_service.h" namespace borealis { @@ -57,4 +57,4 @@ } // namespace borealis -#endif // CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_INSTALLER_H_ +#endif // CHROME_BROWSER_ASH_BOREALIS_BOREALIS_INSTALLER_H_
diff --git a/chrome/browser/chromeos/borealis/borealis_installer_impl.cc b/chrome/browser/ash/borealis/borealis_installer_impl.cc similarity index 95% rename from chrome/browser/chromeos/borealis/borealis_installer_impl.cc rename to chrome/browser/ash/borealis/borealis_installer_impl.cc index ce42272..5f2e5b36 100644 --- a/chrome/browser/chromeos/borealis/borealis_installer_impl.cc +++ b/chrome/browser/ash/borealis/borealis_installer_impl.cc
@@ -2,20 +2,20 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/borealis/borealis_installer_impl.h" +#include "chrome/browser/ash/borealis/borealis_installer_impl.h" #include <memory> #include "base/bind.h" #include "base/memory/weak_ptr.h" +#include "chrome/browser/ash/borealis/borealis_context_manager.h" +#include "chrome/browser/ash/borealis/borealis_features.h" +#include "chrome/browser/ash/borealis/borealis_metrics.h" +#include "chrome/browser/ash/borealis/borealis_prefs.h" +#include "chrome/browser/ash/borealis/borealis_service.h" +#include "chrome/browser/ash/borealis/borealis_util.h" +#include "chrome/browser/ash/borealis/infra/transition.h" #include "chrome/browser/ash/profiles/profile_helper.h" -#include "chrome/browser/chromeos/borealis/borealis_context_manager.h" -#include "chrome/browser/chromeos/borealis/borealis_features.h" -#include "chrome/browser/chromeos/borealis/borealis_metrics.h" -#include "chrome/browser/chromeos/borealis/borealis_prefs.h" -#include "chrome/browser/chromeos/borealis/borealis_service.h" -#include "chrome/browser/chromeos/borealis/borealis_util.h" -#include "chrome/browser/chromeos/borealis/infra/transition.h" #include "chrome/browser/chromeos/guest_os/guest_os_registry_service.h" #include "chrome/browser/chromeos/guest_os/guest_os_registry_service_factory.h" #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/chromeos/borealis/borealis_installer_impl.h b/chrome/browser/ash/borealis/borealis_installer_impl.h similarity index 86% rename from chrome/browser/chromeos/borealis/borealis_installer_impl.h rename to chrome/browser/ash/borealis/borealis_installer_impl.h index 7e45387..015a4dc 100644 --- a/chrome/browser/chromeos/borealis/borealis_installer_impl.h +++ b/chrome/browser/ash/borealis/borealis_installer_impl.h
@@ -2,15 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_INSTALLER_IMPL_H_ -#define CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_INSTALLER_IMPL_H_ - -#include "chrome/browser/chromeos/borealis/borealis_installer.h" +#ifndef CHROME_BROWSER_ASH_BOREALIS_BOREALIS_INSTALLER_IMPL_H_ +#define CHROME_BROWSER_ASH_BOREALIS_BOREALIS_INSTALLER_IMPL_H_ #include <memory> -#include "chrome/browser/chromeos/borealis/borealis_metrics.h" -#include "chrome/browser/chromeos/borealis/infra/expected.h" +#include "chrome/browser/ash/borealis/borealis_installer.h" +#include "chrome/browser/ash/borealis/borealis_metrics.h" +#include "chrome/browser/ash/borealis/infra/expected.h" #include "chromeos/dbus/dlcservice/dlcservice_client.h" class Profile; @@ -88,4 +87,4 @@ } // namespace borealis -#endif // CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_INSTALLER_IMPL_H_ +#endif // CHROME_BROWSER_ASH_BOREALIS_BOREALIS_INSTALLER_IMPL_H_
diff --git a/chrome/browser/chromeos/borealis/borealis_installer_unittest.cc b/chrome/browser/ash/borealis/borealis_installer_unittest.cc similarity index 96% rename from chrome/browser/chromeos/borealis/borealis_installer_unittest.cc rename to chrome/browser/ash/borealis/borealis_installer_unittest.cc index 0d83f29..80dc0536 100644 --- a/chrome/browser/chromeos/borealis/borealis_installer_unittest.cc +++ b/chrome/browser/ash/borealis/borealis_installer_unittest.cc
@@ -2,20 +2,20 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/borealis/borealis_installer_impl.h" +#include "chrome/browser/ash/borealis/borealis_installer_impl.h" #include <memory> #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" -#include "chrome/browser/chromeos/borealis/borealis_context_manager.h" -#include "chrome/browser/chromeos/borealis/borealis_context_manager_mock.h" -#include "chrome/browser/chromeos/borealis/borealis_features.h" -#include "chrome/browser/chromeos/borealis/borealis_metrics.h" -#include "chrome/browser/chromeos/borealis/borealis_prefs.h" -#include "chrome/browser/chromeos/borealis/borealis_service.h" -#include "chrome/browser/chromeos/borealis/borealis_service_fake.h" -#include "chrome/browser/chromeos/borealis/borealis_util.h" +#include "chrome/browser/ash/borealis/borealis_context_manager.h" +#include "chrome/browser/ash/borealis/borealis_context_manager_mock.h" +#include "chrome/browser/ash/borealis/borealis_features.h" +#include "chrome/browser/ash/borealis/borealis_metrics.h" +#include "chrome/browser/ash/borealis/borealis_prefs.h" +#include "chrome/browser/ash/borealis/borealis_service.h" +#include "chrome/browser/ash/borealis/borealis_service_fake.h" +#include "chrome/browser/ash/borealis/borealis_util.h" #include "chrome/browser/chromeos/guest_os/guest_os_registry_service.h" #include "chrome/browser/chromeos/guest_os/guest_os_registry_service_factory.h" #include "chrome/common/chrome_features.h"
diff --git a/chrome/browser/chromeos/borealis/borealis_launch_watcher.cc b/chrome/browser/ash/borealis/borealis_launch_watcher.cc similarity index 96% rename from chrome/browser/chromeos/borealis/borealis_launch_watcher.cc rename to chrome/browser/ash/borealis/borealis_launch_watcher.cc index 17002dde..64ef5599 100644 --- a/chrome/browser/chromeos/borealis/borealis_launch_watcher.cc +++ b/chrome/browser/ash/borealis/borealis_launch_watcher.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/borealis/borealis_launch_watcher.h" +#include "chrome/browser/ash/borealis/borealis_launch_watcher.h" #include "base/threading/thread_task_runner_handle.h" #include "chrome/browser/ash/profiles/profile_helper.h"
diff --git a/chrome/browser/chromeos/borealis/borealis_launch_watcher.h b/chrome/browser/ash/borealis/borealis_launch_watcher.h similarity index 89% rename from chrome/browser/chromeos/borealis/borealis_launch_watcher.h rename to chrome/browser/ash/borealis/borealis_launch_watcher.h index a7e52f8..acf5f356 100644 --- a/chrome/browser/chromeos/borealis/borealis_launch_watcher.h +++ b/chrome/browser/ash/borealis/borealis_launch_watcher.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_LAUNCH_WATCHER_H_ -#define CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_LAUNCH_WATCHER_H_ +#ifndef CHROME_BROWSER_ASH_BOREALIS_BOREALIS_LAUNCH_WATCHER_H_ +#define CHROME_BROWSER_ASH_BOREALIS_BOREALIS_LAUNCH_WATCHER_H_ #include "base/callback.h" #include "base/containers/queue.h" @@ -55,4 +55,4 @@ } // namespace borealis -#endif // CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_LAUNCH_WATCHER_H_ +#endif // CHROME_BROWSER_ASH_BOREALIS_BOREALIS_LAUNCH_WATCHER_H_
diff --git a/chrome/browser/chromeos/borealis/borealis_launch_watcher_unittest.cc b/chrome/browser/ash/borealis/borealis_launch_watcher_unittest.cc similarity index 98% rename from chrome/browser/chromeos/borealis/borealis_launch_watcher_unittest.cc rename to chrome/browser/ash/borealis/borealis_launch_watcher_unittest.cc index 8333dedb..f45a65d 100644 --- a/chrome/browser/chromeos/borealis/borealis_launch_watcher_unittest.cc +++ b/chrome/browser/ash/borealis/borealis_launch_watcher_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/borealis/borealis_launch_watcher.h" +#include "chrome/browser/ash/borealis/borealis_launch_watcher.h" #include <memory>
diff --git a/chrome/browser/chromeos/borealis/borealis_metrics.cc b/chrome/browser/ash/borealis/borealis_metrics.cc similarity index 97% rename from chrome/browser/chromeos/borealis/borealis_metrics.cc rename to chrome/browser/ash/borealis/borealis_metrics.cc index 122854d..36ade9ff 100644 --- a/chrome/browser/chromeos/borealis/borealis_metrics.cc +++ b/chrome/browser/ash/borealis/borealis_metrics.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/borealis/borealis_metrics.h" +#include "chrome/browser/ash/borealis/borealis_metrics.h" #include "base/metrics/histogram_functions.h"
diff --git a/chrome/browser/chromeos/borealis/borealis_metrics.h b/chrome/browser/ash/borealis/borealis_metrics.h similarity index 93% rename from chrome/browser/chromeos/borealis/borealis_metrics.h rename to chrome/browser/ash/borealis/borealis_metrics.h index 6fa6a2d..e03515f7 100644 --- a/chrome/browser/chromeos/borealis/borealis_metrics.h +++ b/chrome/browser/ash/borealis/borealis_metrics.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_METRICS_H_ -#define CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_METRICS_H_ +#ifndef CHROME_BROWSER_ASH_BOREALIS_BOREALIS_METRICS_H_ +#define CHROME_BROWSER_ASH_BOREALIS_BOREALIS_METRICS_H_ #include "base/time/time.h" @@ -88,4 +88,4 @@ std::ostream& operator<<(std::ostream& stream, borealis::BorealisStartupResult result); -#endif // CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_METRICS_H_ +#endif // CHROME_BROWSER_ASH_BOREALIS_BOREALIS_METRICS_H_
diff --git a/chrome/browser/chromeos/borealis/borealis_prefs.cc b/chrome/browser/ash/borealis/borealis_prefs.cc similarity index 91% rename from chrome/browser/chromeos/borealis/borealis_prefs.cc rename to chrome/browser/ash/borealis/borealis_prefs.cc index 53f178f..40a81327 100644 --- a/chrome/browser/chromeos/borealis/borealis_prefs.cc +++ b/chrome/browser/ash/borealis/borealis_prefs.cc
@@ -2,7 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/borealis/borealis_prefs.h" +#include "chrome/browser/ash/borealis/borealis_prefs.h" + #include "components/prefs/pref_registry_simple.h" namespace borealis {
diff --git a/chrome/browser/chromeos/borealis/borealis_prefs.h b/chrome/browser/ash/borealis/borealis_prefs.h similarity index 78% rename from chrome/browser/chromeos/borealis/borealis_prefs.h rename to chrome/browser/ash/borealis/borealis_prefs.h index 7b5d982..8940621 100644 --- a/chrome/browser/chromeos/borealis/borealis_prefs.h +++ b/chrome/browser/ash/borealis/borealis_prefs.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_PREFS_H_ -#define CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_PREFS_H_ +#ifndef CHROME_BROWSER_ASH_BOREALIS_BOREALIS_PREFS_H_ +#define CHROME_BROWSER_ASH_BOREALIS_BOREALIS_PREFS_H_ class PrefRegistrySimple; @@ -23,4 +23,4 @@ } // namespace prefs } // namespace borealis -#endif // CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_PREFS_H_ +#endif // CHROME_BROWSER_ASH_BOREALIS_BOREALIS_PREFS_H_
diff --git a/chrome/browser/chromeos/borealis/borealis_service.cc b/chrome/browser/ash/borealis/borealis_service.cc similarity index 71% rename from chrome/browser/chromeos/borealis/borealis_service.cc rename to chrome/browser/ash/borealis/borealis_service.cc index cc33332..04f73eae 100644 --- a/chrome/browser/chromeos/borealis/borealis_service.cc +++ b/chrome/browser/ash/borealis/borealis_service.cc
@@ -2,9 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/borealis/borealis_service.h" +#include "chrome/browser/ash/borealis/borealis_service.h" -#include "chrome/browser/chromeos/borealis/borealis_service_factory.h" +#include "chrome/browser/ash/borealis/borealis_service_factory.h" namespace borealis {
diff --git a/chrome/browser/chromeos/borealis/borealis_service.h b/chrome/browser/ash/borealis/borealis_service.h similarity index 85% rename from chrome/browser/chromeos/borealis/borealis_service.h rename to chrome/browser/ash/borealis/borealis_service.h index 33ffc0c..07697c8 100644 --- a/chrome/browser/chromeos/borealis/borealis_service.h +++ b/chrome/browser/ash/borealis/borealis_service.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_SERVICE_H_ -#define CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_SERVICE_H_ +#ifndef CHROME_BROWSER_ASH_BOREALIS_BOREALIS_SERVICE_H_ +#define CHROME_BROWSER_ASH_BOREALIS_BOREALIS_SERVICE_H_ #include "components/keyed_service/core/keyed_service.h" @@ -38,4 +38,4 @@ } // namespace borealis -#endif // CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_SERVICE_H_ +#endif // CHROME_BROWSER_ASH_BOREALIS_BOREALIS_SERVICE_H_
diff --git a/chrome/browser/chromeos/borealis/borealis_service_factory.cc b/chrome/browser/ash/borealis/borealis_service_factory.cc similarity index 89% rename from chrome/browser/chromeos/borealis/borealis_service_factory.cc rename to chrome/browser/ash/borealis/borealis_service_factory.cc index cee2f25..1016cfd 100644 --- a/chrome/browser/chromeos/borealis/borealis_service_factory.cc +++ b/chrome/browser/ash/borealis/borealis_service_factory.cc
@@ -2,9 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/borealis/borealis_service_factory.h" +#include "chrome/browser/ash/borealis/borealis_service_factory.h" -#include "chrome/browser/chromeos/borealis/borealis_service_impl.h" +#include "chrome/browser/ash/borealis/borealis_service_impl.h" #include "chrome/browser/profiles/profile.h" #include "components/keyed_service/content/browser_context_dependency_manager.h"
diff --git a/chrome/browser/chromeos/borealis/borealis_service_factory.h b/chrome/browser/ash/borealis/borealis_service_factory.h similarity index 83% rename from chrome/browser/chromeos/borealis/borealis_service_factory.h rename to chrome/browser/ash/borealis/borealis_service_factory.h index 0a29bab5..1733eaaf 100644 --- a/chrome/browser/chromeos/borealis/borealis_service_factory.h +++ b/chrome/browser/ash/borealis/borealis_service_factory.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_SERVICE_FACTORY_H_ -#define CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_SERVICE_FACTORY_H_ +#ifndef CHROME_BROWSER_ASH_BOREALIS_BOREALIS_SERVICE_FACTORY_H_ +#define CHROME_BROWSER_ASH_BOREALIS_BOREALIS_SERVICE_FACTORY_H_ #include "base/no_destructor.h" #include "components/keyed_service/content/browser_context_keyed_service_factory.h" @@ -38,4 +38,4 @@ } // namespace borealis -#endif // CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_SERVICE_FACTORY_H_ +#endif // CHROME_BROWSER_ASH_BOREALIS_BOREALIS_SERVICE_FACTORY_H_
diff --git a/chrome/browser/chromeos/borealis/borealis_service_fake.cc b/chrome/browser/ash/borealis/borealis_service_fake.cc similarity index 92% rename from chrome/browser/chromeos/borealis/borealis_service_fake.cc rename to chrome/browser/ash/borealis/borealis_service_fake.cc index e7f31b68..5172d0c 100644 --- a/chrome/browser/chromeos/borealis/borealis_service_fake.cc +++ b/chrome/browser/ash/borealis/borealis_service_fake.cc
@@ -2,10 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/borealis/borealis_service_fake.h" +#include "chrome/browser/ash/borealis/borealis_service_fake.h" -#include "chrome/browser/chromeos/borealis/borealis_service.h" -#include "chrome/browser/chromeos/borealis/borealis_service_factory.h" +#include "chrome/browser/ash/borealis/borealis_service.h" +#include "chrome/browser/ash/borealis/borealis_service_factory.h" namespace borealis {
diff --git a/chrome/browser/chromeos/borealis/borealis_service_fake.h b/chrome/browser/ash/borealis/borealis_service_fake.h similarity index 87% rename from chrome/browser/chromeos/borealis/borealis_service_fake.h rename to chrome/browser/ash/borealis/borealis_service_fake.h index 74965693..6327dbda 100644 --- a/chrome/browser/chromeos/borealis/borealis_service_fake.h +++ b/chrome/browser/ash/borealis/borealis_service_fake.h
@@ -2,10 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_SERVICE_FAKE_H_ -#define CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_SERVICE_FAKE_H_ +#ifndef CHROME_BROWSER_ASH_BOREALIS_BOREALIS_SERVICE_FAKE_H_ +#define CHROME_BROWSER_ASH_BOREALIS_BOREALIS_SERVICE_FAKE_H_ -#include "chrome/browser/chromeos/borealis/borealis_service.h" +#include "chrome/browser/ash/borealis/borealis_service.h" namespace content { class BrowserContext; @@ -50,4 +50,4 @@ } // namespace borealis -#endif // CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_SERVICE_FAKE_H_ +#endif // CHROME_BROWSER_ASH_BOREALIS_BOREALIS_SERVICE_FAKE_H_
diff --git a/chrome/browser/chromeos/borealis/borealis_service_impl.cc b/chrome/browser/ash/borealis/borealis_service_impl.cc similarity index 94% rename from chrome/browser/chromeos/borealis/borealis_service_impl.cc rename to chrome/browser/ash/borealis/borealis_service_impl.cc index f18024df..15c4b1b 100644 --- a/chrome/browser/chromeos/borealis/borealis_service_impl.cc +++ b/chrome/browser/ash/borealis/borealis_service_impl.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/borealis/borealis_service_impl.h" +#include "chrome/browser/ash/borealis/borealis_service_impl.h" namespace borealis {
diff --git a/chrome/browser/ash/borealis/borealis_service_impl.h b/chrome/browser/ash/borealis/borealis_service_impl.h new file mode 100644 index 0000000..893ad1e --- /dev/null +++ b/chrome/browser/ash/borealis/borealis_service_impl.h
@@ -0,0 +1,48 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_ASH_BOREALIS_BOREALIS_SERVICE_IMPL_H_ +#define CHROME_BROWSER_ASH_BOREALIS_BOREALIS_SERVICE_IMPL_H_ + +#include "chrome/browser/ash/borealis/borealis_app_launcher.h" +#include "chrome/browser/ash/borealis/borealis_app_uninstaller.h" +#include "chrome/browser/ash/borealis/borealis_context_manager_impl.h" +#include "chrome/browser/ash/borealis/borealis_features.h" +#include "chrome/browser/ash/borealis/borealis_installer_impl.h" +#include "chrome/browser/ash/borealis/borealis_service.h" +#include "chrome/browser/ash/borealis/borealis_shutdown_monitor.h" +#include "chrome/browser/ash/borealis/borealis_window_manager.h" + +namespace borealis { + +class BorealisServiceImpl : public BorealisService { + public: + explicit BorealisServiceImpl(Profile* profile); + + ~BorealisServiceImpl() override; + + private: + // BorealisService overrides. + BorealisAppLauncher& AppLauncher() override; + BorealisAppUninstaller& AppUninstaller() override; + BorealisContextManager& ContextManager() override; + BorealisFeatures& Features() override; + BorealisInstaller& Installer() override; + BorealisShutdownMonitor& ShutdownMonitor() override; + BorealisWindowManager& WindowManager() override; + + Profile* const profile_; + + BorealisAppLauncher app_launcher_; + BorealisAppUninstaller app_uninstaller_; + BorealisContextManagerImpl context_manager_; + BorealisFeatures features_; + BorealisInstallerImpl installer_; + BorealisShutdownMonitor shutdown_monitor_; + BorealisWindowManager window_manager_; +}; + +} // namespace borealis + +#endif // CHROME_BROWSER_ASH_BOREALIS_BOREALIS_SERVICE_IMPL_H_
diff --git a/chrome/browser/chromeos/borealis/borealis_shutdown_monitor.cc b/chrome/browser/ash/borealis/borealis_shutdown_monitor.cc similarity index 87% rename from chrome/browser/chromeos/borealis/borealis_shutdown_monitor.cc rename to chrome/browser/ash/borealis/borealis_shutdown_monitor.cc index c2d4c8f0..b13b850 100644 --- a/chrome/browser/chromeos/borealis/borealis_shutdown_monitor.cc +++ b/chrome/browser/ash/borealis/borealis_shutdown_monitor.cc
@@ -2,11 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/borealis/borealis_shutdown_monitor.h" +#include "chrome/browser/ash/borealis/borealis_shutdown_monitor.h" #include "base/threading/thread_task_runner_handle.h" -#include "chrome/browser/chromeos/borealis/borealis_context_manager.h" -#include "chrome/browser/chromeos/borealis/borealis_service.h" +#include "chrome/browser/ash/borealis/borealis_context_manager.h" +#include "chrome/browser/ash/borealis/borealis_service.h" namespace {
diff --git a/chrome/browser/chromeos/borealis/borealis_shutdown_monitor.h b/chrome/browser/ash/borealis/borealis_shutdown_monitor.h similarity index 86% rename from chrome/browser/chromeos/borealis/borealis_shutdown_monitor.h rename to chrome/browser/ash/borealis/borealis_shutdown_monitor.h index 0b571df..f81f496 100644 --- a/chrome/browser/chromeos/borealis/borealis_shutdown_monitor.h +++ b/chrome/browser/ash/borealis/borealis_shutdown_monitor.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_SHUTDOWN_MONITOR_H_ -#define CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_SHUTDOWN_MONITOR_H_ +#ifndef CHROME_BROWSER_ASH_BOREALIS_BOREALIS_SHUTDOWN_MONITOR_H_ +#define CHROME_BROWSER_ASH_BOREALIS_BOREALIS_SHUTDOWN_MONITOR_H_ #include "base/cancelable_callback.h" #include "base/time/time.h" @@ -48,4 +48,4 @@ } // namespace borealis -#endif // CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_SHUTDOWN_MONITOR_H_ +#endif // CHROME_BROWSER_ASH_BOREALIS_BOREALIS_SHUTDOWN_MONITOR_H_
diff --git a/chrome/browser/chromeos/borealis/borealis_shutdown_monitor_unittest.cc b/chrome/browser/ash/borealis/borealis_shutdown_monitor_unittest.cc similarity index 90% rename from chrome/browser/chromeos/borealis/borealis_shutdown_monitor_unittest.cc rename to chrome/browser/ash/borealis/borealis_shutdown_monitor_unittest.cc index 1a30a02..ea38c82 100644 --- a/chrome/browser/chromeos/borealis/borealis_shutdown_monitor_unittest.cc +++ b/chrome/browser/ash/borealis/borealis_shutdown_monitor_unittest.cc
@@ -2,13 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/borealis/borealis_shutdown_monitor.h" +#include "chrome/browser/ash/borealis/borealis_shutdown_monitor.h" #include <memory> -#include "chrome/browser/chromeos/borealis/borealis_context_manager_mock.h" -#include "chrome/browser/chromeos/borealis/borealis_features.h" -#include "chrome/browser/chromeos/borealis/borealis_service_fake.h" +#include "chrome/browser/ash/borealis/borealis_context_manager_mock.h" +#include "chrome/browser/ash/borealis/borealis_features.h" +#include "chrome/browser/ash/borealis/borealis_service_fake.h" #include "chrome/test/base/testing_profile.h" #include "content/public/test/browser_task_environment.h" #include "testing/gmock/include/gmock/gmock.h"
diff --git a/chrome/browser/chromeos/borealis/borealis_task.cc b/chrome/browser/ash/borealis/borealis_task.cc similarity index 97% rename from chrome/browser/chromeos/borealis/borealis_task.cc rename to chrome/browser/ash/borealis/borealis_task.cc index c544f48..4e6d693 100644 --- a/chrome/browser/chromeos/borealis/borealis_task.cc +++ b/chrome/browser/ash/borealis/borealis_task.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/borealis/borealis_task.h" +#include "chrome/browser/ash/borealis/borealis_task.h" #include <string> @@ -11,9 +11,9 @@ #include "base/logging.h" #include "base/strings/string_number_conversions.h" #include "base/threading/sequenced_task_runner_handle.h" +#include "chrome/browser/ash/borealis/borealis_context.h" +#include "chrome/browser/ash/borealis/borealis_util.h" #include "chrome/browser/ash/profiles/profile_helper.h" -#include "chrome/browser/chromeos/borealis/borealis_context.h" -#include "chrome/browser/chromeos/borealis/borealis_util.h" #include "chrome/browser/profiles/profile.h" #include "chromeos/dbus/concierge/concierge_service.pb.h" #include "chromeos/dbus/dbus_thread_manager.h"
diff --git a/chrome/browser/chromeos/borealis/borealis_task.h b/chrome/browser/ash/borealis/borealis_task.h similarity index 88% rename from chrome/browser/chromeos/borealis/borealis_task.h rename to chrome/browser/ash/borealis/borealis_task.h index 9a6c766..780bbc2f3 100644 --- a/chrome/browser/chromeos/borealis/borealis_task.h +++ b/chrome/browser/ash/borealis/borealis_task.h
@@ -2,13 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_TASK_H_ -#define CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_TASK_H_ +#ifndef CHROME_BROWSER_ASH_BOREALIS_BOREALIS_TASK_H_ +#define CHROME_BROWSER_ASH_BOREALIS_BOREALIS_TASK_H_ #include "base/memory/weak_ptr.h" -#include "chrome/browser/chromeos/borealis/borealis_context_manager.h" -#include "chrome/browser/chromeos/borealis/borealis_launch_watcher.h" -#include "chrome/browser/chromeos/borealis/borealis_metrics.h" +#include "chrome/browser/ash/borealis/borealis_context_manager.h" +#include "chrome/browser/ash/borealis/borealis_launch_watcher.h" +#include "chrome/browser/ash/borealis/borealis_metrics.h" #include "chromeos/dbus/concierge_client.h" #include "chromeos/dbus/dlcservice/dlcservice_client.h" @@ -100,4 +100,4 @@ } // namespace borealis -#endif // CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_TASK_H_ +#endif // CHROME_BROWSER_ASH_BOREALIS_BOREALIS_TASK_H_
diff --git a/chrome/browser/chromeos/borealis/borealis_task_unittest.cc b/chrome/browser/ash/borealis/borealis_task_unittest.cc similarity index 97% rename from chrome/browser/chromeos/borealis/borealis_task_unittest.cc rename to chrome/browser/ash/borealis/borealis_task_unittest.cc index ff71164..9b68af1b 100644 --- a/chrome/browser/chromeos/borealis/borealis_task_unittest.cc +++ b/chrome/browser/ash/borealis/borealis_task_unittest.cc
@@ -2,14 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/borealis/borealis_task.h" +#include "chrome/browser/ash/borealis/borealis_task.h" #include <memory> +#include "chrome/browser/ash/borealis/borealis_context.h" +#include "chrome/browser/ash/borealis/borealis_context_manager.h" +#include "chrome/browser/ash/borealis/borealis_metrics.h" #include "chrome/browser/ash/profiles/profile_helper.h" -#include "chrome/browser/chromeos/borealis/borealis_context.h" -#include "chrome/browser/chromeos/borealis/borealis_context_manager.h" -#include "chrome/browser/chromeos/borealis/borealis_metrics.h" #include "chrome/test/base/testing_profile.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/dbus/dlcservice/fake_dlcservice_client.h"
diff --git a/chrome/browser/chromeos/borealis/borealis_util.cc b/chrome/browser/ash/borealis/borealis_util.cc similarity index 91% rename from chrome/browser/chromeos/borealis/borealis_util.cc rename to chrome/browser/ash/borealis/borealis_util.cc index 0504737..020aa8c8 100644 --- a/chrome/browser/chromeos/borealis/borealis_util.cc +++ b/chrome/browser/ash/borealis/borealis_util.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/borealis/borealis_util.h" +#include "chrome/browser/ash/borealis/borealis_util.h" #include "third_party/re2/src/re2/re2.h"
diff --git a/chrome/browser/chromeos/borealis/borealis_util.h b/chrome/browser/ash/borealis/borealis_util.h similarity index 87% rename from chrome/browser/chromeos/borealis/borealis_util.h rename to chrome/browser/ash/borealis/borealis_util.h index a9faec1..385f3df 100644 --- a/chrome/browser/chromeos/borealis/borealis_util.h +++ b/chrome/browser/ash/borealis/borealis_util.h
@@ -2,11 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_UTIL_H_ -#define CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_UTIL_H_ +#ifndef CHROME_BROWSER_ASH_BOREALIS_BOREALIS_UTIL_H_ +#define CHROME_BROWSER_ASH_BOREALIS_BOREALIS_UTIL_H_ #include <string> + #include "ui/views/widget/widget.h" + class Profile; namespace borealis { @@ -35,4 +37,4 @@ } // namespace borealis -#endif // CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_UTIL_H_ +#endif // CHROME_BROWSER_ASH_BOREALIS_BOREALIS_UTIL_H_
diff --git a/chrome/browser/chromeos/borealis/borealis_window_manager.cc b/chrome/browser/ash/borealis/borealis_window_manager.cc similarity index 97% rename from chrome/browser/chromeos/borealis/borealis_window_manager.cc rename to chrome/browser/ash/borealis/borealis_window_manager.cc index f44ceab..cd320419 100644 --- a/chrome/browser/chromeos/borealis/borealis_window_manager.cc +++ b/chrome/browser/ash/borealis/borealis_window_manager.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/borealis/borealis_window_manager.h" +#include "chrome/browser/ash/borealis/borealis_window_manager.h" #include <string> @@ -12,7 +12,7 @@ #include "base/strings/string_util.h" #include "chrome/browser/apps/app_service/app_service_proxy.h" #include "chrome/browser/apps/app_service/app_service_proxy_factory.h" -#include "chrome/browser/chromeos/borealis/borealis_util.h" +#include "chrome/browser/ash/borealis/borealis_util.h" #include "chrome/browser/chromeos/crostini/crostini_shelf_utils.h" #include "components/exo/shell_surface_util.h"
diff --git a/chrome/browser/chromeos/borealis/borealis_window_manager.h b/chrome/browser/ash/borealis/borealis_window_manager.h similarity index 95% rename from chrome/browser/chromeos/borealis/borealis_window_manager.h rename to chrome/browser/ash/borealis/borealis_window_manager.h index 94895471..3d0732c 100644 --- a/chrome/browser/chromeos/borealis/borealis_window_manager.h +++ b/chrome/browser/ash/borealis/borealis_window_manager.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_WINDOW_MANAGER_H_ -#define CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_WINDOW_MANAGER_H_ +#ifndef CHROME_BROWSER_ASH_BOREALIS_BOREALIS_WINDOW_MANAGER_H_ +#define CHROME_BROWSER_ASH_BOREALIS_BOREALIS_WINDOW_MANAGER_H_ #include <string> @@ -131,4 +131,4 @@ } // namespace borealis -#endif // CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_WINDOW_MANAGER_H_ +#endif // CHROME_BROWSER_ASH_BOREALIS_BOREALIS_WINDOW_MANAGER_H_
diff --git a/chrome/browser/chromeos/borealis/borealis_window_manager_mock.cc b/chrome/browser/ash/borealis/borealis_window_manager_mock.cc similarity index 84% rename from chrome/browser/chromeos/borealis/borealis_window_manager_mock.cc rename to chrome/browser/ash/borealis/borealis_window_manager_mock.cc index 81a1d37..c807852 100644 --- a/chrome/browser/chromeos/borealis/borealis_window_manager_mock.cc +++ b/chrome/browser/ash/borealis/borealis_window_manager_mock.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/borealis/borealis_window_manager_mock.h" +#include "chrome/browser/ash/borealis/borealis_window_manager_mock.h" namespace borealis {
diff --git a/chrome/browser/chromeos/borealis/borealis_window_manager_mock.h b/chrome/browser/ash/borealis/borealis_window_manager_mock.h similarity index 83% rename from chrome/browser/chromeos/borealis/borealis_window_manager_mock.h rename to chrome/browser/ash/borealis/borealis_window_manager_mock.h index e4abf9b0..3e6513cf4 100644 --- a/chrome/browser/chromeos/borealis/borealis_window_manager_mock.h +++ b/chrome/browser/ash/borealis/borealis_window_manager_mock.h
@@ -2,11 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_WINDOW_MANAGER_MOCK_H_ -#define CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_WINDOW_MANAGER_MOCK_H_ +#ifndef CHROME_BROWSER_ASH_BOREALIS_BOREALIS_WINDOW_MANAGER_MOCK_H_ +#define CHROME_BROWSER_ASH_BOREALIS_BOREALIS_WINDOW_MANAGER_MOCK_H_ -#include "chrome/browser/chromeos/borealis/borealis_window_manager.h" - +#include "chrome/browser/ash/borealis/borealis_window_manager.h" #include "testing/gmock/include/gmock/gmock.h" namespace borealis { @@ -58,4 +57,4 @@ } // namespace borealis -#endif // CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_WINDOW_MANAGER_MOCK_H_ +#endif // CHROME_BROWSER_ASH_BOREALIS_BOREALIS_WINDOW_MANAGER_MOCK_H_
diff --git a/chrome/browser/chromeos/borealis/borealis_window_manager_test_helper.cc b/chrome/browser/ash/borealis/borealis_window_manager_test_helper.cc similarity index 90% rename from chrome/browser/chromeos/borealis/borealis_window_manager_test_helper.cc rename to chrome/browser/ash/borealis/borealis_window_manager_test_helper.cc index 35cf384..a48a5c7 100644 --- a/chrome/browser/chromeos/borealis/borealis_window_manager_test_helper.cc +++ b/chrome/browser/ash/borealis/borealis_window_manager_test_helper.cc
@@ -2,8 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/borealis/borealis_window_manager_test_helper.h" -#include "chrome/browser/chromeos/borealis/borealis_window_manager.h" +#include "chrome/browser/ash/borealis/borealis_window_manager_test_helper.h" + +#include "chrome/browser/ash/borealis/borealis_window_manager.h" #include "components/exo/shell_surface_util.h" namespace borealis {
diff --git a/chrome/browser/chromeos/borealis/borealis_window_manager_test_helper.h b/chrome/browser/ash/borealis/borealis_window_manager_test_helper.h similarity index 72% rename from chrome/browser/chromeos/borealis/borealis_window_manager_test_helper.h rename to chrome/browser/ash/borealis/borealis_window_manager_test_helper.h index 538bb9f2..2678b4e 100644 --- a/chrome/browser/chromeos/borealis/borealis_window_manager_test_helper.h +++ b/chrome/browser/ash/borealis/borealis_window_manager_test_helper.h
@@ -2,10 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_WINDOW_MANAGER_TEST_HELPER_H_ -#define CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_WINDOW_MANAGER_TEST_HELPER_H_ +#ifndef CHROME_BROWSER_ASH_BOREALIS_BOREALIS_WINDOW_MANAGER_TEST_HELPER_H_ +#define CHROME_BROWSER_ASH_BOREALIS_BOREALIS_WINDOW_MANAGER_TEST_HELPER_H_ -#include "chrome/browser/chromeos/borealis/borealis_window_manager.h" +#include "chrome/browser/ash/borealis/borealis_window_manager.h" namespace borealis { @@ -30,4 +30,4 @@ } // namespace borealis -#endif // CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_WINDOW_MANAGER_TEST_HELPER_H_ +#endif // CHROME_BROWSER_ASH_BOREALIS_BOREALIS_WINDOW_MANAGER_TEST_HELPER_H_
diff --git a/chrome/browser/chromeos/borealis/borealis_window_manager_unittest.cc b/chrome/browser/ash/borealis/borealis_window_manager_unittest.cc similarity index 95% rename from chrome/browser/chromeos/borealis/borealis_window_manager_unittest.cc rename to chrome/browser/ash/borealis/borealis_window_manager_unittest.cc index c8af3b6..7eaa0751 100644 --- a/chrome/browser/chromeos/borealis/borealis_window_manager_unittest.cc +++ b/chrome/browser/ash/borealis/borealis_window_manager_unittest.cc
@@ -2,13 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/borealis/borealis_window_manager.h" +#include "chrome/browser/ash/borealis/borealis_window_manager.h" #include <memory> -#include "chrome/browser/chromeos/borealis/borealis_window_manager.h" -#include "chrome/browser/chromeos/borealis/borealis_window_manager_mock.h" -#include "chrome/browser/chromeos/borealis/borealis_window_manager_test_helper.h" +#include "chrome/browser/ash/borealis/borealis_window_manager_mock.h" +#include "chrome/browser/ash/borealis/borealis_window_manager_test_helper.h" #include "chrome/browser/chromeos/guest_os/guest_os_registry_service.h" #include "chrome/browser/chromeos/guest_os/guest_os_registry_service_factory.h" #include "chrome/test/base/testing_profile.h"
diff --git a/chrome/browser/chromeos/borealis/infra/described.h b/chrome/browser/ash/borealis/infra/described.h similarity index 85% rename from chrome/browser/chromeos/borealis/infra/described.h rename to chrome/browser/ash/borealis/infra/described.h index 4f8c4a4d..47c899d0 100644 --- a/chrome/browser/chromeos/borealis/infra/described.h +++ b/chrome/browser/ash/borealis/infra/described.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_BOREALIS_INFRA_DESCRIBED_H_ -#define CHROME_BROWSER_CHROMEOS_BOREALIS_INFRA_DESCRIBED_H_ +#ifndef CHROME_BROWSER_ASH_BOREALIS_INFRA_DESCRIBED_H_ +#define CHROME_BROWSER_ASH_BOREALIS_INFRA_DESCRIBED_H_ #include <string> @@ -38,4 +38,4 @@ } // namespace borealis -#endif // CHROME_BROWSER_CHROMEOS_BOREALIS_INFRA_DESCRIBED_H_ +#endif // CHROME_BROWSER_ASH_BOREALIS_INFRA_DESCRIBED_H_
diff --git a/chrome/browser/chromeos/borealis/infra/described_unittest.cc b/chrome/browser/ash/borealis/infra/described_unittest.cc similarity index 91% rename from chrome/browser/chromeos/borealis/infra/described_unittest.cc rename to chrome/browser/ash/borealis/infra/described_unittest.cc index 8d56dfa..dcb4146 100644 --- a/chrome/browser/chromeos/borealis/infra/described_unittest.cc +++ b/chrome/browser/ash/borealis/infra/described_unittest.cc
@@ -2,8 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/borealis/infra/described.h" - +#include "chrome/browser/ash/borealis/infra/described.h" #include "testing/gtest/include/gtest/gtest.h" namespace borealis {
diff --git a/chrome/browser/chromeos/borealis/infra/expected.h b/chrome/browser/ash/borealis/infra/expected.h similarity index 95% rename from chrome/browser/chromeos/borealis/infra/expected.h rename to chrome/browser/ash/borealis/infra/expected.h index 5f651dc..199cbc55 100644 --- a/chrome/browser/chromeos/borealis/infra/expected.h +++ b/chrome/browser/ash/borealis/infra/expected.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_BOREALIS_INFRA_EXPECTED_H_ -#define CHROME_BROWSER_CHROMEOS_BOREALIS_INFRA_EXPECTED_H_ +#ifndef CHROME_BROWSER_ASH_BOREALIS_INFRA_EXPECTED_H_ +#define CHROME_BROWSER_ASH_BOREALIS_INFRA_EXPECTED_H_ #include <type_traits> @@ -104,4 +104,4 @@ } // namespace borealis -#endif // CHROME_BROWSER_CHROMEOS_BOREALIS_INFRA_EXPECTED_H_ +#endif // CHROME_BROWSER_ASH_BOREALIS_INFRA_EXPECTED_H_
diff --git a/chrome/browser/chromeos/borealis/infra/expected_unittest.cc b/chrome/browser/ash/borealis/infra/expected_unittest.cc similarity index 97% rename from chrome/browser/chromeos/borealis/infra/expected_unittest.cc rename to chrome/browser/ash/borealis/infra/expected_unittest.cc index c29207a..e981cea 100644 --- a/chrome/browser/chromeos/borealis/infra/expected_unittest.cc +++ b/chrome/browser/ash/borealis/infra/expected_unittest.cc
@@ -2,7 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/borealis/infra/expected.h" +#include "chrome/browser/ash/borealis/infra/expected.h" + #include <memory> #include "base/bind.h"
diff --git a/chrome/browser/chromeos/borealis/infra/state_manager.h b/chrome/browser/ash/borealis/infra/state_manager.h similarity index 95% rename from chrome/browser/chromeos/borealis/infra/state_manager.h rename to chrome/browser/ash/borealis/infra/state_manager.h index 71d75154..f9052e3 100644 --- a/chrome/browser/chromeos/borealis/infra/state_manager.h +++ b/chrome/browser/ash/borealis/infra/state_manager.h
@@ -2,16 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_BOREALIS_INFRA_STATE_MANAGER_H_ -#define CHROME_BROWSER_CHROMEOS_BOREALIS_INFRA_STATE_MANAGER_H_ +#ifndef CHROME_BROWSER_ASH_BOREALIS_INFRA_STATE_MANAGER_H_ +#define CHROME_BROWSER_ASH_BOREALIS_INFRA_STATE_MANAGER_H_ #include <memory> #include "base/callback_list.h" #include "base/memory/weak_ptr.h" #include "base/optional.h" -#include "chrome/browser/chromeos/borealis/infra/expected.h" -#include "chrome/browser/chromeos/borealis/infra/transition.h" +#include "chrome/browser/ash/borealis/infra/expected.h" +#include "chrome/browser/ash/borealis/infra/transition.h" namespace borealis { @@ -181,4 +181,4 @@ } // namespace borealis -#endif // CHROME_BROWSER_CHROMEOS_BOREALIS_INFRA_STATE_MANAGER_H_ +#endif // CHROME_BROWSER_ASH_BOREALIS_INFRA_STATE_MANAGER_H_
diff --git a/chrome/browser/chromeos/borealis/infra/state_manager_unittest.cc b/chrome/browser/ash/borealis/infra/state_manager_unittest.cc similarity index 98% rename from chrome/browser/chromeos/borealis/infra/state_manager_unittest.cc rename to chrome/browser/ash/borealis/infra/state_manager_unittest.cc index 857eb43e..0a48e39 100644 --- a/chrome/browser/chromeos/borealis/infra/state_manager_unittest.cc +++ b/chrome/browser/ash/borealis/infra/state_manager_unittest.cc
@@ -2,14 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/borealis/infra/state_manager.h" +#include "chrome/browser/ash/borealis/infra/state_manager.h" + #include <memory> #include "base/bind.h" #include "base/callback_helpers.h" #include "base/optional.h" #include "base/test/task_environment.h" -#include "chrome/browser/chromeos/borealis/infra/expected.h" +#include "chrome/browser/ash/borealis/infra/expected.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chrome/browser/chromeos/borealis/infra/transition.h b/chrome/browser/ash/borealis/infra/transition.h similarity index 92% rename from chrome/browser/chromeos/borealis/infra/transition.h rename to chrome/browser/ash/borealis/infra/transition.h index 5cb21fb..2d40b267 100644 --- a/chrome/browser/chromeos/borealis/infra/transition.h +++ b/chrome/browser/ash/borealis/infra/transition.h
@@ -2,15 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CHROMEOS_BOREALIS_INFRA_TRANSITION_H_ -#define CHROME_BROWSER_CHROMEOS_BOREALIS_INFRA_TRANSITION_H_ +#ifndef CHROME_BROWSER_ASH_BOREALIS_INFRA_TRANSITION_H_ +#define CHROME_BROWSER_ASH_BOREALIS_INFRA_TRANSITION_H_ #include <memory> #include "base/bind.h" #include "base/task/thread_pool.h" #include "base/threading/sequenced_task_runner_handle.h" -#include "chrome/browser/chromeos/borealis/infra/expected.h" +#include "chrome/browser/ash/borealis/infra/expected.h" // TODO(b/172501195): Make these available outside namespace borealis. namespace borealis { @@ -83,4 +83,4 @@ } // namespace borealis -#endif // CHROME_BROWSER_CHROMEOS_BOREALIS_INFRA_TRANSITION_H_ +#endif // CHROME_BROWSER_ASH_BOREALIS_INFRA_TRANSITION_H_
diff --git a/chrome/browser/chromeos/borealis/infra/transition_unittest.cc b/chrome/browser/ash/borealis/infra/transition_unittest.cc similarity index 96% rename from chrome/browser/chromeos/borealis/infra/transition_unittest.cc rename to chrome/browser/ash/borealis/infra/transition_unittest.cc index f6a72be..7cfc800 100644 --- a/chrome/browser/chromeos/borealis/infra/transition_unittest.cc +++ b/chrome/browser/ash/borealis/infra/transition_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/borealis/infra/transition.h" +#include "chrome/browser/ash/borealis/infra/transition.h" #include <memory>
diff --git a/chrome/browser/ash/crosapi/url_handler_ash.cc b/chrome/browser/ash/crosapi/url_handler_ash.cc index 21e21c3..1613bf1 100644 --- a/chrome/browser/ash/crosapi/url_handler_ash.cc +++ b/chrome/browser/ash/crosapi/url_handler_ash.cc
@@ -7,6 +7,7 @@ #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/ui/settings_window_manager_chromeos.h" #include "chrome/common/webui_url_constants.h" +#include "ui/display/types/display_constants.h" namespace crosapi { @@ -28,7 +29,7 @@ chrome::SettingsWindowManager* settings_window_manager = chrome::SettingsWindowManager::GetInstance(); settings_window_manager->ShowChromePageForProfile( - ProfileManager::GetPrimaryUserProfile(), url); + ProfileManager::GetPrimaryUserProfile(), url, display::kInvalidDisplayId); } } // namespace crosapi
diff --git a/chrome/browser/ash/settings/device_settings_provider.cc b/chrome/browser/ash/settings/device_settings_provider.cc index 5be97ae8..56dd0dc5 100644 --- a/chrome/browser/ash/settings/device_settings_provider.cc +++ b/chrome/browser/ash/settings/device_settings_provider.cc
@@ -141,6 +141,7 @@ kReportDeviceVpdInfo, kReportDeviceAppInfo, kReportDeviceSystemInfo, + kReportDevicePrintJobs, kReportOsUpdateStatus, kReportRunningKioskApp, kReportUploadFrequency, @@ -661,6 +662,10 @@ new_values_cache->SetBoolean(kReportDeviceSystemInfo, reporting_policy.report_system_info()); } + if (reporting_policy.has_report_print_jobs()) { + new_values_cache->SetBoolean(kReportDevicePrintJobs, + reporting_policy.report_print_jobs()); + } } }
diff --git a/chrome/browser/ash/settings/device_settings_provider_unittest.cc b/chrome/browser/ash/settings/device_settings_provider_unittest.cc index 779d361..666beaf 100644 --- a/chrome/browser/ash/settings/device_settings_provider_unittest.cc +++ b/chrome/browser/ash/settings/device_settings_provider_unittest.cc
@@ -105,6 +105,7 @@ proto->set_report_storage_status(enable_reporting); proto->set_report_board_status(enable_reporting); proto->set_report_app_info(enable_reporting); + proto->set_report_print_jobs(enable_reporting); proto->set_device_status_frequency(frequency); BuildAndInstallDevicePolicy(); } @@ -181,6 +182,7 @@ kReportDeviceGraphicsStatus, kReportDeviceCrashReportInfo, kReportDeviceAppInfo, + kReportDevicePrintJobs, kReportOsUpdateStatus, kReportRunningKioskApp, };
diff --git a/chrome/browser/ash/system_logs/shill_log_source.cc b/chrome/browser/ash/system_logs/shill_log_source.cc index 1b09b15..059ce05 100644 --- a/chrome/browser/ash/system_logs/shill_log_source.cc +++ b/chrome/browser/ash/system_logs/shill_log_source.cc
@@ -106,7 +106,7 @@ base::Optional<base::Value> result) { if (!result) { LOG(ERROR) << "ManagerPropertiesCallback Failed"; - std::move(callback_).Run(nullptr); + std::move(callback_).Run(std::make_unique<SystemLogsResponse>()); return; }
diff --git a/chrome/browser/battery/battery_metrics.cc b/chrome/browser/battery/battery_metrics.cc index 86d7a40..a53621b 100644 --- a/chrome/browser/battery/battery_metrics.cc +++ b/chrome/browser/battery/battery_metrics.cc
@@ -22,32 +22,10 @@ return *binder; } -#if defined(OS_ANDROID) -bool IsAppVisible(base::android::ApplicationState state) { - return state == base::android::APPLICATION_STATE_HAS_RUNNING_ACTIVITIES; -} -#endif // defined(OS_ANDROID) - } // namespace BatteryMetrics::BatteryMetrics() { StartRecording(); - -#if defined(OS_ANDROID) - // On Android, also track the battery capacity drain while Chrome is the - // foreground activity. - // TODO(crbug.com/1177542): make AndroidBatteryMetrics an observer of - // content::ProcessVisibilityTracker and remove this. - app_state_listener_ = - base::android::ApplicationStatusListener::New(base::BindRepeating( - [](BatteryMetrics* metrics, base::android::ApplicationState state) { - metrics->android_metrics_.OnAppVisibilityChanged( - IsAppVisible(state)); - }, - base::Unretained(this))); - android_metrics_.OnAppVisibilityChanged( - IsAppVisible(base::android::ApplicationStatusListener::GetState())); -#endif // defined(OS_ANDROID) } BatteryMetrics::~BatteryMetrics() = default;
diff --git a/chrome/browser/battery/battery_metrics.h b/chrome/browser/battery/battery_metrics.h index bdb5893..cd496f9 100644 --- a/chrome/browser/battery/battery_metrics.h +++ b/chrome/browser/battery/battery_metrics.h
@@ -16,11 +16,6 @@ #include "services/device/public/mojom/battery_monitor.mojom.h" #include "services/device/public/mojom/battery_status.mojom-forward.h" -#if defined(OS_ANDROID) -#include "base/android/application_status_listener.h" -#include "components/power_metrics/android_battery_metrics.h" -#endif // defined(OS_ANDROID) - // Records metrics around battery usage on all platforms. Connects to // Battery monitor via mojo. class BatteryMetrics { @@ -55,11 +50,6 @@ // The battery monitor backend for the device Chrome is running on. mojo::Remote<device::mojom::BatteryMonitor> battery_monitor_; -#if defined(OS_ANDROID) - power_metrics::AndroidBatteryMetrics android_metrics_; - std::unique_ptr<base::android::ApplicationStatusListener> app_state_listener_; -#endif // defined(OS_ANDROID) - SEQUENCE_CHECKER(sequence_checker_); base::WeakPtrFactory<BatteryMetrics> weak_factory_{this};
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc index 669b2f9..3b6508d6 100644 --- a/chrome/browser/chrome_browser_main.cc +++ b/chrome/browser/chrome_browser_main.cc
@@ -185,6 +185,7 @@ #include "chrome/browser/ui/page_info/chrome_page_info_client.h" #include "ui/base/resource/resource_bundle_android.h" #else +#include "chrome/browser/accessibility/soda_installer.h" #include "chrome/browser/resource_coordinator/tab_activity_watcher.h" #include "chrome/browser/resource_coordinator/tab_manager.h" #include "chrome/browser/ui/browser.h" @@ -195,10 +196,8 @@ #endif // defined(OS_ANDROID) #if !defined(OS_ANDROID) && !BUILDFLAG(IS_CHROMEOS_ASH) -#include "chrome/browser/accessibility/soda_installer.h" #include "chrome/browser/first_run/upgrade_util.h" #include "components/enterprise/browser/controller/chrome_browser_cloud_management_controller.h" -#include "media/base/media_switches.h" #endif #if BUILDFLAG(IS_CHROMEOS_ASH) @@ -1608,13 +1607,14 @@ #if !defined(OS_ANDROID) && !BUILDFLAG(IS_CHROMEOS_ASH) // Exclude Android: SODA is not supported. // Exclude ChromeOS: SODA is independent of Component Updater. - if (base::FeatureList::IsEnabled(media::kUseSodaForLiveCaption) && - base::FeatureList::IsEnabled(media::kLiveCaption)) { - speech::SodaInstaller::GetInstance()->Init(profile_->GetPrefs()); - } + speech::SodaInstaller::GetInstance()->InitForProfileIfAppropriate(profile_); #endif // !defined(OS_ANDROID) && !BUILDFLAG(IS_CHROMEOS_ASH) } +#if BUILDFLAG(IS_CHROMEOS_ASH) + speech::SodaInstaller::GetInstance()->InitForProfileIfAppropriate(profile_); +#endif // BUILDFLAG(IS_CHROMEOS_ASH) + variations::VariationsService* variations_service = browser_process_->variations_service(); if (should_call_pre_main_loop_start_startup_on_variations_service_)
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index 1073428f..6bbcaaf 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc
@@ -3893,6 +3893,10 @@ chrome::SessionEnding(); } +bool ChromeContentBrowserClient::ShouldEnableAudioProcessHighPriority() { + return IsAudioProcessHighPriorityEnabled(); +} + #endif // defined(OS_WIN) void ChromeContentBrowserClient::
diff --git a/chrome/browser/chrome_content_browser_client.h b/chrome/browser/chrome_content_browser_client.h index 49aeba1d..36674a8f 100644 --- a/chrome/browser/chrome_content_browser_client.h +++ b/chrome/browser/chrome_content_browser_client.h
@@ -405,6 +405,7 @@ sandbox::policy::SandboxType sandbox_type) override; bool IsRendererCodeIntegrityEnabled() override; void SessionEnding() override; + bool ShouldEnableAudioProcessHighPriority() override; #endif void ExposeInterfacesToRenderer( service_manager::BinderRegistry* registry,
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn index 4aa0bf4..fe338c4e 100644 --- a/chrome/browser/chromeos/BUILD.gn +++ b/chrome/browser/chromeos/BUILD.gn
@@ -573,6 +573,45 @@ "../ash/authpolicy/data_pipe_utils.h", "../ash/authpolicy/kerberos_files_handler.cc", "../ash/authpolicy/kerberos_files_handler.h", + "../ash/borealis/borealis_app_launcher.cc", + "../ash/borealis/borealis_app_launcher.h", + "../ash/borealis/borealis_app_uninstaller.cc", + "../ash/borealis/borealis_app_uninstaller.h", + "../ash/borealis/borealis_context.cc", + "../ash/borealis/borealis_context.h", + "../ash/borealis/borealis_context_manager.h", + "../ash/borealis/borealis_context_manager_impl.cc", + "../ash/borealis/borealis_context_manager_impl.h", + "../ash/borealis/borealis_features.cc", + "../ash/borealis/borealis_features.h", + "../ash/borealis/borealis_installer.cc", + "../ash/borealis/borealis_installer.h", + "../ash/borealis/borealis_installer_impl.cc", + "../ash/borealis/borealis_installer_impl.h", + "../ash/borealis/borealis_launch_watcher.cc", + "../ash/borealis/borealis_launch_watcher.h", + "../ash/borealis/borealis_metrics.cc", + "../ash/borealis/borealis_metrics.h", + "../ash/borealis/borealis_prefs.cc", + "../ash/borealis/borealis_prefs.h", + "../ash/borealis/borealis_service.cc", + "../ash/borealis/borealis_service.h", + "../ash/borealis/borealis_service_factory.cc", + "../ash/borealis/borealis_service_factory.h", + "../ash/borealis/borealis_service_impl.cc", + "../ash/borealis/borealis_service_impl.h", + "../ash/borealis/borealis_shutdown_monitor.cc", + "../ash/borealis/borealis_shutdown_monitor.h", + "../ash/borealis/borealis_task.cc", + "../ash/borealis/borealis_task.h", + "../ash/borealis/borealis_util.cc", + "../ash/borealis/borealis_util.h", + "../ash/borealis/borealis_window_manager.cc", + "../ash/borealis/borealis_window_manager.h", + "../ash/borealis/infra/described.h", + "../ash/borealis/infra/expected.h", + "../ash/borealis/infra/state_manager.h", + "../ash/borealis/infra/transition.h", "../ash/certificate_provider/certificate_info.cc", "../ash/certificate_provider/certificate_info.h", "../ash/certificate_provider/certificate_provider.h", @@ -1506,45 +1545,6 @@ "bluetooth/debug_logs_manager_factory.h", "boot_times_recorder.cc", "boot_times_recorder.h", - "borealis/borealis_app_launcher.cc", - "borealis/borealis_app_launcher.h", - "borealis/borealis_app_uninstaller.cc", - "borealis/borealis_app_uninstaller.h", - "borealis/borealis_context.cc", - "borealis/borealis_context.h", - "borealis/borealis_context_manager.h", - "borealis/borealis_context_manager_impl.cc", - "borealis/borealis_context_manager_impl.h", - "borealis/borealis_features.cc", - "borealis/borealis_features.h", - "borealis/borealis_installer.cc", - "borealis/borealis_installer.h", - "borealis/borealis_installer_impl.cc", - "borealis/borealis_installer_impl.h", - "borealis/borealis_launch_watcher.cc", - "borealis/borealis_launch_watcher.h", - "borealis/borealis_metrics.cc", - "borealis/borealis_metrics.h", - "borealis/borealis_prefs.cc", - "borealis/borealis_prefs.h", - "borealis/borealis_service.cc", - "borealis/borealis_service.h", - "borealis/borealis_service_factory.cc", - "borealis/borealis_service_factory.h", - "borealis/borealis_service_impl.cc", - "borealis/borealis_service_impl.h", - "borealis/borealis_shutdown_monitor.cc", - "borealis/borealis_shutdown_monitor.h", - "borealis/borealis_task.cc", - "borealis/borealis_task.h", - "borealis/borealis_util.cc", - "borealis/borealis_util.h", - "borealis/borealis_window_manager.cc", - "borealis/borealis_window_manager.h", - "borealis/infra/described.h", - "borealis/infra/expected.h", - "borealis/infra/state_manager.h", - "borealis/infra/transition.h", "browser_context_keyed_service_factories.cc", "browser_context_keyed_service_factories.h", "camera_detector.cc", @@ -3286,6 +3286,14 @@ "../ash/app_mode/test_kiosk_extension_builder.h", "../ash/app_mode/web_app/mock_web_kiosk_app_launcher.cc", "../ash/app_mode/web_app/mock_web_kiosk_app_launcher.h", + "../ash/borealis/borealis_context_manager_mock.cc", + "../ash/borealis/borealis_context_manager_mock.h", + "../ash/borealis/borealis_service_fake.cc", + "../ash/borealis/borealis_service_fake.h", + "../ash/borealis/borealis_window_manager_mock.cc", + "../ash/borealis/borealis_window_manager_mock.h", + "../ash/borealis/borealis_window_manager_test_helper.cc", + "../ash/borealis/borealis_window_manager_test_helper.h", "../ash/certificate_provider/test_certificate_provider_extension.cc", "../ash/certificate_provider/test_certificate_provider_extension.h", "../ash/login/demo_mode/demo_mode_test_helper.cc", @@ -3359,14 +3367,6 @@ "attestation/mock_enrollment_certificate_uploader.h", "attestation/mock_machine_certificate_uploader.cc", "attestation/mock_machine_certificate_uploader.h", - "borealis/borealis_context_manager_mock.cc", - "borealis/borealis_context_manager_mock.h", - "borealis/borealis_service_fake.cc", - "borealis/borealis_service_fake.h", - "borealis/borealis_window_manager_mock.cc", - "borealis/borealis_window_manager_mock.h", - "borealis/borealis_window_manager_test_helper.cc", - "borealis/borealis_window_manager_test_helper.h", "cert_provisioning/mock_cert_provisioning_scheduler.cc", "cert_provisioning/mock_cert_provisioning_scheduler.h", "child_accounts/child_account_test_utils.cc", @@ -3476,6 +3476,19 @@ "../ash/assistant/assistant_util_unittest.cc", "../ash/authpolicy/authpolicy_credentials_manager_unittest.cc", "../ash/authpolicy/authpolicy_helper.unittest.cc", + "../ash/borealis/borealis_app_launcher_unittest.cc", + "../ash/borealis/borealis_context_manager_unittest.cc", + "../ash/borealis/borealis_context_unittest.cc", + "../ash/borealis/borealis_features_unittest.cc", + "../ash/borealis/borealis_installer_unittest.cc", + "../ash/borealis/borealis_launch_watcher_unittest.cc", + "../ash/borealis/borealis_shutdown_monitor_unittest.cc", + "../ash/borealis/borealis_task_unittest.cc", + "../ash/borealis/borealis_window_manager_unittest.cc", + "../ash/borealis/infra/described_unittest.cc", + "../ash/borealis/infra/expected_unittest.cc", + "../ash/borealis/infra/state_manager_unittest.cc", + "../ash/borealis/infra/transition_unittest.cc", "../ash/certificate_provider/certificate_provider_service_unittest.cc", "../ash/crosapi/browser_loader_unittest.cc", "../ash/crosapi/browser_util_unittest.cc", @@ -3654,19 +3667,6 @@ "attestation/tpm_challenge_key_unittest.cc", "base/file_flusher_unittest.cc", "bluetooth/debug_logs_manager_unittest.cc", - "borealis/borealis_app_launcher_unittest.cc", - "borealis/borealis_context_manager_unittest.cc", - "borealis/borealis_context_unittest.cc", - "borealis/borealis_features_unittest.cc", - "borealis/borealis_installer_unittest.cc", - "borealis/borealis_launch_watcher_unittest.cc", - "borealis/borealis_shutdown_monitor_unittest.cc", - "borealis/borealis_task_unittest.cc", - "borealis/borealis_window_manager_unittest.cc", - "borealis/infra/described_unittest.cc", - "borealis/infra/expected_unittest.cc", - "borealis/infra/state_manager_unittest.cc", - "borealis/infra/transition_unittest.cc", "camera_mic/vm_camera_mic_manager_unittest.cc", "cert_provisioning/cert_provisioning_invalidator_unittest.cc", "cert_provisioning/cert_provisioning_platform_keys_helpers_unittest.cc",
diff --git a/chrome/browser/chromeos/borealis/borealis_service_impl.h b/chrome/browser/chromeos/borealis/borealis_service_impl.h deleted file mode 100644 index 5eecc77..0000000 --- a/chrome/browser/chromeos/borealis/borealis_service_impl.h +++ /dev/null
@@ -1,49 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_SERVICE_IMPL_H_ -#define CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_SERVICE_IMPL_H_ - -#include "chrome/browser/chromeos/borealis/borealis_service.h" - -#include "chrome/browser/chromeos/borealis/borealis_app_launcher.h" -#include "chrome/browser/chromeos/borealis/borealis_app_uninstaller.h" -#include "chrome/browser/chromeos/borealis/borealis_context_manager_impl.h" -#include "chrome/browser/chromeos/borealis/borealis_features.h" -#include "chrome/browser/chromeos/borealis/borealis_installer_impl.h" -#include "chrome/browser/chromeos/borealis/borealis_shutdown_monitor.h" -#include "chrome/browser/chromeos/borealis/borealis_window_manager.h" - -namespace borealis { - -class BorealisServiceImpl : public BorealisService { - public: - explicit BorealisServiceImpl(Profile* profile); - - ~BorealisServiceImpl() override; - - private: - // BorealisService overrides. - BorealisAppLauncher& AppLauncher() override; - BorealisAppUninstaller& AppUninstaller() override; - BorealisContextManager& ContextManager() override; - BorealisFeatures& Features() override; - BorealisInstaller& Installer() override; - BorealisShutdownMonitor& ShutdownMonitor() override; - BorealisWindowManager& WindowManager() override; - - Profile* const profile_; - - BorealisAppLauncher app_launcher_; - BorealisAppUninstaller app_uninstaller_; - BorealisContextManagerImpl context_manager_; - BorealisFeatures features_; - BorealisInstallerImpl installer_; - BorealisShutdownMonitor shutdown_monitor_; - BorealisWindowManager window_manager_; -}; - -} // namespace borealis - -#endif // CHROME_BROWSER_CHROMEOS_BOREALIS_BOREALIS_SERVICE_IMPL_H_
diff --git a/chrome/browser/chromeos/dbus/vm_applications_service_provider.cc b/chrome/browser/chromeos/dbus/vm_applications_service_provider.cc index 1b08ad3..c4a9eb5 100644 --- a/chrome/browser/chromeos/dbus/vm_applications_service_provider.cc +++ b/chrome/browser/chromeos/dbus/vm_applications_service_provider.cc
@@ -8,8 +8,8 @@ #include <vector> #include "base/bind.h" -#include "chrome/browser/chromeos/borealis/borealis_features.h" -#include "chrome/browser/chromeos/borealis/borealis_service.h" +#include "chrome/browser/ash/borealis/borealis_features.h" +#include "chrome/browser/ash/borealis/borealis_service.h" #include "chrome/browser/chromeos/crostini/crostini_features.h" #include "chrome/browser/chromeos/crostini/crostini_mime_types_service.h" #include "chrome/browser/chromeos/crostini/crostini_mime_types_service_factory.h"
diff --git a/chrome/browser/chromeos/exo/chrome_data_exchange_delegate.cc b/chrome/browser/chromeos/exo/chrome_data_exchange_delegate.cc index 978d21c..f754894559 100644 --- a/chrome/browser/chromeos/exo/chrome_data_exchange_delegate.cc +++ b/chrome/browser/chromeos/exo/chrome_data_exchange_delegate.cc
@@ -18,8 +18,8 @@ #include "base/strings/string_split.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" +#include "chrome/browser/ash/borealis/borealis_window_manager.h" #include "chrome/browser/chromeos/arc/arc_util.h" -#include "chrome/browser/chromeos/borealis/borealis_window_manager.h" #include "chrome/browser/chromeos/crostini/crostini_util.h" #include "chrome/browser/chromeos/extensions/file_manager/event_router.h" #include "chrome/browser/chromeos/extensions/file_manager/event_router_factory.h"
diff --git a/chrome/browser/chromeos/guest_os/guest_os_registry_service.cc b/chrome/browser/chromeos/guest_os/guest_os_registry_service.cc index e342cef..2968b83 100644 --- a/chrome/browser/chromeos/guest_os/guest_os_registry_service.cc +++ b/chrome/browser/chromeos/guest_os/guest_os_registry_service.cc
@@ -19,9 +19,9 @@ #include "base/time/default_clock.h" #include "base/time/time.h" #include "chrome/browser/apps/app_service/dip_px_util.h" +#include "chrome/browser/ash/borealis/borealis_features.h" +#include "chrome/browser/ash/borealis/borealis_service.h" #include "chrome/browser/browser_process.h" -#include "chrome/browser/chromeos/borealis/borealis_features.h" -#include "chrome/browser/chromeos/borealis/borealis_service.h" #include "chrome/browser/chromeos/crostini/crostini_features.h" #include "chrome/browser/chromeos/crostini/crostini_manager.h" #include "chrome/browser/chromeos/crostini/crostini_shelf_utils.h"
diff --git a/chrome/browser/chromeos/ownership/owner_settings_service_chromeos.cc b/chrome/browser/chromeos/ownership/owner_settings_service_chromeos.cc index 7f0bb3dd..5000ddf 100644 --- a/chrome/browser/chromeos/ownership/owner_settings_service_chromeos.cc +++ b/chrome/browser/chromeos/ownership/owner_settings_service_chromeos.cc
@@ -185,11 +185,11 @@ } // namespace -OwnerSettingsServiceChromeOS::ManagementSettings::ManagementSettings() { -} +OwnerSettingsServiceChromeOS::ManagementSettings::ManagementSettings() = + default; -OwnerSettingsServiceChromeOS::ManagementSettings::~ManagementSettings() { -} +OwnerSettingsServiceChromeOS::ManagementSettings::~ManagementSettings() = + default; OwnerSettingsServiceChromeOS::OwnerSettingsServiceChromeOS( DeviceSettingsService* device_settings_service, @@ -494,8 +494,7 @@ const base::ListValue* accounts_list = NULL; if (value.GetAsList(&accounts_list)) { for (base::ListValue::const_iterator entry(accounts_list->begin()); - entry != accounts_list->end(); - ++entry) { + entry != accounts_list->end(); ++entry) { const base::DictionaryValue* entry_dict = NULL; if (entry->GetAsDictionary(&entry_dict)) { em::DeviceLocalAccountInfoProto* account = @@ -692,6 +691,7 @@ // kReportDeviceUsers // kReportDeviceAppInfo // kReportDeviceSystemInfo + // kReportDevicePrintJobs // kServiceAccountIdentity // kSystemTimezonePolicy // kVariationsRestrictParameter @@ -763,9 +763,8 @@ UpdateDeviceSettings(change.first, *change.second.get(), settings); pending_changes_.clear(); - std::unique_ptr<em::PolicyData> policy = - AssemblePolicy(user_id_, device_settings_service_->policy_data(), - &settings); + std::unique_ptr<em::PolicyData> policy = AssemblePolicy( + user_id_, device_settings_service_->policy_data(), &settings); has_pending_fixups_ = false; scoped_refptr<base::TaskRunner> task_runner =
diff --git a/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc b/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc index ab5622582..33737343 100644 --- a/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc +++ b/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc
@@ -799,6 +799,11 @@ POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD, base::Value(container.report_system_info()), nullptr); } + if (container.has_report_print_jobs()) { + policies->Set(key::kReportDevicePrintJobs, POLICY_LEVEL_MANDATORY, + POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD, + base::Value(container.report_print_jobs()), nullptr); + } } if (policy.has_device_heartbeat_settings()) {
diff --git a/chrome/browser/data_saver/data_saver_browsertest.cc b/chrome/browser/data_saver/data_saver_browsertest.cc index 7effdac..ded546b 100644 --- a/chrome/browser/data_saver/data_saver_browsertest.cc +++ b/chrome/browser/data_saver/data_saver_browsertest.cc
@@ -11,7 +11,6 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.h" #include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings_factory.h" -#include "chrome/browser/previews/previews_test_util.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_commands.h"
diff --git a/chrome/browser/download/android/download_controller.cc b/chrome/browser/download/android/download_controller.cc index c004f0048e..ac24e34b 100644 --- a/chrome/browser/download/android/download_controller.cc +++ b/chrome/browser/download/android/download_controller.cc
@@ -32,6 +32,8 @@ #include "chrome/browser/infobars/infobar_service.h" #include "chrome/browser/offline_pages/android/offline_page_bridge.h" #include "chrome/browser/permissions/permission_update_infobar_delegate_android.h" +#include "chrome/browser/ui/android/tab_model/tab_model.h" +#include "chrome/browser/ui/android/tab_model/tab_model_list.h" #include "chrome/browser/vr/vr_tab_helper.h" #include "chrome/grit/chromium_strings.h" #include "components/download/content/public/context_menu_download.h" @@ -199,14 +201,25 @@ // static void DownloadController::CloseTabIfEmpty(content::WebContents* web_contents) { - if (!web_contents) + if (!web_contents || !web_contents->GetController().IsInitialNavigation()) return; - TabAndroid* tab = TabAndroid::FromWebContents(web_contents); - if (tab && !tab->GetJavaObject().is_null()) { - JNIEnv* env = base::android::AttachCurrentThread(); - Java_DownloadController_closeTabIfBlank(env, tab->GetJavaObject()); + TabModel* tab_model = TabModelList::GetTabModelForWebContents(web_contents); + if (!tab_model || tab_model->GetTabCount() == 1) + return; + + int tab_index = -1; + for (int index = 0; index < tab_model->GetTabCount(); ++index) { + if (web_contents == tab_model->GetWebContentsAt(index)) { + tab_index = index; + break; + } } + + if (tab_index == -1) + return; + + tab_model->CloseTabAt(tab_index); } // static
diff --git a/chrome/browser/extensions/api/declarative_content/content_action.cc b/chrome/browser/extensions/api/declarative_content/content_action.cc index 8f0b013..bc33886 100644 --- a/chrome/browser/extensions/api/declarative_content/content_action.cc +++ b/chrome/browser/extensions/api/declarative_content/content_action.cc
@@ -29,6 +29,7 @@ #include "extensions/common/extension.h" #include "extensions/common/extension_messages.h" #include "extensions/common/image_util.h" +#include "extensions/common/mojom/host_id.mojom.h" #include "extensions/common/mojom/run_location.mojom-shared.h" #include "extensions/common/script_constants.h" #include "ui/gfx/image/image.h" @@ -291,7 +292,7 @@ content::BrowserContext* browser_context, const Extension* extension, const ScriptData& script_data) { - HostID host_id(HostID::EXTENSIONS, extension->id()); + mojom::HostID host_id(mojom::HostID::HostType::kExtensions, extension->id()); InitScript(host_id, extension, script_data); script_loader_ = ExtensionSystem::Get(browser_context) @@ -307,7 +308,7 @@ UserScriptLoader::ScriptsLoadedCallback()); } -void RequestContentScript::InitScript(const HostID& host_id, +void RequestContentScript::InitScript(const mojom::HostID& host_id, const Extension* extension, const ScriptData& script_data) { script_.set_id(UserScript::GenerateUserScriptID());
diff --git a/chrome/browser/extensions/api/declarative_content/content_action.h b/chrome/browser/extensions/api/declarative_content/content_action.h index d9ee97a..764178ef8 100644 --- a/chrome/browser/extensions/api/declarative_content/content_action.h +++ b/chrome/browser/extensions/api/declarative_content/content_action.h
@@ -9,6 +9,7 @@ #include <string> #include "base/macros.h" +#include "extensions/common/mojom/host_id.mojom-forward.h" #include "extensions/common/user_script.h" namespace base { @@ -93,7 +94,7 @@ void Revert(const ApplyInfo& apply_info) const override; private: - void InitScript(const HostID& host_id, + void InitScript(const mojom::HostID& host_id, const Extension* extension, const ScriptData& script_data);
diff --git a/chrome/browser/extensions/api/scripting/scripting_api.cc b/chrome/browser/extensions/api/scripting/scripting_api.cc index 9212faa..1266638 100644 --- a/chrome/browser/extensions/api/scripting/scripting_api.cc +++ b/chrome/browser/extensions/api/scripting/scripting_api.cc
@@ -20,6 +20,7 @@ #include "extensions/common/manifest_constants.h" #include "extensions/common/mojom/action_type.mojom-shared.h" #include "extensions/common/mojom/css_origin.mojom-shared.h" +#include "extensions/common/mojom/host_id.mojom.h" #include "extensions/common/mojom/run_location.mojom-shared.h" #include "extensions/common/permissions/api_permission.h" #include "extensions/common/permissions/permissions_data.h" @@ -297,7 +298,7 @@ } script_executor->ExecuteScript( - HostID(HostID::EXTENSIONS, extension()->id()), + mojom::HostID(mojom::HostID::HostType::kExtensions, extension()->id()), mojom::ActionType::kAddJavascript, std::move(code_to_execute), frame_scope, frame_ids, ScriptExecutor::MATCH_ABOUT_BLANK, mojom::RunLocation::kDocumentIdle, ScriptExecutor::DEFAULT_PROCESS, @@ -412,9 +413,9 @@ DCHECK(script_executor); script_executor->ExecuteScript( - HostID(HostID::EXTENSIONS, extension()->id()), mojom::ActionType::kAddCss, - std::move(code_to_execute), frame_scope, frame_ids, - ScriptExecutor::MATCH_ABOUT_BLANK, kCSSRunLocation, + mojom::HostID(mojom::HostID::HostType::kExtensions, extension()->id()), + mojom::ActionType::kAddCss, std::move(code_to_execute), frame_scope, + frame_ids, ScriptExecutor::MATCH_ABOUT_BLANK, kCSSRunLocation, ScriptExecutor::DEFAULT_PROCESS, /* webview_src */ GURL(), std::move(script_url), user_gesture(), ConvertStyleOriginToCSSOrigin(injection_.origin), @@ -480,7 +481,7 @@ DCHECK(code.empty() || !script_url.is_valid()); script_executor->ExecuteScript( - HostID(HostID::EXTENSIONS, extension()->id()), + mojom::HostID(mojom::HostID::HostType::kExtensions, extension()->id()), mojom::ActionType::kRemoveCss, std::move(code), frame_scope, frame_ids, ScriptExecutor::MATCH_ABOUT_BLANK, kCSSRunLocation, ScriptExecutor::DEFAULT_PROCESS,
diff --git a/chrome/browser/extensions/api/tabs/tabs_api.cc b/chrome/browser/extensions/api/tabs/tabs_api.cc index 04e11ae..c48d961 100644 --- a/chrome/browser/extensions/api/tabs/tabs_api.cc +++ b/chrome/browser/extensions/api/tabs/tabs_api.cc
@@ -92,10 +92,10 @@ #include "extensions/common/constants.h" #include "extensions/common/error_utils.h" #include "extensions/common/extension.h" -#include "extensions/common/host_id.h" #include "extensions/common/manifest_constants.h" #include "extensions/common/manifest_handlers/default_locale_handler.h" #include "extensions/common/message_bundle.h" +#include "extensions/common/mojom/host_id.mojom.h" #include "extensions/common/permissions/permissions_data.h" #include "extensions/common/user_script.h" #include "net/base/escape.h" @@ -2146,7 +2146,8 @@ execute_tab_id_ = tab_id; details_ = std::move(details); - set_host_id(HostID(HostID::EXTENSIONS, extension()->id())); + set_host_id( + mojom::HostID(mojom::HostID::HostType::kExtensions, extension()->id())); return set_init_result(SUCCESS); }
diff --git a/chrome/browser/extensions/chrome_test_extension_loader.cc b/chrome/browser/extensions/chrome_test_extension_loader.cc index 7a48001..1c0d2ce 100644 --- a/chrome/browser/extensions/chrome_test_extension_loader.cc +++ b/chrome/browser/extensions/chrome_test_extension_loader.cc
@@ -30,6 +30,7 @@ #include "extensions/common/manifest_handlers/background_info.h" #include "extensions/common/manifest_handlers/content_scripts_handler.h" #include "extensions/common/manifest_handlers/incognito_info.h" +#include "extensions/common/mojom/host_id.mojom.h" #include "extensions/test/extension_background_page_waiter.h" #include "extensions/test/extension_test_notification_observer.h" #include "extensions/test/test_content_script_load_waiter.h" @@ -133,7 +134,7 @@ !ContentScriptsInfo::GetContentScripts(&extension).empty()) { UserScriptLoader* user_script_loader = user_script_manager->manifest_script_loader(); - HostID host_id(HostID::EXTENSIONS, extension_id_); + mojom::HostID host_id(mojom::HostID::HostType::kExtensions, extension_id_); if (!user_script_loader->HasLoadedScripts(host_id)) { ContentScriptLoadWaiter waiter(user_script_loader); waiter.RestrictToHostID(host_id);
diff --git a/chrome/browser/extensions/chrome_test_extension_loader_browsertest.cc b/chrome/browser/extensions/chrome_test_extension_loader_browsertest.cc index 061f3ffc..0b5b964 100644 --- a/chrome/browser/extensions/chrome_test_extension_loader_browsertest.cc +++ b/chrome/browser/extensions/chrome_test_extension_loader_browsertest.cc
@@ -16,7 +16,7 @@ #include "extensions/browser/extension_system.h" #include "extensions/browser/user_script_loader.h" #include "extensions/browser/user_script_manager.h" -#include "extensions/common/host_id.h" +#include "extensions/common/mojom/host_id.mojom.h" #include "extensions/test/test_extension_dir.h" #include "net/dns/mock_host_resolver.h" @@ -79,10 +79,10 @@ ASSERT_TRUE(extension); ExtensionSystem* extension_system = ExtensionSystem::Get(profile()); - EXPECT_TRUE( - extension_system->user_script_manager() - ->manifest_script_loader() - ->HasLoadedScripts(HostID(HostID::EXTENSIONS, extension->id()))); + EXPECT_TRUE(extension_system->user_script_manager() + ->manifest_script_loader() + ->HasLoadedScripts(mojom::HostID( + mojom::HostID::HostType::kExtensions, extension->id()))); // Sanity check: Test that the scripts inject. ui_test_utils::NavigateToURL(
diff --git a/chrome/browser/extensions/extension_user_script_loader_unittest.cc b/chrome/browser/extensions/extension_user_script_loader_unittest.cc index 9decf09..fd22f02b 100644 --- a/chrome/browser/extensions/extension_user_script_loader_unittest.cc +++ b/chrome/browser/extensions/extension_user_script_loader_unittest.cc
@@ -25,7 +25,6 @@ #include "content/public/test/browser_task_environment.h" #include "content/public/test/test_utils.h" #include "extensions/browser/content_verifier.h" -#include "extensions/common/host_id.h" #include "extensions/test/test_content_script_load_waiter.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chrome/browser/extensions/script_executor_browsertest.cc b/chrome/browser/extensions/script_executor_browsertest.cc index d407122..9082e9c6 100644 --- a/chrome/browser/extensions/script_executor_browsertest.cc +++ b/chrome/browser/extensions/script_executor_browsertest.cc
@@ -22,6 +22,7 @@ #include "extensions/common/extension_builder.h" #include "extensions/common/mojom/action_type.mojom-shared.h" #include "extensions/common/mojom/css_origin.mojom-shared.h" +#include "extensions/common/mojom/host_id.mojom.h" #include "extensions/common/mojom/run_location.mojom-shared.h" #include "extensions/common/user_script.h" #include "net/dns/mock_host_resolver.h" @@ -127,7 +128,7 @@ ScriptExecutorHelper helper; script_executor.ExecuteScript( - HostID(HostID::EXTENSIONS, extension->id()), + mojom::HostID(mojom::HostID::HostType::kExtensions, extension->id()), mojom::ActionType::kAddJavascript, kCode, ScriptExecutor::SPECIFIED_FRAMES, {ExtensionApiFrameIdMap::kTopFrameId}, ScriptExecutor::DONT_MATCH_ABOUT_BLANK, mojom::RunLocation::kDocumentIdle, @@ -209,7 +210,7 @@ // get a result. ScriptExecutorHelper helper; script_executor.ExecuteScript( - HostID(HostID::EXTENSIONS, extension->id()), + mojom::HostID(mojom::HostID::HostType::kExtensions, extension->id()), mojom::ActionType::kAddJavascript, kCode, ScriptExecutor::SPECIFIED_FRAMES, {frame1_id, frame2_id}, ScriptExecutor::DONT_MATCH_ABOUT_BLANK, @@ -230,7 +231,7 @@ // should result in frame2_child being added to the results. ScriptExecutorHelper helper; script_executor.ExecuteScript( - HostID(HostID::EXTENSIONS, extension->id()), + mojom::HostID(mojom::HostID::HostType::kExtensions, extension->id()), mojom::ActionType::kAddJavascript, kCode, ScriptExecutor::INCLUDE_SUB_FRAMES, {frame1_id, frame2_id}, ScriptExecutor::DONT_MATCH_ABOUT_BLANK, @@ -260,7 +261,7 @@ // doesn't exist. ScriptExecutorHelper helper; script_executor.ExecuteScript( - HostID(HostID::EXTENSIONS, extension->id()), + mojom::HostID(mojom::HostID::HostType::kExtensions, extension->id()), mojom::ActionType::kAddJavascript, kCode, ScriptExecutor::SPECIFIED_FRAMES, {frame1_id, frame2_id, kNonExistentFrameId}, @@ -285,7 +286,7 @@ // Try injecting into a single non-existent frame. ScriptExecutorHelper helper; script_executor.ExecuteScript( - HostID(HostID::EXTENSIONS, extension->id()), + mojom::HostID(mojom::HostID::HostType::kExtensions, extension->id()), mojom::ActionType::kAddJavascript, kCode, ScriptExecutor::SPECIFIED_FRAMES, {kNonExistentFrameId}, ScriptExecutor::DONT_MATCH_ABOUT_BLANK,
diff --git a/chrome/browser/extensions/service_worker_messaging_apitest.cc b/chrome/browser/extensions/service_worker_messaging_apitest.cc index 3f77b5a..a2256f3e 100644 --- a/chrome/browser/extensions/service_worker_messaging_apitest.cc +++ b/chrome/browser/extensions/service_worker_messaging_apitest.cc
@@ -10,6 +10,7 @@ #include "components/version_info/version_info.h" #include "content/public/test/browser_test.h" #include "content/public/test/service_worker_test_helpers.h" +#include "extensions/browser/api/messaging/message_service.h" #include "extensions/browser/service_worker/service_worker_test_utils.h" #include "extensions/test/extension_test_message_listener.h" #include "extensions/test/result_catcher.h" @@ -217,6 +218,31 @@ << message_; } +// Regression test for https://crbug.com/1176400. +// Tests that service worker shutdown closes messaging channel properly. +IN_PROC_BROWSER_TEST_F(ServiceWorkerMessagingTest, + WorkerShutsDownWhileNativeMessagePortIsOpen) { + // Set up an observer to wait for the registration to be stored before + // calling StopServiceWorker below. + service_worker_test_utils::TestRegistrationObserver observer( + browser()->profile()); + ASSERT_NO_FATAL_FAILURE(test_host_.RegisterTestHost(false)); + + ResultCatcher catcher; + const Extension* extension = LoadExtension(test_data_dir_.AppendASCII( + "service_worker/messaging/native_message_after_worker_stop")); + ASSERT_TRUE(extension); + + observer.WaitForRegistrationStored(); + EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); + size_t num_channels = + MessageService::Get(profile())->GetChannelCountForTest(); + StopServiceWorker(*extension); + // After worker shutdown, expect the channel count to reduce by 1. + EXPECT_EQ(num_channels - 1, + MessageService::Get(profile())->GetChannelCountForTest()); +} + // Tests chrome.tabs.sendMessage from SW extension to content script. IN_PROC_BROWSER_TEST_F(ServiceWorkerMessagingTest, WorkerToTab) { ASSERT_TRUE(StartEmbeddedTestServer());
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 5f0f245..ce22bee 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -1651,7 +1651,7 @@ { "name": "enable-desktop-pwas-run-on-os-login", "owners": [ "mjackson@microsoft.com", "desktop-pwas-team@google.com" ], - "expiry_milestone": 90 + "expiry_milestone": 92 }, { "name": "enable-desktop-pwas-tab-strip", @@ -4584,6 +4584,11 @@ "expiry_milestone": 90 }, { + "name": "scan-app-media-link", + "owners": [ "gavinwill", "jschettler" ], + "expiry_milestone": 95 + }, + { "name": "scanning-ui", "owners": [ "jschettler", "bmgordon" ], "expiry_milestone": 90
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 1869ce0..c5942b3 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -4653,6 +4653,11 @@ "Showing important notification icons in status area when the screen is " "sufficiently large."; +const char kScanAppMediaLinkName[] = "Show Media app link in Scan app"; +const char kScanAppMediaLinkDescription[] = + "Enables showing a link in the Scan app to open scanned images in the Media" + " app."; + const char kScanningUIName[] = "Scanning UI"; const char kScanningUIDescription[] = "An experimental UI that allows users to interact with a connected "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 68ef72b..7bb799ca 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -2738,6 +2738,9 @@ extern const char kScalableStatusAreaName[]; extern const char kScalableStatusAreaDescription[]; +extern const char kScanAppMediaLinkName[]; +extern const char kScanAppMediaLinkDescription[]; + extern const char kScanningUIName[]; extern const char kScanningUIDescription[];
diff --git a/chrome/browser/google/google_update_win_unittest.cc b/chrome/browser/google/google_update_win_unittest.cc index d971eaf..646b925 100644 --- a/chrome/browser/google/google_update_win_unittest.cc +++ b/chrome/browser/google/google_update_win_unittest.cc
@@ -17,6 +17,7 @@ #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/path_service.h" +#include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "base/test/scoped_command_line.h"
diff --git a/chrome/browser/history_clusters/DIR_METADATA b/chrome/browser/history_clusters/DIR_METADATA new file mode 100644 index 0000000..88f25f6 --- /dev/null +++ b/chrome/browser/history_clusters/DIR_METADATA
@@ -0,0 +1,3 @@ +monorail { + component: "UI>Browser>Memories" +}
diff --git a/chrome/browser/history_clusters/OWNERS b/chrome/browser/history_clusters/OWNERS new file mode 100644 index 0000000..100d7c6 --- /dev/null +++ b/chrome/browser/history_clusters/OWNERS
@@ -0,0 +1 @@ +file://components/memories/OWNERS
diff --git a/chrome/browser/history_clusters/README.md b/chrome/browser/history_clusters/README.md new file mode 100644 index 0000000..702dcd5 --- /dev/null +++ b/chrome/browser/history_clusters/README.md
@@ -0,0 +1,3 @@ +# //chrome/browser/history_clusters + +Please see //components/memories/README.md.
diff --git a/chrome/browser/lazyload/DIR_METADATA b/chrome/browser/lazyload/DIR_METADATA new file mode 100644 index 0000000..f4a9f322 --- /dev/null +++ b/chrome/browser/lazyload/DIR_METADATA
@@ -0,0 +1,3 @@ +monorail: { + component: "Blink>Loader>LazyLoad" +}
diff --git a/chrome/browser/previews/OWNERS b/chrome/browser/lazyload/OWNERS similarity index 100% rename from chrome/browser/previews/OWNERS rename to chrome/browser/lazyload/OWNERS
diff --git a/chrome/browser/previews/lazyload_browsertest.cc b/chrome/browser/lazyload/lazyload_browsertest.cc similarity index 100% rename from chrome/browser/previews/lazyload_browsertest.cc rename to chrome/browser/lazyload/lazyload_browsertest.cc
diff --git a/chrome/browser/media/audio_service_util.cc b/chrome/browser/media/audio_service_util.cc index 307fe58..d935b75 100644 --- a/chrome/browser/media/audio_service_util.cc +++ b/chrome/browser/media/audio_service_util.cc
@@ -9,7 +9,6 @@ #include "base/feature_list.h" #include "base/optional.h" #include "base/values.h" -#include "build/build_config.h" #include "build/chromeos_buildflags.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/policy/chrome_browser_policy_connector.h" @@ -19,25 +18,42 @@ #include "components/policy/policy_constants.h" #include "content/public/common/content_features.h" -bool IsAudioServiceSandboxEnabled() { - base::Optional<bool> force_enable_audio_sandbox; -// TODO(crbug.com/1052397): Remove !IS_CHROMEOS_LACROS once lacros starts being -// built with OS_CHROMEOS instead of OS_LINUX. +namespace { + #if defined(OS_WIN) || defined(OS_MAC) || \ (defined(OS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)) +bool GetPolicyOrFeature(const char* policy_name, const base::Feature& feature) { const policy::PolicyMap& policies = g_browser_process->browser_policy_connector() ->GetPolicyService() ->GetPolicies(policy::PolicyNamespace(policy::POLICY_DOMAIN_CHROME, std::string())); - const base::Value* audio_sandbox_enabled_policy_value = - policies.GetValue(policy::key::kAudioSandboxEnabled); - if (audio_sandbox_enabled_policy_value) { - force_enable_audio_sandbox.emplace(); - audio_sandbox_enabled_policy_value->GetAsBoolean( - &force_enable_audio_sandbox.value()); + base::Optional<bool> policy_value; + if (const base::Value* value = policies.GetValue(policy_name)) { + policy_value.emplace(); + value->GetAsBoolean(&policy_value.value()); } -#endif - return force_enable_audio_sandbox.value_or( - base::FeatureList::IsEnabled(features::kAudioServiceSandbox)); + return policy_value.value_or(base::FeatureList::IsEnabled(feature)); } +#endif + +} // namespace + +bool IsAudioServiceSandboxEnabled() { +// TODO(crbug.com/1052397): Remove !IS_CHROMEOS_LACROS once lacros starts being +// built with OS_CHROMEOS instead of OS_LINUX. +#if defined(OS_WIN) || defined(OS_MAC) || \ + (defined(OS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)) + return GetPolicyOrFeature(policy::key::kAudioSandboxEnabled, + features::kAudioServiceSandbox); +#else + return base::FeatureList::IsEnabled(features::kAudioServiceSandbox); +#endif +} + +#if defined(OS_WIN) +bool IsAudioProcessHighPriorityEnabled() { + return GetPolicyOrFeature(policy::key::kAudioProcessHighPriorityEnabled, + features::kAudioProcessHighPriorityWin); +} +#endif
diff --git a/chrome/browser/media/audio_service_util.h b/chrome/browser/media/audio_service_util.h index 721d386..85d9e13 100644 --- a/chrome/browser/media/audio_service_util.h +++ b/chrome/browser/media/audio_service_util.h
@@ -5,6 +5,12 @@ #ifndef CHROME_BROWSER_MEDIA_AUDIO_SERVICE_UTIL_H_ #define CHROME_BROWSER_MEDIA_AUDIO_SERVICE_UTIL_H_ +#include "build/build_config.h" + bool IsAudioServiceSandboxEnabled(); +#if defined(OS_WIN) +bool IsAudioProcessHighPriorityEnabled(); +#endif + #endif // CHROME_BROWSER_MEDIA_AUDIO_SERVICE_UTIL_H_
diff --git a/chrome/browser/metrics/authenticator_utility.cc b/chrome/browser/metrics/authenticator_utility.cc index 0b697c1..4a40f87c1 100644 --- a/chrome/browser/metrics/authenticator_utility.cc +++ b/chrome/browser/metrics/authenticator_utility.cc
@@ -20,6 +20,11 @@ #include "content/public/browser/browser_thread.h" #include "content/public/browser/is_uvpaa.h" +#if defined(OS_ANDROID) +#include "base/android/jni_android.h" +#include "chrome/android/chrome_jni_headers/IsUvpaaHelper_jni.h" +#endif + #if defined(OS_MAC) #include "device/fido/mac/authenticator.h" #endif @@ -74,12 +79,9 @@ ChromeAuthenticatorRequestDelegate:: TouchIdAuthenticatorConfigForProfile(profile))); } -#endif +#endif // defined(OS_MAC) void ReportUVPlatformAuthenticatorAvailability() { - // This only reports metrics for desktop platforms. For mobile devices, the - // platform version is an exact proxy for whether a platform authenticator - // can be used. #if defined(OS_MAC) DCHECK(!content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); // IsUVPAA() is prone to crashes/hangs on macOS. Downsample metric collection @@ -100,7 +102,24 @@ base::BindOnce(&ReportAvailability)); #elif BUILDFLAG(IS_CHROMEOS_ASH) // TODO(crbug.com/1181426): Reenable the IsUVPAA() startup metric on CrOS. +#elif defined(OS_ANDROID) + JNIEnv* env = base::android::AttachCurrentThread(); + + ::webauth::Java_IsUvpaaHelper_isUserVerifyingPlatformAuthenticatorAvailable( + env); #endif } } // namespace authenticator_utility + +#if defined(OS_ANDROID) + +namespace webauth { + +void JNI_IsUvpaaHelper_OnIsUvpaaComplete(JNIEnv* env, jboolean available) { + authenticator_utility::ReportAvailability(static_cast<bool>(available)); +} + +} // namespace webauth + +#endif // defined(OS_ANDROID)
diff --git a/chrome/browser/policy/audio_process_high_priority_enabled_browsertest.cc b/chrome/browser/policy/audio_process_high_priority_enabled_browsertest.cc new file mode 100644 index 0000000..6756266 --- /dev/null +++ b/chrome/browser/policy/audio_process_high_priority_enabled_browsertest.cc
@@ -0,0 +1,76 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/feature_list.h" +#include "base/optional.h" +#include "base/values.h" +#include "chrome/browser/media/audio_service_util.h" +#include "chrome/browser/policy/chrome_browser_policy_connector.h" +#include "chrome/test/base/in_process_browser_test.h" +#include "components/policy/core/common/mock_configuration_policy_provider.h" +#include "components/policy/core/common/policy_map.h" +#include "components/policy/core/common/policy_types.h" +#include "components/policy/policy_constants.h" +#include "content/public/common/content_features.h" +#include "content/public/test/browser_test.h" +#include "sandbox/policy/features.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace policy { + +class AudioProcessHighPriorityEnabledTest + : public InProcessBrowserTest, + public ::testing::WithParamInterface< + /*policy::key::kAudioProcessHighPriorityEnabled=*/base::Optional< + bool>> { + public: + // InProcessBrowserTest implementation: + void SetUp() override { + EXPECT_CALL(policy_provider_, IsInitializationComplete(testing::_)) + .WillRepeatedly(testing::Return(true)); + policy::PolicyMap values; + if (GetParam().has_value()) { + values.Set(policy::key::kAudioProcessHighPriorityEnabled, + policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_MACHINE, + policy::POLICY_SOURCE_CLOUD, base::Value(*GetParam()), + nullptr); + } + policy_provider_.UpdateChromePolicy(values); + policy::BrowserPolicyConnector::SetPolicyProviderForTesting( + &policy_provider_); + + InProcessBrowserTest::SetUp(); + } + + private: + policy::MockConfigurationPolicyProvider policy_provider_; +}; + +IN_PROC_BROWSER_TEST_P(AudioProcessHighPriorityEnabledTest, IsRespected) { + base::Optional<bool> enable_high_priority_via_policy = GetParam(); + bool is_high_priority_enabled_by_default = + base::FeatureList::IsEnabled(features::kAudioProcessHighPriorityWin); + + ASSERT_EQ(enable_high_priority_via_policy.value_or( + is_high_priority_enabled_by_default), + IsAudioProcessHighPriorityEnabled()); +} + +INSTANTIATE_TEST_SUITE_P( + Enabled, + AudioProcessHighPriorityEnabledTest, + ::testing::Values(/*policy::key::kAudioProcessHighPriorityEnabled=*/true)); + +INSTANTIATE_TEST_SUITE_P( + Disabled, + AudioProcessHighPriorityEnabledTest, + ::testing::Values(/*policy::key::kAudioProcessHighPriorityEnabled=*/false)); + +INSTANTIATE_TEST_SUITE_P( + NotSet, + AudioProcessHighPriorityEnabledTest, + ::testing::Values( + /*policy::key::kAudioProcessHighPriorityEnabled=*/base::nullopt)); + +} // namespace policy
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc index f8ee4de..9a816a5c 100644 --- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc +++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -115,7 +115,7 @@ #include "ash/constants/ash_pref_names.h" #include "ash/public/cpp/ash_pref_names.h" #include "chrome/browser/ash/accessibility/magnifier_type.h" -#include "chrome/browser/chromeos/borealis/borealis_prefs.h" +#include "chrome/browser/ash/borealis/borealis_prefs.h" #include "chrome/browser/chromeos/crostini/crostini_pref_names.h" #include "chrome/browser/chromeos/platform_keys/key_permissions/key_permissions_policy_handler.h" #include "chrome/browser/chromeos/plugin_vm/plugin_vm_pref_names.h"
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc index 46b5653..bc11c59 100644 --- a/chrome/browser/prefs/browser_prefs.cc +++ b/chrome/browser/prefs/browser_prefs.cc
@@ -275,6 +275,7 @@ #include "chrome/browser/chromeos/extensions/printing/printing_api_handler.h" #endif #include "chrome/browser/ash/account_manager/account_manager_edu_coexistence_controller.h" +#include "chrome/browser/ash/borealis/borealis_prefs.h" #include "chrome/browser/ash/login/demo_mode/demo_mode_detector.h" #include "chrome/browser/ash/login/demo_mode/demo_mode_resources_remover.h" #include "chrome/browser/ash/login/demo_mode/demo_session.h" @@ -296,7 +297,6 @@ #include "chrome/browser/ash/settings/device_settings_cache.h" #include "chrome/browser/ash/system/automatic_reboot_manager.h" #include "chrome/browser/ash/system/input_device_settings.h" -#include "chrome/browser/chromeos/borealis/borealis_prefs.h" #include "chrome/browser/chromeos/child_accounts/secondary_account_consent_logger.h" #include "chrome/browser/chromeos/file_system_provider/registry.h" #include "chrome/browser/chromeos/first_run/first_run.h"
diff --git a/chrome/browser/previews/DIR_METADATA b/chrome/browser/previews/DIR_METADATA deleted file mode 100644 index d243b83..0000000 --- a/chrome/browser/previews/DIR_METADATA +++ /dev/null
@@ -1,3 +0,0 @@ -monorail: { - component: "Blink>Previews" -}
diff --git a/chrome/browser/previews/previews_test_util.cc b/chrome/browser/previews/previews_test_util.cc deleted file mode 100644 index 7dc1822..0000000 --- a/chrome/browser/previews/previews_test_util.cc +++ /dev/null
@@ -1,38 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/previews/previews_test_util.h" - -#include "base/task/thread_pool/thread_pool_instance.h" -#include "components/metrics/content/subprocess_metrics_provider.h" - -std::string GetScriptLog(Browser* browser) { - std::string script_log; - EXPECT_TRUE(ExecuteScriptAndExtractString( - browser->tab_strip_model()->GetActiveWebContents(), "sendLogToTest()", - &script_log)); - return script_log; -} - -void RetryForHistogramUntilCountReached(base::HistogramTester* histogram_tester, - const std::string& histogram_name, - size_t count) { - while (true) { - base::ThreadPoolInstance::Get()->FlushForTesting(); - base::RunLoop().RunUntilIdle(); - - content::FetchHistogramsFromChildProcesses(); - metrics::SubprocessMetricsProvider::MergeHistogramDeltasForTesting(); - - const std::vector<base::Bucket> buckets = - histogram_tester->GetAllSamples(histogram_name); - size_t total_count = 0; - for (const auto& bucket : buckets) { - total_count += bucket.count; - } - if (total_count >= count) { - break; - } - } -}
diff --git a/chrome/browser/previews/previews_test_util.h b/chrome/browser/previews/previews_test_util.h deleted file mode 100644 index 2ba8be5..0000000 --- a/chrome/browser/previews/previews_test_util.h +++ /dev/null
@@ -1,46 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_PREVIEWS_PREVIEWS_TEST_UTIL_H_ -#define CHROME_BROWSER_PREVIEWS_PREVIEWS_TEST_UTIL_H_ - -#include <string> - -#include "base/test/metrics/histogram_tester.h" -#include "build/build_config.h" -#include "build/chromeos_buildflags.h" -#include "chrome/browser/browser_process.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/ui/browser.h" -#include "chrome/test/base/in_process_browser_test.h" -#include "chrome/test/base/ui_test_utils.h" - -// Expected console output when defer preview is not applied to the test -// webpage. -static const char kNonDeferredPageExpectedOutput[] = - "ScriptLog:_InlineScript_SyncScript_BodyEnd_DeveloperDeferScript_OnLoad"; - -// Expected console output when defer preview is applied to the test webpage. -static const char kDeferredPageExpectedOutput[] = - "ScriptLog:_BodyEnd_InlineScript_SyncScript_DeveloperDeferScript_OnLoad"; - -// Runs sendLogToTest() JavaScript method in the current tab in |browser| and -// returns the result. -std::string GetScriptLog(Browser* browser); - -// Retries fetching |histogram_name| until it contains at least |count| samples. -void RetryForHistogramUntilCountReached(base::HistogramTester* histogram_tester, - const std::string& histogram_name, - size_t count); - -// Previews InfoBar (which these tests trigger) does not work on Mac. -// See https://crbug.com/782322 for details. Also occasional flakes on win7 -// (https://crbug.com/789542). -#if defined(OS_WIN) || defined(OS_MAC) || BUILDFLAG(IS_CHROMEOS_ASH) -#define DISABLE_ON_WIN_MAC_CHROMEOS(x) DISABLED_##x -#else -#define DISABLE_ON_WIN_MAC_CHROMEOS(x) x -#endif - -#endif // CHROME_BROWSER_PREVIEWS_PREVIEWS_TEST_UTIL_H_
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js index 3136e817..3e710ec 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js
@@ -3332,3 +3332,25 @@ .replay(); }); }); + +TEST_F('ChromeVoxBackgroundTest', 'Separator', function() { + const mockFeedback = this.createMockFeedback(); + const site = ` + <p>Start</p> + <p><span>Hello</span></p> + <p><span role="separator">Separator content should not be read</span></p> + <p><span>World</span></p> + `; + this.runWithLoadedTree(site, function(rootNode) { + mockFeedback.expectSpeech('Start') + .call(doCmd('nextObject')) + .expectSpeech('Hello') + .call(doCmd('nextObject')) + .expectNextSpeechUtteranceIsNot('Separator content should not be read') + .expectSpeech('Separator') + .expectBraille('seprtr') + .call(doCmd('nextObject')) + .expectSpeech('World') + .replay(); + }); +});
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_line.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_line.js index 2791e5f..5673a3c0 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_line.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_line.js
@@ -97,10 +97,10 @@ } /** -* @param {boolean=} opt_baseLineOnStart Computes the line based on the start -node if true. - @private - */ + * @param {boolean=} opt_baseLineOnStart Computes the line based on the start + * node if true. + * @private + */ computeLineData_(opt_baseLineOnStart) { // Note that we calculate the line based only upon |start_| or // |end_| even if they do not fall on the same line. It is up to
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing_test.js index 9083d69..e628fd4 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing_test.js
@@ -1623,3 +1623,32 @@ input.focus(); }); }); + +TEST_F('ChromeVoxEditingTest', 'Separator', function() { + const mockFeedback = this.createMockFeedback(); + const site = ` + <div contenteditable="true" role="textbox"> + <p>Start</p> + <p><span>Hello</span></p> + <p><span role="separator">Separator content should not be read</span></p> + <p><span>World</span></p> + </div> + `; + this.runWithLoadedTree(site, function(root) { + const input = root.find({role: RoleType.TEXT_FIELD}); + this.listenOnce(input, 'focus', function() { + mockFeedback.call(this.press(KeyCode.DOWN)) + .expectSpeech('Hello') + .call(this.press(KeyCode.DOWN)) + .expectNextSpeechUtteranceIsNot( + 'Separator content should not be read') + .expectSpeech('Separator') + .call(this.press(KeyCode.DOWN)) + .expectSpeech('World') + .call(this.press(KeyCode.LEFT)) + .expectSpeech('Separator') + .replay(); + }); + input.focus(); + }); +});
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/intent_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/intent_handler.js index 05ea0e5..e9c5d078d 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/intent_handler.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/intent_handler.js
@@ -90,9 +90,15 @@ // line if empty. // TODO: detect when this is the end of the document; read "end of text" // if so. - ChromeVox.tts.speak( - cur.text.substring(cur.startOffset, cur.startOffset + 1) || '\n', - QueueMode.CATEGORY_FLUSH); + const text = cur.text.substring(cur.startOffset, cur.startOffset + 1); + ChromeVox.tts.speak(text || '\n', QueueMode.CATEGORY_FLUSH); + // Return false if |text| is empty. Do this to give the user more + // information than just "new line". For example, if moving by character + // moves us to the beginning/end of a separator, we want to include + // additional context. + if (!text) { + return false; + } return true; case IntentTextBoundaryType.LINE_END:
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output.js index 025895ad..cbe84a1 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output.js
@@ -2328,6 +2328,7 @@ inherits: 'abstractRange', earconId: 'LISTBOX' }, + splitter: {msgId: 'role_separator'}, status: {msgId: 'role_status', inherits: 'abstractNameFromContents'}, suggestion: {msgId: 'role_suggestion', inherits: 'abstractContainer'}, tab: {msgId: 'role_tab'},
diff --git a/chrome/browser/resources/read_later/side_panel/side_panel.html b/chrome/browser/resources/read_later/side_panel/side_panel.html index abf18513..98e15f470 100644 --- a/chrome/browser/resources/read_later/side_panel/side_panel.html +++ b/chrome/browser/resources/read_later/side_panel/side_panel.html
@@ -7,9 +7,14 @@ <style> html, body { + height: 100%; margin: 0; padding: 0; - width: 320px; + width: 100%; + } + + body { + overflow: auto; } </style> </head>
diff --git a/chrome/browser/resources/read_later/side_panel/side_panel.js b/chrome/browser/resources/read_later/side_panel/side_panel.js index 533e92f..ce927b47 100644 --- a/chrome/browser/resources/read_later/side_panel/side_panel.js +++ b/chrome/browser/resources/read_later/side_panel/side_panel.js
@@ -23,7 +23,7 @@ #header { align-items: center; display: flex; - margin: 16px 0 4px 8px; + padding: 16px 0 4px 8px; } #searchContainer { @@ -333,4 +333,4 @@ chrome.tabs.create({url: this.item.url}); } } -customElements.define(BookmarkItem.is, BookmarkItem); \ No newline at end of file +customElements.define(BookmarkItem.is, BookmarkItem);
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/esim_remove_profile_dialog.js b/chrome/browser/resources/settings/chromeos/internet_page/esim_remove_profile_dialog.js index a87e626..fdcb029 100644 --- a/chrome/browser/resources/settings/chromeos/internet_page/esim_remove_profile_dialog.js +++ b/chrome/browser/resources/settings/chromeos/internet_page/esim_remove_profile_dialog.js
@@ -14,10 +14,10 @@ ], properties: { - /** @type {string} */ - iccid: { - type: String, - value: '', + /** @type {?OncMojo.NetworkStateProperties} */ + networkState: { + type: Object, + value: null, }, /** @type {boolean} */ @@ -55,11 +55,14 @@ /** @private */ async init_() { - this.esimProfileRemote_ = await cellular_setup.getESimProfile(this.iccid); - const profileProperties = await this.esimProfileRemote_.getProperties(); - this.esimProfileName_ = profileProperties.properties.nickname ? - this.convertString16ToJSString_(profileProperties.properties.nickname) : - this.convertString16ToJSString_(profileProperties.properties.name); + if (!(this.networkState && + this.networkState.type === + chromeos.networkConfig.mojom.NetworkType.kCellular)) { + return; + } + this.esimProfileRemote_ = await cellular_setup.getESimProfile( + this.networkState.typeState.cellular.iccid); + this.esimProfileName_ = this.networkState.name; }, /**
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/esim_rename_dialog.js b/chrome/browser/resources/settings/chromeos/internet_page/esim_rename_dialog.js index a0d15e5..8a61795f 100644 --- a/chrome/browser/resources/settings/chromeos/internet_page/esim_rename_dialog.js +++ b/chrome/browser/resources/settings/chromeos/internet_page/esim_rename_dialog.js
@@ -14,10 +14,10 @@ ], properties: { - /** @type {string} */ - iccid: { - type: String, - value: '', + /** @type {?OncMojo.NetworkStateProperties} */ + networkState: { + type: Object, + value: null, }, /** @type {boolean} */ @@ -45,15 +45,6 @@ } }, - /** - * Provides an interface to the ESimManager Mojo service. - * @private {?chromeos.cellularSetup.mojom.ESimManagerRemote} - */ - eSimManagerRemote_: null, - - /** @private {?chromeos.networkConfig.mojom.CrosNetworkConfigRemote} */ - networkConfig_: null, - /** @private {?chromeos.cellularSetup.mojom.ESimProfileRemote} */ esimProfileRemote_: null, @@ -64,11 +55,14 @@ /** @private */ async init_() { - this.esimProfileRemote_ = await cellular_setup.getESimProfile(this.iccid); - const profileProperties = await this.esimProfileRemote_.getProperties(); - this.esimProfileName_ = profileProperties.properties.nickname ? - this.convertString16ToJSString_(profileProperties.properties.nickname) : - this.convertString16ToJSString_(profileProperties.properties.name); + if (!(this.networkState && + this.networkState.type === + chromeos.networkConfig.mojom.NetworkType.kCellular)) { + return; + } + this.esimProfileRemote_ = await cellular_setup.getESimProfile( + this.networkState.typeState.cellular.iccid); + this.esimProfileName_ = this.networkState.name; }, /**
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_menu.html b/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_menu.html index 241c845..00dcef3 100644 --- a/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_menu.html +++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_menu.html
@@ -24,7 +24,7 @@ margin: 6px 0 0 0; } </style> - <template is="dom-if" if="[[shouldShowDotsMenuButton_(iccid_)]]"> + <template is="dom-if" if="[[shouldShowDotsMenuButton_(networkState_)]]"> <cr-icon-button class="icon-more-vert" title="$i18n{moreActions}" id="moreNetworkDetail"
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_menu.js b/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_menu.js index 4187aab..d14842fc 100644 --- a/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_menu.js +++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_menu.js
@@ -16,11 +16,11 @@ ], properties: { - /** @private */ - iccid_: { - type: String, - value: '', - }, + /** @private {?OncMojo.NetworkStateProperties} */ + networkState_: { + type: Object, + value: null, + } }, /** @@ -34,6 +34,7 @@ !loadTimeData.getBoolean('updatedCellularActivationUi')) { return; } + this.networkState_ = null; // Check if the current network is Cellular using the GUID in the // current route. We can't use the 'type' parameter in the url @@ -52,23 +53,7 @@ chromeos.networkConfig.mojom.NetworkType.kCellular) { return; } - this.setESimIccid_(networkConfig, guid); - }); - }, - - /** - * @param {!chromeos.networkConfig.mojom.CrosNetworkConfigRemote} - * networkConfig - * @param {string} guid - * @private - */ - setESimIccid_(networkConfig, guid) { - networkConfig.getManagedProperties(guid).then(response => { - const managedProperty = response.result; - if (managedProperty.typeProperties.cellular.iccid && - managedProperty.typeProperties.cellular.eid) { - this.iccid_ = managedProperty.typeProperties.cellular.iccid; - } + this.networkState_ = response.result; }); }, @@ -86,7 +71,7 @@ * @private */ shouldShowDotsMenuButton_() { - return !!this.iccid_; + return !!this.networkState_; }, /** @@ -94,7 +79,8 @@ * @private */ onRenameESimProfileTap_(e) { - this.fire('show-esim-profile-rename-dialog', {iccid: this.iccid_}); + this.fire( + 'show-esim-profile-rename-dialog', {networkState: this.networkState_}); }, /** @@ -102,6 +88,7 @@ * @private */ onRemoveESimProfileTap_(e) { - this.fire('show-esim-remove-profile-dialog', {iccid: this.iccid_}); + this.fire( + 'show-esim-remove-profile-dialog', {networkState: this.networkState_}); } }); \ No newline at end of file
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_page.html b/chrome/browser/resources/settings/chromeos/internet_page/internet_page.html index ececaef..67bfb7a 100644 --- a/chrome/browser/resources/settings/chromeos/internet_page/internet_page.html +++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_page.html
@@ -169,7 +169,7 @@ <template is="dom-if" if="[[showESimProfileRenameDialog_]]" restamp> <esim-rename-dialog id="esimRenameDialog" on-close="onCloseESimProfileRenameDialog_" - iccid="[[esimProfileIccid_]]" + network-state="[[eSimNetworkState_]]" show-cellular-disconnect-warning="[[hasActivePSimNetwork_]]"> </esim-rename-dialog> </template> @@ -177,7 +177,7 @@ <template is="dom-if" if="[[showESimRemoveProfileDialog_]]" restamp> <esim-remove-profile-dialog id="esimRemoveProfileDialog" on-close="onCloseESimRemoveProfileDialog_" - iccid="[[esimProfileIccid_]]" + network-state="[[eSimNetworkState_]]" show-cellular-disconnect-warning="[[hasActivePSimNetwork_]]"> </esim-remove-profile-dialog> </template>
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_page.js b/chrome/browser/resources/settings/chromeos/internet_page/internet_page.js index 99c7d8a0..20446c8f 100644 --- a/chrome/browser/resources/settings/chromeos/internet_page/internet_page.js +++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_page.js
@@ -150,11 +150,11 @@ }, /** - * Iccid of an esim profile, used in internet detail menu. - * @private {string} + * eSIM network used in internet detail menu. + * @private {chromeos.networkConfig.mojom.NetworkStateProperties} */ - esimProfileIccid_: { - type: String, + eSimNetworkState_: { + type: Object, value: '', }, @@ -426,11 +426,12 @@ }, /** - * @param {!CustomEvent<!{iccid: string}>} event + * @param {!CustomEvent<!{networkState: + * chromeos.networkConfig.mojom.NetworkStateProperties}>} event * @private */ onShowESimProfileRenameDialog_(event) { - this.esimProfileIccid_ = event.detail.iccid; + this.eSimNetworkState_ = event.detail.networkState; this.showESimProfileRenameDialog_ = true; }, @@ -440,11 +441,12 @@ }, /** - * @param {!CustomEvent<!{iccid: string}>} event + * @param {!CustomEvent<!{networkState: + * chromeos.networkConfig.mojom.NetworkStateProperties}>} event * @private */ onShowESimRemoveProfileDialog_(event) { - this.esimProfileIccid_ = event.detail.iccid; + this.eSimNetworkState_ = event.detail.networkState; this.showESimRemoveProfileDialog_ = true; },
diff --git a/chrome/browser/resources/settings/controls/settings_toggle_button.html b/chrome/browser/resources/settings/controls/settings_toggle_button.html index bb94d2d8..92afe32 100644 --- a/chrome/browser/resources/settings/controls/settings_toggle_button.html +++ b/chrome/browser/resources/settings/controls/settings_toggle_button.html
@@ -1,5 +1,6 @@ <link rel="import" href="chrome://resources/html/polymer.html"> +<link rel="import" href="chrome://resources/cr_elements/cr_actionable_row_style.html"> <link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html"> <link rel="import" href="chrome://resources/cr_elements/cr_toggle/cr_toggle.html"> <link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_pref_indicator.html"> @@ -9,10 +10,8 @@ <dom-module id="settings-toggle-button"> <template> - <style include="settings-shared iron-flex"> + <style include="cr-actionable-row-style settings-shared iron-flex"> :host { - align-items: center; - display: flex; padding: 0 var(--cr-section-padding); }
diff --git a/chrome/browser/resources/tab_search/BUILD.gn b/chrome/browser/resources/tab_search/BUILD.gn index 3dc6cc2e..4d150f96 100644 --- a/chrome/browser/resources/tab_search/BUILD.gn +++ b/chrome/browser/resources/tab_search/BUILD.gn
@@ -182,7 +182,6 @@ deps = [ "//third_party/polymer/v3_0/components-chromium/iron-selector:iron-selector", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", - "//ui/webui/resources/js:list_property_update_behavior.m", ] }
diff --git a/chrome/browser/resources/tab_search/app.html b/chrome/browser/resources/tab_search/app.html index 78cc37b..4979883 100644 --- a/chrome/browser/resources/tab_search/app.html +++ b/chrome/browser/resources/tab_search/app.html
@@ -1,8 +1,4 @@ <style include="mwb-shared-style"> - #tabsList { - --list-max-height: 280px; - } - #no-results { color: var(--cr-primary-text-color); font-size: var(--mwb-primary-text-font-size); @@ -58,12 +54,14 @@ search-result-text="[[searchResultText_]]"> </tab-search-search-field> <div hidden="[[!filteredOpenTabs_.length]]"> - <infinite-list id="tabsList" items="[[filteredOpenTabs_]]"> - <template is="dom-repeat"> + <infinite-list id="tabsList" max-height="[[listMaxHeight_(availableHeight_)]]" + items="[[filteredOpenTabs_]]"> + <template> <tab-search-item id="[[item.tab.tabId]]" aria-label="[[ariaLabel_(item)]]" - class="mwb-list-item" data="[[item]]" on-click="onItemClick_" - on-close="onItemClose_" on-focus="onItemFocus_" - on-keydown="onItemKeyDown_" tabindex="0" role="option"> + class="mwb-list-item" data="[[item]]" index="[[index]]" + on-click="onItemClick_" on-close="onItemClose_" + on-focus="onItemFocus_" on-keydown="onItemKeyDown_" role="option" + tabindex="0"> </tab-search-item> </template> </infinite-list>
diff --git a/chrome/browser/resources/tab_search/app.js b/chrome/browser/resources/tab_search/app.js index ed05bd0..dad2532b 100644 --- a/chrome/browser/resources/tab_search/app.js +++ b/chrome/browser/resources/tab_search/app.js
@@ -12,6 +12,7 @@ import './tab_search_search_field.js'; import './strings.js'; +import {assert} from 'chrome://resources/js/assert.m.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {listenOnce} from 'chrome://resources/js/util.m.js'; import {IronA11yAnnouncer} from 'chrome://resources/polymer/v3_0/iron-a11y-announcer/iron-a11y-announcer.js'; @@ -22,6 +23,12 @@ import {TabData} from './tab_data.js'; import {Tab, Window} from './tab_search.mojom-webui.js'; import {TabSearchApiProxy, TabSearchApiProxyImpl} from './tab_search_api_proxy.js'; +import {TabSearchItem} from './tab_search_item.js'; + +// The minimum number of list items we allow viewing regardless of browser +// height. Includes a half row that hints to the user the capability to scroll. +/** @type {number} */ +const MINIMUM_AVAILABLE_HEIGHT_LIST_ITEM_COUNT = 5.5; export class TabSearchAppElement extends PolymerElement { static get is() { @@ -46,6 +53,9 @@ value: [], }, + /** @private {number} */ + availableHeight_: Number, + /** @private {!Array<!TabData>} */ filteredOpenTabs_: { type: Array, @@ -171,9 +181,45 @@ 'visibilitychange', this.visibilityChangedListener_); } + /** + * @param {string} name A property whose value is specified in pixels. + * @return {number} + */ + getStylePropertyPixelValue_(name) { + const pxValue = getComputedStyle(this).getPropertyValue(name); + assert(pxValue); + + return Number.parseInt(pxValue.trim().slice(0, -2), 10); + } + + /** + * Calculate the list's available height by subtracting the height used by + * the search and feedback fields. + * + * @param {number} height + * @return {number} + * @private + */ + listMaxHeight_(height) { + const footerHeight = + (this.feedbackButtonEnabled_ ? + /** @type {HTMLElement} */ ( + this.shadowRoot.getElementById('feedback-footer')) + .offsetHeight : + 0); + + return Math.max( + height - this.$.searchField.offsetHeight - footerHeight, + Math.round( + MINIMUM_AVAILABLE_HEIGHT_LIST_ITEM_COUNT * + this.getStylePropertyPixelValue_('--mwb-item-height'))); + } + /** @private */ onDocumentHidden_() { - (this.$.tabsList).selected = NO_SELECTION; + this.$.tabsList.scrollTop = 0; + this.$.tabsList.selected = NO_SELECTION; + this.$.searchField.setValue(''); this.$.searchField.getSearchInput().focus(); } @@ -186,14 +232,15 @@ 'Tabs.TabSearch.WebUI.TabListDataReceived', Math.round(Date.now() - getTabsStartTimestamp)); - // The infinite-list only triggers a dom-change event after it is ready - // and observes a change on the list items. - listenOnce(this.$.tabsList, 'dom-change', () => { + // The infinite-list produces viewport-filled events whenever a data or + // scroll position change triggers the the viewport fill logic. + listenOnce(this.$.tabsList, 'viewport-filled', () => { // Push showUI() to the event loop to allow reflow to occur following // the DOM update. setTimeout(() => this.apiProxy_.showUI(), 0); }); + this.availableHeight_ = profileData.windows.find((t) => t.active).height; this.openTabsChanged_(profileData.windows); }); } @@ -294,7 +341,8 @@ onItemClick_(e) { const tabId = Number.parseInt(e.currentTarget.id, 10); this.apiProxy_.switchToTab( - {tabId}, !!this.searchText_, /** @type {number} */ (e.model.index)); + {tabId}, !!this.searchText_, + /** @type {number} */ (e.model.index)); } /** @@ -305,7 +353,8 @@ performance.mark('close_tab:benchmark_begin'); const tabId = Number.parseInt(e.currentTarget.id, 10); this.apiProxy_.closeTab( - tabId, !!this.searchText_, /** @type {number} */ (e.model.index)); + tabId, !!this.searchText_, + /** @type {number} */ (e.model.index)); this.announceA11y_(loadTimeData.getString('a11yTabClosed')); listenOnce(this.$.tabsList, 'iron-items-changed', () => { performance.mark('close_tab:benchmark_end');
diff --git a/chrome/browser/resources/tab_search/infinite_list.html b/chrome/browser/resources/tab_search/infinite_list.html index 55b5dfe2..90e6c41 100644 --- a/chrome/browser/resources/tab_search/infinite_list.html +++ b/chrome/browser/resources/tab_search/infinite_list.html
@@ -1,13 +1,12 @@ <style> :host { display: block; - max-height: var(--list-max-height); overflow-x: hidden; overflow-y: auto; position: relative; } </style> -<div id="items"> +<div id="container"> <iron-selector id="selector" on-keydown="onKeyDown_" on-iron-select="onSelectedChanged_" role="listbox" selected-class="selected">
diff --git a/chrome/browser/resources/tab_search/infinite_list.js b/chrome/browser/resources/tab_search/infinite_list.js index 62cc2c2..559c969 100644 --- a/chrome/browser/resources/tab_search/infinite_list.js +++ b/chrome/browser/resources/tab_search/infinite_list.js
@@ -3,32 +3,27 @@ // found in the LICENSE file. /** - * @fileoverview 'infinite-list' is a component optimized for showing a - * list of items that overflows the view and requires scrolling. For performance - * reasons, The DOM items are added incrementally to the view as the user - * scrolls through the list. The template inside this element represents the DOM - * to create for each list item. The `items` property specifies an array of list - * item data. The component leverages an <iron-selector> to manage item - * selection and styling and a <dom-repeat> which renders the provided template. - * - * Note that the component expects a '--list-max-height' variable to be defined - * in order to determine its maximum height. Additionally, it expects the - * `chunkItemCount` property to be a number of DOM items that is large enough to - * fill the view. + * @fileoverview 'infinite-list' is a component optimized for showing a list of + * items that overflows the view and requires scrolling. For performance + * reasons, the DOM items are added incrementally to the view as the user + * scrolls through the list. The template inside this element is used to create + * each list item's HTML element. The `items` property specifies an array of + * list item data. The component leverages an <iron-selector> to manage item + * selection and styling. */ import 'chrome://resources/polymer/v3_0/iron-selector/iron-selector.js'; -import {assert, assertInstanceof} from 'chrome://resources/js/assert.m.js'; -import {updateListProperty} from 'chrome://resources/js/list_property_update_behavior.m.js'; -import {listenOnce} from 'chrome://resources/js/util.m.js'; -import {afterNextRender, DomRepeat, html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {assert} from 'chrome://resources/js/assert.m.js'; +import {getDeepActiveElement} from 'chrome://resources/js/util.m.js'; +import {calculateSplices, html, PolymerElement, TemplateInstanceBase, templatize} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; /** @type {number} */ export const NO_SELECTION = -1; /** @type {!Array<string>} */ -export const selectorNavigationKeys = ['ArrowUp', 'ArrowDown', 'Home', 'End']; +export const selectorNavigationKeys = + Object.freeze(['ArrowUp', 'ArrowDown', 'Home', 'End']); export class InfiniteList extends PolymerElement { static get is() { @@ -41,19 +36,17 @@ static get properties() { return { - /** - * Controls the number of list items rendered initially, and added on - * demand as the component is scrolled. - */ - chunkItemCount: { + /** @type {number} */ + maxHeight: { type: Number, - value: 10, + observer: 'onMaxHeightChanged_', }, - /** @type {?Array<!Object>} */ + /** @type {!Array<!Object>} */ items: { type: Array, observer: 'onItemsChanged_', + value: [], }, }; } @@ -62,73 +55,148 @@ super(); /** - * An instance of DomRepeat in charge of stamping DOM item elements. - * For performance reasons, the items property of this instance is - * modified on scroll events so that it has enough items to render - * the current scroll view. - * @private {?DomRepeat} + * A constructor used for creating list item template instances. + * @private {?function(new:TemplateInstanceBase, !Object)} */ - this.domRepeat_ = null; + this.instanceConstructor_ = null; + + /** + * An array of template instances each of which contain the HTMLElement + * associated with a given rendered item from the items array. The entries + * are ordered to match the item's index. + * @private {!Array<!TemplateInstanceBase>} + */ + this.instances_ = []; } /** @override */ ready() { super.ready(); - - this.domRepeat_ = assertInstanceof( - this.firstChild, DomRepeat, - 'infinite-list requires a dom-repeat child to be provided in light-dom'); - + this.ensureTemplatized_(); this.addEventListener('scroll', () => this.onScroll_()); } - /** @private */ - getDomItems_() { - const selector = /** @type {!IronSelectorElement} */ (this.$.selector); - return Array.prototype.slice.call( - selector.children, 0, selector.children.length - 1); - } - /** - * @param {number} idx - * @private + * Create and insert as many DOM items as necessary to ensure all items are + * rendered. */ - isDomItemAtIndexAvailable_(idx) { - return idx < this.domRepeat_.items.length; - } - ensureAllDomItemsAvailable() { - const lastItemIndex = this.items.length - 1; - if (!this.isDomItemAtIndexAvailable_(lastItemIndex)) { - this.ensureDomItemsAvailableStartingAt_(lastItemIndex); + if (this.items.length > 0) { + this.ensureDomItemAvailable_(this.items.length - 1); + } + } + + ensureTemplatized_() { + // The user provided light-dom template to use when stamping DOM items. + const template = + /** @type {!HTMLTemplateElement} */ (this.querySelector('template')); + assert(template, 'Template must be provided'); + + this.instanceConstructor_ = templatize(template, this, { + parentModel: true, + instanceProps: { + 'index': true, + 'item': true, + }, + }); + } + + /** + * Create a DOM item and immediately insert it in the DOM tree. A reference is + * stored in the instances_ array for future item lifecycle operations. + * @param {number} index + * @private + */ + createAndInsertDomItem_(index) { + const instance = new this.instanceConstructor_({ + index: index, + item: this.items[index], + }); + this.instances_[index] = instance; + this.insertBefore(instance.root, this.children[index + 1]); + } + + /** + * @return {number} The average DOM item height. + * @private + */ + domItemAverageHeight_() { + // It must always be true that if this logic is invoked, there should be + // enough DOM items rendered to estimate an item average height. This is + // ensured by the logic that observes the items array. + const domItemCount = assert(this.instances_.length); + + const lastDomItem = this.lastElementChild; + return (lastDomItem.offsetTop + lastDomItem.offsetHeight) / domItemCount; + } + + /** + * Create and insert as many DOM items as necessary to ensure the item at the + * specified index is present. + * @param {number} index + * @private + */ + ensureDomItemAvailable_(index) { + const shouldUpdateHeight = this.instances_.length !== index + 1; + for (let i = this.instances_.length; i < index + 1; i++) { + this.createAndInsertDomItem_(i); + } + + if (shouldUpdateHeight) { + this.updateHeight_(); } } /** - * Ensure we have the required DOM items to fill the current view starting - * at the specified index. - * - * @param {number} idx + * @param {number} index + * @return {!Element} * @private */ - ensureDomItemsAvailableStartingAt_(idx) { - if (this.domRepeat_.items.length === this.items.length) { - return; + getDomItem_(index) { + return this.instances_[index].children[0]; + } + + /** + * @return {number} The number of items required to fill the current + * viewport. + */ + viewportItemCount_() { + return Math.ceil(this.maxHeight / this.domItemAverageHeight_()); + } + + /** + * @param {number} height + * @return {boolean} Whether DOM items were created or not. + * @private + */ + fillViewHeight_(height) { + const startTime = performance.now(); + + // Ensure we have added enough DOM items so that we are able to estimate + // item average height. + assert(this.items.length); + const initialDomItemCount = this.instances_.length; + if (initialDomItemCount === 0) { + this.createAndInsertDomItem_(0); } - const newItems = this.items.slice( - this.domRepeat_.items.length, - Math.min(idx + this.chunkItemCount, this.items.length)); - if (newItems.length > 0) { - const startTime = performance.now(); - this.domRepeat_.push('items', ...newItems); - listenOnce(this, 'dom-change', () => { - afterNextRender(this, () => { - performance.mark(`infinite_list_updated:${ - performance.now() - startTime}:benchmark_value`); - }); - }); + const desiredDomItemCount = Math.min( + Math.ceil(height / this.domItemAverageHeight_()), this.items.length); + for (let i = this.instances_.length; i < desiredDomItemCount; i++) { + this.createAndInsertDomItem_(i); } + + this.dispatchEvent( + new CustomEvent('viewport-filled', {bubbles: true, composed: true})); + + if (initialDomItemCount !== desiredDomItemCount) { + performance.mark(`infinite_list_view_updated:${ + performance.now() - startTime}:benchmark_value`); + + return true; + } + + return false; } /** @@ -137,17 +205,10 @@ * @private */ onScroll_() { - if (this.scrollTop > 0 && - this.domRepeat_.items.length !== this.items.length) { - const aboveScrollTopItemCount = - Math.round(this.scrollTop / this.domItemAverageHeight_()); - - // Ensure we have sufficient items to fill the current scroll position and - // a full view following our current position. - if (aboveScrollTopItemCount + this.chunkItemCount > - this.domRepeat_.items.length) { - this.ensureDomItemsAvailableStartingAt_(aboveScrollTopItemCount); - this.updateScrollerSize_(); + const scrollTop = this.scrollTop; + if (scrollTop > 0 && this.instances_.length !== this.items.length) { + if (this.fillViewHeight_(scrollTop + this.maxHeight)) { + this.updateHeight_(); } } } @@ -178,71 +239,154 @@ } /** - * @return {number} + * @param {number} height * @private */ - domItemAverageHeight_() { - const selector = /** @type {!IronSelectorElement} */ (this.$.selector); - if (!selector.items || selector.items.length === 0) { - return 0; + onMaxHeightChanged_(height) { + this.style.maxHeight = height + 'px'; + } + + /** + * @return {boolean} Whether a list item is selected and focused. + * @private + */ + isItemSelectedAndFocused_() { + const selectedItemIndex = this.$.selector.selected; + if (selectedItemIndex !== undefined) { + const selectedItem = this.getDomItem_(selectedItemIndex); + const deepActiveElement = getDeepActiveElement(); + + return selectedItem === deepActiveElement || + (selectedItem.shadowRoot && + selectedItem.shadowRoot.activeElement === deepActiveElement); } - const domItemCount = selector.items.length; - const lastDomItem = selector.items[domItemCount - 1]; - return (lastDomItem.offsetTop + lastDomItem.offsetHeight) / domItemCount; + return false; } /** * Ensures that when the items property changes, only a chunk of the items * needed to fill the current scroll position view are added to the DOM, thus * improving rendering performance. - * * @param {!Array} newItems * @param {!Array} oldItems * @private */ onItemsChanged_(newItems, oldItems) { - if (!this.domRepeat_) { + if (this.instanceConstructor_ === null) { return; } - if (!oldItems || oldItems.length === 0) { - this.domRepeat_.set('items', []); - this.ensureDomItemsAvailableStartingAt_(0); - listenOnce(this.$.selector, 'iron-items-changed', () => { - this.updateScrollerSize_(); - }); + if (newItems.length === 0) { + // If the new items array is empty, there is nothing to be rendered, so we + // remove any DOM items present. + this.removeDomItems_(0, this.instances_.length); + this.resetSelected_(); + } else { + const itemSelectedAndFocused = this.isItemSelectedAndFocused_(); - return; + // If we had previously rendered some DOM items, we perform a partial + // update on them. + if (oldItems.length !== 0) { + // Update no more items than currently rendered and no less than what is + // required to fill the viewport. + const count = + Math.max(this.instances_.length, this.viewportItemCount_()); + this.updateDomItems_( + newItems.slice(0, count), oldItems.slice(0, count)); + } + + this.fillViewHeight_(this.scrollTop + this.maxHeight); + + // Ensure the selected index is valid. + const selector = /** @type {!IronSelectorElement} */ (this.$.selector); + if (selector.selected >= newItems.length) { + selector.selected = newItems.length - 1; + } + + // Restore focus to the selected item if necessary. + if (itemSelectedAndFocused) { + this.getDomItem_(/** @type {number} */ (selector.selected)).focus(); + } } - updateListProperty( - this.domRepeat_, 'items', tabData => tabData, - newItems.slice( - 0, - Math.min( - Math.max(this.domRepeat_.items.length, this.chunkItemCount), - newItems.length)), - true /* identityBasedUpdate= */); - if (newItems.length !== oldItems.length) { - this.updateScrollerSize_(); + this.updateHeight_(); } } /** - * Sets the scroll height of the component based on an estimated average - * DOM item height and the total number of items. + * @param {!Array} newItems + * @param {!Array} oldItems * @private */ - updateScrollerSize_() { - if (this.$.selector.items.length !== 0) { - const estScrollHeight = this.items.length * this.domItemAverageHeight_(); - this.$.items.style.height = estScrollHeight + 'px'; + updateDomItems_(newItems, oldItems) { + // Identify the differences between the original and new list of items. + // These are represented as splice objects containing removed and added + // item information at a given index. We leverage these splices to change + // only the affected items. + const splices = calculateSplices(newItems, oldItems); + for (const splice of splices) { + // If the splice applies to indices for which there are no instances yet + // there is no need to update them yet. + if (splice.index >= this.instances_.length) { + continue; + } + + if (splice.addedCount === splice.removed.length) { + // If the number of added and removed items are equal, reuse the + // existing DOM instances and simply update their item binding. + const indexOfLastInstance = + Math.min(splice.index + splice.addedCount, this.instances_.length); + for (let i = splice.index; i < indexOfLastInstance; i++) { + this.instances_[i]['item'] = newItems[i]; + } + continue; + } + + // For simplicity, if new items have been added, we remove the no longer + // accurate template instances following the splice index and allow the + // component to ensure the viewport is full. If no items were added, we + // simply remove the no longer existing items and update any following + // template instances. + // TODO(romanarora): Introduce a DOM item reuse pool for a more + // efficient update. + const removeCount = splice.addedCount !== 0 ? + this.instances_.length - splice.index : + splice.removed.length; + this.removeDomItems_(splice.index, removeCount); } } /** + * @param {number} index + * @param {number} count + * @private + */ + removeDomItems_(index, count) { + this.instances_.splice(index, count).forEach(instance => { + this.removeChild(instance.children[0]); + }); + + // Update the index property of the items that followed the removed items. + for (let i = index; i < this.instances_.length; i++) { + this.instances_[i]['index'] = i; + } + } + + /** + * Sets the height of the component based on an estimated average DOM item + * height and the total number of items. + * @private + */ + updateHeight_() { + const estScrollHeight = this.items.length > 0 ? + this.items.length * this.domItemAverageHeight_() : + 0; + this.$.container.style.height = estScrollHeight + 'px'; + } + + /** * Ensure the scroll view can fully display a preceding or following list item * to the one selected, if existing. * @private @@ -253,35 +397,27 @@ return; } - const selectedIndex = /** @type{number} */ (selector.selected); + const selectedIndex = /** @type {number} */ (selector.selected); if (selectedIndex === 0 || selectedIndex === this.items.length - 1) { - /** @type {!Element} */ (selector.selectedItem).scrollIntoView({ - behavior: 'smooth' - }); + if (this.items.length > this.viewportItemCount_()) { + this.getDomItem_(selectedIndex).scrollIntoView({behavior: 'smooth'}); + } } else { - // If the following DOM item to the currently selected item has not yet - // been rendered, ensure it is by waiting for the next render frame - // before we scroll it into the view. - if (!this.isDomItemAtIndexAvailable_(selectedIndex + 1)) { - this.ensureDomItemsAvailableStartingAt_(selectedIndex + 1); - - afterNextRender(this, this.onSelectedChanged_); - return; - } - - const previousItem = selector.items[selector.selected - 1]; + const previousItem = this.getDomItem_(selector.selected - 1); if (previousItem.offsetTop < this.scrollTop) { - /** @type {!Element} */ (previousItem) - .scrollIntoView({behavior: 'smooth', block: 'nearest'}); + previousItem.scrollIntoView({behavior: 'smooth', block: 'nearest'}); return; } - const nextItem = - selector.items[/** @type {number} */ (selector.selected) + 1]; - if (nextItem.offsetTop + nextItem.offsetHeight > - this.scrollTop + this.offsetHeight) { - /** @type {!Element} */ (nextItem).scrollIntoView( - {behavior: 'smooth', block: 'nearest'}); + const nextItemIndex = /** @type {number} */ (selector.selected) + 1; + if (nextItemIndex < this.items.length) { + this.ensureDomItemAvailable_(nextItemIndex); + + const nextItem = this.getDomItem_(nextItemIndex); + if (nextItem.offsetTop + nextItem.offsetHeight > + this.scrollTop + this.offsetHeight) { + nextItem.scrollIntoView({behavior: 'smooth', block: 'nearest'}); + } } } } @@ -294,49 +430,53 @@ const selector = /** @type {!IronSelectorElement} */ (this.$.selector); if ((key === 'ArrowUp' && selector.selected === 0) || key === 'End') { - // If the DOM item to be selected has not yet been rendered, ensure it is - // by waiting for the next render frame. - const lastItemIndex = this.items.length - 1; - if (!this.isDomItemAtIndexAvailable_(lastItemIndex)) { - this.ensureDomItemsAvailableStartingAt_(lastItemIndex); - - afterNextRender( - this, /** @type {function(...*)} */ (this.navigate), - [key, focusItem]); - return; + this.ensureDomItemAvailable_(this.items.length - 1); + selector.selected = this.items.length - 1; + } else { + switch (key) { + case 'ArrowUp': + selector.selectPrevious(); + break; + case 'ArrowDown': + selector.selectNext(); + break; + case 'Home': + selector.selected = 0; + break; + case 'End': + this.$.selector.selected = this.items.length - 1; + break; } } - switch (key) { - case 'ArrowUp': - selector.selectPrevious(); - break; - case 'ArrowDown': - selector.selectNext(); - break; - case 'Home': - selector.selected = 0; - break; - case 'End': - this.$.selector.selected = this.items.length - 1; - break; - } - if (focusItem) { selector.selectedItem.focus({preventScroll: true}); } } + /** + * Resets the selector's selection to the undefined state. This method + * suppresses a closure validation that would require modifying the + * IronSelectableBehavior's annotations for the selected property. + * @suppress {checkTypes} + * @private + */ + resetSelected_() { + /** @type {!IronSelectorElement} */ (this.$.selector).selected = undefined; + } + /** @param {number} index */ set selected(index) { + if (index === NO_SELECTION) { + this.resetSelected_(); + return; + } + const selector = /** @type {!IronSelectorElement} */ (this.$.selector); if (index !== selector.selected) { + assert(index < this.items.length); + this.ensureDomItemAvailable_(index); selector.selected = index; - - if (index !== NO_SELECTION) { - assert(index < this.items.length); - this.ensureDomItemsAvailableStartingAt_(index); - } } }
diff --git a/chrome/browser/resources/tab_search/tab_search_item.html b/chrome/browser/resources/tab_search/tab_search_item.html index 65ad03f..ddb2e0e 100644 --- a/chrome/browser/resources/tab_search/tab_search_item.html +++ b/chrome/browser/resources/tab_search/tab_search_item.html
@@ -17,16 +17,11 @@ .button-container cr-icon-button { --cr-icon-button-fill-color: var(--mwb-icon-button-fill-color); + --cr-icon-button-focus-outline-color: transparent; border: 2px solid transparent; border-radius: 50%; } - @media (prefers-color-scheme: dark) { - .button-container cr-icon-button { - --cr-icon-button-ripple-opacity: 0.15; - } - } - .button-container cr-icon-button:hover { background-color: var(--mwb-icon-button-hover-background-color); }
diff --git a/chrome/browser/resources/tab_search/tab_search_item.js b/chrome/browser/resources/tab_search/tab_search_item.js index ef85e12..922df1b 100644 --- a/chrome/browser/resources/tab_search/tab_search_item.js +++ b/chrome/browser/resources/tab_search/tab_search_item.js
@@ -39,6 +39,9 @@ type: Boolean, value: () => loadTimeData.getBoolean('useRipples'), }, + + /** @type {number} */ + index: Number, }; }
diff --git a/chrome/browser/search_engines/android/BUILD.gn b/chrome/browser/search_engines/android/BUILD.gn index ed6edfa..715e7ea 100644 --- a/chrome/browser/search_engines/android/BUILD.gn +++ b/chrome/browser/search_engines/android/BUILD.gn
@@ -7,5 +7,51 @@ import("//chrome/browser/buildflags.gni") android_library("java") { - sources = [ "java/src/org/chromium/chrome/browser/search_engines/Dummy.java" ] + sources = [ + "java/src/org/chromium/chrome/browser/search_engines/SearchEngineChoiceMetrics.java", + "java/src/org/chromium/chrome/browser/search_engines/SearchEngineChoiceNotification.java", + "java/src/org/chromium/chrome/browser/search_engines/TemplateUrlServiceFactory.java", + "java/src/org/chromium/chrome/browser/search_engines/settings/SearchEngineAdapter.java", + "java/src/org/chromium/chrome/browser/search_engines/settings/SearchEngineSettings.java", + ] + + srcjar_deps = [ "//components/search_engines:search_engine_type_java" ] + + deps = [ + ":java_resources", + "//base:base_java", + "//base:jni_java", + "//chrome/browser/flags:java", + "//chrome/browser/omaha/android:java", + "//chrome/browser/preferences:java", + "//chrome/browser/profiles/android:java", + "//chrome/browser/ui/messages/android:java", + "//chrome/browser/version:java", + "//components/browser_ui/settings/android:java", + "//components/browser_ui/site_settings/android:java", + "//components/browser_ui/util/android:java", + "//components/content_settings/android:content_settings_enums_java", + "//components/location/android:location_java", + "//components/search_engines/android:java", + "//third_party/androidx:androidx_annotation_annotation_java", + "//third_party/androidx:androidx_fragment_fragment_java", + "//ui/android:ui_full_java", + ] + annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] + resources_package = "org.chromium.chrome.browser.search_engines" +} + +generate_jni("jni_headers") { + sources = [ "java/src/org/chromium/chrome/browser/search_engines/TemplateUrlServiceFactory.java" ] +} + +android_resources("java_resources") { + sources = [ + "java/res/layout/search_engine.xml", + "java/res/layout/search_engine_recent_title.xml", + ] + deps = [ + "//chrome/browser/ui/android/strings:ui_strings_grd", + "//components/browser_ui/styles/android:java_resources", + ] }
diff --git a/chrome/android/java/res/layout/search_engine.xml b/chrome/browser/search_engines/android/java/res/layout/search_engine.xml similarity index 100% rename from chrome/android/java/res/layout/search_engine.xml rename to chrome/browser/search_engines/android/java/res/layout/search_engine.xml
diff --git a/chrome/android/java/res/layout/search_engine_recent_title.xml b/chrome/browser/search_engines/android/java/res/layout/search_engine_recent_title.xml similarity index 100% rename from chrome/android/java/res/layout/search_engine_recent_title.xml rename to chrome/browser/search_engines/android/java/res/layout/search_engine_recent_title.xml
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/search_engines/DIR_METADATA b/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/DIR_METADATA similarity index 100% rename from chrome/android/java/src/org/chromium/chrome/browser/search_engines/DIR_METADATA rename to chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/DIR_METADATA
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/search_engines/OWNERS b/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/OWNERS similarity index 100% rename from chrome/android/java/src/org/chromium/chrome/browser/search_engines/OWNERS rename to chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/OWNERS
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/search_engines/SearchEngineChoiceMetrics.java b/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/SearchEngineChoiceMetrics.java similarity index 100% rename from chrome/android/java/src/org/chromium/chrome/browser/search_engines/SearchEngineChoiceMetrics.java rename to chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/SearchEngineChoiceMetrics.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/search_engines/SearchEngineChoiceNotification.java b/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/SearchEngineChoiceNotification.java similarity index 99% rename from chrome/android/java/src/org/chromium/chrome/browser/search_engines/SearchEngineChoiceNotification.java rename to chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/SearchEngineChoiceNotification.java index a9a93857..0a72a0c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/search_engines/SearchEngineChoiceNotification.java +++ b/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/SearchEngineChoiceNotification.java
@@ -9,7 +9,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import org.chromium.chrome.R; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.omaha.VersionNumber; import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/search_engines/TemplateUrlServiceFactory.java b/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/TemplateUrlServiceFactory.java similarity index 100% rename from chrome/android/java/src/org/chromium/chrome/browser/search_engines/TemplateUrlServiceFactory.java rename to chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/TemplateUrlServiceFactory.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/search_engines/settings/SearchEngineAdapter.java b/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/settings/SearchEngineAdapter.java similarity index 99% rename from chrome/android/java/src/org/chromium/chrome/browser/search_engines/settings/SearchEngineAdapter.java rename to chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/settings/SearchEngineAdapter.java index 66f339e..827c126b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/search_engines/settings/SearchEngineAdapter.java +++ b/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/settings/SearchEngineAdapter.java
@@ -30,8 +30,8 @@ import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.Log; import org.chromium.base.metrics.RecordUserAction; -import org.chromium.chrome.R; import org.chromium.chrome.browser.profiles.Profile; +import org.chromium.chrome.browser.search_engines.R; import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory; import org.chromium.components.browser_ui.settings.SettingsLauncher; import org.chromium.components.browser_ui.site_settings.PermissionInfo;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/search_engines/settings/SearchEngineSettings.java b/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/settings/SearchEngineSettings.java similarity index 97% rename from chrome/android/java/src/org/chromium/chrome/browser/search_engines/settings/SearchEngineSettings.java rename to chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/settings/SearchEngineSettings.java index 2a0a0b8..f619532 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/search_engines/settings/SearchEngineSettings.java +++ b/chrome/browser/search_engines/android/java/src/org/chromium/chrome/browser/search_engines/settings/SearchEngineSettings.java
@@ -11,7 +11,7 @@ import androidx.annotation.VisibleForTesting; import androidx.fragment.app.ListFragment; -import org.chromium.chrome.R; +import org.chromium.chrome.browser.search_engines.R; import org.chromium.components.browser_ui.settings.SettingsLauncher; /**
diff --git a/chrome/browser/search_engines/template_url_service_factory_android.cc b/chrome/browser/search_engines/template_url_service_factory_android.cc index 663cc47..67302cc 100644 --- a/chrome/browser/search_engines/template_url_service_factory_android.cc +++ b/chrome/browser/search_engines/template_url_service_factory_android.cc
@@ -3,8 +3,8 @@ // found in the LICENSE file. #include "base/command_line.h" -#include "chrome/android/chrome_jni_headers/TemplateUrlServiceFactory_jni.h" #include "chrome/browser/profiles/profile_manager.h" +#include "chrome/browser/search_engines/android/jni_headers/TemplateUrlServiceFactory_jni.h" #include "chrome/browser/search_engines/template_url_service_factory.h" #include "components/search_engines/template_url_service.h" #include "components/search_provider_logos/switches.h"
diff --git a/chrome/browser/shell_integration.cc b/chrome/browser/shell_integration.cc index 09573b8..0ada0d8 100644 --- a/chrome/browser/shell_integration.cc +++ b/chrome/browser/shell_integration.cc
@@ -109,7 +109,8 @@ base::CommandLine CommandLineArgsForLauncher( const GURL& url, const std::string& extension_app_id, - const base::FilePath& profile_path) { + const base::FilePath& profile_path, + const std::string& run_on_os_login_mode) { base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, base::BlockingType::MAY_BLOCK); base::CommandLine new_cmd_line(base::CommandLine::NO_PROGRAM); @@ -129,6 +130,12 @@ // Note: Do not change this flag! Old Gears shortcuts will break if you do! new_cmd_line.AppendSwitchASCII(switches::kApp, url.spec()); } + + if (!run_on_os_login_mode.empty()) { + new_cmd_line.AppendSwitchASCII(switches::kAppRunOnOsLoginMode, + run_on_os_login_mode); + } + return new_cmd_line; }
diff --git a/chrome/browser/shell_integration.h b/chrome/browser/shell_integration.h index 63d4e587..46d728c 100644 --- a/chrome/browser/shell_integration.h +++ b/chrome/browser/shell_integration.h
@@ -125,7 +125,8 @@ base::CommandLine CommandLineArgsForLauncher( const GURL& url, const std::string& extension_app_id, - const base::FilePath& profile_path); + const base::FilePath& profile_path, + const std::string& run_on_os_login_mode); // Append command line arguments for launching a new chrome.exe process // based on the current process.
diff --git a/chrome/browser/shell_integration_linux.cc b/chrome/browser/shell_integration_linux.cc index c377440d..95483508 100644 --- a/chrome/browser/shell_integration_linux.cc +++ b/chrome/browser/shell_integration_linux.cc
@@ -501,9 +501,10 @@ const base::FilePath& profile_path, const std::string& categories, const std::string& mime_type, - bool no_display) { + bool no_display, + const std::string& run_on_os_login_mode) { base::CommandLine cmd_line = shell_integration::CommandLineArgsForLauncher( - url, extension_id, profile_path); + url, extension_id, profile_path, run_on_os_login_mode); cmd_line.SetProgram(chrome_exe_path); return GetDesktopFileContentsForCommand(cmd_line, app_name, url, title, icon_name, categories, mime_type,
diff --git a/chrome/browser/shell_integration_linux.h b/chrome/browser/shell_integration_linux.h index ac787c35..6f8b70d 100644 --- a/chrome/browser/shell_integration_linux.h +++ b/chrome/browser/shell_integration_linux.h
@@ -73,7 +73,8 @@ const base::FilePath& profile_path, const std::string& categories, const std::string& mime_type, - bool no_display); + bool no_display, + const std::string& run_on_os_login_mode); // Returns contents for .desktop file that executes command_line. This is a more // general form of GetDesktopFileContents. If |no_display| is true, the shortcut
diff --git a/chrome/browser/shell_integration_linux_unittest.cc b/chrome/browser/shell_integration_linux_unittest.cc index c6bedb0b..9f1623f 100644 --- a/chrome/browser/shell_integration_linux_unittest.cc +++ b/chrome/browser/shell_integration_linux_unittest.cc
@@ -459,7 +459,7 @@ GURL(test_cases[i].url), std::string(), base::ASCIIToUTF16(test_cases[i].title), test_cases[i].icon_name, base::FilePath(), test_cases[i].categories, test_cases[i].mime_type, - test_cases[i].nodisplay)); + test_cases[i].nodisplay, "")); } }
diff --git a/chrome/browser/shell_integration_win_unittest.cc b/chrome/browser/shell_integration_win_unittest.cc index f53e0d3f..ae3a045 100644 --- a/chrome/browser/shell_integration_win_unittest.cc +++ b/chrome/browser/shell_integration_win_unittest.cc
@@ -329,7 +329,7 @@ temp_properties.set_target(web_app::GetChromeProxyPath()); temp_properties.set_app_id(L"Dumbo3.Default"); base::CommandLine cmd_line = shell_integration::CommandLineArgsForLauncher( - GURL(), base::WideToUTF8(extension_id_), base::FilePath()); + GURL(), base::WideToUTF8(extension_id_), base::FilePath(), ""); ASSERT_EQ(cmd_line.GetCommandLineString(), L" --app-id=" + extension_id_); temp_properties.set_arguments(cmd_line.GetCommandLineString()); ASSERT_NO_FATAL_FAILURE( @@ -340,8 +340,8 @@ temp_properties.set_target(web_app::GetChromeProxyPath()); temp_properties.set_app_id(L"Dumbo4.Default"); GURL url("http://www.example.com"); - cmd_line = shell_integration::CommandLineArgsForLauncher(url, std::string(), - base::FilePath()); + cmd_line = shell_integration::CommandLineArgsForLauncher( + url, std::string(), base::FilePath(), ""); ASSERT_EQ(cmd_line.GetCommandLineString(), L" --app=http://www.example.com/"); temp_properties.set_arguments(cmd_line.GetCommandLineString()); ASSERT_NO_FATAL_FAILURE(
diff --git a/chrome/browser/speech/network_speech_recognizer.cc b/chrome/browser/speech/network_speech_recognizer.cc index e27ec82c..a048c021 100644 --- a/chrome/browser/speech/network_speech_recognizer.cc +++ b/chrome/browser/speech/network_speech_recognizer.cc
@@ -125,12 +125,9 @@ locale_(locale), session_(kInvalidSessionId) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - NotifyRecognitionStateChanged(SPEECH_RECOGNIZER_READY); } NetworkSpeechRecognizer::EventListener::~EventListener() { - // No more callbacks when we are deleting. - delegate_.reset(); DCHECK(!speech_timeout_.IsRunning()); } @@ -256,7 +253,7 @@ const blink::mojom::SpeechRecognitionError& error) { StopOnIOThread(); if (error.code == blink::mojom::SpeechRecognitionErrorCode::kNetwork) { - NotifyRecognitionStateChanged(SPEECH_RECOGNIZER_ERROR); + NotifyRecognitionStateChanged(SPEECH_RECOGNIZER_NETWORK_ERROR); } NotifyRecognitionStateChanged(SPEECH_RECOGNIZER_READY); } @@ -313,8 +310,6 @@ NetworkSpeechRecognizer::~NetworkSpeechRecognizer() { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - // Reset the delegate before calling Stop() to avoid any additional callbacks. - delegate().reset(); Stop(); }
diff --git a/chrome/browser/speech/network_speech_recognizer_browsertest.cc b/chrome/browser/speech/network_speech_recognizer_browsertest.cc index aa1f33ec..a8b359c8 100644 --- a/chrome/browser/speech/network_speech_recognizer_browsertest.cc +++ b/chrome/browser/speech/network_speech_recognizer_browsertest.cc
@@ -26,8 +26,8 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" -using ::testing::DoDefault; using ::testing::InvokeWithoutArgs; +using ::testing::Return; class MockSpeechRecognizerDelegate : public SpeechRecognizerDelegate { public: @@ -86,26 +86,13 @@ ->GetURLLoaderFactoryForBrowserProcessIOThread(), "en" /* accept_language */, "en" /* locale */); - testing::InSequence seq; - base::RunLoop run_loop; EXPECT_CALL(*mock_speech_delegate_, - OnSpeechRecognitionStateChanged(SPEECH_RECOGNIZER_READY)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*mock_speech_delegate_, - OnSpeechRecognitionStateChanged(SPEECH_RECOGNIZER_RECOGNIZING)) - .Times(1); - EXPECT_CALL(*mock_speech_delegate_, - OnSpeechRecognitionStateChanged(SPEECH_RECOGNIZER_IN_SPEECH)) - .Times(1); - EXPECT_CALL(*mock_speech_delegate_, OnSpeechResult(base::ASCIIToUTF16("Pictures of the moon"), true, testing::_)); EXPECT_CALL(*mock_speech_delegate_, OnSpeechRecognitionStateChanged(SPEECH_RECOGNIZER_READY)) - .WillOnce(InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit)) - .RetiresOnSaturation(); + .WillOnce(InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit)); recognizer.Start(); run_loop.Run(); }
diff --git a/chrome/browser/speech/on_device_speech_recognizer.cc b/chrome/browser/speech/on_device_speech_recognizer.cc index 2d9fc53..0a5513d 100644 --- a/chrome/browser/speech/on_device_speech_recognizer.cc +++ b/chrome/browser/speech/on_device_speech_recognizer.cc
@@ -4,100 +4,20 @@ #include "chrome/browser/speech/on_device_speech_recognizer.h" -#include "base/strings/utf_string_conversions.h" -#include "chrome/browser/accessibility/soda_installer.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/speech/cros_speech_recognition_service.h" -#include "chrome/browser/speech/cros_speech_recognition_service_factory.h" #include "chrome/browser/speech/speech_recognizer_delegate.h" -#include "content/public/browser/audio_service.h" -#include "content/public/browser/browser_thread.h" -#include "media/base/bind_to_current_loop.h" -#include "media/base/media_switches.h" bool OnDeviceSpeechRecognizer::IsOnDeviceSpeechRecognizerAvailable() { - // IsSodaInstalled will DCHECK if kUseSodaForLiveCaption is disabled. - // kUseSodaForLiveCaption is used to track SODA availability on-device. - return base::FeatureList::IsEnabled(media::kUseSodaForLiveCaption) && - speech::SodaInstaller::GetInstance()->IsSodaInstalled(); + return false; } OnDeviceSpeechRecognizer::OnDeviceSpeechRecognizer( - const base::WeakPtr<SpeechRecognizerDelegate>& delegate, - Profile* profile) - : SpeechRecognizer(delegate), - state_(SpeechRecognizerStatus::SPEECH_RECOGNIZER_OFF) { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - - // Connect the SpeechRecognitionContext. - mojo::PendingReceiver<media::mojom::SpeechRecognitionContext> - speech_recognition_context_receiver = - speech_recognition_context_.BindNewPipeAndPassReceiver(); - - // Bind to an AudioSourceFetcher in the Speech Recognition service, - // passing the stream factory so it can listen to mic audio. - // TODO(crbug.com/1173135): Get input stream parameters from - // content::CreateAudioSystemForAudioService() if possible, and pass this - // and device_id to the AudioSourceFetcher in BindAudioSourceFetcher(). - mojo::PendingRemote<media::mojom::AudioStreamFactory> stream_factory; - content::GetAudioServiceStreamFactoryBinder().Run( - stream_factory.InitWithNewPipeAndPassReceiver()); - speech_recognition_context_->BindAudioSourceFetcher( - audio_source_fetcher_.BindNewPipeAndPassReceiver(), - speech_recognition_client_receiver_.BindNewPipeAndPassRemote(), - std::move(stream_factory), - media::BindToCurrentLoop( - base::BindOnce(&OnDeviceSpeechRecognizer::OnRecognizerBound, - weak_factory_.GetWeakPtr()))); - - CrosSpeechRecognitionServiceFactory::GetForProfile(profile)->Create( - std::move(speech_recognition_context_receiver)); - - speech_recognition_context_.set_disconnect_handler(media::BindToCurrentLoop( - base::BindOnce(&OnDeviceSpeechRecognizer::OnRecognizerDisconnected, - weak_factory_.GetWeakPtr()))); -} + const base::WeakPtr<SpeechRecognizerDelegate>& delegate) + : SpeechRecognizer(delegate) {} OnDeviceSpeechRecognizer::~OnDeviceSpeechRecognizer() { - audio_source_fetcher_->Stop(); - audio_source_fetcher_.reset(); - speech_recognition_client_receiver_.reset(); - speech_recognition_context_.reset(); + Stop(); } -void OnDeviceSpeechRecognizer::Start() { - // TODO(crbug.com/1173135): Call audio_source_fetcher_->Start(); - UpdateStatus(SpeechRecognizerStatus::SPEECH_RECOGNIZER_RECOGNIZING); -} +void OnDeviceSpeechRecognizer::Start() {} -void OnDeviceSpeechRecognizer::Stop() { - audio_source_fetcher_->Stop(); - UpdateStatus(SpeechRecognizerStatus::SPEECH_RECOGNIZER_READY); -} - -void OnDeviceSpeechRecognizer::OnSpeechRecognitionRecognitionEvent( - media::mojom::SpeechRecognitionResultPtr result) { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - if (!result->transcription.size()) - return; - UpdateStatus(SpeechRecognizerStatus::SPEECH_RECOGNIZER_IN_SPEECH); - delegate()->OnSpeechResult(base::UTF8ToUTF16(result->transcription), - result->is_final, base::nullopt); -} - -void OnDeviceSpeechRecognizer::OnRecognizerBound(bool success) { - if (success) - UpdateStatus(SpeechRecognizerStatus::SPEECH_RECOGNIZER_READY); -} - -void OnDeviceSpeechRecognizer::OnRecognizerDisconnected() { - UpdateStatus(SpeechRecognizerStatus::SPEECH_RECOGNIZER_ERROR); -} - -void OnDeviceSpeechRecognizer::UpdateStatus(SpeechRecognizerStatus state) { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - if (state_ == state) - return; - delegate()->OnSpeechRecognitionStateChanged(state); - state_ = state; -} +void OnDeviceSpeechRecognizer::Stop() {}
diff --git a/chrome/browser/speech/on_device_speech_recognizer.h b/chrome/browser/speech/on_device_speech_recognizer.h index 3bcf1bd..34c139d 100644 --- a/chrome/browser/speech/on_device_speech_recognizer.h +++ b/chrome/browser/speech/on_device_speech_recognizer.h
@@ -5,33 +5,22 @@ #ifndef CHROME_BROWSER_SPEECH_ON_DEVICE_SPEECH_RECOGNIZER_H_ #define CHROME_BROWSER_SPEECH_ON_DEVICE_SPEECH_RECOGNIZER_H_ -#include <memory> - -#include "base/memory/weak_ptr.h" #include "chrome/browser/speech/speech_recognizer.h" -#include "chrome/browser/speech/speech_recognizer_delegate.h" -#include "media/mojo/mojom/speech_recognition_service.mojom.h" -class Profile; class SpeechRecognizerDelegate; // OnDeviceSpeechRecognizer is a wrapper around the on-device speech recognition // engine that simplifies its use from the browser process. -class OnDeviceSpeechRecognizer - : public SpeechRecognizer, - public media::mojom::SpeechRecognitionRecognizerClient { +class OnDeviceSpeechRecognizer : public SpeechRecognizer { public: // Returns true if on-device speech recognition is available and installed // on-device. - // TODO(crbug.com/1173135): Language pack availability is based on the current - // profile language settings, and currently based on kLiveCaptionLanguageCode - // which is hard-coded to en-us. IsOnDeviceSpeechRecognizerAvailable should - // take a language code to check. + // TODO(katie): Might need to take a language/locale parameter once we know + // how to check for per-language downloads. static bool IsOnDeviceSpeechRecognizerAvailable(); - OnDeviceSpeechRecognizer( - const base::WeakPtr<SpeechRecognizerDelegate>& delegate, - Profile* profile); + explicit OnDeviceSpeechRecognizer( + const base::WeakPtr<SpeechRecognizerDelegate>& delegate); ~OnDeviceSpeechRecognizer() override; OnDeviceSpeechRecognizer(const OnDeviceSpeechRecognizer&) = delete; OnDeviceSpeechRecognizer& operator=(const OnDeviceSpeechRecognizer&) = delete; @@ -40,28 +29,6 @@ // Start and Stop must be called on the UI thread. void Start() override; void Stop() override; - - // media::mojom::SpeechRecognitionRecognizerClient: - void OnSpeechRecognitionRecognitionEvent( - media::mojom::SpeechRecognitionResultPtr result) override; - - private: - void OnRecognizerBound(bool success); - void OnRecognizerDisconnected(); - - // Helper function to send the delegate updates to SpeechRecognizerStatus - // only when the status has changed. - void UpdateStatus(SpeechRecognizerStatus state); - - SpeechRecognizerStatus state_; - - mojo::Remote<media::mojom::SpeechRecognitionContext> - speech_recognition_context_; - mojo::Remote<media::mojom::AudioSourceFetcher> audio_source_fetcher_; - mojo::Receiver<media::mojom::SpeechRecognitionRecognizerClient> - speech_recognition_client_receiver_{this}; - - base::WeakPtrFactory<OnDeviceSpeechRecognizer> weak_factory_{this}; }; #endif // CHROME_BROWSER_SPEECH_ON_DEVICE_SPEECH_RECOGNIZER_H_
diff --git a/chrome/browser/speech/speech_recognition_service_browsertest.cc b/chrome/browser/speech/speech_recognition_service_browsertest.cc index 31b0f8f9..8ef4915 100644 --- a/chrome/browser/speech/speech_recognition_service_browsertest.cc +++ b/chrome/browser/speech/speech_recognition_service_browsertest.cc
@@ -264,11 +264,10 @@ profile_prefs->SetBoolean(prefs::kLiveCaptionEnabled, true); LaunchServiceWithAudioSourceFetcher(); - // Ensure no crashes. - // TODO(crbug.com/1173135): Try to mock audio input, maybe with - // FakeStreamFactory, to test end-to-end. + // TODO(crbug.com/1173135): Test mock audio input for AudioSourceFetcher. + // Currently a sanity check as nothing happens yet. + audio_source_fetcher_->Start(); audio_source_fetcher_->Stop(); - base::RunLoop().RunUntilIdle(); }
diff --git a/chrome/browser/speech/speech_recognizer_delegate.h b/chrome/browser/speech/speech_recognizer_delegate.h index f6f3e98b..dc24ec7 100644 --- a/chrome/browser/speech/speech_recognizer_delegate.h +++ b/chrome/browser/speech/speech_recognizer_delegate.h
@@ -14,14 +14,11 @@ // Requires cleanup. See crbug.com/800374. enum SpeechRecognizerStatus { SPEECH_RECOGNIZER_OFF = 0, - // Ready for SpeechRecognizer::Start() to be called. SPEECH_RECOGNIZER_READY, - // Beginning to listen for speech, but have not received any yet. SPEECH_RECOGNIZER_RECOGNIZING, - // Sounds are being recognized. SPEECH_RECOGNIZER_IN_SPEECH, - // There was an error. - SPEECH_RECOGNIZER_ERROR, + SPEECH_RECOGNIZER_STOPPING, + SPEECH_RECOGNIZER_NETWORK_ERROR, }; // Delegate for speech recognizer. All methods are called from the thread on
diff --git a/chrome/browser/ssl/typed_navigation_upgrade_throttle_browsertest.cc b/chrome/browser/ssl/typed_navigation_upgrade_throttle_browsertest.cc index 6a1771c..8df409e 100644 --- a/chrome/browser/ssl/typed_navigation_upgrade_throttle_browsertest.cc +++ b/chrome/browser/ssl/typed_navigation_upgrade_throttle_browsertest.cc
@@ -16,6 +16,7 @@ #include "chrome/test/base/interactive_test_utils.h" #include "chrome/test/base/ui_test_utils.h" #include "components/omnibox/browser/omnibox_edit_model.h" +#include "components/omnibox/browser/omnibox_popup_model.h" #include "components/omnibox/common/omnibox_features.h" #include "components/security_interstitials/content/ssl_error_handler.h" #include "content/public/browser/web_contents.h" @@ -320,11 +321,32 @@ } private: + void WaitForAutocompleteControllerDone() { + AutocompleteController* controller = + omnibox()->model()->autocomplete_controller(); + ASSERT_TRUE(controller); + + if (controller->done()) + return; + + ui_test_utils::WaitForAutocompleteDone(browser()); + ASSERT_TRUE(controller->done()); + } + void TypeUrlAndCheckNavigation(const std::string& url_without_scheme, const base::HistogramTester& histograms, NavigationExpectation expectation, size_t num_expected_navigations) { SetOmniboxText(url_without_scheme); + // Regression check for crbug.com/1184872: The first autocomplete result + // should be the same as the typed text, without a scheme. + OmniboxPopupModel* popup_model = omnibox()->model()->popup_model(); + ASSERT_TRUE(popup_model); + WaitForAutocompleteControllerDone(); + ASSERT_TRUE(popup_model->IsOpen()); + EXPECT_EQ(base::UTF8ToUTF16(url_without_scheme), + popup_model->result().match_at(0).fill_into_edit); + PressEnterAndWaitForNavigations(num_expected_navigations); ui_test_utils::HistoryEnumerator enumerator(browser()->profile());
diff --git a/chrome/browser/sync/test/integration/two_client_web_apps_integration_sync_test.cc b/chrome/browser/sync/test/integration/two_client_web_apps_integration_sync_test.cc index 35a1824..b3f2eceb 100644 --- a/chrome/browser/sync/test/integration/two_client_web_apps_integration_sync_test.cc +++ b/chrome/browser/sync/test/integration/two_client_web_apps_integration_sync_test.cc
@@ -63,6 +63,8 @@ return SyncTest::GetAllProfiles(); } + bool IsSyncTest() override { return true; } + bool UserSigninInternal() override { return SyncTest::SetupSync(); } void TurnSyncOff() override { @@ -196,6 +198,10 @@ } }; +// This test is a part of the web app integration test suite, which is +// documented in //chrome/browser/ui/views/web_apps/README.md. For information +// about diagnosing, debugging and/or disabling tests, please look to the +// README file. IN_PROC_BROWSER_TEST_P(TwoClientWebAppsIntegrationSyncTest, Default) { helper_.ParseParams(GetParam());
diff --git a/chrome/browser/tab/BUILD.gn b/chrome/browser/tab/BUILD.gn index c169fc8..99b4a6c4 100644 --- a/chrome/browser/tab/BUILD.gn +++ b/chrome/browser/tab/BUILD.gn
@@ -10,6 +10,8 @@ sources = [ "java/src/org/chromium/chrome/browser/tab/CurrentTabObserver.java", "java/src/org/chromium/chrome/browser/tab/EmptyTabObserver.java", + "java/src/org/chromium/chrome/browser/tab/SadTab.java", + "java/src/org/chromium/chrome/browser/tab/SadTabView.java", "java/src/org/chromium/chrome/browser/tab/Tab.java", "java/src/org/chromium/chrome/browser/tab/TabAttributeKeys.java", "java/src/org/chromium/chrome/browser/tab/TabAttributes.java", @@ -45,12 +47,17 @@ "java/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabData.java", ] - # TabSelectionType, TabLaunchType - srcjar_deps = [ "//chrome/browser/ui:tab_model_enums_java" ] + srcjar_deps = [ + # TabSelectionType, TabLaunchType + "//chrome/browser/ui:tab_model_enums_java", + + # SadTabEvent + "//components/ui_metrics:ui_metrics_enums_java", + ] deps = [ ":critical_persisted_tab_data_proto_java", - "//base:base_java", + ":java_resources", "//base:base_java", "//base:jni_java", "//chrome/browser/android/crypto:java", @@ -61,6 +68,7 @@ "//chrome/browser/page_annotations/android:java", "//chrome/browser/profiles/android:java", "//chrome/browser/ui/android/native_page:java", + "//chrome/browser/ui/android/strings:ui_strings_grd", "//components/browser_ui/util/android:java", "//components/embedder_support/android:browser_context_java", "//components/embedder_support/android:content_view_java", @@ -73,6 +81,7 @@ "//components/payments/content/android:java", "//components/security_state/content/android:java", "//components/security_state/core:security_state_enums_java", + "//components/strings:components_strings_grd", "//content/public/android:content_java", "//net/android:net_java", "//third_party/android_deps:protobuf_lite_runtime_java", @@ -84,6 +93,19 @@ ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] + resources_package = "org.chromium.chrome.browser.tab" +} + +android_resources("java_resources") { + sources = [ + "java/res/drawable-hdpi/sad_tab.png", + "java/res/drawable-mdpi/sad_tab.png", + "java/res/drawable-xhdpi/sad_tab.png", + "java/res/drawable-xxhdpi/sad_tab.png", + "java/res/drawable-xxxhdpi/sad_tab.png", + "java/res/layout/sad_tab.xml", + ] + deps = [ "//ui/android:ui_java_resources" ] } generate_jni("jni_headers") {
diff --git a/chrome/android/java/res/drawable-hdpi/sad_tab.png b/chrome/browser/tab/java/res/drawable-hdpi/sad_tab.png similarity index 100% rename from chrome/android/java/res/drawable-hdpi/sad_tab.png rename to chrome/browser/tab/java/res/drawable-hdpi/sad_tab.png Binary files differ
diff --git a/chrome/android/java/res/drawable-mdpi/sad_tab.png b/chrome/browser/tab/java/res/drawable-mdpi/sad_tab.png similarity index 100% rename from chrome/android/java/res/drawable-mdpi/sad_tab.png rename to chrome/browser/tab/java/res/drawable-mdpi/sad_tab.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xhdpi/sad_tab.png b/chrome/browser/tab/java/res/drawable-xhdpi/sad_tab.png similarity index 100% rename from chrome/android/java/res/drawable-xhdpi/sad_tab.png rename to chrome/browser/tab/java/res/drawable-xhdpi/sad_tab.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xxhdpi/sad_tab.png b/chrome/browser/tab/java/res/drawable-xxhdpi/sad_tab.png similarity index 100% rename from chrome/android/java/res/drawable-xxhdpi/sad_tab.png rename to chrome/browser/tab/java/res/drawable-xxhdpi/sad_tab.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xxxhdpi/sad_tab.png b/chrome/browser/tab/java/res/drawable-xxxhdpi/sad_tab.png similarity index 100% rename from chrome/android/java/res/drawable-xxxhdpi/sad_tab.png rename to chrome/browser/tab/java/res/drawable-xxxhdpi/sad_tab.png Binary files differ
diff --git a/chrome/android/java/res/layout/sad_tab.xml b/chrome/browser/tab/java/res/layout/sad_tab.xml similarity index 92% rename from chrome/android/java/res/layout/sad_tab.xml rename to chrome/browser/tab/java/res/layout/sad_tab.xml index 59805d88..040818de 100644 --- a/chrome/android/java/res/layout/sad_tab.xml +++ b/chrome/browser/tab/java/res/layout/sad_tab.xml
@@ -8,9 +8,10 @@ <org.chromium.chrome.browser.tab.SadTabView xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:ignore="Overdraw" - android:background="#f7f7f7" + android:background="@color/modern_grey_100" android:fillViewport="true" android:layout_width="match_parent" android:layout_height="match_parent" @@ -36,13 +37,13 @@ tools:ignore="ContentDescription" android:layout_gravity="start" /> - <TextView + <org.chromium.ui.widget.TextViewWithLeading android:id="@+id/sad_tab_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingBottom="16dp" android:textAppearance="@style/TextAppearance.Headline.Primary" - android:lineSpacingMultiplier="1.4" + app:leading="@dimen/text_size_large_leading" android:layout_gravity="start" /> <TextView
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/DEPS b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/DEPS index e5466e07..898a922 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/DEPS +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/DEPS
@@ -19,7 +19,9 @@ "+components/security_state/content/android/java", "+content/public/android/java/src/org/chromium/content_public", "+ui/android/java/src/org/chromium/ui/base", + "+ui/android/java/src/org/chromium/ui/text", "+ui/android/java/src/org/chromium/ui/util", + "+ui/android/java/src/org/chromium/ui/widget", "+url/android/java", ]
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/SadTab.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/SadTab.java similarity index 86% rename from chrome/android/java/src/org/chromium/chrome/browser/tab/SadTab.java rename to chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/SadTab.java index 372d37bd..821e7eeb 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/SadTab.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/SadTab.java
@@ -4,7 +4,6 @@ package org.chromium.chrome.browser.tab; -import android.app.Activity; import android.content.Context; import android.text.SpannableString; import android.text.SpannableStringBuilder; @@ -20,9 +19,6 @@ import org.chromium.base.UserData; import org.chromium.base.metrics.RecordHistogram; -import org.chromium.chrome.R; -import org.chromium.chrome.browser.feedback.HelpAndFeedbackLauncherImpl; -import org.chromium.chrome.browser.profiles.Profile; import org.chromium.components.ui_metrics.SadTabEvent; import org.chromium.content_public.browser.LoadUrlParams; import org.chromium.ui.text.NoUnderlineClickableSpan; @@ -34,11 +30,12 @@ /** * Represent the sad tab displayed in place of a crashed renderer. Instantiated on the first * |show()| request from a Tab, and destroyed together with it. + * TODO(crbug.com/1161348): Consider moving this to its own target. */ public class SadTab extends EmptyTabObserver implements UserData, TabViewProvider { private static final Class<SadTab> USER_DATA_KEY = SadTab.class; - private final TabImpl mTab; + private final Tab mTab; private View mView; @@ -68,55 +65,35 @@ @VisibleForTesting public SadTab(Tab tab) { - mTab = (TabImpl) tab; + mTab = tab; mTab.addObserver(this); } /** * Constructs and shows a sad tab (Aw, Snap!). */ - public void show() { + public void show(Context context, Runnable suggestionAction, Runnable buttonAction) { if (mTab.getWebContents() == null) return; // Make sure we are not adding the "Aw, snap" view over an existing one. assert mView == null; - - // If the tab has crashed twice in a row change the sad tab view to the "Send Feedback" - // version and change the onClickListener. - final boolean showSendFeedbackView = mSadTabSuccessiveRefreshCounter >= 1; - - Runnable suggestionAction = new Runnable() { - @Override - public void run() { - Activity activity = mTab.getWindowAndroid().getActivity().get(); - assert activity != null; - HelpAndFeedbackLauncherImpl.getInstance().show(activity, - activity.getString(R.string.help_context_sad_tab), - Profile.fromWebContents(mTab.getWebContents()), null); - } - }; - - Runnable buttonAction = new Runnable() { - @Override - public void run() { - if (showSendFeedbackView) { - Profile profile = Profile.fromWebContents(mTab.getWebContents()); - mTab.getActivity().startHelpAndFeedback( - mTab.getUrlString(), "MobileSadTabFeedback", profile); - } else { - mTab.reload(); - } - } - }; - - mView = createView( - suggestionAction, buttonAction, showSendFeedbackView, mTab.isIncognito()); + mView = createView(context, suggestionAction, buttonAction, showSendFeedbackView(), + mTab.isIncognito()); mSadTabSuccessiveRefreshCounter++; mTab.getTabViewManager().addTabViewProvider(this); } /** + * @return {@code true} if we should show 'Send Feedback'. + */ + public boolean showSendFeedbackView() { + // If the tab has crashed twice in a row change the sad tab view to the "Send Feedback" + // version and change the onClickListener. + return mSadTabSuccessiveRefreshCounter >= 1; + } + + /** * Removes the sad tab view if present. */ @VisibleForTesting @@ -159,6 +136,7 @@ } /** + * @param context Context this sad tab is shown with. * @param suggestionAction {@link Runnable} to be executed when user clicks "try these * suggestions". * @param buttonAction {@link Runnable} to be executed when the button is pressed. @@ -167,10 +145,8 @@ * @param isIncognito Whether the Sad Tab view is being showin in an incognito tab. * @return A {@link View} instance which is used in place of a crashed renderer. */ - protected View createView(final Runnable suggestionAction, Runnable buttonAction, - boolean showSendFeedbackView, boolean isIncognito) { - Context context = mTab.getThemedApplicationContext(); - + protected View createView(Context context, final Runnable suggestionAction, + Runnable buttonAction, boolean showSendFeedbackView, boolean isIncognito) { // Inflate Sad tab and initialize. LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/SadTabView.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/SadTabView.java similarity index 98% rename from chrome/android/java/src/org/chromium/chrome/browser/tab/SadTabView.java rename to chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/SadTabView.java index 924edc95..bb7b2809 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/SadTabView.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/SadTabView.java
@@ -10,14 +10,12 @@ import android.widget.LinearLayout; import android.widget.ScrollView; -import org.chromium.chrome.R; import org.chromium.ui.widget.ButtonCompat; /** * View that handles orientation changes for Sad Tab / Crashed Renderer page. */ public class SadTabView extends ScrollView { - // Dimension (dp) at which reload button is dynamically sized and content centers private static final int MAX_BUTTON_WIDTH_DP = 620; private int mThresholdPx;
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabData.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabData.java index 105e07b..f40d898 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabData.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabData.java
@@ -152,7 +152,7 @@ /** * Acquire {@link CriticalPersistedTabData} from a {@link Tab} or create if it doesn't exist - * @param corresponding {@link Tab} for which {@link CriticalPersistedTabData} is sought + * @param tab corresponding {@link Tab} for which {@link CriticalPersistedTabData} is sought * @return acquired or created {@link CriticalPersistedTabData} */ public static CriticalPersistedTabData from(Tab tab) { @@ -528,7 +528,7 @@ } /** - * set the timetsamp + * Set the timestamp. * @param timestamp the timestamp */ public void setTimestampMillis(long timestamp) { @@ -536,6 +536,9 @@ return; } mTimestampMillis = timestamp; + for (CriticalPersistedTabDataObserver observer : mObservers) { + observer.onTimestampChanged(mTab, timestamp); + } save(); }
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabDataObserver.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabDataObserver.java index a4c3ba2..707004b 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabDataObserver.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabDataObserver.java
@@ -16,4 +16,11 @@ * @param newRootId new value of new root id */ default void onRootIdChanged(Tab tab, int newRootId) {} + + /** + * Broadcast that the timestamp on a {@link Tab} has changed + * @param tab {@link Tab} timestamp has changed on + * @param timestampMillis new value of the timestamp + */ + default void onTimestampChanged(Tab tab, long timestampMillis) {} }
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 68cd35d..2245563 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -1790,6 +1790,13 @@ "app_list/search/arc/arc_playstore_search_provider.h", "app_list/search/arc/arc_playstore_search_result.cc", "app_list/search/arc/arc_playstore_search_result.h", + "app_list/search/arc/fake_recommend_apps_fetcher_delegate.cc", + "app_list/search/arc/fake_recommend_apps_fetcher_delegate.h", + "app_list/search/arc/recommend_apps_fetcher.cc", + "app_list/search/arc/recommend_apps_fetcher.h", + "app_list/search/arc/recommend_apps_fetcher_delegate.h", + "app_list/search/arc/recommend_apps_fetcher_impl.cc", + "app_list/search/arc/recommend_apps_fetcher_impl.h", "app_list/search/assistant_search_provider.cc", "app_list/search/assistant_search_provider.h", "app_list/search/assistant_text_search_provider.cc",
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb index 067651a..ac6fdad 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">Maak oortjie toe</translation> <translation id="5213672942202814946">Gebruik stemsoektog</translation> <translation id="5222676887888702881">Meld af</translation> +<translation id="5227554086496586518">Tik om soekresultate te sien</translation> <translation id="5230560987958996918"><ph name="SITE" /> wil vir Bluetooth-toestelle in die omtrek soek. Die volgende toestelle is gekry:</translation> <translation id="5233638681132016545">Nuwe oortjie</translation> <translation id="5250483651202458397">Skermkiekie. Tik om toe te maak.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb index b770540..e9f71a5 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">ትር ዝጋ</translation> <translation id="5213672942202814946">የድምፅ ፍለጋን ተጠቀም</translation> <translation id="5222676887888702881">ዘግተህ ውጣ</translation> +<translation id="5227554086496586518">የፍለጋ ውጤቶችን ለማየት መታ ያድርጉ</translation> <translation id="5230560987958996918"><ph name="SITE" /> በአቅራቢያ የብሉቱዝ መሣሪያዎች ካሉ መቃኘት ይፈልጋል። የሚከተሉት መሣሪያዎች ተገኝተዋል፦</translation> <translation id="5233638681132016545">አዲስ ትር</translation> <translation id="5250483651202458397">ቅጽበታዊ ገጽ እይታ። ለመዝጋት መታ ያድርጉ።</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb index 4bf58a1..5faa402 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">إغلاق علامة التبويب</translation> <translation id="5213672942202814946">استخدام ميزة "البحث الصوتي"</translation> <translation id="5222676887888702881">تسجيل الخروج</translation> +<translation id="5227554086496586518">انقر للاطّلاع على نتائج البحث.</translation> <translation id="5230560987958996918">يريد <ph name="SITE" /> البحث عن أجهزة البلوتوث المجاورة. وتم العثور على الأجهزة التالية:</translation> <translation id="5233638681132016545">علامة تبويب جديدة</translation> <translation id="5250483651202458397">انقر لإغلاق لقطة الشاشة.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb index 5114fc4..d679264a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">Затваряне на раздела</translation> <translation id="5213672942202814946">Ползване на гласово търсене</translation> <translation id="5222676887888702881">Изход</translation> +<translation id="5227554086496586518">Докоснете, за да видите резултатите от търсенето</translation> <translation id="5230560987958996918"><ph name="SITE" /> иска да сканира за устройства с Bluetooth в близост. Намерени са следните:</translation> <translation id="5233638681132016545">Нов раздел</translation> <translation id="5250483651202458397">Екранна снимка. Докоснете за затваряне.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb index 420d8cb2..0f2d5c0 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">Zatvorite karticu.</translation> <translation id="5213672942202814946">Koristite glasovno pretraživanje</translation> <translation id="5222676887888702881">Odjava</translation> +<translation id="5227554086496586518">Dodirnite da vidite rezultate pretraživanja</translation> <translation id="5230560987958996918">Web lokacija <ph name="SITE" /> želi skenirati Bluetooth uređaje u blizini. Pronađeni su sljedeći uređaji:</translation> <translation id="5233638681132016545">Nova kartica</translation> <translation id="5250483651202458397">Snimak ekrana. Dodirnite da zatvorite.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb index 63c3476..078f671 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">Tanca la pestanya</translation> <translation id="5213672942202814946">Utilitzar la cerca per veu</translation> <translation id="5222676887888702881">Tanca la sessió</translation> +<translation id="5227554086496586518">Toca per veure els resultats de la cerca</translation> <translation id="5230560987958996918"><ph name="SITE" /> vol cercar dispositius Bluetooth propers. S'han trobat els dispositius següents:</translation> <translation id="5233638681132016545">Pestanya nova</translation> <translation id="5250483651202458397">Captura de pantalla. Toca per tancar.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb index 696763a..ab18b2c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">Zavřít kartu</translation> <translation id="5213672942202814946">Hlasové vyhledávání</translation> <translation id="5222676887888702881">Odhlásit se</translation> +<translation id="5227554086496586518">Klepnutím zobrazíte výsledky vyhledávání</translation> <translation id="5230560987958996918">Web <ph name="SITE" /> chce vyhledat zařízení Bluetooth v okolí. Byla nalezena následující zařízení:</translation> <translation id="5233638681132016545">Nová karta</translation> <translation id="5250483651202458397">Snímek obrazovky. Klepnutím zavřete.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb index 02f360c..e448855 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">Luk fanen</translation> <translation id="5213672942202814946">Brug stemmesøgning</translation> <translation id="5222676887888702881">Log ud</translation> +<translation id="5227554086496586518">Tryk for at se søgeresultaterne</translation> <translation id="5230560987958996918"><ph name="SITE" /> vil gerne søge efter Bluetooth-enheder i nærheden. Følgende enheder blev fundet:</translation> <translation id="5233638681132016545">Ny fane</translation> <translation id="5250483651202458397">Screenshot. Tryk for at lukke.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb index cb3cf8da..2d7dfe9 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">Κλείσιμο καρτέλας</translation> <translation id="5213672942202814946">Χρήση φωνητικής αναζήτησης</translation> <translation id="5222676887888702881">Έξοδος</translation> +<translation id="5227554086496586518">Πατήστε για να δείτε αποτελέσματα αναζήτησης</translation> <translation id="5230560987958996918">Ο ιστότοπος <ph name="SITE" /> θέλει να κάνει σάρωση για κοντινές συσκευές Bluetooth. Βρέθηκαν οι παρακάτω συσκευές:</translation> <translation id="5233638681132016545">Νέα καρτέλα</translation> <translation id="5250483651202458397">Στιγμιότυπο οθόνης. Πατήστε για κλείσιμο.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb index 068b9fe..2829974 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">Close tab</translation> <translation id="5213672942202814946">Use voice search</translation> <translation id="5222676887888702881">Sign out</translation> +<translation id="5227554086496586518">Tap to see search results</translation> <translation id="5230560987958996918"><ph name="SITE" /> wants to scan for nearby Bluetooth devices. The following devices have been found:</translation> <translation id="5233638681132016545">New tab</translation> <translation id="5250483651202458397">Screenshot. Tap to close.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb index b2e60d2..23e294ff 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">Cerrar pestaña</translation> <translation id="5213672942202814946">Use voice search</translation> <translation id="5222676887888702881">Salir</translation> +<translation id="5227554086496586518">Presiona para ver los resultados de la búsqueda.</translation> <translation id="5230560987958996918"><ph name="SITE" /> quiere detectar dispositivos Bluetooth cercanos. Se encontraron los siguientes dispositivos:</translation> <translation id="5233638681132016545">Nueva pestaña</translation> <translation id="5250483651202458397">Captura de pantalla. Presionar para cerrar.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb index 4e6eb8c7..de30a83 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">Cerrar pestaña</translation> <translation id="5213672942202814946">Usar la búsqueda por voz</translation> <translation id="5222676887888702881">Cerrar sesión</translation> +<translation id="5227554086496586518">Toca para ver los resultados de búsqueda</translation> <translation id="5230560987958996918"><ph name="SITE" /> quiere buscar dispositivos Bluetooth cercanos. Se han encontrado los siguientes dispositivos:</translation> <translation id="5233638681132016545">Nueva pestaña</translation> <translation id="5250483651202458397">Captura de pantalla. Toca para cerrarla.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb index ac622c08..e46d37a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">Sule vaheleht</translation> <translation id="5213672942202814946">Häälotsingu kasutamine</translation> <translation id="5222676887888702881">Logi välja</translation> +<translation id="5227554086496586518">Puudutage otsingutulemuste nägemiseks</translation> <translation id="5230560987958996918"><ph name="SITE" /> soovib otsida läheduses olevaid Bluetooth-seadmeid. Leiti järgmised seadmed:</translation> <translation id="5233638681132016545">Uus vaheleht</translation> <translation id="5250483651202458397">Ekraanipilt. Puudutage sulgemiseks.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb index 656bd76..6d6ad50 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">Itxi fitxa</translation> <translation id="5213672942202814946">Ahozko bilaketa erabiltzea</translation> <translation id="5222676887888702881">Amaitu saioa</translation> +<translation id="5227554086496586518">Bilaketa-emaitzak ikusteko, sakatu hau</translation> <translation id="5230560987958996918"><ph name="SITE" /> webguneak inguruko Bluetooth bidezko gailuak bilatu nahi ditu. Gailu hauek aurkitu dira:</translation> <translation id="5233638681132016545">Fitxa berria</translation> <translation id="5250483651202458397">Pantaila-argazkia. Sakatu ixteko.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb index 2006e451..7fcb50e1 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">بستن برگه</translation> <translation id="5213672942202814946">استفاده از جستجوی گفتاری</translation> <translation id="5222676887888702881">خروج از سیستم</translation> +<translation id="5227554086496586518">برای دیدن نتایج جستجو ضربه بزنید</translation> <translation id="5230560987958996918"><ph name="SITE" /> میخواهد دستگاههای «بلوتوث» اطراف را جستجو کند. دستگاههای زیر پیدا شدند:</translation> <translation id="5233638681132016545">برگه جدید</translation> <translation id="5250483651202458397">نماگرفت. برای بستن ضربه بزنید.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb index 2928e25..ba29442 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">Fermer l'onglet</translation> <translation id="5213672942202814946">Use voice search</translation> <translation id="5222676887888702881">Déconnexion</translation> +<translation id="5227554086496586518">Appuyer pour afficher les résultats de recherche</translation> <translation id="5230560987958996918">Le site <ph name="SITE" /> souhaite rechercher les appareils Bluetooth à proximité. Les appareils suivants ont été détectés :</translation> <translation id="5233638681132016545">Nouvel onglet</translation> <translation id="5250483651202458397">Capture d'écran. Appuyez pour fermer.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb index 6ff2b82..4d02191 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">Pechar pestana</translation> <translation id="5213672942202814946">Utiliza a busca por voz</translation> <translation id="5222676887888702881">Pechar sesión</translation> +<translation id="5227554086496586518">Toca para ver os resultados da busca</translation> <translation id="5230560987958996918"><ph name="SITE" /> quere buscar dispositivos Bluetooth cerca. Atopáronse os seguintes dispositivos:</translation> <translation id="5233638681132016545">Nova pestana</translation> <translation id="5250483651202458397">Captura de pantalla. Toca para pechala.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb index 7c6f1d8..55cdc643 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb
@@ -607,6 +607,7 @@ <translation id="5210365745912300556">Zatvori karticu</translation> <translation id="5213672942202814946">Glasovno pretraživanje</translation> <translation id="5222676887888702881">Odjava</translation> +<translation id="5227554086496586518">Dodirnite da biste vidjeli rezultate pretraživanja</translation> <translation id="5230560987958996918"><ph name="SITE" /> želi potražiti Bluetooth uređaje u blizini. Pronađeni su sljedeći uređaji:</translation> <translation id="5233638681132016545">Nova kartica</translation> <translation id="5250483651202458397">Snimka zaslona. Dodirnite da biste zatvorili.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb index dbbd754b..526c116 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">Lap bezárása</translation> <translation id="5213672942202814946">Hangalapú keresés használata</translation> <translation id="5222676887888702881">Kijelentkezés</translation> +<translation id="5227554086496586518">Koppintson a keresési találatok megtekintéséhez</translation> <translation id="5230560987958996918">A(z) <ph name="SITE" /> szeretné megkeresni a közeli Bluetooth-eszközöket. A következő eszközöket találta:</translation> <translation id="5233638681132016545">Új lap</translation> <translation id="5250483651202458397">Képernyőkép. Koppintson a bezáráshoz.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb index a42c8474..71acdf4 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">Փակել ներդիրը</translation> <translation id="5213672942202814946">Որոնում ձայնի միջոցով</translation> <translation id="5222676887888702881">Դուրս գրվել</translation> +<translation id="5227554086496586518">Հպեք՝ որոնման արդյունքները տեսնելու համար</translation> <translation id="5230560987958996918">Թույլ տվեք <ph name="SITE" /> կայքին որոնել մոտակա Bluetooth սարքեր: Գտնվել են հետևյալ սարքերը՝</translation> <translation id="5233638681132016545">Նոր ներդիր</translation> <translation id="5250483651202458397">Սքրինշոթ։ Հպեք՝ փակելու համար։</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb index a3efc31..0a80c92 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">Loka flipa</translation> <translation id="5213672942202814946">Nota raddleit</translation> <translation id="5222676887888702881">Skrá út</translation> +<translation id="5227554086496586518">Ýttu til að sjá leitarniðurstöður</translation> <translation id="5230560987958996918"><ph name="SITE" /> vill leita að nálægum Bluetooth-tækjum. Eftirfarandi tæki hafa fundist:</translation> <translation id="5233638681132016545">Nýr flipi</translation> <translation id="5250483651202458397">Skjámynd. Ýttu til að loka.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb index cfaa6b18..7c98c5f9 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">Chiudi scheda</translation> <translation id="5213672942202814946">Usare la ricerca vocale</translation> <translation id="5222676887888702881">Esci</translation> +<translation id="5227554086496586518">Tocca per visualizzare i risultati di ricerca</translation> <translation id="5230560987958996918"><ph name="SITE" /> richiede di eseguire la scansione per rilevare dispositivi Bluetooth nelle vicinanze. Sono stati rilevati i seguenti dispositivi:</translation> <translation id="5233638681132016545">Nuova scheda</translation> <translation id="5250483651202458397">Screenshot. Tocca per chiudere.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb index 2e5a01e..c260111 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">ჩანართის დახურვა</translation> <translation id="5213672942202814946">ხმოვანი ძიების გამოყენება</translation> <translation id="5222676887888702881">გამოსვლა</translation> +<translation id="5227554086496586518">შეეხეთ ძიების შედეგების სანახავად</translation> <translation id="5230560987958996918"><ph name="SITE" /> ითხოვს ახლომდებარე Bluetooth მოწყობილობების სკანირებას. ნაპოვნია შემდეგი მოწყობილობები:</translation> <translation id="5233638681132016545">ახალი ჩანართი</translation> <translation id="5250483651202458397">ეკრანის ანაბეჭდი. შეეხეთ დასახურად.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb index 6a4dcc3..68e6b84f2 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">ປິດແຖບ</translation> <translation id="5213672942202814946">ໃຊ້ການຊອກຫາດ້ວຍສຽງ</translation> <translation id="5222676887888702881">ອອກຈາກລະບົບ</translation> +<translation id="5227554086496586518">ແຕະເພື່ອເບິ່ງຜົນການຊອກຫາ</translation> <translation id="5230560987958996918"><ph name="SITE" /> ຕ້ອງການສະແກນຫາອຸປະກອນ Bluetooth ທີ່ຢູ່ໃກ້ຄຽງ, ພົບເຫັນອຸປະກອນຕໍ່ໄປນີ້ແລ້ວ:</translation> <translation id="5233638681132016545">ແຖບໃຫມ່</translation> <translation id="5250483651202458397">ຮູບໜ້າຈໍ. ແຕະເພື່ອປິດ.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb index 1b30f2a2..30f5004 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">Uždaryti skirtuką</translation> <translation id="5213672942202814946">Naudoti paiešką balsu</translation> <translation id="5222676887888702881">Atsijungti</translation> +<translation id="5227554086496586518">Palieskite, kad peržiūrėtumėte paieškos rezultatus</translation> <translation id="5230560987958996918"><ph name="SITE" /> nori nuskaityti netoliese esančius „Bluetooth“ įrenginius. Rasti šie įrenginiai:</translation> <translation id="5233638681132016545">Naujas skirtukas</translation> <translation id="5250483651202458397">Ekrano kopija. Palieskite, kad uždarytumėte.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb index b645e114a..86f965b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">Затвори ја картичката</translation> <translation id="5213672942202814946">Користење гласовно пребарување</translation> <translation id="5222676887888702881">Одјави се</translation> +<translation id="5227554086496586518">Допрете за да ги видите резултатите од пребарувањето</translation> <translation id="5230560987958996918"><ph name="SITE" /> сака да скенира за уреди со Bluetooth во близина. Најдени се следниве уреди:</translation> <translation id="5233638681132016545">Нова картичка</translation> <translation id="5250483651202458397">Слика од екранот. Допрете за да се затвори.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb index 76e4a3b..31a61c19 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb
@@ -607,6 +607,7 @@ <translation id="5210365745912300556">Цонхыг хаа</translation> <translation id="5213672942202814946">Дуут хайлт ашиглах</translation> <translation id="5222676887888702881">Гарах</translation> +<translation id="5227554086496586518">Хайлтын илэрцүүдийг харахын тулд товшино уу</translation> <translation id="5230560987958996918"><ph name="SITE" /> ойролцоох Bluetooth төхөөрөмжүүдийг скан хийх хүсэлтэй байна. Дараах төхөөрөмжүүд олдлоо:</translation> <translation id="5233638681132016545">Шинэ таб</translation> <translation id="5250483651202458397">Дэлгэцийн агшин. Хаахын тулд товшино уу.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb index d20afb2..43f1ce8 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">Tutup tab</translation> <translation id="5213672942202814946">Gunakan carian suara</translation> <translation id="5222676887888702881">Log keluar</translation> +<translation id="5227554086496586518">Ketik untuk melihat hasil carian</translation> <translation id="5230560987958996918"><ph name="SITE" /> mahu mengimbas untuk mengesan peranti Bluetooth berdekatan. Peranti berikut telah dijumpai:</translation> <translation id="5233638681132016545">Tab baharu</translation> <translation id="5250483651202458397">Tangkapan skrin. Ketik untuk tutup.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb index 6b0d386a..139ebb07 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">တဘ် ပိတ်ရန်</translation> <translation id="5213672942202814946">Use voice search</translation> <translation id="5222676887888702881">ထွက်ခွာရန်</translation> +<translation id="5227554086496586518">ရှာဖွေမှုရလဒ်များကြည့်ရန် တို့ပါ</translation> <translation id="5230560987958996918"><ph name="SITE" /> သည် အနီးတစ်ဝိုက်ရှိ ဘလူးတုသ်စက်များကို ရှာဖွေလိုသည်။ အောက်ပါစက်များကို တွေ့ရှိထားသည်-</translation> <translation id="5233638681132016545">တဘ် အသစ်</translation> <translation id="5250483651202458397">ဖန်သားပြင်ဓာတ်ပုံ။ ပိတ်ရန် တို့ပါ။</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb index 4b1acbf..617af85 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb
@@ -607,6 +607,7 @@ <translation id="5210365745912300556">ट्याब बन्द गर्नुहोस्</translation> <translation id="5213672942202814946">भ्वाइस सर्च प्रयोग गर्ने तरिका</translation> <translation id="5222676887888702881">साइन आउट गर्नुहोस्</translation> +<translation id="5227554086496586518">खोज परिणामहरू हेर्न ट्याप गर्नुहोस्</translation> <translation id="5230560987958996918"><ph name="SITE" /> वरपरका ब्लुटुथ यन्त्रहरू खोज्न स्क्यान गर्न चाहन्छ। निम्न यन्त्रहरू फेला परेका छन्:</translation> <translation id="5233638681132016545">नयाँ ट्याब</translation> <translation id="5250483651202458397">स्क्रिनसट। बन्द गर्न ट्याप गर्नुहोस्।</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb index a4b77a04..2d231dc 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">Tabblad sluiten</translation> <translation id="5213672942202814946">Gesproken zoekopdrachten gebruiken</translation> <translation id="5222676887888702881">Uitloggen</translation> +<translation id="5227554086496586518">Tik om zoekresultaten te bekijken</translation> <translation id="5230560987958996918"><ph name="SITE" /> wil scannen naar Bluetooth-apparaten in de buurt. De volgende apparaten zijn gevonden:</translation> <translation id="5233638681132016545">Nieuw tabblad</translation> <translation id="5250483651202458397">Screenshot. Tik om te sluiten.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb index d94045d5..7b06868 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">Lukk fanen</translation> <translation id="5213672942202814946">Bruk talesøk (på engelsk)</translation> <translation id="5222676887888702881">Logg av</translation> +<translation id="5227554086496586518">Trykk for å se søkeresultater</translation> <translation id="5230560987958996918"><ph name="SITE" /> vil søke etter Bluetooth-enheter i nærheten. Fant disse enhetene:</translation> <translation id="5233638681132016545">Ny fane</translation> <translation id="5250483651202458397">Skjermdump. Trykk for å lukke.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb index 25fe155..34616663 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">ଟ୍ୟାବ୍ ବନ୍ଦ କରନ୍ତୁ</translation> <translation id="5213672942202814946">ଭଏସ୍ ସନ୍ଧାନ ବ୍ୟବହାର କରନ୍ତୁ</translation> <translation id="5222676887888702881">ସାଇନ୍ ଆଉଟ୍ କରନ୍ତୁ</translation> +<translation id="5227554086496586518">ସନ୍ଧାନ ଫଳାଫଳଗୁଡ଼ିକୁ ଦେଖିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ</translation> <translation id="5230560987958996918"><ph name="SITE" /> ଆଖପାଖର ବ୍ଲୁଟୁଥ୍ ଡିଭାଇସ୍ଗୁଡ଼ିକୁ ସ୍କାନ୍ କରିବାକୁ ଚାହୁଁଛି। ନିମ୍ନୋକ୍ତ ଡିଭାଇସ୍ଗୁଡ଼ିକ ମିଳିଛି:</translation> <translation id="5233638681132016545">ନୂତନ ଟ୍ୟାବ୍</translation> <translation id="5250483651202458397">ସ୍କ୍ରିନସଟ୍। ବନ୍ଦ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ।</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb index 94339c78..5614d51e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">Zamknij kartę</translation> <translation id="5213672942202814946">Wyszukiwanie głosowe</translation> <translation id="5222676887888702881">Wyloguj się</translation> +<translation id="5227554086496586518">Kliknij, aby zobaczyć wyniki wyszukiwania</translation> <translation id="5230560987958996918"><ph name="SITE" /> chce wyszukać urządzenia Bluetooth w pobliżu. Znaleziono te urządzenia:</translation> <translation id="5233638681132016545">Nowa karta</translation> <translation id="5250483651202458397">Zrzut ekranu. Kliknij, by zamknąć.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb index 753e70f..64f87bf 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb
@@ -609,6 +609,7 @@ <translation id="5210365745912300556">Fechar guia</translation> <translation id="5213672942202814946">Usar a pesquisa por voz</translation> <translation id="5222676887888702881">Sair</translation> +<translation id="5227554086496586518">Toque para ver os resultados da pesquisa</translation> <translation id="5230560987958996918">Solicitação de <ph name="SITE" /> para procurar dispositivos Bluetooth próximos. Os seguintes dispositivos foram encontrados:</translation> <translation id="5233638681132016545">Nova guia</translation> <translation id="5250483651202458397">Captura de tela. Toque para fechar.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb index 0a0912e..31d06840 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">Fechar separador</translation> <translation id="5213672942202814946">Utilize a pesquisa por voz</translation> <translation id="5222676887888702881">Terminar sessão</translation> +<translation id="5227554086496586518">Toque para ver os resultados da pesquisa</translation> <translation id="5230560987958996918"><ph name="SITE" /> pretende procurar dispositivos Bluetooth próximos. Foram encontrados os seguintes dispositivos:</translation> <translation id="5233638681132016545">Novo separador</translation> <translation id="5250483651202458397">Captura de ecrã. Toque para fechar.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb index abef293..395e0ed4 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">Închide fila</translation> <translation id="5213672942202814946">Folosirea căutării vocale</translation> <translation id="5222676887888702881">Deconectează-te</translation> +<translation id="5227554086496586518">Atinge pentru a vedea rezultatele căutării</translation> <translation id="5230560987958996918"><ph name="SITE" /> vrea să caute dispozitive Bluetooth în apropiere. Următoarele dispozitive au fost găsite:</translation> <translation id="5233638681132016545">Filă nouă</translation> <translation id="5250483651202458397">Captură de ecran. Atinge pentru a închide.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb index ca346e9..05b27ac 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">ටැබය වසන්න</translation> <translation id="5213672942202814946">හඬ සෙවීම භාවිතය</translation> <translation id="5222676887888702881">පිටවීම</translation> +<translation id="5227554086496586518">සෙවීම් ප්රතිඵල බැලීමට තට්ටු කරන්න</translation> <translation id="5230560987958996918"><ph name="SITE" /> හට අවට බ්ලූටූත් උපාංග සඳහා ස්කෑන් කිරීමට අවශ්යයි. පහත උපාංග සොයාගනු ලැබීය:</translation> <translation id="5233638681132016545">නව ටැබය</translation> <translation id="5250483651202458397">තිර රුව. වැසීමට තට්ටු කරන්න.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb index f814be5..ec071f9 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">Zapri zavihek</translation> <translation id="5213672942202814946">Uporaba glasovnega iskanja</translation> <translation id="5222676887888702881">Odjava</translation> +<translation id="5227554086496586518">Dotaknite se, če želite prikazati rezultate iskanja</translation> <translation id="5230560987958996918"><ph name="SITE" /> želi iskati naprave Bluetooth v bližini. Najdene so bile te naprave:</translation> <translation id="5233638681132016545">Nov zavihek</translation> <translation id="5250483651202458397">Posnetek zaslona. Dotaknite se, če ga želite zapreti.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb index 001ba208..b190ce9 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb
@@ -99,7 +99,7 @@ <translation id="1697284962337958118">Shto në</translation> <translation id="1718835860248848330">Ora e fundit</translation> <translation id="1724977129262658800">Shkyçe për të modifikuar fjalëkalimin tënd</translation> -<translation id="173522743738009831">Rreth "Kufizuesit të privatësisë"</translation> +<translation id="173522743738009831">Rreth "Nismës për mjedis uebi privat"</translation> <translation id="1736419249208073774">Eksploro</translation> <translation id="1749561566933687563">Sinkronizo faqeshënuesit e tu</translation> <translation id="17513872634828108">Hap skedat</translation> @@ -351,19 +351,19 @@ <translation id="3384347053049321195">Shpërndaje imazhin</translation> <translation id="3387650086002190359">Shkarkimi i <ph name="FILE_NAME" /> dështoi për shkak të gabimeve të sistemit të skedarëve.</translation> <translation id="3389286852084373014">Teksti është tepër i madh</translation> -<translation id="3391512812407811893">Provat e "Kufizuesit të privatësisë"</translation> +<translation id="3391512812407811893">Provat e "Nismës për mjedis uebi privat"</translation> <translation id="3398320232533725830">Hap menaxherin e faqeshënuesve</translation> <translation id="3414952576877147120">Madhësia:</translation> <translation id="3429160811076349561">Veçoritë e provës janë joaktive</translation> <translation id="3440975416244667276">Prek dhe mbaj të shtypur për më shumë informacione të rëndësishme</translation> <translation id="3443221991560634068">Ringarko faqen aktuale</translation> -<translation id="3451542610083122179">"Kufizuesi i privatësisë" është një nismë e vazhdueshme për të ruajtur uebin e hapur që do të të ndihmojë të mbrohesh nga mekanizmat e gjurmimit. +<translation id="3451542610083122179">"Nisma për mjedis uebi privat" është një nismë e vazhdueshme për të ruajtur uebin e hapur që do të të ndihmojë të mbrohesh nga mekanizmat e gjurmimit. -Sot, faqet e internetit mbështeten në shumë teknologji, si kukit e palëve të treta, për shërbime të rëndësishme si shfaqja e reklamave të rëndësishme dhe matja e cilësisë së funksionimit të një sajti. +Sot, sajtet e uebit mbështeten në shumë teknologji, si kukit e palëve të treta, për shërbime të rëndësishme si shfaqja e reklamave të rëndësishme dhe matja e cilësisë së funksionimit të një sajti. -"Kufizuesi i privatësisë" ruan vitalitetin e uebit të hapur duke krijuar mënyra më të mira për të kryer këto shërbime, pa prishur sajtet dhe duke parandaluar njëkohësisht që të mos gjurmohesh fshehtas nëpër ueb. +"Nisma për mjedis uebi privat" ruan vitalitetin e uebit të hapur duke krijuar mënyra më të mira për të kryer këto shërbime, pa prishur sajtet dhe duke parandaluar njëkohësisht që të mos gjurmohesh fshehtas nëpër ueb. -"Kufizuesi i privatësisë" është ende në zhvillim aktiv dhe ofrohet në rajone të caktuara. Për momentin, sajtet mund të provojnë "Kufizuesin e privatësisë" ndërkohë që vazhdojnë të përdorin teknologjitë aktuale të uebit si kukit e palëve të treta. <ph name="BEGIN_LINK" />Mëso më shumë<ph name="END_LINK" /></translation> +"Nisma për mjedis uebi privat" është ende në zhvillim aktiv dhe ofrohet në rajone të caktuara. Për momentin, sajtet mund të provojnë "Nismën për mjedis uebi privat" ndërkohë që vazhdojnë të përdorin teknologjitë aktuale të uebit, si p.sh. kukit e palëve të treta. <ph name="BEGIN_LINK" />Mëso më shumë<ph name="END_LINK" /></translation> <translation id="3478363558367712427">Mund të zgjedhësh motorin tënd të kërkimit</translation> <translation id="3492207499832628349">Skedë e re e fshehtë</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Mëso më shumë<ph name="END_LINK" /> mbi përmbajtjen e sugjeruar</translation> @@ -608,6 +608,7 @@ <translation id="5210365745912300556">Mbyll skedën</translation> <translation id="5213672942202814946">Përdor kërkimin me zë</translation> <translation id="5222676887888702881">Dil</translation> +<translation id="5227554086496586518">Trokit për të parë rezultatet e kërkimit</translation> <translation id="5230560987958996918"><ph name="SITE" /> dëshiron të skanojë për pajisje Bluetooth në afërsi. Janë gjetur pajisjet e mëposhtme:</translation> <translation id="5233638681132016545">Skedë e re</translation> <translation id="5250483651202458397">Pamja e ekranit. Trokit për ta mbyllur.</translation> @@ -1064,7 +1065,7 @@ <translation id="8156139159503939589">Në çfarë gjuhësh lexon?</translation> <translation id="8168435359814927499">Përmbajtja</translation> <translation id="8186512483418048923"><ph name="FILES" /> skedarë të mbetur</translation> -<translation id="8189750580333936930">Kufizuesi i privatësisë</translation> +<translation id="8189750580333936930">Nisma për mjedis uebi privat</translation> <translation id="8190358571722158785">1 ditë e mbetur</translation> <translation id="8200772114523450471">Vazhdo</translation> <translation id="8209050860603202033">Hape imazhin</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb index 8c52858..91bb5c03 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">Zatvori karticu</translation> <translation id="5213672942202814946">Koristite glasovnu pretragu</translation> <translation id="5222676887888702881">Odjavi me</translation> +<translation id="5227554086496586518">Dodirnite da biste videli rezultate pretrage</translation> <translation id="5230560987958996918"><ph name="SITE" /> želi da traži Bluetooth uređaje u blizini. Pronađeni su sledeći uređaji:</translation> <translation id="5233638681132016545">Nova kartica</translation> <translation id="5250483651202458397">Snimak ekrana. Dodirnite da biste ga zatvorili.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb index a6ad4d6..e1bb904 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">Затвори картицу</translation> <translation id="5213672942202814946">Користите гласовну претрагу</translation> <translation id="5222676887888702881">Одјави ме</translation> +<translation id="5227554086496586518">Додирните да бисте видели резултате претраге</translation> <translation id="5230560987958996918"><ph name="SITE" /> жели да тражи Bluetooth уређаје у близини. Пронађени су следећи уређаји:</translation> <translation id="5233638681132016545">Нова картица</translation> <translation id="5250483651202458397">Снимак екрана. Додирните да бисте га затворили.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb index 4882d306..0f2dfe6 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">Stäng flik</translation> <translation id="5213672942202814946">Använd röstsökning</translation> <translation id="5222676887888702881">Logga ut</translation> +<translation id="5227554086496586518">Tryck för att visa sökresultat</translation> <translation id="5230560987958996918"><ph name="SITE" /> vill söka efter Bluetooth-enheter i närheten. Följande enheter har hittats:</translation> <translation id="5233638681132016545">Ny flik</translation> <translation id="5250483651202458397">Skärmbild. Tryck och stäng.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb index a657621..6eeb9538 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">ปิดแท็บ</translation> <translation id="5213672942202814946">ใช้การค้นหาด้วยเสียง</translation> <translation id="5222676887888702881">ออกจากระบบ</translation> +<translation id="5227554086496586518">แตะเพื่อดูผลการค้นหา</translation> <translation id="5230560987958996918"><ph name="SITE" /> ต้องการสแกนหาอุปกรณ์บลูทูธที่อยู่ใกล้เคียงและได้พบอุปกรณ์ต่อไปนี้</translation> <translation id="5233638681132016545">แท็บใหม่</translation> <translation id="5250483651202458397">ภาพหน้าจอ แตะเพื่อปิด</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb index 2b037c1..b556603 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">Закрити вкладку</translation> <translation id="5213672942202814946">Як працює голосовий пошук</translation> <translation id="5222676887888702881">Вийти</translation> +<translation id="5227554086496586518">Торкніться, щоб переглянути результати пошуку</translation> <translation id="5230560987958996918">Сайт <ph name="SITE" /> хоче шукати пристрої Bluetooth поруч. Виявлено такі пристрої:</translation> <translation id="5233638681132016545">Нова вкладка</translation> <translation id="5250483651202458397">Знімок екрана. Торкніться, щоб закрити.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb index 08d12169..d7bc360 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">Tabni yopish</translation> <translation id="5213672942202814946">Ovoz bilan qidirish</translation> <translation id="5222676887888702881">Tizimdan chiqish</translation> +<translation id="5227554086496586518">Qidiruv natijalarni koʻrish uchun bosing</translation> <translation id="5230560987958996918"><ph name="SITE" /> sayti yaqin-atrofdagi Bluetooth qurilmalarni tekshirmoqchi. Quyidagi qurilmalar topilgan:</translation> <translation id="5233638681132016545">Yangi varaq</translation> <translation id="5250483651202458397">Skrinshot. Bosib yopish.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb index 0f16d3f2..7b7443b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">關閉分頁</translation> <translation id="5213672942202814946">使用語音搜尋</translation> <translation id="5222676887888702881">登出</translation> +<translation id="5227554086496586518">輕按以查看搜尋結果</translation> <translation id="5230560987958996918"><ph name="SITE" /> 要求掃瞄附近的藍牙裝置,並已找到以下裝置:</translation> <translation id="5233638681132016545">新分頁</translation> <translation id="5250483651202458397">螢幕截圖。輕按以關閉。</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb index 819b81a..0af6da3 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb
@@ -608,6 +608,7 @@ <translation id="5210365745912300556">Vala ithebhu</translation> <translation id="5213672942202814946">Sebenzisa ukusesha kwezwi</translation> <translation id="5222676887888702881">Phuma ngemvume</translation> +<translation id="5227554086496586518">Thepha ukuze ubone imiphumela yosesho</translation> <translation id="5230560987958996918">I-<ph name="SITE" /> ifuna ukuskenela amadivayisi aseduze e-Bluetooth. Amadivayisi alandelayo atholiwe:</translation> <translation id="5233638681132016545">Ithebhu entsha</translation> <translation id="5250483651202458397">Isithombe-skrini. Thepha ukuze uvale.</translation>
diff --git a/chrome/browser/ui/app_list/app_service/app_service_app_model_builder_unittest.cc b/chrome/browser/ui/app_list/app_service/app_service_app_model_builder_unittest.cc index 215a218..612abcc 100644 --- a/chrome/browser/ui/app_list/app_service/app_service_app_model_builder_unittest.cc +++ b/chrome/browser/ui/app_list/app_service/app_service_app_model_builder_unittest.cc
@@ -19,9 +19,9 @@ #include "chrome/browser/apps/app_service/app_service_proxy_factory.h" #include "chrome/browser/apps/app_service/app_service_test.h" #include "chrome/browser/apps/icon_standardizer.h" -#include "chrome/browser/chromeos/borealis/borealis_features.h" -#include "chrome/browser/chromeos/borealis/borealis_service.h" -#include "chrome/browser/chromeos/borealis/borealis_util.h" +#include "chrome/browser/ash/borealis/borealis_features.h" +#include "chrome/browser/ash/borealis/borealis_service.h" +#include "chrome/browser/ash/borealis/borealis_util.h" #include "chrome/browser/chromeos/crostini/crostini_test_helper.h" #include "chrome/browser/chromeos/crostini/crostini_util.h" #include "chrome/browser/chromeos/guest_os/guest_os_registry_service.h"
diff --git a/chrome/browser/ui/app_list/app_service/app_service_context_menu.cc b/chrome/browser/ui/app_list/app_service/app_service_context_menu.cc index b2b40cca..b7cf9206 100644 --- a/chrome/browser/ui/app_list/app_service/app_service_context_menu.cc +++ b/chrome/browser/ui/app_list/app_service/app_service_context_menu.cc
@@ -11,10 +11,10 @@ #include "chrome/browser/apps/app_service/app_service_proxy.h" #include "chrome/browser/apps/app_service/app_service_proxy_factory.h" #include "chrome/browser/apps/app_service/menu_util.h" +#include "chrome/browser/ash/borealis/borealis_service.h" +#include "chrome/browser/ash/borealis/borealis_shutdown_monitor.h" +#include "chrome/browser/ash/borealis/borealis_util.h" #include "chrome/browser/ash/crosapi/browser_manager.h" -#include "chrome/browser/chromeos/borealis/borealis_service.h" -#include "chrome/browser/chromeos/borealis/borealis_shutdown_monitor.h" -#include "chrome/browser/chromeos/borealis/borealis_util.h" #include "chrome/browser/chromeos/crostini/crostini_manager.h" #include "chrome/browser/chromeos/crostini/crostini_terminal.h" #include "chrome/browser/chromeos/crostini/crostini_util.h"
diff --git a/chrome/browser/ui/app_list/search/arc/fake_recommend_apps_fetcher_delegate.cc b/chrome/browser/ui/app_list/search/arc/fake_recommend_apps_fetcher_delegate.cc new file mode 100644 index 0000000..fdb9e1f7 --- /dev/null +++ b/chrome/browser/ui/app_list/search/arc/fake_recommend_apps_fetcher_delegate.cc
@@ -0,0 +1,50 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/app_list/search/arc/fake_recommend_apps_fetcher_delegate.h" + +#include <utility> + +#include "base/check_op.h" +#include "base/run_loop.h" + +namespace app_list { + +FakeRecommendAppsFetcherDelegate::FakeRecommendAppsFetcherDelegate() = default; + +FakeRecommendAppsFetcherDelegate::~FakeRecommendAppsFetcherDelegate() = default; + +FakeRecommendAppsFetcherDelegate::Result +FakeRecommendAppsFetcherDelegate::WaitForResult() { + if (result_ == Result::UNKNOWN) { + base::RunLoop run_loop; + result_callback_ = run_loop.QuitClosure(); + run_loop.Run(); + } + + return result_; +} + +void FakeRecommendAppsFetcherDelegate::OnLoadError() { + SetResult(Result::LOAD_ERROR); +} + +void FakeRecommendAppsFetcherDelegate::OnParseResponseError() { + SetResult(Result::PARSE_ERROR); +} + +void FakeRecommendAppsFetcherDelegate::OnLoadSuccess( + const base::Value& app_list) { + loaded_apps_ = app_list.Clone(); + SetResult(Result::SUCCESS); +} + +void FakeRecommendAppsFetcherDelegate::SetResult(Result result) { + DCHECK_EQ(Result::UNKNOWN, result_); + result_ = result; + if (result_callback_) + std::move(result_callback_).Run(); +} + +} // namespace app_list
diff --git a/chrome/browser/ui/app_list/search/arc/fake_recommend_apps_fetcher_delegate.h b/chrome/browser/ui/app_list/search/arc/fake_recommend_apps_fetcher_delegate.h new file mode 100644 index 0000000..4c68988 --- /dev/null +++ b/chrome/browser/ui/app_list/search/arc/fake_recommend_apps_fetcher_delegate.h
@@ -0,0 +1,66 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_APP_LIST_SEARCH_ARC_FAKE_RECOMMEND_APPS_FETCHER_DELEGATE_H_ +#define CHROME_BROWSER_UI_APP_LIST_SEARCH_ARC_FAKE_RECOMMEND_APPS_FETCHER_DELEGATE_H_ + +#include "chrome/browser/ui/app_list/search/arc/recommend_apps_fetcher_delegate.h" + +#include "base/callback.h" +#include "base/values.h" + +namespace app_list { + +// Delegate interface used by RecommendAppsFetcher to report its results. +class FakeRecommendAppsFetcherDelegate : public RecommendAppsFetcherDelegate { + public: + // Set of possible results reported by RecommendAppsFetcher. + enum class Result { UNKNOWN, SUCCESS, LOAD_ERROR, PARSE_ERROR }; + + FakeRecommendAppsFetcherDelegate(); + ~FakeRecommendAppsFetcherDelegate() override; + + FakeRecommendAppsFetcherDelegate( + const FakeRecommendAppsFetcherDelegate& other) = delete; + FakeRecommendAppsFetcherDelegate& operator=( + const FakeRecommendAppsFetcherDelegate& other) = delete; + + const base::Value& loaded_apps() const { return loaded_apps_; } + Result result() const { return result_; } + + // Waits until a result is reported to the delegate, and returns the returned + // result type. + Result WaitForResult(); + + // Resets the delegate - it clears any previously reported fetcher results. + void Reset() { + loaded_apps_ = base::Value(); + result_ = Result::UNKNOWN; + } + + // RecommendAppsFetcherDelegate: + void OnLoadSuccess(const base::Value& app_list) override; + void OnLoadError() override; + void OnParseResponseError() override; + + private: + // Records a result value - `loaded_apps_`, if any, should be set before + // calling this. + void SetResult(Result result); + + // The last result reported by the RecommendAppsFetcher. + Result result_ = Result::UNKNOWN; + + // The last reported list of apps reported by the RecommendAppsFetcher. Set + // only on LoadSuccess. + base::Value loaded_apps_; + + // The callback that will be called when the result is set - used to implement + // WaitForResult(). + base::OnceClosure result_callback_; +}; + +} // namespace app_list + +#endif // CHROME_BROWSER_UI_APP_LIST_SEARCH_ARC_FAKE_RECOMMEND_APPS_FETCHER_DELEGATE_H_
diff --git a/chrome/browser/ui/app_list/search/arc/recommend_apps_fetcher.cc b/chrome/browser/ui/app_list/search/arc/recommend_apps_fetcher.cc new file mode 100644 index 0000000..16bbb6c5c5 --- /dev/null +++ b/chrome/browser/ui/app_list/search/arc/recommend_apps_fetcher.cc
@@ -0,0 +1,24 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/app_list/search/arc/recommend_apps_fetcher.h" + +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/profiles/profile_manager.h" +#include "chrome/browser/ui/app_list/search/arc/recommend_apps_fetcher_impl.h" +#include "content/public/browser/storage_partition.h" + +namespace app_list { + +// static +std::unique_ptr<RecommendAppsFetcher> RecommendAppsFetcher::Create( + RecommendAppsFetcherDelegate* delegate) { + return std::make_unique<RecommendAppsFetcherImpl>( + delegate, content::BrowserContext::GetDefaultStoragePartition( + ProfileManager::GetActiveUserProfile()) + ->GetURLLoaderFactoryForBrowserProcess() + .get()); +} + +} // namespace app_list
diff --git a/chrome/browser/ui/app_list/search/arc/recommend_apps_fetcher.h b/chrome/browser/ui/app_list/search/arc/recommend_apps_fetcher.h new file mode 100644 index 0000000..e394436 --- /dev/null +++ b/chrome/browser/ui/app_list/search/arc/recommend_apps_fetcher.h
@@ -0,0 +1,26 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_APP_LIST_SEARCH_ARC_RECOMMEND_APPS_FETCHER_H_ +#define CHROME_BROWSER_UI_APP_LIST_SEARCH_ARC_RECOMMEND_APPS_FETCHER_H_ + +#include <memory> + +namespace app_list { + +class RecommendAppsFetcherDelegate; + +class RecommendAppsFetcher { + public: + static std::unique_ptr<RecommendAppsFetcher> Create( + RecommendAppsFetcherDelegate* delegate); + + virtual ~RecommendAppsFetcher() = default; + + virtual void StartDownload() = 0; +}; + +} // namespace app_list + +#endif // CHROME_BROWSER_UI_APP_LIST_SEARCH_ARC_RECOMMEND_APPS_FETCHER_H_
diff --git a/chrome/browser/ui/app_list/search/arc/recommend_apps_fetcher_delegate.h b/chrome/browser/ui/app_list/search/arc/recommend_apps_fetcher_delegate.h new file mode 100644 index 0000000..86fe8d9 --- /dev/null +++ b/chrome/browser/ui/app_list/search/arc/recommend_apps_fetcher_delegate.h
@@ -0,0 +1,31 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_APP_LIST_SEARCH_ARC_RECOMMEND_APPS_FETCHER_DELEGATE_H_ +#define CHROME_BROWSER_UI_APP_LIST_SEARCH_ARC_RECOMMEND_APPS_FETCHER_DELEGATE_H_ + +namespace base { +class Value; +} // namespace base + +namespace app_list { + +// Delegate interface used by RecommendAppsFetcher to report its results. +class RecommendAppsFetcherDelegate { + public: + virtual ~RecommendAppsFetcherDelegate() = default; + + // Called when the download of the recommend app list is successful. + virtual void OnLoadSuccess(const base::Value& app_list) = 0; + + // Called when the download of the recommend app list fails. + virtual void OnLoadError() = 0; + + // Called when parsing the recommend app list response fails. + virtual void OnParseResponseError() = 0; +}; + +} // namespace app_list + +#endif // CHROME_BROWSER_UI_APP_LIST_SEARCH_ARC_RECOMMEND_APPS_FETCHER_DELEGATE_H_
diff --git a/chrome/browser/ui/app_list/search/arc/recommend_apps_fetcher_impl.cc b/chrome/browser/ui/app_list/search/arc/recommend_apps_fetcher_impl.cc new file mode 100644 index 0000000..bdea9959 --- /dev/null +++ b/chrome/browser/ui/app_list/search/arc/recommend_apps_fetcher_impl.cc
@@ -0,0 +1,279 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/app_list/search/arc/recommend_apps_fetcher_impl.h" + +#include <cstdint> +#include <iomanip> + +#include "base/base64url.h" +#include "base/json/json_reader.h" +#include "base/metrics/histogram_functions.h" +#include "base/metrics/histogram_macros.h" +#include "base/strings/string_piece.h" +#include "base/strings/string_split.h" +#include "base/strings/string_util.h" +#include "chrome/browser/ui/app_list/arc/arc_app_utils.h" +#include "chrome/browser/ui/app_list/search/arc/recommend_apps_fetcher_delegate.h" +#include "net/base/load_flags.h" +#include "net/http/http_status_code.h" +#include "net/traffic_annotation/network_traffic_annotation.h" +#include "services/network/public/cpp/resource_request.h" +#include "services/network/public/cpp/simple_url_loader.h" + +namespace app_list { + +namespace { + +constexpr const char kGetAppListUrl[] = + "https://android.clients.google.com/fdfe/chrome/" + "getfastreinstallappslist?cfecu=false"; + +// These are error codes from the json response of the API. +constexpr int kResponseErrorNotEnoughApps = 5; +constexpr int kResponseErrorNotFirstTimeChromebookUser = 6; + +// The response starts with a prefix ")]}'". This needs to be removed before +// further parsing. +constexpr base::StringPiece kJsonXssPreventionPrefix = ")]}'"; + +constexpr base::TimeDelta kDownloadTimeOut = base::TimeDelta::FromMinutes(1); + +constexpr const int64_t kMaxDownloadBytes = 1024 * 1024; // 1Mb + +// Convert a decimal number to a hexadecimal number. Return a string as result. +std::string HexEncode(int64_t id) { + std::ostringstream string_stream; + string_stream << std::setbase(16) << id; + return string_stream.str(); +} + +void OnGetAndroidId(bool* get_android_id_successfully, + int64_t* android_id, + bool ok, + int64_t id) { + // TODO(thanhdng): Add a UMA histogram here. + *get_android_id_successfully = ok; + *android_id = id; +} + +} // namespace + +RecommendAppsFetcherImpl::RecommendAppsFetcherImpl( + RecommendAppsFetcherDelegate* delegate, + network::mojom::URLLoaderFactory* url_loader_factory) + : delegate_(delegate), url_loader_factory_(url_loader_factory) { + arc::GetAndroidId(base::BindOnce( + &OnGetAndroidId, &get_android_id_successfully_, &android_id_)); +} + +RecommendAppsFetcherImpl::~RecommendAppsFetcherImpl() = default; + +void RecommendAppsFetcherImpl::StartDownload() { + net::NetworkTrafficAnnotationTag traffic_annotation = + net::DefineNetworkTrafficAnnotation("play_recommended_apps_reinstall", R"( + semantics { + sender: "ChromeOS Launcher" + description: + "ChromeOS launcher provides app reinstall suggestions for user." + "This request downloads the suggestions' metadata using user's " + "Android ID." + trigger: + "When user open the launcher." + data: + "URL of the Google Play API." + destination: GOOGLE_OWNED_SERVICE + } + policy { + cookies_allowed: YES + cookie_store: "user" + setting: + "NA" + chrome_policy { + SuggestedContentEnabled { + SuggestedContentEnabled: true + } + } + })"); + + auto resource_request = std::make_unique<network::ResourceRequest>(); + resource_request->url = GURL(kGetAppListUrl); + resource_request->method = "GET"; + resource_request->load_flags = + net::LOAD_BYPASS_CACHE | net::LOAD_DISABLE_CACHE; + + resource_request->headers.SetHeader(net::HttpRequestHeaders::kContentType, + "application/json"); + resource_request->headers.SetHeader("X-DFE-Device-Id", + HexEncode(android_id_)); + + start_time_ = base::TimeTicks::Now(); + app_list_loader_ = network::SimpleURLLoader::Create( + std::move(resource_request), traffic_annotation); + // Retry up to three times if network changes are detected during the + // download. + app_list_loader_->SetRetryOptions( + 3, network::SimpleURLLoader::RETRY_ON_NETWORK_CHANGE); + app_list_loader_->DownloadToString( + url_loader_factory_, + base::BindOnce(&RecommendAppsFetcherImpl::OnDownloaded, + base::Unretained(this)), + kMaxDownloadBytes); + + // Abort the download attempt if it takes longer than one minute. + download_timer_.Start(FROM_HERE, kDownloadTimeOut, this, + &RecommendAppsFetcherImpl::OnDownloadTimeout); +} + +void RecommendAppsFetcherImpl::OnDownloadTimeout() { + // Destroy the fetcher, which will abort the download attempt. + app_list_loader_.reset(); + + // TODO(thanhdng): Add a UMA histogram here recording the time difference. + delegate_->OnLoadError(); +} + +void RecommendAppsFetcherImpl::OnDownloaded( + std::unique_ptr<std::string> response_body) { + download_timer_.Stop(); + + // TODO(thanhdng): Add a UMA histogram here recording the time difference. + + std::unique_ptr<network::SimpleURLLoader> loader(std::move(app_list_loader_)); + int response_code = 0; + if (!loader->ResponseInfo() || !loader->ResponseInfo()->headers) { + delegate_->OnLoadError(); + return; + } + response_code = loader->ResponseInfo()->headers->response_code(); + // TODO(thanhndng): Add a UMA histogram here recording the response code. + + // If the recommended app list could not be downloaded, show an error message + // to the user. + if (!response_body || response_body->empty()) { + delegate_->OnLoadError(); + return; + } + + // If the recommended app list were downloaded successfully, show them to + // the user. + // + base::StringPiece response_body_json(*response_body); + if (base::StartsWith(response_body_json, kJsonXssPreventionPrefix)) + response_body_json.remove_prefix(kJsonXssPreventionPrefix.length()); + base::Optional<base::Value> output = ParseResponse(response_body_json); + if (!output.has_value()) { + // TODO(thanhdng): Add a UMA histogram here. + delegate_->OnParseResponseError(); + return; + } + + delegate_->OnLoadSuccess(std::move(output.value())); +} + +base::Optional<base::Value> RecommendAppsFetcherImpl::ParseResponse( + base::StringPiece response) { + base::JSONReader::ValueWithError parsed_json = + base::JSONReader::ReadAndReturnValueWithError(response); + + if (!parsed_json.value || + (!parsed_json.value->is_list() && !parsed_json.value->is_dict())) { + LOG(ERROR) << "Error parsing response JSON: " << parsed_json.error_message; + // TODO(thanhdng): Add a UMA histogram here. + return base::nullopt; + } + + // If the response is a dictionary, it is an error message in the + // following format: + // {"Error code":"error code","Error message":"Error message"} + if (parsed_json.value->is_dict()) { + const base::Value* response_error_code_value = + parsed_json.value->FindKeyOfType("Error code", + base::Value::Type::STRING); + + if (!response_error_code_value) { + LOG(ERROR) << "Unable to find error code: response=" + << response.substr(0, 128); + // TODO(thanhdng): Add a UMA histogram here. + return base::nullopt; + } + + base::StringPiece response_error_code_str = + response_error_code_value->GetString(); + int response_error_code = 0; + if (!base::StringToInt(response_error_code_str, &response_error_code)) { + LOG(WARNING) << "Unable to parse error code: " << response_error_code_str; + // TODO(thanhdng): Add a UMA histogram here. + return base::nullopt; + } + + if (response_error_code == kResponseErrorNotFirstTimeChromebookUser) { + NOTREACHED(); + } else if (response_error_code == kResponseErrorNotEnoughApps) { + // TODO(thanhdng): Add a UMA histogram here. + } else { + LOG(WARNING) << "Unknown error code: " << response_error_code_str; + // TODO(thanhdng): Add a UMA histogram here. + } + + return base::nullopt; + } + + // Otherwise, the response should return a list of apps. + base::Value::ConstListView app_list = parsed_json.value->GetList(); + if (app_list.empty()) { + DVLOG(1) << "No app in the response."; + // TODO(thanhdng): Add a UMA histogram here. + return base::nullopt; + } + + base::Value output(base::Value::Type::LIST); + for (auto& item : app_list) { + base::Value output_map(base::Value::Type::DICTIONARY); + + if (!item.is_dict()) { + DVLOG(1) << "Cannot parse item."; + continue; + } + + // Retrieve the app title. + const base::Value* title = + item.FindPathOfType({"title_", "name_"}, base::Value::Type::STRING); + if (title) + output_map.SetKey("name", base::Value(title->GetString())); + + // Retrieve the package name. + const base::Value* package_name = + item.FindPathOfType({"id_", "id_"}, base::Value::Type::STRING); + if (package_name) + output_map.SetKey("package_name", base::Value(package_name->GetString())); + + // Retrieve the icon URL for the app. + // + // The name "privateDoNotAccessOrElseSafeUrlWrappedValue_" here is because + // it is a direct serialization from the proto message. The value has been + // sanitized so it is regarded as a safe URL. In general, if the response is + // a protobuf, we should not directly access this field but use the wrapper + // method getSafeUrlString() to read it. In our case, we don't have the + // option other than access it directly. + const base::Value* icon_url = item.FindPathOfType( + {"icon_", "url_", "privateDoNotAccessOrElseSafeUrlWrappedValue_"}, + base::Value::Type::STRING); + if (icon_url) + output_map.SetKey("icon", base::Value(icon_url->GetString())); + + if (output_map.DictEmpty()) { + DVLOG(1) << "Invalid app item."; + continue; + } + + output.Append(std::move(output_map)); + } + + // TODO(thanhdng): Add a UMA histogram here to record the parse have completed + // successfully. + return output; +} + +} // namespace app_list
diff --git a/chrome/browser/ui/app_list/search/arc/recommend_apps_fetcher_impl.h b/chrome/browser/ui/app_list/search/arc/recommend_apps_fetcher_impl.h new file mode 100644 index 0000000..0ba354c --- /dev/null +++ b/chrome/browser/ui/app_list/search/arc/recommend_apps_fetcher_impl.h
@@ -0,0 +1,96 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_APP_LIST_SEARCH_ARC_RECOMMEND_APPS_FETCHER_IMPL_H_ +#define CHROME_BROWSER_UI_APP_LIST_SEARCH_ARC_RECOMMEND_APPS_FETCHER_IMPL_H_ + +#include "base/timer/timer.h" +#include "chrome/browser/ui/app_list/search/arc/recommend_apps_fetcher.h" + +namespace base { +class Value; +} // namespace base + +namespace network { +namespace mojom { +class URLLoaderFactory; +} // namespace mojom + +class SimpleURLLoader; +} // namespace network + +namespace app_list { + +class RecommendAppsFetcherDelegate; + +// This class handles the network request for the Arc App Reinstall +// Recommendation. The request requires the X-DFE-Device-Id (Android ID) header. +class RecommendAppsFetcherImpl : public RecommendAppsFetcher { + public: + RecommendAppsFetcherImpl( + RecommendAppsFetcherDelegate* delegate, + network::mojom::URLLoaderFactory* url_loader_factory); + ~RecommendAppsFetcherImpl() override; + + RecommendAppsFetcherImpl(const RecommendAppsFetcherImpl&) = delete; + RecommendAppsFetcherImpl& operator=(const RecommendAppsFetcherImpl&) = delete; + + // RecommendAppsFetcher: + void StartDownload() override; + + private: + // Abort the attempt to download the recommended app list if it takes too + // long. + void OnDownloadTimeout(); + + // Called when SimpleURLLoader completes. + void OnDownloaded(std::unique_ptr<std::string> response_body); + + // If the response is not a valid JSON, return base::nullopt. + // If the response contains no app, return base::nullopt; + // The value, if exists, is a list containing: + // 1. name: the title of the app. + // 2. package_name: name of the package, for example: com.package.name + // 3. Possibly an Icon URL. + // Parses an input string that looks somewhat like this: + // [ + // { + // "title_":{ + // "name_":"title of app" + // }, + // "id_":{ + // "id_":"com.package.name" + // }, + // "icon_":{ + // "url_":{ + // "privateDoNotAccessOrElseSafeUrlWrappedValue_":"http://icon_url.com/url" + // } + // } + // }, + // { + // "title_":"title of second app", + // "packageName_":"second package name." + // } + // ] + + base::Optional<base::Value> ParseResponse(base::StringPiece response); + + RecommendAppsFetcherDelegate* delegate_; + + network::mojom::URLLoaderFactory* url_loader_factory_; + std::unique_ptr<network::SimpleURLLoader> app_list_loader_; + + int64_t android_id_ = 0; + bool get_android_id_successfully_ = false; + + // Timer that enforces a custom (shorter) timeout on the attempt to download + // the recommended app list. + base::OneShotTimer download_timer_; + + base::TimeTicks start_time_; +}; + +} // namespace app_list + +#endif // CHROME_BROWSER_UI_APP_LIST_SEARCH_ARC_RECOMMEND_APPS_FETCHER_IMPL_H_
diff --git a/chrome/browser/ui/app_list/search/arc/recommend_apps_fetcher_impl_unittest.cc b/chrome/browser/ui/app_list/search/arc/recommend_apps_fetcher_impl_unittest.cc new file mode 100644 index 0000000..8b733f0 --- /dev/null +++ b/chrome/browser/ui/app_list/search/arc/recommend_apps_fetcher_impl_unittest.cc
@@ -0,0 +1,280 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/app_list/search/arc/recommend_apps_fetcher_impl.h" + +#include "base/run_loop.h" +#include "base/values.h" +#include "chrome/browser/ui/app_list/search/arc/fake_recommend_apps_fetcher_delegate.h" +#include "content/public/test/browser_task_environment.h" +#include "services/network/test/test_url_loader_factory.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace app_list { + +class AppListRecommendAppsFetcherImplTest : public testing::Test { + public: + AppListRecommendAppsFetcherImplTest() = default; + ~AppListRecommendAppsFetcherImplTest() override = default; + + void SetUp() override { + test_url_loader_factory_.SetInterceptor(base::BindRepeating( + &AppListRecommendAppsFetcherImplTest::InterceptRequest, + base::Unretained(this))); + + recommend_apps_fetcher_ = std::make_unique<RecommendAppsFetcherImpl>( + &delegate_, &test_url_loader_factory_); + } + + protected: + network::ResourceRequest* WaitForAppListRequest() { + if (test_url_loader_factory_.pending_requests()->size() == 0) { + request_waiter_ = std::make_unique<base::RunLoop>(); + request_waiter_->Run(); + request_waiter_.reset(); + } + return &test_url_loader_factory_.GetPendingRequest(0)->request; + } + + FakeRecommendAppsFetcherDelegate delegate_; + network::TestURLLoaderFactory test_url_loader_factory_; + std::unique_ptr<RecommendAppsFetcher> recommend_apps_fetcher_; + + private: + void InterceptRequest(const network::ResourceRequest& request) { + ASSERT_EQ( + "https://android.clients.google.com/fdfe/chrome/" + "getfastreinstallappslist?cfecu=false", + request.url.spec()); + if (request_waiter_) + request_waiter_->Quit(); + } + + content::BrowserTaskEnvironment task_environment_; + std::unique_ptr<base::RunLoop> request_waiter_; +}; + +TEST_F(AppListRecommendAppsFetcherImplTest, EmptyResponse) { + ASSERT_TRUE(recommend_apps_fetcher_); + + recommend_apps_fetcher_->StartDownload(); + + network::ResourceRequest* request = WaitForAppListRequest(); + ASSERT_TRUE(request); + test_url_loader_factory_.AddResponse(request->url.spec(), ""); + + EXPECT_EQ(FakeRecommendAppsFetcherDelegate::Result::LOAD_ERROR, + delegate_.WaitForResult()); +} + +TEST_F(AppListRecommendAppsFetcherImplTest, EmptyAppList) { + ASSERT_TRUE(recommend_apps_fetcher_); + + recommend_apps_fetcher_->StartDownload(); + + network::ResourceRequest* request = WaitForAppListRequest(); + ASSERT_TRUE(request); + test_url_loader_factory_.AddResponse(request->url.spec(), "[]"); + + EXPECT_EQ(FakeRecommendAppsFetcherDelegate::Result::PARSE_ERROR, + delegate_.WaitForResult()); +} + +TEST_F(AppListRecommendAppsFetcherImplTest, ResponseWithLeadeingBrackets) { + ASSERT_TRUE(recommend_apps_fetcher_); + + recommend_apps_fetcher_->StartDownload(); + + network::ResourceRequest* request = WaitForAppListRequest(); + ASSERT_TRUE(request); + + const std::string response = + R"()]}'[{ + "title_": {"name_": "Test app 1"}, + "id_": {"id_": "test.app1"}, + "icon_": { + "url_": { + "privateDoNotAccessOrElseSafeUrlWrappedValue_": "http://test.app" + } + } + }])"; + + test_url_loader_factory_.AddResponse(request->url.spec(), response); + + EXPECT_EQ(FakeRecommendAppsFetcherDelegate::Result::SUCCESS, + delegate_.WaitForResult()); + base::Value expected_apps(base::Value::Type::LIST); + base::Value app(base::Value::Type::DICTIONARY); + app.SetKey("name", base::Value("Test app 1")); + app.SetKey("icon", base::Value("http://test.app")); + app.SetKey("package_name", base::Value("test.app1")); + expected_apps.Append(std::move(app)); + + EXPECT_EQ(expected_apps, delegate_.loaded_apps()); +} + +TEST_F(AppListRecommendAppsFetcherImplTest, MalformedJsonResponse) { + ASSERT_TRUE(recommend_apps_fetcher_); + + recommend_apps_fetcher_->StartDownload(); + + network::ResourceRequest* request = WaitForAppListRequest(); + ASSERT_TRUE(request); + + test_url_loader_factory_.AddResponse(request->url.spec(), ")}]'!2%^$"); + + EXPECT_EQ(FakeRecommendAppsFetcherDelegate::Result::PARSE_ERROR, + delegate_.WaitForResult()); +} + +TEST_F(AppListRecommendAppsFetcherImplTest, UnexpectedResponseType) { + ASSERT_TRUE(recommend_apps_fetcher_); + + recommend_apps_fetcher_->StartDownload(); + + network::ResourceRequest* request = WaitForAppListRequest(); + ASSERT_TRUE(request); + + test_url_loader_factory_.AddResponse(request->url.spec(), "\"abcd\""); + + EXPECT_EQ(FakeRecommendAppsFetcherDelegate::Result::PARSE_ERROR, + delegate_.WaitForResult()); +} + +TEST_F(AppListRecommendAppsFetcherImplTest, ResponseWithMultipleApps) { + ASSERT_TRUE(recommend_apps_fetcher_); + + recommend_apps_fetcher_->StartDownload(); + + network::ResourceRequest* request = WaitForAppListRequest(); + ASSERT_TRUE(request); + + const std::string response = + R"([{ + "title_": {"name_": "Test app 1"}, + "id_": {"id_": "test.app1"}, + "icon_": { + "url_": { + "privateDoNotAccessOrElseSafeUrlWrappedValue_": "http://test.app" + } + } + }, { + "id_": {"id_": "test.app2"} + }])"; + + test_url_loader_factory_.AddResponse(request->url.spec(), response); + + EXPECT_EQ(FakeRecommendAppsFetcherDelegate::Result::SUCCESS, + delegate_.WaitForResult()); + base::Value expected_apps(base::Value::Type::LIST); + base::Value app1(base::Value::Type::DICTIONARY); + app1.SetKey("name", base::Value("Test app 1")); + app1.SetKey("icon", base::Value("http://test.app")); + app1.SetKey("package_name", base::Value("test.app1")); + expected_apps.Append(std::move(app1)); + + base::Value app2(base::Value::Type::DICTIONARY); + app2.SetKey("package_name", base::Value("test.app2")); + expected_apps.Append(std::move(app2)); + + EXPECT_EQ(expected_apps, delegate_.loaded_apps()); +} + +TEST_F(AppListRecommendAppsFetcherImplTest, InvalidAppItemsIgnored) { + ASSERT_TRUE(recommend_apps_fetcher_); + + recommend_apps_fetcher_->StartDownload(); + + network::ResourceRequest* request = WaitForAppListRequest(); + ASSERT_TRUE(request); + + const std::string response = + R"([{ + "title_": {"name_": "Test app 1"}, + "id_": {"id_": "test.app1"}, + "icon_": { + "url_": { + "privateDoNotAccessOrElseSafeUrlWrappedValue_": "http://test.app" + } + } + }, [], 2, {"id_": {"id_": "test.app2"}}, {"a": "b"}])"; + + test_url_loader_factory_.AddResponse(request->url.spec(), response); + + EXPECT_EQ(FakeRecommendAppsFetcherDelegate::Result::SUCCESS, + delegate_.WaitForResult()); + base::Value expected_apps(base::Value::Type::LIST); + base::Value app1(base::Value::Type::DICTIONARY); + app1.SetKey("name", base::Value("Test app 1")); + app1.SetKey("icon", base::Value("http://test.app")); + app1.SetKey("package_name", base::Value("test.app1")); + expected_apps.Append(std::move(app1)); + + base::Value app2(base::Value::Type::DICTIONARY); + app2.SetKey("package_name", base::Value("test.app2")); + expected_apps.Append(std::move(app2)); + + EXPECT_EQ(expected_apps, delegate_.loaded_apps()); +} + +TEST_F(AppListRecommendAppsFetcherImplTest, DictionaryResponse) { + ASSERT_TRUE(recommend_apps_fetcher_); + + recommend_apps_fetcher_->StartDownload(); + + network::ResourceRequest* request = WaitForAppListRequest(); + ASSERT_TRUE(request); + + test_url_loader_factory_.AddResponse(request->url.spec(), "{}"); + + EXPECT_EQ(FakeRecommendAppsFetcherDelegate::Result::PARSE_ERROR, + delegate_.WaitForResult()); +} + +TEST_F(AppListRecommendAppsFetcherImplTest, InvalidErrorCodeType) { + ASSERT_TRUE(recommend_apps_fetcher_); + + recommend_apps_fetcher_->StartDownload(); + + network::ResourceRequest* request = WaitForAppListRequest(); + ASSERT_TRUE(request); + + test_url_loader_factory_.AddResponse(request->url.spec(), + R"({"Error code": ""})"); + + EXPECT_EQ(FakeRecommendAppsFetcherDelegate::Result::PARSE_ERROR, + delegate_.WaitForResult()); +} + +TEST_F(AppListRecommendAppsFetcherImplTest, NotEnoughAppsError) { + ASSERT_TRUE(recommend_apps_fetcher_); + + recommend_apps_fetcher_->StartDownload(); + + network::ResourceRequest* request = WaitForAppListRequest(); + ASSERT_TRUE(request); + + test_url_loader_factory_.AddResponse(request->url.spec(), + R"({"Error code": "5"})"); + + EXPECT_EQ(FakeRecommendAppsFetcherDelegate::Result::PARSE_ERROR, + delegate_.WaitForResult()); +} + +TEST_F(AppListRecommendAppsFetcherImplTest, AppListRequestFailure) { + ASSERT_TRUE(recommend_apps_fetcher_); + + recommend_apps_fetcher_->StartDownload(); + + network::ResourceRequest* request = WaitForAppListRequest(); + ASSERT_TRUE(request); + + test_url_loader_factory_.AddResponse(request->url.spec(), "", + net::HTTP_BAD_REQUEST); + + EXPECT_EQ(FakeRecommendAppsFetcherDelegate::Result::LOAD_ERROR, + delegate_.WaitForResult()); +} + +} // namespace app_list
diff --git a/chrome/browser/ui/ash/chrome_new_window_client_browsertest.cc b/chrome/browser/ui/ash/chrome_new_window_client_browsertest.cc index 71c5de5e0..f043553 100644 --- a/chrome/browser/ui/ash/chrome_new_window_client_browsertest.cc +++ b/chrome/browser/ui/ash/chrome_new_window_client_browsertest.cc
@@ -240,9 +240,12 @@ class TestSettingsWindowManager : public chrome::SettingsWindowManager { public: - void ShowChromePageForProfile(Profile* profile, const GURL& gurl) override { + void ShowChromePageForProfile(Profile* profile, + const GURL& gurl, + int64_t display_id) override { last_navigation_url_ = gurl; - chrome::SettingsWindowManager::ShowChromePageForProfile(profile, gurl); + chrome::SettingsWindowManager::ShowChromePageForProfile(profile, gurl, + display_id); } const GURL& last_navigation_url() { return last_navigation_url_; }
diff --git a/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_browsertest.cc b/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_browsertest.cc index af1cb80..beaaae69 100644 --- a/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_browsertest.cc +++ b/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_browsertest.cc
@@ -16,11 +16,11 @@ #include "chrome/browser/apps/app_service/app_service_proxy.h" #include "chrome/browser/apps/app_service/app_service_proxy_factory.h" #include "chrome/browser/apps/platform_apps/app_browsertest_util.h" +#include "chrome/browser/ash/borealis/borealis_service.h" +#include "chrome/browser/ash/borealis/borealis_window_manager.h" +#include "chrome/browser/ash/borealis/borealis_window_manager_mock.h" #include "chrome/browser/chromeos/arc/arc_util.h" #include "chrome/browser/chromeos/arc/session/arc_session_manager.h" -#include "chrome/browser/chromeos/borealis/borealis_service.h" -#include "chrome/browser/chromeos/borealis/borealis_window_manager.h" -#include "chrome/browser/chromeos/borealis/borealis_window_manager_mock.h" #include "chrome/browser/chromeos/guest_os/guest_os_registry_service.h" #include "chrome/browser/chromeos/guest_os/guest_os_registry_service_factory.h" #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_launcher_controller.cc b/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_launcher_controller.cc index 5b38751..42363fc 100644 --- a/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_launcher_controller.cc +++ b/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_launcher_controller.cc
@@ -15,10 +15,10 @@ #include "base/containers/contains.h" #include "base/feature_list.h" #include "chrome/browser/apps/app_service/app_service_proxy_factory.h" +#include "chrome/browser/ash/borealis/borealis_service.h" +#include "chrome/browser/ash/borealis/borealis_window_manager.h" #include "chrome/browser/ash/crosapi/browser_util.h" #include "chrome/browser/chromeos/arc/arc_util.h" -#include "chrome/browser/chromeos/borealis/borealis_service.h" -#include "chrome/browser/chromeos/borealis/borealis_window_manager.h" #include "chrome/browser/chromeos/crostini/crostini_features.h" #include "chrome/browser/chromeos/crostini/crostini_shelf_utils.h" #include "chrome/browser/chromeos/plugin_vm/plugin_vm_util.h"
diff --git a/chrome/browser/ui/ash/launcher/app_service/app_service_shelf_context_menu.cc b/chrome/browser/ui/ash/launcher/app_service/app_service_shelf_context_menu.cc index 506c53b5..c2ab23e 100644 --- a/chrome/browser/ui/ash/launcher/app_service/app_service_shelf_context_menu.cc +++ b/chrome/browser/ui/ash/launcher/app_service/app_service_shelf_context_menu.cc
@@ -12,11 +12,11 @@ #include "chrome/browser/apps/app_service/app_service_proxy.h" #include "chrome/browser/apps/app_service/app_service_proxy_factory.h" #include "chrome/browser/apps/app_service/menu_util.h" +#include "chrome/browser/ash/borealis/borealis_service.h" +#include "chrome/browser/ash/borealis/borealis_shutdown_monitor.h" +#include "chrome/browser/ash/borealis/borealis_util.h" #include "chrome/browser/ash/crosapi/browser_manager.h" #include "chrome/browser/chromeos/arc/app_shortcuts/arc_app_shortcuts_menu_builder.h" -#include "chrome/browser/chromeos/borealis/borealis_service.h" -#include "chrome/browser/chromeos/borealis/borealis_shutdown_monitor.h" -#include "chrome/browser/chromeos/borealis/borealis_util.h" #include "chrome/browser/chromeos/crostini/crostini_manager.h" #include "chrome/browser/chromeos/crostini/crostini_shelf_utils.h" #include "chrome/browser/chromeos/crostini/crostini_terminal.h"
diff --git a/chrome/browser/ui/ash/launcher/app_service/exo_app_type_resolver.cc b/chrome/browser/ui/ash/launcher/app_service/exo_app_type_resolver.cc index e9da9b0..309e42c 100644 --- a/chrome/browser/ui/ash/launcher/app_service/exo_app_type_resolver.cc +++ b/chrome/browser/ui/ash/launcher/app_service/exo_app_type_resolver.cc
@@ -6,7 +6,7 @@ #include "ash/public/cpp/app_types.h" #include "base/strings/string_piece.h" -#include "chrome/browser/chromeos/borealis/borealis_window_manager.h" +#include "chrome/browser/ash/borealis/borealis_window_manager.h" #include "chromeos/crosapi/cpp/crosapi_constants.h" #include "chromeos/ui/base/window_properties.h" #include "components/arc/arc_util.h"
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_browsertest.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_browsertest.cc index ea8934d..0b926b4 100644 --- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_browsertest.cc +++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_browsertest.cc
@@ -118,6 +118,7 @@ #include "ui/display/manager/display_manager.h" #include "ui/display/screen.h" #include "ui/display/test/display_manager_test_api.h" +#include "ui/display/types/display_constants.h" #include "ui/events/base_event_utils.h" #include "ui/events/event.h" #include "ui/events/test/event_generator.h" @@ -2263,7 +2264,8 @@ // Open a settings window. Number of browser items should remain unchanged, // number of shelf items should increase. settings_manager->ShowChromePageForProfile( - browser()->profile(), chrome::GetOSSettingsUrl(std::string())); + browser()->profile(), chrome::GetOSSettingsUrl(std::string()), + display::kInvalidDisplayId); // Spin a run loop to sync Ash's ShelfModel change for the settings window. base::RunLoop().RunUntilIdle(); Browser* settings_browser =
diff --git a/chrome/browser/ui/ash/projector/projector_client_impl.cc b/chrome/browser/ui/ash/projector/projector_client_impl.cc index c891b0c8..98f00102 100644 --- a/chrome/browser/ui/ash/projector/projector_client_impl.cc +++ b/chrome/browser/ui/ash/projector/projector_client_impl.cc
@@ -7,7 +7,6 @@ #include "ash/public/cpp/projector/projector_controller.h" #include "base/optional.h" #include "chrome/browser/accessibility/soda_installer.h" -#include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/speech/on_device_speech_recognizer.h" ProjectorClientImpl::ProjectorClientImpl() { @@ -29,7 +28,7 @@ DCHECK(OnDeviceSpeechRecognizer::IsOnDeviceSpeechRecognizerAvailable()); DCHECK_EQ(speech_recognizer_.get(), nullptr); speech_recognizer_ = std::make_unique<OnDeviceSpeechRecognizer>( - weak_ptr_factory_.GetWeakPtr(), ProfileManager::GetPrimaryUserProfile()); + weak_ptr_factory_.GetWeakPtr()); speech_recognizer_->Start(); }
diff --git a/chrome/browser/ui/ash/system_tray_client.cc b/chrome/browser/ui/ash/system_tray_client.cc index d01dabc..657e8d4 100644 --- a/chrome/browser/ui/ash/system_tray_client.cc +++ b/chrome/browser/ui/ash/system_tray_client.cc
@@ -290,11 +290,11 @@ //////////////////////////////////////////////////////////////////////////////// // ash::mojom::SystemTrayClient: -void SystemTrayClient::ShowSettings() { +void SystemTrayClient::ShowSettings(int64_t display_id) { // TODO(jamescook): Use different metric for OS settings. base::RecordAction(base::UserMetricsAction("ShowOptions")); chrome::SettingsWindowManager::GetInstance()->ShowOSSettings( - ProfileManager::GetActiveUserProfile()); + ProfileManager::GetActiveUserProfile(), display_id); } void SystemTrayClient::ShowBluetoothSettings() {
diff --git a/chrome/browser/ui/ash/system_tray_client.h b/chrome/browser/ui/ash/system_tray_client.h index f8000b2e..aae22749 100644 --- a/chrome/browser/ui/ash/system_tray_client.h +++ b/chrome/browser/ui/ash/system_tray_client.h
@@ -52,7 +52,7 @@ const std::string& current_locale_iso_code); // ash::SystemTrayClient: - void ShowSettings() override; + void ShowSettings(int64_t display_id) override; void ShowBluetoothSettings() override; void ShowBluetoothPairingDialog(const std::string& address, const base::string16& name_for_display,
diff --git a/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl.cc b/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl.cc index 936a923..5ba1ee1 100644 --- a/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl.cc +++ b/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl.cc
@@ -12,7 +12,6 @@ #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/page_action/page_action_icon_type.h" -#include "components/autofill/core/browser/autofill_metrics.h" #include "components/strings/grit/components_strings.h" #include "content/public/browser/navigation_handle.h" #include "ui/base/l10n/l10n_util.h" @@ -75,32 +74,7 @@ PaymentsBubbleClosedReason closed_reason) { set_bubble_view(nullptr); UpdatePageActionIcon(); - - // Log bubble result according to the closed reason. - AutofillMetrics::OfferNotificationBubbleResultMetric metric; - switch (closed_reason) { - case PaymentsBubbleClosedReason::kAccepted: - metric = AutofillMetrics::OfferNotificationBubbleResultMetric:: - OFFER_NOTIFICATION_BUBBLE_ACKNOWLEDGED; - break; - case PaymentsBubbleClosedReason::kClosed: - metric = AutofillMetrics::OfferNotificationBubbleResultMetric:: - OFFER_NOTIFICATION_BUBBLE_CLOSED; - break; - case PaymentsBubbleClosedReason::kNotInteracted: - metric = AutofillMetrics::OfferNotificationBubbleResultMetric:: - OFFER_NOTIFICATION_BUBBLE_NOT_INTERACTED; - break; - case PaymentsBubbleClosedReason::kLostFocus: - metric = AutofillMetrics::OfferNotificationBubbleResultMetric:: - OFFER_NOTIFICATION_BUBBLE_LOST_FOCUS; - break; - default: - NOTREACHED(); - return; - } - AutofillMetrics::LogOfferNotificationBubbleResultMetric(metric, - is_user_gesture_); + // TODO(crbug.com/1093057): Add logging metrics. } void OfferNotificationBubbleControllerImpl::ShowOfferNotificationIfApplicable( @@ -169,7 +143,7 @@ if (observer_for_testing_) observer_for_testing_->OnBubbleShown(); - AutofillMetrics::LogOfferNotificationBubbleOfferMetric(is_user_gesture_); + // TODO(crbug.com/1093057): Add logging metrics. } WEB_CONTENTS_USER_DATA_KEY_IMPL(OfferNotificationBubbleControllerImpl)
diff --git a/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl.h b/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl.h index c81142c7..c2f0f0c9 100644 --- a/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl.h +++ b/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl.h
@@ -78,8 +78,6 @@ observer_for_testing_ = observer; } - // Denotes whether the bubble is shown due to user gesture. If this is true, - // it means the bubble is a reshown bubble. bool is_user_gesture_ = false; // The related credit card for a card linked offer. This can be nullopt for
diff --git a/chrome/browser/ui/settings_window_manager_browsertest_chromeos.cc b/chrome/browser/ui/settings_window_manager_browsertest_chromeos.cc index dccc366..2fc79591 100644 --- a/chrome/browser/ui/settings_window_manager_browsertest_chromeos.cc +++ b/chrome/browser/ui/settings_window_manager_browsertest_chromeos.cc
@@ -29,6 +29,7 @@ #include "components/session_manager/core/session_manager.h" #include "content/public/browser/web_contents.h" #include "content/public/test/browser_test.h" +#include "ui/display/types/display_constants.h" #include "url/gurl.h" namespace { @@ -61,7 +62,8 @@ void ShowSettingsForProfile(Profile* profile) { settings_manager_->ShowChromePageForProfile( - profile, GURL(chrome::kChromeUISettingsURL)); + profile, GURL(chrome::kChromeUISettingsURL), + display::kInvalidDisplayId); } void CloseNonDefaultBrowsers() {
diff --git a/chrome/browser/ui/settings_window_manager_chromeos.cc b/chrome/browser/ui/settings_window_manager_chromeos.cc index 1c81380..4bc4da32 100644 --- a/chrome/browser/ui/settings_window_manager_chromeos.cc +++ b/chrome/browser/ui/settings_window_manager_chromeos.cc
@@ -7,6 +7,7 @@ #include "ash/public/cpp/app_types.h" #include "ash/public/cpp/resources/grit/ash_public_unscaled_resources.h" #include "chrome/browser/app_mode/app_mode_utils.h" +#include "chrome/browser/apps/app_service/launch_utils.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/ash/window_properties.h" #include "chrome/browser/ui/browser.h" @@ -72,7 +73,8 @@ } void SettingsWindowManager::ShowChromePageForProfile(Profile* profile, - const GURL& gurl) { + const GURL& gurl, + int64_t display_id) { // Use the original (non off-the-record) profile for settings unless // this is a guest session. if (!profile->IsGuestSession() && profile->IsOffTheRecord()) @@ -91,7 +93,8 @@ // TODO(crbug.com/1067073): Remove legacy Settings Window. if (!UseDeprecatedSettingsWindow(profile)) { web_app::LaunchSystemWebAppAsync(profile, web_app::SystemAppType::SETTINGS, - {.url = gurl}); + {.url = gurl}, + apps::MakeWindowInfo(display_id)); // SWA OS Settings don't use SettingsWindowManager to manage windows, don't // notify SettingsWindowObservers. return; @@ -140,13 +143,16 @@ observer.OnNewSettingsWindow(browser); } -void SettingsWindowManager::ShowOSSettings(Profile* profile) { - ShowOSSettings(profile, std::string()); +void SettingsWindowManager::ShowOSSettings(Profile* profile, + int64_t display_id) { + ShowOSSettings(profile, std::string(), display_id); } void SettingsWindowManager::ShowOSSettings(Profile* profile, - const std::string& sub_page) { - ShowChromePageForProfile(profile, chrome::GetOSSettingsUrl(sub_page)); + const std::string& sub_page, + int64_t display_id) { + ShowChromePageForProfile(profile, chrome::GetOSSettingsUrl(sub_page), + display_id); } Browser* SettingsWindowManager::FindBrowserForProfile(Profile* profile) {
diff --git a/chrome/browser/ui/settings_window_manager_chromeos.h b/chrome/browser/ui/settings_window_manager_chromeos.h index 17a807e..876392c 100644 --- a/chrome/browser/ui/settings_window_manager_chromeos.h +++ b/chrome/browser/ui/settings_window_manager_chromeos.h
@@ -12,6 +12,7 @@ #include "base/memory/singleton.h" #include "base/observer_list.h" #include "components/sessions/core/session_id.h" +#include "ui/display/types/display_constants.h" class Browser; class GURL; @@ -41,14 +42,19 @@ // Shows a chrome:// page (e.g. Settings, About) in an an existing system // Browser window for |profile| or creates a new one. - virtual void ShowChromePageForProfile(Profile* profile, const GURL& gurl); + virtual void ShowChromePageForProfile(Profile* profile, + const GURL& gurl, + int64_t display_id); // Shows the OS settings window for |profile|. When feature SplitSettings is // disabled, this behaves like ShowChromePageForProfile(). - void ShowOSSettings(Profile* profile); + void ShowOSSettings(Profile* profile, + int64_t display_id = display::kInvalidDisplayId); // As above, but shows a settings sub-page. - void ShowOSSettings(Profile* profile, const std::string& sub_page); + void ShowOSSettings(Profile* profile, + const std::string& sub_page, + int64_t display_id = display::kInvalidDisplayId); // If a Browser settings window for |profile| has already been created, // returns it, otherwise returns NULL.
diff --git a/chrome/browser/ui/startup/startup_browser_creator.cc b/chrome/browser/ui/startup/startup_browser_creator.cc index 7c54da5..2770884 100644 --- a/chrome/browser/ui/startup/startup_browser_creator.cc +++ b/chrome/browser/ui/startup/startup_browser_creator.cc
@@ -119,6 +119,13 @@ #include "ui/base/ui_base_features.h" #endif +#if defined(OS_WIN) || defined(OS_MAC) || \ + (defined(OS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)) +#include "chrome/browser/web_applications/components/url_handler_launch_params.h" +#include "chrome/browser/web_applications/components/url_handler_manager_impl.h" +#include "third_party/blink/public/common/features.h" +#endif + using content::BrowserThread; using content::ChildProcessSecurityPolicy; @@ -446,6 +453,53 @@ return false; } +#if defined(OS_WIN) || defined(OS_MAC) || \ + (defined(OS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)) +// If |command_line| contains a single URL argument and that URL matches URL +// handling registration from installed web apps, show app options to user and +// launch one if accepted. +// Returns true if launching an app, false otherwise. +bool MaybeLaunchUrlHandlerWebApp( + const base::CommandLine& command_line, + const base::FilePath& cur_dir, + std::unique_ptr<LaunchModeRecorder> launch_mode_recorder) { + if (!base::FeatureList::IsEnabled(blink::features::kWebAppEnableUrlHandlers)) + return false; + + const std::vector<web_app::UrlHandlerLaunchParams> url_handler_matches = + web_app::UrlHandlerManagerImpl::GetUrlHandlerMatches(command_line); + + // Launch the first match for which a Profile can be loaded. + // TODO(crbug/1072058): Use WebAppUiManagerImpl and WebAppDialogManager + // to display the intent picker dialog. Use the first match here for testing. + // TODO(crbug/1072058): Check user preferences before showing intent picker. + ProfileManager* profile_manager = g_browser_process->profile_manager(); + for (const auto& match : url_handler_matches) { + if (match.profile_path.empty() || match.app_id.empty() || + !match.url.is_valid()) { + continue; + } + // Do not load profile if profile path is not valid. + if (!profile_manager->GetProfileAttributesStorage() + .GetProfileAttributesWithPath(match.profile_path)) { + continue; + } + Profile* const profile = profile_manager->GetProfile(match.profile_path); + if (profile == nullptr) + continue; + + apps::AppServiceProxyFactory::GetForProfile(profile) + ->BrowserAppLauncher() + ->LaunchAppWithCallback( + match.app_id, command_line, cur_dir, + base::BindOnce(&FinalizeWebAppLaunch, + std::move(launch_mode_recorder))); + return true; + } + return false; +} +#endif + } // namespace StartupBrowserCreator::StartupBrowserCreator() = default; @@ -918,6 +972,15 @@ return true; } + // Web app URL handling. +#if defined(OS_WIN) || defined(OS_MAC) || \ + (defined(OS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)) + if (MaybeLaunchUrlHandlerWebApp(command_line, cur_dir, + std::make_unique<LaunchModeRecorder>())) { + return true; + } +#endif + return LaunchBrowserForLastProfiles(command_line, cur_dir, process_startup, last_used_profile, last_opened_profiles); }
diff --git a/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc b/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc index efdf507..1d33a01 100644 --- a/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc +++ b/chrome/browser/ui/startup/startup_browser_creator_browsertest.cc
@@ -102,6 +102,17 @@ #include "components/policy/core/common/policy_map.h" #include "components/policy/core/common/policy_types.h" +#if defined(OS_WIN) || defined(OS_MAC) || \ + (defined(OS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)) +#include "chrome/browser/ui/web_applications/app_browser_controller.h" +#include "chrome/browser/ui/web_applications/test/web_app_browsertest_util.h" +#include "chrome/browser/web_applications/components/os_integration_manager.h" +#include "chrome/browser/web_applications/components/url_handler_manager.h" +#include "chrome/browser/web_applications/test/fake_web_app_origin_association_manager.h" +#include "components/services/app_service/public/cpp/url_handler_info.h" +#include "third_party/blink/public/common/features.h" +#endif + using testing::Return; #endif // !BUILDFLAG(IS_CHROMEOS_ASH) @@ -1393,6 +1404,137 @@ #endif // !BUILDFLAG(IS_CHROMEOS_ASH) +#if defined(OS_WIN) || defined(OS_MAC) || \ + (defined(OS_LINUX) && !BUILDFLAG(IS_CHROMEOS_LACROS)) +class StartupBrowserWebAppUrlHandlingTest : public InProcessBrowserTest { + protected: + StartupBrowserWebAppUrlHandlingTest() { + scoped_feature_list_.InitAndEnableFeature( + blink::features::kWebAppEnableUrlHandlers); + } + + void SetUpOnMainThread() override { + InProcessBrowserTest::SetUpOnMainThread(); + OverrideAssociationManager(); + } + + web_app::WebAppProviderBase* provider() { + return web_app::WebAppProviderBase::GetProviderBase(browser()->profile()); + } + + // Install a web app with url_handlers then register it with the + // UrlHandlerManager. This is sufficient for testing URL matching and launch + // at startup. + web_app::AppId InstallWebAppWithUrlHandlers( + const std::vector<apps::UrlHandlerInfo>& url_handlers) { + std::unique_ptr<WebApplicationInfo> info = + std::make_unique<WebApplicationInfo>(); + info->start_url = GURL(kStartUrl); + info->title = base::UTF8ToUTF16(kAppName); + info->open_as_window = true; + info->url_handlers = url_handlers; + web_app::AppId app_id = + web_app::InstallWebApp(browser()->profile(), std::move(info)); + + auto& url_handler_manager = + provider()->os_integration_manager().url_handler_manager_for_testing(); + + base::RunLoop run_loop; + url_handler_manager.RegisterUrlHandlers( + app_id, base::BindLambdaForTesting([&](bool success) { + EXPECT_TRUE(success); + run_loop.Quit(); + })); + run_loop.Run(); + return app_id; + } + + void SetUpCommandlineAndStart(const std::string& url) { + base::CommandLine command_line(base::CommandLine::NO_PROGRAM); + command_line.AppendArg(url); + + std::vector<Profile*> last_opened_profiles; + StartupBrowserCreator browser_creator; + browser_creator.Start(command_line, + g_browser_process->profile_manager()->user_data_dir(), + browser()->profile(), last_opened_profiles); + } + + void OverrideAssociationManager() { + auto association_manager = + std::make_unique<web_app::FakeWebAppOriginAssociationManager>(); + association_manager->set_pass_through(true); + + auto& url_handler_manager = + provider()->os_integration_manager().url_handler_manager_for_testing(); + url_handler_manager.SetAssociationManagerForTesting( + std::move(association_manager)); + } + + base::test::ScopedFeatureList scoped_feature_list_; +}; + +IN_PROC_BROWSER_TEST_F(StartupBrowserWebAppUrlHandlingTest, + WebAppLaunch_InScopeUrl) { + apps::UrlHandlerInfo url_handler; + url_handler.origin = url::Origin::Create(GURL(kStartUrl)); + + web_app::AppId app_id = InstallWebAppWithUrlHandlers({url_handler}); + + // kStartUrl is in app scope. + SetUpCommandlineAndStart(kStartUrl); + + // Wait for app launch task to complete. + content::RunAllTasksUntilIdle(); + + // Check for new app window. + ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile())); + Browser* app_browser; + app_browser = FindOneOtherBrowser(browser()); + ASSERT_TRUE(app_browser); + ASSERT_TRUE(web_app::AppBrowserController::IsForWebApp(app_browser, app_id)); +} + +IN_PROC_BROWSER_TEST_F(StartupBrowserWebAppUrlHandlingTest, + WebAppLaunch_DifferentOriginUrl) { + apps::UrlHandlerInfo url_handler; + url_handler.origin = url::Origin::Create(GURL("https://example.com")); + web_app::AppId app_id = InstallWebAppWithUrlHandlers({url_handler}); + + // URL is not in app scope but matches url_handlers of installed app. + SetUpCommandlineAndStart("https://example.com/abc/def"); + + // Wait for app launch task to complete. + content::RunAllTasksUntilIdle(); + + // Check for new app window. + ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile())); + Browser* app_browser; + app_browser = FindOneOtherBrowser(browser()); + ASSERT_TRUE(app_browser); + ASSERT_TRUE(web_app::AppBrowserController::IsForWebApp(app_browser, app_id)); +} + +IN_PROC_BROWSER_TEST_F(StartupBrowserWebAppUrlHandlingTest, UrlNotCaptured) { + apps::UrlHandlerInfo url_handler; + url_handler.origin = url::Origin::Create(GURL("https://example.com")); + web_app::AppId app_id = InstallWebAppWithUrlHandlers({url_handler}); + + // This URL is not in scope of installed app and does not match url_handlers. + SetUpCommandlineAndStart("https://en.example.com/abc/def"); + + content::RunAllTasksUntilIdle(); + + // Check that new window is not app window. + ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile())); + ASSERT_FALSE(web_app::AppBrowserController::IsForWebApp(browser(), app_id)); + Browser* other_browser = FindOneOtherBrowser(browser()); + ASSERT_TRUE(other_browser); + ASSERT_FALSE( + web_app::AppBrowserController::IsForWebApp(other_browser, app_id)); +} +#endif + class StartupBrowserCreatorExtensionsCheckupExperimentTest : public extensions::ExtensionBrowserTest { public:
diff --git a/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_interactive_uitest.cc b/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_interactive_uitest.cc index 96062d1..56a66f0e 100644 --- a/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_interactive_uitest.cc +++ b/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_interactive_uitest.cc
@@ -4,18 +4,11 @@ #include "chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_test_base.h" -#include "base/test/metrics/histogram_tester.h" -#include "chrome/browser/ui/browser.h" -#include "chrome/browser/ui/page_action/page_action_icon_type.h" -#include "chrome/browser/ui/tabs/tab_strip_model.h" -#include "chrome/common/webui_url_constants.h" #include "chrome/test/base/interactive_test_utils.h" -#include "components/autofill/core/browser/autofill_metrics.h" #include "content/public/test/browser_test.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/base/test/ui_controls.h" #include "ui/events/base_event_utils.h" -#include "ui/views/bubble/bubble_frame_view.h" #include "ui/views/test/widget_test.h" #include "ui/views/widget/widget.h" @@ -31,46 +24,9 @@ OfferNotificationBubbleViewsInteractiveUiTest& operator=( const OfferNotificationBubbleViewsInteractiveUiTest&) = delete; - void ShowBubbleAndVerify() { - NavigateTo(chrome::kChromeUINewTabURL); - // Set the initial origin that the bubble will be displayed on. - SetUpOfferDataWithDomains( - {GURL("https://www.example.com/"), GURL("https://www.test.com/")}); - ResetEventWaiterForSequence({DialogEvent::BUBBLE_SHOWN}); - NavigateTo("https://www.example.com/first"); - WaitForObservedEvent(); - EXPECT_TRUE(IsIconVisible()); - EXPECT_TRUE(GetOfferNotificationBubbleViews()); - } - - void ClickOnViewAndWaitForBubbleDismissal(views::View* view) { - views::test::WidgetDestroyedWaiter destroyed_waiter( - GetOfferNotificationBubbleViews()->GetWidget()); - GetOfferNotificationBubbleViews()->ResetViewShownTimeStampForTesting(); - views::BubbleFrameView* bubble_frame_view = - static_cast<views::BubbleFrameView*>(GetOfferNotificationBubbleViews() - ->GetWidget() - ->non_client_view() - ->frame_view()); - bubble_frame_view->ResetViewShownTimeStampForTesting(); - ClickOnView(view); - destroyed_waiter.Wait(); - EXPECT_FALSE(GetOfferNotificationBubbleViews()); - EXPECT_TRUE(IsIconVisible()); - } - - void ClickOnIconAndReshowBubble() { - auto* icon = GetOfferNotificationIconView(); - EXPECT_TRUE(icon); - ResetEventWaiterForSequence({DialogEvent::BUBBLE_SHOWN}); - ClickOnView(icon); - WaitForObservedEvent(); - EXPECT_TRUE(IsIconVisible()); - EXPECT_TRUE(GetOfferNotificationBubbleViews()); - } - // TODO(crbug.com/1181615): Move shared functions to some utils. void ClickOnView(views::View* view) { + GetOfferNotificationBubbleViews()->ResetViewShownTimeStampForTesting(); base::RunLoop closure_loop; ui_test_utils::MoveMouseToCenterAndPress( view, ui_controls::LEFT, ui_controls::DOWN | ui_controls::UP, @@ -82,12 +38,26 @@ // Tests that bubble behaves correctly after user dismisses it. IN_PROC_BROWSER_TEST_F(OfferNotificationBubbleViewsInteractiveUiTest, DismissBubble) { - ShowBubbleAndVerify(); + // Set the initial origin that the bubble will be displayed on. + SetUpOfferDataWithDomains( + {GURL("https://www.example.com/"), GURL("https://www.test.com/")}); + ResetEventWaiterForSequence({DialogEvent::BUBBLE_SHOWN}); + NavigateTo("https://www.example.com/first"); + WaitForObservedEvent(); - // Dismiss the bubble by clicking the ok button. + // Bubble should be visible. + EXPECT_TRUE(IsIconVisible()); + EXPECT_TRUE(GetOfferNotificationBubbleViews()); + + // Dismiss the bubble by clicking the button. + views::test::WidgetDestroyedWaiter destroyed_waiter( + GetOfferNotificationBubbleViews()->GetWidget()); auto* ok_button = GetOfferNotificationBubbleViews()->GetOkButton(); EXPECT_TRUE(ok_button); - ClickOnViewAndWaitForBubbleDismissal(ok_button); + ClickOnView(ok_button); + destroyed_waiter.Wait(); + EXPECT_FALSE(GetOfferNotificationBubbleViews()); + EXPECT_TRUE(IsIconVisible()); // Navigates to another valid domain will not reshow the bubble. NavigateTo("https://www.example.com/second"); @@ -100,145 +70,4 @@ EXPECT_FALSE(IsIconVisible()); } -IN_PROC_BROWSER_TEST_F(OfferNotificationBubbleViewsInteractiveUiTest, - Logging_Shown) { - base::HistogramTester histogram_tester; - ShowBubbleAndVerify(); - - histogram_tester.ExpectBucketCount( - "Autofill.OfferNotificationBubbleOffer.CardLinkedOffer", - /*firstshow*/ false, 1); - - // Dismiss the bubble by clicking the ok button. - auto* ok_button = GetOfferNotificationBubbleViews()->GetOkButton(); - EXPECT_TRUE(ok_button); - ClickOnViewAndWaitForBubbleDismissal(ok_button); - - // Click on the omnibox icon to reshow the bubble. - ClickOnIconAndReshowBubble(); - - histogram_tester.ExpectBucketCount( - "Autofill.OfferNotificationBubbleOffer.CardLinkedOffer", /*reshow*/ true, - 1); -} - -IN_PROC_BROWSER_TEST_F(OfferNotificationBubbleViewsInteractiveUiTest, - Logging_Acknowledged) { - base::HistogramTester histogram_tester; - ShowBubbleAndVerify(); - - // Dismiss the bubble by clicking the ok button. - auto* ok_button = GetOfferNotificationBubbleViews()->GetOkButton(); - EXPECT_TRUE(ok_button); - ClickOnViewAndWaitForBubbleDismissal(ok_button); - - histogram_tester.ExpectUniqueSample( - "Autofill.OfferNotificationBubbleResult.CardLinkedOffer.FirstShow", - AutofillMetrics::OfferNotificationBubbleResultMetric:: - OFFER_NOTIFICATION_BUBBLE_ACKNOWLEDGED, - 1); - - // Click on the omnibox icon to reshow the bubble. - ClickOnIconAndReshowBubble(); - - // Click on the ok button to dismiss the bubble. - ok_button = GetOfferNotificationBubbleViews()->GetOkButton(); - EXPECT_TRUE(ok_button); - ClickOnViewAndWaitForBubbleDismissal(ok_button); - - histogram_tester.ExpectUniqueSample( - "Autofill.OfferNotificationBubbleResult.CardLinkedOffer.Reshows", - AutofillMetrics::OfferNotificationBubbleResultMetric:: - OFFER_NOTIFICATION_BUBBLE_ACKNOWLEDGED, - 1); -} - -IN_PROC_BROWSER_TEST_F(OfferNotificationBubbleViewsInteractiveUiTest, - Logging_Closed) { - base::HistogramTester histogram_tester; - ShowBubbleAndVerify(); - - // Dismiss the bubble by clicking the close button. - auto* close_button = GetOfferNotificationBubbleViews() - ->GetBubbleFrameView() - ->GetCloseButtonForTesting(); - EXPECT_TRUE(close_button); - ClickOnViewAndWaitForBubbleDismissal(close_button); - - histogram_tester.ExpectUniqueSample( - "Autofill.OfferNotificationBubbleResult.CardLinkedOffer.FirstShow", - AutofillMetrics::OfferNotificationBubbleResultMetric:: - OFFER_NOTIFICATION_BUBBLE_CLOSED, - 1); - - // Click on the omnibox icon to reshow the bubble. - ClickOnIconAndReshowBubble(); - - // Click on the close button to dismiss the bubble. - close_button = GetOfferNotificationBubbleViews() - ->GetBubbleFrameView() - ->GetCloseButtonForTesting(); - EXPECT_TRUE(close_button); - ClickOnViewAndWaitForBubbleDismissal(close_button); - - histogram_tester.ExpectUniqueSample( - "Autofill.OfferNotificationBubbleResult.CardLinkedOffer.Reshows", - AutofillMetrics::OfferNotificationBubbleResultMetric:: - OFFER_NOTIFICATION_BUBBLE_CLOSED, - 1); -} - -IN_PROC_BROWSER_TEST_F(OfferNotificationBubbleViewsInteractiveUiTest, - Logging_NotInteracted) { - base::HistogramTester histogram_tester; - ShowBubbleAndVerify(); - - // Mock browser being closed. - views::test::WidgetDestroyedWaiter destroyed_waiter( - GetOfferNotificationBubbleViews()->GetWidget()); - browser()->tab_strip_model()->CloseAllTabs(); - destroyed_waiter.Wait(); - - histogram_tester.ExpectUniqueSample( - "Autofill.OfferNotificationBubbleResult.CardLinkedOffer.FirstShow", - AutofillMetrics::OfferNotificationBubbleResultMetric:: - OFFER_NOTIFICATION_BUBBLE_NOT_INTERACTED, - 1); -} - -IN_PROC_BROWSER_TEST_F(OfferNotificationBubbleViewsInteractiveUiTest, - Logging_LostFocus) { - base::HistogramTester histogram_tester; - ShowBubbleAndVerify(); - - // Mock deactivation due to lost focus. - views::test::WidgetDestroyedWaiter destroyed_waiter1( - GetOfferNotificationBubbleViews()->GetWidget()); - GetOfferNotificationBubbleViews()->GetWidget()->CloseWithReason( - views::Widget::ClosedReason::kLostFocus); - destroyed_waiter1.Wait(); - - histogram_tester.ExpectUniqueSample( - "Autofill.OfferNotificationBubbleResult.CardLinkedOffer.FirstShow", - AutofillMetrics::OfferNotificationBubbleResultMetric:: - OFFER_NOTIFICATION_BUBBLE_LOST_FOCUS, - 1); - - // Click on the omnibox icon to reshow the bubble. - ClickOnIconAndReshowBubble(); - - // Mock deactivation due to lost focus. - views::test::WidgetDestroyedWaiter destroyed_waiter2( - GetOfferNotificationBubbleViews()->GetWidget()); - GetOfferNotificationBubbleViews()->GetWidget()->CloseWithReason( - views::Widget::ClosedReason::kLostFocus); - destroyed_waiter2.Wait(); - - histogram_tester.ExpectUniqueSample( - "Autofill.OfferNotificationBubbleResult.CardLinkedOffer.Reshows", - AutofillMetrics::OfferNotificationBubbleResultMetric:: - OFFER_NOTIFICATION_BUBBLE_LOST_FOCUS, - 1); -} - } // namespace autofill
diff --git a/chrome/browser/ui/views/borealis/OWNERS b/chrome/browser/ui/views/borealis/OWNERS index 1f1a286..83d5155 100644 --- a/chrome/browser/ui/views/borealis/OWNERS +++ b/chrome/browser/ui/views/borealis/OWNERS
@@ -1,3 +1,3 @@ -file://chrome/browser/chromeos/borealis/OWNERS +file://chrome/browser/ash/borealis/OWNERS # Please also consider adding an owner from chrome/browser/ui/views/OWNERS.
diff --git a/chrome/browser/ui/views/borealis/borealis_installer_view.cc b/chrome/browser/ui/views/borealis/borealis_installer_view.cc index eae7b4a..842b5e7 100644 --- a/chrome/browser/ui/views/borealis/borealis_installer_view.cc +++ b/chrome/browser/ui/views/borealis/borealis_installer_view.cc
@@ -12,10 +12,10 @@ #include "base/optional.h" #include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" -#include "chrome/browser/chromeos/borealis/borealis_context_manager.h" -#include "chrome/browser/chromeos/borealis/borealis_installer.h" -#include "chrome/browser/chromeos/borealis/borealis_service.h" -#include "chrome/browser/chromeos/borealis/borealis_util.h" +#include "chrome/browser/ash/borealis/borealis_context_manager.h" +#include "chrome/browser/ash/borealis/borealis_installer.h" +#include "chrome/browser/ash/borealis/borealis_service.h" +#include "chrome/browser/ash/borealis/borealis_util.h" #include "chrome/browser/ui/browser_navigator.h" #include "chrome/browser/ui/browser_navigator_params.h" #include "chrome/browser/ui/views/chrome_layout_provider.h" @@ -49,7 +49,7 @@ } // namespace -// Defined in chrome/browser/chromeos/borealis/borealis_util.h. +// Defined in chrome/browser/ash/borealis/borealis_util.h. void borealis::ShowBorealisInstallerView(Profile* profile) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); if (!g_borealis_installer_view) {
diff --git a/chrome/browser/ui/views/borealis/borealis_installer_view.h b/chrome/browser/ui/views/borealis/borealis_installer_view.h index 7f4561a..ce0a8c7 100644 --- a/chrome/browser/ui/views/borealis/borealis_installer_view.h +++ b/chrome/browser/ui/views/borealis/borealis_installer_view.h
@@ -7,8 +7,8 @@ #include "base/callback.h" #include "base/macros.h" -#include "chrome/browser/chromeos/borealis/borealis_installer.h" -#include "chrome/browser/chromeos/borealis/borealis_metrics.h" +#include "chrome/browser/ash/borealis/borealis_installer.h" +#include "chrome/browser/ash/borealis/borealis_metrics.h" #include "ui/views/metadata/metadata_header_macros.h" #include "ui/views/window/dialog_delegate.h" @@ -22,7 +22,7 @@ class Profile; // The front end for the Borealis installation process, works closely with -// "chrome/browser/chromeos/borealis/borealis_installer.h". +// "chrome/browser/ash/borealis/borealis_installer.h". class BorealisInstallerView : public views::DialogDelegateView, public borealis::BorealisInstaller::Observer { public:
diff --git a/chrome/browser/ui/views/borealis/borealis_installer_view_browsertest.cc b/chrome/browser/ui/views/borealis/borealis_installer_view_browsertest.cc index 401c4ab1..9141cc7 100644 --- a/chrome/browser/ui/views/borealis/borealis_installer_view_browsertest.cc +++ b/chrome/browser/ui/views/borealis/borealis_installer_view_browsertest.cc
@@ -5,13 +5,13 @@ #include "chrome/browser/ui/views/borealis/borealis_installer_view.h" #include "base/bind.h" -#include "chrome/browser/chromeos/borealis/borealis_context.h" -#include "chrome/browser/chromeos/borealis/borealis_context_manager_mock.h" -#include "chrome/browser/chromeos/borealis/borealis_installer.h" -#include "chrome/browser/chromeos/borealis/borealis_metrics.h" -#include "chrome/browser/chromeos/borealis/borealis_service_fake.h" -#include "chrome/browser/chromeos/borealis/borealis_task.h" -#include "chrome/browser/chromeos/borealis/borealis_util.h" +#include "chrome/browser/ash/borealis/borealis_context.h" +#include "chrome/browser/ash/borealis/borealis_context_manager_mock.h" +#include "chrome/browser/ash/borealis/borealis_installer.h" +#include "chrome/browser/ash/borealis/borealis_metrics.h" +#include "chrome/browser/ash/borealis/borealis_service_fake.h" +#include "chrome/browser/ash/borealis/borealis_task.h" +#include "chrome/browser/ash/borealis/borealis_util.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/test/test_browser_dialog.h"
diff --git a/chrome/browser/ui/views/borealis/borealis_splash_screen_view.cc b/chrome/browser/ui/views/borealis/borealis_splash_screen_view.cc index de20c1f..bf08704 100644 --- a/chrome/browser/ui/views/borealis/borealis_splash_screen_view.cc +++ b/chrome/browser/ui/views/borealis/borealis_splash_screen_view.cc
@@ -6,9 +6,9 @@ #include "ash/public/cpp/window_properties.h" #include "base/strings/utf_string_conversions.h" -#include "chrome/browser/chromeos/borealis/borealis_service.h" -#include "chrome/browser/chromeos/borealis/borealis_util.h" -#include "chrome/browser/chromeos/borealis/borealis_window_manager.h" +#include "chrome/browser/ash/borealis/borealis_service.h" +#include "chrome/browser/ash/borealis/borealis_util.h" +#include "chrome/browser/ash/borealis/borealis_window_manager.h" #include "chrome/browser/ui/browser_dialogs.h" #include "chrome/browser/ui/views/chrome_layout_provider.h" #include "ui/views/controls/message_box_view.h" @@ -22,7 +22,7 @@ namespace borealis { -// Declared in chrome/browser/chromeos/borealis/borealis_util.h. +// Declared in chrome/browser/ash/borealis/borealis_util.h. void ShowBorealisSplashScreenView(Profile* profile) { return BorealisSplashScreenView::Show(profile); }
diff --git a/chrome/browser/ui/views/borealis/borealis_splash_screen_view.h b/chrome/browser/ui/views/borealis/borealis_splash_screen_view.h index c227c542..7919f80 100644 --- a/chrome/browser/ui/views/borealis/borealis_splash_screen_view.h +++ b/chrome/browser/ui/views/borealis/borealis_splash_screen_view.h
@@ -5,7 +5,7 @@ #ifndef CHROME_BROWSER_UI_VIEWS_BOREALIS_BOREALIS_SPLASH_SCREEN_VIEW_H_ #define CHROME_BROWSER_UI_VIEWS_BOREALIS_BOREALIS_SPLASH_SCREEN_VIEW_H_ -#include "chrome/browser/chromeos/borealis/borealis_window_manager.h" +#include "chrome/browser/ash/borealis/borealis_window_manager.h" #include "ui/views/bubble/bubble_dialog_delegate_view.h" // A splash screen for borealis, displays when borealis is clicked and closed
diff --git a/chrome/browser/ui/views/borealis/borealis_splash_screen_view_browsertest.cc b/chrome/browser/ui/views/borealis/borealis_splash_screen_view_browsertest.cc index e3c123a..c086341 100644 --- a/chrome/browser/ui/views/borealis/borealis_splash_screen_view_browsertest.cc +++ b/chrome/browser/ui/views/borealis/borealis_splash_screen_view_browsertest.cc
@@ -1,28 +1,26 @@ // Copyright 2019 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/ui/views/borealis/borealis_splash_screen_view.h" -#include "chrome/browser/ui/test/test_browser_dialog.h" +#include "chrome/browser/ui/views/borealis/borealis_splash_screen_view.h" #include "base/test/bind.h" #include "base/test/scoped_feature_list.h" -#include "chrome/browser/chromeos/borealis/borealis_app_launcher.h" -#include "chrome/browser/chromeos/borealis/borealis_context.h" -#include "chrome/browser/chromeos/borealis/borealis_context_manager.h" -#include "chrome/browser/chromeos/borealis/borealis_context_manager_mock.h" -#include "chrome/browser/chromeos/borealis/borealis_features.h" -#include "chrome/browser/chromeos/borealis/borealis_prefs.h" -#include "chrome/browser/chromeos/borealis/borealis_service_fake.h" -#include "chrome/browser/chromeos/borealis/borealis_task.h" -#include "chrome/browser/chromeos/borealis/borealis_util.h" -#include "chrome/browser/chromeos/borealis/borealis_window_manager_mock.h" -#include "chrome/browser/chromeos/borealis/borealis_window_manager_test_helper.h" -#include "chrome/browser/chromeos/borealis/infra/expected.h" +#include "chrome/browser/ash/borealis/borealis_app_launcher.h" +#include "chrome/browser/ash/borealis/borealis_context.h" +#include "chrome/browser/ash/borealis/borealis_context_manager.h" +#include "chrome/browser/ash/borealis/borealis_context_manager_mock.h" +#include "chrome/browser/ash/borealis/borealis_features.h" +#include "chrome/browser/ash/borealis/borealis_prefs.h" +#include "chrome/browser/ash/borealis/borealis_service_fake.h" +#include "chrome/browser/ash/borealis/borealis_task.h" +#include "chrome/browser/ash/borealis/borealis_util.h" +#include "chrome/browser/ash/borealis/borealis_window_manager_mock.h" +#include "chrome/browser/ash/borealis/borealis_window_manager_test_helper.h" +#include "chrome/browser/ash/borealis/infra/expected.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/test/test_browser_dialog.h" -#include "chrome/browser/ui/views/borealis/borealis_splash_screen_view.h" #include "chrome/common/chrome_features.h" #include "components/prefs/pref_service.h" #include "content/public/test/browser_test.h"
diff --git a/chrome/browser/ui/views/bubble/bubble_contents_wrapper.cc b/chrome/browser/ui/views/bubble/bubble_contents_wrapper.cc index 1d81597..b684fb5 100644 --- a/chrome/browser/ui/views/bubble/bubble_contents_wrapper.cc +++ b/chrome/browser/ui/views/bubble/bubble_contents_wrapper.cc
@@ -36,8 +36,10 @@ BubbleContentsWrapper::BubbleContentsWrapper( content::BrowserContext* browser_context, int task_manager_string_id, - bool enable_extension_apis) - : web_contents_(content::WebContents::Create( + bool enable_extension_apis, + bool webui_resizes_host) + : webui_resizes_host_(webui_resizes_host), + web_contents_(content::WebContents::Create( GetWebContentsCreateParams(browser_context))) { web_contents_->SetDelegate(this); WebContentsObserver::Observe(web_contents_.get()); @@ -96,7 +98,7 @@ content::RenderViewHost* new_host) { content::RenderWidgetHostView* render_widget_host_view = web_contents_->GetRenderWidgetHostView(); - if (!render_widget_host_view) + if (!webui_resizes_host_ || !render_widget_host_view) return; render_widget_host_view->EnableAutoResize(gfx::Size(1, 1),
diff --git a/chrome/browser/ui/views/bubble/bubble_contents_wrapper.h b/chrome/browser/ui/views/bubble/bubble_contents_wrapper.h index ebfc62f..f2ae522 100644 --- a/chrome/browser/ui/views/bubble/bubble_contents_wrapper.h +++ b/chrome/browser/ui/views/bubble/bubble_contents_wrapper.h
@@ -43,7 +43,8 @@ BubbleContentsWrapper(content::BrowserContext* browser_context, int task_manager_string_id, - bool enable_extension_apis); + bool enable_extension_apis, + bool webui_resizes_host); ~BubbleContentsWrapper() override; // content::WebContentsDelegate: @@ -79,6 +80,9 @@ std::unique_ptr<content::WebContents> web_contents); private: + // If true will allow the wrapped WebContents to automatically resize its + // RenderWidgetHostView and send back updates to `Host` for the new size. + const bool webui_resizes_host_; base::WeakPtr<BubbleContentsWrapper::Host> host_; std::unique_ptr<content::WebContents> web_contents_; }; @@ -93,10 +97,12 @@ BubbleContentsWrapperT(const GURL& webui_url, content::BrowserContext* browser_context, int task_manager_string_id, - bool enable_extension_apis = false) + bool enable_extension_apis = false, + bool webui_resizes_host = true) : BubbleContentsWrapper(browser_context, task_manager_string_id, - enable_extension_apis), + enable_extension_apis, + webui_resizes_host), webui_url_(webui_url) {} void ReloadWebContents() override {
diff --git a/chrome/browser/ui/views/bubble/bubble_contents_wrapper_unittest.cc b/chrome/browser/ui/views/bubble/bubble_contents_wrapper_unittest.cc index 6a57f71..020308ff 100644 --- a/chrome/browser/ui/views/bubble/bubble_contents_wrapper_unittest.cc +++ b/chrome/browser/ui/views/bubble/bubble_contents_wrapper_unittest.cc
@@ -53,7 +53,7 @@ class TestBubbleContentsWrapper : public BubbleContentsWrapper { public: explicit TestBubbleContentsWrapper(Profile* profile) - : BubbleContentsWrapper(profile, 0, false) {} + : BubbleContentsWrapper(profile, 0, false, true) {} ~TestBubbleContentsWrapper() override = default; // BubbleContentsWrapper:
diff --git a/chrome/browser/ui/views/bubble/webui_bubble_dialog_view_unittest.cc b/chrome/browser/ui/views/bubble/webui_bubble_dialog_view_unittest.cc index 57225a88..6f7805f 100644 --- a/chrome/browser/ui/views/bubble/webui_bubble_dialog_view_unittest.cc +++ b/chrome/browser/ui/views/bubble/webui_bubble_dialog_view_unittest.cc
@@ -18,7 +18,7 @@ class TestBubbleContentsWrapper : public BubbleContentsWrapper { public: explicit TestBubbleContentsWrapper(Profile* profile) - : BubbleContentsWrapper(profile, 0, false) {} + : BubbleContentsWrapper(profile, 0, false, true) {} void ReloadWebContents() override {} }; } // namespace
diff --git a/chrome/browser/ui/views/bubble/webui_bubble_manager_browsertest.cc b/chrome/browser/ui/views/bubble/webui_bubble_manager_browsertest.cc index e64c841..1aa7be2 100644 --- a/chrome/browser/ui/views/bubble/webui_bubble_manager_browsertest.cc +++ b/chrome/browser/ui/views/bubble/webui_bubble_manager_browsertest.cc
@@ -24,10 +24,12 @@ BubbleContentsWrapperT(const GURL& webui_url, content::BrowserContext* browser_context, int task_manager_string_id, - bool enable_extension_apis = false) + bool enable_extension_apis = false, + bool webui_resizes_host = true) : BubbleContentsWrapper(browser_context, task_manager_string_id, - enable_extension_apis) {} + enable_extension_apis, + webui_resizes_host) {} void ReloadWebContents() override {} };
diff --git a/chrome/browser/ui/views/bubble/webui_bubble_manager_unittest.cc b/chrome/browser/ui/views/bubble/webui_bubble_manager_unittest.cc index 08f671d..34b7605e 100644 --- a/chrome/browser/ui/views/bubble/webui_bubble_manager_unittest.cc +++ b/chrome/browser/ui/views/bubble/webui_bubble_manager_unittest.cc
@@ -32,10 +32,12 @@ BubbleContentsWrapperT(const GURL& webui_url, content::BrowserContext* browser_context, int task_manager_string_id, - bool enable_extension_apis = false) + bool enable_extension_apis = false, + bool webui_resizes_host = true) : BubbleContentsWrapper(browser_context, task_manager_string_id, - enable_extension_apis) {} + enable_extension_apis, + webui_resizes_host) {} void ReloadWebContents() override {} };
diff --git a/chrome/browser/ui/views/read_later/read_later_button.cc b/chrome/browser/ui/views/read_later/read_later_button.cc index 94f8f2f0..a5e606d 100644 --- a/chrome/browser/ui/views/read_later/read_later_button.cc +++ b/chrome/browser/ui/views/read_later/read_later_button.cc
@@ -16,7 +16,7 @@ #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/read_later/reading_list_model_factory.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" -#include "chrome/browser/ui/views/bubble/webui_bubble_dialog_view.h" +#include "chrome/browser/ui/views/bubble/bubble_contents_wrapper.h" #include "chrome/browser/ui/views/chrome_layout_provider.h" #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/side_panel.h" @@ -90,17 +90,30 @@ constexpr base::TimeDelta kHighlightDuration = base::TimeDelta::FromMilliseconds(2250); -// TODO(pbos): We shouldn't be using a subclass of BubbleDialogDelegateView to -// host the WebContents for the side panel due to issues with the bubble frame. -class WebUIBubbleSidePanelView : public WebUIBubbleDialogView { +class ReadLaterSidePanelWebView : public views::WebView, + public BubbleContentsWrapper::Host { public: - using WebUIBubbleDialogView::WebUIBubbleDialogView; + ReadLaterSidePanelWebView(Profile* profile, base::RepeatingClosure close_cb) + : close_cb_(std::move(close_cb)), + contents_wrapper_(std::make_unique<BubbleContentsWrapperT<ReadLaterUI>>( + GURL(chrome::kChromeUIReadLaterURL), + profile, + IDS_READ_LATER_TITLE, + /*enable_extension_apis=*/true, + /*webui_resizes_host=*/false)) { + contents_wrapper_->SetHost(weak_factory_.GetWeakPtr()); + contents_wrapper_->ReloadWebContents(); + SetWebContents(contents_wrapper_->web_contents()); + } - // WebUIBubbleDialogView: - // Override this to prevent the bubble dialog view resizing and causing - // crashes due to incorrect casting of its frame view. - void ResizeDueToAutoResize(content::WebContents* source, - const gfx::Size& new_size) override {} + // BubbleContentsWrapper::Host: + void ShowUI() override {} + void CloseUI() override { close_cb_.Run(); } + + private: + base::RepeatingClosure close_cb_; + std::unique_ptr<BubbleContentsWrapperT<ReadLaterUI>> contents_wrapper_; + base::WeakPtrFactory<ReadLaterSidePanelWebView> weak_factory_{this}; }; } // namespace @@ -245,19 +258,20 @@ highlight_color_animation_->Hide(); if (browser_view->side_panel()) { - if (read_later_side_panel_bubble_) { - browser_view->side_panel()->RemoveContent(read_later_side_panel_bubble_); - read_later_side_panel_bubble_ = nullptr; + if (!side_panel_webview_) { + auto webview = std::make_unique<ReadLaterSidePanelWebView>( + browser_->profile(), + base::BindRepeating(&ReadLaterButton::ButtonPressed, + base::Unretained(this))); + side_panel_webview_ = + browser_view->side_panel()->AddChildView(std::move(webview)); + SetHighlighted(true); + } else { + browser_view->side_panel()->RemoveChildViewT(side_panel_webview_); + side_panel_webview_ = nullptr; // TODO(pbos): Observe read_later_side_panel_bubble_ so we don't need to // SetHighlighted(false) here. SetHighlighted(false); - } else { - DCHECK(contents_wrapper_); - auto bubble_view = std::make_unique<WebUIBubbleSidePanelView>( - this, contents_wrapper_.get()); - read_later_side_panel_bubble_ = bubble_view.get(); - browser_view->side_panel()->AddContent(std::move(bubble_view)); - SetHighlighted(true); } } else { if (webui_bubble_manager_->GetBubbleWidget()) {
diff --git a/chrome/browser/ui/views/read_later/read_later_button.h b/chrome/browser/ui/views/read_later/read_later_button.h index dcf3ab9c..e1da83e4 100644 --- a/chrome/browser/ui/views/read_later/read_later_button.h +++ b/chrome/browser/ui/views/read_later/read_later_button.h
@@ -19,7 +19,6 @@ #include "ui/views/widget/widget_utils.h" class Browser; -class WebUIBubbleDialogView; namespace views { class DotIndicator; @@ -102,8 +101,7 @@ Browser* const browser_; - // TODO(pbos): Figure out a better way to handle this. - WebUIBubbleDialogView* read_later_side_panel_bubble_ = nullptr; + views::View* side_panel_webview_ = nullptr; views::DotIndicator* dot_indicator_ = nullptr;
diff --git a/chrome/browser/ui/views/side_panel.cc b/chrome/browser/ui/views/side_panel.cc index 5ed70dca..33a872d2 100644 --- a/chrome/browser/ui/views/side_panel.cc +++ b/chrome/browser/ui/views/side_panel.cc
@@ -11,35 +11,29 @@ #include "ui/views/layout/fill_layout.h" #include "ui/views/metadata/metadata_impl_macros.h" +namespace { + +// TODO(pbos): Figure out what our preferred width should be. +constexpr int kDefaultWidth = 320; + +} // namespace + SidePanel::SidePanel() { AddObserver(this); SetVisible(false); SetLayoutManager(std::make_unique<views::FillLayout>()); + SetPanelWidth(kDefaultWidth); +} - // TODO(pbos): Figure out what our preferred size should be. Note that only - // the width is used by BrowserViewLayout. - SetPreferredSize(gfx::Size(320, 16)); +void SidePanel::SetPanelWidth(int width) { + // Only the width is used by BrowserViewLayout. + SetPreferredSize(gfx::Size(width, 1)); } SidePanel::~SidePanel() { RemoveObserver(this); } -void SidePanel::AddContent( - std::unique_ptr<views::BubbleDialogDelegateView> view) { - // TODO(pbos): When this is false, use AddChildView(std::move(view)) instead. - DCHECK(view->owned_by_client()); - AddChildView(view.get()); - owned_children_.push_back(std::move(view)); -} - -void SidePanel::RemoveContent(views::BubbleDialogDelegateView* view) { - DCHECK(Contains(view)); - base::EraseIf(owned_children_, - [view](const auto& c) { return c.get() == view; }); - DCHECK(!Contains(view)); -} - void SidePanel::OnThemeChanged() { views::View::OnThemeChanged(); const ui::ThemeProvider* const theme_provider = GetThemeProvider();
diff --git a/chrome/browser/ui/views/side_panel.h b/chrome/browser/ui/views/side_panel.h index 349b7b0a..a4ecf8e 100644 --- a/chrome/browser/ui/views/side_panel.h +++ b/chrome/browser/ui/views/side_panel.h
@@ -20,9 +20,7 @@ SidePanel& operator=(const SidePanel&) = delete; ~SidePanel() override; - // TODO(pbos): Remove need for this when BDDV is not set_owned_by_client(). - void AddContent(std::unique_ptr<views::BubbleDialogDelegateView> view); - void RemoveContent(views::BubbleDialogDelegateView* view); + void SetPanelWidth(int width); private: void UpdateVisibility();
diff --git a/chrome/browser/ui/views/web_apps/README.md b/chrome/browser/ui/views/web_apps/README.md new file mode 100644 index 0000000..ba6f00f2 --- /dev/null +++ b/chrome/browser/ui/views/web_apps/README.md
@@ -0,0 +1,121 @@ +# dPWA Integration Tests + +## Overview +The dPWA integration tests use a special framework. Each test is defined by a +series of "testing actions", and test cases are read from a csv file. + +### Identifying and Diagnosing Failed Tests + +Every test failure will log a message that will give: + + * the failing test case + * the failing action + * the line to add to the TestExpectations file to disable the test + * the command line argument to specify to run the given test locally + +### Test Input Files + +Test files live in //chrome/browser/test/data/web_apps/: + * web_app_integration_browsertest_cases.csv + * web_app_integration_browsertest_cases_sync.csv + * TestExpectations + +### Disabling a Test + +To disable a failing / crashing test, add an entry to the TestExpectations +file mentioned above. The format is as follows: +``` +crbug.com/id [ Platform ] [ Expectation ] list,of,actions,in,test +``` + +The list of supported platforms and expectations is maintained in the +TestExpectations file. This test suite requires adding an entry +per-platform that the test should be disabled on. Please create a bug for each +test case added to this file. + +## How It Works + +The way in which this works is by using a script to generate a minimal set of +test cases that produce the maximum amount of code coverage, and reading in that +script output in these test implementations. + + +This suite of tests has two main parts: + 1. A script that analyzes dPWA code ([See design +doc](https://docs.google.com/document/d/1YmeNZCpIwUbeV3K3HGUdXzJjZDKIDyKrGfyjnYaLR5k). + 2. The test implementations ([See design +doc](https://docs.google.com/document/d/1Gd14fjwA4VKoRzL2TAvi9paXwyh36ehlS4gbpUmUeeI). + +### Script +The [python script](https://crrev.com/c/2459059) takes (among other things) +as input: + * A list of all testing actions + * A list of testing actions currently supported by the testing framework + * A list of all testing journeys that we need coverage for + +These lists will be checked in via tsv files with the above-linked CL, but the +source of truth lives in this [spreadsheet](https://docs.google.com/spreadsheets/d/1d3iAOAnojp4_WrPky9exz1-mjkeulOJVUav5QYG99MQ). +See "Test Input Files" section for location of test case files. + +The testing actions represent actions that users can take that trigger dPWA +code, such as navigating to an installable site, or installing a PWA. Testing +actions can also represent things such as setting up an enterprise policy +to install an app. The script will generate a coverage graph, prune the +graph to only include actions currently supported by the framework, and it will +generate a test case definition csv file with the goal of minimizing the +number of test cases to get maximum coverage. + +### Test implementation +The high level flow of execution is as follows: + * Read the input file which contains the test cases + * Parse the test cases into an `std::vector<std::vector<std::string>>` + * Pass the vector of test cases to a parameterized test using + `testing::ValuesIn()`, which will run a test for each line in the input + file + * Each test will loop over the testing actions, calling + `ExecuteAction(action_string)` + * `ExecuteAction()` will switch on the string, and call the appropriate + action implementation method + * A state snapshot will be captured after non-inspection (state mutating) + actions (so inspection actions can assert various state changes) + + +## Components +[Design +doc](https://docs.google.com/document/d/139ktCajbmbFKh4T-vEhipTxilyYrXf_rlCBHIvrdeSg). + +### WebAppIntegrationBrowserTestBase +A helper class containing most of the test implementation, meant to be used +as a private member on the test-driving classes. Contains most of the test +implementation: + * Input file parser + * ExecuteAction() + * Most action implementation methods + * Capturing state snapshots + +### WebAppIntegrationBrowserTestBase::TestDelegate +An abstract class that’s an application of the delegate interface pattern. +`WebAppIntegrationBrowserTestBase` stores an instance of this class as a +private member, `delegate_`, allowing the base class to call into protected +members of `InProcessBrowserTest` or `SyncTest`, such as +`InProcessBrowserTest::browser()` or `SyncTest::GetAllProfiles()`. This also +has pure virtual methods for sync functionality that needs to be implemented +in `TwoClientWebAppsSyncTest`, but called from the base class. + +### WebAppIntegrationBrowserTest +Subclass of both `InProcessBrowserTest` and +`WebAppIntegrationBrowserTestBase::TestDelegate`. Drives the test by +calling `IN_PROC_BROWSER_TEST_P` and instantiating the parameterized +test as described above. Responsible for telling the base class where the test +input files live, handling test setup, and implementing `TestDelegate` methods +to expose protected members of `InProcessBrowserTest` to the base class. This +class owns the base class, and stores it as a private member, `helper_`, passing +it an instance of itself (as the TestDelegate) on construction. + + +### TwoClientWebAppsSyncTest +Similar to `WebAppIntegrationBrowserTest`, but inheriting from `SyncTest` +instead of from `InProcessBrowserTest`. In addition, some testing actions +related to profile sync are implemented in this class, and are exposed via +`TestDelegate` pure virtual method overrides. +
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_browsertest.cc b/chrome/browser/ui/views/web_apps/web_app_integration_browsertest.cc index f6d9790..b4dcf69 100644 --- a/chrome/browser/ui/views/web_apps/web_app_integration_browsertest.cc +++ b/chrome/browser/ui/views/web_apps/web_app_integration_browsertest.cc
@@ -73,6 +73,8 @@ return std::vector<Profile*>{browser()->profile()}; } + bool IsSyncTest() override { return false; } + bool UserSigninInternal() override { NOTREACHED(); return false;
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_browsertest_base.cc b/chrome/browser/ui/views/web_apps/web_app_integration_browsertest_base.cc index 6959f48..1ea357a 100644 --- a/chrome/browser/ui/views/web_apps/web_app_integration_browsertest_base.cc +++ b/chrome/browser/ui/views/web_apps/web_app_integration_browsertest_base.cc
@@ -82,6 +82,26 @@ } }; +std::string BuildScopedTrace(const std::string& action_string, + const std::vector<std::string>& testing_actions, + bool is_sync_test) { + const std::string test_case = base::JoinString(testing_actions, ", "); + return base::StringPrintf( + "\nFailed test case: %s\n" + "Failed action: %s\n" + "To disable this test, add the following line to " + "//chrome/test/data/web_apps/TestExpectations:\n" + "crbug.com/XXXXX [ %s ] [ Skip ] %s\n" + "To run this test in isolation, run the following command:\n" + "out/Default/%s_tests --gtest_filter=\"*%s*\" " + "--web-app-integration-test-case=%s\n", + test_case.c_str(), action_string.c_str(), kPlatformName, + test_case.c_str(), is_sync_test ? "sync_integration" : "browser", + is_sync_test ? "TwoClientWebAppsIntegrationSyncTest" + : "WebAppIntegrationBrowserTest", + test_case.c_str()); +} + } // anonymous namespace BrowserState::BrowserState( @@ -249,7 +269,6 @@ void WebAppIntegrationBrowserTestBase::ParseParams(std::string action_strings) { // Useful for debugging since all tests are run in a single parameterized // test. - LOG(ERROR) << "Test case: " << action_strings; testing_actions_ = base::SplitString( action_strings, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY); } @@ -357,6 +376,8 @@ // alphabetical order. void WebAppIntegrationBrowserTestBase::ExecuteAction( const std::string& action_string) { + SCOPED_TRACE(BuildScopedTrace(action_string, testing_actions(), + delegate_->IsSyncTest())); if (base::EndsWith(action_string, "site_b")) { FAIL() << "site_b actions not yet supported: " << action_string; }
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_browsertest_base.h b/chrome/browser/ui/views/web_apps/web_app_integration_browsertest_base.h index a74d5052..646f52b 100644 --- a/chrome/browser/ui/views/web_apps/web_app_integration_browsertest_base.h +++ b/chrome/browser/ui/views/web_apps/web_app_integration_browsertest_base.h
@@ -93,6 +93,7 @@ virtual void AddBlankTabAndShow(Browser* browser) = 0; virtual net::EmbeddedTestServer* EmbeddedTestServer() = 0; virtual std::vector<Profile*> GetAllProfiles() = 0; + virtual bool IsSyncTest() = 0; virtual bool UserSigninInternal() = 0; virtual void TurnSyncOff() = 0; virtual void TurnSyncOn() = 0;
diff --git a/chrome/browser/ui/web_applications/system_web_app_ui_utils.cc b/chrome/browser/ui/web_applications/system_web_app_ui_utils.cc index 28200132..5b861ef 100644 --- a/chrome/browser/ui/web_applications/system_web_app_ui_utils.cc +++ b/chrome/browser/ui/web_applications/system_web_app_ui_utils.cc
@@ -141,7 +141,8 @@ void LaunchSystemWebAppAsync(Profile* profile, const SystemAppType type, - const SystemAppLaunchParams& params) { + const SystemAppLaunchParams& params, + apps::mojom::WindowInfoPtr window_info) { // Terminal should be launched with crostini::LaunchTerminal*. DCHECK(type != SystemAppType::TERMINAL); @@ -190,11 +191,12 @@ WindowOpenDisposition::NEW_WINDOW, /* prefer_container */ false); if (params.url.is_empty()) { - app_service->Launch(app_id.value(), event_flags, params.launch_source); + app_service->Launch(app_id.value(), event_flags, params.launch_source, + std::move(window_info)); } else { DCHECK(params.url.is_valid()); app_service->LaunchAppWithUrl(app_id.value(), event_flags, params.url, - params.launch_source); + params.launch_source, std::move(window_info)); } }
diff --git a/chrome/browser/ui/web_applications/system_web_app_ui_utils.h b/chrome/browser/ui/web_applications/system_web_app_ui_utils.h index c6afced..cbf36d1 100644 --- a/chrome/browser/ui/web_applications/system_web_app_ui_utils.h +++ b/chrome/browser/ui/web_applications/system_web_app_ui_utils.h
@@ -13,6 +13,7 @@ #include "chrome/browser/web_applications/components/web_app_id.h" #include "chrome/browser/web_applications/system_web_app_manager.h" #include "components/services/app_service/public/mojom/types.mojom-shared.h" +#include "components/services/app_service/public/mojom/types.mojom.h" #include "url/gurl.h" class Profile; @@ -52,7 +53,8 @@ void LaunchSystemWebAppAsync( Profile* profile, const SystemAppType type, - const SystemAppLaunchParams& params = SystemAppLaunchParams()); + const SystemAppLaunchParams& params = SystemAppLaunchParams(), + apps::mojom::WindowInfoPtr window_info = nullptr); // When this method returns, it makes sure all previous LaunchSystemWebAppAsync // calls on |profile| are processed (i.e. LaunchSystemWebAppImpl finishes
diff --git a/chrome/browser/ui/web_applications/web_app_launch_manager.cc b/chrome/browser/ui/web_applications/web_app_launch_manager.cc index 9a259ba..8d0b512 100644 --- a/chrome/browser/ui/web_applications/web_app_launch_manager.cc +++ b/chrome/browser/ui/web_applications/web_app_launch_manager.cc
@@ -276,10 +276,16 @@ if (!provider_) return; + apps::mojom::AppLaunchSource launch_source = + apps::mojom::AppLaunchSource::kSourceCommandLine; + if (base::FeatureList::IsEnabled(features::kDesktopPWAsRunOnOsLogin) && + command_line.HasSwitch(switches::kAppRunOnOsLoginMode)) { + launch_source = apps::mojom::AppLaunchSource::kSourceRunOnOsLogin; + } + apps::AppLaunchParams params( app_id, apps::mojom::LaunchContainer::kLaunchContainerWindow, - WindowOpenDisposition::NEW_WINDOW, - apps::mojom::AppLaunchSource::kSourceCommandLine); + WindowOpenDisposition::NEW_WINDOW, launch_source); params.command_line = command_line; params.current_directory = current_directory; params.launch_files = apps::GetLaunchFilesFromCommandLine(command_line);
diff --git a/chrome/browser/ui/webauthn/authenticator_dialog_browsertest.cc b/chrome/browser/ui/webauthn/authenticator_dialog_browsertest.cc index 61946a9e..72e55e9 100644 --- a/chrome/browser/ui/webauthn/authenticator_dialog_browsertest.cc +++ b/chrome/browser/ui/webauthn/authenticator_dialog_browsertest.cc
@@ -204,7 +204,7 @@ device::PublicKeyCredentialUserEntity user({1, 2, 3, 4}); user.name = info.first; user.display_name = info.second; - response.SetUserEntity(std::move(user)); + response.user_entity = std::move(user); responses.emplace_back(std::move(response)); }
diff --git a/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.cc index 514cb93..ce70d89e 100644 --- a/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/assistant_optin_flow_screen_handler.cc
@@ -491,7 +491,7 @@ if (ui_result.consent_flow_update_result().update_status() != assistant::ConsentFlowUiUpdateResult::SUCCESS) { // TODO(updowndta): Handle consent update failure. - LOG(ERROR) << "Consent udpate error."; + LOG(ERROR) << "Consent update error."; } else if (activity_control_needed_) { activity_control_needed_ = false; PrefService* prefs = ProfileManager::GetActiveUserProfile()->GetPrefs(); @@ -505,7 +505,7 @@ if (ui_result.email_opt_in_update_result().update_status() != assistant::EmailOptInUpdateResult::SUCCESS) { // TODO(updowndta): Handle email optin update failure. - LOG(ERROR) << "Email OptIn udpate error."; + LOG(ERROR) << "Email OptIn update error."; } return; }
diff --git a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc index 9dee587e..73c64187 100644 --- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc +++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -1818,15 +1818,15 @@ {"siteSettingsBluetoothDevicesBlock", IDS_SETTINGS_SITE_SETTINGS_BLUETOOTH_DEVICES_BLOCK}, {"siteSettingsFileSystemWrite", - IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_ACCESS_WRITE}, + IDS_SETTINGS_SITE_SETTINGS_NATIVE_FILE_SYSTEM_WRITE}, {"siteSettingsFileSystemWriteMidSentence", - IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_ACCESS_WRITE_MID_SENTENCE}, + IDS_SETTINGS_SITE_SETTINGS_NATIVE_FILE_SYSTEM_WRITE_MID_SENTENCE}, {"siteSettingsFileSystemWriteAsk", - IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_ACCESS_WRITE_ASK}, + IDS_SETTINGS_SITE_SETTINGS_NATIVE_FILE_SYSTEM_WRITE_ASK}, {"siteSettingsFileSystemWriteAskRecommended", - IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_ACCESS_WRITE_ASK_RECOMMENDED}, + IDS_SETTINGS_SITE_SETTINGS_NATIVE_FILE_SYSTEM_WRITE_ASK_RECOMMENDED}, {"siteSettingsFileSystemWriteBlock", - IDS_SETTINGS_SITE_SETTINGS_FILE_SYSTEM_ACCESS_WRITE_BLOCK}, + IDS_SETTINGS_SITE_SETTINGS_NATIVE_FILE_SYSTEM_WRITE_BLOCK}, {"siteSettingsRemoveZoomLevel", IDS_SETTINGS_SITE_SETTINGS_REMOVE_ZOOM_LEVEL}, {"siteSettingsZoomLevels", IDS_SETTINGS_SITE_SETTINGS_ZOOM_LEVELS},
diff --git a/chrome/browser/web_applications/components/BUILD.gn b/chrome/browser/web_applications/components/BUILD.gn index 08b0a0ed..4f010523 100644 --- a/chrome/browser/web_applications/components/BUILD.gn +++ b/chrome/browser/web_applications/components/BUILD.gn
@@ -146,6 +146,8 @@ if (is_win || is_mac || (is_linux && !is_chromeos_lacros)) { sources += [ + "url_handler_launch_params.cc", + "url_handler_launch_params.h", "url_handler_manager_impl.cc", "url_handler_manager_impl.h", "url_handler_prefs.cc", @@ -153,8 +155,10 @@ ] } - public_deps = - [ "//components/services/app_service/public/cpp:app_share_target" ] + public_deps = [ + "//components/services/app_service/public/cpp:app_share_target", + "//components/services/app_service/public/cpp:app_url_handling", + ] deps = [ "//base", @@ -168,7 +172,6 @@ "//components/crx_file", "//components/keyed_service/content", "//components/pref_registry", - "//components/services/app_service/public/cpp:app_url_handling", "//components/services/app_service/public/cpp:protocol_handling", "//components/services/app_service/public/mojom", "//components/site_engagement/content", @@ -194,10 +197,7 @@ } if (is_win || is_mac || (is_linux && !is_chromeos_lacros)) { - deps += [ - "//base/util/values:values_util", - "//components/services/app_service/public/cpp:app_url_handling", - ] + deps += [ "//base/util/values:values_util" ] } }
diff --git a/chrome/browser/web_applications/components/os_integration_manager.cc b/chrome/browser/web_applications/components/os_integration_manager.cc index a7d87841..2a6ebc1 100644 --- a/chrome/browser/web_applications/components/os_integration_manager.cc +++ b/chrome/browser/web_applications/components/os_integration_manager.cc
@@ -292,6 +292,11 @@ return *file_handler_manager_; } +UrlHandlerManager& OsIntegrationManager::url_handler_manager_for_testing() { + DCHECK(url_handler_manager_); + return *url_handler_manager_; +} + ScopedOsHooksSuppress OsIntegrationManager::ScopedSuppressOsHooksForTesting() { // Creating OS hooks on ChromeOS doesn't write files to disk, so it's // unnecessary to suppress and it provides better crash coverage.
diff --git a/chrome/browser/web_applications/components/os_integration_manager.h b/chrome/browser/web_applications/components/os_integration_manager.h index 3f63b01..bc92fae 100644 --- a/chrome/browser/web_applications/components/os_integration_manager.h +++ b/chrome/browser/web_applications/components/os_integration_manager.h
@@ -134,6 +134,8 @@ // Getter for testing FileHandlerManager FileHandlerManager& file_handler_manager_for_testing(); + UrlHandlerManager& url_handler_manager_for_testing(); + static ScopedOsHooksSuppress ScopedSuppressOsHooksForTesting(); virtual TestOsIntegrationManager* AsTestOsIntegrationManager();
diff --git a/chrome/browser/web_applications/components/url_handler_launch_params.cc b/chrome/browser/web_applications/components/url_handler_launch_params.cc new file mode 100644 index 0000000..f6d5b11 --- /dev/null +++ b/chrome/browser/web_applications/components/url_handler_launch_params.cc
@@ -0,0 +1,23 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/web_applications/components/url_handler_launch_params.h" + +#include "base/check.h" + +namespace web_app { + +UrlHandlerLaunchParams::UrlHandlerLaunchParams( + const base::FilePath& profile_path, + const AppId& app_id, + const GURL& url) + : profile_path(profile_path), app_id(app_id), url(url) { + DCHECK(!profile_path.empty()); + DCHECK(!app_id.empty()); + DCHECK(url.is_valid()); +} + +UrlHandlerLaunchParams::~UrlHandlerLaunchParams() = default; + +} // namespace web_app
diff --git a/chrome/browser/web_applications/components/url_handler_launch_params.h b/chrome/browser/web_applications/components/url_handler_launch_params.h new file mode 100644 index 0000000..96599446 --- /dev/null +++ b/chrome/browser/web_applications/components/url_handler_launch_params.h
@@ -0,0 +1,30 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_WEB_APPLICATIONS_COMPONENTS_URL_HANDLER_LAUNCH_PARAMS_H_ +#define CHROME_BROWSER_WEB_APPLICATIONS_COMPONENTS_URL_HANDLER_LAUNCH_PARAMS_H_ + +#include "base/files/file_path.h" +#include "chrome/browser/web_applications/components/web_app_id.h" +#include "url/gurl.h" + +namespace web_app { + +// |UrlHandlerLaunchParams| contains a profile path, an AppId and the +// launch URL needed to launch a web app through commandline arguments. +struct UrlHandlerLaunchParams { + UrlHandlerLaunchParams(const base::FilePath& profile_path, + const AppId& app_id, + const GURL& url); + + ~UrlHandlerLaunchParams(); + + base::FilePath profile_path; + AppId app_id; + GURL url; +}; + +} // namespace web_app + +#endif // CHROME_BROWSER_WEB_APPLICATIONS_COMPONENTS_URL_HANDLER_LAUNCH_PARAMS_H_
diff --git a/chrome/browser/web_applications/components/url_handler_manager.cc b/chrome/browser/web_applications/components/url_handler_manager.cc index 83aae22f..95b7bdb 100644 --- a/chrome/browser/web_applications/components/url_handler_manager.cc +++ b/chrome/browser/web_applications/components/url_handler_manager.cc
@@ -4,12 +4,17 @@ #include "chrome/browser/web_applications/components/url_handler_manager.h" +#include <utility> + #include "chrome/browser/profiles/profile.h" #include "chrome/browser/web_applications/components/app_registrar.h" namespace web_app { -UrlHandlerManager::UrlHandlerManager(Profile* profile) : profile_(profile) {} +UrlHandlerManager::UrlHandlerManager(Profile* profile) + : profile_(profile), + association_manager_(std::make_unique<WebAppOriginAssociationManager>()) { +} UrlHandlerManager::~UrlHandlerManager() = default; @@ -17,4 +22,9 @@ registrar_ = registrar; } +void UrlHandlerManager::SetAssociationManagerForTesting( + std::unique_ptr<WebAppOriginAssociationManager> manager) { + association_manager_ = std::move(manager); +} + } // namespace web_app
diff --git a/chrome/browser/web_applications/components/url_handler_manager.h b/chrome/browser/web_applications/components/url_handler_manager.h index f1acdf54..8f4cd4e 100644 --- a/chrome/browser/web_applications/components/url_handler_manager.h +++ b/chrome/browser/web_applications/components/url_handler_manager.h
@@ -5,8 +5,11 @@ #ifndef CHROME_BROWSER_WEB_APPLICATIONS_COMPONENTS_URL_HANDLER_MANAGER_H_ #define CHROME_BROWSER_WEB_APPLICATIONS_COMPONENTS_URL_HANDLER_MANAGER_H_ +#include <memory> + #include "base/callback.h" #include "chrome/browser/web_applications/components/web_app_id.h" +#include "chrome/browser/web_applications/components/web_app_origin_association_manager.h" class Profile; @@ -39,13 +42,20 @@ const AppId& app_id, base::OnceCallback<void(bool success)> callback) = 0; + void SetAssociationManagerForTesting( + std::unique_ptr<WebAppOriginAssociationManager> manager); + protected: Profile* profile() const { return profile_; } AppRegistrar* registrar() const { return registrar_; } + WebAppOriginAssociationManager& association_manager() { + return *association_manager_; + } private: Profile* const profile_; AppRegistrar* registrar_; + std::unique_ptr<WebAppOriginAssociationManager> association_manager_; }; } // namespace web_app
diff --git a/chrome/browser/web_applications/components/url_handler_manager_impl.cc b/chrome/browser/web_applications/components/url_handler_manager_impl.cc index c02e418..68893e7f 100644 --- a/chrome/browser/web_applications/components/url_handler_manager_impl.cc +++ b/chrome/browser/web_applications/components/url_handler_manager_impl.cc
@@ -9,7 +9,6 @@ #include "base/bind.h" #include "base/feature_list.h" -#include "base/optional.h" #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" #include "chrome/browser/browser_process.h" @@ -18,69 +17,49 @@ #include "chrome/browser/web_applications/components/url_handler_prefs.h" #include "chrome/browser/web_applications/components/web_app_origin_association_manager.h" #include "chrome/common/chrome_switches.h" +#include "components/prefs/pref_service.h" #include "third_party/blink/public/common/features.h" #include "url/url_constants.h" namespace web_app { UrlHandlerManagerImpl::UrlHandlerManagerImpl(Profile* profile) - : UrlHandlerManager(profile), - association_manager_(std::make_unique<WebAppOriginAssociationManager>()) { -} + : UrlHandlerManager(profile) {} UrlHandlerManagerImpl::~UrlHandlerManagerImpl() = default; // static std::vector<UrlHandlerLaunchParams> UrlHandlerManagerImpl::GetUrlHandlerMatches( const base::CommandLine& command_line) { - std::vector<UrlHandlerLaunchParams> results; - if (!base::FeatureList::IsEnabled(blink::features::kWebAppEnableUrlHandlers)) - return results; + return {}; // Return early to not interfere with switch based app launches. if (command_line.HasSwitch(switches::kApp) || command_line.HasSwitch(switches::kAppId)) { - return results; + return {}; } - std::vector<GURL> urls; - for (const auto& arg : command_line.GetArgs()) { -#if defined(OS_WIN) - GURL potential_url(base::WideToUTF16(arg)); -#else - GURL potential_url(arg); -#endif - if (potential_url.is_valid() && potential_url.IsStandard()) - urls.push_back(potential_url); - } // Only handle commandline with single URL. If multiple URLs are found, return // early so they can be handled normally. If the OS calls the system default // browser to handle a URL activation, this is usually with a single URL. - if (urls.empty() || urls.size() > 1) - return results; + if (command_line.GetArgs().size() != 1) + return {}; - if (!urls.front().SchemeIs(url::kHttpsScheme)) - return results; +#if defined(OS_WIN) + GURL url(base::WideToUTF16(command_line.GetArgs()[0])); +#else + GURL url(command_line.GetArgs()[0]); +#endif + + if (!url.is_valid() || !url.IsStandard() || !url.SchemeIs(url::kHttpsScheme)) + return {}; PrefService* local_state = g_browser_process->local_state(); if (!local_state) - return results; + return {}; - base::Optional<std::vector<url_handler_prefs::Match>> prefs_matches = - url_handler_prefs::FindMatchingUrlHandlers(local_state, urls.front()); - if (!prefs_matches || prefs_matches->empty()) - return results; - - for (const auto& prefs_match : *prefs_matches) { - const auto& target_app_id = prefs_match.app_id; - const auto& target_profile_path = prefs_match.profile_path; - if (target_app_id.empty()) - continue; - - results.emplace_back(target_profile_path, target_app_id, urls.front()); - } - return results; + return url_handler_prefs::FindMatchingUrlHandlers(local_state, url); } void UrlHandlerManagerImpl::RegisterUrlHandlers( @@ -99,7 +78,7 @@ return; } - association_manager_->GetWebAppOriginAssociations( + association_manager().GetWebAppOriginAssociations( registrar()->GetAppManifestUrl(app_id), std::move(url_handlers), base::BindOnce(&UrlHandlerManagerImpl::OnDidGetAssociationsAtInstall, weak_ptr_factory_.GetWeakPtr(), app_id, @@ -111,14 +90,14 @@ base::OnceCallback<void(bool success)> callback, apps::UrlHandlers url_handlers) { if (!url_handlers.empty()) { - url_handler_prefs::AddWebApp(GetLocalState(), app_id, profile()->GetPath(), - std::move(url_handlers)); + url_handler_prefs::AddWebApp(g_browser_process->local_state(), app_id, + profile()->GetPath(), std::move(url_handlers)); } std::move(callback).Run(true); } bool UrlHandlerManagerImpl::UnregisterUrlHandlers(const AppId& app_id) { - url_handler_prefs::RemoveWebApp(GetLocalState(), app_id, + url_handler_prefs::RemoveWebApp(g_browser_process->local_state(), app_id, profile()->GetPath()); return true; } @@ -130,13 +109,13 @@ if (!base::FeatureList::IsEnabled( blink::features::kWebAppEnableUrlHandlers)) { - url_handler_prefs::RemoveWebApp(GetLocalState(), app_id, + url_handler_prefs::RemoveWebApp(g_browser_process->local_state(), app_id, profile()->GetPath()); std::move(callback).Run(false); return; } - association_manager_->GetWebAppOriginAssociations( + association_manager().GetWebAppOriginAssociations( registrar()->GetAppManifestUrl(app_id), std::move(url_handlers), base::BindOnce(&UrlHandlerManagerImpl::OnDidGetAssociationsAtUpdate, weak_ptr_factory_.GetWeakPtr(), app_id, @@ -149,18 +128,10 @@ apps::UrlHandlers url_handlers) { // TODO(crbug/1072058): Only overwrite existing url_handlers if associations // changed. Allow this after user permission is implemented. - url_handler_prefs::UpdateWebApp(GetLocalState(), app_id, profile()->GetPath(), + url_handler_prefs::UpdateWebApp(g_browser_process->local_state(), app_id, + profile()->GetPath(), std::move(url_handlers)); std::move(callback).Run(true); } -void UrlHandlerManagerImpl::SetAssociationManagerForTesting( - std::unique_ptr<WebAppOriginAssociationManager> manager) { - association_manager_ = std::move(manager); -} - -PrefService* UrlHandlerManagerImpl::GetLocalState() { - return g_browser_process->local_state(); -} - } // namespace web_app
diff --git a/chrome/browser/web_applications/components/url_handler_manager_impl.h b/chrome/browser/web_applications/components/url_handler_manager_impl.h index f401b8d..9d0227a 100644 --- a/chrome/browser/web_applications/components/url_handler_manager_impl.h +++ b/chrome/browser/web_applications/components/url_handler_manager_impl.h
@@ -12,33 +12,16 @@ #include "base/command_line.h" #include "base/files/file_path.h" #include "base/memory/weak_ptr.h" +#include "chrome/browser/web_applications/components/url_handler_launch_params.h" #include "chrome/browser/web_applications/components/url_handler_manager.h" #include "chrome/browser/web_applications/components/web_app_id.h" #include "components/services/app_service/public/cpp/url_handler_info.h" #include "url/gurl.h" -class PrefService; class Profile; namespace web_app { -class WebAppOriginAssociationManager; - -// |UrlHandlerLaunchParams| contains a profile path, an AppId and the -// launch URL needed to launch a web app through commandline arguments. -struct UrlHandlerLaunchParams { - UrlHandlerLaunchParams() = default; - UrlHandlerLaunchParams(const base::FilePath& profile_path, - const AppId& app_id, - const GURL& url) - : profile_path(profile_path), app_id(app_id), url(url) {} - ~UrlHandlerLaunchParams() = default; - - base::FilePath profile_path; - AppId app_id; - GURL url; -}; - // UrlHandlerManagerImpl keeps track of web app install/update/uninstalls. This // bookkeeping enables URL handler matching at browser startup time without // needing to load additional user profiles. @@ -68,9 +51,6 @@ const AppId& app_id, base::OnceCallback<void(bool success)> callback) override; - void SetAssociationManagerForTesting( - std::unique_ptr<WebAppOriginAssociationManager> manager); - private: void OnDidGetAssociationsAtInstall( const AppId& app_id, @@ -80,10 +60,6 @@ const AppId& app_id, base::OnceCallback<void(bool success)> callback, apps::UrlHandlers url_handlers); - // Returns the local state pref service of the browser process. - PrefService* GetLocalState(); - - std::unique_ptr<WebAppOriginAssociationManager> association_manager_; base::WeakPtrFactory<UrlHandlerManagerImpl> weak_ptr_factory_{this}; };
diff --git a/chrome/browser/web_applications/components/url_handler_prefs.cc b/chrome/browser/web_applications/components/url_handler_prefs.cc index 1760dd3..64a6830 100644 --- a/chrome/browser/web_applications/components/url_handler_prefs.cc +++ b/chrome/browser/web_applications/components/url_handler_prefs.cc
@@ -6,7 +6,9 @@ #include <algorithm> +#include "base/check.h" #include "base/files/file_path.h" +#include "base/optional.h" #include "base/strings/strcat.h" #include "base/strings/string_util.h" #include "base/util/values/values_util.h" @@ -16,6 +18,7 @@ #include "components/prefs/pref_service.h" #include "components/prefs/scoped_user_pref_update.h" #include "url/gurl.h" +#include "url/url_constants.h" namespace web_app { namespace url_handler_prefs { @@ -77,18 +80,18 @@ } // Given a list of handlers that matched an origin, apply the rules in each -// handler against |url| and return only handlers that match |url|. +// handler against |url| and return only handlers that match |url| by appending +// to |matches|. // |origin_trimmed| indicates if the input URL's origin had to be shortened to // find a matching key. If true, filter out and matches that did not allow an // origin prefix wildcard in their manifest. -base::Optional<std::vector<Match>> FilterMatches( - const base::Value& all_handlers, - const GURL& url, - bool origin_trimmed) { +void FilterAndAddMatches(const base::Value& all_handlers, + const GURL& url, + bool origin_trimmed, + std::vector<UrlHandlerLaunchParams>& matches) { if (!all_handlers.is_list()) - return base::nullopt; + return; - std::vector<Match> matches; for (auto& handler : all_handlers.GetList()) { if (!handler.is_dict()) continue; @@ -132,39 +135,35 @@ } if (path_matches) - matches.emplace_back(*app_id, *profile_path); + matches.emplace_back(*profile_path, *app_id, url); } - return matches; } // Returns the URL handlers stored in |pref_value| that match |url|'s origin. -base::Optional<std::vector<Match>> FindMatches(const base::Value& pref_value, - const GURL& url) { +std::vector<UrlHandlerLaunchParams> FindMatches(const base::Value& pref_value, + const GURL& url) { + std::vector<UrlHandlerLaunchParams> matches; + if (!pref_value.is_dict()) - return base::nullopt; + return matches; url::Origin origin = url::Origin::Create(url); if (origin.opaque()) - return base::nullopt; + return matches; - if (origin.scheme() != "https") - return base::nullopt; + if (origin.scheme() != url::kHttpsScheme) + return matches; std::string origin_str = origin.Serialize(); bool origin_trimmed(false); - std::vector<Match> matches; - for (;;) { + + while (true) { const base::Value* const all_handlers = pref_value.FindListKey(origin_str); if (all_handlers) { DCHECK(UrlMatchesOrigin(url, origin_str, origin_trimmed)); - base::Optional<std::vector<Match>> matches_local = - FilterMatches(*all_handlers, url, origin_trimmed); - if (matches_local) { - matches.insert(matches.end(), - std::make_move_iterator(matches_local->begin()), - std::make_move_iterator(matches_local->end())); - } + FilterAndAddMatches(*all_handlers, url, origin_trimmed, matches); } + // If a key matching the input URL's origin is not found, shorten the origin // by sub-domain and try again. This enables matching against manifest // "url_handlers" origins that contain wildcard prefixes. @@ -259,14 +258,6 @@ } } // namespace -Match::Match(const AppId& app_id, const base::FilePath& profile_path) - : app_id(app_id), profile_path(profile_path) { - // Match should either be default constructed with both fields empty, or using - // this constructor with both fields non-empty. - DCHECK(!app_id.empty()); - DCHECK(!profile_path.empty()); -} - void RegisterLocalStatePrefs(PrefRegistrySimple* registry) { DCHECK(registry); registry->RegisterDictionaryPref(prefs::kWebAppsUrlHandlerInfo); @@ -360,16 +351,16 @@ pref_value->DictClear(); } -base::Optional<std::vector<Match>> FindMatchingUrlHandlers( +std::vector<UrlHandlerLaunchParams> FindMatchingUrlHandlers( PrefService* local_state, const GURL& url) { if (!url.is_valid()) - return base::nullopt; + return {}; const base::Value* const pref_value = local_state->Get(prefs::kWebAppsUrlHandlerInfo); if (!pref_value || !pref_value->is_dict()) - return base::nullopt; + return {}; return FindMatches(*pref_value, url); }
diff --git a/chrome/browser/web_applications/components/url_handler_prefs.h b/chrome/browser/web_applications/components/url_handler_prefs.h index a26d77f1..595a1a64 100644 --- a/chrome/browser/web_applications/components/url_handler_prefs.h +++ b/chrome/browser/web_applications/components/url_handler_prefs.h
@@ -9,7 +9,7 @@ #include <vector> #include "base/files/file_path.h" -#include "base/optional.h" +#include "chrome/browser/web_applications/components/url_handler_launch_params.h" #include "chrome/browser/web_applications/components/web_app_id.h" #include "components/prefs/pref_service.h" #include "components/services/app_service/public/cpp/url_handler_info.h" @@ -69,14 +69,6 @@ // } namespace url_handler_prefs { -struct Match { - Match() = default; - Match(const AppId& app_id, const base::FilePath& profile_path); - - AppId app_id; - base::FilePath profile_path; -}; - void RegisterLocalStatePrefs(PrefRegistrySimple* registry); void AddWebApp(PrefService* local_state, @@ -103,7 +95,7 @@ // |url| is a fully specified URL, eg. "https://contoso.com/abc/def". // TODO(crbug/1072058): Filter out inactive handlers when user permission is // implemented. -base::Optional<std::vector<Match>> FindMatchingUrlHandlers( +std::vector<UrlHandlerLaunchParams> FindMatchingUrlHandlers( PrefService* local_state, const GURL& url);
diff --git a/chrome/browser/web_applications/components/url_handler_prefs_unittest.cc b/chrome/browser/web_applications/components/url_handler_prefs_unittest.cc index fd74498..4d49cf32 100644 --- a/chrome/browser/web_applications/components/url_handler_prefs_unittest.cc +++ b/chrome/browser/web_applications/components/url_handler_prefs_unittest.cc
@@ -64,20 +64,14 @@ return web_app; } - void CheckMatches( - const base::Optional<std::vector<url_handler_prefs::Match>>& matches, - const std::vector<WebApp*>& apps, - const std::vector<base::FilePath>& profile_paths) { - if (!matches) { - EXPECT_TRUE(apps.empty()); - EXPECT_TRUE(profile_paths.empty()); - } + void CheckMatches(const std::vector<UrlHandlerLaunchParams>& matches, + const std::vector<WebApp*>& apps, + const std::vector<base::FilePath>& profile_paths) { + EXPECT_TRUE(matches.size() == apps.size()); + EXPECT_TRUE(matches.size() == profile_paths.size()); - EXPECT_TRUE(matches->size() == apps.size()); - EXPECT_TRUE(matches->size() == profile_paths.size()); - - for (size_t i = 0; i < matches->size(); i++) { - const url_handler_prefs::Match& match = (*matches)[i]; + for (size_t i = 0; i < matches.size(); i++) { + const UrlHandlerLaunchParams& match = matches[i]; EXPECT_EQ(match.app_id, apps[i]->app_id()); EXPECT_EQ(match.profile_path, profile_paths[i]); } @@ -101,15 +95,18 @@ WebAppWithUrlHandlers(app_url_1_, {apps::UrlHandlerInfo(origin_1_)}); url_handler_prefs::AddWebApp(LocalState(), web_app->app_id(), profile_1_, web_app->url_handlers()); - auto matches = - url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); - CheckMatches(matches, {web_app.get()}, {profile_1_}); - - url_handler_prefs::RemoveWebApp(LocalState(), web_app->app_id(), profile_1_); - matches = - url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(0u, matches->size()); + { + auto matches = + url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); + CheckMatches(matches, {web_app.get()}, {profile_1_}); + } + { + url_handler_prefs::RemoveWebApp(LocalState(), web_app->app_id(), + profile_1_); + auto matches = + url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); + EXPECT_EQ(0u, matches.size()); + } } TEST_F(UrlHandlerPrefsTest, AddAndRemoveAppWithPaths) { @@ -118,15 +115,18 @@ const auto web_app = WebAppWithUrlHandlers(app_url_1_, {handler}); url_handler_prefs::AddWebApp(LocalState(), web_app->app_id(), profile_1_, web_app->url_handlers()); - auto matches = - url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); - CheckMatches(matches, {web_app.get()}, {profile_1_}); - - url_handler_prefs::RemoveWebApp(LocalState(), web_app->app_id(), profile_1_); - matches = - url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(0u, matches->size()); + { + auto matches = + url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); + CheckMatches(matches, {web_app.get()}, {profile_1_}); + } + { + url_handler_prefs::RemoveWebApp(LocalState(), web_app->app_id(), + profile_1_); + auto matches = + url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); + EXPECT_EQ(0u, matches.size()); + } } TEST_F(UrlHandlerPrefsTest, AddAndRemoveAppWithMultipleUrlHandlers) { @@ -135,22 +135,39 @@ apps::UrlHandlerInfo(origin_2_, false, {"/abc"}, {"/foo"})}); url_handler_prefs::AddWebApp(LocalState(), web_app->app_id(), profile_1_, web_app->url_handlers()); + { + auto matches = + url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); + CheckMatches(matches, {web_app.get()}, {profile_1_}); + } + { + auto matches = + url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_2_); + CheckMatches(matches, {web_app.get()}, {profile_1_}); + } + { + url_handler_prefs::RemoveWebApp(LocalState(), web_app->app_id(), + profile_1_); + auto matches = + url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); + EXPECT_EQ(0u, matches.size()); + } + { + auto matches = + url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_2_); + EXPECT_EQ(0u, matches.size()); + } +} + +TEST_F(UrlHandlerPrefsTest, MatchContainsInputUrl) { + const auto web_app = + WebAppWithUrlHandlers(app_url_1_, {apps::UrlHandlerInfo(origin_1_)}); + url_handler_prefs::AddWebApp(LocalState(), web_app->app_id(), profile_1_, + web_app->url_handlers()); auto matches = url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); - CheckMatches(matches, {web_app.get()}, {profile_1_}); - matches = - url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_2_); - CheckMatches(matches, {web_app.get()}, {profile_1_}); - - url_handler_prefs::RemoveWebApp(LocalState(), web_app->app_id(), profile_1_); - matches = - url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(0u, matches->size()); - matches = - url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_2_); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(0u, matches->size()); + EXPECT_EQ(1u, matches.size()); + EXPECT_EQ(origin_url_1_, matches[0].url); } TEST_F(UrlHandlerPrefsTest, AddMultipleAppsAndRemoveOne) { @@ -164,31 +181,34 @@ {apps::UrlHandlerInfo(origin_1_), apps::UrlHandlerInfo(origin_2_)}); url_handler_prefs::AddWebApp(LocalState(), web_app_2->app_id(), profile_1_, web_app_2->url_handlers()); - auto matches = - url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(2u, matches->size()); - CheckMatches(matches, {web_app_1.get(), web_app_2.get()}, - {profile_1_, profile_1_}); - matches = - url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_2_); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(2u, matches->size()); - CheckMatches(matches, {web_app_1.get(), web_app_2.get()}, - {profile_1_, profile_1_}); - - url_handler_prefs::RemoveWebApp(LocalState(), web_app_1->app_id(), - profile_1_); - matches = - url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(1u, matches->size()); - CheckMatches(matches, {web_app_2.get()}, {profile_1_}); - matches = - url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_2_); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(1u, matches->size()); - CheckMatches(matches, {web_app_2.get()}, {profile_1_}); + { + auto matches = + url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); + EXPECT_EQ(2u, matches.size()); + CheckMatches(matches, {web_app_1.get(), web_app_2.get()}, + {profile_1_, profile_1_}); + } + { + auto matches = + url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_2_); + EXPECT_EQ(2u, matches.size()); + CheckMatches(matches, {web_app_1.get(), web_app_2.get()}, + {profile_1_, profile_1_}); + } + { + url_handler_prefs::RemoveWebApp(LocalState(), web_app_1->app_id(), + profile_1_); + auto matches = + url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); + EXPECT_EQ(1u, matches.size()); + CheckMatches(matches, {web_app_2.get()}, {profile_1_}); + } + { + auto matches = + url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_2_); + EXPECT_EQ(1u, matches.size()); + CheckMatches(matches, {web_app_2.get()}, {profile_1_}); + } } TEST_F(UrlHandlerPrefsTest, RemoveAppNotFound) { @@ -196,42 +216,43 @@ WebAppWithUrlHandlers(app_url_1_, {apps::UrlHandlerInfo(origin_1_)}); url_handler_prefs::AddWebApp(LocalState(), web_app_1->app_id(), profile_1_, web_app_1->url_handlers()); - auto matches = - url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(1u, matches->size()); - CheckMatches(matches, {web_app_1.get()}, {profile_1_}); - + { + auto matches = + url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); + EXPECT_EQ(1u, matches.size()); + CheckMatches(matches, {web_app_1.get()}, {profile_1_}); + } const GURL not_added("https://not-added.com/"); const auto web_app_2 = WebAppWithUrlHandlers(not_added, {apps::UrlHandlerInfo(origin_1_)}); url_handler_prefs::RemoveWebApp(LocalState(), web_app_2->app_id(), profile_1_); - matches = - url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(1u, matches->size()); - CheckMatches(matches, {web_app_1.get()}, {profile_1_}); + { + auto matches = + url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); + EXPECT_EQ(1u, matches.size()); + CheckMatches(matches, {web_app_1.get()}, {profile_1_}); + } } TEST_F(UrlHandlerPrefsTest, OneAppWithManyOrigins) { const auto web_app = WebAppWithUrlHandlers( app_url_1_, {apps::UrlHandlerInfo(origin_1_), apps::UrlHandlerInfo(origin_2_)}); - url_handler_prefs::AddWebApp(LocalState(), web_app->app_id(), profile_1_, - web_app->url_handlers()); - - auto matches = - url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(1u, matches->size()); - CheckMatches(matches, {web_app.get()}, {profile_1_}); - - matches = - url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_2_); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(1u, matches->size()); - CheckMatches(matches, {web_app.get()}, {profile_1_}); + { + url_handler_prefs::AddWebApp(LocalState(), web_app->app_id(), profile_1_, + web_app->url_handlers()); + auto matches = + url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); + EXPECT_EQ(1u, matches.size()); + CheckMatches(matches, {web_app.get()}, {profile_1_}); + } + { + auto matches = + url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_2_); + EXPECT_EQ(1u, matches.size()); + CheckMatches(matches, {web_app.get()}, {profile_1_}); + } } TEST_F(UrlHandlerPrefsTest, AddAppAgainWithDifferentHandlers) { @@ -239,41 +260,42 @@ app_url_1_, {apps::UrlHandlerInfo(origin_1_, false, {"/abc"}, {"/foo"})}); url_handler_prefs::AddWebApp(LocalState(), web_app_1->app_id(), profile_1_, web_app_1->url_handlers()); - auto matches = - url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(1u, matches->size()); - CheckMatches(matches, {web_app_1.get()}, {profile_1_}); - - // Excluded, shouldn't match - matches = url_handler_prefs::FindMatchingUrlHandlers( - LocalState(), origin_1_.GetURL().Resolve("foo")); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(0u, matches->size()); + { + auto matches = + url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); + EXPECT_EQ(1u, matches.size()); + CheckMatches(matches, {web_app_1.get()}, {profile_1_}); + } + { + // Excluded, shouldn't match + auto matches = url_handler_prefs::FindMatchingUrlHandlers( + LocalState(), origin_1_.GetURL().Resolve("foo")); + EXPECT_EQ(0u, matches.size()); + } const auto web_app_2 = WebAppWithUrlHandlers( app_url_1_, {apps::UrlHandlerInfo(origin_1_, false, {"/foo"}, {"/abc"}), apps::UrlHandlerInfo(origin_2_)}); url_handler_prefs::AddWebApp(LocalState(), web_app_2->app_id(), profile_1_, web_app_2->url_handlers()); - - // Excluded, shouldn't match - matches = - url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(0u, matches->size()); - - matches = url_handler_prefs::FindMatchingUrlHandlers( - LocalState(), origin_1_.GetURL().Resolve("foo")); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(1u, matches->size()); - CheckMatches(matches, {web_app_2.get()}, {profile_1_}); - - matches = - url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_2_); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(1u, matches->size()); - CheckMatches(matches, {web_app_2.get()}, {profile_1_}); + { + // Excluded, shouldn't match + auto matches = + url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); + EXPECT_EQ(0u, matches.size()); + } + { + auto matches = url_handler_prefs::FindMatchingUrlHandlers( + LocalState(), origin_1_.GetURL().Resolve("foo")); + EXPECT_EQ(1u, matches.size()); + CheckMatches(matches, {web_app_2.get()}, {profile_1_}); + } + { + auto matches = + url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_2_); + EXPECT_EQ(1u, matches.size()); + CheckMatches(matches, {web_app_2.get()}, {profile_1_}); + } } TEST_F(UrlHandlerPrefsTest, DifferentAppsWithSameHandler) { @@ -285,10 +307,9 @@ url_handler_prefs::AddWebApp(LocalState(), web_app_2->app_id(), profile_1_, web_app_2->url_handlers()); - const auto matches = + auto matches = url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(2u, matches->size()); + EXPECT_EQ(2u, matches.size()); CheckMatches(matches, {web_app_1.get(), web_app_2.get()}, {profile_1_, profile_1_}); } @@ -300,21 +321,21 @@ web_app_1->url_handlers()); url_handler_prefs::AddWebApp(LocalState(), web_app_1->app_id(), profile_2_, web_app_1->url_handlers()); - - auto matches = - url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(2u, matches->size()); - CheckMatches(matches, {web_app_1.get(), web_app_1.get()}, - {profile_1_, profile_2_}); - - url_handler_prefs::RemoveWebApp(LocalState(), web_app_1->app_id(), - profile_1_); - matches = - url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(1u, matches->size()); - CheckMatches(matches, {web_app_1.get()}, {profile_2_}); + { + auto matches = + url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); + EXPECT_EQ(2u, matches.size()); + CheckMatches(matches, {web_app_1.get(), web_app_1.get()}, + {profile_1_, profile_2_}); + } + { + url_handler_prefs::RemoveWebApp(LocalState(), web_app_1->app_id(), + profile_1_); + auto matches = + url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); + EXPECT_EQ(1u, matches.size()); + CheckMatches(matches, {web_app_1.get()}, {profile_2_}); + } } TEST_F(UrlHandlerPrefsTest, MultipleProfiles_RemoveProfile) { @@ -328,19 +349,19 @@ web_app_1->url_handlers()); url_handler_prefs::AddWebApp(LocalState(), web_app_2->app_id(), profile_2_, web_app_2->url_handlers()); - - url_handler_prefs::RemoveProfile(LocalState(), profile_2_); - auto matches = - url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(1u, matches->size()); - CheckMatches(matches, {web_app_1.get()}, {profile_1_}); - - url_handler_prefs::RemoveProfile(LocalState(), profile_1_); - matches = - url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(0u, matches->size()); + { + url_handler_prefs::RemoveProfile(LocalState(), profile_2_); + auto matches = + url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); + EXPECT_EQ(1u, matches.size()); + CheckMatches(matches, {web_app_1.get()}, {profile_1_}); + } + { + url_handler_prefs::RemoveProfile(LocalState(), profile_1_); + auto matches = + url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); + EXPECT_EQ(0u, matches.size()); + } } TEST_F(UrlHandlerPrefsTest, ClearEntries) { @@ -353,14 +374,16 @@ url_handler_prefs::AddWebApp(LocalState(), web_app_2->app_id(), profile_2_, web_app_2->url_handlers()); url_handler_prefs::Clear(LocalState()); - auto matches = - url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(0u, matches->size()); - matches = - url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_2_); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(0u, matches->size()); + { + auto matches = + url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); + EXPECT_EQ(0u, matches.size()); + } + { + auto matches = + url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_2_); + EXPECT_EQ(0u, matches.size()); + } } TEST_F(UrlHandlerPrefsTest, SubdomainMatch) { @@ -375,30 +398,30 @@ {apps::UrlHandlerInfo(origin_1_, /*has_origin_wildcard*/ true)}); url_handler_prefs::AddWebApp(LocalState(), web_app_2->app_id(), profile_1_, web_app_2->url_handlers()); - - // Both handlers should match a URL with an exact origin. - auto matches = - url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(2u, matches->size()); - CheckMatches(matches, {web_app_1.get(), web_app_2.get()}, - {profile_1_, profile_1_}); - - // Only the handler that has an origin with wildcard prefix should match a URL - // that has a longer origin. - GURL en_origin_url_1("https://en.origin-1.com/abc"); - GURL www_en_origin_url_1("https://www.en.origin-1.com/abc"); - matches = - url_handler_prefs::FindMatchingUrlHandlers(LocalState(), en_origin_url_1); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(1u, matches->size()); - CheckMatches(matches, {web_app_2.get()}, {profile_1_}); - - matches = url_handler_prefs::FindMatchingUrlHandlers(LocalState(), - www_en_origin_url_1); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(1u, matches->size()); - CheckMatches(matches, {web_app_2.get()}, {profile_1_}); + { + // Both handlers should match a URL with an exact origin. + auto matches = + url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); + EXPECT_EQ(2u, matches.size()); + CheckMatches(matches, {web_app_1.get(), web_app_2.get()}, + {profile_1_, profile_1_}); + } + { + // Only the handler that has an origin with wildcard prefix should match a + // URL that has a longer origin. + GURL en_origin_url_1("https://en.origin-1.com/abc"); + auto matches = url_handler_prefs::FindMatchingUrlHandlers(LocalState(), + en_origin_url_1); + EXPECT_EQ(1u, matches.size()); + CheckMatches(matches, {web_app_2.get()}, {profile_1_}); + } + { + GURL www_en_origin_url_1("https://www.en.origin-1.com/abc"); + auto matches = url_handler_prefs::FindMatchingUrlHandlers( + LocalState(), www_en_origin_url_1); + EXPECT_EQ(1u, matches.size()); + CheckMatches(matches, {web_app_2.get()}, {profile_1_}); + } } TEST_F(UrlHandlerPrefsTest, SubdomainMatch_DifferentLevels) { @@ -420,19 +443,20 @@ web_app_2->url_handlers()); // Both handlers should match a URL that has a longer origin. - auto matches = - url_handler_prefs::FindMatchingUrlHandlers(LocalState(), en_origin_url_1); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(2u, matches->size()); - CheckMatches(matches, {web_app_2.get(), web_app_1.get()}, - {profile_1_, profile_1_}); - - matches = url_handler_prefs::FindMatchingUrlHandlers(LocalState(), - www_en_origin_url_1); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(2u, matches->size()); - CheckMatches(matches, {web_app_2.get(), web_app_1.get()}, - {profile_1_, profile_1_}); + { + auto matches = url_handler_prefs::FindMatchingUrlHandlers(LocalState(), + en_origin_url_1); + EXPECT_EQ(2u, matches.size()); + CheckMatches(matches, {web_app_2.get(), web_app_1.get()}, + {profile_1_, profile_1_}); + } + { + auto matches = url_handler_prefs::FindMatchingUrlHandlers( + LocalState(), www_en_origin_url_1); + EXPECT_EQ(2u, matches.size()); + CheckMatches(matches, {web_app_2.get(), web_app_1.get()}, + {profile_1_, profile_1_}); + } } TEST_F(UrlHandlerPrefsTest, SubdomainMatch_WildcardAsSubdomain) { @@ -446,20 +470,17 @@ auto matches = url_handler_prefs::FindMatchingUrlHandlers( LocalState(), GURL("https://example.com")); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(1u, matches->size()); + EXPECT_EQ(1u, matches.size()); CheckMatches(matches, {web_app.get()}, {profile_1_}); matches = url_handler_prefs::FindMatchingUrlHandlers( LocalState(), GURL("https://foo.example.com")); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(1u, matches->size()); + EXPECT_EQ(1u, matches.size()); CheckMatches(matches, {web_app.get()}, {profile_1_}); matches = url_handler_prefs::FindMatchingUrlHandlers( LocalState(), GURL("https://example.me")); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(0u, matches->size()); + EXPECT_EQ(0u, matches.size()); } TEST_F(UrlHandlerPrefsTest, MatchPaths) { @@ -471,68 +492,72 @@ // Get origin url without paths GURL origin_url = origin_1_.GetURL(); - // Exact match - auto matches = url_handler_prefs::FindMatchingUrlHandlers( - LocalState(), origin_url.Resolve("foo/bar")); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(1u, matches->size()); - CheckMatches(matches, {web_app.get()}, {profile_1_}); - - // "/path/to/" and "/path/to" are different - matches = url_handler_prefs::FindMatchingUrlHandlers( - LocalState(), origin_url.Resolve("foo/bar/")); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(0u, matches->size()); - - // No match - matches = url_handler_prefs::FindMatchingUrlHandlers( - LocalState(), origin_url.Resolve("foo")); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(0u, matches->size()); - - // Slash is required at the start of a path to match - handler = apps::UrlHandlerInfo(origin_1_, false, {"foo/bar"}, {}); - url_handler_prefs::AddWebApp(LocalState(), web_app->app_id(), profile_1_, - {handler}); - matches = url_handler_prefs::FindMatchingUrlHandlers( - LocalState(), origin_url.Resolve("foo/bar")); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(0u, matches->size()); - - // Test wildcard that matches everything - handler = apps::UrlHandlerInfo(origin_1_, false, {"*"}, {}); - url_handler_prefs::AddWebApp(LocalState(), web_app->app_id(), profile_1_, - {handler}); - matches = - url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(1u, matches->size()); - CheckMatches(matches, {web_app.get()}, {profile_1_}); - matches = url_handler_prefs::FindMatchingUrlHandlers( - LocalState(), origin_url.Resolve("foo/bar/baz")); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(1u, matches->size()); - CheckMatches(matches, {web_app.get()}, {profile_1_}); - - // Test wildcard with prefix - handler = apps::UrlHandlerInfo(origin_1_, false, {"/foo/*"}, {}); - url_handler_prefs::AddWebApp(LocalState(), web_app->app_id(), profile_1_, - {handler}); - matches = url_handler_prefs::FindMatchingUrlHandlers( - LocalState(), origin_url.Resolve("foo/bar")); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(1u, matches->size()); - CheckMatches(matches, {web_app.get()}, {profile_1_}); - matches = url_handler_prefs::FindMatchingUrlHandlers( - LocalState(), origin_url.Resolve("foo/")); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(1u, matches->size()); - CheckMatches(matches, {web_app.get()}, {profile_1_}); - // No match because "/foo" and "/foo/" are different - matches = url_handler_prefs::FindMatchingUrlHandlers( - LocalState(), origin_url.Resolve("foo")); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(0u, matches->size()); + { + // Exact match + auto matches = url_handler_prefs::FindMatchingUrlHandlers( + LocalState(), origin_url.Resolve("foo/bar")); + EXPECT_EQ(1u, matches.size()); + CheckMatches(matches, {web_app.get()}, {profile_1_}); + } + { + // "/path/to/" and "/path/to" are different + auto matches = url_handler_prefs::FindMatchingUrlHandlers( + LocalState(), origin_url.Resolve("foo/bar/")); + EXPECT_EQ(0u, matches.size()); + } + { + // No match + auto matches = url_handler_prefs::FindMatchingUrlHandlers( + LocalState(), origin_url.Resolve("foo")); + EXPECT_EQ(0u, matches.size()); + } + { + // Slash is required at the start of a path to match + handler = apps::UrlHandlerInfo(origin_1_, false, {"foo/bar"}, {}); + url_handler_prefs::AddWebApp(LocalState(), web_app->app_id(), profile_1_, + {handler}); + auto matches = url_handler_prefs::FindMatchingUrlHandlers( + LocalState(), origin_url.Resolve("foo/bar")); + EXPECT_EQ(0u, matches.size()); + } + { + // Test wildcard that matches everything + handler = apps::UrlHandlerInfo(origin_1_, false, {"*"}, {}); + url_handler_prefs::AddWebApp(LocalState(), web_app->app_id(), profile_1_, + {handler}); + auto matches = + url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); + EXPECT_EQ(1u, matches.size()); + CheckMatches(matches, {web_app.get()}, {profile_1_}); + } + { + auto matches = url_handler_prefs::FindMatchingUrlHandlers( + LocalState(), origin_url.Resolve("foo/bar/baz")); + EXPECT_EQ(1u, matches.size()); + CheckMatches(matches, {web_app.get()}, {profile_1_}); + } + { + // Test wildcard with prefix + handler = apps::UrlHandlerInfo(origin_1_, false, {"/foo/*"}, {}); + url_handler_prefs::AddWebApp(LocalState(), web_app->app_id(), profile_1_, + {handler}); + auto matches = url_handler_prefs::FindMatchingUrlHandlers( + LocalState(), origin_url.Resolve("foo/bar")); + EXPECT_EQ(1u, matches.size()); + CheckMatches(matches, {web_app.get()}, {profile_1_}); + } + { + auto matches = url_handler_prefs::FindMatchingUrlHandlers( + LocalState(), origin_url.Resolve("foo/")); + EXPECT_EQ(1u, matches.size()); + CheckMatches(matches, {web_app.get()}, {profile_1_}); + } + { + // No match because "/foo" and "/foo/" are different + auto matches = url_handler_prefs::FindMatchingUrlHandlers( + LocalState(), origin_url.Resolve("foo")); + EXPECT_EQ(0u, matches.size()); + } } TEST_F(UrlHandlerPrefsTest, MatchPathsAndExcludePaths) { @@ -541,59 +566,63 @@ const auto web_app = WebAppWithUrlHandlers(app_url_1_, {handler}); url_handler_prefs::AddWebApp(LocalState(), web_app->app_id(), profile_1_, web_app->url_handlers()); - // Get origin url without paths + GURL origin_url = origin_1_.GetURL(); - auto matches = url_handler_prefs::FindMatchingUrlHandlers( - LocalState(), origin_url.Resolve("foo/bar")); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(1u, matches->size()); - CheckMatches(matches, {web_app.get()}, {profile_1_}); - - // Only exclude paths - handler = apps::UrlHandlerInfo(origin_1_, false, {}, {"/foo/bar"}); - url_handler_prefs::AddWebApp(LocalState(), web_app->app_id(), profile_1_, - {handler}); - // Exact match with the excluded path, not matching - matches = url_handler_prefs::FindMatchingUrlHandlers( - LocalState(), origin_url.Resolve("foo/bar")); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(0u, matches->size()); - // Everything else matches - matches = url_handler_prefs::FindMatchingUrlHandlers( - LocalState(), origin_url.Resolve("foo")); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(1u, matches->size()); - CheckMatches(matches, {web_app.get()}, {profile_1_}); - - // Both paths and exclude paths exist - handler = apps::UrlHandlerInfo(origin_1_, false, {"/foo*"}, {"/foo/bar*"}); - url_handler_prefs::AddWebApp(LocalState(), web_app->app_id(), profile_1_, - {handler}); - // Match path and not exclude path - matches = url_handler_prefs::FindMatchingUrlHandlers( - LocalState(), origin_url.Resolve("foo")); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(1u, matches->size()); - CheckMatches(matches, {web_app.get()}, {profile_1_}); - // Match exclude path - matches = url_handler_prefs::FindMatchingUrlHandlers( - LocalState(), origin_url.Resolve("foo/bar/baz")); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(0u, matches->size()); - // Doesn't match path or exclude path - matches = url_handler_prefs::FindMatchingUrlHandlers( - LocalState(), origin_url.Resolve("abc")); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(0u, matches->size()); + { + // Get origin url without paths + auto matches = url_handler_prefs::FindMatchingUrlHandlers( + LocalState(), origin_url.Resolve("foo/bar")); + EXPECT_EQ(1u, matches.size()); + CheckMatches(matches, {web_app.get()}, {profile_1_}); + } + { + // Only exclude paths + handler = apps::UrlHandlerInfo(origin_1_, false, {}, {"/foo/bar"}); + url_handler_prefs::AddWebApp(LocalState(), web_app->app_id(), profile_1_, + {handler}); + // Exact match with the excluded path, not matching + auto matches = url_handler_prefs::FindMatchingUrlHandlers( + LocalState(), origin_url.Resolve("foo/bar")); + EXPECT_EQ(0u, matches.size()); + } + { + // Everything else matches + auto matches = url_handler_prefs::FindMatchingUrlHandlers( + LocalState(), origin_url.Resolve("foo")); + EXPECT_EQ(1u, matches.size()); + CheckMatches(matches, {web_app.get()}, {profile_1_}); + } + { + // Both paths and exclude paths exist + handler = apps::UrlHandlerInfo(origin_1_, false, {"/foo*"}, {"/foo/bar*"}); + url_handler_prefs::AddWebApp(LocalState(), web_app->app_id(), profile_1_, + {handler}); + // Match path and not exclude path + auto matches = url_handler_prefs::FindMatchingUrlHandlers( + LocalState(), origin_url.Resolve("foo")); + EXPECT_EQ(1u, matches.size()); + CheckMatches(matches, {web_app.get()}, {profile_1_}); + } + { + // Match exclude path + auto matches = url_handler_prefs::FindMatchingUrlHandlers( + LocalState(), origin_url.Resolve("foo/bar/baz")); + EXPECT_EQ(0u, matches.size()); + } + { + // Doesn't match path or exclude path + auto matches = url_handler_prefs::FindMatchingUrlHandlers( + LocalState(), origin_url.Resolve("abc")); + EXPECT_EQ(0u, matches.size()); + } // Not matching if it matches an exclude path, even if it matches a path. handler = apps::UrlHandlerInfo(origin_1_, false, {"/foo*"}, {"*"}); url_handler_prefs::AddWebApp(LocalState(), web_app->app_id(), profile_1_, {handler}); - matches = url_handler_prefs::FindMatchingUrlHandlers( + auto matches = url_handler_prefs::FindMatchingUrlHandlers( LocalState(), origin_url.Resolve("foo")); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(0u, matches->size()); + EXPECT_EQ(0u, matches.size()); } TEST_F(UrlHandlerPrefsTest, UpdateApp) { @@ -601,23 +630,25 @@ WebAppWithUrlHandlers(app_url_1_, {apps::UrlHandlerInfo(origin_1_)}); url_handler_prefs::AddWebApp(LocalState(), web_app->app_id(), profile_1_, web_app->url_handlers()); - auto matches = - url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(1u, matches->size()); - CheckMatches(matches, {web_app.get()}, {profile_1_}); - - url_handler_prefs::UpdateWebApp(LocalState(), web_app->app_id(), profile_1_, - {apps::UrlHandlerInfo(origin_2_)}); - matches = - url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(0u, matches->size()); - matches = - url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_2_); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(1u, matches->size()); - CheckMatches(matches, {web_app.get()}, {profile_1_}); + { + auto matches = + url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); + EXPECT_EQ(1u, matches.size()); + CheckMatches(matches, {web_app.get()}, {profile_1_}); + } + { + url_handler_prefs::UpdateWebApp(LocalState(), web_app->app_id(), profile_1_, + {apps::UrlHandlerInfo(origin_2_)}); + auto matches = + url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_1_); + EXPECT_EQ(0u, matches.size()); + } + { + auto matches = + url_handler_prefs::FindMatchingUrlHandlers(LocalState(), origin_url_2_); + EXPECT_EQ(1u, matches.size()); + CheckMatches(matches, {web_app.get()}, {profile_1_}); + } } TEST_F(UrlHandlerPrefsTest, UpdateAppWithPaths) { @@ -626,35 +657,39 @@ apps::UrlHandlerInfo(origin_2_, false, {"/c"}, {"/d"})}); url_handler_prefs::AddWebApp(LocalState(), web_app->app_id(), profile_1_, web_app->url_handlers()); - auto matches = url_handler_prefs::FindMatchingUrlHandlers( - LocalState(), origin_url_1_.Resolve("a")); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(1u, matches->size()); - matches = url_handler_prefs::FindMatchingUrlHandlers( - LocalState(), origin_url_2_.Resolve("c")); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(1u, matches->size()); - CheckMatches(matches, {web_app.get()}, {profile_1_}); - - url_handler_prefs::UpdateWebApp( - LocalState(), web_app->app_id(), profile_1_, - {apps::UrlHandlerInfo(origin_1_, false, {"/a"}, {"/b"}), - apps::UrlHandlerInfo(origin_2_, false, {"/foo"}, {"/bar"})}); - matches = url_handler_prefs::FindMatchingUrlHandlers( - LocalState(), origin_url_1_.Resolve("a")); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(1u, matches->size()); - CheckMatches(matches, {web_app.get()}, {profile_1_}); - matches = url_handler_prefs::FindMatchingUrlHandlers( - LocalState(), origin_url_2_.Resolve("foo")); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(1u, matches->size()); - CheckMatches(matches, {web_app.get()}, {profile_1_}); - // No longer match since it's removed - matches = url_handler_prefs::FindMatchingUrlHandlers( - LocalState(), origin_url_2_.Resolve("c")); - EXPECT_TRUE(matches.has_value()); - EXPECT_EQ(0u, matches->size()); + { + auto matches = url_handler_prefs::FindMatchingUrlHandlers( + LocalState(), origin_url_1_.Resolve("a")); + EXPECT_EQ(1u, matches.size()); + } + { + auto matches = url_handler_prefs::FindMatchingUrlHandlers( + LocalState(), origin_url_2_.Resolve("c")); + EXPECT_EQ(1u, matches.size()); + CheckMatches(matches, {web_app.get()}, {profile_1_}); + } + { + url_handler_prefs::UpdateWebApp( + LocalState(), web_app->app_id(), profile_1_, + {apps::UrlHandlerInfo(origin_1_, false, {"/a"}, {"/b"}), + apps::UrlHandlerInfo(origin_2_, false, {"/foo"}, {"/bar"})}); + auto matches = url_handler_prefs::FindMatchingUrlHandlers( + LocalState(), origin_url_1_.Resolve("a")); + EXPECT_EQ(1u, matches.size()); + CheckMatches(matches, {web_app.get()}, {profile_1_}); + } + { + auto matches = url_handler_prefs::FindMatchingUrlHandlers( + LocalState(), origin_url_2_.Resolve("foo")); + EXPECT_EQ(1u, matches.size()); + CheckMatches(matches, {web_app.get()}, {profile_1_}); + } + { + // No longer match since it's removed + auto matches = url_handler_prefs::FindMatchingUrlHandlers( + LocalState(), origin_url_2_.Resolve("c")); + EXPECT_EQ(0u, matches.size()); + } } } // namespace web_app
diff --git a/chrome/browser/web_applications/components/web_app_constants.cc b/chrome/browser/web_applications/components/web_app_constants.cc index 1c5fb82..7248301 100644 --- a/chrome/browser/web_applications/components/web_app_constants.cc +++ b/chrome/browser/web_applications/components/web_app_constants.cc
@@ -12,6 +12,8 @@ namespace web_app { +const char kRunOnOsLoginModeWindowed[] = "windowed"; + namespace { // Note: This can never return kBrowser. This is because the user has
diff --git a/chrome/browser/web_applications/components/web_app_constants.h b/chrome/browser/web_applications/components/web_app_constants.h index cff0a3d9..3b3694f 100644 --- a/chrome/browser/web_applications/components/web_app_constants.h +++ b/chrome/browser/web_applications/components/web_app_constants.h
@@ -216,6 +216,9 @@ kMinimized = 2, }; +// Command line parameter representing RunOnOsLoginMode::kWindowed. +extern const char kRunOnOsLoginModeWindowed[]; + enum class RunOnOsLoginPolicy { // kAllowed: User can configure an app to run on OS Login. kAllowed = 0,
diff --git a/chrome/browser/web_applications/components/web_app_run_on_os_login_win_unittest.cc b/chrome/browser/web_applications/components/web_app_run_on_os_login_win_unittest.cc index c5cc534..9032e8b 100644 --- a/chrome/browser/web_applications/components/web_app_run_on_os_login_win_unittest.cc +++ b/chrome/browser/web_applications/components/web_app_run_on_os_login_win_unittest.cc
@@ -9,11 +9,13 @@ #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/strings/utf_string_conversions.h" +#include "base/win/shortcut.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/web_applications/components/web_app_shortcut.h" #include "chrome/browser/web_applications/components/web_app_shortcut_win.h" #include "chrome/browser/web_applications/components/web_application_info.h" #include "chrome/browser/web_applications/test/web_app_test.h" +#include "chrome/common/chrome_switches.h" #include "chrome/installer/util/shell_util.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/gfx/image/image_skia.h" @@ -67,6 +69,18 @@ void VerifyShortcutCreated() { std::vector<base::FilePath> shortcuts = GetShortcuts(); EXPECT_GT(shortcuts.size(), 0u); + + for (const base::FilePath& shortcut : shortcuts) { + std::wstring cmd_line_string; + EXPECT_TRUE( + base::win::ResolveShortcut(shortcut, nullptr, &cmd_line_string)); + base::CommandLine shortcut_cmd_line = + base::CommandLine::FromString(L"program " + cmd_line_string); + EXPECT_TRUE(shortcut_cmd_line.HasSwitch(switches::kAppRunOnOsLoginMode)); + EXPECT_EQ( + shortcut_cmd_line.GetSwitchValueASCII(switches::kAppRunOnOsLoginMode), + kRunOnOsLoginModeWindowed); + } } void VerifyShortcutDeleted() {
diff --git a/chrome/browser/web_applications/components/web_app_shortcut_linux.cc b/chrome/browser/web_applications/components/web_app_shortcut_linux.cc index d1326fe..e5be4ed2 100644 --- a/chrome/browser/web_applications/components/web_app_shortcut_linux.cc +++ b/chrome/browser/web_applications/components/web_app_shortcut_linux.cc
@@ -26,6 +26,7 @@ #include "build/chromeos_buildflags.h" #include "chrome/browser/shell_integration.h" #include "chrome/browser/shell_integration_linux.h" +#include "chrome/browser/web_applications/components/web_app_constants.h" #include "chrome/browser/web_applications/components/web_app_id.h" #include "chrome/browser/web_applications/components/web_app_shortcut.h" #include "chrome/common/auto_start_linux.h" @@ -402,18 +403,21 @@ return false; } - if (creation_locations.on_desktop || creation_locations.in_startup) { + if (creation_locations.on_desktop) { std::string contents = shell_integration_linux::GetDesktopFileContents( chrome_exe_path, app_name, shortcut_info.url, shortcut_info.extension_id, shortcut_info.title, icon_name, - shortcut_info.profile_path, "", "", false); + shortcut_info.profile_path, "", "", false, ""); + success = CreateShortcutOnDesktop(shortcut_filename, contents); + } - if (creation_locations.on_desktop) - success = CreateShortcutOnDesktop(shortcut_filename, contents); - - if (creation_locations.in_startup) - success = CreateShortcutInAutoStart(env, shortcut_filename, contents) && - success; + if (creation_locations.in_startup) { + std::string contents = shell_integration_linux::GetDesktopFileContents( + chrome_exe_path, app_name, shortcut_info.url, + shortcut_info.extension_id, shortcut_info.title, icon_name, + shortcut_info.profile_path, "", "", false, kRunOnOsLoginModeWindowed); + success = + CreateShortcutInAutoStart(env, shortcut_filename, contents) && success; } if (creation_locations.applications_menu_location == APP_MENU_LOCATION_NONE) { @@ -445,8 +449,8 @@ chrome_exe_path, app_name, shortcut_info.url, shortcut_info.extension_id, shortcut_info.title, icon_name, shortcut_info.profile_path, "", base::JoinString(mime_types, ";"), - creation_locations.applications_menu_location == - APP_MENU_LOCATION_HIDDEN); + creation_locations.applications_menu_location == APP_MENU_LOCATION_HIDDEN, + ""); success = CreateShortcutInApplicationsMenu(env, shortcut_filename, contents, directory_filename, directory_contents) &&
diff --git a/chrome/browser/web_applications/components/web_app_shortcut_linux_unittest.cc b/chrome/browser/web_applications/components/web_app_shortcut_linux_unittest.cc index 4df37702..5d9724cb 100644 --- a/chrome/browser/web_applications/components/web_app_shortcut_linux_unittest.cc +++ b/chrome/browser/web_applications/components/web_app_shortcut_linux_unittest.cc
@@ -25,6 +25,7 @@ #include "base/test/bind.h" #include "base/test/scoped_path_override.h" #include "chrome/browser/shell_integration_linux.h" +#include "chrome/browser/web_applications/components/web_app_constants.h" #include "chrome/browser/web_applications/components/web_app_id.h" #include "chrome/browser/web_applications/components/web_app_shortcut.h" #include "chrome/browser/web_applications/components/web_application_info.h" @@ -474,15 +475,16 @@ // because of the hook into XdgUtilityForTesting. // Validate the shortcut was created, and the contents are what we expect // them to be. - std::string expected_contents = - shell_integration_linux::GetDesktopFileContents( - shell_integration_linux::internal::GetChromeExePath(), - GenerateApplicationNameFromInfo(*shortcut_info), shortcut_info->url, - shortcut_info->extension_id, shortcut_info->title, - "chrome-test_extension-Profile_1", shortcut_info->profile_path, "", - "", false); { + std::string expected_contents = + shell_integration_linux::GetDesktopFileContents( + shell_integration_linux::internal::GetChromeExePath(), + GenerateApplicationNameFromInfo(*shortcut_info), shortcut_info->url, + shortcut_info->extension_id, shortcut_info->title, + "chrome-test_extension-Profile_1", shortcut_info->profile_path, "", + "", false, ""); + base::FilePath desktop_shortcut_path = scoped_desktop_path.GetPath().Append(GetTemplateFilename()); ASSERT_TRUE(base::PathExists(desktop_shortcut_path)); @@ -494,6 +496,13 @@ } { + std::string expected_contents = + shell_integration_linux::GetDesktopFileContents( + shell_integration_linux::internal::GetChromeExePath(), + GenerateApplicationNameFromInfo(*shortcut_info), shortcut_info->url, + shortcut_info->extension_id, shortcut_info->title, + "chrome-test_extension-Profile_1", shortcut_info->profile_path, "", + "", false, kRunOnOsLoginModeWindowed); base::FilePath autostart_shortcut_path = autostart_path.GetPath().Append(GetTemplateFilename()); ASSERT_TRUE(base::PathExists(autostart_shortcut_path)); @@ -548,7 +557,7 @@ GenerateApplicationNameFromInfo(*shortcut_info), shortcut_info->url, shortcut_info->extension_id, shortcut_info->title, "chrome-test_extension-Profile_1", shortcut_info->profile_path, "", - "", false); + "", false, kRunOnOsLoginModeWindowed); // |scoped_desktop_path| was deleted earlier, confirm it wasn't recreated. EXPECT_FALSE(base::DirectoryExists(desktop_path)); @@ -659,15 +668,16 @@ // because of the hook into XdgUtilityForTesting. // Validate the shortcut was created, and the contents are what we expect // them to be. - std::string expected_contents = - shell_integration_linux::GetDesktopFileContents( - shell_integration_linux::internal::GetChromeExePath(), - GenerateApplicationNameFromInfo(*shortcut_info), shortcut_info->url, - shortcut_info->extension_id, shortcut_info->title, - "chrome-https___example.com_", shortcut_info->profile_path, "", "", - false); { + std::string expected_contents = + shell_integration_linux::GetDesktopFileContents( + shell_integration_linux::internal::GetChromeExePath(), + GenerateApplicationNameFromInfo(*shortcut_info), shortcut_info->url, + shortcut_info->extension_id, shortcut_info->title, + "chrome-https___example.com_", shortcut_info->profile_path, "", "", + false, ""); + base::FilePath desktop_shortcut_path = scoped_desktop_path.GetPath().Append( "chrome-https___example.com_.desktop"); ASSERT_TRUE(base::PathExists(desktop_shortcut_path)); @@ -679,6 +689,14 @@ } { + std::string expected_contents = + shell_integration_linux::GetDesktopFileContents( + shell_integration_linux::internal::GetChromeExePath(), + GenerateApplicationNameFromInfo(*shortcut_info), shortcut_info->url, + shortcut_info->extension_id, shortcut_info->title, + "chrome-https___example.com_", shortcut_info->profile_path, "", "", + false, kRunOnOsLoginModeWindowed); + base::FilePath autostart_shortcut_path = autostart_path.GetPath().Append("chrome-https___example.com_.desktop"); ASSERT_TRUE(base::PathExists(autostart_shortcut_path)); @@ -730,7 +748,7 @@ GenerateApplicationNameFromInfo(*shortcut_info), shortcut_info->url, shortcut_info->extension_id, shortcut_info->title, "chrome-test_extension-Profile_1", shortcut_info->profile_path, "", - "", false); + "", false, ""); base::FilePath desktop_shortcut_path = scoped_desktop_path.GetPath().Append(GetTemplateFilename());
diff --git a/chrome/browser/web_applications/components/web_app_shortcut_win.cc b/chrome/browser/web_applications/components/web_app_shortcut_win.cc index 9d17f80..41b395e 100644 --- a/chrome/browser/web_applications/components/web_app_shortcut_win.cc +++ b/chrome/browser/web_applications/components/web_app_shortcut_win.cc
@@ -29,6 +29,7 @@ #include "base/win/shortcut.h" #include "chrome/browser/shell_integration.h" #include "chrome/browser/shell_integration_win.h" +#include "chrome/browser/web_applications/components/web_app_constants.h" #include "chrome/browser/web_applications/components/web_app_shortcuts_menu_win.h" #include "chrome/common/chrome_switches.h" #include "chrome/installer/util/shell_util.h" @@ -148,6 +149,7 @@ const ShortcutInfo& shortcut_info, const std::vector<base::FilePath>& shortcut_paths, ShortcutCreationReason creation_reason, + const std::string& run_on_os_login_mode, std::vector<base::FilePath>* out_filenames) { // Generates file name to use with persisted ico and shortcut file. base::FilePath icon_file = GetIconFilePath(web_app_path, shortcut_info.title); @@ -162,8 +164,8 @@ base::CommandLine cmd_line(base::CommandLine::NO_PROGRAM); cmd_line = shell_integration::CommandLineArgsForLauncher( - shortcut_info.url, shortcut_info.extension_id, - shortcut_info.profile_path); + shortcut_info.url, shortcut_info.extension_id, shortcut_info.profile_path, + run_on_os_login_mode); // TODO(evan): we rely on the fact that command_line_string() is // properly quoted for a Windows command line. The method on @@ -299,9 +301,9 @@ HWND hwnd, const ShortcutInfo& shortcut_info) { base::CommandLine command_line = - shell_integration::CommandLineArgsForLauncher(shortcut_info.url, - shortcut_info.extension_id, - shortcut_info.profile_path); + shell_integration::CommandLineArgsForLauncher( + shortcut_info.url, shortcut_info.extension_id, + shortcut_info.profile_path, ""); command_line.SetProgram(GetChromeProxyPath()); ui::win::SetRelaunchDetailsForWindow(command_line.GetCommandLineString(), @@ -425,8 +427,10 @@ if (shortcut_paths.empty()) return false; - if (!CreateShortcutsInPaths(web_app_path, shortcut_info, shortcut_paths, - creation_reason, nullptr)) { + if (!CreateShortcutsInPaths( + web_app_path, shortcut_info, shortcut_paths, creation_reason, + creation_locations.in_startup ? kRunOnOsLoginModeWindowed : "", + nullptr)) { return false; } @@ -459,7 +463,7 @@ web_app_path, shortcut_info.profile_path, old_app_title, &was_pinned_to_taskbar, &shortcut_paths); CreateShortcutsInPaths(web_app_path, shortcut_info, shortcut_paths, - SHORTCUT_CREATION_BY_USER, nullptr); + SHORTCUT_CREATION_BY_USER, "", nullptr); // If the shortcut was pinned to the taskbar, // GetShortcutLocationsAndDeleteShortcuts will have deleted it. In that // case, re-pin it.
diff --git a/chrome/browser/web_applications/test/fake_web_app_origin_association_manager.cc b/chrome/browser/web_applications/test/fake_web_app_origin_association_manager.cc index c416b05..4b91049 100644 --- a/chrome/browser/web_applications/test/fake_web_app_origin_association_manager.cc +++ b/chrome/browser/web_applications/test/fake_web_app_origin_association_manager.cc
@@ -22,10 +22,15 @@ apps::UrlHandlers url_handlers, OnDidGetWebAppOriginAssociations callback) { apps::UrlHandlers result; - for (const auto& url_handler : url_handlers) { - auto it = data_.find(url_handler); - if (it != data_.end()) - result.push_back(it->second); + + if (pass_through_) { + result = url_handlers; + } else { + for (const auto& url_handler : url_handlers) { + auto it = data_.find(url_handler); + if (it != data_.end()) + result.push_back(it->second); + } } base::SequencedTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::BindOnce(std::move(callback), result));
diff --git a/chrome/browser/web_applications/test/fake_web_app_origin_association_manager.h b/chrome/browser/web_applications/test/fake_web_app_origin_association_manager.h index 52513b92..d48214f 100644 --- a/chrome/browser/web_applications/test/fake_web_app_origin_association_manager.h +++ b/chrome/browser/web_applications/test/fake_web_app_origin_association_manager.h
@@ -18,7 +18,8 @@ FakeWebAppOriginAssociationManager(); ~FakeWebAppOriginAssociationManager() override; - // Sends back |url_handlers| as is. + // Sends back preset data. + // Sends back |url_handlers| as is if pass_through_ is set. void GetWebAppOriginAssociations( const GURL& manifest_url, apps::UrlHandlers url_handlers, @@ -26,10 +27,13 @@ void SetData(std::map<apps::UrlHandlerInfo, apps::UrlHandlerInfo> data); + void set_pass_through(bool value) { pass_through_ = value; } + private: // Maps a url handler to the corresponding result to send back in the // callback. std::map<apps::UrlHandlerInfo, apps::UrlHandlerInfo> data_; + bool pass_through_ = false; }; } // namespace web_app
diff --git a/chrome/browser/webauthn/authenticator_request_dialog_model.cc b/chrome/browser/webauthn/authenticator_request_dialog_model.cc index 27d3b5df..6f76bb9 100644 --- a/chrome/browser/webauthn/authenticator_request_dialog_model.cc +++ b/chrome/browser/webauthn/authenticator_request_dialog_model.cc
@@ -557,7 +557,7 @@ callback) { if (preselected_account_) { for (auto& response : responses) { - if (response.user_entity() == preselected_account_) { + if (response.user_entity == preselected_account_) { std::move(callback).Run(std::move(response)); return; } @@ -570,7 +570,7 @@ ephemeral_state_.responses_ = std::move(responses); ephemeral_state_.users_ = {}; for (const auto& response : ephemeral_state_.responses_) { - ephemeral_state_.users_.push_back(*response.user_entity()); + ephemeral_state_.users_.push_back(*response.user_entity); } selection_callback_ = std::move(callback); SetCurrentStep(Step::kSelectAccount);
diff --git a/chrome/browser/webauthn/authenticator_request_dialog_model_unittest.cc b/chrome/browser/webauthn/authenticator_request_dialog_model_unittest.cc index 74f5dff..8d7024b5 100644 --- a/chrome/browser/webauthn/authenticator_request_dialog_model_unittest.cc +++ b/chrome/browser/webauthn/authenticator_request_dialog_model_unittest.cc
@@ -643,12 +643,12 @@ device::AuthenticatorData(kAppParam, /*flags=*/0, kSignatureCounter, base::nullopt), /*signature=*/{1}); - response_1.SetUserEntity(user_1); + response_1.user_entity = user_1; device::AuthenticatorGetAssertionResponse response_2( device::AuthenticatorData(kAppParam, /*flags=*/0, kSignatureCounter, base::nullopt), /*signature=*/{2}); - response_2.SetUserEntity(user_2); + response_2.user_entity = user_2; uint8_t selected_id = -1; std::vector<device::AuthenticatorGetAssertionResponse> responses; @@ -658,7 +658,7 @@ std::move(responses), base::BindLambdaForTesting( [&](device::AuthenticatorGetAssertionResponse selected) { - selected_id = selected.signature()[0]; + selected_id = selected.signature[0]; })); EXPECT_EQ(selected_id, 1); }
diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc index 8035be9..dd93470 100644 --- a/chrome/common/chrome_switches.cc +++ b/chrome/common/chrome_switches.cc
@@ -65,6 +65,10 @@ // Value of OAuth2 refresh token for --force-app-mode. const char kAppModeOAuth2Token[] = "app-mode-oauth-token"; +// This is used along with kAppId to indicate an app was launched during +// OS login, and which mode the app was launched in. +const char kAppRunOnOsLoginMode[] = "app-run-on-os-login-mode"; + // The URL that the webstore APIs download extensions from. // Note: the URL must contain one '%s' for the extension ID. const char kAppsGalleryDownloadURL[] = "apps-gallery-download-url";
diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h index b14bcb8..9248c250 100644 --- a/chrome/common/chrome_switches.h +++ b/chrome/common/chrome_switches.h
@@ -46,6 +46,7 @@ extern const char kAppLaunchUrlForShortcutsMenuItem[]; extern const char kAppModeAuthCode[]; extern const char kAppModeOAuth2Token[]; +extern const char kAppRunOnOsLoginMode[]; extern const char kAppsGalleryDownloadURL[]; extern const char kAppsGalleryUpdateURL[]; extern const char kAppsGalleryURL[];
diff --git a/chrome/renderer/chrome_render_frame_observer.cc b/chrome/renderer/chrome_render_frame_observer.cc index 81125c4..77d02bc 100644 --- a/chrome/renderer/chrome_render_frame_observer.cc +++ b/chrome/renderer/chrome_render_frame_observer.cc
@@ -295,7 +295,7 @@ const gfx::Size& thumbnail_max_size_pixels, chrome::mojom::ImageFormat image_format, RequestImageForContextNodeCallback callback) { - WebNode context_node = render_frame()->GetWebFrame()->ContextMenuNode(); + WebNode context_node = render_frame()->GetWebFrame()->ContextMenuImageNode(); std::vector<uint8_t> image_data; gfx::Size original_size; std::string image_extension; @@ -368,7 +368,7 @@ WebLocalFrame* frame = render_frame()->GetWebFrame(); // TODO(dglazkov): This code is clearly in the wrong place. Need // to investigate what it is doing and fix (http://crbug.com/606164). - WebNode context_node = frame->ContextMenuNode(); + WebNode context_node = frame->ContextMenuImageNode(); if (!context_node.IsNull()) { frame->ReloadImage(context_node); }
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 40f287c..d747058f 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -1092,6 +1092,7 @@ "../browser/infobars/infobars_browsertest.cc", "../browser/installable/installable_manager_browsertest.cc", "../browser/invalidation/profile_invalidation_provider_factory_browsertest.cc", + "../browser/lazyload/lazyload_browsertest.cc", "../browser/lifetime/browser_close_manager_browsertest.cc", "../browser/lifetime/browser_shutdown_browsertest.cc", "../browser/lite_video/lite_video_keyed_service_browsertest.cc", @@ -1304,9 +1305,6 @@ "../browser/prefs/pref_functional_browsertest.cc", "../browser/prefs/pref_service_browsertest.cc", "../browser/prefs/tracked/pref_hash_browsertest.cc", - "../browser/previews/lazyload_browsertest.cc", - "../browser/previews/previews_test_util.cc", - "../browser/previews/previews_test_util.h", "../browser/privacy_sandbox/privacy_sandbox_settings_browsertest.cc", "../browser/profile_resetter/profile_resetter_browsertest.cc", "../browser/profiles/host_zoom_map_browsertest.cc", @@ -3090,6 +3088,11 @@ sources += [ "../browser/policy/audio_sandbox_enabled_browsertest.cc" ] } } + if (is_win) { + sources += [ + "../browser/policy/audio_process_high_priority_enabled_browsertest.cc", + ] + } if (is_mac || is_win || is_chromeos_ash) { sources += [ "../browser/extensions/api/networking_cast_private/networking_cast_private_apitest.cc" ] } @@ -5066,6 +5069,7 @@ "../browser/ui/app_list/search/arc/arc_app_reinstall_search_provider_unittest.cc", "../browser/ui/app_list/search/arc/arc_app_shortcuts_search_provider_unittest.cc", "../browser/ui/app_list/search/arc/arc_playstore_search_provider_unittest.cc", + "../browser/ui/app_list/search/arc/recommend_apps_fetcher_impl_unittest.cc", "../browser/ui/app_list/search/assistant_search_provider_unittest.cc", "../browser/ui/app_list/search/assistant_text_search_provider_unittest.cc", "../browser/ui/app_list/search/cros_action_history/cros_action_recorder_tab_tracker_unittest.cc",
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/browser/tab/TabTestUtils.java b/chrome/test/android/javatests/src/org/chromium/chrome/browser/tab/TabTestUtils.java index 91dd09c39..68f4a4b 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/browser/tab/TabTestUtils.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/browser/tab/TabTestUtils.java
@@ -4,6 +4,7 @@ package org.chromium.chrome.browser.tab; +import android.content.Context; import android.view.View; import org.chromium.base.ObserverList; @@ -70,14 +71,14 @@ } else if (show && !isShowing) { SadTab sadTab = new SadTab(tab) { @Override - public View createView(Runnable suggestionAction, Runnable buttonAction, - boolean showSendFeedbackView, boolean isIncognito) { - return new View(((TabImpl) tab).getThemedApplicationContext()); + public View createView(Context context, Runnable suggestionAction, + Runnable buttonAction, boolean showSendFeedbackView, boolean isIncognito) { + return new View(context); } }; TestThreadUtils.runOnUiThreadBlocking(() -> { SadTab.initForTesting(tab, sadTab); - sadTab.show(); + sadTab.show(((TabImpl) tab).getThemedApplicationContext(), () -> {}, () -> {}); }); } }
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/SadTabRule.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/SadTabRule.java index 5395a147..ea8714085 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/SadTabRule.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/SadTabRule.java
@@ -4,6 +4,8 @@ package org.chromium.chrome.test.util; +import android.content.Context; + import org.junit.rules.ExternalResource; import org.chromium.chrome.browser.tab.SadTab; @@ -38,7 +40,8 @@ private boolean mShowing; @Override - public void show() { + public void show( + Context context, Runnable suggestionAction, Runnable buttonAction) { mShowing = true; } @@ -56,7 +59,7 @@ } TestThreadUtils.runOnUiThreadBlocking(() -> { if (show) { - mSadTab.show(); + mSadTab.show(mTab.getContext(), () -> {}, () -> {}); } else { mSadTab.removeIfPresent(); }
diff --git a/chrome/test/chromedriver/js/call_function.js b/chrome/test/chromedriver/js/call_function.js index bd3a2ad..e2b41d7 100644 --- a/chrome/test/chromedriver/js/call_function.js +++ b/chrome/test/chromedriver/js/call_function.js
@@ -110,12 +110,16 @@ */ retrieveItem: function(id) { var item = this.cache_[id]; - if (item && isNodeReachable(item)) + if (item && this.isNodeReachable_(item)) return item; throw newError('element is not attached to the page document', StatusCode.STALE_ELEMENT_REFERENCE); }, + isNodeReachable_: function(node) { + var nodeRoot = getNodeRootThroughAnyShadows(node); + return (nodeRoot == document.documentElement.parentNode); + } }; /** @@ -156,12 +160,16 @@ */ retrieveItem: function(id) { var item = this.cache_[id]; - if (item && isNodeReachable(item)) + if (item && this.isNodeReachable_(item)) return item; throw newError('element is not attached to the page document', StatusCode.STALE_ELEMENT_REFERENCE); }, + isNodeReachable_: function(node) { + var nodeRoot = getNodeRootThroughAnyShadows(node); + return (nodeRoot == document.documentElement.parentNode); + } }; /** @@ -190,17 +198,6 @@ } /** - * Returns if node is connected (https://dom.spec.whatwg.org/#connected) to root. - * Root could be a document or proxy. - * @param {!Node} node The node to check. - * @return {boolean} If the nodes is reachable. - */ -function isNodeReachable(node) { - var nodeRoot = getNodeRootThroughAnyShadows(node); - return (nodeRoot == document.documentElement.parentNode); -} - -/** * Returns the global object cache for the page. * @param {Document=} opt_doc The document whose cache to retrieve. Defaults to * the current document. @@ -322,10 +319,10 @@ return item; if (isElement(item)) { const root = getNodeRootThroughAnyShadows(item); - if (!isNodeReachable(item)) + const cache = getPageCache(root, w3cEnabled); + if (!cache.isNodeReachable_(item)) throw newError('stale element not found', StatusCode.STALE_ELEMENT_REFERENCE); - const cache = getPageCache(root, w3cEnabled); const ret = {}; ret[ELEMENT_KEY] = cache.storeItem(item); return ret;
diff --git a/chrome/test/data/extensions/api_test/service_worker/messaging/native_message_after_worker_stop/manifest.json b/chrome/test/data/extensions/api_test/service_worker/messaging/native_message_after_worker_stop/manifest.json new file mode 100644 index 0000000..ea37974 --- /dev/null +++ b/chrome/test/data/extensions/api_test/service_worker/messaging/native_message_after_worker_stop/manifest.json
@@ -0,0 +1,10 @@ +{ + // Extension ID: knldjmfmopnpolahpmmgbagdohdnhkik + "key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcBHwzDvyBQ6bDppkIs9MP4ksKqCMyXQ/A52JivHZKh4YO/9vJsT3oaYhSpDCE9RPocOEQvwsHsFReW2nUEc6OLLyoCFFxIb7KkLGsmfakkut/fFdNJYh0xOTbSN8YvLWcqph09XAY2Y/f0AL7vfO1cuCqtkMt8hFrBGWxDdf9CQIDAQAB", + "version": "1.0.0.0", + "manifest_version": 2, + "name": "Service worker extension: worker is stopped while a native message port is open", + "description": "Test that worker shutdown while a native message port is open is handled gracefully.", + "background": {"service_worker": "service_worker_background.js"}, + "permissions": ["nativeMessaging"] +}
diff --git a/chrome/test/data/extensions/api_test/service_worker/messaging/native_message_after_worker_stop/service_worker_background.js b/chrome/test/data/extensions/api_test/service_worker/messaging/native_message_after_worker_stop/service_worker_background.js new file mode 100644 index 0000000..f70ac94 --- /dev/null +++ b/chrome/test/data/extensions/api_test/service_worker/messaging/native_message_after_worker_stop/service_worker_background.js
@@ -0,0 +1,15 @@ +// Copyright 2021 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. + +const appName = 'com.google.chrome.test.echo'; +const kExtensionURL = 'chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/'; + +var sentMessage = {text: 'test-echo'}; +port = chrome.runtime.connectNative(appName); +port.onMessage.addListener((message) => { + chrome.test.assertEq(sentMessage, message.echo); + chrome.test.assertEq(kExtensionURL, message.caller_url); + chrome.test.succeed(); +}); +port.postMessage(sentMessage);
diff --git a/chrome/test/data/extensions/platform_apps/web_view/speech_recognition_api/guest.js b/chrome/test/data/extensions/platform_apps/web_view/speech_recognition_api/guest.js index b54eb65b..c5c0be6 100644 --- a/chrome/test/data/extensions/platform_apps/web_view/speech_recognition_api/guest.js +++ b/chrome/test/data/extensions/platform_apps/web_view/speech_recognition_api/guest.js
@@ -20,6 +20,7 @@ succeeded = true; LOG('r.onstart'); notifyEmbedder(['recognition', 'onstart', '']); + r.abort(); }; r.onerror = function() { LOG('r.onerror');
diff --git a/chrome/test/data/policy/policy_test_cases.json b/chrome/test/data/policy/policy_test_cases.json index 9accf45..f4422ef 100644 --- a/chrome/test/data/policy/policy_test_cases.json +++ b/chrome/test/data/policy/policy_test_cases.json
@@ -5530,6 +5530,10 @@ "note": "This policy is used directly through the policy service instead of through a pref." }, + "AudioProcessHighPriorityEnabled": { + "note": "This policy is used directly through the policy service instead of through a pref." + }, + "LoginDisplayPasswordButtonEnabled": { "os": ["chromeos"], "policy_pref_mapping_tests": [ @@ -5672,6 +5676,8 @@ "ReportDeviceSystemInfo": {}, + "ReportDevicePrintJobs": {}, + "ReportUploadFrequency": {}, "DeviceAllowNewUsers": {},
diff --git a/chrome/test/data/previews/client_redirect_base_to_server_redirect_with_defer_all_script.html b/chrome/test/data/previews/client_redirect_base_to_server_redirect_with_defer_all_script.html deleted file mode 100644 index b08c1c3..0000000 --- a/chrome/test/data/previews/client_redirect_base_to_server_redirect_with_defer_all_script.html +++ /dev/null
@@ -1,11 +0,0 @@ -<html> - <head> - <!-- Disable referrer to test that the redirect loop detection works even - when referrer policy prevents setting of referrer--> - <meta name="referrer" content="no-referrer" /> - <title>Test page that client redirects to another page (that may loop back).</title> - <script> - document.location.href = "client_redirect_loop_to_server_redirect_with_defer_all_script.html"; - </script> - </head> -</html>
diff --git a/chrome/test/data/previews/client_redirect_loop_to_server_redirect_with_defer_all_script.html b/chrome/test/data/previews/client_redirect_loop_to_server_redirect_with_defer_all_script.html deleted file mode 100644 index 02a870e..0000000 --- a/chrome/test/data/previews/client_redirect_loop_to_server_redirect_with_defer_all_script.html +++ /dev/null
@@ -1,19 +0,0 @@ -<html> - <head> - <!-- Disable referrer to test that the redirect loop detection works even - when referrer policy prevents setting of referrer--> - <meta name="referrer" content="no-referrer" /> - - <title>Test page that causes a client redirect loop while script execution is deferred.</title> - <script> - if (document.getElementById("bodyend")) { - document.location.href = "/server_redirect_base_redirect_to_final_server_redirect.html"; - } else { - document.location.href = "/defer_all_script_browsertest.html"; - } - </script> - </head> - <body> - <pre id="bodyend">End</pre> - </body> -</html>
diff --git a/chrome/test/data/previews/client_redirect_loop_with_defer_all_script.html b/chrome/test/data/previews/client_redirect_loop_with_defer_all_script.html deleted file mode 100644 index d5d4684..0000000 --- a/chrome/test/data/previews/client_redirect_loop_with_defer_all_script.html +++ /dev/null
@@ -1,19 +0,0 @@ -<html> - <head> - <!-- Disable referrer to test that the redirect loop detection works even - when referrer policy prevents setting of referrer--> - <meta name="referrer" content="no-referrer" /> - - <title>Test page that causes a client redirect loop while script execution is deferred.</title> - <script> - if (document.getElementById("bodyend")) { - document.location.href = "/client_redirect_base.html"; - } else { - document.location.href = "/defer_all_script_browsertest.html"; - } - </script> - </head> - <body> - <pre id="bodyend">End</pre> - </body> -</html>
diff --git a/chrome/test/data/previews/defer_all_script_deferscript.js b/chrome/test/data/previews/defer_all_script_deferscript.js deleted file mode 100644 index 0bf93de6..0000000 --- a/chrome/test/data/previews/defer_all_script_deferscript.js +++ /dev/null
@@ -1 +0,0 @@ -log("DeveloperDeferScript");
diff --git a/chrome/test/data/previews/defer_all_script_syncscript.js b/chrome/test/data/previews/defer_all_script_syncscript.js deleted file mode 100644 index 1ed26a99..0000000 --- a/chrome/test/data/previews/defer_all_script_syncscript.js +++ /dev/null
@@ -1 +0,0 @@ -log("SyncScript");
diff --git a/chrome/test/data/previews/defer_all_script_test.html b/chrome/test/data/previews/defer_all_script_test.html deleted file mode 100644 index b7b422e..0000000 --- a/chrome/test/data/previews/defer_all_script_test.html +++ /dev/null
@@ -1,38 +0,0 @@ -<html> - <head> - <title>Test page for DeferAllScript Preview.</title> - </head> - <body> - <!-- Scripts log when they execute in the scriptlog element --> - <pre id="scriptlog">ScriptLog:</pre> - <script> - function log(scripttag) { - const endelement = document.getElementById("bodyend"); - if (endelement && endelement.textContent) { - <!-- Log that bodyend element was parsed prior to scripttag --> - document.getElementById("scriptlog").textContent += "_BodyEnd"; - <!-- Clear endelement content to only log bodyend once --> - endelement.textContent = null; - } - <!-- Append scripttag to the scriptlog --> - document.getElementById("scriptlog").textContent += "_" + scripttag; - } - function sendLogToTest() { - <!-- Send the scriptlog contents to the test calling this. --> - window.domAutomationController.send(document.getElementById("scriptlog").textContent); - } - function onLoad() { - log("OnLoad"); - var xhr_finish = new XMLHttpRequest(); - xhr_finish.open("GET", "ScriptOrder" + document.getElementById("scriptlog").textContent + ".jpg", false /* async */); - xhr_finish.send(); - } - const endelement = document.getElementById("bodyend"); - window.addEventListener("load", onLoad); - log("InlineScript"); - </script> - <script src="defer_all_script_deferscript.js" defer></script> - <script src="defer_all_script_syncscript.js"></script> - <pre id="bodyend">End</pre> - </body> -</html>
diff --git a/chrome/test/data/previews/defer_all_script_test_iframe_content.html b/chrome/test/data/previews/defer_all_script_test_iframe_content.html deleted file mode 100644 index b2c0a97d..0000000 --- a/chrome/test/data/previews/defer_all_script_test_iframe_content.html +++ /dev/null
@@ -1,33 +0,0 @@ -<html> - <head> - <title>Test page for DeferAllScript Preview.</title> - </head> - <body> - <!-- Scripts log when they execute in the scriptlog element --> - <pre id="scriptlog">ScriptLogFromIframe:</pre> - <script> - function log(scripttag) { - const endelement = document.getElementById("bodyend"); - if (endelement && endelement.textContent) { - document.getElementById("scriptlog").textContent += "_BodyEnd"; - endelement.textContent = null; - } - document.getElementById("scriptlog").textContent += "_" + scripttag; - } - - function onLoad() { - // Post message to parent frame. - var parent = window.parent; - var log = document.getElementById("scriptlog").textContent; - parent.postMessage(log, '*'); - } - - const endelement = document.getElementById("bodyend"); - window.addEventListener("load", onLoad); - log("InlineScript"); - </script> - <script src="defer_all_script_deferscript.js" defer></script> - <script src="defer_all_script_syncscript.js"></script> - <pre id="bodyend">End</pre> - </body> -</html>
diff --git a/chrome/test/data/previews/defer_all_script_test_with_iframe.html b/chrome/test/data/previews/defer_all_script_test_with_iframe.html deleted file mode 100644 index ba1740b..0000000 --- a/chrome/test/data/previews/defer_all_script_test_with_iframe.html +++ /dev/null
@@ -1,30 +0,0 @@ -<html> - <head> - <title>Test page for DeferAllScript Preview.</title> - </head> - <body> - <!-- Scripts log when they execute in the scriptlog element --> - <pre id="scriptlog">ScriptLog:</pre> - - <script> - document.getElementById("scriptlog").textContent +="_InlineMainFrameScript_"; - </script> - - <script> - - function sendLogToTest() { - window.domAutomationController.send(document.getElementById("scriptlog").textContent); - } - - // Listen to messages from the child frame. - window.addEventListener('message', processMessage); - function processMessage(e) { - document.getElementById("scriptlog").textContent += e.data; - } - - - </script> - - <iframe src="defer_all_script_test_iframe_content.html"> - </body> -</html>
diff --git a/chrome/test/data/previews/defer_all_script_with_no_transform_header.html b/chrome/test/data/previews/defer_all_script_with_no_transform_header.html deleted file mode 100644 index b7b422e..0000000 --- a/chrome/test/data/previews/defer_all_script_with_no_transform_header.html +++ /dev/null
@@ -1,38 +0,0 @@ -<html> - <head> - <title>Test page for DeferAllScript Preview.</title> - </head> - <body> - <!-- Scripts log when they execute in the scriptlog element --> - <pre id="scriptlog">ScriptLog:</pre> - <script> - function log(scripttag) { - const endelement = document.getElementById("bodyend"); - if (endelement && endelement.textContent) { - <!-- Log that bodyend element was parsed prior to scripttag --> - document.getElementById("scriptlog").textContent += "_BodyEnd"; - <!-- Clear endelement content to only log bodyend once --> - endelement.textContent = null; - } - <!-- Append scripttag to the scriptlog --> - document.getElementById("scriptlog").textContent += "_" + scripttag; - } - function sendLogToTest() { - <!-- Send the scriptlog contents to the test calling this. --> - window.domAutomationController.send(document.getElementById("scriptlog").textContent); - } - function onLoad() { - log("OnLoad"); - var xhr_finish = new XMLHttpRequest(); - xhr_finish.open("GET", "ScriptOrder" + document.getElementById("scriptlog").textContent + ".jpg", false /* async */); - xhr_finish.send(); - } - const endelement = document.getElementById("bodyend"); - window.addEventListener("load", onLoad); - log("InlineScript"); - </script> - <script src="defer_all_script_deferscript.js" defer></script> - <script src="defer_all_script_syncscript.js"></script> - <pre id="bodyend">End</pre> - </body> -</html>
diff --git a/chrome/test/data/previews/defer_all_script_with_no_transform_header.html.mock-http-headers b/chrome/test/data/previews/defer_all_script_with_no_transform_header.html.mock-http-headers deleted file mode 100644 index fd4507e5f..0000000 --- a/chrome/test/data/previews/defer_all_script_with_no_transform_header.html.mock-http-headers +++ /dev/null
@@ -1,2 +0,0 @@ -HTTP/1.1 200 OK -Cache-Control: no-transform
diff --git a/chrome/test/data/previews/login.html b/chrome/test/data/previews/login.html deleted file mode 100644 index b7b422e..0000000 --- a/chrome/test/data/previews/login.html +++ /dev/null
@@ -1,38 +0,0 @@ -<html> - <head> - <title>Test page for DeferAllScript Preview.</title> - </head> - <body> - <!-- Scripts log when they execute in the scriptlog element --> - <pre id="scriptlog">ScriptLog:</pre> - <script> - function log(scripttag) { - const endelement = document.getElementById("bodyend"); - if (endelement && endelement.textContent) { - <!-- Log that bodyend element was parsed prior to scripttag --> - document.getElementById("scriptlog").textContent += "_BodyEnd"; - <!-- Clear endelement content to only log bodyend once --> - endelement.textContent = null; - } - <!-- Append scripttag to the scriptlog --> - document.getElementById("scriptlog").textContent += "_" + scripttag; - } - function sendLogToTest() { - <!-- Send the scriptlog contents to the test calling this. --> - window.domAutomationController.send(document.getElementById("scriptlog").textContent); - } - function onLoad() { - log("OnLoad"); - var xhr_finish = new XMLHttpRequest(); - xhr_finish.open("GET", "ScriptOrder" + document.getElementById("scriptlog").textContent + ".jpg", false /* async */); - xhr_finish.send(); - } - const endelement = document.getElementById("bodyend"); - window.addEventListener("load", onLoad); - log("InlineScript"); - </script> - <script src="defer_all_script_deferscript.js" defer></script> - <script src="defer_all_script_syncscript.js"></script> - <pre id="bodyend">End</pre> - </body> -</html>
diff --git a/chrome/test/data/previews/noscript_test.html b/chrome/test/data/previews/noscript_test.html deleted file mode 100644 index e7dc052..0000000 --- a/chrome/test/data/previews/noscript_test.html +++ /dev/null
@@ -1,14 +0,0 @@ -<html> - <head> - <meta name="viewport" content="width=device-width" /> - <noscript> - <title>Page with Script Disabled</title> - <link rel="stylesheet" href="noscript_test.css"> - </noscript> - <script>document.title='Page with Script Enabled and Executed';</script> - </head> - <body> - <p>Test page for NoScript Previews.</p> - <script src="noscript_test.js"></script> - </body> -</html>
diff --git a/chrome/test/data/previews/noscript_test_with_no_transform_header.html b/chrome/test/data/previews/noscript_test_with_no_transform_header.html deleted file mode 100644 index e7dc052..0000000 --- a/chrome/test/data/previews/noscript_test_with_no_transform_header.html +++ /dev/null
@@ -1,14 +0,0 @@ -<html> - <head> - <meta name="viewport" content="width=device-width" /> - <noscript> - <title>Page with Script Disabled</title> - <link rel="stylesheet" href="noscript_test.css"> - </noscript> - <script>document.title='Page with Script Enabled and Executed';</script> - </head> - <body> - <p>Test page for NoScript Previews.</p> - <script src="noscript_test.js"></script> - </body> -</html>
diff --git a/chrome/test/data/previews/noscript_test_with_no_transform_header.html.mock-http-headers b/chrome/test/data/previews/noscript_test_with_no_transform_header.html.mock-http-headers deleted file mode 100644 index fd4507e5f..0000000 --- a/chrome/test/data/previews/noscript_test_with_no_transform_header.html.mock-http-headers +++ /dev/null
@@ -1,2 +0,0 @@ -HTTP/1.1 200 OK -Cache-Control: no-transform
diff --git a/chrome/test/data/webui/chromeos/fake_network_config_mojom.js b/chrome/test/data/webui/chromeos/fake_network_config_mojom.js index d211b3eb..7686dd8b 100644 --- a/chrome/test/data/webui/chromeos/fake_network_config_mojom.js +++ b/chrome/test/data/webui/chromeos/fake_network_config_mojom.js
@@ -100,13 +100,22 @@ this.vpnProviders_ = []; - ['getNetworkState', 'getNetworkStateList', 'getDeviceStateList', - 'getManagedProperties', 'setNetworkTypeEnabledState', 'requestNetworkScan', - 'getGlobalPolicy', 'getVpnProviders', 'getNetworkCertificates', - 'setProperties', 'setCellularSimState'] - .forEach((methodName) => { - this.resolverMap_.set(methodName, new PromiseResolver()); - }); + ['getNetworkState', + 'getNetworkStateList', + 'getDeviceStateList', + 'getManagedProperties', + 'setNetworkTypeEnabledState', + 'requestNetworkScan', + 'getGlobalPolicy', + 'getVpnProviders', + 'getNetworkCertificates', + 'setProperties', + 'setCellularSimState', + 'startConnect', + 'configureNetwork', + ].forEach((methodName) => { + this.resolverMap_.set(methodName, new PromiseResolver()); + }); } /** @@ -185,6 +194,43 @@ } /** + * @param {string} guid + * @return {!Promise<{result: + * !chromeos.networkConfig.mojom.StartConnectResult}>} + */ + startConnect(guid) { + return new Promise(resolve => { + this.methodCalled('startConnect'); + resolve( + {result: chromeos.networkConfig.mojom.StartConnectResult.kCanceled}); + }); + } + + /** + * @param {chromeos.networkConfig.mojom.ConfigProperties} properties + * @param {boolean} shared + * @return {!Promise<{guid: string, errorMessage: string}>} + */ + configureNetwork(properties, shared) { + return new Promise(resolve => { + this.methodCalled('configureNetwork'); + resolve({guid: 'test_guid', errorMessage: ''}); + }); + } + + /** + * @param {string} guid + * @param {chromeos.networkConfig.mojom.ConfigProperties} properties + * @return {!Promise<{success: boolean, errorMessage: string}>} + */ + setProperties(guid, properties) { + return new Promise(resolve => { + this.methodCalled('setProperties'); + resolve({success: true, errorMessage: ''}); + }); + } + + /** * @param {chromeos.networkConfig.mojom.DeviceStateProperties} deviceState * @private */
diff --git a/chrome/test/data/webui/cr_components/chromeos/cellular_setup/button_bar_test.js b/chrome/test/data/webui/cr_components/chromeos/cellular_setup/button_bar_test.js index 4265c62c..d95fbb2 100644 --- a/chrome/test/data/webui/cr_components/chromeos/cellular_setup/button_bar_test.js +++ b/chrome/test/data/webui/cr_components/chromeos/cellular_setup/button_bar_test.js
@@ -32,7 +32,6 @@ backward: state, cancel: state, forward: state, - tryAgain: state, }; Polymer.dom.flush(); } @@ -65,7 +64,6 @@ setStateForAllButtons(cellularSetup.ButtonState.ENABLED); assertTrue(isButtonShownAndEnabled(buttonBar.$$('#backward'))); assertTrue(isButtonShownAndEnabled(buttonBar.$$('#cancel'))); - assertTrue(isButtonShownAndEnabled(buttonBar.$$('#tryAgain'))); assertTrue(isButtonShownAndEnabled(buttonBar.$$('#forward'))); }); @@ -73,7 +71,6 @@ setStateForAllButtons(cellularSetup.ButtonState.DISABLED); assertTrue(isButtonShownAndDisabled(buttonBar.$$('#backward'))); assertTrue(isButtonShownAndDisabled(buttonBar.$$('#cancel'))); - assertTrue(isButtonShownAndDisabled(buttonBar.$$('#tryAgain'))); assertTrue(isButtonShownAndDisabled(buttonBar.$$('#forward'))); }); @@ -81,7 +78,6 @@ setStateForAllButtons(undefined); assertTrue(isButtonHidden(buttonBar.$$('#backward'))); assertTrue(isButtonHidden(buttonBar.$$('#cancel'))); - assertTrue(isButtonHidden(buttonBar.$$('#tryAgain'))); assertTrue(isButtonHidden(buttonBar.$$('#forward'))); }); @@ -112,7 +108,6 @@ backward: cellularSetup.ButtonState.ENABLED, cancel: cellularSetup.ButtonState.DISABLED, forward: cellularSetup.ButtonState.DISABLED, - tryAgain: cellularSetup.ButtonState.DISABLED, }; buttonBar.focusDefaultButton();
diff --git a/chrome/test/data/webui/cr_components/chromeos/network/BUILD.gn b/chrome/test/data/webui/cr_components/chromeos/network/BUILD.gn index 0bc7e155..d1176c3b 100644 --- a/chrome/test/data/webui/cr_components/chromeos/network/BUILD.gn +++ b/chrome/test/data/webui/cr_components/chromeos/network/BUILD.gn
@@ -28,6 +28,8 @@ "network_siminfo_test.js", "sim_lock_dialogs_test.js", ] - namespace_rewrites = - [ "network_config.MojoInterfaceProviderImpl|MojoInterfaceProviderImpl" ] + namespace_rewrites = [ + "network_config.MojoInterfaceProviderImpl|MojoInterfaceProviderImpl", + "test_util.eventToPromise|eventToPromise", + ] }
diff --git a/chrome/test/data/webui/cr_components/chromeos/network/network_config_test.js b/chrome/test/data/webui/cr_components/chromeos/network/network_config_test.js index f00f5c7..9f7726e 100644 --- a/chrome/test/data/webui/cr_components/chromeos/network/network_config_test.js +++ b/chrome/test/data/webui/cr_components/chromeos/network/network_config_test.js
@@ -6,10 +6,12 @@ // #import 'chrome://os-settings/strings.m.js'; // #import 'chrome://resources/cr_components/chromeos/network/network_config.m.js'; +// #import {keyEventOn} from 'chrome://resources/polymer/v3_0/iron-test-helpers/mock-interactions.js'; // #import {FakeNetworkConfig} from 'chrome://test/chromeos/fake_network_config_mojom.m.js'; // #import {MojoInterfaceProviderImpl} from 'chrome://resources/cr_components/chromeos/network/mojo_interface_provider.m.js'; // #import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.m.js'; // #import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +// #import {eventToPromise} from '../../../test_util.m.js'; // clang-format on suite('network-config', function() { @@ -58,6 +60,17 @@ }); } + /** + * Simulate an element of id |elementId| fires enter event. + * @param {string} elementId + */ + function simulateEnterPressedInElement(elementId) { + let element = networkConfig.$$(`#${elementId}`); + networkConfig.connectOnEnter = true; + assertTrue(!!element); + element.fire('enter', {path: [element]}); + } + suite('New WiFi Config', function() { setup(function() { mojoApi_.resetForTest(); @@ -95,6 +108,8 @@ wifi1.source = chromeos.networkConfig.mojom.OncSource.kDevice; wifi1.typeProperties.wifi.security = chromeos.networkConfig.mojom.SecurityType.kWepPsk; + wifi1.typeProperties.wifi.ssid.activeValue = '11111111111'; + wifi1.typeProperties.wifi.passphrase = {activeValue: 'test_passphrase'}; setNetworkConfig(wifi1); initNetworkConfig(); }); @@ -114,6 +129,14 @@ assertTrue(networkConfig.$$('#security').disabled); }); }); + + test('WiFi input fires enter event on keydown', function() { + return flushAsync().then(() => { + assertFalse(networkConfig.propertiesSent_); + simulateEnterPressedInElement('ssid'); + assertTrue(networkConfig.propertiesSent_); + }); + }); }); suite('Share', function() { @@ -262,6 +285,23 @@ assertEquals('PEAP', outer.value); }); }); + + test('Ethernet input fires enter event on keydown', function() { + const eth = OncMojo.getDefaultManagedProperties( + chromeos.networkConfig.mojom.NetworkType.kEthernet, 'eapguid', ''); + eth.typeProperties.ethernet.authentication = + OncMojo.createManagedString('8021x'); + eth.typeProperties.ethernet.eap = { + outer: OncMojo.createManagedString('PEAP') + }; + setNetworkConfig(eth); + initNetworkConfig(); + return flushAsync().then(() => { + assertFalse(networkConfig.propertiesSent_); + simulateEnterPressedInElement('oncEAPIdentity'); + assertTrue(networkConfig.propertiesSent_); + }); + }); }); suite('Certificates', function() {
diff --git a/chrome/test/data/webui/cr_elements/BUILD.gn b/chrome/test/data/webui/cr_elements/BUILD.gn index fef49664..0bb4a0cb 100644 --- a/chrome/test/data/webui/cr_elements/BUILD.gn +++ b/chrome/test/data/webui/cr_elements/BUILD.gn
@@ -21,11 +21,9 @@ ":cr_container_shadow_behavior_test", ":cr_dialog_test", ":cr_drawer_tests", - ":cr_expand_button_focus_tests", ":cr_expand_button_tests", ":cr_fingerprint_progress_arc_tests", ":cr_grid_focus_test", - ":cr_icon_button_focus_tests", ":cr_icon_button_tests", ":cr_input_test", ":cr_lazy_render_tests", @@ -121,18 +119,6 @@ externs_list = [ "$externs_path/mocha-2.5.js" ] } -js_library("cr_expand_button_focus_tests") { - deps = [ - "..:chai_assert", - "..:test_util.m", - "//third_party/polymer/v3_0/components-chromium/iron-test-helpers:mock-interactions", - "//ui/webui/resources/cr_elements/cr_expand_button:cr_expand_button.m", - "//ui/webui/resources/cr_elements/cr_icon_button:cr_icon_button.m", - "//ui/webui/resources/js:util.m", - ] - externs_list = [ "$externs_path/mocha-2.5.js" ] -} - js_library("cr_expand_button_tests") { deps = [ "..:chai_assert", @@ -153,15 +139,6 @@ externs_list = [ "$externs_path/mocha-2.5.js" ] } -js_library("cr_icon_button_focus_tests") { - deps = [ - "..:chai_assert", - "..:test_util.m", - "//ui/webui/resources/cr_elements/cr_icon_button:cr_icon_button.m", - ] - externs_list = [ "$externs_path/mocha-2.5.js" ] -} - js_library("cr_icon_button_tests") { deps = [ "..:chai_assert",
diff --git a/chrome/test/data/webui/cr_elements/cr_elements_v3_focus_test.js b/chrome/test/data/webui/cr_elements/cr_elements_v3_focus_test.js index 22a216eef..99acb21 100644 --- a/chrome/test/data/webui/cr_elements/cr_elements_v3_focus_test.js +++ b/chrome/test/data/webui/cr_elements/cr_elements_v3_focus_test.js
@@ -57,30 +57,6 @@ }); // eslint-disable-next-line no-var -var CrElementsExpandButtonV3FocusTest = class extends CrElementsV3FocusTest { - /** @override */ - get browsePreload() { - return 'chrome://test/test_loader.html?module=cr_elements/cr_expand_button_focus_tests.js'; - } -}; - -TEST_F('CrElementsExpandButtonV3FocusTest', 'All', function() { - mocha.run(); -}); - -// eslint-disable-next-line no-var -var CrElementsIconButtonV3FocusTest = class extends CrElementsV3FocusTest { - /** @override */ - get browsePreload() { - return 'chrome://test/test_loader.html?module=cr_elements/cr_icon_button_focus_tests.js'; - } -}; - -TEST_F('CrElementsIconButtonV3FocusTest', 'All', function() { - mocha.run(); -}); - -// eslint-disable-next-line no-var var CrElementsInputV3Test = class extends CrElementsV3FocusTest { /** @override */ get browsePreload() {
diff --git a/chrome/test/data/webui/cr_elements/cr_expand_button_focus_tests.js b/chrome/test/data/webui/cr_elements/cr_expand_button_focus_tests.js deleted file mode 100644 index 1aca13e..0000000 --- a/chrome/test/data/webui/cr_elements/cr_expand_button_focus_tests.js +++ /dev/null
@@ -1,143 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// clang-format off -import 'chrome://resources/cr_elements/cr_expand_button/cr_expand_button.m.js'; - -import {getDeepActiveElement} from 'chrome://resources/js/util.m.js'; -import {pressAndReleaseKeyOn} from 'chrome://resources/polymer/v3_0/iron-test-helpers/mock-interactions.js'; - -import {assertEquals, assertFalse, assertNotEquals, assertTrue} from '../chai_assert.js'; -import {eventToPromise} from '../test_util.m.js'; -// clang-format on - -suite('cr-expand-button-focus-tests', () => { - /** @type {!CrExpandButtonElement} */ - let button; - - /** @type {!CrIconButtonElement} */ - let icon; - - /** @param {boolean} rippleShown */ - function assertRippleState(rippleShown) { - assertEquals(icon, getDeepActiveElement()); - assertEquals(rippleShown, icon.getRipple().holdDown); - } - - function assertRipple() { - assertRippleState(true); - } - - function assertNoRipple() { - assertRippleState(false); - } - - /** - * @param {!Function} toggler - * @return {!Promise<void>} - */ - function waitForExpansion(toggler) { - const wait = eventToPromise('expanded-changed', button); - toggler(); - return wait; - } - - /** @return {!Promise<void>} */ - function click() { - return waitForExpansion(() => { - // This is used in focusWithoutInk to change mode into ink hidden - // when focused. - button.dispatchEvent(new PointerEvent('pointerdown')); - // Used to simulate releasing the mouse button. - icon.fire('up'); - // When the mouse is pressed and released, it will also emit a 'click' - // event which is used in cr-expand-button to toggle expansion. - button.fire('click'); - }); - } - - /** @return {!Promise<void>} */ - function enter() { - return waitForExpansion(() => { - pressAndReleaseKeyOn(icon, 0, '', 'Enter'); - }); - } - - /** @return {!Promise<void>} */ - function space() { - return waitForExpansion(() => { - pressAndReleaseKeyOn(icon, 0, '', ' '); - }); - } - - setup(() => { - document.body.innerHTML = ''; - button = /** @type {!CrExpandButtonElement} */ ( - document.createElement('cr-expand-button')); - document.body.appendChild(button); - icon = /** @type {!CrIconButtonElement} */ (button.$$('#icon')); - }); - - test('focus, ripple', () => { - button.focus(); - assertRipple(); - }); - - test('click, no ripple', async () => { - await click(); - assertNoRipple(); - }); - - test('enter, ripple', async () => { - await enter(); - assertRipple(); - }); - - test('space, ripple', async () => { - await space(); - assertRipple(); - }); - - test('focus then click, no ripple', async () => { - button.focus(); - await click(); - assertNoRipple(); - }); - - test('click then enter, no ripple', async () => { - await click(); - await enter(); - assertNoRipple(); - }); - - test('click then space, no ripple', async () => { - await click(); - await space(); - assertNoRipple(); - }); - - test('enter then click, no ripple', async () => { - await enter(); - await click(); - assertNoRipple(); - }); - - test('space then click, no ripple', async () => { - await space(); - await click(); - assertNoRipple(); - }); - - test('focus then enter, ripple', async () => { - button.focus(); - await enter(); - assertRipple(); - }); - - test('focus then space, ripple', async () => { - button.focus(); - await space(); - assertRipple(); - }); -});
diff --git a/chrome/test/data/webui/cr_elements/cr_icon_button_focus_tests.js b/chrome/test/data/webui/cr_elements/cr_icon_button_focus_tests.js deleted file mode 100644 index b382a2cb..0000000 --- a/chrome/test/data/webui/cr_elements/cr_icon_button_focus_tests.js +++ /dev/null
@@ -1,81 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// clang-format off -import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js'; - -import {assertFalse, assertTrue} from '../chai_assert.js'; -import {flushTasks} from '../test_util.m.js'; -// clang-format on - -suite('cr-icon-button-focus-tests', function() { - /** @type {!CrIconButtonElement} */ - let button; - - setup(async () => { - document.body.innerHTML = ''; - button = /** @type {!CrIconButtonElement} */ ( - document.createElement('cr-icon-button')); - document.body.appendChild(button); - await flushTasks(); - }); - - test('focus shows ripple', () => { - button.focus(); - assertTrue(button.getRipple().holdDown); - button.blur(); - assertFalse(button.getRipple().holdDown); - }); - - test('when disabled, focus does not show ripple', () => { - button.disabled = true; - button.focus(); - assertFalse(button.getRipple().holdDown); - button.blur(); - button.disabled = false; - button.focus(); - assertTrue(button.getRipple().holdDown); - // Settings |disabled| to true does remove an existing ripple. - button.disabled = true; - assertFalse(button.getRipple().holdDown); - }); - - test('when noink, focus does not show ripple', () => { - button.noink = true; - button.focus(); - assertFalse(button.getRipple().holdDown); - button.blur(); - button.noink = false; - button.focus(); - assertTrue(button.getRipple().holdDown); - // Setting |noink| to true does not remove an existing ripple. - button.noink = true; - assertTrue(button.getRipple().holdDown); - }); - - test('no ripple until focus', () => { - assertFalse(button.hasRipple()); - button.focus(); - assertTrue(button.hasRipple()); - }); - - test('when noink, no ripple until mouse down', () => { - button.noink = true; - button.focus(); - assertFalse(button.hasRipple()); - button.dispatchEvent(new PointerEvent('pointerdown')); - assertTrue(button.hasRipple()); - }); - - test('when no-ripple-on-focus, no ripple on focus', () => { - button.noRippleOnFocus = false; - button.focus(); - assertTrue(button.getRipple().holdDown); - - button.blur(); - button.noRippleOnFocus = true; - button.focus(); - assertFalse(button.getRipple().holdDown); - }); -});
diff --git a/chrome/test/data/webui/cr_elements/cr_icon_button_tests.js b/chrome/test/data/webui/cr_elements/cr_icon_button_tests.js index 78c9e4b..6b0cb3f 100644 --- a/chrome/test/data/webui/cr_elements/cr_icon_button_tests.js +++ b/chrome/test/data/webui/cr_elements/cr_icon_button_tests.js
@@ -146,16 +146,6 @@ assertEquals('1', button.getAttribute('tabindex')); }); - test('ripple is a circle with background icon or single iron-icon', () => { - const ripple = button.getRipple(); - assertEquals(undefined, button.ironIcon); - assertTrue(ripple.classList.contains('circle')); - button.ironIcon = 'icon'; - assertTrue(ripple.classList.contains('circle')); - button.ironIcon = 'icon,icon'; - assertFalse(ripple.classList.contains('circle')); - }); - test('multiple iron icons', () => { button.ironIcon = 'icon1,icon2'; const elements = button.shadowRoot.querySelectorAll('iron-icon');
diff --git a/chrome/test/data/webui/settings/chromeos/esim_remove_profile_dialog_test.js b/chrome/test/data/webui/settings/chromeos/esim_remove_profile_dialog_test.js index eaff41241..7ba6921 100644 --- a/chrome/test/data/webui/settings/chromeos/esim_remove_profile_dialog_test.js +++ b/chrome/test/data/webui/settings/chromeos/esim_remove_profile_dialog_test.js
@@ -9,16 +9,18 @@ // #import {MojoInterfaceProviderImpl} from 'chrome://resources/cr_components/chromeos/network/mojo_interface_provider.m.js'; // #import {setESimManagerRemoteForTesting} from 'chrome://resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.m.js'; // #import {FakeESimManagerRemote} from 'chrome://test/cr_components/chromeos/cellular_setup/fake_esim_manager_remote.m.js'; +// #import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.m.js'; // #import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; // #import {assertEquals, assertTrue} from '../../chai_assert.js'; // clang-format on suite('EsimRemoveProfileDialog', function() { + const TEST_CELLULAR_GUID = 'cellular_guid'; + let esimRemoveProfileDialog; let eSimManagerRemote; let mojoApi_; - setup(function() { eSimManagerRemote = new cellular_setup.FakeESimManagerRemote(); cellular_setup.setESimManagerRemoteForTesting(eSimManagerRemote); @@ -31,7 +33,8 @@ async function init(iccid) { esimRemoveProfileDialog = document.createElement('esim-remove-profile-dialog'); - esimRemoveProfileDialog.iccid = iccid; + const response = await mojoApi_.getNetworkState(TEST_CELLULAR_GUID); + esimRemoveProfileDialog.networkState = response.result; document.body.appendChild(esimRemoveProfileDialog); assertTrue(!!esimRemoveProfileDialog); await flushAsync(); @@ -54,9 +57,20 @@ return null; } + function addEsimCellularNetwork(guid, iccid) { + const cellular = OncMojo.getDefaultManagedProperties( + chromeos.networkConfig.mojom.NetworkType.kCellular, guid, + 'profile' + iccid); + cellular.typeProperties.cellular.iccid = iccid; + cellular.typeProperties.cellular.eid = iccid + 'eid'; + mojoApi_.setManagedPropertiesForTest(cellular); + } + test('Remove esim profile', async function() { - eSimManagerRemote.addEuiccForTest(2); - init('1'); + eSimManagerRemote.addEuiccForTest(1); + addEsimCellularNetwork(TEST_CELLULAR_GUID, '1'); + await flushAsync(); + init(); await flushAsync(); @@ -78,8 +92,10 @@ }); test('Remove esim profile fails', async function() { - eSimManagerRemote.addEuiccForTest(2); - init('1'); + eSimManagerRemote.addEuiccForTest(1); + addEsimCellularNetwork(TEST_CELLULAR_GUID, '1'); + await flushAsync(); + init(); await flushAsync();
diff --git a/chrome/test/data/webui/settings/chromeos/esim_rename_dialog_test.js b/chrome/test/data/webui/settings/chromeos/esim_rename_dialog_test.js index 048171f6..351ea5a 100644 --- a/chrome/test/data/webui/settings/chromeos/esim_rename_dialog_test.js +++ b/chrome/test/data/webui/settings/chromeos/esim_rename_dialog_test.js
@@ -9,11 +9,14 @@ // #import {MojoInterfaceProviderImpl} from 'chrome://resources/cr_components/chromeos/network/mojo_interface_provider.m.js'; // #import {setESimManagerRemoteForTesting} from 'chrome://resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.m.js'; // #import {FakeESimManagerRemote} from 'chrome://test/cr_components/chromeos/cellular_setup/fake_esim_manager_remote.m.js'; +// #import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.m.js'; // #import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; // #import {assertEquals, assertTrue} from '../../chai_assert.js'; // clang-format on suite('EsimRenameDialog', function() { + const TEST_CELLULAR_GUID = 'cellular_guid'; + let esimRenameDialog; let eSimManagerRemote; let mojoApi_; @@ -28,9 +31,10 @@ return flushAsync(); }); - async function init(iccid) { + async function init() { esimRenameDialog = document.createElement('esim-rename-dialog'); - esimRenameDialog.iccid = iccid; + const response = await mojoApi_.getNetworkState(TEST_CELLULAR_GUID); + esimRenameDialog.networkState = response.result; document.body.appendChild(esimRenameDialog); assertTrue(!!esimRenameDialog); Polymer.dom.flush(); @@ -51,10 +55,20 @@ return new Promise(resolve => setTimeout(resolve)); } + function addEsimCellularNetwork(guid, iccid) { + const cellular = OncMojo.getDefaultManagedProperties( + chromeos.networkConfig.mojom.NetworkType.kCellular, guid, + 'profile' + iccid); + cellular.typeProperties.cellular.iccid = iccid; + cellular.typeProperties.cellular.eid = iccid + 'eid'; + mojoApi_.setManagedPropertiesForTest(cellular); + } + test('Rename esim profile', async function() { eSimManagerRemote.addEuiccForTest(1); + addEsimCellularNetwork(TEST_CELLULAR_GUID, '1'); await flushAsync(); - init('1'); + init(); return flushAsync().then(async () => { const inputBox = esimRenameDialog.$$('#eSimprofileName'); @@ -83,8 +97,9 @@ test('Rename esim profile fails', async function() { eSimManagerRemote.addEuiccForTest(1); + addEsimCellularNetwork(TEST_CELLULAR_GUID, '1'); await flushAsync(); - init('1'); + init(); return flushAsync().then(async () => { const inputBox = esimRenameDialog.$$('#eSimprofileName');
diff --git a/chrome/test/data/webui/tab_search/infinite_list_test.js b/chrome/test/data/webui/tab_search/infinite_list_test.js index ca1ea84b..13e07b73 100644 --- a/chrome/test/data/webui/tab_search/infinite_list_test.js +++ b/chrome/test/data/webui/tab_search/infinite_list_test.js
@@ -11,23 +11,24 @@ import {generateSampleTabsFromSiteNames, sampleSiteNames} from './tab_search_test_data.js'; import {assertTabItemAndNeighborsInViewBounds, disableScrollIntoViewAnimations} from './tab_search_test_helper.js'; -const CHUNK_ITEM_COUNT = 7; +const SAMPLE_AVAIL_HEIGHT = 336; +const SAMPLE_HEIGHT_VIEWPORT_ITEM_COUNT = 6; class TestApp extends PolymerElement { static get properties() { return { /** @private {number} */ - chunkItemCount_: { + maxHeight_: { type: Number, - value: CHUNK_ITEM_COUNT - } + value: SAMPLE_AVAIL_HEIGHT, + }, }; } static get template() { return html` - <infinite-list id="list" chunk-item-count="[[chunkItemCount_]]"> - <template is="dom-repeat"> + <infinite-list id="list" max-height="[[maxHeight_]]"> + <template> <tab-search-item id="[[item.tab.tabId]]" style="display: flex;height: 56px" data="[[item]]" tabindex="0" role="option"> @@ -49,13 +50,6 @@ * @param {!Array<!tabSearch.mojom.Tab>} sampleData */ async function setupTest(sampleData) { - document.head.insertAdjacentHTML('beforeend', ` - <style> - html { - --list-max-height: 280px; - } - </style>`); - const testApp = document.createElement('test-app'); document.body.innerHTML = ''; document.body.appendChild(testApp); @@ -85,7 +79,7 @@ } test('ScrollHeight', async () => { - const tabItems = sampleTabItems(sampleSiteNames()); + const tabItems = sampleTabItems(sampleSiteNames(5)); await setupTest(tabItems); await waitAfterNextRender(infiniteList); @@ -101,44 +95,39 @@ }); test('ListUpdates', async () => { - let siteNames = Array.from({length: 1}, (_, i) => 'site' + (i + 1)); - const tabItems = sampleTabItems(siteNames); - await setupTest(tabItems); + await setupTest(sampleTabItems(sampleSiteNames(1))); assertEquals(1, queryRows().length); // Ensure that on updating the list with an array smaller in size - // than the chunkItemCount property, all the array items are rendered. - siteNames = Array.from({length: 3}, (_, i) => 'site' + (i + 1)); - infiniteList.items = sampleTabItems(siteNames); + // than the viewport item count, all the array items are rendered. + infiniteList.items = sampleTabItems(sampleSiteNames(3)); await waitAfterNextRender(infiniteList); assertEquals(3, queryRows().length); // Ensure that on updating the list with an array greater in size than - // the chunkItemCount property, only a chunk of array items are rendered. - siteNames = - Array.from({length: 2 * CHUNK_ITEM_COUNT}, (_, i) => 'site' + (i + 1)); - infiniteList.items = sampleTabItems(siteNames); + // the viewport item count, only a chunk of array items are rendered. + const tabItems = + sampleTabItems(sampleSiteNames(2 * SAMPLE_HEIGHT_VIEWPORT_ITEM_COUNT)); + infiniteList.items = tabItems; await waitAfterNextRender(infiniteList); - assertEquals(CHUNK_ITEM_COUNT, queryRows().length); + assertGT(tabItems.length, queryRows().length); }); test('SelectedIndex', async () => { - const siteNames = Array.from({length: 50}, (_, i) => 'site' + (i + 1)); - const tabItems = sampleTabItems(siteNames); + const itemCount = 25; + const tabItems = sampleTabItems(sampleSiteNames(itemCount)); await setupTest(tabItems); assertEquals(0, infiniteList.scrollTop); - assertEquals(CHUNK_ITEM_COUNT, queryRows().length); // Assert that upon changing the selected index to a non previously rendered // item, this one is rendered on the view. - infiniteList.selected = CHUNK_ITEM_COUNT; - assertEquals(CHUNK_ITEM_COUNT, queryRows().length); + infiniteList.selected = itemCount - 1; await waitAfterNextRender(infiniteList); let domTabItems = queryRows(); const selectedTabItem = domTabItems[infiniteList.selected]; assertNotEquals(null, selectedTabItem); - assertEquals(2 * CHUNK_ITEM_COUNT, domTabItems.length); + assertEquals(25, domTabItems.length); // Assert that the view scrolled to show the selected item. const afterSelectionScrollTop = infiniteList.scrollTop; @@ -146,7 +135,7 @@ // Assert that on replacing the list items, the currently selected index // value is still rendered on the view. - infiniteList.items = sampleTabItems(siteNames); + infiniteList.items = sampleTabItems(sampleSiteNames(itemCount)); await waitAfterNextRender(infiniteList); domTabItems = queryRows(); const theSelectedTabItem = domTabItems[infiniteList.selected]; @@ -156,8 +145,25 @@ assertEquals(afterSelectionScrollTop, infiniteList.scrollTop); }); + test('SelectedIndexValidAfterItemRemoval', async () => { + const numTabItems = 5; + const tabItems = sampleTabItems(sampleSiteNames(numTabItems)); + await setupTest(tabItems); + infiniteList.selected = numTabItems - 1; + + // Assert that on having the last item selected and removing this last item + // the selected index moves up to the last item available and that in + // the case there are no more items, the selected index is -1. + for (let i = numTabItems - 1; i >= 0; i--) { + infiniteList.items = tabItems.slice(0, i); + await waitAfterNextRender(infiniteList); + assertEquals(i, queryRows().length); + assertEquals(i - 1, infiniteList.selected); + } + }); + test('NavigateDownShowsPreviousAndFollowingListItems', async () => { - const tabItems = sampleTabItems(sampleSiteNames()); + const tabItems = sampleTabItems(sampleSiteNames(10)); await setupTest(tabItems); const tabsDiv = /** @type {!HTMLElement} */ (infiniteList); @@ -177,7 +183,7 @@ }); test('NavigateUpShowsPreviousAndFollowingListItems', async () => { - const tabItems = sampleTabItems(sampleSiteNames()); + const tabItems = sampleTabItems(sampleSiteNames(10)); await setupTest(tabItems); const tabsDiv = /** @type {!HTMLElement} */ (infiniteList);
diff --git a/chrome/test/data/webui/tab_search/tab_search_app_focus_test.js b/chrome/test/data/webui/tab_search/tab_search_app_focus_test.js index 7d6321d6..d39476b 100644 --- a/chrome/test/data/webui/tab_search/tab_search_app_focus_test.js +++ b/chrome/test/data/webui/tab_search/tab_search_app_focus_test.js
@@ -7,7 +7,7 @@ import {ProfileData, TabSearchApiProxyImpl, TabSearchAppElement, TabSearchItem, TabSearchSearchField} from 'chrome://tab-search.top-chrome/tab_search.js'; import {assertEquals, assertGT, assertNotEquals} from '../../chai_assert.js'; -import {flushTasks} from '../../test_util.m.js'; +import {flushTasks, waitAfterNextRender} from '../../test_util.m.js'; import {generateSampleDataFromSiteNames, sampleData, sampleSiteNames} from './tab_search_test_data.js'; import {assertTabItemAndNeighborsInViewBounds, disableScrollIntoViewAnimations, initLoadTimeDataWithDefaults} from './tab_search_test_helper.js'; @@ -40,6 +40,15 @@ await flushTasks(); } + /** + * @return {!NodeList<!HTMLElement>} + */ + function queryRows() { + return /** @type {!NodeList<!HTMLElement>} */ ( + tabSearchApp.shadowRoot.querySelector('#tabsList') + .querySelectorAll('tab-search-item')); + } + test('KeyNavigation', async () => { await setupTest(sampleData(), {'submitFeedbackEnabled': true}); @@ -50,10 +59,7 @@ (searchField.shadowRoot.querySelector('#searchInput')); assertEquals(searchInput, getDeepActiveElement()); - const tabSearchItems = /** @type {!NodeList<!HTMLElement>} */ - (tabSearchApp.shadowRoot.querySelector('#tabsList') - .querySelectorAll('tab-search-item')); - + const tabSearchItems = queryRows(); tabSearchItems[0].focus(); // Once an item is focused, arrow keys should change focus too. keyDownOn(tabSearchItems[0], 0, [], 'ArrowDown'); @@ -99,8 +105,33 @@ assertEquals(1, testProxy.getCallCount('closeTab')); }); + test('ListItemFocusRetainedOnItemChanges', async () => { + const numTabItems = 5; + await setupTest( + generateSampleDataFromSiteNames(sampleSiteNames(numTabItems))); + + await waitAfterNextRender(tabSearchApp); + assertEquals(numTabItems, queryRows().length); + + const tabSearchItem = /** @type {!HTMLElement} */ + (tabSearchApp.shadowRoot.querySelector('#tabsList') + .querySelector('tab-search-item')); + tabSearchItem.focus(); + + const closeButton = /** @type {!HTMLElement} */ ( + tabSearchItem.shadowRoot.querySelector('#closeButton')); + closeButton.focus(); + + for (let i = 0; i < numTabItems - 1; i++) { + testProxy.getCallbackRouterRemote().tabsRemoved([i + 1]); + await waitAfterNextRender(tabSearchApp); + assertEquals(numTabItems - 1 - i, queryRows().length); + assertEquals('tab-search-item', getDeepActiveElement().localName); + } + }); + test('ViewScrolling', async () => { - await setupTest(generateSampleDataFromSiteNames(sampleSiteNames())); + await setupTest(generateSampleDataFromSiteNames(sampleSiteNames(10))); const tabsDiv = /** @type {!HTMLElement} */ (tabSearchApp.shadowRoot.querySelector('#tabsList'));
diff --git a/chrome/test/data/webui/tab_search/tab_search_app_test.js b/chrome/test/data/webui/tab_search/tab_search_app_test.js index 0bb71eb6..e2a692b 100644 --- a/chrome/test/data/webui/tab_search/tab_search_app_test.js +++ b/chrome/test/data/webui/tab_search/tab_search_app_test.js
@@ -8,7 +8,7 @@ import {assertEquals, assertFalse, assertNotEquals, assertTrue} from '../../chai_assert.js'; import {flushTasks, waitAfterNextRender} from '../../test_util.m.js'; -import {generateSampleDataFromSiteNames, sampleData} from './tab_search_test_data.js'; +import {generateSampleDataFromSiteNames, SAMPLE_WINDOW_HEIGHT, sampleData} from './tab_search_test_data.js'; import {initLoadTimeDataWithDefaults} from './tab_search_test_helper.js'; import {TestTabSearchApiProxy} from './test_tab_search_api_proxy.js'; @@ -438,11 +438,17 @@ ]; // Move active tab to the bottom of the list. - await setupTest({windows: [{active: true, tabs}], recentlyClosedTabs: []}); + await setupTest({ + windows: [{active: true, height: SAMPLE_WINDOW_HEIGHT, tabs}], + recentlyClosedTabs: [] + }); verifyTabIds(queryRows(), [3, 1, 2]); await setupTest( - {windows: [{active: true, tabs}], recentlyClosedTabs: []}, + { + windows: [{active: true, height: SAMPLE_WINDOW_HEIGHT, tabs}], + recentlyClosedTabs: [] + }, {'moveActiveTabToBottom': false}); verifyTabIds(queryRows(), [2, 3, 1]); });
diff --git a/chrome/test/data/webui/tab_search/tab_search_test_data.js b/chrome/test/data/webui/tab_search/tab_search_test_data.js index d39a7e0..cc878fa 100644 --- a/chrome/test/data/webui/tab_search/tab_search_test_data.js +++ b/chrome/test/data/webui/tab_search/tab_search_test_data.js
@@ -2,11 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +export const SAMPLE_WINDOW_HEIGHT = 448; + export function sampleData() { - const profileTabs = { + return { windows: [ { active: true, + height: SAMPLE_WINDOW_HEIGHT, tabs: [ { index: 0, @@ -33,6 +36,7 @@ }, { active: false, + height: SAMPLE_WINDOW_HEIGHT, tabs: [ { index: 0, @@ -59,26 +63,14 @@ } ] }; - - return profileTabs; } /** + * @param count * @return {!Array<string>} */ -export function sampleSiteNames() { - return [ - 'Google', - 'Amazon', - 'Apple', - 'Bing', - 'Yahoo', - 'PayPal', - 'Square', - 'Youtube', - 'Facebook', - 'Twitter', - ]; +export function sampleSiteNames(count) { + return Array.from({length: count}, (_, i) => (i + 1).toString()); } /** @@ -93,6 +85,7 @@ tabId: i + 1, title: siteName, url: 'https://www.' + siteName.toLowerCase() + '.com', + lastActiveTimeTicks: siteNames.length - i, }; }); } @@ -104,6 +97,10 @@ */ export function generateSampleDataFromSiteNames(siteNames) { return { - windows: [{active: true, tabs: generateSampleTabsFromSiteNames(siteNames)}] + windows: [{ + active: true, + height: SAMPLE_WINDOW_HEIGHT, + tabs: generateSampleTabsFromSiteNames(siteNames) + }] }; }
diff --git a/chromecast/browser/extensions/api/tabs/tabs_api.cc b/chromecast/browser/extensions/api/tabs/tabs_api.cc index ecac86c..e98a6f0 100644 --- a/chromecast/browser/extensions/api/tabs/tabs_api.cc +++ b/chromecast/browser/extensions/api/tabs/tabs_api.cc
@@ -38,9 +38,9 @@ #include "extensions/common/constants.h" #include "extensions/common/error_utils.h" #include "extensions/common/extension.h" -#include "extensions/common/host_id.h" #include "extensions/common/manifest_constants.h" #include "extensions/common/message_bundle.h" +#include "extensions/common/mojom/host_id.mojom.h" #include "extensions/common/permissions/permissions_data.h" #include "third_party/blink/public/common/page/page_zoom.h" #include "ui/base/models/list_selection_model.h" @@ -765,7 +765,8 @@ execute_tab_id_ = tab_id; details_ = std::move(details); - set_host_id(HostID(HostID::EXTENSIONS, extension()->id())); + set_host_id( + mojom::HostID(mojom::HostID::HostType::kExtensions, extension()->id())); return set_init_result(SUCCESS); }
diff --git a/chromeos/components/string_matching/term_break_iterator.cc b/chromeos/components/string_matching/term_break_iterator.cc index 9ad1d9bb..230c0a9 100644 --- a/chromeos/components/string_matching/term_break_iterator.cc +++ b/chromeos/components/string_matching/term_break_iterator.cc
@@ -56,7 +56,7 @@ return word_.substr(prev_, pos_ - prev_); } -TermBreakIterator::State TermBreakIterator::GetNewState(base::char16 ch) { +TermBreakIterator::State TermBreakIterator::GetNewState(char16_t ch) { if (base::IsAsciiDigit(ch) || ch == '.' || ch == ',') return STATE_NUMBER;
diff --git a/chromeos/components/string_matching/term_break_iterator.h b/chromeos/components/string_matching/term_break_iterator.h index a2c5a127..336002d 100644 --- a/chromeos/components/string_matching/term_break_iterator.h +++ b/chromeos/components/string_matching/term_break_iterator.h
@@ -56,7 +56,7 @@ }; // Returns new state for given |ch|. - State GetNewState(base::char16 ch); + State GetNewState(char16_t ch); const base::string16& word_; size_t prev_;
diff --git a/chromeos/components/string_matching/tokenized_string_fuzzer.cc b/chromeos/components/string_matching/tokenized_string_fuzzer.cc index 3687c3c4..9846e06 100644 --- a/chromeos/components/string_matching/tokenized_string_fuzzer.cc +++ b/chromeos/components/string_matching/tokenized_string_fuzzer.cc
@@ -10,7 +10,7 @@ return 0; // Test for base::string16 if size is even. - base::string16 string_input16(reinterpret_cast<const base::char16*>(data), + base::string16 string_input16(reinterpret_cast<const char16_t*>(data), size / 2); chromeos::string_matching::TokenizedString tokenized_string_from_string16( string_input16);
diff --git a/chromeos/network/cellular_esim_connection_handler.cc b/chromeos/network/cellular_esim_connection_handler.cc index fda4ba3..b975415 100644 --- a/chromeos/network/cellular_esim_connection_handler.cc +++ b/chromeos/network/cellular_esim_connection_handler.cc
@@ -131,14 +131,6 @@ if (timer_.IsRunning()) timer_.Stop(); - // If there was an error, but we've already inhibited scans, we need to - // uninhibit scans before returning a result to ensure that cellular - // connectivity continues to work. - if (inhibit_lock_) { - UninhibitScans(error_name); - return; - } - TransitionToConnectionState(ConnectionState::kIdle); std::unique_ptr<ConnectionRequestMetadata> metadata = std::move(request_queue_.front()); @@ -153,6 +145,9 @@ } ProcessRequestQueue(); + + // In case of errors, metadata will be destroyed at this point along with + // it's inhibit_lock and the cellular device will uninhibit automatically. } const NetworkState* @@ -217,7 +212,7 @@ return; } - inhibit_lock_ = std::move(inhibit_lock); + request_queue_.front()->inhibit_lock = std::move(inhibit_lock); TransitionToConnectionState( ConnectionState::kRequestingProfilesBeforeEnabling); RequestInstalledProfiles(); @@ -251,7 +246,11 @@ } if (state_ == ConnectionState::kRequestingProfilesAfterEnabling) { - UninhibitScans(/*error_before_uninhibit=*/base::nullopt); + // Reset the inhibit_lock so that the device will be uninhibited + // automatically. + request_queue_.front()->inhibit_lock.reset(); + TransitionToConnectionState(ConnectionState::kWaitingForConnectable); + CheckForConnectable(); return; } @@ -289,23 +288,8 @@ RequestInstalledProfiles(); } -void CellularESimConnectionHandler::UninhibitScans( - const base::Optional<std::string>& error_before_uninhibit) { - DCHECK(inhibit_lock_); - - TransitionToConnectionState(ConnectionState::kUninhibitingScans); - inhibit_lock_.reset(); - - if (error_before_uninhibit) { - CompleteConnectionAttempt(*error_before_uninhibit); - return; - } - - TransitionToConnectionState(ConnectionState::kWaitingForConnectable); - CheckForConnectable(); -} - void CellularESimConnectionHandler::CheckForConnectable() { + DCHECK_EQ(state_, ConnectionState::kWaitingForConnectable); const NetworkState* network_state = GetNetworkStateForCurrentOperation(); if (!network_state) { CompleteConnectionAttempt(NetworkConnectionHandler::kErrorNotFound); @@ -359,9 +343,6 @@ kRequestingProfilesAfterEnabling: stream << "[Requesting profiles after enabling]"; break; - case CellularESimConnectionHandler::ConnectionState::kUninhibitingScans: - stream << "[Uninhibiting scans]"; - break; case CellularESimConnectionHandler::ConnectionState::kWaitingForConnectable: stream << "[Waiting for network to become connectable]"; break;
diff --git a/chromeos/network/cellular_esim_connection_handler.h b/chromeos/network/cellular_esim_connection_handler.h index e19bc874..7c76ab5 100644 --- a/chromeos/network/cellular_esim_connection_handler.h +++ b/chromeos/network/cellular_esim_connection_handler.h
@@ -65,6 +65,7 @@ network_handler::ErrorCallback error_callback); ~ConnectionRequestMetadata(); + std::unique_ptr<CellularInhibitor::InhibitLock> inhibit_lock; std::string service_path; base::OnceClosure success_callback; network_handler::ErrorCallback error_callback; @@ -77,7 +78,6 @@ kRequestingProfilesBeforeEnabling, kEnablingProfile, kRequestingProfilesAfterEnabling, - kUninhibitingScans, kWaitingForConnectable }; friend std::ostream& operator<<(std::ostream& stream, @@ -120,8 +120,6 @@ ConnectionState state_ = ConnectionState::kIdle; base::queue<std::unique_ptr<ConnectionRequestMetadata>> request_queue_; - std::unique_ptr<CellularInhibitor::InhibitLock> inhibit_lock_; - base::WeakPtrFactory<CellularESimConnectionHandler> weak_ptr_factory_{this}; };
diff --git a/chromeos/profiles/OWNERS b/chromeos/profiles/OWNERS index d9a84e7..ce81be53 100644 --- a/chromeos/profiles/OWNERS +++ b/chromeos/profiles/OWNERS
@@ -1,6 +1,6 @@ # Chrome OS Toolchain Team gbiv@chromium.org -tcwang@chromium.org +denik@chromium.org # For skia autoroller to submmit CLs chromium-autoroll@skia-public.iam.gserviceaccount.com
diff --git a/chromeos/services/assistant/BUILD.gn b/chromeos/services/assistant/BUILD.gn index 66c0d32..4945ec690 100644 --- a/chromeos/services/assistant/BUILD.gn +++ b/chromeos/services/assistant/BUILD.gn
@@ -76,8 +76,6 @@ if (enable_cros_libassistant) { sources += [ - "assistant_device_settings_delegate.cc", - "assistant_device_settings_delegate.h", "assistant_manager_service_delegate_impl.cc", "assistant_manager_service_delegate_impl.h", "assistant_manager_service_impl.cc", @@ -162,7 +160,6 @@ if (enable_cros_libassistant) { sources += [ - "assistant_device_settings_delegate_unittest.cc", "assistant_manager_service_impl_unittest.cc", "test_support/fake_service_context.cc", "test_support/fake_service_context.h",
diff --git a/chromeos/services/assistant/assistant_device_settings_delegate.h b/chromeos/services/assistant/assistant_device_settings_delegate.h deleted file mode 100644 index 5625e6b..0000000 --- a/chromeos/services/assistant/assistant_device_settings_delegate.h +++ /dev/null
@@ -1,59 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMEOS_SERVICES_ASSISTANT_ASSISTANT_DEVICE_SETTINGS_DELEGATE_H_ -#define CHROMEOS_SERVICES_ASSISTANT_ASSISTANT_DEVICE_SETTINGS_DELEGATE_H_ - -#include <memory> -#include <string> -#include <vector> - -#include "base/component_export.h" -#include "chromeos/services/libassistant/public/mojom/device_settings_delegate.mojom-forward.h" - -namespace assistant { -namespace api { -namespace client_op { -class ModifySettingArgs; -class GetDeviceSettingsArgs; -} // namespace client_op -} // namespace api -} // namespace assistant - -namespace chromeos { -namespace assistant { - -struct DeviceSetting; -class Setting; - -// Delegate that handles Assistant actions related to retrieving/modifying -// the device settings, like Bluetooth or WiFi. -class COMPONENT_EXPORT(ASSISTANT_SERVICE) AssistantDeviceSettingsDelegate { - public: - explicit AssistantDeviceSettingsDelegate( - chromeos::libassistant::mojom::DeviceSettingsDelegate* mojom_delegate); - AssistantDeviceSettingsDelegate(AssistantDeviceSettingsDelegate&) = delete; - AssistantDeviceSettingsDelegate& operator=(AssistantDeviceSettingsDelegate&) = - delete; - ~AssistantDeviceSettingsDelegate(); - - bool IsSettingSupported(const std::string& setting_id) const; - - void HandleModifyDeviceSetting( - const ::assistant::api::client_op::ModifySettingArgs& args); - - // Return which of the given device settings are supported or not. - std::vector<DeviceSetting> GetDeviceSettings( - const ::assistant::api::client_op::GetDeviceSettingsArgs& args) const; - - private: - void AddSetting(std::unique_ptr<Setting> setting); - - std::vector<std::unique_ptr<Setting>> settings_; -}; - -} // namespace assistant -} // namespace chromeos - -#endif // CHROMEOS_SERVICES_ASSISTANT_ASSISTANT_DEVICE_SETTINGS_DELEGATE_H_
diff --git a/chromeos/services/assistant/assistant_device_settings_delegate_unittest.cc b/chromeos/services/assistant/assistant_device_settings_delegate_unittest.cc deleted file mode 100644 index d8b8fc7..0000000 --- a/chromeos/services/assistant/assistant_device_settings_delegate_unittest.cc +++ /dev/null
@@ -1,316 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromeos/services/assistant/assistant_device_settings_delegate.h" - -#include <memory> -#include <utility> - -#include "ash/public/cpp/assistant/controller/assistant_notification_controller.h" -#include "base/command_line.h" -#include "chromeos/assistant/internal/internal_util.h" -#include "chromeos/assistant/internal/proto/google3/assistant/api/client_op/device_args.pb.h" -#include "chromeos/services/assistant/device_settings_host.h" -#include "chromeos/services/assistant/test_support/fake_service_context.h" -#include "chromeos/services/assistant/test_support/scoped_device_actions.h" -#include "libassistant/shared/public/platform_audio_output.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "ui/accessibility/accessibility_switches.h" - -namespace chromeos { -namespace assistant { - -namespace { - -constexpr double kEpsilon = 0.001; - -using ::assistant::api::client_op::GetDeviceSettingsArgs; -using ::assistant::api::client_op::ModifySettingArgs; -using Change = ::assistant::api::client_op::ModifySettingArgs::Change; -using Unit = ::assistant::api::client_op::ModifySettingArgs::Unit; -using ::testing::AnyNumber; -using ::testing::DoubleNear; -using ::testing::ElementsAre; -using ::testing::FloatNear; -using ::testing::Return; -using ::testing::StrictMock; - -constexpr char kWiFi[] = "WIFI"; -constexpr char kBluetooth[] = "BLUETOOTH"; -constexpr char kScreenBrightness[] = "BRIGHTNESS_LEVEL"; -constexpr char kDoNotDisturb[] = "DO_NOT_DISTURB"; -constexpr char kNightLight[] = "NIGHT_LIGHT_SWITCH"; -constexpr char kSwitchAccess[] = "SWITCH_ACCESS"; - -// Returns the settings that are always supported. -const std::vector<std::string> kAlwaysSupportedSettings = { - kWiFi, kBluetooth, kScreenBrightness, - kDoNotDisturb, kNightLight, kSwitchAccess, -}; - -class ScopedDeviceActionsMock : public ScopedDeviceActions { - public: - // DeviceActions implementation: - MOCK_METHOD(void, SetWifiEnabled, (bool enabled)); - MOCK_METHOD(void, SetBluetoothEnabled, (bool enabled)); - MOCK_METHOD(void, SetScreenBrightnessLevel, (double level, bool gradual)); - MOCK_METHOD(void, SetNightLightEnabled, (bool enabled)); - MOCK_METHOD(void, SetSwitchAccessEnabled, (bool enabled)); - MOCK_METHOD(bool, - OpenAndroidApp, - (const chromeos::assistant::AndroidAppInfo& app_info)); - MOCK_METHOD(chromeos::assistant::AppStatus, - GetAndroidAppStatus, - (const chromeos::assistant::AndroidAppInfo& app_info)); - MOCK_METHOD(void, LaunchAndroidIntent, (const std::string& intent)); - MOCK_METHOD(void, - AddAndFireAppListEventSubscriber, - (chromeos::assistant::AppListEventSubscriber * subscriber)); - MOCK_METHOD(void, - RemoveAppListEventSubscriber, - (chromeos::assistant::AppListEventSubscriber * subscriber)); -}; - -class AssistantNotificationControllerMock - : public ash::AssistantNotificationController { - public: - using AssistantNotification = chromeos::assistant::AssistantNotification; - - // ash::AssistantNotificationController implementation: - MOCK_METHOD(void, - AddOrUpdateNotification, - (AssistantNotification && notification)); - MOCK_METHOD(void, - RemoveNotificationById, - (const std::string& id, bool from_server)); - MOCK_METHOD(void, - RemoveNotificationByGroupingKey, - (const std::string& grouping_id, bool from_server)); - MOCK_METHOD(void, RemoveAllNotifications, (bool from_server)); - MOCK_METHOD(void, SetQuietMode, (bool enabled)); -}; - -class AssistantDeviceSettingsDelegateTest : public testing::Test { - public: - AssistantDeviceSettingsDelegateTest() = default; - - void SetUp() override { - service_context_ = std::make_unique<FakeServiceContext>(); - host_ = std::make_unique<DeviceSettingsHost>(service_context_.get()); - - CreateAssistantDeviceSettingsDelegate(); - } - - DeviceSetting GetDeviceSettings(const std::string& setting_id) { - GetDeviceSettingsArgs args; - args.add_setting_ids(setting_id); - - std::vector<DeviceSetting> result = delegate()->GetDeviceSettings(args); - EXPECT_EQ(result.size(), 1u); - return result[0]; - } - - // Warning: Use |CreateAssistantDeviceSettingsDelegate| to apply any changes - // made to the service context. - FakeServiceContext* service_context() { return service_context_.get(); } - - AssistantDeviceSettingsDelegate* delegate() { return delegate_.get(); } - - void CreateAssistantDeviceSettingsDelegate() { - delegate_ = std::make_unique<AssistantDeviceSettingsDelegate>(host_.get()); - } - - private: - std::unique_ptr<FakeServiceContext> service_context_; - std::unique_ptr<DeviceSettingsHost> host_; - std::unique_ptr<AssistantDeviceSettingsDelegate> delegate_; -}; - -} // namespace - -bool operator==(const DeviceSetting& left, const DeviceSetting& right) { - return (left.is_supported == right.is_supported) && - (left.setting_id == right.setting_id); -} - -std::ostream& operator<<(std::ostream& stream, const DeviceSetting& value) { - stream << "{ " << value.setting_id << ": " << value.is_supported << "}"; - return stream; -} - -TEST_F(AssistantDeviceSettingsDelegateTest, - IsSettingSupportedShouldReturnFalseForUnknownSetting) { - EXPECT_FALSE(delegate()->IsSettingSupported("<unknown-setting>")); -} - -TEST_F(AssistantDeviceSettingsDelegateTest, - IsSettingSupportedShouldReturnTrueForKnownSettings) { - for (const std::string& setting : kAlwaysSupportedSettings) { - EXPECT_TRUE(delegate()->IsSettingSupported(setting)) - << "Error for " << setting; - } -} - -TEST_F(AssistantDeviceSettingsDelegateTest, - GetDeviceSettingsShouldReturnFalseForUnknownSetting) { - EXPECT_EQ(GetDeviceSettings("UNKNOWN_SETTING"), - DeviceSetting("UNKNOWN_SETTING", false)); -} - -TEST_F(AssistantDeviceSettingsDelegateTest, - GetDeviceSettingsShouldReturnTrueForKnownSettings) { - for (const std::string& setting : kAlwaysSupportedSettings) { - EXPECT_EQ(GetDeviceSettings(setting), DeviceSetting(setting, true)) - << "Error for " << setting; - } -} - -TEST_F(AssistantDeviceSettingsDelegateTest, - GetDeviceSettingsShouldMultipleSettingsAtTheSameTime) { - GetDeviceSettingsArgs args; - args.add_setting_ids("UNKNOWN_SETTING"); - args.add_setting_ids(kWiFi); - - std::vector<DeviceSetting> result = delegate()->GetDeviceSettings(args); - - EXPECT_THAT(delegate()->GetDeviceSettings(args), - ElementsAre(DeviceSetting("UNKNOWN_SETTING", false), - DeviceSetting(kWiFi, true))); -} - -TEST_F(AssistantDeviceSettingsDelegateTest, ShouldTurnWifiOnAndOff) { - StrictMock<ScopedDeviceActionsMock> device_actions; - CreateAssistantDeviceSettingsDelegate(); - - ModifySettingArgs args; - args.set_setting_id(kWiFi); - - args.set_change(Change::ModifySettingArgs_Change_ON); - EXPECT_CALL(device_actions, SetWifiEnabled(true)); - delegate()->HandleModifyDeviceSetting(args); - - args.set_change(Change::ModifySettingArgs_Change_OFF); - EXPECT_CALL(device_actions, SetWifiEnabled(false)); - delegate()->HandleModifyDeviceSetting(args); -} - -TEST_F(AssistantDeviceSettingsDelegateTest, ShouldTurnBluetoothOnAndOff) { - StrictMock<ScopedDeviceActionsMock> device_actions; - CreateAssistantDeviceSettingsDelegate(); - - ModifySettingArgs args; - args.set_setting_id(kBluetooth); - - args.set_change(Change::ModifySettingArgs_Change_ON); - EXPECT_CALL(device_actions, SetBluetoothEnabled(true)); - delegate()->HandleModifyDeviceSetting(args); - - args.set_change(Change::ModifySettingArgs_Change_OFF); - EXPECT_CALL(device_actions, SetBluetoothEnabled(false)); - delegate()->HandleModifyDeviceSetting(args); -} - -TEST_F(AssistantDeviceSettingsDelegateTest, ShouldTurnQuietModeOnAndOff) { - StrictMock<AssistantNotificationControllerMock> notification_controller; - service_context()->set_assistant_notification_controller( - ¬ification_controller); - CreateAssistantDeviceSettingsDelegate(); - - ModifySettingArgs args; - args.set_setting_id(kDoNotDisturb); - - args.set_change(Change::ModifySettingArgs_Change_ON); - EXPECT_CALL(notification_controller, SetQuietMode(true)); - delegate()->HandleModifyDeviceSetting(args); - - args.set_change(Change::ModifySettingArgs_Change_OFF); - EXPECT_CALL(notification_controller, SetQuietMode(false)); - delegate()->HandleModifyDeviceSetting(args); -} - -TEST_F(AssistantDeviceSettingsDelegateTest, ShouldTurnSwitchAccessOnAndOff) { - StrictMock<ScopedDeviceActionsMock> device_actions; - CreateAssistantDeviceSettingsDelegate(); - - ModifySettingArgs args; - args.set_setting_id(kSwitchAccess); - - args.set_change(Change::ModifySettingArgs_Change_ON); - EXPECT_CALL(device_actions, SetSwitchAccessEnabled(true)); - delegate()->HandleModifyDeviceSetting(args); - - args.set_change(Change::ModifySettingArgs_Change_OFF); - EXPECT_CALL(device_actions, SetSwitchAccessEnabled(false)); - delegate()->HandleModifyDeviceSetting(args); -} - -TEST_F(AssistantDeviceSettingsDelegateTest, ShouldTurnNightLightOnAndOff) { - StrictMock<ScopedDeviceActionsMock> device_actions; - CreateAssistantDeviceSettingsDelegate(); - - ModifySettingArgs args; - args.set_setting_id(kNightLight); - - args.set_change(Change::ModifySettingArgs_Change_ON); - EXPECT_CALL(device_actions, SetNightLightEnabled(true)); - delegate()->HandleModifyDeviceSetting(args); - - args.set_change(Change::ModifySettingArgs_Change_OFF); - EXPECT_CALL(device_actions, SetNightLightEnabled(false)); - delegate()->HandleModifyDeviceSetting(args); -} - -TEST_F(AssistantDeviceSettingsDelegateTest, ShouldSetBrightness) { - StrictMock<ScopedDeviceActionsMock> device_actions; - CreateAssistantDeviceSettingsDelegate(); - - ModifySettingArgs args; - args.set_setting_id(kScreenBrightness); - args.set_change(Change::ModifySettingArgs_Change_SET); - - // Set brightness to 20% - args.set_numeric_value(0.2); - args.set_unit(Unit::ModifySettingArgs_Unit_RANGE); - EXPECT_CALL(device_actions, - SetScreenBrightnessLevel(DoubleNear(0.2, kEpsilon), - /*gradual=*/true)); - delegate()->HandleModifyDeviceSetting(args); - - // Set brightness to 30. - // This will be converted to a percentage - args.set_numeric_value(30); - args.set_unit(Unit::ModifySettingArgs_Unit_STEP); - EXPECT_CALL(device_actions, SetScreenBrightnessLevel( - DoubleNear(0.3, kEpsilon), /*gradual=*/true)); - delegate()->HandleModifyDeviceSetting(args); -} - -TEST_F(AssistantDeviceSettingsDelegateTest, - ShouldIncreaseAndDecreaseBrightness) { - StrictMock<ScopedDeviceActionsMock> device_actions; - CreateAssistantDeviceSettingsDelegate(); - - ModifySettingArgs args; - args.set_setting_id(kScreenBrightness); - - // Increase brightness - this will use a default increment of 10% - args.set_change(Change::ModifySettingArgs_Change_INCREASE); - args.set_unit(Unit::ModifySettingArgs_Unit_UNKNOWN_UNIT); - device_actions.set_current_brightness(0.2); - EXPECT_CALL(device_actions, SetScreenBrightnessLevel( - DoubleNear(0.3, kEpsilon), /*gradual=*/true)); - delegate()->HandleModifyDeviceSetting(args); - - // Decrease brightness - this will use a default decrement of 10% - args.set_change(Change::ModifySettingArgs_Change_DECREASE); - args.set_unit(Unit::ModifySettingArgs_Unit_UNKNOWN_UNIT); - device_actions.set_current_brightness(0.2); - EXPECT_CALL(device_actions, SetScreenBrightnessLevel( - DoubleNear(0.1, kEpsilon), /*gradual=*/true)); - delegate()->HandleModifyDeviceSetting(args); -} - -} // namespace assistant -} // namespace chromeos
diff --git a/chromeos/services/assistant/assistant_manager_service_impl.cc b/chromeos/services/assistant/assistant_manager_service_impl.cc index f4bdbb1..26e22b2 100644 --- a/chromeos/services/assistant/assistant_manager_service_impl.cc +++ b/chromeos/services/assistant/assistant_manager_service_impl.cc
@@ -31,7 +31,6 @@ #include "chromeos/assistant/internal/internal_constants.h" #include "chromeos/assistant/internal/proto/google3/assistant/api/client_op/device_args.pb.h" #include "chromeos/dbus/util/version_loader.h" -#include "chromeos/services/assistant/assistant_device_settings_delegate.h" #include "chromeos/services/assistant/device_settings_host.h" #include "chromeos/services/assistant/libassistant_service_host_impl.h" #include "chromeos/services/assistant/media_host.h" @@ -191,8 +190,7 @@ base::Optional<std::string> s3_server_uri_override, base::Optional<std::string> device_id_override, std::unique_ptr<LibassistantServiceHost> libassistant_service_host) - : assistant_settings_( - std::make_unique<AssistantSettingsImpl>(context, this)), + : assistant_settings_(std::make_unique<AssistantSettingsImpl>(context)), assistant_proxy_(std::make_unique<AssistantProxy>()), platform_delegate_(std::make_unique<PlatformDelegateImpl>()), context_(context), @@ -233,7 +231,8 @@ assistant_proxy_->ExtractAudioInputController()); assistant_settings_->Initialize( - assistant_proxy_->ExtractSpeakerIdEnrollmentController()); + assistant_proxy_->ExtractSpeakerIdEnrollmentController(), + &assistant_proxy_->settings_controller()); media_host_->Initialize(&assistant_proxy_->media_controller(), assistant_proxy_->ExtractMediaDelegate()); @@ -242,8 +241,6 @@ device_settings_host_->Bind( assistant_proxy_->ExtractDeviceSettingsDelegate()); - settings_delegate_ = std::make_unique<AssistantDeviceSettingsDelegate>( - device_settings_host_.get()); } AssistantManagerServiceImpl::~AssistantManagerServiceImpl() { @@ -497,10 +494,8 @@ RecordQueryResponseTypeUMA(); return; case AssistantInteractionResolution::kInterruption: - if (receive_inline_response_ || receive_modify_settings_proto_response_ || - !receive_url_response_.empty()) { + if (HasReceivedQueryResponse()) RecordQueryResponseTypeUMA(); - } return; case AssistantInteractionResolution::kMicTimeout: case AssistantInteractionResolution::kError: @@ -590,27 +585,6 @@ [](auto) {}); } -void AssistantManagerServiceImpl::OnModifyDeviceSetting( - const api::client_op::ModifySettingArgs& modify_setting_args) { - ENSURE_MAIN_THREAD(&AssistantManagerServiceImpl::OnModifyDeviceSetting, - modify_setting_args); - receive_modify_settings_proto_response_ = true; - - settings_delegate_->HandleModifyDeviceSetting(modify_setting_args); -} - -void AssistantManagerServiceImpl::OnGetDeviceSettings( - int interaction_id, - const api::client_op::GetDeviceSettingsArgs& args) { - std::vector<DeviceSetting> result = - settings_delegate_->GetDeviceSettings(args); - - SendVoicelessInteraction( - CreateGetDeviceSettingInteraction(interaction_id, result), - /*description=*/"get_settings_result", - /*is_user_initiated=*/true); -} - void AssistantManagerServiceImpl::OnNotificationRemoved(const std::string& id) { assistant_notification_controller()->RemoveNotificationByGroupingKey( id, /*from_server=*/true); @@ -790,27 +764,36 @@ } void AssistantManagerServiceImpl::RecordQueryResponseTypeUMA() { - auto response_type = AssistantQueryResponseType::kUnspecified; - - if (receive_modify_settings_proto_response_) { - response_type = AssistantQueryResponseType::kDeviceAction; - } else if (!receive_url_response_.empty()) { - if (receive_url_response_.find("www.google.com/search?") != - std::string::npos) { - response_type = AssistantQueryResponseType::kSearchFallback; - } else { - response_type = AssistantQueryResponseType::kTargetedAction; - } - } else if (receive_inline_response_) { - response_type = AssistantQueryResponseType::kInlineElement; - } + AssistantQueryResponseType response_type = GetQueryResponseType(); UMA_HISTOGRAM_ENUMERATION("Assistant.QueryResponseType", response_type); // Reset the flags. - receive_inline_response_ = false; - receive_modify_settings_proto_response_ = false; receive_url_response_.clear(); + receive_inline_response_ = false; + device_settings_host_->reset_has_setting_changed(); +} + +bool AssistantManagerServiceImpl::HasReceivedQueryResponse() const { + return GetQueryResponseType() != AssistantQueryResponseType::kUnspecified; +} + +AssistantQueryResponseType AssistantManagerServiceImpl::GetQueryResponseType() + const { + if (device_settings_host_->has_setting_changed()) { + return AssistantQueryResponseType::kDeviceAction; + } else if (!receive_url_response_.empty()) { + if (receive_url_response_.find("www.google.com/search?") != + std::string::npos) { + return AssistantQueryResponseType::kSearchFallback; + } else { + return AssistantQueryResponseType::kTargetedAction; + } + } else if (receive_inline_response_) { + return AssistantQueryResponseType::kInlineElement; + } + + return AssistantQueryResponseType::kUnspecified; } void AssistantManagerServiceImpl::SendAssistantFeedback(
diff --git a/chromeos/services/assistant/assistant_manager_service_impl.h b/chromeos/services/assistant/assistant_manager_service_impl.h index ea2d67e..125f6f6 100644 --- a/chromeos/services/assistant/assistant_manager_service_impl.h +++ b/chromeos/services/assistant/assistant_manager_service_impl.h
@@ -57,7 +57,6 @@ namespace chromeos { namespace assistant { -class AssistantDeviceSettingsDelegate; class AssistantManagerServiceDelegate; class AssistantMediaSession; class AssistantProxy; @@ -176,11 +175,6 @@ void OnShowNotification(const action::Notification& notification) override; void OnVerifyAndroidApp(const std::vector<AndroidAppInfo>& apps_info, const InteractionInfo& interaction) override; - void OnModifyDeviceSetting( - const ::assistant::api::client_op::ModifySettingArgs& args) override; - void OnGetDeviceSettings( - int interaction_id, - const ::assistant::api::client_op::GetDeviceSettingsArgs& args) override; // chromeos::assistant::ConversationObserver overrides: void OnInteractionStarted( @@ -198,9 +192,8 @@ void OnAndroidAppListRefreshed( const std::vector<AndroidAppInfo>& apps_info) override; - assistant_client::AssistantManager* assistant_manager(); - assistant_client::AssistantManagerInternal* assistant_manager_internal(); action::CrosActionModule* action_module(); + void SetMicState(bool mic_open); base::Thread& GetBackgroundThreadForTesting(); @@ -215,6 +208,9 @@ void OnServiceRunning(); bool IsServiceStarted() const; + assistant_client::AssistantManager* assistant_manager(); + assistant_client::AssistantManagerInternal* assistant_manager_internal(); + void OnModifySettingsAction(const std::string& modify_setting_args_proto); void OnDeviceAppsEnabled(bool enabled); @@ -229,6 +225,8 @@ // and settings modification proto along with any text/voice responses would // be sent back in the second round (recorded as kDeviceAction). void RecordQueryResponseTypeUMA(); + bool HasReceivedQueryResponse() const; + AssistantQueryResponseType GetQueryResponseType() const; std::string NewPendingInteraction(AssistantInteractionType interaction_type, AssistantQuerySource source, @@ -274,7 +272,6 @@ std::unique_ptr<AssistantManagerServiceDelegate> delegate_; std::unique_ptr<LibassistantServiceHost> libassistant_service_host_; - std::unique_ptr<AssistantDeviceSettingsDelegate> settings_delegate_; std::unique_ptr<DeviceSettingsHost> device_settings_host_; std::unique_ptr<MediaHost> media_host_; std::unique_ptr<TimerHost> timer_host_; @@ -288,7 +285,6 @@ base::TimeTicks started_time_; - bool receive_modify_settings_proto_response_ = false; bool receive_inline_response_ = false; std::string receive_url_response_;
diff --git a/chromeos/services/assistant/assistant_settings_impl.cc b/chromeos/services/assistant/assistant_settings_impl.cc index c90170c..249cc62 100644 --- a/chromeos/services/assistant/assistant_settings_impl.cc +++ b/chromeos/services/assistant/assistant_settings_impl.cc
@@ -11,121 +11,41 @@ #include "base/bind.h" #include "base/callback_helpers.h" #include "chromeos/dbus/util/version_loader.h" -#include "chromeos/services/assistant/assistant_manager_service_impl.h" #include "chromeos/services/assistant/public/cpp/features.h" #include "chromeos/services/assistant/public/proto/settings_ui.pb.h" #include "chromeos/services/assistant/service_context.h" +#include "chromeos/services/libassistant/public/mojom/settings_controller.mojom.h" #include "chromeos/services/libassistant/public/mojom/speaker_id_enrollment_controller.mojom.h" -#include "libassistant/shared/internal_api/assistant_manager_internal.h" - -using SpeakerIdEnrollmentState = - assistant_client::SpeakerIdEnrollmentUpdate::State; -using VoicelessResponseStatus = assistant_client::VoicelessResponse::Status; namespace chromeos { namespace assistant { -namespace { - -bool HasStarted(const AssistantManagerService* assistant_manager_service) { - return (assistant_manager_service->GetState() == - AssistantManagerService::STARTED || - assistant_manager_service->GetState() == - AssistantManagerService::RUNNING); -} - -} // namespace - -AssistantSettingsImpl::AssistantSettingsImpl( - ServiceContext* context, - AssistantManagerServiceImpl* assistant_manager_service) - : context_(context), - assistant_manager_service_(assistant_manager_service) {} +AssistantSettingsImpl::AssistantSettingsImpl(ServiceContext* context) + : context_(context) {} AssistantSettingsImpl::~AssistantSettingsImpl() = default; void AssistantSettingsImpl::Initialize( mojo::PendingRemote< - chromeos::libassistant::mojom::SpeakerIdEnrollmentController> remote) { + chromeos::libassistant::mojom::SpeakerIdEnrollmentController> remote, + chromeos::libassistant::mojom::SettingsController* settings_controller) { speaker_id_enrollment_remote_.Bind(std::move(remote)); + settings_controller_ = settings_controller; } void AssistantSettingsImpl::GetSettings(const std::string& selector, GetSettingsCallback callback) { - DCHECK(HasStarted(assistant_manager_service_)); - DCHECK(main_task_runner()->RunsTasksInCurrentSequence()); - - // TODO(xiaohuic): libassistant could be restarting for various reasons. In - // this case the remote side may not know or care and continues to send - // requests that would need libassistant. We need a better approach to handle - // this and ideally libassistant should not need to restart. - if (!assistant_manager_service_->assistant_manager_internal()) { - std::move(callback).Run(std::string()); - return; - } - - // Wraps the callback into a repeating callback since the server side - // interface requires the callback to be copyable. - std::string serialized_proto = SerializeGetSettingsUiRequest(selector); - assistant_manager_service_->assistant_manager_internal() - ->SendGetSettingsUiRequest( - serialized_proto, std::string(), - [weak_ptr = weak_factory_.GetWeakPtr(), - repeating_callback = - base::AdaptCallbackForRepeating(std::move(callback)), - task_runner = main_task_runner()]( - const assistant_client::VoicelessResponse& response) { - task_runner->PostTask( - FROM_HERE, - base::BindOnce( - [](const base::WeakPtr<AssistantSettingsImpl> weak_ptr, - const assistant_client::VoicelessResponse response, - base::RepeatingCallback<void(const std::string&)> - callback) { - if (weak_ptr && !weak_ptr->ShouldIgnoreResponse(response)) - callback.Run(UnwrapGetSettingsUiResponse(response)); - }, - weak_ptr, response, repeating_callback)); - }); + settings_controller().GetSettings(selector, std::move(callback)); } void AssistantSettingsImpl::UpdateSettings(const std::string& update, GetSettingsCallback callback) { - DCHECK(HasStarted(assistant_manager_service_)); - DCHECK(main_task_runner()->RunsTasksInCurrentSequence()); - - if (!assistant_manager_service_->assistant_manager_internal()) { - std::move(callback).Run(std::string()); - return; - } - - // Wraps the callback into a repeating callback since the server side - // interface requires the callback to be copyable. - std::string serialized_proto = SerializeUpdateSettingsUiRequest(update); - assistant_manager_service_->assistant_manager_internal() - ->SendUpdateSettingsUiRequest( - serialized_proto, std::string(), - [repeating_callback = - base::AdaptCallbackForRepeating(std::move(callback)), - task_runner = main_task_runner()]( - const assistant_client::VoicelessResponse& response) { - // This callback may be called from server multiple times. We should - // only process non-empty response. - std::string update = UnwrapUpdateSettingsUiResponse(response); - task_runner->PostTask( - FROM_HERE, - base::BindOnce( - [](base::RepeatingCallback<void(const std::string&)> - callback, - const std::string& result) { callback.Run(result); }, - repeating_callback, update)); - }); + settings_controller().UpdateSettings(update, std::move(callback)); } void AssistantSettingsImpl::StartSpeakerIdEnrollment( bool skip_cloud_enrollment, base::WeakPtr<SpeakerIdEnrollmentClient> client) { - DCHECK(HasStarted(assistant_manager_service_)); DCHECK(speaker_id_enrollment_remote_.is_bound()); speaker_id_enrollment_remote_->StartSpeakerIdEnrollment( @@ -134,7 +54,6 @@ } void AssistantSettingsImpl::StopSpeakerIdEnrollment() { - DCHECK(HasStarted(assistant_manager_service_)); DCHECK(speaker_id_enrollment_remote_.is_bound()); speaker_id_enrollment_remote_->StopSpeakerIdEnrollment(); @@ -158,8 +77,6 @@ void AssistantSettingsImpl::SyncDeviceAppsStatus( base::OnceCallback<void(bool)> callback) { - DCHECK(main_task_runner()->RunsTasksInCurrentSequence()); - SettingsUiSelector selector; ConsentFlowUiSelector* consent_flow_ui = selector.mutable_consent_flow_ui_selector(); @@ -184,7 +101,13 @@ void AssistantSettingsImpl::HandleDeviceAppsStatusSync( base::OnceCallback<void(bool)> callback, const std::string& settings) { - DCHECK(main_task_runner()->RunsTasksInCurrentSequence()); + if (settings.empty()) { + // Note: we deliberately do not log an error here, as this happens quite + // regularly when there is a network issue during signup. See b/151321970. + DVLOG(1) << "Assistant: Error while syncing device apps status."; + std::move(callback).Run(false); + return; + } SettingsUi settings_ui; if (!settings_ui.ParseFromString(settings)) { @@ -209,30 +132,6 @@ std::move(callback).Run(gaia_user_context_ui.device_apps_enabled()); } -bool AssistantSettingsImpl::ShouldIgnoreResponse( - const assistant_client::VoicelessResponse& response) const { - // If cancellation is indicated, we'll ignore |response|. This is currently - // only known to occur in browser testing when attempting to replay an S3 - // session that was not previously recorded. - if (response.error_code == "CANCELLED") { - VLOG(1) << "Ignore settings response due to cancellation."; - return true; - } - - // If NO_RESPONSE_ERROR is indicated, we'll check to see if LibAssistant is - // restarting/shutting down. If so, we'll ignore |response| to avoid - // propagating fallback values. This may occur if the user quickly toggles - // Assistant enabled/disabled in settings. - if (response.status == VoicelessResponseStatus::NO_RESPONSE_ERROR && - !assistant_manager_service_->assistant_manager_internal()) { - VLOG(1) << "Ignore settings response due to LibAssistant restart/shutdown."; - return true; - } - - // Otherwise we'll allow |response| processing to proceed. - return false; -} - ash::AssistantStateBase* AssistantSettingsImpl::assistant_state() { return context_->assistant_state(); } @@ -241,9 +140,10 @@ return context_->assistant_controller(); } -scoped_refptr<base::SequencedTaskRunner> -AssistantSettingsImpl::main_task_runner() { - return context_->main_task_runner(); +chromeos::libassistant::mojom::SettingsController& +AssistantSettingsImpl::settings_controller() { + DCHECK(settings_controller_); + return *settings_controller_; } } // namespace assistant
diff --git a/chromeos/services/assistant/assistant_settings_impl.h b/chromeos/services/assistant/assistant_settings_impl.h index 7ae5bd28..c01839a 100644 --- a/chromeos/services/assistant/assistant_settings_impl.h +++ b/chromeos/services/assistant/assistant_settings_impl.h
@@ -9,6 +9,7 @@ #include <string> #include "chromeos/services/assistant/public/cpp/assistant_settings.h" +#include "chromeos/services/libassistant/public/mojom/settings_controller.mojom-forward.h" #include "chromeos/services/libassistant/public/mojom/speaker_id_enrollment_controller.mojom-forward.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h" @@ -20,25 +21,21 @@ class AssistantStateBase; } // namespace ash -namespace assistant_client { -struct VoicelessResponse; -} // namespace assistant_client - namespace chromeos { namespace assistant { -class AssistantManagerServiceImpl; class ServiceContext; class AssistantSettingsImpl : public AssistantSettings { public: - AssistantSettingsImpl(ServiceContext* context, - AssistantManagerServiceImpl* assistant_manager_service); + explicit AssistantSettingsImpl(ServiceContext* context); ~AssistantSettingsImpl() override; - void Initialize(mojo::PendingRemote< - chromeos::libassistant::mojom::SpeakerIdEnrollmentController> - enrollment_controller_remote); + void Initialize( + mojo::PendingRemote< + chromeos::libassistant::mojom::SpeakerIdEnrollmentController> + enrollment_controller_remote, + chromeos::libassistant::mojom::SettingsController* settings_controller); // AssistantSettings overrides: void GetSettings(const std::string& selector, @@ -59,14 +56,13 @@ void HandleDeviceAppsStatusSync(base::OnceCallback<void(bool)> callback, const std::string& settings); - bool ShouldIgnoreResponse(const assistant_client::VoicelessResponse&) const; - ash::AssistantStateBase* assistant_state(); ash::AssistantController* assistant_controller(); - scoped_refptr<base::SequencedTaskRunner> main_task_runner(); + chromeos::libassistant::mojom::SettingsController& settings_controller(); ServiceContext* const context_; - AssistantManagerServiceImpl* const assistant_manager_service_; + chromeos::libassistant::mojom::SettingsController* settings_controller_ = + nullptr; mojo::Remote<chromeos::libassistant::mojom::SpeakerIdEnrollmentController> speaker_id_enrollment_remote_;
diff --git a/chromeos/services/assistant/device_settings_host.cc b/chromeos/services/assistant/device_settings_host.cc index 2bcd262..342fcf0 100644 --- a/chromeos/services/assistant/device_settings_host.cc +++ b/chromeos/services/assistant/device_settings_host.cc
@@ -45,29 +45,39 @@ } void DeviceSettingsHost::SetBluetoothEnabled(bool enabled) { + has_setting_changed_ = true; device_actions().SetBluetoothEnabled(enabled); } void DeviceSettingsHost::SetDoNotDisturbEnabled(bool enabled) { + has_setting_changed_ = true; assistant_notification_controller().SetQuietMode(enabled); } void DeviceSettingsHost::SetNightLightEnabled(bool enabled) { + has_setting_changed_ = true; device_actions().SetNightLightEnabled(enabled); } void DeviceSettingsHost::SetScreenBrightnessLevel(double level, bool gradual) { + has_setting_changed_ = true; device_actions().SetScreenBrightnessLevel(level, gradual); } void DeviceSettingsHost::SetSwitchAccessEnabled(bool enabled) { + has_setting_changed_ = true; device_actions().SetSwitchAccessEnabled(enabled); } void DeviceSettingsHost::SetWifiEnabled(bool enabled) { + has_setting_changed_ = true; device_actions().SetWifiEnabled(enabled); } +void DeviceSettingsHost::reset_has_setting_changed() { + has_setting_changed_ = false; +} + DeviceActions& DeviceSettingsHost::device_actions() { auto* result = context_.device_actions(); DCHECK(result);
diff --git a/chromeos/services/assistant/device_settings_host.h b/chromeos/services/assistant/device_settings_host.h index 2b6078b..fd0db559 100644 --- a/chromeos/services/assistant/device_settings_host.h +++ b/chromeos/services/assistant/device_settings_host.h
@@ -40,12 +40,18 @@ void SetSwitchAccessEnabled(bool enabled) override; void SetWifiEnabled(bool enabled) override; + // Return if any setting has been modified. + bool has_setting_changed() const { return has_setting_changed_; } + void reset_has_setting_changed(); + private: ServiceContext& context_; DeviceActions& device_actions(); ash::AssistantNotificationController& assistant_notification_controller(); + bool has_setting_changed_ = false; + mojo::Receiver<DeviceSettingsDelegate> receiver_{this}; }; } // namespace assistant
diff --git a/chromeos/services/assistant/test_support/fake_service_controller.cc b/chromeos/services/assistant/test_support/fake_service_controller.cc index 625baa4..7b520c9d 100644 --- a/chromeos/services/assistant/test_support/fake_service_controller.cc +++ b/chromeos/services/assistant/test_support/fake_service_controller.cc
@@ -126,6 +126,18 @@ authentication_tokens_ = std::move(tokens); } +void FakeServiceController::UpdateSettings(const std::string& settings, + UpdateSettingsCallback callback) { + // Callback must be called to satisfy the mojom contract. + std::move(callback).Run(std::string()); +} + +void FakeServiceController::GetSettings(const std::string& selector, + GetSettingsCallback callback) { + // Callback must be called to satisfy the mojom contract. + std::move(callback).Run(std::string()); +} + } // namespace assistant } // namespace chromeos
diff --git a/chromeos/services/assistant/test_support/fake_service_controller.h b/chromeos/services/assistant/test_support/fake_service_controller.h index e58d92e..b6fbc20 100644 --- a/chromeos/services/assistant/test_support/fake_service_controller.h +++ b/chromeos/services/assistant/test_support/fake_service_controller.h
@@ -105,6 +105,10 @@ void SetListeningEnabled(bool value) override {} void SetLocale(const std::string& value) override {} void SetSpokenFeedbackEnabled(bool value) override {} + void UpdateSettings(const std::string& settings, + UpdateSettingsCallback callback) override; + void GetSettings(const std::string& selector, + GetSettingsCallback callback) override; void SetHotwordEnabled(bool value) override {} // Mutex taken in |Start| to allow the calls to block if |BlockStartCalls| was
diff --git a/chromeos/services/libassistant/BUILD.gn b/chromeos/services/libassistant/BUILD.gn index 474a200..eddf795 100644 --- a/chromeos/services/libassistant/BUILD.gn +++ b/chromeos/services/libassistant/BUILD.gn
@@ -45,6 +45,8 @@ "conversation_controller.h", "conversation_state_listener_impl.cc", "conversation_state_listener_impl.h", + "device_settings_controller.cc", + "device_settings_controller.h", "display_connection_impl.cc", "display_connection_impl.h", "display_controller.cc", @@ -183,6 +185,7 @@ "audio_input_controller_unittest.cc", "authentication_state_observer_unittest.cc", "conversation_observer_unittest.cc", + "device_settings_controller_unittest.cc", "media_controller_unittest.cc", "network_provider_impl_unittest.cc", "power_manager_provider_impl_unittest.cc",
diff --git a/chromeos/services/libassistant/conversation_controller.cc b/chromeos/services/libassistant/conversation_controller.cc index 5e23278..6bcb309 100644 --- a/chromeos/services/libassistant/conversation_controller.cc +++ b/chromeos/services/libassistant/conversation_controller.cc
@@ -179,10 +179,10 @@ assistant::features::IsAppSupportEnabled(), assistant::features::IsWaitSchedulingEnabled())), mojom_task_runner_(base::SequencedTaskRunnerHandle::Get()) { - // TODO(jeroendh): We no longer need to pass in service_controller as we - // already are a AssistantManagerObserver. + // TODO(jeroendh): We should not pass in the |ServiceController| into this + // constructor. Instead, we should access the |AssistantManager| through + // the methods offered by |AssistantManagerObserver|. DCHECK(service_controller_); - action_module_->AddObserver(this); } @@ -195,6 +195,11 @@ receiver_.Bind(std::move(receiver)); } +void ConversationController::AddActionObserver( + chromeos::assistant::action::AssistantActionObserver* observer) { + action_module_->AddObserver(observer); +} + void ConversationController::AddAuthenticationStateObserver( mojo::PendingRemote< chromeos::libassistant::mojom::AuthenticationStateObserver> observer) {
diff --git a/chromeos/services/libassistant/conversation_controller.h b/chromeos/services/libassistant/conversation_controller.h index 958b47f..d976113 100644 --- a/chromeos/services/libassistant/conversation_controller.h +++ b/chromeos/services/libassistant/conversation_controller.h
@@ -45,6 +45,8 @@ void Bind(mojo::PendingReceiver<mojom::ConversationController> receiver); + void AddActionObserver( + chromeos::assistant::action::AssistantActionObserver* observer); void AddAuthenticationStateObserver( mojo::PendingRemote< chromeos::libassistant::mojom::AuthenticationStateObserver> observer);
diff --git a/chromeos/services/assistant/assistant_device_settings_delegate.cc b/chromeos/services/libassistant/device_settings_controller.cc similarity index 70% rename from chromeos/services/assistant/assistant_device_settings_delegate.cc rename to chromeos/services/libassistant/device_settings_controller.cc index 721b167..d72bfb1 100644 --- a/chromeos/services/assistant/assistant_device_settings_delegate.cc +++ b/chromeos/services/libassistant/device_settings_controller.cc
@@ -1,8 +1,8 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. +// Copyright 2021 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chromeos/services/assistant/assistant_device_settings_delegate.h" +#include "chromeos/services/libassistant/device_settings_controller.h" #include <algorithm> #include <memory> @@ -13,6 +13,7 @@ #include "chromeos/assistant/internal/internal_util.h" #include "chromeos/assistant/internal/proto/google3/assistant/api/client_op/device_args.pb.h" #include "chromeos/services/libassistant/public/mojom/device_settings_delegate.mojom.h" +#include "libassistant/shared/internal_api/assistant_manager_internal.h" namespace client_op = ::assistant::api::client_op; @@ -20,7 +21,18 @@ using chromeos::libassistant::mojom::GetBrightnessResultPtr; namespace chromeos { -namespace assistant { +namespace libassistant { + +namespace { +// A macro which ensures we are running on the main thread. +#define ENSURE_MOJOM_THREAD(method, ...) \ + if (!mojom_task_runner_->RunsTasksInCurrentSequence()) { \ + mojom_task_runner_->PostTask( \ + FROM_HERE, \ + base::BindOnce(method, weak_factory_.GetWeakPtr(), ##__VA_ARGS__)); \ + return; \ + } +} // namespace class Setting { public: @@ -167,6 +179,7 @@ void Modify(const client_op::ModifySettingArgs& request) override { HandleOnOffChange(request, [&](bool enabled) { + VLOG(1) << "Assistant: Setting bluetooth enabled: " << enabled; delegate().SetBluetoothEnabled(enabled); }); } @@ -182,6 +195,7 @@ void Modify(const client_op::ModifySettingArgs& request) override { HandleOnOffChange(request, [&](bool enabled) { + VLOG(1) << "Assistant: Setting do not disturb enabled: " << enabled; delegate().SetDoNotDisturbEnabled(enabled); }); } @@ -197,6 +211,7 @@ void Modify(const client_op::ModifySettingArgs& request) override { HandleOnOffChange(request, [&](bool enabled) { + VLOG(1) << "Assistant: Setting switch access enabled: " << enabled; delegate().SetSwitchAccessEnabled(enabled); }); } @@ -210,6 +225,7 @@ void Modify(const client_op::ModifySettingArgs& request) override { HandleOnOffChange(request, [&](bool enabled) { + VLOG(1) << "Assistant: Setting night light enabled: " << enabled; delegate().SetNightLightEnabled(enabled); }); } @@ -236,6 +252,8 @@ HandleSliderChange( request, [&this_](double new_value) { + VLOG(1) << "Assistant: Setting brightness to " << new_value + << " percent"; this_->delegate().SetScreenBrightnessLevel(new_value, true); }, [current_value = result->level]() { return current_value; }); @@ -249,28 +267,26 @@ } // namespace -AssistantDeviceSettingsDelegate::AssistantDeviceSettingsDelegate( - DeviceSettingsDelegate* delegate) { - AddSetting(std::make_unique<WifiSetting>(delegate)); - AddSetting(std::make_unique<BluetoothSetting>(delegate)); - AddSetting(std::make_unique<NightLightSetting>(delegate)); - AddSetting(std::make_unique<DoNotDisturbSetting>(delegate)); - AddSetting(std::make_unique<BrightnessSetting>(delegate)); - AddSetting(std::make_unique<SwitchAccessSetting>(delegate)); +DeviceSettingsController::DeviceSettingsController() + : mojom_task_runner_(base::SequencedTaskRunnerHandle::Get()) {} +DeviceSettingsController::~DeviceSettingsController() = default; + +void DeviceSettingsController::Bind( + mojo::PendingRemote<mojom::DeviceSettingsDelegate> remote) { + remote_.Bind(std::move(remote)); + + AddSetting(std::make_unique<WifiSetting>(remote_.get())); + AddSetting(std::make_unique<BluetoothSetting>(remote_.get())); + AddSetting(std::make_unique<NightLightSetting>(remote_.get())); + AddSetting(std::make_unique<DoNotDisturbSetting>(remote_.get())); + AddSetting(std::make_unique<BrightnessSetting>(remote_.get())); + AddSetting(std::make_unique<SwitchAccessSetting>(remote_.get())); } -AssistantDeviceSettingsDelegate::~AssistantDeviceSettingsDelegate() = default; - -bool AssistantDeviceSettingsDelegate::IsSettingSupported( - const std::string& setting_id) const { - return std::any_of(settings_.begin(), settings_.end(), - [&setting_id](const auto& setting) { - return setting->setting_id() == setting_id; - }); -} - -void AssistantDeviceSettingsDelegate::HandleModifyDeviceSetting( +void DeviceSettingsController::OnModifyDeviceSetting( const client_op::ModifySettingArgs& modify_setting_args) { + ENSURE_MOJOM_THREAD(&DeviceSettingsController::OnModifyDeviceSetting, + modify_setting_args); VLOG(1) << "Assistant: Modifying Device Setting '" << modify_setting_args.setting_id() << "'"; DCHECK(IsSettingSupported(modify_setting_args.setting_id())); @@ -285,18 +301,58 @@ NOTREACHED(); } -std::vector<DeviceSetting> AssistantDeviceSettingsDelegate::GetDeviceSettings( +void DeviceSettingsController::OnGetDeviceSettings( + int interaction_id, + const ::assistant::api::client_op::GetDeviceSettingsArgs& args) { + if (!assistant_manager_internal_) { + VLOG(1) << "Assistant: Dropping OnGetDeviceSettings call as Libassistant " + "has not started yet"; + return; + } + + std::vector<assistant::DeviceSetting> result = + GetSupportedDeviceSettings(args); + + assistant_client::VoicelessOptions voiceless_options; + voiceless_options.is_user_initiated = true; + + assistant_manager_internal_->SendVoicelessInteraction( + CreateGetDeviceSettingInteraction(interaction_id, result), + /*description=*/"get_settings_result", voiceless_options, [](auto) {}); +} + +void DeviceSettingsController::OnAssistantManagerCreated( + assistant_client::AssistantManager* assistant_manager, + assistant_client::AssistantManagerInternal* assistant_manager_internal) { + assistant_manager_internal_ = assistant_manager_internal; +} + +void DeviceSettingsController::OnDestroyingAssistantManager( + assistant_client::AssistantManager* assistant_manager, + assistant_client::AssistantManagerInternal* assistant_manager_internal) { + assistant_manager_internal_ = nullptr; +} + +std::vector<chromeos::assistant::DeviceSetting> +DeviceSettingsController::GetSupportedDeviceSettings( const ::assistant::api::client_op::GetDeviceSettingsArgs& args) const { - std::vector<DeviceSetting> result; + std::vector<chromeos::assistant::DeviceSetting> result; for (const std::string& setting_id : args.setting_ids()) result.emplace_back(setting_id, IsSettingSupported(setting_id)); return result; } -void AssistantDeviceSettingsDelegate::AddSetting( - std::unique_ptr<Setting> setting) { +bool DeviceSettingsController::IsSettingSupported( + const std::string& setting_id) const { + return std::any_of(settings_.begin(), settings_.end(), + [&setting_id](const auto& setting) { + return setting->setting_id() == setting_id; + }); +} + +void DeviceSettingsController::AddSetting(std::unique_ptr<Setting> setting) { settings_.push_back(std::move(setting)); } -} // namespace assistant +} // namespace libassistant } // namespace chromeos
diff --git a/chromeos/services/libassistant/device_settings_controller.h b/chromeos/services/libassistant/device_settings_controller.h new file mode 100644 index 0000000..ca662ac --- /dev/null +++ b/chromeos/services/libassistant/device_settings_controller.h
@@ -0,0 +1,90 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROMEOS_SERVICES_LIBASSISTANT_DEVICE_SETTINGS_CONTROLLER_H_ +#define CHROMEOS_SERVICES_LIBASSISTANT_DEVICE_SETTINGS_CONTROLLER_H_ + +#include <memory> +#include <string> +#include <vector> + +#include "base/component_export.h" +#include "base/memory/weak_ptr.h" +#include "base/sequenced_task_runner.h" +#include "chromeos/assistant/internal/action/assistant_action_observer.h" +#include "chromeos/services/libassistant/assistant_manager_observer.h" +#include "chromeos/services/libassistant/public/mojom/device_settings_delegate.mojom.h" +#include "mojo/public/cpp/bindings/pending_remote.h" +#include "mojo/public/cpp/bindings/remote.h" + +namespace assistant { +namespace api { +namespace client_op { +class ModifySettingArgs; +class GetDeviceSettingsArgs; +} // namespace client_op +} // namespace api +} // namespace assistant + +namespace chromeos { +namespace assistant { +struct DeviceSetting; +} // namespace assistant +} // namespace chromeos + +namespace chromeos { +namespace libassistant { + +class Setting; + +class DeviceSettingsController + : public AssistantManagerObserver, + public chromeos::assistant::action::AssistantActionObserver { + public: + DeviceSettingsController(); + DeviceSettingsController(DeviceSettingsController&) = delete; + DeviceSettingsController& operator=(DeviceSettingsController&) = delete; + ~DeviceSettingsController() override; + + void Bind(mojo::PendingRemote<mojom::DeviceSettingsDelegate> delegate); + + // chromeos::assistant::action::AssistantActionObserver implementation: + void OnModifyDeviceSetting( + const ::assistant::api::client_op::ModifySettingArgs& setting) override; + void OnGetDeviceSettings( + int interaction_id, + const ::assistant::api::client_op::GetDeviceSettingsArgs& setting) + override; + + // AssistantManagerObserver implementation: + void OnAssistantManagerCreated( + assistant_client::AssistantManager* assistant_manager, + assistant_client::AssistantManagerInternal* assistant_manager_internal) + override; + void OnDestroyingAssistantManager( + assistant_client::AssistantManager* assistant_manager, + assistant_client::AssistantManagerInternal* assistant_manager_internal) + override; + + // Returns which of the given device settings are supported or not. + std::vector<chromeos::assistant::DeviceSetting> GetSupportedDeviceSettings( + const ::assistant::api::client_op::GetDeviceSettingsArgs& args) const; + + private: + bool IsSettingSupported(const std::string& setting_id) const; + + void AddSetting(std::unique_ptr<Setting> setting); + + std::vector<std::unique_ptr<Setting>> settings_; + assistant_client::AssistantManagerInternal* assistant_manager_internal_ = + nullptr; + mojo::Remote<mojom::DeviceSettingsDelegate> remote_; + scoped_refptr<base::SequencedTaskRunner> mojom_task_runner_; + base::WeakPtrFactory<DeviceSettingsController> weak_factory_{this}; +}; + +} // namespace libassistant +} // namespace chromeos + +#endif // CHROMEOS_SERVICES_LIBASSISTANT_DEVICE_SETTINGS_CONTROLLER_H_
diff --git a/chromeos/services/libassistant/device_settings_controller_unittest.cc b/chromeos/services/libassistant/device_settings_controller_unittest.cc new file mode 100644 index 0000000..999f388 --- /dev/null +++ b/chromeos/services/libassistant/device_settings_controller_unittest.cc
@@ -0,0 +1,282 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chromeos/services/libassistant/device_settings_controller.h" + +#include <memory> +#include <utility> + +#include "base/command_line.h" +#include "base/run_loop.h" +#include "base/test/task_environment.h" +#include "chromeos/assistant/internal/internal_util.h" +#include "chromeos/assistant/internal/proto/google3/assistant/api/client_op/device_args.pb.h" +#include "chromeos/services/libassistant/public/mojom/device_settings_delegate.mojom.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace chromeos { +namespace assistant { + +bool operator==(const DeviceSetting& left, const DeviceSetting& right) { + return (left.is_supported == right.is_supported) && + (left.setting_id == right.setting_id); +} + +void PrintTo(const DeviceSetting& settings, std::ostream* out) { + *out << "DeviceSettings {" << std::endl; + *out << " setting_id: " << settings.setting_id << std::endl; + *out << " is_supported: " << settings.is_supported << std::endl; + *out << "}"; +} + +} // namespace assistant +} // namespace chromeos + +namespace chromeos { +namespace libassistant { + +namespace { + +constexpr double kEpsilon = 0.001; + +using ::assistant::api::client_op::GetDeviceSettingsArgs; +using ::assistant::api::client_op::ModifySettingArgs; +using chromeos::assistant::DeviceSetting; +using Change = ::assistant::api::client_op::ModifySettingArgs::Change; +using Unit = ::assistant::api::client_op::ModifySettingArgs::Unit; +using ::testing::AnyNumber; +using ::testing::DoubleNear; +using ::testing::ElementsAre; +using ::testing::FloatNear; +using ::testing::Return; +using ::testing::StrictMock; + +constexpr char kWiFi[] = "WIFI"; +constexpr char kBluetooth[] = "BLUETOOTH"; +constexpr char kScreenBrightness[] = "BRIGHTNESS_LEVEL"; +constexpr char kDoNotDisturb[] = "DO_NOT_DISTURB"; +constexpr char kNightLight[] = "NIGHT_LIGHT_SWITCH"; +constexpr char kSwitchAccess[] = "SWITCH_ACCESS"; + +// Returns the settings that are always supported. +const std::vector<std::string> kAlwaysSupportedSettings = { + kWiFi, kBluetooth, kScreenBrightness, + kDoNotDisturb, kNightLight, kSwitchAccess, +}; + +class DeviceSettingsDelegateMock : public mojom::DeviceSettingsDelegate { + public: + // mojom::DeviceSettingsDelegate implementation: + void GetScreenBrightnessLevel( + GetScreenBrightnessLevelCallback callback) override { + std::move(callback).Run( + mojom::GetBrightnessResult::New(current_brightness_)); + } + MOCK_METHOD(void, SetBluetoothEnabled, (bool enabled)); + MOCK_METHOD(void, SetDoNotDisturbEnabled, (bool enabled)); + MOCK_METHOD(void, SetNightLightEnabled, (bool enabled)); + MOCK_METHOD(void, SetScreenBrightnessLevel, (double level, bool gradual)); + MOCK_METHOD(void, SetSwitchAccessEnabled, (bool enabled)); + MOCK_METHOD(void, SetWifiEnabled, (bool enabled)); + + mojo::PendingRemote<mojom::DeviceSettingsDelegate> + BindNewPipeAndPassRemote() { + return receiver_.BindNewPipeAndPassRemote(); + } + + void FlushForTesting() { receiver_.FlushForTesting(); } + + void set_current_brightness(double value) { current_brightness_ = value; } + + private: + mojo::Receiver<DeviceSettingsDelegate> receiver_{this}; + double current_brightness_; +}; + +} // namespace + +class AssistantDeviceSettingsControllerTest : public testing::Test { + public: + AssistantDeviceSettingsControllerTest() = default; + + void SetUp() override { + controller().Bind(delegate_mock_.BindNewPipeAndPassRemote()); + } + + DeviceSetting GetSupportedDeviceSettings(const std::string& setting_id) { + GetDeviceSettingsArgs args; + args.add_setting_ids(setting_id); + + std::vector<DeviceSetting> result = + controller().GetSupportedDeviceSettings(args); + EXPECT_EQ(result.size(), 1u); + return result[0]; + } + + void ModifySetting(const ModifySettingArgs& args) { + controller().OnModifyDeviceSetting(args); + delegate_mock().FlushForTesting(); + // When we're changing the brightness, we first fetch the current value + // and then need to run a callback on the main thread. + base::RunLoop().RunUntilIdle(); + } + + DeviceSettingsController& controller() { return controller_; } + + DeviceSettingsDelegateMock& delegate_mock() { return delegate_mock_; } + + private: + base::test::SingleThreadTaskEnvironment environment_; + DeviceSettingsController controller_; + DeviceSettingsDelegateMock delegate_mock_; +}; + +std::ostream& operator<<(std::ostream& stream, const DeviceSetting& value) { + stream << "{ " << value.setting_id << ": " << value.is_supported << "}"; + return stream; +} + +TEST_F(AssistantDeviceSettingsControllerTest, + GetDeviceSettingsShouldReturnFalseForUnknownSetting) { + EXPECT_EQ(GetSupportedDeviceSettings("UNKNOWN_SETTING"), + DeviceSetting("UNKNOWN_SETTING", false)); +} + +TEST_F(AssistantDeviceSettingsControllerTest, + GetDeviceSettingsShouldReturnTrueForKnownSettings) { + for (const std::string& setting : kAlwaysSupportedSettings) { + EXPECT_EQ(GetSupportedDeviceSettings(setting), DeviceSetting(setting, true)) + << "Error for " << setting; + } +} + +TEST_F(AssistantDeviceSettingsControllerTest, + GetDeviceSettingsShouldMultipleSettingsAtTheSameTime) { + GetDeviceSettingsArgs args; + args.add_setting_ids("UNKNOWN_SETTING"); + args.add_setting_ids(kWiFi); + + std::vector<DeviceSetting> result = + controller().GetSupportedDeviceSettings(args); + + EXPECT_THAT(controller().GetSupportedDeviceSettings(args), + ElementsAre(DeviceSetting("UNKNOWN_SETTING", false), + DeviceSetting(kWiFi, true))); +} + +TEST_F(AssistantDeviceSettingsControllerTest, ShouldTurnWifiOnAndOff) { + ModifySettingArgs args; + args.set_setting_id(kWiFi); + + args.set_change(Change::ModifySettingArgs_Change_ON); + EXPECT_CALL(delegate_mock(), SetWifiEnabled(true)); + ModifySetting(args); + + args.set_change(Change::ModifySettingArgs_Change_OFF); + EXPECT_CALL(delegate_mock(), SetWifiEnabled(false)); + ModifySetting(args); +} + +TEST_F(AssistantDeviceSettingsControllerTest, ShouldTurnBluetoothOnAndOff) { + ModifySettingArgs args; + args.set_setting_id(kBluetooth); + + args.set_change(Change::ModifySettingArgs_Change_ON); + EXPECT_CALL(delegate_mock(), SetBluetoothEnabled(true)); + ModifySetting(args); + + args.set_change(Change::ModifySettingArgs_Change_OFF); + EXPECT_CALL(delegate_mock(), SetBluetoothEnabled(false)); + ModifySetting(args); +} + +TEST_F(AssistantDeviceSettingsControllerTest, ShouldTurnQuietModeOnAndOff) { + ModifySettingArgs args; + args.set_setting_id(kDoNotDisturb); + + args.set_change(Change::ModifySettingArgs_Change_ON); + EXPECT_CALL(delegate_mock(), SetDoNotDisturbEnabled(true)); + ModifySetting(args); + + args.set_change(Change::ModifySettingArgs_Change_OFF); + EXPECT_CALL(delegate_mock(), SetDoNotDisturbEnabled(false)); + ModifySetting(args); +} + +TEST_F(AssistantDeviceSettingsControllerTest, ShouldTurnSwitchAccessOnAndOff) { + ModifySettingArgs args; + args.set_setting_id(kSwitchAccess); + + args.set_change(Change::ModifySettingArgs_Change_ON); + EXPECT_CALL(delegate_mock(), SetSwitchAccessEnabled(true)); + ModifySetting(args); + + args.set_change(Change::ModifySettingArgs_Change_OFF); + EXPECT_CALL(delegate_mock(), SetSwitchAccessEnabled(false)); + ModifySetting(args); +} + +TEST_F(AssistantDeviceSettingsControllerTest, ShouldTurnNightLightOnAndOff) { + ModifySettingArgs args; + args.set_setting_id(kNightLight); + + args.set_change(Change::ModifySettingArgs_Change_ON); + EXPECT_CALL(delegate_mock(), SetNightLightEnabled(true)); + ModifySetting(args); + + args.set_change(Change::ModifySettingArgs_Change_OFF); + EXPECT_CALL(delegate_mock(), SetNightLightEnabled(false)); + ModifySetting(args); +} + +TEST_F(AssistantDeviceSettingsControllerTest, ShouldSetBrightness) { + ModifySettingArgs args; + args.set_setting_id(kScreenBrightness); + args.set_change(Change::ModifySettingArgs_Change_SET); + + // Set brightness to 20% + args.set_numeric_value(0.2); + args.set_unit(Unit::ModifySettingArgs_Unit_RANGE); + EXPECT_CALL(delegate_mock(), + SetScreenBrightnessLevel(DoubleNear(0.2, kEpsilon), + /*gradual=*/true)); + ModifySetting(args); + + // Set brightness to 30. + // This will be converted to a percentage + args.set_numeric_value(30); + args.set_unit(Unit::ModifySettingArgs_Unit_STEP); + EXPECT_CALL(delegate_mock(), + SetScreenBrightnessLevel(DoubleNear(0.3, kEpsilon), + /*gradual=*/true)); + ModifySetting(args); +} + +TEST_F(AssistantDeviceSettingsControllerTest, + ShouldIncreaseAndDecreaseBrightness) { + ModifySettingArgs args; + args.set_setting_id(kScreenBrightness); + + // Increase brightness - this will use a default increment of 10% + args.set_change(Change::ModifySettingArgs_Change_INCREASE); + args.set_unit(Unit::ModifySettingArgs_Unit_UNKNOWN_UNIT); + delegate_mock().set_current_brightness(0.2); + EXPECT_CALL(delegate_mock(), + SetScreenBrightnessLevel(DoubleNear(0.3, kEpsilon), + /*gradual=*/true)); + ModifySetting(args); + + // Decrease brightness - this will use a default decrement of 10% + args.set_change(Change::ModifySettingArgs_Change_DECREASE); + args.set_unit(Unit::ModifySettingArgs_Unit_UNKNOWN_UNIT); + delegate_mock().set_current_brightness(0.2); + EXPECT_CALL(delegate_mock(), + SetScreenBrightnessLevel(DoubleNear(0.1, kEpsilon), + /*gradual=*/true)); + ModifySetting(args); +} + +} // namespace libassistant +} // namespace chromeos
diff --git a/chromeos/services/libassistant/libassistant_service.cc b/chromeos/services/libassistant/libassistant_service.cc index 8e5ae23..037f83d 100644 --- a/chromeos/services/libassistant/libassistant_service.cc +++ b/chromeos/services/libassistant/libassistant_service.cc
@@ -25,6 +25,7 @@ &speech_recognition_observers_, conversation_controller_.conversation_observers(), &audio_input_controller_), + device_settings_controller_(), display_controller_(&speech_recognition_observers_), media_controller_(), settings_controller_(), @@ -34,6 +35,8 @@ &conversation_controller_); service_controller_.AddAndFireAssistantManagerObserver( &conversation_state_listener_); + service_controller_.AddAndFireAssistantManagerObserver( + &device_settings_controller_); service_controller_.AddAndFireAssistantManagerObserver(&display_controller_); service_controller_.AddAndFireAssistantManagerObserver(&media_controller_); service_controller_.AddAndFireAssistantManagerObserver( @@ -41,6 +44,7 @@ service_controller_.AddAndFireAssistantManagerObserver(&settings_controller_); service_controller_.AddAndFireAssistantManagerObserver(&timer_controller_); + conversation_controller_.AddActionObserver(&device_settings_controller_); platform_api_.SetAudioInputProvider( &audio_input_controller_.audio_input_provider()); } @@ -72,6 +76,7 @@ audio_input_controller_.Bind(std::move(audio_input_controller), platform_delegate_.get()); conversation_controller_.Bind(std::move(conversation_controller)); + device_settings_controller_.Bind(std::move(device_settings_delegate)); display_controller_.Bind(std::move(display_controller)); media_controller_.Bind(std::move(media_controller), std::move(media_delegate));
diff --git a/chromeos/services/libassistant/libassistant_service.h b/chromeos/services/libassistant/libassistant_service.h index 3cf1811a..a5a477c 100644 --- a/chromeos/services/libassistant/libassistant_service.h +++ b/chromeos/services/libassistant/libassistant_service.h
@@ -11,6 +11,7 @@ #include "chromeos/services/libassistant/audio_input_controller.h" #include "chromeos/services/libassistant/conversation_controller.h" #include "chromeos/services/libassistant/conversation_state_listener_impl.h" +#include "chromeos/services/libassistant/device_settings_controller.h" #include "chromeos/services/libassistant/display_controller.h" #include "chromeos/services/libassistant/media_controller.h" #include "chromeos/services/libassistant/platform_api.h" @@ -87,6 +88,7 @@ // |service_controller_|. ConversationController conversation_controller_; ConversationStateListenerImpl conversation_state_listener_; + DeviceSettingsController device_settings_controller_; DisplayController display_controller_; MediaController media_controller_; SettingsController settings_controller_;
diff --git a/chromeos/services/libassistant/public/mojom/settings_controller.mojom b/chromeos/services/libassistant/public/mojom/settings_controller.mojom index d55c4db9..16e43b6 100644 --- a/chromeos/services/libassistant/public/mojom/settings_controller.mojom +++ b/chromeos/services/libassistant/public/mojom/settings_controller.mojom
@@ -27,6 +27,21 @@ // Sets whether hotword detection is enabled. SetHotwordEnabled(bool value); + + // Retrieve settings. |selector| is a serialized proto of + // |SettingsUiSelector|, indicating which settings sub-pages should be + // requested to the server. + // On success, the return value is a serialized proto of |SettingsUi|, + // containing the requested sub-pages. + // On failure, the return value is the empty string. + GetSettings(string selector) => (string result); + + // Update settings. |update| is a serialized proto of |SettingsUiUpdate|, + // indicating the newly updated values. + // On success, the return value is a serialized proto of + // |SettingsUiUpdateResult|, containing the result of updates. + // On failure, the return value is the empty string. + UpdateSettings(string settings) => (string result); }; // A token used by Libassistant to authenticate the user.
diff --git a/chromeos/services/libassistant/service_controller_unittest.cc b/chromeos/services/libassistant/service_controller_unittest.cc index 49ee421..ded5283b 100644 --- a/chromeos/services/libassistant/service_controller_unittest.cc +++ b/chromeos/services/libassistant/service_controller_unittest.cc
@@ -117,6 +117,12 @@ MOCK_METHOD(void, SetLocale, (const std::string& value)); MOCK_METHOD(void, SetSpokenFeedbackEnabled, (bool value)); MOCK_METHOD(void, SetHotwordEnabled, (bool value)); + MOCK_METHOD(void, + GetSettings, + (const std::string& selector, GetSettingsCallback callback)); + MOCK_METHOD(void, + UpdateSettings, + (const std::string& settings, UpdateSettingsCallback callback)); }; class AssistantServiceControllerTest : public testing::Test {
diff --git a/chromeos/services/libassistant/settings_controller.cc b/chromeos/services/libassistant/settings_controller.cc index 77a4daa..8af19ec 100644 --- a/chromeos/services/libassistant/settings_controller.cc +++ b/chromeos/services/libassistant/settings_controller.cc
@@ -142,6 +142,27 @@ UpdateDeviceSettings(locale_, hotword_enabled_); } +void SettingsController::GetSettings(const std::string& selector, + GetSettingsCallback callback) { + if (!assistant_manager_internal_) { + std::move(callback).Run(std::string()); + return; + } + + std::string serialized_proto = + assistant::SerializeGetSettingsUiRequest(selector); + assistant_manager_internal_->SendGetSettingsUiRequest( + serialized_proto, std::string(), + ToStdFunction(BindToCurrentSequence( + [](GetSettingsCallback callback, + const assistant_client::VoicelessResponse& response) { + std::string result = + assistant::UnwrapGetSettingsUiResponse(response); + std::move(callback).Run(result); + }, + std::move(callback)))); +} + void SettingsController::UpdateSettings(const std::string& settings, UpdateSettingsCallback callback) { if (!assistant_manager_internal_) {
diff --git a/chromeos/services/libassistant/settings_controller.h b/chromeos/services/libassistant/settings_controller.h index a05c647..331647b 100644 --- a/chromeos/services/libassistant/settings_controller.h +++ b/chromeos/services/libassistant/settings_controller.h
@@ -32,6 +32,10 @@ void SetLocale(const std::string& value) override; void SetSpokenFeedbackEnabled(bool value) override; void SetHotwordEnabled(bool value) override; + void GetSettings(const std::string& selector, + GetSettingsCallback callback) override; + void UpdateSettings(const std::string& settings, + UpdateSettingsCallback callback) override; // AssistantManagerObserver: void OnAssistantManagerCreated( @@ -51,9 +55,6 @@ using UpdateSettingsCallback = base::OnceCallback<void(const std::string&)>; class DeviceSettingsUpdater; - void UpdateSettings(const std::string& settings, - UpdateSettingsCallback callback); - // The settings are being passed in to clearly document when Libassistant // must be updated. void UpdateListeningEnabled(base::Optional<bool> listening_enabled);
diff --git a/chromeos/settings/cros_settings_names.cc b/chromeos/settings/cros_settings_names.cc index ba0e9a7d..2312747 100644 --- a/chromeos/settings/cros_settings_names.cc +++ b/chromeos/settings/cros_settings_names.cc
@@ -213,6 +213,10 @@ const char kReportDeviceSystemInfo[] = "cros.device_status.report_device_system_info"; +// A boolean pref that determines whether the user's print job history is +// reported. +const char kReportDevicePrintJobs[] = "cros.device_status.report_print_jobs"; + // Determines whether heartbeats should be sent to the policy service via // the GCM channel. const char kHeartbeatEnabled[] = "cros.device_status.heartbeat_enabled";
diff --git a/chromeos/settings/cros_settings_names.h b/chromeos/settings/cros_settings_names.h index d4cfdc6..8fd2fa2 100644 --- a/chromeos/settings/cros_settings_names.h +++ b/chromeos/settings/cros_settings_names.h
@@ -121,6 +121,7 @@ COMPONENT_EXPORT(CHROMEOS_SETTINGS) extern const char kReportDeviceFanInfo[]; COMPONENT_EXPORT(CHROMEOS_SETTINGS) extern const char kReportDeviceVpdInfo[]; COMPONENT_EXPORT(CHROMEOS_SETTINGS) extern const char kReportDeviceSystemInfo[]; +COMPONENT_EXPORT(CHROMEOS_SETTINGS) extern const char kReportDevicePrintJobs[]; COMPONENT_EXPORT(CHROMEOS_SETTINGS) extern const char kHeartbeatEnabled[]; COMPONENT_EXPORT(CHROMEOS_SETTINGS) extern const char kHeartbeatFrequency[];
diff --git a/chromeos/strings/chromeos_strings_az.xtb b/chromeos/strings/chromeos_strings_az.xtb index c082f771..c824571 100644 --- a/chromeos/strings/chromeos_strings_az.xtb +++ b/chromeos/strings/chromeos_strings_az.xtb
@@ -253,6 +253,7 @@ <translation id="6472207088655375767">Birdəfəlik parol (OTP)</translation> <translation id="6480327114083866287"><ph name="MANAGER" /> tərəfindən idarə edilir</translation> <translation id="649050271426829538">Dayanıb - Kağız ilişib</translation> +<translation id="6516990319416533844">Batareya şarj sürətini test etmək üçün batareyanın qısa müddət boşalmasına imkan verin</translation> <translation id="6517239166834772319">Araşdırın</translation> <translation id="6527081081771465939">Naməlum Wi-Fi güvənlik protokolu</translation> <translation id="65587193855025101">Yastı</translation>
diff --git a/chromeos/strings/chromeos_strings_be.xtb b/chromeos/strings/chromeos_strings_be.xtb index 5f517fc..a3098c9 100644 --- a/chromeos/strings/chromeos_strings_be.xtb +++ b/chromeos/strings/chromeos_strings_be.xtb
@@ -254,6 +254,7 @@ <translation id="6472207088655375767">Аднаразовы пароль</translation> <translation id="6480327114083866287">Кіруе <ph name="MANAGER" /></translation> <translation id="649050271426829538">Спынена: захрасла папера</translation> +<translation id="6516990319416533844">Каб праверыць хуткасць зарадкі, пачакайце крыху, пакуль акумулятар дастаткова не разрадзіцца</translation> <translation id="6517239166834772319">Агляд</translation> <translation id="6527081081771465939">Невядомы пратакол сістэмы бяспекі Wi-Fi</translation> <translation id="65587193855025101">Планшэтны сканер</translation>
diff --git a/chromeos/strings/chromeos_strings_et.xtb b/chromeos/strings/chromeos_strings_et.xtb index 71a62e8..f9eeda4 100644 --- a/chromeos/strings/chromeos_strings_et.xtb +++ b/chromeos/strings/chromeos_strings_et.xtb
@@ -254,6 +254,7 @@ <translation id="6472207088655375767">Ühekordne parool</translation> <translation id="6480327114083866287">Haldab <ph name="MANAGER" /></translation> <translation id="649050271426829538">Peatatud – paberiummistus</translation> +<translation id="6516990319416533844">Aku laadimiskiiruse testimiseks laske akul lühikese perioodi jooksul tühjeneda</translation> <translation id="6517239166834772319">Avastamine</translation> <translation id="6527081081771465939">Tundmatu WiFi-turvaprotokoll</translation> <translation id="65587193855025101">Tasaskanner</translation>
diff --git a/chromeos/strings/chromeos_strings_eu.xtb b/chromeos/strings/chromeos_strings_eu.xtb index 056993f4..4dd42823 100644 --- a/chromeos/strings/chromeos_strings_eu.xtb +++ b/chromeos/strings/chromeos_strings_eu.xtb
@@ -254,6 +254,7 @@ <translation id="6472207088655375767">EBP</translation> <translation id="6480327114083866287">Kudeatzailea: <ph name="MANAGER" /></translation> <translation id="649050271426829538">Geldituta: papera trabatuta dago</translation> +<translation id="6516990319416533844">Bateriaren kargatze-abiadura neurtzeko proba bat egin nahi baduzu, utzi tarte labur batez bateria agortzen</translation> <translation id="6517239166834772319">Arakatu</translation> <translation id="6527081081771465939">Wifiaren segurtasun-protokoloa ezezaguna da</translation> <translation id="65587193855025101">Eskaner horizontala</translation>
diff --git a/chromeos/strings/chromeos_strings_fi.xtb b/chromeos/strings/chromeos_strings_fi.xtb index 22e0edf..6fd4f0f4 100644 --- a/chromeos/strings/chromeos_strings_fi.xtb +++ b/chromeos/strings/chromeos_strings_fi.xtb
@@ -254,6 +254,7 @@ <translation id="6472207088655375767">OTP</translation> <translation id="6480327114083866287">Ylläpitäjä: <ph name="MANAGER" /></translation> <translation id="649050271426829538">Pysähtynyt – Paperitukos</translation> +<translation id="6516990319416533844">Anna akun tyhjentyä hetken aikaa, jotta voit testata sen latautumisnopeutta</translation> <translation id="6517239166834772319">Explore</translation> <translation id="6527081081771465939">Tuntematon Wi-Fi-suojausprotokolla</translation> <translation id="65587193855025101">Tasoskanneri</translation>
diff --git a/chromeos/strings/chromeos_strings_fr-CA.xtb b/chromeos/strings/chromeos_strings_fr-CA.xtb index c095e82..a8d768c 100644 --- a/chromeos/strings/chromeos_strings_fr-CA.xtb +++ b/chromeos/strings/chromeos_strings_fr-CA.xtb
@@ -254,6 +254,7 @@ <translation id="6472207088655375767">Phr passe usage uniq</translation> <translation id="6480327114083866287">Géré par <ph name="MANAGER" /></translation> <translation id="649050271426829538">Tâche arrêtée : bourrage de papier</translation> +<translation id="6516990319416533844">Pour évaluer la vitesse de recharge de la pile, laissez votre pile se décharger pendant une courte période</translation> <translation id="6517239166834772319">Explorer</translation> <translation id="6527081081771465939">Protocole de sécurité Wi-Fi inconnu</translation> <translation id="65587193855025101">À plat</translation>
diff --git a/chromeos/strings/chromeos_strings_gu.xtb b/chromeos/strings/chromeos_strings_gu.xtb index 403f7d8..5689696 100644 --- a/chromeos/strings/chromeos_strings_gu.xtb +++ b/chromeos/strings/chromeos_strings_gu.xtb
@@ -253,6 +253,7 @@ <translation id="6472207088655375767">OTP</translation> <translation id="6480327114083866287"><ph name="MANAGER" /> દ્વારા મેનેજ કરવામાં આવે છે</translation> <translation id="649050271426829538">બંધ - કાગળ ફસાયો</translation> +<translation id="6516990319416533844">બૅટરી ચાર્જિંગના રેટનું પરીક્ષણ કરવા માટે, થોડા સમય માટે તમારી બૅટરી વપરાવા દો</translation> <translation id="6517239166834772319">શોધખોળ કરો</translation> <translation id="6527081081771465939">વાઇ-ફાઇ સુરક્ષાનો અજાણ્યો પ્રોટોકૉલ</translation> <translation id="65587193855025101">ફ્લૅટબેડ</translation>
diff --git a/chromeos/strings/chromeos_strings_hi.xtb b/chromeos/strings/chromeos_strings_hi.xtb index 5bd4a0e6..06209837 100644 --- a/chromeos/strings/chromeos_strings_hi.xtb +++ b/chromeos/strings/chromeos_strings_hi.xtb
@@ -254,6 +254,7 @@ <translation id="6472207088655375767">एक बार इस्तेमाल होने वाला पासवर्ड (ओटीपी)</translation> <translation id="6480327114083866287"><ph name="MANAGER" /> प्रबंधित करता है</translation> <translation id="649050271426829538">बंद हो गया - काग़ज़ फंसा है</translation> +<translation id="6516990319416533844">बैटरी चार्ज होने की दर की जांच करने के लिए, बैटरी को पहले काफ़ी हद तक (पूरी नहीं) खर्च होने दें</translation> <translation id="6517239166834772319">एक्सप्लोर करें</translation> <translation id="6527081081771465939">इस वाई-फ़ाई सुरक्षा प्रोटोकॉल की जानकारी नहीं है</translation> <translation id="65587193855025101">फ़्लैटबेड</translation>
diff --git a/chromeos/strings/chromeos_strings_iw.xtb b/chromeos/strings/chromeos_strings_iw.xtb index a4af6a35..e350550 100644 --- a/chromeos/strings/chromeos_strings_iw.xtb +++ b/chromeos/strings/chromeos_strings_iw.xtb
@@ -254,6 +254,7 @@ <translation id="6472207088655375767">OTP</translation> <translation id="6480327114083866287">מנוהל על ידי <ph name="MANAGER" /></translation> <translation id="649050271426829538">הפסיקה – חסימת נייר</translation> +<translation id="6516990319416533844">כדי לבדוק את מהירות הטעינה של הסוללה, יש להמתין זמן מה שתתרוקן</translation> <translation id="6517239166834772319">מה חדש ב-Chromebook</translation> <translation id="6527081081771465939">פרוטוקול אבטחת Wi-Fi לא מזוהה</translation> <translation id="65587193855025101">שטוח</translation>
diff --git a/chromeos/strings/chromeos_strings_kk.xtb b/chromeos/strings/chromeos_strings_kk.xtb index 77d6ca26..f842e15 100644 --- a/chromeos/strings/chromeos_strings_kk.xtb +++ b/chromeos/strings/chromeos_strings_kk.xtb
@@ -253,6 +253,7 @@ <translation id="6472207088655375767">OTP</translation> <translation id="6480327114083866287"><ph name="MANAGER" /> басқарады</translation> <translation id="649050271426829538">Тоқтатылды: қағаз кептелісі</translation> +<translation id="6516990319416533844">Батареяны зарядтау жылдамдығын тексеру үшін оны қысқа уақыт пайдаланып, зарядын азайтыңыз.</translation> <translation id="6517239166834772319">Шолу</translation> <translation id="6527081081771465939">WiFi қауіпсіздік протоколы белгісіз.</translation> <translation id="65587193855025101">Планшет</translation>
diff --git a/chromeos/strings/chromeos_strings_kn.xtb b/chromeos/strings/chromeos_strings_kn.xtb index 935971b..fdfd0c6 100644 --- a/chromeos/strings/chromeos_strings_kn.xtb +++ b/chromeos/strings/chromeos_strings_kn.xtb
@@ -253,6 +253,7 @@ <translation id="6472207088655375767">OTP</translation> <translation id="6480327114083866287"><ph name="MANAGER" /> ಮೂಲಕ ನಿರ್ವಹಿಸಲಾಗಿದೆ</translation> <translation id="649050271426829538">ನಿಲ್ಲಿಸಲಾಗಿದೆ - ಪೇಪರ್ ಜಾಮ್ ಆಗಿದೆ</translation> +<translation id="6516990319416533844">ಬ್ಯಾಟರಿಯ ಚಾರ್ಜಿಂಗ್ ವೇಗವನ್ನು ಪರೀಕ್ಷಿಸಲು, ನಿಮ್ಮ ಬ್ಯಾಟರಿ ಸ್ವಲ್ಪ ಸಮಯದವರೆಗೆ ಬರಿದಾಗಲು ಬಿಡಿ</translation> <translation id="6517239166834772319">ಎಕ್ಸ್ಪ್ಲೋರ್</translation> <translation id="6527081081771465939">ಅಪರಿಚಿತ ವೈಫೈ ಸುರಕ್ಷತೆ ಪ್ರೊಟೊಕಾಲ್</translation> <translation id="65587193855025101">ಫ್ಲಾಟ್ಬೆಡ್</translation>
diff --git a/chromeos/strings/chromeos_strings_ko.xtb b/chromeos/strings/chromeos_strings_ko.xtb index 969a551..aea5b888 100644 --- a/chromeos/strings/chromeos_strings_ko.xtb +++ b/chromeos/strings/chromeos_strings_ko.xtb
@@ -254,6 +254,7 @@ <translation id="6472207088655375767">OTP</translation> <translation id="6480327114083866287"><ph name="MANAGER" />에서 관리함</translation> <translation id="649050271426829538">중지됨 - 용지 걸림</translation> +<translation id="6516990319416533844">배터리 충전 속도를 테스트하려면 짧은 시간 동안 배터리를 소모하세요.</translation> <translation id="6517239166834772319">살펴보기</translation> <translation id="6527081081771465939">알려지지 않은 Wi-Fi 보안 프로토콜입니다.</translation> <translation id="65587193855025101">평판</translation>
diff --git a/chromeos/strings/chromeos_strings_ky.xtb b/chromeos/strings/chromeos_strings_ky.xtb index 5304357..aae44db 100644 --- a/chromeos/strings/chromeos_strings_ky.xtb +++ b/chromeos/strings/chromeos_strings_ky.xtb
@@ -254,6 +254,7 @@ <translation id="6472207088655375767">OTP</translation> <translation id="6480327114083866287"><ph name="MANAGER" /> башкарат</translation> <translation id="649050271426829538">Токтоду – Кагаз чайналып калды</translation> +<translation id="6516990319416533844">Батареянын кубаттануу ылдамдыгын текшерүү үчүн анын кубатын кыска убакыттын ичинде сарптаңыз</translation> <translation id="6517239166834772319">Изилдөө</translation> <translation id="6527081081771465939">Белгисиз WiFi коопсуздук протоколу</translation> <translation id="65587193855025101">Планшет</translation>
diff --git a/chromeos/strings/chromeos_strings_lo.xtb b/chromeos/strings/chromeos_strings_lo.xtb index 23661c1..fd5e5ae 100644 --- a/chromeos/strings/chromeos_strings_lo.xtb +++ b/chromeos/strings/chromeos_strings_lo.xtb
@@ -254,6 +254,7 @@ <translation id="6472207088655375767">OTP:</translation> <translation id="6480327114083866287">ຈັດການໂດຍ <ph name="MANAGER" /></translation> <translation id="649050271426829538">ຢຸດພິມ - ເຈ້ຍຕິດ</translation> +<translation id="6516990319416533844">ເພື່ອທົດສອບອັດຕາການສາກແບັດເຕີຣີ, ໃຫ້ປ່ອຍໃຫ້ມີການໃຊ້ແບັດເຕີຣີເປັນໄລຍະເວລາສັ້ນໆ</translation> <translation id="6517239166834772319">ສຳຫຼວດ</translation> <translation id="6527081081771465939">ໂປຣໂຕຄໍຮັກສາຄວາມປອດໄພ WiFi ທີ່ບໍ່ຮູ້ຈັກ</translation> <translation id="65587193855025101">ແບບແທ່ນນອນ</translation>
diff --git a/chromeos/strings/chromeos_strings_lt.xtb b/chromeos/strings/chromeos_strings_lt.xtb index 90c4862..ac985a3 100644 --- a/chromeos/strings/chromeos_strings_lt.xtb +++ b/chromeos/strings/chromeos_strings_lt.xtb
@@ -254,6 +254,7 @@ <translation id="6472207088655375767">Vienk. slaptažodis</translation> <translation id="6480327114083866287">Tvarko <ph name="MANAGER" /></translation> <translation id="649050271426829538">Sustabdyta – įstrigęs popierius</translation> +<translation id="6516990319416533844">Norėdami patikrinti įkrovimo spartą, leiskite akumuliatoriui trumpam laikotarpiui išsikrauti</translation> <translation id="6517239166834772319">Explore</translation> <translation id="6527081081771465939">Nežinomas „Wi-Fi“ saugos protokolas</translation> <translation id="65587193855025101">Plokščiasis</translation>
diff --git a/chromeos/strings/chromeos_strings_ml.xtb b/chromeos/strings/chromeos_strings_ml.xtb index 66fbc27..8ff3221 100644 --- a/chromeos/strings/chromeos_strings_ml.xtb +++ b/chromeos/strings/chromeos_strings_ml.xtb
@@ -253,6 +253,7 @@ <translation id="6472207088655375767">OTP</translation> <translation id="6480327114083866287"><ph name="MANAGER" /> മാനേജ് ചെയ്യുന്നത്</translation> <translation id="649050271426829538">പ്രിന്റ് ജോലി നിർത്തി - പേപ്പർ ജാമായി</translation> +<translation id="6516990319416533844">ബാറ്ററിയുടെ ചാർജ് ചെയ്യൽ റേറ്റ് പരിശോധിക്കാൻ, അൽപ്പനേരം ബാറ്ററി ചാർജ് കുറയുന്നത് വരെ കാത്തിരിക്കുക</translation> <translation id="6517239166834772319">അടുത്തറിയുക</translation> <translation id="6527081081771465939">അജ്ഞാതമായ വെെഫെെ സുരക്ഷാ പ്രോട്ടോക്കോൾ</translation> <translation id="65587193855025101">ഫ്ലാറ്റ്ബെഡ്</translation>
diff --git a/chromeos/strings/chromeos_strings_ms.xtb b/chromeos/strings/chromeos_strings_ms.xtb index c181d80c..38d41b7 100644 --- a/chromeos/strings/chromeos_strings_ms.xtb +++ b/chromeos/strings/chromeos_strings_ms.xtb
@@ -254,6 +254,7 @@ <translation id="6472207088655375767">OTP</translation> <translation id="6480327114083866287">Diurus oleh <ph name="MANAGER" /></translation> <translation id="649050271426829538">Dihentikan - Kertas tersangkut</translation> +<translation id="6516990319416533844">Untuk menguji kadar pengecasan bateri, biarkan cas bateri anda habis dalam tempoh yang singkat</translation> <translation id="6517239166834772319">Teroka</translation> <translation id="6527081081771465939">Protokol keselamatan Wi-Fi tidak diketahui</translation> <translation id="65587193855025101">Dasar rata</translation>
diff --git a/chromeos/strings/chromeos_strings_my.xtb b/chromeos/strings/chromeos_strings_my.xtb index 6516dd93..9313715 100644 --- a/chromeos/strings/chromeos_strings_my.xtb +++ b/chromeos/strings/chromeos_strings_my.xtb
@@ -253,6 +253,7 @@ <translation id="6472207088655375767">OTP</translation> <translation id="6480327114083866287"><ph name="MANAGER" /> က စီမံခန့်ခွဲသည်</translation> <translation id="649050271426829538">ရပ်သွားသည် - စာရွက်ညပ်နေသည်</translation> +<translation id="6516990319416533844">ဘက်ထရီအားသွင်းနှုန်းကို စစ်ဆေးရန် ခဏတာမျှ သင့်ဘက်ထရီ အားကုန်အောင်လုပ်ပါ</translation> <translation id="6517239166834772319">စူးစမ်းလေ့လာခြင်း</translation> <translation id="6527081081771465939">အမည်မသိ WiFi လုံခြုံရေးပရိုတိုကော</translation> <translation id="65587193855025101">ပက်လက်တင်ရန်ဗန်း</translation>
diff --git a/chromeos/strings/chromeos_strings_or.xtb b/chromeos/strings/chromeos_strings_or.xtb index 44d15d1..09bae937 100644 --- a/chromeos/strings/chromeos_strings_or.xtb +++ b/chromeos/strings/chromeos_strings_or.xtb
@@ -254,6 +254,7 @@ <translation id="6472207088655375767">OTP</translation> <translation id="6480327114083866287"><ph name="MANAGER" /> ଦ୍ୱାରା ପରିଚାଳିତ ହେଉଛି</translation> <translation id="649050271426829538">ବନ୍ଦ ହୋଇଯାଇଛି - ପେପର୍ ଜାମ୍</translation> +<translation id="6516990319416533844">ବ୍ୟାଟେରୀ ଚାର୍ଜିଂ ରେଟ୍ ପରୀକ୍ଷା କରିବା ପାଇଁ ଆପଣଙ୍କ ବ୍ୟାଟେରୀକୁ ଅଳ୍ପ ସମୟ ପାଇଁ ଖାଲି ହେବାକୁ ଦିଅନ୍ତୁ</translation> <translation id="6517239166834772319">ଏକ୍ସପ୍ଲୋର୍</translation> <translation id="6527081081771465939">ଅଜଣା ୱାଇଫାଇ ସୁରକ୍ଷା ପ୍ରୋଟୋକଲ୍</translation> <translation id="65587193855025101">ଫ୍ଲାଟବେଡ୍</translation>
diff --git a/chromeos/strings/chromeos_strings_ro.xtb b/chromeos/strings/chromeos_strings_ro.xtb index ace7551..119f7eb 100644 --- a/chromeos/strings/chromeos_strings_ro.xtb +++ b/chromeos/strings/chromeos_strings_ro.xtb
@@ -254,6 +254,7 @@ <translation id="6472207088655375767">OTP</translation> <translation id="6480327114083866287">Gestionat de <ph name="MANAGER" /></translation> <translation id="649050271426829538">Oprită – Blocaj de hârtie</translation> +<translation id="6516990319416533844">Pentru a testa rata de încărcare a bateriei, lasă bateria să se descarce o scurtă perioadă de timp</translation> <translation id="6517239166834772319">Explorare</translation> <translation id="6527081081771465939">Protocol de securitate Wi-Fi necunoscut</translation> <translation id="65587193855025101">Suport plat</translation>
diff --git a/chromeos/strings/chromeos_strings_ru.xtb b/chromeos/strings/chromeos_strings_ru.xtb index 5a5bceb..b1169f06 100644 --- a/chromeos/strings/chromeos_strings_ru.xtb +++ b/chromeos/strings/chromeos_strings_ru.xtb
@@ -254,6 +254,7 @@ <translation id="6472207088655375767">Одноразовый код</translation> <translation id="6480327114083866287">Под управлением <ph name="MANAGER" /></translation> <translation id="649050271426829538">Печать прервана: застряла бумага</translation> +<translation id="6516990319416533844">Чтобы проверить скорость зарядки батареи, разрядите ее в течение короткого промежутка времени.</translation> <translation id="6517239166834772319">Возможности</translation> <translation id="6527081081771465939">Неизвестный протокол обеспечения безопасности сети Wi-Fi.</translation> <translation id="65587193855025101">Планшетный</translation>
diff --git a/chromeos/strings/chromeos_strings_ta.xtb b/chromeos/strings/chromeos_strings_ta.xtb index 53dbecf..3fc31a5 100644 --- a/chromeos/strings/chromeos_strings_ta.xtb +++ b/chromeos/strings/chromeos_strings_ta.xtb
@@ -254,6 +254,7 @@ <translation id="6472207088655375767">OTP</translation> <translation id="6480327114083866287"><ph name="MANAGER" /> நிர்வகிக்கிறது</translation> <translation id="649050271426829538">காகிதம் சிக்கிக் கொண்டதால் அச்சிட முடியவில்லை</translation> +<translation id="6516990319416533844">பேட்டரியின் சார்ஜிங் விகிதத்தைப் பரிசோதிக்க, சிறிது நேரத்திற்கு அதன் சார்ஜைக் காலி செய்யவும்</translation> <translation id="6517239166834772319">Explore</translation> <translation id="6527081081771465939">அறியப்படாத வைஃபை பாதுகாப்பு நெறிமுறை</translation> <translation id="65587193855025101">ஃபிளாட்பெட்</translation>
diff --git a/chromeos/strings/chromeos_strings_ur.xtb b/chromeos/strings/chromeos_strings_ur.xtb index 21d9412..eb54857 100644 --- a/chromeos/strings/chromeos_strings_ur.xtb +++ b/chromeos/strings/chromeos_strings_ur.xtb
@@ -253,6 +253,7 @@ <translation id="6472207088655375767">OTP</translation> <translation id="6480327114083866287"><ph name="MANAGER" /> کے زیر انتظام ہے</translation> <translation id="649050271426829538">رک گیا - پیپر جام</translation> +<translation id="6516990319416533844">بیٹری چارجنگ کی شرح ٹیسٹ کرنے کے لئے اپنی بیٹری کو تھوڑے وقفہ کے لئے ختم ہونے دیں</translation> <translation id="6517239166834772319">دریافت</translation> <translation id="6527081081771465939">نامعلوم WiFi سیکیورٹی پروٹوکول</translation> <translation id="65587193855025101">فلیٹ بیڈ</translation>
diff --git a/chromeos/strings/chromeos_strings_vi.xtb b/chromeos/strings/chromeos_strings_vi.xtb index ed54e44..a2a867ec 100644 --- a/chromeos/strings/chromeos_strings_vi.xtb +++ b/chromeos/strings/chromeos_strings_vi.xtb
@@ -254,6 +254,7 @@ <translation id="6472207088655375767">OTP</translation> <translation id="6480327114083866287">Do <ph name="MANAGER" /> quản lý</translation> <translation id="649050271426829538">Đã dừng – Kẹt giấy</translation> +<translation id="6516990319416533844">Để kiểm tra tốc độ sạc pin, hãy để pin tiêu hao trong khoảng thời gian ngắn</translation> <translation id="6517239166834772319">Khám phá</translation> <translation id="6527081081771465939">Giao thức bảo mật Wi-Fi không xác định</translation> <translation id="65587193855025101">Mặt phẳng</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-HK.xtb b/chromeos/strings/chromeos_strings_zh-HK.xtb index baaf983..a629502 100644 --- a/chromeos/strings/chromeos_strings_zh-HK.xtb +++ b/chromeos/strings/chromeos_strings_zh-HK.xtb
@@ -254,6 +254,7 @@ <translation id="6472207088655375767">動態密碼</translation> <translation id="6480327114083866287">由 <ph name="MANAGER" /> 管理</translation> <translation id="649050271426829538">已停止 - 卡紙</translation> +<translation id="6516990319416533844">如要測試充電速率,請讓電池耗電一小段時間</translation> <translation id="6517239166834772319">探索</translation> <translation id="6527081081771465939">未知的 Wi-Fi 安全通訊協定</translation> <translation id="65587193855025101">平台式</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-TW.xtb b/chromeos/strings/chromeos_strings_zh-TW.xtb index 94496e3c..3cdfb479 100644 --- a/chromeos/strings/chromeos_strings_zh-TW.xtb +++ b/chromeos/strings/chromeos_strings_zh-TW.xtb
@@ -254,6 +254,7 @@ <translation id="6472207088655375767">動態密碼</translation> <translation id="6480327114083866287">由 <ph name="MANAGER" /> 管理</translation> <translation id="649050271426829538">已停止 - 卡紙</translation> +<translation id="6516990319416533844">如要測試充電速率,請讓電池耗電一小段時間</translation> <translation id="6517239166834772319">探索</translation> <translation id="6527081081771465939">Wi-Fi 安全通訊協定不明</translation> <translation id="65587193855025101">平台式</translation>
diff --git a/components/autofill/core/browser/autofill_metrics.cc b/components/autofill/core/browser/autofill_metrics.cc index 4395fb8..ceb340b 100644 --- a/components/autofill/core/browser/autofill_metrics.cc +++ b/components/autofill/core/browser/autofill_metrics.cc
@@ -1114,24 +1114,6 @@ } // static -void AutofillMetrics::LogOfferNotificationBubbleOfferMetric(bool is_reshow) { - base::UmaHistogramBoolean( - "Autofill.OfferNotificationBubbleOffer.CardLinkedOffer", is_reshow); -} - -// static -void AutofillMetrics::LogOfferNotificationBubbleResultMetric( - OfferNotificationBubbleResultMetric metric, - bool is_reshow) { - DCHECK_LE(metric, OfferNotificationBubbleResultMetric::kMaxValue); - static const char first_show[] = - "Autofill.OfferNotificationBubbleResult.CardLinkedOffer.FirstShow"; - static const char reshows[] = - "Autofill.OfferNotificationBubbleResult.CardLinkedOffer.Reshows"; - base::UmaHistogramEnumeration(is_reshow ? reshows : first_show, metric); -} - -// static void AutofillMetrics::LogSaveCardWithFirstAndLastNameOffered(bool is_local) { std::string histogram_name = "Autofill.SaveCardWithFirstAndLastNameOffered."; histogram_name += is_local ? "Local" : "Server";
diff --git a/components/autofill/core/browser/autofill_metrics.h b/components/autofill/core/browser/autofill_metrics.h index 235e6647..26bfb36f 100644 --- a/components/autofill/core/browser/autofill_metrics.h +++ b/components/autofill/core/browser/autofill_metrics.h
@@ -262,22 +262,6 @@ NUM_SAVE_CARD_PROMPT_RESULT_METRICS, }; - // Metrics to track event when the offer notification bubble is closed. - enum class OfferNotificationBubbleResultMetric { - // These values are persisted to logs. Entries should not be renumbered and - // numeric values should never be reused. - - // The user explicitly acknowledged the bubble by clicking the ok button. - OFFER_NOTIFICATION_BUBBLE_ACKNOWLEDGED = 0, - // The user explicitly closed the prompt with the close button or ESC. - OFFER_NOTIFICATION_BUBBLE_CLOSED = 1, - // The user did not interact with the prompt. - OFFER_NOTIFICATION_BUBBLE_NOT_INTERACTED = 2, - // The prompt lost focus and was deactivated. - OFFER_NOTIFICATION_BUBBLE_LOST_FOCUS = 3, - kMaxValue = OFFER_NOTIFICATION_BUBBLE_LOST_FOCUS, - }; - enum CreditCardUploadFeedbackMetric { // The loading indicator animation which indicates uploading is in progress // is successfully shown. @@ -1133,10 +1117,6 @@ static void LogLocalCardMigrationPromptMetric( LocalCardMigrationOrigin local_card_migration_origin, LocalCardMigrationPromptMetric metric); - static void LogOfferNotificationBubbleOfferMetric(bool is_reshow); - static void LogOfferNotificationBubbleResultMetric( - OfferNotificationBubbleResultMetric metric, - bool is_reshow); // Should be called when credit card scan is finished. |duration| should be // the time elapsed between launching the credit card scanner and getting back
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb index 3091ded..abae310 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb
@@ -192,7 +192,7 @@ <translation id="6216432067784365534">خيارات <ph name="NAME_OF_LIST_ITEM" /></translation> <translation id="6262279340360821358">تم حظر <ph name="PERMISSION_1" /> و<ph name="PERMISSION_2" />.</translation> <translation id="6270391203985052864">السماح للمواقع الإلكترونية بطلب إرسال إشعارات</translation> -<translation id="6295158916970320988">جميع المواقع</translation> +<translation id="6295158916970320988">جميع المواقع الإلكترونية</translation> <translation id="6320088164292336938">اهتزاز</translation> <translation id="6388207532828177975">المحو وإعادة الضبط</translation> <translation id="6398765197997659313">إنهاء وضع ملء الشاشة</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb index e195b11b..97c7d7a 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb
@@ -23,6 +23,7 @@ <translation id="1509960214886564027">Bir çox saytdakı xüsusiyyətlər işləməyə bilər</translation> <translation id="1620510694547887537">Kamera</translation> <translation id="1644574205037202324">Tarixçə</translation> +<translation id="1647582022260550163">İcazələri sıfırlamaq, kukiləri və sayt datasını silmək istədiyinizə əminsiniz?</translation> <translation id="1660204651932907780">Saytlara səs oxutmaq icazəsi verin (məsləhətli)</translation> <translation id="1677097821151855053">Kukilər və digər sayt datası sizin yadda saxlamaq üçün istifadə edilir, məsələn, daxil olmanıza və ya reklamları fərdiləşdirməyə imkan yaradır. Bütün saytlar üçün kukiləri idarə etmək üçün <ph name="BEGIN_LINK" />Ayarlara<ph name="END_LINK" /> baxın.</translation> <translation id="1688867105868176567">Sayt datası təmizlənsin?</translation> @@ -309,6 +310,7 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> və daha <ph name="NUM_MORE" /> icazə}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> və daha <ph name="NUM_MORE" /> icazə}}</translation> <translation id="913657688200966289"><ph name="APP_NAME" /> üçün icazələri <ph name="BEGIN_LINK" />Android Ayarlarında<ph name="END_LINK" /> aktiv edin.</translation> +<translation id="930525582205581608">Bu sayt unudulsun?</translation> <translation id="965817943346481315">Sayt inadçı və ya aldadıcı reklamlar göstərirsə, blok edin (tövsiyə olunur)</translation> <translation id="967624055006145463">Yadda saxlanmış data</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb index 0fc54611e..0867725 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb
@@ -23,6 +23,7 @@ <translation id="1509960214886564027">Функцыі на многіх сайтах могуць перастаць працаваць</translation> <translation id="1620510694547887537">Камера</translation> <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="1688867105868176567">Выдаліць даныя сайта?</translation> @@ -309,6 +310,7 @@ <translation id="9074739597929991885">Bluetooth</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" />}few{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> і яшчэ <ph name="NUM_MORE" />}many{<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="930525582205581608">Забыць гэты сайт?</translation> <translation id="965817943346481315">Блакіраваць, калі сайт паказвае назойлівую рэкламу або рэкламу, якая ўводзіць у зман (рэкамендуецца)</translation> <translation id="967624055006145463">Захаваныя даныя</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb index 4b7ec5d..bb7cdd5 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb
@@ -23,6 +23,7 @@ <translation id="1509960214886564027">Paljude saitide funktsioonid ei pruugi töötada</translation> <translation id="1620510694547887537">Kaamera</translation> <translation id="1644574205037202324">Ajalugu</translation> +<translation id="1647582022260550163">Kas olete kindel, et soovite load lähtestada ning küpsisefailid ja saidi andmed kustutada?</translation> <translation id="1660204651932907780">Saitidel lubatakse esitada heli (soovitatav)</translation> <translation id="1677097821151855053">Küpsisefaile ja muid saidi andmeid kasutatakse teie meeldejätmiseks, näiteks selleks, et teid sisse logida või reklaame isikupärastada. Kõigi saitide küpsisefailide haldamiseks vaadake jaotist <ph name="BEGIN_LINK" />Seaded<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Kas soovite saidi andmed kustutada?</translation> @@ -309,6 +310,7 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ja veel <ph name="NUM_MORE" />}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ja veel <ph name="NUM_MORE" />}}</translation> <translation id="913657688200966289">Lülitage <ph name="BEGIN_LINK" />Androidi seadetes<ph name="END_LINK" /> sisse load rakendusele <ph name="APP_NAME" />.</translation> +<translation id="930525582205581608">Kas unustada see sait?</translation> <translation id="965817943346481315">Blokeeri, kui sait kuvab sekkuvaid või eksitavaid reklaame (soovitatav)</translation> <translation id="967624055006145463">Salvestatud andmete maht</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb index 67ab0e1..071ef09 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb
@@ -23,6 +23,7 @@ <translation id="1509960214886564027">Baliteke webgune askotako eginbideek ez funtzionatzea</translation> <translation id="1620510694547887537">Kamera</translation> <translation id="1644574205037202324">Historia</translation> +<translation id="1647582022260550163">Ziur baimenak berrezarri nahi dituzula, eta cookieak eta webguneetako datuak garbitu?</translation> <translation id="1660204651932907780">Baimendu webguneei soinua erreproduzitzea (gomendatua)</translation> <translation id="1677097821151855053">Cookieak eta webguneko beste datu batzuk zu gogoratzeko erabiltzen dira; adibidez, saioa hasteko edo iragarkiak pertsonalizatzeko. Webgune guztietako cookieak kudeatzeko, ikusi <ph name="BEGIN_LINK" />Ezarpenak<ph name="END_LINK" /> atala.</translation> <translation id="1688867105868176567">Webguneko datuak garbitu nahi dituzu?</translation> @@ -309,6 +310,7 @@ <translation id="9074739597929991885">Bluetooth-a</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> eta beste <ph name="NUM_MORE" />}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> eta beste <ph name="NUM_MORE" />}}</translation> <translation id="913657688200966289">Aktibatu <ph name="APP_NAME" /> aplikaziorako baimenak <ph name="BEGIN_LINK" />Android-en ezarpenetan<ph name="END_LINK" />.</translation> +<translation id="930525582205581608">Webgunea ahaztea nahi duzu?</translation> <translation id="965817943346481315">Webguneak iragarki oztopatzaileak erakusten baditu, blokea itzazu (gomendatua)</translation> <translation id="967624055006145463">Gordetako datuak</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb index 09bd9f9..6d0115b 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb
@@ -23,6 +23,7 @@ <translation id="1509960214886564027">Useiden sivustojen ominaisuudet saattavat lakata toimimasta</translation> <translation id="1620510694547887537">Kamera</translation> <translation id="1644574205037202324">Historia</translation> +<translation id="1647582022260550163">Haluatko varmasti nollata luvat sekä tyhjentää evästeet ja sivustodatan?</translation> <translation id="1660204651932907780">Salli sivustojen toistaa ääniä (suositus)</translation> <translation id="1677097821151855053">Evästeillä ja muulla sivustodatalla tunnistetaan sinut, jotta voit esimerkiksi kirjautua sisään tai nähdä personoituja mainoksia. Jos haluat ylläpitää kaikkien sivustojen evästeitä, siirry <ph name="BEGIN_LINK" />Asetuksiin<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Tyhjennetäänkö sivustotiedot?</translation> @@ -309,6 +310,7 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ja <ph name="NUM_MORE" /> muuta}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ja <ph name="NUM_MORE" /> muuta}}</translation> <translation id="913657688200966289">Laita luvat (<ph name="APP_NAME" />) päälle <ph name="BEGIN_LINK" />Androidin asetuksista<ph name="END_LINK" />.</translation> +<translation id="930525582205581608">Unohdetaanko tämä sivusto?</translation> <translation id="965817943346481315">Estä, jos sivusto näyttää häiritseviä tai harhaanjohtavia mainoksia (suositus)</translation> <translation id="967624055006145463">Tallennettu data</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb index 2e06d46..d4573b70 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb
@@ -23,6 +23,7 @@ <translation id="1509960214886564027">Des fonctionnalités sur de nombreux sites risquent de ne pas fonctionner</translation> <translation id="1620510694547887537">Caméra</translation> <translation id="1644574205037202324">Historique</translation> +<translation id="1647582022260550163">Voulez-vous vraiment réinitialiser les autorisations, ainsi que supprimer les témoins et les données de ce site?</translation> <translation id="1660204651932907780">Autoriser les sites à faire jouer du son (recommandé)</translation> <translation id="1677097821151855053">Les témoins et les autres données de sites sont utilisés pour se souvenir de vous. Par exemple : pour vous connecter à votre compte ou pour personnaliser les annonces. Pour gérer les témoins pour tous les sites, reportez-vous au menu <ph name="BEGIN_LINK" />Paramètres<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Effacer les données du site?</translation> @@ -309,6 +310,7 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> et <ph name="NUM_MORE" /> autre}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> et <ph name="NUM_MORE" /> autre}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> et <ph name="NUM_MORE" /> autres}}</translation> <translation id="913657688200966289">Vous pouvez activer les autorisations pour <ph name="APP_NAME" /> dans les <ph name="BEGIN_LINK" />paramètres d'Android<ph name="END_LINK" />.</translation> +<translation id="930525582205581608">Oublier ce site?</translation> <translation id="965817943346481315">Bloquer si le site diffuse des annonces intrusives ou trompeuses (recommandé)</translation> <translation id="967624055006145463">Données stockées</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb index cf9a5118..8b08c11 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb
@@ -23,6 +23,7 @@ <translation id="1509960214886564027">ઘણી સાઇટ પરની સુવિધાઓને કદાચ બંધ કરવામાં આવી શકે</translation> <translation id="1620510694547887537">કૅમેરો</translation> <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="1688867105868176567">સાઇટનો ડેટા સાફ કરીએ?</translation> @@ -309,6 +310,7 @@ <translation id="9074739597929991885">બ્લૂટૂથ</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="BEGIN_LINK" />Android સેટિંગ<ph name="END_LINK" />માં <ph name="APP_NAME" /> માટે પરવાનગીઓ ચાલુ કરો.</translation> +<translation id="930525582205581608">આ સાઇટને ભૂલી જઈએ?</translation> <translation id="965817943346481315">જો સાઇટ ઘૃણાસ્પદ અથવા ભ્રામક જાહેરાતો બતાવતી હોય, તો બ્લૉક કરો (ભલામણ કરેલ)</translation> <translation id="967624055006145463">સ્ટોર કરેલ ડેટા</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb index 6f62a694..463c99f3 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb
@@ -23,6 +23,7 @@ <translation id="1509960214886564027">शायद कई साइटों पर सुविधाएं ठीक से काम न करें</translation> <translation id="1620510694547887537">कैमरा</translation> <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="1688867105868176567">'साइट डेटा' हटाएं?</translation> @@ -309,6 +310,7 @@ <translation id="9074739597929991885">ब्लूटूथ</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="BEGIN_LINK" />Android की सेटिंग<ph name="END_LINK" /> में जाकर, <ph name="APP_NAME" /> के लिए अनुमतियां चालू करें.</translation> +<translation id="930525582205581608">क्या आप इस साइट की सेव की गई जानकारी मिटाना चाहते हैं?</translation> <translation id="965817943346481315">अगर साइट तंग करने वाले या गुमराह करने वाले विज्ञापन दिखाई देते हैं, तो उन्हें ब्लॉक करें (सुझाव)</translation> <translation id="967624055006145463">डेटा संग्रहित किया गया</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb index bf60bc65..2742a95 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb
@@ -23,6 +23,7 @@ <translation id="1509960214886564027">ייתכן שהתכונות של חלק גדול מהאתרים לא יפעלו כראוי</translation> <translation id="1620510694547887537">מצלמה</translation> <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="1688867105868176567">למחוק את נתוני האתר?</translation> @@ -309,6 +310,7 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ועוד הרשאה אחת (<ph name="NUM_MORE" />)}two{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ועוד <ph name="NUM_MORE" />}many{<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="930525582205581608">לשכוח את האתר הזה?</translation> <translation id="965817943346481315">חסימה אם באתר מוצגות מודעות מפריעות או מטעות (מומלץ)</translation> <translation id="967624055006145463">נפח הנתונים</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb index 584a76d..f1ba883c 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb
@@ -23,6 +23,7 @@ <translation id="1509960214886564027">Көптеген сайттағы функциялар дұрыс жұмыс істемеуі мүмкін.</translation> <translation id="1620510694547887537">Камера</translation> <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="1688867105868176567">Сайт деректері өшірілсін бе?</translation> @@ -309,6 +310,7 @@ <translation id="9074739597929991885">Bluetooth</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> +<translation id="930525582205581608">Бұл сайт ұмытылсын ба?</translation> <translation id="965817943346481315">Сайт мазалайтын немесе жалған ақпаратты жарнамалар көрсеткен жағдайда бөгеу (ұсынылады)</translation> <translation id="967624055006145463">Сақталған деректер</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb index 620f8392..6790a3c6 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb
@@ -23,6 +23,7 @@ <translation id="1509960214886564027">ಹಲವು ಸೈಟ್ಗಳಲ್ಲಿನ ಫೀಚರ್ಗಳು ಕಾರ್ಯನಿರ್ವಹಿಸುವುದನ್ನು ನಿಲ್ಲಿಸಬಹುದು</translation> <translation id="1620510694547887537">ಕ್ಯಾಮರಾ</translation> <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="1688867105868176567">ಸೈಟ್ ಡೇಟಾವನ್ನು ತೆರವುಗೊಳಿಸಬೇಕೇ?</translation> @@ -309,6 +310,7 @@ <translation id="9074739597929991885">ಬ್ಲೂಟೂತ್</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="BEGIN_LINK" />Android ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ<ph name="END_LINK" /> <ph name="APP_NAME" /> ಗಾಗಿ ಅನುಮತಿಗಳನ್ನು ಆನ್ ಮಾಡಿ.</translation> +<translation id="930525582205581608">ಈ ಸೈಟ್ ಅನ್ನು ಮರೆಯುವುದೇ?</translation> <translation id="965817943346481315">ಅತಿಕ್ರಮಣಕಾರಿಯಾಗಿರುವ ಅಥವಾ ತಪ್ಪುದಾರಿಗೆಳೆಯುವ ಜಾಹೀರಾತುಗಳನ್ನು ಸೈಟ್ ತೋರಿಸಿದರೆ ಅದನ್ನು ನಿರ್ಬಂಧಿಸಿ (ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ)</translation> <translation id="967624055006145463">ಸಂಗ್ರಹಣೆ ಮಾಡಿರುವ ಡೇಟಾ</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb index 2606dbd..1626cb1 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb
@@ -23,6 +23,7 @@ <translation id="1509960214886564027">다수의 사이트에서 기능이 작동하지 않을 수 있음</translation> <translation id="1620510694547887537">카메라</translation> <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="1688867105868176567">사이트 데이터를 삭제하시겠습니까?</translation> @@ -309,6 +310,7 @@ <translation id="9074739597929991885">블루투스</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="BEGIN_LINK" />Android 설정<ph name="END_LINK" />에서 <ph name="APP_NAME" /> 관련 권한을 허용하세요.</translation> +<translation id="930525582205581608">사이트 데이터를 삭제하시겠습니까?</translation> <translation id="965817943346481315">사이트에서 방해가 되거나 사용자를 현혹하는 광고를 표시하는 경우 광고 차단(권장)</translation> <translation id="967624055006145463">저장된 데이터</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb index 2204a16..5e1a606 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb
@@ -23,6 +23,7 @@ <translation id="1509960214886564027">Функциялар көпчүлүк сайттарда туура иштебеши мүмкүн.</translation> <translation id="1620510694547887537">Камера</translation> <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="1688867105868176567">Сайттын дайындары тазалансынбы?</translation> @@ -309,6 +310,7 @@ <translation id="9074739597929991885">Bluetooth</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> +<translation id="930525582205581608">Бул сайт унутулсунбу?</translation> <translation id="965817943346481315">Эгер сайт тажатма же адаштыруучу жарнамаларды көрсөтүп баштаса, бөгөттөлсүн (сунушталат)</translation> <translation id="967624055006145463">Сакталган дайындар</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb index 4a0d94c..f88dcd6 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb
@@ -23,6 +23,7 @@ <translation id="1509960214886564027">ຄຸນສົມບັດໃນຫຼາຍໆເວັບໄຊອາດຈະໃຊ້ບໍ່ໄດ້</translation> <translation id="1620510694547887537">ກ້ອງຖ່າຍຮູບ</translation> <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="1688867105868176567">ລຶບລ້າງຂໍ້ມູນເວັບໄຊບໍ?</translation> @@ -309,6 +310,7 @@ <translation id="9074739597929991885">Bluetooth</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> +<translation id="930525582205581608">ລືມເວັບໄຊນີ້ບໍ?</translation> <translation id="965817943346481315">ບລັອກຖ້າເວັບໄຊສະແດງໂຄສະນາທີ່ລົບກວນ ຫຼື ຫຼອກລວງ (ແນະນຳ)</translation> <translation id="967624055006145463">ເກັບຂໍ້ມູນໄວ້ແລ້ວ</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb index 80e34c5..e26b0a4 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb
@@ -23,6 +23,7 @@ <translation id="1509960214886564027">Funkcijos gali neveikti daugybėje svetainių.</translation> <translation id="1620510694547887537">Kamera</translation> <translation id="1644574205037202324">Istorija</translation> +<translation id="1647582022260550163">Ar tikrai norite nustatyti leidimus iš naujo ir išvalyti slapukus bei svetainių duomenis?</translation> <translation id="1660204651932907780">Leisti svetainėms leisti garsą (rekomenduojama)</translation> <translation id="1677097821151855053">Slapukai ir kiti svetainės duomenys naudojami siekiant jus prisiminti, pvz., prisijungiant ar suasmeninant skelbimus. Norėdami tvarkyti visų svetainių slapukus, žr. skiltį <ph name="BEGIN_LINK" />„Nustatymai“<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Išvalyti svetainės duomenis?</translation> @@ -309,6 +310,7 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ir dar <ph name="NUM_MORE" />}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ir dar <ph name="NUM_MORE" />}few{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ir dar <ph name="NUM_MORE" />}many{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ir dar <ph name="NUM_MORE" />}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ir dar <ph name="NUM_MORE" />}}</translation> <translation id="913657688200966289">Įjunkite „<ph name="APP_NAME" />“ leidimus <ph name="BEGIN_LINK" />„Android“ nustatymuose<ph name="END_LINK" />.</translation> +<translation id="930525582205581608">Pamiršti šią svetainę?</translation> <translation id="965817943346481315">Blokuoti, jei svetainėje rodomi nepageidaujami arba klaidinantys skelbimai (rekomenduojama)</translation> <translation id="967624055006145463">Saugomi duomenys</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb index 33a82a8b..2aa1c95 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb
@@ -23,6 +23,7 @@ <translation id="1509960214886564027">നിരവധി സൈറ്റുകളിലെ ഫീച്ചറുകൾക്ക് പ്രവർത്തനം നടത്താനായേക്കില്ല</translation> <translation id="1620510694547887537">ക്യാമറ</translation> <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="1688867105868176567">സൈറ്റ് ഡാറ്റ മായ്ക്കണോ?</translation> @@ -309,6 +310,7 @@ <translation id="9074739597929991885">Bluetooth</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="BEGIN_LINK" />Android ക്രമീകരണത്തിൽ<ph name="END_LINK" /> <ph name="APP_NAME" /> ആപ്പിനായി അനുമതികൾ ഓണാക്കുക.</translation> +<translation id="930525582205581608">ഈ സൈറ്റ് മറക്കണോ?</translation> <translation id="965817943346481315">സൈറ്റ്, അനാവശ്യമോ തെറ്റിദ്ധരിപ്പിക്കുന്നതോ ആയ പരസ്യങ്ങള് കാണിക്കുന്നുണ്ടെങ്കില് ബ്ലോക്ക് ചെയ്യുക (ശുപാര്ശ ചെയ്യുന്നു)</translation> <translation id="967624055006145463">ഡാറ്റ സംഭരിച്ചു</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb index 196fd13e..1d93ba77 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb
@@ -23,6 +23,7 @@ <translation id="1509960214886564027">Ciri pada banyak tapak mungkin rosak</translation> <translation id="1620510694547887537">Kamera</translation> <translation id="1644574205037202324">Sejarah</translation> +<translation id="1647582022260550163">Adakah anda pasti mahu menetapkan semula kebenaran dan mengosongkan kuki serta data laman?</translation> <translation id="1660204651932907780">Benarkan tapak untuk memainkan bunyi (disyorkan)</translation> <translation id="1677097821151855053">Kuki dan data tapak lain digunakan untuk mengingat anda, misalnya untuk log anda masuk atau memperibadikan iklan. Untuk mengurus kuki bagi semua tapak, lihat <ph name="BEGIN_LINK" />Tetapan<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Kosongkan data tapak?</translation> @@ -309,6 +310,7 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> dan <ph name="NUM_MORE" /> lagi}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> dan <ph name="NUM_MORE" /> lagi}}</translation> <translation id="913657688200966289">Hidupkan kebenaran untuk <ph name="APP_NAME" /> dalam <ph name="BEGIN_LINK" />Tetapan Android<ph name="END_LINK" />.</translation> +<translation id="930525582205581608">Lupakan laman ini?</translation> <translation id="965817943346481315">Sekat jika tapak menyiarkan iklan yang mengganggu atau mengelirukan (disyorkan)</translation> <translation id="967624055006145463">Data disimpan</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb index b33a085..e65d8310 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb
@@ -23,6 +23,7 @@ <translation id="1509960214886564027">ဝဘ်ဆိုက်အတော်များများရှိ ဝန်ဆောင်မှုများ ရပ်သွားနိုင်သည်</translation> <translation id="1620510694547887537">ကင်မရာ</translation> <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="1688867105868176567">ဝဘ်ဆိုက်ဒေတာများကို ရှင်းလင်းလိုပါသလား။</translation> @@ -309,6 +310,7 @@ <translation id="9074739597929991885">ဘလူးတုသ်</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="BEGIN_LINK" />Android ဆက်တင်များ<ph name="END_LINK" /> တွင် <ph name="APP_NAME" /> အတွက် ခွင့်ပြုချက်များကို ဖွင့်ပါ။</translation> +<translation id="930525582205581608">ဤဝဘ်ဆိုက်ကို မေ့ပစ်မလား။</translation> <translation id="965817943346481315">စိတ်အနှောင့်အယှက်ဖြစ်စေသော (သို့) အထင်အမြင်မှားစေသော ကြော်ငြာများ ပြလျှင် ဝဘ်ဆိုက်ကို ပိတ်သည် (အကြံပြုထားသည်)</translation> <translation id="967624055006145463">သိမ်းဆည်းထားသည့် ဒေတာ</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb index b2fe97f..9028619 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb
@@ -23,6 +23,7 @@ <translation id="1509960214886564027">କିଛି ସାଇଟରେ ଫିଚରଗୁଡ଼ିକ ଠିକ୍ ଭାବେ କାମ କରିନପାରେ</translation> <translation id="1620510694547887537">କ୍ୟାମେରା</translation> <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="1688867105868176567">ସାଇଟ୍ ଡାଟା ଖାଲି କରିବେ?</translation> @@ -309,6 +310,7 @@ <translation id="9074739597929991885">ବ୍ଲୁଟୁଥ୍</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="BEGIN_LINK" />Android ସେଟିଂସ<ph name="END_LINK" />ରେ <ph name="APP_NAME" /> ପାଇଁ ଅନୁମତି ଚାଲୁ କରନ୍ତୁ।</translation> +<translation id="930525582205581608">ଏହି ସାଇଟ୍ ସମ୍ବନ୍ଧିତ ଡାଟା ଖାଲି କରିବେ କି?</translation> <translation id="965817943346481315">ଯଦି ସାଇଟ୍ ଅନଧିକାର ପ୍ରବେଶ କରିଥିବା କିମ୍ବା ବିଭ୍ରାନ୍ତିକର ବିଜ୍ଞାପନ ଦେଖାଉଛି, ତେବେ ବ୍ଲକ୍ କରନ୍ତୁ(ସୁପାରିଶ୍ କରାଯାଇଛି)</translation> <translation id="967624055006145463">ଡାଟା ଷ୍ଟୋର୍ କରାଯାଇଛି</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb index a69b36b..d2975c04 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb
@@ -23,6 +23,7 @@ <translation id="1509960214886564027">Este posibil ca funcțiile de pe mai multe site-uri să fie întrerupte</translation> <translation id="1620510694547887537">Cameră</translation> <translation id="1644574205037202324">Istoric</translation> +<translation id="1647582022260550163">Sigur vrei să resetezi permisiunile și să ștergi cookie-urile și datele privind site-ul?</translation> <translation id="1660204651932907780">Permite site-urilor să redea sunet (recomandat)</translation> <translation id="1677097821151855053">Cookie-urile și alte date ale site-urilor sunt folosite pentru a te reține, de exemplu, pentru a te conecta sau pentru a personaliza anunțuri. Pentru a gestiona cookie-urile pentru toate site-urile, consultă <ph name="BEGIN_LINK" />Setări<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Ștergi datele site-ului?</translation> @@ -309,6 +310,7 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> și încă <ph name="NUM_MORE" />}few{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> și încă <ph name="NUM_MORE" />}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> și încă <ph name="NUM_MORE" />}}</translation> <translation id="913657688200966289">Activează permisiunile pentru <ph name="APP_NAME" /> din <ph name="BEGIN_LINK" />Setări Android<ph name="END_LINK" />.</translation> +<translation id="930525582205581608">Elimini acest site?</translation> <translation id="965817943346481315">Blochează dacă site-ul afișează anunțuri deranjante sau înșelătoare (recomandat)</translation> <translation id="967624055006145463">Date stocate</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb index 8251432..62a40cc 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb
@@ -23,6 +23,7 @@ <translation id="1509960214886564027">Многие функции на сайтах могут работать некорректно</translation> <translation id="1620510694547887537">Камера</translation> <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="1688867105868176567">Удалить данные сайта?</translation> @@ -309,6 +310,7 @@ <translation id="9074739597929991885">Bluetooth</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" />}few{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и ещё <ph name="NUM_MORE" />}many{<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="930525582205581608">Удалить этот сайт?</translation> <translation id="965817943346481315">Блокировать, если сайт показывает навязчивую или вводящую в заблуждение рекламу (рекомендуется)</translation> <translation id="967624055006145463">Объем памяти</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb index 723ef1b..b1d5a5f 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb
@@ -23,6 +23,7 @@ <translation id="1509960214886564027">பெரும்பாலான தளங்களிலுள்ள அம்சங்கள் செயல்படாமல் போகக்கூடும்</translation> <translation id="1620510694547887537">கேமரா</translation> <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="1688867105868176567">தளத் தரவை அழிக்கவா?</translation> @@ -309,6 +310,7 @@ <translation id="9074739597929991885">புளூடூத்</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="BEGIN_LINK" />Android அமைப்புகளில் <ph name="END_LINK" /> <ph name="APP_NAME" /> ஆப்ஸுக்கான அனுமதிகளை இயக்கவும்.</translation> +<translation id="930525582205581608">இந்தத் தளத்தை அகற்றவா?</translation> <translation id="965817943346481315">குறுக்கிடும் அல்லது தவறாக வழிநடத்தும் விளம்பரங்களை தளம் காண்பித்தால், அதைத் தடு (பரிந்துரைக்கப்படுவது)</translation> <translation id="967624055006145463">சேமிக்கப்பட்ட தரவின்படி</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ur.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ur.xtb index e7afbec3..ba91e901 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ur.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ur.xtb
@@ -23,6 +23,7 @@ <translation id="1509960214886564027">بہت سی سائٹس پر خصوصیات میں خلل ہو سکتا ہے</translation> <translation id="1620510694547887537">کیمرا</translation> <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="1688867105868176567">سائٹ کا ڈیٹا صاف کریں؟</translation> @@ -309,6 +310,7 @@ <translation id="9074739597929991885">بلوٹوتھ</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="BEGIN_LINK" />Android ترتیبات<ph name="END_LINK" /> میں <ph name="APP_NAME" /> کے لیے اجازتیں آن کریں۔</translation> +<translation id="930525582205581608">اس سائٹ کو بھول جائیں؟</translation> <translation id="965817943346481315">اگر سائٹ دخل انداز یا گمراہ کن اشتہارات دکھاتی ہے تو مسدود کریں (تجویز کردہ)</translation> <translation id="967624055006145463">اسٹور کردہ ڈیٹا</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb index eade19f..9e30ec6 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb
@@ -23,6 +23,7 @@ <translation id="1509960214886564027">Các tính năng trên nhiều trang web có thể hoạt động không đúng cách</translation> <translation id="1620510694547887537">Máy ảnh</translation> <translation id="1644574205037202324">Lịch sử</translation> +<translation id="1647582022260550163">Bạn có chắc chắn muốn đặt lại quyền, xóa cookie và dữ liệu trang web không?</translation> <translation id="1660204651932907780">Cho phép các trang web phát âm thanh (được đề xuất)</translation> <translation id="1677097821151855053">Cookie và dữ liệu trang web khác được dùng để ghi nhớ bạn, chẳng hạn như giúp bạn đăng nhập hoặc cá nhân hóa quảng cáo. Để quản lý cookie cho tất cả trang web, hãy xem phần <ph name="BEGIN_LINK" />Cài đặt<ph name="END_LINK" />.</translation> <translation id="1688867105868176567">Xóa dữ liệu trang web?</translation> @@ -309,6 +310,7 @@ <translation id="9074739597929991885">Bluetooth</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> và <ph name="NUM_MORE" /> quyền khác}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> và <ph name="NUM_MORE" /> quyền khác}}</translation> <translation id="913657688200966289">Bật quyền cho <ph name="APP_NAME" /> trong phần <ph name="BEGIN_LINK" />Cài đặt Android<ph name="END_LINK" />.</translation> +<translation id="930525582205581608">Xóa trang web này?</translation> <translation id="965817943346481315">Chặn nếu trang web hiển thị quảng cáo xâm nhập hoặc quảng cáo gây hiểu nhầm (khuyên dùng)</translation> <translation id="967624055006145463">Dữ liệu đã lưu trữ</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb index 6853edc4..b3f34f3b 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb
@@ -23,6 +23,7 @@ <translation id="1509960214886564027">很多網站的功能可能會無法正常運作</translation> <translation id="1620510694547887537">相機</translation> <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="1688867105868176567">要清除網站資料嗎?</translation> @@ -309,6 +310,7 @@ <translation id="9074739597929991885">藍牙</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="BEGIN_LINK" />Android 設定<ph name="END_LINK" />中為 <ph name="APP_NAME" /> 啟用這些權限。</translation> +<translation id="930525582205581608">要清除此網站的資料嗎?</translation> <translation id="965817943346481315">封鎖顯示滋擾性或誤導廣告網站上的廣告 (建議)</translation> <translation id="967624055006145463">已儲存的資料</translation> </translationbundle> \ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb index 350dbdb..4b024c54 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb
@@ -23,6 +23,7 @@ <translation id="1509960214886564027">許多網站的功能可能無法正常運作</translation> <translation id="1620510694547887537">攝影機</translation> <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="1688867105868176567">要清除網站資料嗎?</translation> @@ -309,6 +310,7 @@ <translation id="9074739597929991885">藍牙</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="BEGIN_LINK" />Android 設定<ph name="END_LINK" />中啟用「<ph name="APP_NAME" />」的權限。</translation> +<translation id="930525582205581608">要清除這個網站的資料嗎?</translation> <translation id="965817943346481315">封鎖干擾性或誤導性的網站廣告 (建議)</translation> <translation id="967624055006145463">已儲存的資料</translation> </translationbundle> \ No newline at end of file
diff --git a/components/crash/content/browser/crash_metrics_reporter_android_unittest.cc b/components/crash/content/browser/crash_metrics_reporter_android_unittest.cc index 086504d..faf6c68a 100644 --- a/components/crash/content/browser/crash_metrics_reporter_android_unittest.cc +++ b/components/crash/content/browser/crash_metrics_reporter_android_unittest.cc
@@ -78,6 +78,7 @@ histogram_name, CrashMetricsReporter::EMPTY_MINIDUMP_WHILE_RUNNING, 1); } + CrashMetricsReporter::GetInstance()->RemoveObserver(&crash_dump_observer); } private: @@ -181,6 +182,7 @@ EXPECT_EQ(CrashMetricsReporter::ReportedCrashTypeSet( {CrashMetricsReporter::ProcessedCrashCounts::kUtilityCrashAll}), crash_dump_observer.recorded_crash_types()); + CrashMetricsReporter::GetInstance()->RemoveObserver(&crash_dump_observer); } TEST_F(CrashMetricsReporterTest, RendererSubframeOOM) { @@ -334,6 +336,7 @@ kRendererForegroundVisibleCrash, CrashMetricsReporter::ProcessedCrashCounts::kRendererCrashAll}), crash_dump_observer.recorded_crash_types()); + CrashMetricsReporter::GetInstance()->RemoveObserver(&crash_dump_observer); } } // namespace crash_reporter
diff --git a/components/omnibox/browser/autocomplete_input.cc b/components/omnibox/browser/autocomplete_input.cc index 41cca6e..066d078 100644 --- a/components/omnibox/browser/autocomplete_input.cc +++ b/components/omnibox/browser/autocomplete_input.cc
@@ -78,6 +78,16 @@ } } +bool HasScheme(const base::string16& input, const char* scheme) { + std::string utf8_input(base::UTF16ToUTF8(input)); + url::Component view_source_scheme; + if (url::FindAndCompareScheme(utf8_input, kViewSourceScheme, + &view_source_scheme)) { + utf8_input.erase(0, view_source_scheme.end() + 1); + } + return url::FindAndCompareScheme(utf8_input, scheme, nullptr); +} + } // namespace AutocompleteInput::AutocompleteInput() @@ -613,12 +623,12 @@ // static bool AutocompleteInput::HasHTTPScheme(const base::string16& input) { - std::string utf8_input(base::UTF16ToUTF8(input)); - url::Component scheme; - if (url::FindAndCompareScheme(utf8_input, kViewSourceScheme, &scheme)) { - utf8_input.erase(0, scheme.end() + 1); - } - return url::FindAndCompareScheme(utf8_input, url::kHttpScheme, nullptr); + return HasScheme(input, url::kHttpScheme); +} + +// static +bool AutocompleteInput::HasHTTPSScheme(const base::string16& input) { + return HasScheme(input, url::kHttpsScheme); } void AutocompleteInput::UpdateText(const base::string16& text,
diff --git a/components/omnibox/browser/autocomplete_input.h b/components/omnibox/browser/autocomplete_input.h index 08dccc6..31c6910 100644 --- a/components/omnibox/browser/autocomplete_input.h +++ b/components/omnibox/browser/autocomplete_input.h
@@ -114,9 +114,12 @@ // Returns the number of non-empty components in |parts| besides the host. static int NumNonHostComponents(const url::Parsed& parts); - // Returns whether |text| begins "http:" or "view-source:http:". + // Returns whether |text| begins with "http:" or "view-source:http:". static bool HasHTTPScheme(const base::string16& text); + // Returns whether |text| begins with "https:" or "view-source:https:". + static bool HasHTTPSScheme(const base::string16& text); + // User-provided text to be completed. const base::string16& text() const { return text_; }
diff --git a/components/omnibox/browser/autocomplete_provider.cc b/components/omnibox/browser/autocomplete_provider.cc index b2eb777e4..ac3a7e87 100644 --- a/components/omnibox/browser/autocomplete_provider.cc +++ b/components/omnibox/browser/autocomplete_provider.cc
@@ -206,9 +206,12 @@ } base::string16 output(base::UTF8ToUTF16(canonical_gurl_str)); // Don't prepend a scheme when the user didn't have one. Since the fixer - // upper only prepends the "http" scheme, that's all we need to check for. + // upper only prepends the "http" scheme that's all we need to check for. + // Note that even if Defaulting Typed Omnibox Navigations to HTTPS feature is + // enabled, the https upgrade is done in AutocompleteInput::Parse() and not + // in the fixer upper, so we don't need to check for that case. if (!AutocompleteInput::HasHTTPScheme(input_text)) - TrimHttpPrefix(&output); + TrimSchemePrefix(&output, /*trim_https=*/false); // Make the number of trailing slashes on the output exactly match the input. // Examples of why not doing this would matter: @@ -250,16 +253,19 @@ } // static -size_t AutocompleteProvider::TrimHttpPrefix(base::string16* url) { - // Find any "http:". - if (!AutocompleteInput::HasHTTPScheme(*url)) +size_t AutocompleteProvider::TrimSchemePrefix(base::string16* url, + bool trim_https) { + // Find any "http:" or "https:". + if (trim_https && !AutocompleteInput::HasHTTPSScheme(*url)) return 0; - size_t scheme_pos = - url->find(base::ASCIIToUTF16(url::kHttpScheme) + char16_t(':')); + if (!trim_https && !AutocompleteInput::HasHTTPScheme(*url)) + return 0; + const char* scheme = trim_https ? url::kHttpsScheme : url::kHttpScheme; + size_t scheme_pos = url->find(base::ASCIIToUTF16(scheme) + char16_t(':')); DCHECK_NE(base::string16::npos, scheme_pos); // Erase scheme plus up to two slashes. - size_t prefix_end = scheme_pos + strlen(url::kHttpScheme) + 1; + size_t prefix_end = scheme_pos + strlen(scheme) + 1; const size_t after_slashes = std::min(url->length(), prefix_end + 2); while ((prefix_end < after_slashes) && ((*url)[prefix_end] == '/')) ++prefix_end;
diff --git a/components/omnibox/browser/autocomplete_provider.h b/components/omnibox/browser/autocomplete_provider.h index 4434ee1..feb3d15 100644 --- a/components/omnibox/browser/autocomplete_provider.h +++ b/components/omnibox/browser/autocomplete_provider.h
@@ -341,11 +341,12 @@ // string unconditionally. static FixupReturn FixupUserInput(const AutocompleteInput& input); - // Trims "http:" and up to two subsequent slashes from |url|. Returns the + // Trims "http:" or "https:" and up to two subsequent slashes from |url|. If + // |trim_https| is true, trims "https:", otherwise trims "http:". Returns the // number of characters that were trimmed. // NOTE: For a view-source: URL, this will trim from after "view-source:" and // return 0. - static size_t TrimHttpPrefix(base::string16* url); + static size_t TrimSchemePrefix(base::string16* url, bool trim_https); const size_t provider_max_matches_;
diff --git a/components/omnibox/browser/history_url_provider.cc b/components/omnibox/browser/history_url_provider.cc index e9549d4a..e49f886e 100644 --- a/components/omnibox/browser/history_url_provider.cc +++ b/components/omnibox/browser/history_url_provider.cc
@@ -624,7 +624,7 @@ AutocompleteMatch HistoryURLProvider::SuggestExactInput( const AutocompleteInput& input, const GURL& destination_url, - bool trim_http) { + bool trim_default_scheme) { // The FormattedStringWithEquivalentMeaning() call below requires callers to // be on the main thread. DCHECK(thread_checker_.CalledOnValidThread()); @@ -634,17 +634,29 @@ if (destination_url.is_valid()) { match.destination_url = destination_url; + // If the input explicitly contains "http://" or "https://", callers must + // set |trim_default_scheme| to false. Otherwise, |trim_default_scheme| may + // be either true or false. + if (input.added_default_scheme_to_typed_url()) { + DCHECK(!(trim_default_scheme && + AutocompleteInput::HasHTTPSScheme(input.text()))); + } else { + DCHECK(!(trim_default_scheme && + AutocompleteInput::HasHTTPScheme(input.text()))); + } + const url_formatter::FormatUrlType format_type = + input.added_default_scheme_to_typed_url() + ? url_formatter::kFormatUrlOmitHTTPS + : url_formatter::kFormatUrlOmitHTTP; - // If the input explicitly contains "http://", callers must set |trim_http| - // to false. Otherwise, |trim_http| may be either true or false. - DCHECK(!(trim_http && AutocompleteInput::HasHTTPScheme(input.text()))); base::string16 display_string(url_formatter::FormatUrl( - destination_url, - url_formatter::kFormatUrlOmitDefaults & - ~url_formatter::kFormatUrlOmitHTTP, + destination_url, url_formatter::kFormatUrlOmitDefaults & ~format_type, net::UnescapeRule::SPACES, nullptr, nullptr, nullptr)); - if (trim_http) - TrimHttpPrefix(&display_string); + if (trim_default_scheme) { + TrimSchemePrefix(&display_string, + input.added_default_scheme_to_typed_url()); + } + match.fill_into_edit = AutocompleteInput::FormattedStringWithEquivalentMeaning( destination_url, display_string, client()->GetSchemeClassifier(),
diff --git a/components/omnibox/browser/history_url_provider.h b/components/omnibox/browser/history_url_provider.h index 3d9ccfd..2bb9f35 100644 --- a/components/omnibox/browser/history_url_provider.h +++ b/components/omnibox/browser/history_url_provider.h
@@ -209,16 +209,17 @@ size_t EstimateMemoryUsage() const override; // Returns a match representing a navigation to |destination_url|, highlighted - // appropriately against |input|. |trim_http| controls whether the match's - // |fill_into_edit| and |contents| should have any HTTP stripped off, and - // should not be set to true if the user's original input contains an http - // prefix. + // appropriately against |input|. |trim_default_scheme| controls whether the + // match's |fill_into_edit| and |contents| should have the scheme (http or + // https only) stripped off, and should not be set to true if the user's + // original input contains the scheme. The default scheme is https if |input| + // is upgraded to https, otherwise it's http. // NOTES: This does not set the relevance of the returned match, as different // callers want different behavior. Callers must set this manually. // This function should only be called on the UI thread. AutocompleteMatch SuggestExactInput(const AutocompleteInput& input, const GURL& destination_url, - bool trim_http); + bool trim_default_scheme); // Runs the history query on the history thread, called by the history // system. The history database MAY BE NULL in which case it is not
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestService.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestService.java index 8cf944c6..dfaa00b 100644 --- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestService.java +++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestService.java
@@ -708,8 +708,6 @@ for (String method : invokedPaymentApp.getInstrumentMethodNames()) { if (method.equals(MethodStrings.ANDROID_PAY) || method.equals(MethodStrings.GOOGLE_PAY)) { - // TODO(crbug.com/1183977): assert the type after correcting - // GooglePayPaymentApp's app type. category = PaymentMethodCategory.GOOGLE; break; } else if (method.equals(MethodStrings.GOOGLE_PLAY_BILLING)) {
diff --git a/components/policy/core/common/async_policy_loader.cc b/components/policy/core/common/async_policy_loader.cc index 47e0107..57e9705 100644 --- a/components/policy/core/common/async_policy_loader.cc +++ b/components/policy/core/common/async_policy_loader.cc
@@ -30,8 +30,9 @@ } // namespace AsyncPolicyLoader::AsyncPolicyLoader( - const scoped_refptr<base::SequencedTaskRunner>& task_runner) - : task_runner_(task_runner) {} + const scoped_refptr<base::SequencedTaskRunner>& task_runner, + bool periodic_updates) + : task_runner_(task_runner), periodic_updates_(periodic_updates) {} AsyncPolicyLoader::~AsyncPolicyLoader() {} @@ -63,7 +64,9 @@ /*drop_invalid_component_policies=*/true); update_callback_.Run(std::move(bundle)); - ScheduleNextReload(kReloadInterval); + if (periodic_updates_) { + ScheduleNextReload(kReloadInterval); + } } std::unique_ptr<PolicyBundle> AsyncPolicyLoader::InitialLoad( @@ -94,7 +97,9 @@ Reload(false); // Start periodic refreshes. - ScheduleNextReload(kReloadInterval); + if (periodic_updates_) { + ScheduleNextReload(kReloadInterval); + } } void AsyncPolicyLoader::RefreshPolicies(scoped_refptr<SchemaMap> schema_map) {
diff --git a/components/policy/core/common/async_policy_loader.h b/components/policy/core/common/async_policy_loader.h index 6275991..92b52b7f 100644 --- a/components/policy/core/common/async_policy_loader.h +++ b/components/policy/core/common/async_policy_loader.h
@@ -25,8 +25,9 @@ // Base implementation for platform-specific policy loaders. Together with the // AsyncPolicyProvider, this base implementation takes care of the initial load, -// periodic reloads, watching file changes, refreshing policies and object -// lifetime. +// refreshing policies and object lifetime. Also if the object has +// |period_updates_| set to true it takes care of periodic reloads and watching +// file changes. // // All methods are invoked on the background |task_runner_|, including the // destructor. The only exceptions are the constructor (which may be called on @@ -37,7 +38,8 @@ class POLICY_EXPORT AsyncPolicyLoader { public: explicit AsyncPolicyLoader( - const scoped_refptr<base::SequencedTaskRunner>& task_runner); + const scoped_refptr<base::SequencedTaskRunner>& task_runner, + bool periodic_updates); virtual ~AsyncPolicyLoader(); // Gets a SequencedTaskRunner backed by the background thread. @@ -69,8 +71,9 @@ // reschedules the reload until the LastModificationTime() is a couple of // seconds in the past. This mitigates the problem of reading files that are // currently being written to, and whose contents are incomplete. - // A reload is posted periodically, if it hasn't been triggered recently. This - // makes sure the policies are reloaded if the update events aren't triggered. + // When |periodic_updates_| is true a reload is posted periodically, if it + // hasn't been triggered recently. This makes sure the policies are reloaded + // if the update events aren't triggered. void Reload(bool force); const scoped_refptr<SchemaMap>& schema_map() const { return schema_map_; } @@ -101,6 +104,9 @@ // Task runner for running background jobs. const scoped_refptr<base::SequencedTaskRunner> task_runner_; + // Whether the loader will schedule periodic updates for policy data. + const bool periodic_updates_; + // Callback for updates, passed in Init(). UpdateCallback update_callback_;
diff --git a/components/policy/core/common/async_policy_provider_unittest.cc b/components/policy/core/common/async_policy_provider_unittest.cc index 7594fd225..9ca61cd 100644 --- a/components/policy/core/common/async_policy_provider_unittest.cc +++ b/components/policy/core/common/async_policy_provider_unittest.cc
@@ -59,7 +59,7 @@ MockPolicyLoader::MockPolicyLoader( scoped_refptr<base::SequencedTaskRunner> task_runner) - : AsyncPolicyLoader(task_runner) {} + : AsyncPolicyLoader(task_runner, /*periodic_updates=*/true) {} MockPolicyLoader::~MockPolicyLoader() {}
diff --git a/components/policy/core/common/config_dir_policy_loader.cc b/components/policy/core/common/config_dir_policy_loader.cc index 6a740b4..36a44af 100644 --- a/components/policy/core/common/config_dir_policy_loader.cc +++ b/components/policy/core/common/config_dir_policy_loader.cc
@@ -56,7 +56,7 @@ scoped_refptr<base::SequencedTaskRunner> task_runner, const base::FilePath& config_dir, PolicyScope scope) - : AsyncPolicyLoader(task_runner), + : AsyncPolicyLoader(task_runner, /*periodic_updates=*/true), task_runner_(task_runner), config_dir_(config_dir), scope_(scope) {}
diff --git a/components/policy/core/common/fake_async_policy_loader.cc b/components/policy/core/common/fake_async_policy_loader.cc index 31a00d2..9df0da00 100644 --- a/components/policy/core/common/fake_async_policy_loader.cc +++ b/components/policy/core/common/fake_async_policy_loader.cc
@@ -12,8 +12,7 @@ FakeAsyncPolicyLoader::FakeAsyncPolicyLoader( const scoped_refptr<base::SequencedTaskRunner>& task_runner) - : AsyncPolicyLoader(task_runner) { -} + : AsyncPolicyLoader(task_runner, /*periodic_updates=*/true) {} std::unique_ptr<PolicyBundle> FakeAsyncPolicyLoader::Load() { std::unique_ptr<PolicyBundle> result(new PolicyBundle());
diff --git a/components/policy/core/common/policy_loader_ios.mm b/components/policy/core/common/policy_loader_ios.mm index 8e58ebf..1a4db48 100644 --- a/components/policy/core/common/policy_loader_ios.mm +++ b/components/policy/core/common/policy_loader_ios.mm
@@ -88,7 +88,8 @@ PolicyLoaderIOS::PolicyLoaderIOS( SchemaRegistry* registry, scoped_refptr<base::SequencedTaskRunner> task_runner) - : AsyncPolicyLoader(task_runner), weak_factory_(this) { + : AsyncPolicyLoader(task_runner, /*periodic_updates=*/true), + weak_factory_(this) { PolicyNamespace ns(POLICY_DOMAIN_CHROME, std::string()); policy_schema_ = registry->schema_map()->GetSchema(ns); }
diff --git a/components/policy/core/common/policy_loader_lacros.cc b/components/policy/core/common/policy_loader_lacros.cc index 03c9700..e763ecfa 100644 --- a/components/policy/core/common/policy_loader_lacros.cc +++ b/components/policy/core/common/policy_loader_lacros.cc
@@ -14,7 +14,6 @@ #include "base/check.h" #include "base/logging.h" #include "base/memory/weak_ptr.h" -#include "base/time/time.h" #include "chromeos/lacros/lacros_chrome_service_impl.h" #include "components/policy/core/common/cloud/cloud_policy_validator.h" #include "components/policy/core/common/policy_bundle.h" @@ -25,7 +24,8 @@ PolicyLoaderLacros::PolicyLoaderLacros( scoped_refptr<base::SequencedTaskRunner> task_runner) - : AsyncPolicyLoader(task_runner), task_runner_(task_runner) { + : AsyncPolicyLoader(task_runner, /*periodic_updates=*/false), + task_runner_(task_runner) { auto* lacros_chrome_service = chromeos::LacrosChromeServiceImpl::Get(); if (!lacros_chrome_service) { // LacrosChromeService should be available at this timing in production. @@ -45,7 +45,6 @@ return; } policy_fetch_response_ = init_params->device_account_policy.value(); - last_modification_ = base::Time::Now(); } PolicyLoaderLacros::~PolicyLoaderLacros() { @@ -98,16 +97,10 @@ return bundle; } -base::Time PolicyLoaderLacros::LastModificationTime() { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - return last_modification_; -} - void PolicyLoaderLacros::NotifyPolicyUpdate( const std::vector<uint8_t>& policy_fetch_response) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); policy_fetch_response_ = policy_fetch_response; - last_modification_ = base::Time::Now(); Reload(true); }
diff --git a/components/policy/core/common/policy_loader_lacros.h b/components/policy/core/common/policy_loader_lacros.h index 1477f94..3ce80f4 100644 --- a/components/policy/core/common/policy_loader_lacros.h +++ b/components/policy/core/common/policy_loader_lacros.h
@@ -13,7 +13,6 @@ #include "base/optional.h" #include "base/sequence_checker.h" #include "base/sequenced_task_runner.h" -#include "base/time/time.h" #include "chromeos/lacros/lacros_chrome_service_impl.h" #include "components/policy/core/common/async_policy_loader.h" @@ -43,8 +42,6 @@ // Loads the policy data from LacrosInitParams and populates it in the bundle // that is returned. std::unique_ptr<PolicyBundle> Load() override; - // Returns the last time the policy successfully loaded. - base::Time LastModificationTime() override; // LacrosChromeServiceDelegateImpl::Observer implementation. // Update and reload the policy with new data. @@ -58,9 +55,6 @@ // Serialized blob of PolicyFetchResponse object received from the server. base::Optional<std::vector<uint8_t>> policy_fetch_response_; - // The time of last modification. - base::Time last_modification_; - // Checks that the method is called on the right sequence. SEQUENCE_CHECKER(sequence_checker_); };
diff --git a/components/policy/core/common/policy_loader_mac.mm b/components/policy/core/common/policy_loader_mac.mm index db8b33ce9..f3fecc62 100644 --- a/components/policy/core/common/policy_loader_mac.mm +++ b/components/policy/core/common/policy_loader_mac.mm
@@ -66,7 +66,7 @@ const base::FilePath& managed_policy_path, MacPreferences* preferences, CFStringRef application_id) - : AsyncPolicyLoader(task_runner), + : AsyncPolicyLoader(task_runner, /*periodic_updates=*/true), preferences_(preferences), managed_policy_path_(managed_policy_path), application_id_(CFStringCreateCopy(kCFAllocatorDefault, application_id)) {
diff --git a/components/policy/core/common/policy_loader_win.cc b/components/policy/core/common/policy_loader_win.cc index cfe02ae..29fc6b52 100644 --- a/components/policy/core/common/policy_loader_win.cc +++ b/components/policy/core/common/policy_loader_win.cc
@@ -224,7 +224,7 @@ PolicyLoaderWin::PolicyLoaderWin( scoped_refptr<base::SequencedTaskRunner> task_runner, const std::wstring& chrome_policy_key) - : AsyncPolicyLoader(task_runner), + : AsyncPolicyLoader(task_runner, /*periodic_updates=*/true), is_initialized_(false), chrome_policy_key_(chrome_policy_key), user_policy_changed_event_(
diff --git a/components/policy/proto/chrome_device_policy.proto b/components/policy/proto/chrome_device_policy.proto index b459d17..481113ef 100644 --- a/components/policy/proto/chrome_device_policy.proto +++ b/components/policy/proto/chrome_device_policy.proto
@@ -141,6 +141,7 @@ optional bool report_fan_info = 23 [default = false]; optional bool report_vpd_info = 24 [default = false]; optional bool report_system_info = 25 [default = false]; + optional bool report_print_jobs = 26 [default = false]; // Frequency to report device status, default to 3 hours. // If changed, the default value has to be updated in
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json index e876d82a..6d3ba2d 100644 --- a/components/policy/resources/policy_templates.json +++ b/components/policy/resources/policy_templates.json
@@ -923,6 +923,7 @@ 'ReportDeviceFanInfo', 'ReportDeviceVpdInfo', 'ReportDeviceSystemInfo', + 'ReportDevicePrintJobs', 'ReportUploadFrequency', 'ReportArcStatusEnabled', 'HeartbeatEnabled', @@ -9636,6 +9637,38 @@ 'arc_support': 'This policy has no effect on the logging done by Android.', }, { + 'name': 'ReportDevicePrintJobs', + 'owners': ['mattme@google.com', 'file://components/policy/resources/OWNERS'], + 'type': 'main', + 'schema': { 'type': 'boolean' }, + 'future_on': ['chrome_os'], + 'supported_chrome_os_management': ['google_cloud'], + 'device_only': True, + 'features': { + 'dynamic_refresh': True, + }, + 'items': [ + { + 'value': True, + 'caption': 'Report print jobs', + }, + { + 'value': False, + 'caption': 'Do not report print jobs', + }, + ], + 'example_value': False, + 'default': False, + 'id': 835, + 'caption': '''Report print jobs''', + 'tags': ['admin-sharing'], + 'desc': '''Report a device's print jobs. + + If the policy is set to false or left unset, the information will not be reported. + If set to true, the device's print jobs will be reported.''', + 'arc_support': 'This policy has no effect on the logging done by Android.', + }, + { 'name': 'ReportUploadFrequency', 'owners': ['file://components/policy/resources/OWNERS', 'atwilson@chromium.org'], 'type': 'int', @@ -24987,6 +25020,43 @@ If the policy is set to false, <ph name="BOREALIS_NAME">Borealis</ph> will be unavailable. Otherwise (when the policy is unset, or true) <ph name="BOREALIS_NAME">Borealis</ph> will be available if and only if no other policy or setting disables it.''', }, + { + 'name': 'AudioProcessHighPriorityEnabled', + 'owners': ['file://services/audio/OWNERS', 'guidou@chromium.org'], + 'type': 'main', + 'schema': { 'type': 'boolean' }, + 'supported_on': ['chrome.win:91-'], + 'features': { + 'dynamic_refresh': False, + 'per_profile': False, + }, + 'items': [ + { + 'value': True, + 'caption': 'Use high priority for audio process', + }, + { + 'value': False, + 'caption': 'Use normal Priority for audio process', + }, + { + 'value': None, + 'caption': 'Use default priority for audio process', + }, + ], + 'default': None, + 'example_value': True, + 'id': 836, + 'caption': '''Allow the audio process to run with priority above normal on Windows''', + 'tags': [], + 'desc': '''This policy controls the priority of the audio process on Windows. + If this policy is enabled, the audio process will run with above normal priority. + If this policy is disabled, the audio process will run with normal priority. + If this policy is not set, the default configuration for the audio process will be used. + This policy is intended as a temporary measure to give enterprises the ability to + run audio with higher priority to address certain performance issues with audio capture. + This policy will be removed in the future.''', + }, ], 'messages': { # Messages that are not associated to any policies. @@ -25365,6 +25435,7 @@ 'ReportDeviceFanInfo': 'device_reporting.report_fan_info', 'ReportDeviceVpdInfo': 'device_reporting.report_vpd_info', 'ReportDeviceSystemInfo': 'device_reporting.report_system_info', + 'ReportDevicePrintJobs': 'device_reporting.report_print_jobs', 'ReportUploadFrequency': 'device_reporting.device_status_frequency', 'DeviceLoginScreenPowerManagement': 'login_screen_power_management.login_screen_power_management', 'DeviceChromeVariations': 'device_chrome_variations_type.value', @@ -25823,6 +25894,7 @@ 'ReportDeviceFanInfo', 'ReportDeviceVpdInfo', 'ReportDeviceSystemInfo', + 'ReportDevicePrintJobs', 'ReportUploadFrequency', 'ReportArcStatusEnabled', 'HeartbeatEnabled', @@ -25914,6 +25986,6 @@ 'placeholders': [], 'deleted_policy_ids': [114, 115, 204, 205, 206, 412, 476, 544, 546, 562, 569, 578, 583, 585, 586, 587, 588, 589, 590, 591, 600, 668, 669], 'deleted_atomic_policy_group_ids': [19], - 'highest_id_currently_used': 834, + 'highest_id_currently_used': 836, 'highest_atomic_group_id_currently_used': 40 }
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb index ba587fa..a7ab7c4 100644 --- a/components/policy/resources/policy_templates_es-419.xtb +++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -1139,6 +1139,13 @@ Si no la estableces, la función de resaltar el signo de intercalación estará inicialmente inhabilitada, pero el usuario podrá habilitarla en cualquier momento.</translation> <translation id="2509919237512982967">Utilizar los controles de formulario heredados hasta M84.</translation> <translation id="2515699738406900920">Disponibilidad del selector de perfiles en el inicio</translation> +<translation id="2515914624025258624">Esta configuración permite que los usuarios creen perfiles secundarios y usen el modo de invitado en el navegador <ph name="LACROS_NAME" />. + + Si estableces esta política como falsa o no la estableces, el usuario no podrá crear perfiles secundarios ni usar el modo de invitado, de modo similar que con las políticas BrowserAddPersonEnabled y BrowserGuestModeEnabled. + + Si estableces esta política como verdadera, el usuario podrá crear perfiles secundarios y usar el modo de invitado. + + Ten en cuenta que, si estableces esta política como verdadera, pero BrowserAddPersonEnabled está establecida como falsa, el usuario no podrá crear perfiles secundarios. Del mismo modo, si BrowserGuestModeEnabled está establecida como falsa, el usuario tampoco podrá usar el modo de invitado.</translation> <translation id="2517466659416174529">Permite la inmovilización de pestañas en segundo plano</translation> <translation id="2518231489509538392">Permitir la reproducción de audio</translation> <translation id="2521581787935130926">Muestra el acceso directo a las aplicaciones en la barra de favoritos.</translation> @@ -3230,6 +3237,7 @@ Si la inhabilitas, se desactivará esta función de forma forzosa. </translation> +<translation id="5432043531153963184">Impide que los usuarios creen perfiles secundarios y usen el modo de invitado en el navegador <ph name="LACROS_NAME" /></translation> <translation id="5442026853063570579">Esta política también controla el acceso a las Opciones para desarrolladores de Android. Si estableces esta política como "DeveloperToolsDisallowed" (valor 2), los usuarios no pueden acceder a las Opciones para desarrolladores. Si la estableces con otro valor o la dejas sin establecer, los usuarios pueden acceder a las Opciones para desarrolladores al presionar siete veces el número de versión en la app de Configuración de Android.</translation> <translation id="5445596354079213552">Esta política solo es válida si se alcanzó la fecha de vencimiento de las actualizaciones automáticas para el dispositivo y no se cumple el requisito de versión mínima permitida de <ph name="PRODUCT_OS_NAME" /> que se estableció en la política <ph name="DEVICE_MINIMUM_VERSION_POLICY_NAME" />. @@ -3746,6 +3754,7 @@ <translation id="6132506775968708399">Bloquea cookies de terceros</translation> <translation id="6133088669883929098">Permitir que todos los sitios utilicen la generación de claves</translation> <translation id="6135398260575578389">Se activó la Navegación segura en el modo mejorado. Este modo es más seguro, pero requiere que compartas con Google más datos sobre la navegación.</translation> +<translation id="6135895880862759946">Permite que los usuarios creen perfiles secundarios y usen el modo de invitado en el navegador <ph name="LACROS_NAME" /></translation> <translation id="6138636318340561140">Verifica en tiempo real el estado de la Navegación segura de las URL</translation> <translation id="6141402445226505817">Usar siempre la detección amplia de la zona horaria</translation> <translation id="6144046700495610112">Si habilitas la política, se importarán los datos para autocompletar formularios del navegador predeterminado anterior en la primera ejecución. Si la inhabilitas o no la estableces, no se importará ningún dato para autocompletar formularios en la primera ejecución. @@ -5120,6 +5129,12 @@ <translation id="7933141401888114454">Habilita la creación de usuarios supervisados.</translation> <translation id="793473937901685727">Establecer la disponibilidad de certificados para apps de ARC</translation> <translation id="7937766917976512374">Permitir o rechazar la captura de video</translation> +<translation id="7940359358774136765">Habilita una página en chrome://password-change que permite a los usuarios de SAML cambiar sus contraseñas de SAML durante la sesión, lo que asegura que se mantengan sincronizadas la contraseña de SAML y la de bloqueo de pantalla del dispositivo. + + Esta política también habilita notificaciones para advertir a los usuarios de SAML de que sus contraseñas de SAML están a punto de vencer. Esto les permite renovarlas de inmediato durante la sesión. + Sin embargo, solo se mostrarán estas notificaciones si el proveedor de identidad de SAML envía la información de vencimiento de contraseña al dispositivo durante el flujo de acceso de SAML. + + Si inhabilitas esta política o no la estableces, no se podrán cambiar las contraseñas de SAML en chrome://password-change ni se mostrarán notificaciones cuando este tipo de contraseñas estén por vencer.</translation> <translation id="7941975817681987555">No predecir acciones de la red en ninguna conexión de red</translation> <translation id="7951605113561734721">Especifica los Certificados de cliente de todo el dispositivo que deben inscribirse con el protocolo de administración de dispositivos.</translation> <translation id="7952007677054834789">Configura las páginas que deben cargarse en el inicio, la página principal y la página Nueva pestaña predeterminadas en <ph name="PRODUCT_NAME" />, y evita que los usuarios las cambien.
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb index 863c2bb..76cb6ed 100644 --- a/components/policy/resources/policy_templates_es.xtb +++ b/components/policy/resources/policy_templates_es.xtb
@@ -1143,6 +1143,13 @@ Si no se le asigna ningún valor, el resaltado del símbolo de intercalación de texto se inhabilitará al inicio, pero el usuario podrá habilitarlo en cualquier momento.</translation> <translation id="2509919237512982967">Utiliza los controles de formulario antiguos hasta la versión M84.</translation> <translation id="2515699738406900920">Disponibilidad del selector de perfil al iniciar</translation> +<translation id="2515914624025258624">Esta opción permite que los usuarios creen perfiles secundarios y que usen el modo invitados en el navegador <ph name="LACROS_NAME" />. + + Al igual que en el caso de BrowserAddPersonEnabled y BrowserGuestModeEnabled, si se asigna el valor false a esta política o no se establece, el usuario no podrá crear perfiles secundarios ni usar el modo invitados. + + Si se asigna el valor true a esta política, el usuario podrá crear perfiles secundarios y usar el modo invitados. + + Sin embargo, si se le asigna el valor true, pero BrowserAddPersonEnabled tiene asignado el valor false, el usuario no podrá crear perfiles secundarios. Ocurre lo mismo con BrowserGuestModeEnabled y el modo invitados.</translation> <translation id="2517466659416174529">Permite inmovilizar las pestañas que están en segundo plano</translation> <translation id="2518231489509538392">Permitir reproducción de audio</translation> <translation id="2521581787935130926">Mostrar el acceso directo de aplicaciones en la barra de marcadores</translation> @@ -3244,6 +3251,7 @@ Si se le asigna el valor "Inhabilitada", esta función se inhabilitará de forma forzosa. </translation> +<translation id="5432043531153963184">Impide que los usuarios creen perfiles secundarios y que usen el modo invitados en el navegador <ph name="LACROS_NAME" /></translation> <translation id="5442026853063570579">Esta política también controla el acceso a las opciones para desarrolladores de Android. Si se asigna a esta política el valor DeveloperToolsDisallowed (el valor 2), los usuarios no podrán acceder a las opciones para desarrolladores. Si se le asigna otro valor o no se le asigna ninguno, los usuarios podrán acceder a las opciones para desarrolladores tocando siete veces el número de compilación en la aplicación Ajustes de Android.</translation> <translation id="5445596354079213552">Esta política solo será efectiva cuando el dispositivo haya alcanzado la fecha de vencimiento de las actualizaciones automáticas y no tenga la versión mínima permitida de <ph name="PRODUCT_OS_NAME" /> establecida en la política <ph name="DEVICE_MINIMUM_VERSION_POLICY_NAME" />. @@ -3761,6 +3769,7 @@ <translation id="6132506775968708399">Bloquear cookies de terceros</translation> <translation id="6133088669883929098">Permitir que todos los sitios utilicen la generación de claves</translation> <translation id="6135398260575578389">Navegación segura está activa en modo mejorado. Este modo proporciona mayor seguridad, pero requiere compartir más información de navegación con Google.</translation> +<translation id="6135895880862759946">Permite que los usuarios creen perfiles secundarios y que usen el modo invitados en el navegador <ph name="LACROS_NAME" /></translation> <translation id="6138636318340561140">Comprueba en tiempo real el estado de Navegación segura de las URL</translation> <translation id="6141402445226505817">Utilizar siempre la detección de zona horaria común</translation> <translation id="6144046700495610112">Si se asigna el valor "Habilitada" a esta política, se importarán los datos de formularios para la función Autocompletar del navegador predeterminado anterior al ejecutarse por primera vez. Si se le asigna el valor "Inhabilitada" o no se le asigna ninguno, no se importarán estos datos al ejecutarse por primera vez. @@ -5141,6 +5150,12 @@ <translation id="7933141401888114454">Habilitar la creación de usuarios supervisados</translation> <translation id="793473937901685727">Establecer la disponibilidad del certificado para las aplicaciones ARC</translation> <translation id="7937766917976512374">Permitir o denegar captura de vídeo</translation> +<translation id="7940359358774136765">Habilita una página en chrome://password-change que permite a los usuarios de SAML cambiar sus contraseñas de SAML mientras tienen la sesión iniciada. Así, la contraseña de SAML y la contraseña de bloqueo de pantalla del dispositivo se mantienen sincronizadas. + + Esta política también habilita las notificaciones que avisan a los usuarios de SAML de que sus contraseñas de SAML están a punto de caducar y de que pueden cambiarlas inmediatamente con la sesión iniciada. + Estas notificaciones solo se mostrarán si el proveedor de identidades de SAML envía la información sobre la caducidad de la contraseña al dispositivo durante el flujo de inicio de sesión de SAML. + + Si se asigna el valor Disabled a esta política o no se establece, la contraseña de SAML no se podrá cambiar en chrome://password-change y no se mostrará ninguna notificación cuando las contraseñas de SAML estén a punto de caducar.</translation> <translation id="7941975817681987555">No predecir las acciones de red en ninguna conexión de red</translation> <translation id="7951605113561734721">Especifica los certificados de cliente de todo el dispositivo que deberían registrarse usando el protocolo de gestión de dispositivos.</translation> <translation id="7952007677054834789">Permite configurar las páginas que se cargan al abrir el navegador, la página principal predeterminada y la página Nueva pestaña predeterminada en <ph name="PRODUCT_NAME" /> e impide que los usuarios las cambien.
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb index 02725f0..73959dda 100644 --- a/components/policy/resources/policy_templates_fr.xtb +++ b/components/policy/resources/policy_templates_fr.xtb
@@ -1140,6 +1140,13 @@ Si cette règle n'est pas définie, la mise en surbrillance du curseur de saisie est désactivée au départ, mais les utilisateurs peuvent l'activer à tout moment.</translation> <translation id="2509919237512982967">Utiliser les anciens éléments de contrôle de formulaire jusqu'à la version M84.</translation> <translation id="2515699738406900920">Disponibilité de l'outil de sélection du profil au démarrage</translation> +<translation id="2515914624025258624">Ce paramètre autorise les utilisateurs à créer des profils secondaires et utiliser le mode Invité dans le navigateur <ph name="LACROS_NAME" />. + + Comme pour BrowserAddPersonEnabled et BrowserGuestModeEnabled, si cette règle est définie sur "false" ou non définie, les utilisateurs ne peuvent pas créer de profils secondaires ni utiliser le mode Invité. + + Si elle est définie sur "true", les utilisateurs peuvent créer des profils secondaires et utiliser le mode Invité. + + Si elle est définie sur "true", mais que BrowserAddPersonEnabled est définie sur "false", les utilisateurs ne peuvent pas créer de profils secondaires. Même chose pour BrowserGuestModeEnabled et le mode Invité.</translation> <translation id="2517466659416174529">Figer les onglets en arrière-plan</translation> <translation id="2518231489509538392">Autoriser la lecture audio</translation> <translation id="2521581787935130926">Afficher le raccourci des applications dans la barre de favoris</translation> @@ -3216,6 +3223,7 @@ Si cette règle est désactivée, cette fonctionnalité est désactivée de façon forcée. </translation> +<translation id="5432043531153963184">Empêcher les utilisateurs de créer des profils secondaires et d'utiliser le mode Invité dans le navigateur <ph name="LACROS_NAME" /></translation> <translation id="5442026853063570579">Cette règle permet également de contrôler l'accès aux options pour les développeurs Android. Si vous définissez cette règle sur "DeveloperToolsDisallowed" (valeur 2), les utilisateurs ne pourront pas accéder aux options pour les développeurs. Si vous la définissez sur une autre valeur ou si vous ne la modifiez pas, les utilisateurs pourront accéder aux options pour les développeurs en appuyant sept fois sur le numéro de version dans l'application des paramètres Android.</translation> <translation id="5445596354079213552">Cette règle n'est appliquée que si la date d'expiration des mises à jour automatiques associée à l'appareil est atteinte et que celui-ci ne répond pas aux exigences de version minimale pour <ph name="PRODUCT_OS_NAME" />, définies dans la règle <ph name="DEVICE_MINIMUM_VERSION_POLICY_NAME" />. @@ -3735,6 +3743,7 @@ <translation id="6132506775968708399">Bloquer les cookies tiers</translation> <translation id="6133088669883929098">Autoriser tous les sites à utiliser la génération de clé</translation> <translation id="6135398260575578389">La navigation sécurisée est active et en mode de protection renforcée. Ce mode offre une meilleure sécurité, mais nécessite de partager plus d'informations de navigation avec Google.</translation> +<translation id="6135895880862759946">Autoriser les utilisateurs à créer des profils secondaires et à utiliser le mode Invité dans le navigateur <ph name="LACROS_NAME" /></translation> <translation id="6138636318340561140">Vérifier en temps réel l'état de la navigation sécurisée pour les URL</translation> <translation id="6141402445226505817">Toujours utiliser une détection de fuseau horaire standard</translation> <translation id="6144046700495610112">Si cette règle est activée, les données de saisie automatique enregistrées dans le précédent navigateur par défaut sont importées lors de la première exécution. Si cette règle est désactivée ou qu'elle n'est pas configurée, les données de saisie automatique ne sont pas importées lors de la première exécution. @@ -4360,7 +4369,7 @@ * PasswordProtectionWarningOnPasswordReuse, l'avertissement est affiché lorsque les utilisateurs réutilisent leur mot de passe protégé sur un site qui ne figure pas dans la liste des sites autorisés ; - * PasswordProtectionWarningOnPhishingReuse, l'avertissement est affiché lorsque les utilisateurs réutilisent leur mot de passe protégé sur un site de hameçonnage. + * PasswordProtectionWarningOnPhishingReuse, l'avertissement est affiché lorsque les utilisateurs réutilisent leur mot de passe protégé sur un site d'hameçonnage. Si cette règle n'est pas configurée, le service de protection par mot de passe ne protège que les mots de passe Google. Toutefois, les utilisateurs peuvent modifier ce paramètre.</translation> <translation id="6969131408525928234">Permet de désactiver l'application des exigences de divulgation stipulées dans les règles de transparence des certificats pour les noms d'hôte dans la liste d'URL spécifiées. Même si cela complique la détection des certificats qui ne sont pas émis correctement, les hôtes peuvent continuer d'utiliser des certificats qui ne seraient sinon pas jugés fiables (pour ne pas avoir été communiqués au public comme il se doit). @@ -5112,6 +5121,12 @@ <translation id="7933141401888114454">Autoriser la création de comptes utilisateurs supervisés</translation> <translation id="793473937901685727">Définir la disponibilité des certificats pour les applications ARC</translation> <translation id="7937766917976512374">Autoriser ou interdire la capture vidéo</translation> +<translation id="7940359358774136765">Affiche la page chrome://password-change, qui permet aux utilisateurs SAML de changer leur mot de passe en cours de session. Ainsi, le mot de passe SAML et celui de l'écran de verrouillage de l'appareil restent synchronisés. + + Cette règle permet également d'activer les notifications destinées à signaler aux utilisateurs SAML que leur mot de passe SAML va bientôt expirer. Ils peuvent ainsi le modifier immédiatement, durant la session. + Toutefois, ces notifications ne s'affichent que si le fournisseur d'identité SAML envoie à l'appareil des informations sur l'expiration du mot de passe au cours du processus de connexion SAML. + + Si cette règle est désactivée ou non définie, le mot de passe SAML n'est pas modifiable sur la page chrome://password-change, et aucune notification ne s'affiche en cas d'expiration imminente.</translation> <translation id="7941975817681987555">Ne pas prédire d'actions réseau lors d'une connexion au réseau</translation> <translation id="7951605113561734721">Indique les certificats clients qui doivent être enregistrés au niveau de l'appareil à l'aide du protocole de gestion des appareils.</translation> <translation id="7952007677054834789">Permet de configurer les pages à charger au démarrage, la page d'accueil par défaut et la page Nouvel onglet par défaut dans <ph name="PRODUCT_NAME" />, tout en empêchant les utilisateurs de les modifier.
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb index b73f67a..5452823 100644 --- a/components/policy/resources/policy_templates_it.xtb +++ b/components/policy/resources/policy_templates_it.xtb
@@ -1135,6 +1135,13 @@ Se questo criterio non viene impostato, inizialmente l'evidenziazione del cursore di testo è disattivata, ma l'utente può attivarla in qualsiasi momento.</translation> <translation id="2509919237512982967">Usa i controlli modulo legacy fino alla versione M84.</translation> <translation id="2515699738406900920">Disponibilità del selettore profilo all'avvio</translation> +<translation id="2515914624025258624">Questa impostazione consente agli utenti di creare profili secondari e usare la modalità ospite nel browser <ph name="LACROS_NAME" />. + + In modo simile ai criteri BrowserAddPersonEnabled e BrowserGuestModeEnabled, se questo criterio viene impostato su falso o se non viene configurato, gli utenti non possono creare profili secondari e usare la modalità ospite. + + Se questo criterio viene impostato su vero, gli utenti possono creare profili secondari e usare la modalità ospite. + + Tieni presente che se questo criterio viene impostato su vero, ma il criterio BrowserAddPersonEnabled viene impostato su falso, gli utenti non possono creare profili secondari. Lo stesso vale per il criterio BrowserGuestModeEnabled e la modalità ospite.</translation> <translation id="2517466659416174529">Consenti il blocco delle schede in secondo piano</translation> <translation id="2518231489509538392">Consenti riproduzione audio</translation> <translation id="2521581787935130926">Mostra la scorciatoia per le app nella barra dei Preferiti</translation> @@ -3221,6 +3228,7 @@ Se questo criterio viene impostato su Disattivato, la funzionalità viene disattivata forzatamente. </translation> +<translation id="5432043531153963184">Gli utenti non possono creare profili secondari e usare la modalità ospite nel browser <ph name="LACROS_NAME" /></translation> <translation id="5442026853063570579">Questa norma consente di controllare anche l'accesso alle Opzioni sviluppatore di Android. Se la norma viene impostata su "DeveloperToolsDisallowed" (valore 2), gli utenti non potranno accedere alle Opzioni sviluppatore. Se la norma viene impostata su un altro valore o non viene impostata, gli utenti potranno accedere alle Opzioni sviluppatore toccando sette volte il numero di build nell'app Impostazioni di Android.</translation> <translation id="5445596354079213552">Questo criterio viene applicato soltanto se il dispositivo ha raggiunto la scadenza dell'aggiornamento automatico e non rispetta la versione minima consentita di <ph name="PRODUCT_OS_NAME" /> impostata tramite il criterio <ph name="DEVICE_MINIMUM_VERSION_POLICY_NAME" />. @@ -3715,6 +3723,7 @@ <translation id="6132506775968708399">Blocca cookie di terze parti</translation> <translation id="6133088669883929098">Consenti a tutti i siti di utilizzare la generazione di chiavi</translation> <translation id="6135398260575578389">Navigazione sicura è attiva in modalità potenziata. Questa modalità fornisce maggior sicurezza, ma non richiede la condivisione di ulteriori dati di navigazione con Google.</translation> +<translation id="6135895880862759946">Gli utenti possono creare profili secondari e usare la modalità ospite nel browser <ph name="LACROS_NAME" /></translation> <translation id="6138636318340561140">Controlla lo stato degli URL in tempo reale con Navigazione sicura</translation> <translation id="6141402445226505817">Utilizza sempre il rilevamento approssimativo del fuso orario</translation> <translation id="6144046700495610112">Se il criterio viene impostato su Attivato, i dati di compilazione automatica dei moduli nel precedente browser predefinito verranno importati alla prima esecuzione. Se il criterio viene impostato su Disattivato o se non viene configurato, nessun dato di compilazione automatica dei moduli verrà importato alla prima esecuzione. @@ -5094,6 +5103,12 @@ <translation id="7933141401888114454">Attivazione della creazione di utenti controllati</translation> <translation id="793473937901685727">Imposta la disponibilità dei certificati per le app ARC</translation> <translation id="7937766917976512374">Consenti o nega acquisizione video</translation> +<translation id="7940359358774136765">Consente di attivare all'indirizzo chrome://password-change una pagina che permette agli utenti SAML di cambiare le loro password SAML all'interno della sessione, il che assicura che le password SAML e quelle per la schermata di blocco del dispositivo rimangano sincronizzate. + + Questo criterio inoltre consente le notifiche che avvisano gli utenti SAML se le loro password SAML stanno per scadere, in modo che possano organizzarsi immediatamente ed effettuare una modifica della password all'interno della sessione. + Tuttavia, queste notifiche verranno mostrate solo se le informazioni sulla scadenza della password vengono inviate al dispositivo dal provider di identità SAML durante il flusso di accesso SAML. + + Se questo criterio viene impostato su Disattivato o se non viene configurato, non è possibile modificare le password SAML all'indirizzo chrome://password-change e non verranno mostrate notifiche quando tali password stanno per scadere.</translation> <translation id="7941975817681987555">Non prevedere le azioni di rete su qualsiasi connessione di rete</translation> <translation id="7951605113561734721">Consente di specificare i certificati client a livello di dispositivo che dovrebbero essere registrati usando il protocollo di gestione del dispositivo.</translation> <translation id="7952007677054834789">Consente di configurare le pagine da caricare all'avvio, la pagina iniziale predefinita e la pagina Nuova scheda predefinita in <ph name="PRODUCT_NAME" />; inoltre, impedisce agli utenti di modificare queste impostazioni.
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb index 0ed161e..8714e11 100644 --- a/components/policy/resources/policy_templates_ja.xtb +++ b/components/policy/resources/policy_templates_ja.xtb
@@ -3880,7 +3880,7 @@ * <ph name="POLICY_ENUM_SYSTEMTIMEZONEAUTOMATICDETECTION_TIMEZONEAUTOMATICDETECTIONSENDALLLOCATIONINFO" />: タイムゾーンの自動検出をオンの状態に維持します。Wi-Fi アクセス ポイント、近くの携帯電話基地局、GPS といった位置情報を継続的にサーバーに送信して、最も精度の高いタイムゾーン検出を行います。 このポリシーを設定しないか、「Let users decide(ユーザーの指定による)」または「None(なし)」に設定した場合、ユーザーは chrome://settings にある通常の設定項目を使ってタイムゾーンの自動検出を制御できます。</translation> -<translation id="6532769014584932288">起動ロックを許可する</translation> +<translation id="6532769014584932288">wake locks を許可する</translation> <translation id="6536600139108165863">デバイスのシャットダウン時に自動的に再起動する</translation> <translation id="6539246272469751178">このポリシーは Android アプリには適用されません。Android アプリは、常にデフォルトのダウンロード ディレクトリを使用し、<ph name="PRODUCT_OS_NAME" /> によってデフォルト以外のダウンロード ディレクトリにダウンロードされたファイルにはアクセスできません。</translation> <translation id="654303922206238013">ecryptfs の移行方法</translation>
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb index 4c78846..1630482 100644 --- a/components/policy/resources/policy_templates_ko.xtb +++ b/components/policy/resources/policy_templates_ko.xtb
@@ -912,6 +912,9 @@ 추천 페이지는 Google 서버에서 원격으로 가져옵니다. false로 설정하면 추천 페이지를 가져오거나 표시하지 않습니다.</translation> +<translation id="2246011554082893079">기기에서 <ph name="BOREALIS_NAME" />를 사용하도록 허용할지 선택합니다. + + 정책이 False로 설정되면 기기의 모든 사용자가 <ph name="BOREALIS_NAME" />를 사용할 수 없습니다. 그렇지 않은 경우(정책이 설정되지 않거나 True로 설정됨) 다른 정책 또는 설정에서 사용 중지하지 않는 이상 <ph name="BOREALIS_NAME" />를 사용할 수 있습니다.</translation> <translation id="225340736558643885">안전하지 않은 양식 경고 사용 설정</translation> <translation id="2258126710006312594">원격 액세스 사용자가 호스트와 파일 전송을 할 수 있게 허용</translation> <translation id="2261329877420573811"><ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />에 <ph name="PRINTERS_WHITELIST" />를 선택할 경우 <ph name="DEVICE_NATIVE_PRINTERS_WHITELIST_POLICY_NAME" />를 설정하면 사용자가 사용할 수 있는 프린터가 지정됩니다. ID가 이 정책의 값과 일치하는 프린터만 사용자에게 제공됩니다. ID는 <ph name="DEVICE_PRINTERS_POLICY_NAME" />에 지정된 파일의 <ph name="ID_FIELD" /> 또는 <ph name="GUID_FIELD" /> 필드와 일치해야 합니다. @@ -1462,6 +1465,9 @@ <translation id="2960013482187484833">인쇄 미리보기의 기본 선택으로 최근에 사용한 프린터 사용</translation> <translation id="2960128438010718932">신규 업데이트를 적용하기 위한 스테이징 일정</translation> <translation id="2960691910306063964">원격 액세스 호스트에서 PIN을 사용하지 않는 인증을 사용 또는 사용 중지합니다.</translation> +<translation id="2964056138564883247">사용자가 <ph name="BOREALIS_NAME" />를 사용하도록 허용할지 선택합니다. + + 정책이 False로 설정되면 <ph name="BOREALIS_NAME" />를 사용할 수 없습니다. 그렇지 않은 경우(정책이 설정되지 않거나 True로 설정됨) 다른 정책 또는 설정에서 사용 중지하지 않는 이상 <ph name="BOREALIS_NAME" />를 사용할 수 있습니다.</translation> <translation id="2964373560810620158">사용자가 <ph name="LACROS_NAME" /> 브라우저를 사용하지 못하도록 차단</translation> <translation id="2969797921412053304">이 정책은 로그인 화면의 SAML 절차가 진행되는 동안 기기 ID의 원격 증명을 사용할 수 있는 액세스 권한이 부여되는 URL을 지정합니다. @@ -2732,6 +2738,7 @@ 정책을 설정하면 사용자가 변경할 수 없습니다. 정책을 설정하지 않으면 사용자가 실행기의 자동 숨김 여부를 결정합니다.</translation> <translation id="4812714598405913256">DeviceMinimumVersion 정책의 자동 업데이트 만료 메시지 구성</translation> <translation id="4816674326202173458">기업 사용자에게 기본 사용자 및 보조 사용자 모두 허용(관리 대상 사용자가 아닌 경우 기본 동작임)</translation> +<translation id="4820432864264617413">사용자가 <ph name="BOREALIS_NAME" />를 실행하지 못하도록 차단</translation> <translation id="4826326557828204741">배터리 전원으로 기기를 실행하는 동안 유휴 지연 시간에 도달했을 때 실행할 작업입니다.</translation> <translation id="482803100714220060">전체 URL 표시</translation> <translation id="4832852360828533362">사용자 및 기기 보고</translation> @@ -2745,6 +2752,7 @@ 정책을 설정하지 않거나 정책에 유효하지 않은 값이 있으면 시스템 기능의 사용 중지 모드가 '차단'됩니다.</translation> <translation id="4835470005923546373">기본적으로 배경 그래픽 인쇄 모드 사용 안 함</translation> <translation id="4835622243021053389">NTLMv2 인증을 사용합니다.</translation> +<translation id="485419696366295465"><ph name="BOREALIS_NAME" /> 하위 시스템과 관련된 정책을 관리합니다.</translation> <translation id="4855636880814771207">정책을 '사용'으로 설정하거나 설정하지 않으면 사용자가 블루투스를 켜거나 끄도록 허용합니다. 정책을 '사용 안함'으로 설정하면 <ph name="PRODUCT_OS_NAME" />에서 블루투스를 끄며 사용자가 켤 수 없습니다. @@ -3313,6 +3321,7 @@ <translation id="554903022911579950">Kerberos</translation> <translation id="555022085242359084">로그인 화면에서 고대비 사용 설정</translation> <translation id="555077880566103058">모든 사이트에서 <ph name="FLASH_PLUGIN_NAME" /> 플러그인을 자동으로 실행하도록 허용</translation> +<translation id="5556607617517096419">Borealis</translation> <translation id="5559079916187891399">이 정책은 Android 앱에 아무런 영향을 미치지 않습니다.</translation> <translation id="5560039246134246593"><ph name="PRODUCT_NAME" />에서 버전 시드 가져오기에 대한 매개변수를 추가합니다. @@ -3528,6 +3537,7 @@ <translation id="5814301096961727113">로그인 화면에서 음성 피드백의 기본 상태를 설정</translation> <translation id="5815129011704381141">업데이트 후 자동 재부팅</translation> <translation id="582857022372205358">짧은 쪽 양면 인쇄 사용 설정</translation> +<translation id="5830196507442186669">기기가 <ph name="PRODUCT_OS_NAME" />에서 <ph name="BOREALIS_NAME" />를 사용하도록 허용</translation> <translation id="5832274826894536455">지원 중단된 정책</translation> <translation id="5835253272509953988">정책을 사용 설정하면 사용자가 입력한 사용자 이름 및 비밀번호가 유출되었는지 <ph name="PRODUCT_NAME" />에서 확인할 수 있습니다. @@ -3740,6 +3750,7 @@ <translation id="6097601282776163274">URL로 입력되며 익명으로 처리되는 데이터 수집 사용 설정</translation> <translation id="6099853574908182288">기본 컬러 인쇄 모드</translation> <translation id="6102342563050263313">URL 프래그먼트에서 지정한 텍스트로 스크롤 사용 설정</translation> +<translation id="6102449843040973938"><ph name="BOREALIS_NAME" />가 기기에서 실행되는 것을 차단하지 않음</translation> <translation id="6107642964266628393">Chrome OS 업데이트가 적용되는 방식과 시기를 제어합니다.</translation> <translation id="6111936128861357925">공룡 부활절 달걀 게임 허용</translation> <translation id="6123052603197028610">Google 서버로 전송된 쿼리가 타임스탬프를 가져오도록 허용하지 않음</translation> @@ -3806,6 +3817,7 @@ 이 경우 사용자가 샌드박스 처리되지 않은 오디오 하위 시스템 실행과 관련된 보안 위험에 노출됩니다. 정책이 설정되지 않으면 오디오 샌드박스의 기본 구성이 사용되며, 이 구성은 플랫폼별로 다를 수 있습니다. 이 정책은 기업에서 샌드박스를 방해하는 보안 소프트웨어 설정을 사용하는 경우 필요에 따라 오디오 샌드박스를 사용 중지할 수 있도록 만들어졌습니다.</translation> +<translation id="6252773211180267325">사용자가 <ph name="BOREALIS_NAME" />를 실행하는 것을 차단하지 않음</translation> <translation id="6261643884958898336">기기 식별 정보 보고</translation> <translation id="6265892395051519509">이 사이트에서 센서에 액세스하도록 허용</translation> <translation id="6273015149273504999"> @@ -4275,6 +4287,7 @@ <translation id="6856743875250214792">이 정책은 내부 테스트용으로만 사용되었으며 보안 문제를 일으킬 수 있기 때문에 M66에서 지원 중단되고 삭제됩니다. <ph name="PRODUCT_NAME" />을(를) 시작할 때 적용할 플래그를 지정합니다. 지정된 플래그는 로그인 화면에만 적용됩니다. 이 정책에서 설정된 플래그는 사용자 세션에 반영되지 않습니다.</translation> +<translation id="6857240169209507953"><ph name="BOREALIS_NAME" />가 기기에서 실행되지 않도록 차단</translation> <translation id="685769593149966548">YouTube에 강력 제한 모드 사용</translation> <translation id="686079137349561371">Microsoft Windows 7 이상</translation> <translation id="68818134518270542">정책을 설정하면 사용자가 <ph name="PRODUCT_OS_NAME" /> 잠금 화면에서 메모 앱으로 사용 설정할 수 있는 앱이 지정됩니다. @@ -4700,6 +4713,7 @@ 이 정책을 'RemoveLRU'로 설정하면 자동 정리는 여유 공간을 확보할 때까지 3개월 이내에 로그인하지 않은 사용자를 가장 오래된 사용자 순서대로 기기에서 삭제합니다. 이 정책을 설정하지 않으면 자동 정리는 기본 전략을 사용합니다. 현재 기본 전략은 'RemoveLRUIfDormant'입니다.</translation> +<translation id="7334517274921831425">사용자가 <ph name="PRODUCT_OS_NAME" />에서 <ph name="BOREALIS_NAME" />를 사용하도록 허용</translation> <translation id="7336785017449297672">시계 및 시간대 설정을 제어합니다.</translation> <translation id="7336878834592315572">세션이 지속되는 동안 쿠키를 유지합니다.</translation> <translation id="7338217396351647423">정책을 설정하면 ARC 런타임에 전달될 정책 모음이 지정됩니다. 관리자는 이를 사용하여 자동 설치될 Android 앱을 선택할 수 있습니다. 유효한 JSON 형식으로 값을 입력해야 합니다.
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb index e05627e..1f7eef0 100644 --- a/components/policy/resources/policy_templates_nl.xtb +++ b/components/policy/resources/policy_templates_nl.xtb
@@ -1126,6 +1126,13 @@ Als dit beleid niet is ingesteld, is de functie voor markering van het caret-teken in eerste instantie uitgeschakeld, maar kan de gebruiker deze op elk gewenst moment inschakelen.</translation> <translation id="2509919237512982967">Verouderde formulierbesturingselementen gebruiken tot M84.</translation> <translation id="2515699738406900920">Beschikbaarheid van profielkiezer bij opstarten</translation> +<translation id="2515914624025258624">Met deze instelling kunnen gebruikers secundaire profielen maken en de gastmodus gebruiken in de <ph name="LACROS_NAME" />-browser. + + Als je dit beleid instelt op False of niet instelt, kunnen gebruikers geen secundaire profielen maken en de gastmodus niet gebruiken. Dit is vergelijkbaar met BrowserAddPersonEnabled en BrowserGuestModeEnabled. + + Als je dit beleid instelt op True, kunnen gebruikers secundaire profielen maken en de gastmodus gebruiken. + + Als je dit beleid instelt op True maar BrowserAddPersonEnabled is ingesteld op False, kunnen gebruikers geen secundaire profielen maken. Hetzelfde geldt voor BrowserGuestModeEnabled en de gastmodus.</translation> <translation id="2517466659416174529">Toestaan dat tabbladen op de achtergrond worden vastgezet</translation> <translation id="2518231489509538392">Het afspelen van audio toestaan</translation> <translation id="2521581787935130926">De snelkoppeling voor apps weergeven op de bookmarkbalk</translation> @@ -3209,6 +3216,7 @@ Als je dit beleid uitschakelt, wordt de functie gedwongen uitgeschakeld. </translation> +<translation id="5432043531153963184">Voorkomen dat gebruikers secundaire profielen maken en de gastmodus gebruiken in de <ph name="LACROS_NAME" />-browser</translation> <translation id="5442026853063570579">Met dit beleid wordt ook de toegang tot de ontwikkelaarsopties van Android beheerd. Als je dit beleid instelt op 'DeveloperToolsDisallowed' (waarde 2), hebben gebruikers geen toegang tot ontwikkelaarsopties. Als je dit beleid instelt op een andere waarde of niet instelt, hebben gebruikers toegang tot ontwikkelaarsopties door zeven keer op het buildnummer te tikken in de app Instellingen van Android.</translation> <translation id="5445596354079213552">Dit beleid is alleen van kracht als het apparaat de vervaldatum voor automatische updates heeft bereikt en niet voldoet aan de toegestane minimum versie van <ph name="PRODUCT_OS_NAME" /> die is ingesteld via het beleid <ph name="DEVICE_MINIMUM_VERSION_POLICY_NAME" />. @@ -3702,6 +3710,7 @@ <translation id="6132506775968708399">Cookies van derden blokkeren</translation> <translation id="6133088669883929098">Alle sites toestaan sleutels te genereren</translation> <translation id="6135398260575578389">Safe Browsing is actief in de uitgebreide modus. Deze modus biedt betere beveiliging, maar vereist dat er meer browsegegevens worden gedeeld met Google.</translation> +<translation id="6135895880862759946">Toestaan dat gebruikers secundaire profielen maken en de gastmodus gebruiken in de <ph name="LACROS_NAME" />-browser</translation> <translation id="6138636318340561140">Safe Browsing-status van URL's in realtime checken</translation> <translation id="6141402445226505817">Altijd minder nauwkeurige tijdzonedetectie gebruiken</translation> <translation id="6144046700495610112">Als je het beleid inschakelt, worden de formuliergegevens voor automatisch invullen van de vorige standaardbrowser geïmporteerd bij de eerste uitvoering. Als je het beleid uitschakelt of niet instelt, worden formuliergegevens voor automatisch invullen niet geïmporteerd bij de eerste uitvoering. @@ -5078,6 +5087,12 @@ <translation id="7933141401888114454">Maken van bewaakte gebruikers inschakelen</translation> <translation id="793473937901685727">Certificaatbeschikbaarheid instellen voor ARC-apps</translation> <translation id="7937766917976512374">Het opnemen van video's toestaan of weigeren</translation> +<translation id="7940359358774136765">Hiermee wordt een pagina op chrome://password-change actief waar SAML-gebruikers hun SAML-wachtwoorden kunnen wijzigen tijdens een sessie. Dit zorgt ervoor dat het SAML-wachtwoord en het wachtwoord voor schermvergrendeling van het apparaat gesynchroniseerd blijven. + + Met dit beleid worden er ook meldingen gegenereerd voor SAML-gebruikers van wie het SAML-wachtwoord bijna verloopt. Ze kunnen dit dan meteen verhelpen door tijdens de sessie het wachtwoord te wijzigen. + Deze meldingen worden alleen getoond als de SAML-identiteitsprovider tijdens de SAML-inlogprocedure informatie over het verlopen van het wachtwoord naar het apparaat stuurt. + + Als je dit beleid niet toepast of niet instelt, kan het SAML-wachtwoord niet worden gewijzigd op chrome://password-change. Er wordt ook geen melding getoond als SAML-wachtwoorden bijna verlopen.</translation> <translation id="7941975817681987555">Geen netwerkacties voorspellen voor een netwerkverbinding</translation> <translation id="7951605113561734721">Specificeert clientcertificaten voor het hele apparaat die moeten worden ingeschreven via het protocol voor apparaatbeheer.</translation> <translation id="7952007677054834789">Hiermee wordt geconfigureerd welke pagina's worden geladen bij het opstarten, wat de standaard homepage is en welke pagina standaard wordt gebruikt voor nieuwe tabbladen in <ph name="PRODUCT_NAME" />. Ook verhinder je hiermee dat gebruikers deze pagina's kunnen wijzigen.
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb index 93ee12df..b0fe2df 100644 --- a/components/policy/resources/policy_templates_pt-BR.xtb +++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -1136,6 +1136,13 @@ Se esta política não for definida, o destaque do cursor ficará desativado inicialmente, mas poderá ser ativado pelo usuário a qualquer momento.</translation> <translation id="2509919237512982967">Usar controles de formulários legados até a M84.</translation> <translation id="2515699738406900920">Disponibilidade do seletor de perfil na inicialização</translation> +<translation id="2515914624025258624">Esta configuração permite que usuários criem perfis secundários e usem o modo visitante no navegador <ph name="LACROS_NAME" />. + + De maneira semelhante à BrowserAddPersonEnabled e BrowserGuestModeEnabled, se esta política for definida como falsa ou for deixada sem definição, o usuário não poderá criar perfis secundários e usar o modo visitante. + + Se ela for definida como verdadeira, o usuário poderá criar perfis secundários e usar o modo visitante. + + No entanto, se esta política for definida como verdadeira, mas BrowserAddPersonEnabled for definida como falsa, a criação de perfis secundários não será permitida. O mesmo vale para o modo visitante na política BrowserGuestModeEnabled.</translation> <translation id="2517466659416174529">Permitir congelamento das guias em segundo plano</translation> <translation id="2518231489509538392">Permitir a reprodução de áudio</translation> <translation id="2521581787935130926">Exibir os atalhos de aplicativos na barra de favoritos</translation> @@ -3222,6 +3229,7 @@ Se ela for definida como "Desativada", o recurso será desativado à força. </translation> +<translation id="5432043531153963184">Evitar que usuários criem perfis secundários e usem o modo visitante no navegador <ph name="LACROS_NAME" /></translation> <translation id="5442026853063570579">Esta política também controla o acesso às Opções do desenvolvedor Android. Se esta política for definida como "DeveloperToolsDisallowed" (valor 2), os usuários não poderão acessar as Opções do desenvolvedor. Se for definida como falsa ou se não for definida, os usuários poderão acessar as Opções do desenvolvedor tocando sete vezes no número da versão no app de configurações do Android.</translation> <translation id="5445596354079213552">Esta política só será eficaz quando o dispositivo tiver atingido a data de expiração da atualização automática e não atender mais os requisitos mínimos permitidos pela versão do <ph name="PRODUCT_OS_NAME" /> definidos pela <ph name="DEVICE_MINIMUM_VERSION_POLICY_NAME" />. @@ -3737,6 +3745,7 @@ <translation id="6132506775968708399">Bloquear cookies de terceiros</translation> <translation id="6133088669883929098">Permitir que todos os sites usem a geração de chaves</translation> <translation id="6135398260575578389">O "Navegação segura" está ativo no modo avançado. Esse modo oferece maior segurança, mas requer o compartilhamento de mais informações de navegação com o Google.</translation> +<translation id="6135895880862759946">Permitir que os usuários criem perfis secundários e usem o modo visitante no navegador <ph name="LACROS_NAME" /></translation> <translation id="6138636318340561140">Verifica em tempo real o status dos URLs no "Navegação segura"</translation> <translation id="6141402445226505817">Sempre usar detecção de fuso horário aproximada</translation> <translation id="6144046700495610112">Se a política for definida como ativada, os dados de preenchimento automático de formulários serão importados do navegador padrão anterior durante a primeira execução. Se a política for definida como desativada ou não for definida, nenhum dado de preenchimento automático de formulário será importado durante a primeira execução. @@ -5109,6 +5118,12 @@ <translation id="7933141401888114454">Ativar a criação de usuários supervisionados</translation> <translation id="793473937901685727">Definir a disponibilidade do certificado para apps ARC</translation> <translation id="7937766917976512374">Permitir ou negar captura de vídeo</translation> +<translation id="7940359358774136765">Ativa uma página em chrome://password-change que permite que os usuários mudem as respectivas senhas do SAML durante a sessão. Isso garante que a senha do SAML e a da tela de bloqueio do dispositivo permaneçam sincronizadas. + + Esta política também ativa notificações que avisam os usuários se as senhas do SAML estiverem prestes a expirar, para que eles possam mudá-las imediatamente em uma sessão. + No entanto, essas notificações só serão mostradas se as informações de validade da senha forem enviadas para o dispositivo pelo provedor de identidade do SAML durante o fluxo de login do SAML. + + Se a política for definida como "Desativada" ou for deixada sem definição, a senha do SAML não poderá ser alterada em chrome://password-change e notificações não serão exibidas quando as senhas do SAML estiverem prestes a expirar.</translation> <translation id="7941975817681987555">Não prever ações da rede em nenhuma conexão de rede</translation> <translation id="7951605113561734721">Especifica os certificados do cliente em todo o dispositivo que deveriam ser registrados usando o protocolo de gerenciamento do dispositivo.</translation> <translation id="7952007677054834789">Configura as páginas a serem carregadas na inicialização, a página inicial padrão e a página "Nova guia" padrão no <ph name="PRODUCT_NAME" /> e impede que elas sejam alteradas pelos usuários.
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb index 1e4a851..6330025c 100644 --- a/components/policy/resources/policy_templates_ru.xtb +++ b/components/policy/resources/policy_templates_ru.xtb
@@ -903,6 +903,9 @@ Предложенные страницы загружаются с серверов Google. Если для правила задано значение False, подсказки появляться не будут.</translation> +<translation id="2246011554082893079">Правило контролирует использование <ph name="BOREALIS_NAME" /> на этом устройстве. + + Если установлено значение False, <ph name="BOREALIS_NAME" /> будет недоступно для всех пользователей на этом устройстве. Если правило не настроено или установлено значение True, <ph name="BOREALIS_NAME" /> будет доступно, только если другие правила и настройки не запрещают это.</translation> <translation id="225340736558643885">Включать предупреждения для незащищенных форм</translation> <translation id="2258126710006312594">Разрешить пользователям с удаленным доступом переносить файлы с хоста и обратно</translation> <translation id="2261329877420573811">Если в правиле <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> задан параметр <ph name="PRINTERS_WHITELIST" />, правило <ph name="DEVICE_NATIVE_PRINTERS_WHITELIST_POLICY_NAME" /> определяет принтеры, с которыми может работать пользователь. Пользователь может работать только с теми принтерами, идентификаторы которых указаны в правиле. Эти идентификаторы должны соответствовать значениям полей <ph name="ID_FIELD" /> и <ph name="GUID_FIELD" /> в файле, указанном в правиле <ph name="DEVICE_PRINTERS_POLICY_NAME" />. @@ -1448,6 +1451,9 @@ <translation id="2960013482187484833">Использовать в режиме предварительного просмотра последний выбранный принтер</translation> <translation id="2960128438010718932">Правило задает график поэтапного обновления</translation> <translation id="2960691910306063964">Включает/отключает аутентификацию без PIN-кода для хостов удаленного доступа</translation> +<translation id="2964056138564883247">Правило контролирует использование <ph name="BOREALIS_NAME" /> для этого пользователя. + + Если установлено значение False, <ph name="BOREALIS_NAME" /> будет недоступно. Если правило не настроено или установлено значение True, <ph name="BOREALIS_NAME" /> будет доступно, только если другие правила и настройки не запрещают это.</translation> <translation id="2964373560810620158">Запретить пользователям работать в браузере <ph name="LACROS_NAME" /></translation> <translation id="2969797921412053304">Это правило определяет, каким URL будет разрешено выполнять удаленную проверку устройства во время аутентификации с использованием SAML на экране входа. @@ -2711,6 +2717,7 @@ Если вы настроите это правило, пользователи не смогут его изменить. Если правило не настроено, пользователи смогут самостоятельно выбирать, включать эту настройку или нет.</translation> <translation id="4812714598405913256">Сообщение для правила DeviceMinimumVersion о прекращении поддержки автоматического обновления</translation> <translation id="4816674326202173458">Разрешить корпоративному пользователю в многопрофильном режиме быть основным и дополнительным профилем (настройка по умолчанию для самостоятельных профилей)</translation> +<translation id="4820432864264617413">Запретить запуск <ph name="BOREALIS_NAME" /> для пользователя</translation> <translation id="4826326557828204741">Действие в случае превышения времени бездействия при работе от аккумулятора.</translation> <translation id="482803100714220060">Показ полных URL</translation> <translation id="4832852360828533362">Отчеты о пользователях и устройствах</translation> @@ -2724,6 +2731,7 @@ Если правило не настроено или задано неправильно, для отключенных системных функций будет использоваться значение blocked.</translation> <translation id="4835470005923546373">Отключить режим печати фоновых цветов и изображений по умолчанию</translation> <translation id="4835622243021053389">Включить аутентификацию NTLMv2</translation> +<translation id="485419696366295465">Управление правилами, связанными с подсистемами <ph name="BOREALIS_NAME" />.</translation> <translation id="4855636880814771207">Если правило активировано или не задано, пользователи могут включать и выключать Bluetooth. Если правило не активировано, <ph name="PRODUCT_OS_NAME" /> отключает Bluetooth и пользователи не смогут его включить. @@ -3284,6 +3292,7 @@ <translation id="554903022911579950">Kerberos</translation> <translation id="555022085242359084">Включить режим высокой контрастности на экране входа</translation> <translation id="555077880566103058">Разрешить автоматический запуск плагина <ph name="FLASH_PLUGIN_NAME" /> на всех сайтах</translation> +<translation id="5556607617517096419">Borealis</translation> <translation id="5559079916187891399">Это правило не влияет на приложения Android.</translation> <translation id="5560039246134246593">Добавляет параметр при загрузке исходного значения Variations в <ph name="PRODUCT_NAME" />. @@ -3499,6 +3508,7 @@ <translation id="5814301096961727113">Наличие или отсутствие озвучивания действий по умолчанию на экране входа</translation> <translation id="5815129011704381141">Автоматическая перезагрузка после обновления</translation> <translation id="582857022372205358">Включить переплет по короткому краю при двусторонней печати</translation> +<translation id="5830196507442186669">Разрешить устройствам с ОС <ph name="PRODUCT_OS_NAME" /> использовать <ph name="BOREALIS_NAME" /></translation> <translation id="5832274826894536455">Устаревшие правила</translation> <translation id="5835253272509953988">Если правило включено, то пользователи смогут проверять в <ph name="PRODUCT_NAME" />, не стали ли введенные ими данные (например, имена пользователей и пароли) известны посторонним в результате утечки. @@ -3710,6 +3720,7 @@ <translation id="6097601282776163274">Включить анонимный сбор данных с помощью URL</translation> <translation id="6099853574908182288">Цветная печать по умолчанию</translation> <translation id="6102342563050263313">Прокрутка до текстовых фрагментов, указанных в URL</translation> +<translation id="6102449843040973938">Разрешить запуск <ph name="BOREALIS_NAME" /> на устройстве</translation> <translation id="6107642964266628393">Регулирует установку обновлений Chrome OS.</translation> <translation id="6111936128861357925">Разрешает игру с динозавром</translation> <translation id="6123052603197028610">Запретить отправку запросов на серверы Google для получения временных меток</translation> @@ -3773,6 +3784,7 @@ В этом случае пользователи могут подвергнуться рискам безопасности, связанным с запуском подсистемы аудио вне тестовой среды. Если правило не настроено, для запуска аудио в тестовой среде будет использоваться конфигурация по умолчанию. Она может отличаться в зависимости от платформы. Это правило дает компаниям возможность отключать тестовую среду для звука, если ее не позволяют использовать настройки ПО для обеспечения безопасности.</translation> +<translation id="6252773211180267325">Разрешить запуск <ph name="BOREALIS_NAME" /> для пользователя</translation> <translation id="6261643884958898336">Сообщать данные, идентифицирующие компьютер</translation> <translation id="6265892395051519509">Разрешение указанным сайтам доступа к датчикам</translation> <translation id="6273015149273504999"> @@ -4242,6 +4254,7 @@ <translation id="6856743875250214792">Это правило устарело и было удалено в версии M66 из соображений безопасности, поскольку использовалось только для внутреннего тестирования. Определяет, какие настройки будут применяться при запуске <ph name="PRODUCT_NAME" />. Они используются только на экране входа и не распространяются на сеансы пользователей.</translation> +<translation id="6857240169209507953">Запретить запуск <ph name="BOREALIS_NAME" /> на этом устройстве</translation> <translation id="685769593149966548">Обязательное использование строгого Безопасного режима для YouTube</translation> <translation id="686079137349561371">Microsoft Windows 7 и более поздних версиях</translation> <translation id="68818134518270542">Правило позволяет указать список приложений, которые можно использовать для создания заметок на заблокированном экране <ph name="PRODUCT_OS_NAME" />. @@ -4663,6 +4676,7 @@ Если задано значение RemoveLRUIfDormant, при автоматической очистке будут удаляться профили пользователей, вход в которые не выполнялся в течение 3 месяцев и более, начиная с самого раннего времени последнего входа, пока не освободится достаточно места. Если значение не задано, будет использоваться режим очистки по умолчанию. В настоящий момент это RemoveLRUIfDormant.</translation> +<translation id="7334517274921831425">Разрешить пользователям использовать <ph name="BOREALIS_NAME" /> на устройствах с ОС <ph name="PRODUCT_OS_NAME" /></translation> <translation id="7336785017449297672">Регулирует настройки часов и часового пояса.</translation> <translation id="7336878834592315572">Хранить файлы cookie до конца сеанса</translation> <translation id="7338217396351647423">Позволяет задать набор правил, которые будут переданы в среду выполнения ARC. Используя это правило, администраторы могут выбрать, какие Android-приложения устанавливаются автоматически. Значение необходимо указывать в допустимом формате JSON.
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb index 3db4b42..f394b4a6 100644 --- a/components/policy/resources/policy_templates_th.xtb +++ b/components/policy/resources/policy_templates_th.xtb
@@ -1124,6 +1124,13 @@ หากไม่มีการตั้งค่านโยบายนี้ ระบบจะปิดฟีเจอร์ไฮไลต์เคอร์เซอร์ข้อความในขั้นต้น แต่ผู้ใช้เปิดใช้ได้ทุกเมื่อ</translation> <translation id="2509919237512982967">ใช้ตัวควบคุมแบบฟอร์มเดิมจนถึงเวอร์ชัน M84</translation> <translation id="2515699738406900920">ความพร้อมใช้งานของเครื่องมือเลือกโปรไฟล์เมื่อเริ่มต้นระบบ</translation> +<translation id="2515914624025258624">การตั้งค่านี้อนุญาตให้ผู้ใช้สร้างโปรไฟล์รองและใช้โหมดผู้มาเยือนในเบราว์เซอร์ <ph name="LACROS_NAME" /> + + หากตั้งค่านโยบายนี้เป็น "เท็จ" หรือไม่ได้ตั้งค่า ผู้ใช้จะสร้างโปรไฟล์รองและใช้โหมดผู้มาเยือนไม่ได้ ซึ่งคล้ายกับทั้งนโยบาย BrowserAddPersonEnabled และ BrowserGuestModeEnabled + + หากตั้งค่านโยบายนี้เป็น "จริง" ผู้ใช้จะสร้างโปรไฟล์รองและใช้โหมดผู้มาเยือนได้ + + โปรดทราบว่าหากตั้งค่านโยบายนี้เป็น "จริง" แต่ตั้งค่า BrowserAddPersonEnabled เป็น "เท็จ" ผู้ใช้จะสร้างโปรไฟล์รองไม่ได้ และการตั้งค่าดังกล่าวจะทำงานเหมือนกันสำหรับนโยบาย BrowserGuestModeEnabled กับโหมดผู้มาเยือน</translation> <translation id="2517466659416174529">อนุญาตการระงับแท็บที่ทำงานอยู่เบื้องหลัง</translation> <translation id="2518231489509538392">อนุญาตให้เล่นเสียง</translation> <translation id="2521581787935130926">แสดงทางลัดของแอปในแถบบุ๊กมาร์ก</translation> @@ -3197,6 +3204,7 @@ หากตั้งค่านโยบายนี้เป็น "ปิดใช้" ระบบจะบังคับให้ปิดใช้ฟีเจอร์ </translation> +<translation id="5432043531153963184">ป้องกันไม่ให้ผู้ใช้สร้างโปรไฟล์รองและใช้โหมดผู้มาเยือนในเบราว์เซอร์ <ph name="LACROS_NAME" /></translation> <translation id="5442026853063570579">นโยบายนี้ยังควบคุมการเข้าถึงตัวเลือกสำหรับนักพัฒนาซอฟต์แวร์ของ Android เช่นกัน หากคุณตั้งค่านโยบายนี้เป็น "DeveloperToolsDisallowed" (ค่า 2) ผู้ใช้จะเข้าถึงตัวเลือกสำหรับนักพัฒนาซอฟต์แวร์ไม่ได้ หากตั้งค่านโยบายเป็นค่าอื่นหรือไม่ได้ตั้งค่า ผู้ใช้จะเข้าถึงตัวเลือกสำหรับนักพัฒนาซอฟต์แวร์ได้ด้วยการแตะหมายเลขบิลด์ 7 ครั้งในแอปการตั้งค่าของ Android</translation> <translation id="5445596354079213552">นโยบายนี้มีผลเฉพาะเมื่อการอัปเดตอัตโนมัติของอุปกรณ์ถึงวันหมดอายุแล้วและอุปกรณ์มีเวอร์ชันไม่ตรงตามเวอร์ชันขั้นต่ำที่อนุญาตของ <ph name="PRODUCT_OS_NAME" /> ซึ่งตั้งค่าผ่านนโยบาย <ph name="DEVICE_MINIMUM_VERSION_POLICY_NAME" /> @@ -3688,6 +3696,7 @@ <translation id="6132506775968708399">บล็อกคุกกี้ของบุคคลที่สาม</translation> <translation id="6133088669883929098">อนุญาตให้เว็บไซต์ทั้งหมดใช้การสร้างคีย์</translation> <translation id="6135398260575578389">Google Safe Browsing ทำงานในโหมดเพิ่มประสิทธิภาพ โหมดนี้รักษาความปลอดภัยได้ดีขึ้นแต่ต้องมีการแชร์ข้อมูลการท่องเว็บกับ Google มากขึ้น</translation> +<translation id="6135895880862759946">อนุญาตให้ผู้ใช้สร้างโปรไฟล์รองและใช้โหมดผู้มาเยือนในเบราว์เซอร์ <ph name="LACROS_NAME" /></translation> <translation id="6138636318340561140">ตรวจสอบสถานะ Google Safe Browsing ของ URL แบบเรียลไทม์</translation> <translation id="6141402445226505817">ใช้การตรวจหาเขตเวลาคร่าวๆ ทุกครั้ง</translation> <translation id="6144046700495610112">การตั้งค่านโยบายเป็น "เปิดใช้" จะนำเข้าข้อมูลฟอร์มที่ป้อนอัตโนมัติจากเบราว์เซอร์เริ่มต้นก่อนหน้าเมื่อเรียกใช้ครั้งแรก การตั้งค่านโยบายเป็น "ปิดใช้" หรือไม่ได้ตั้งค่า หมายความว่าจะไม่มีการนำเข้าข้อมูลฟอร์มที่ป้อนอัตโนมัติเมื่อเรียกใช้ครั้งแรก @@ -5063,6 +5072,12 @@ <translation id="7933141401888114454">เปิดใช้งานการสร้างผู้ใช้ภายใต้การควบคุมดูแล</translation> <translation id="793473937901685727">ตั้งค่าความพร้อมใช้งานของใบรับรองสำหรับแอป ARC</translation> <translation id="7937766917976512374">อนุญาตหรือปฏิเสธการจับวิดีโอ</translation> +<translation id="7940359358774136765">เปิดใช้หน้าใน chrome://password-change ที่อนุญาตให้ผู้ใช้ SAML เปลี่ยนรหัสผ่าน SAML ของตนขณะอยู่ในเซสชัน ซึ่งจะดูแลให้รหัสผ่าน SAML และรหัสผ่านหน้าจอล็อกอุปกรณ์ซิงค์กัน + + นโยบายนี้ยังเปิดใช้การแจ้งเตือนที่เตือนผู้ใช้ SAML หากรหัสผ่าน SAML ใกล้จะหมดอายุ เพื่อให้ผู้ใช้จัดการเรื่องนี้ทันทีด้วยการเปลี่ยนรหัสผ่านในเซสชัน + แต่การแจ้งเตือนเหล่านี้จะแสดงเมื่อผู้ให้บริการข้อมูลประจำตัว SAML ส่งข้อมูลการหมดอายุของรหัสผ่านไปยังอุปกรณ์ระหว่างขั้นตอนการเข้าสู่ระบบ SAML เท่านั้น + + การตั้งค่านโยบายนี้เป็น "ปิดใช้" หรือไม่ได้ตั้งค่าจะทำให้เปลี่ยนรหัสผ่าน SAML ที่ chrome://password-change ไม่ได้ และจะไม่มีการแจ้งเตือนเมื่อรหัสผ่าน SAML ใกล้หมดอายุ</translation> <translation id="7941975817681987555">อย่าคาดการณ์การทำงานของเครือข่ายจากการเชื่อมต่อเครือข่ายใดๆ</translation> <translation id="7951605113561734721">ระบุใบรับรองไคลเอ็นต์ระดับอุปกรณ์ที่ต้องลงทะเบียนโดยใช้โปรโตคอลการจัดการอุปกรณ์</translation> <translation id="7952007677054834789">กำหนดค่าหน้าที่จะโหลดเมื่อเริ่มต้นใช้งาน หน้าแรกเริ่มต้นและหน้าแท็บใหม่เริ่มต้นใน <ph name="PRODUCT_NAME" /> และป้องกันไม่ให้ผู้ใช้เปลี่ยนแปลงหน้าเหล่านี้
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb index d70275b..4a038e9b 100644 --- a/components/policy/resources/policy_templates_uk.xtb +++ b/components/policy/resources/policy_templates_uk.xtb
@@ -1143,6 +1143,13 @@ Якщо це правило не налаштовано, виділення символу вставки буде вимкнено, але користувач може будь-коли ввімкнути його.</translation> <translation id="2509919237512982967">Використовувати застарілі елементи керування формами у версіях до M84.</translation> <translation id="2515699738406900920">Можливість вибору профілю під час запуску</translation> +<translation id="2515914624025258624">За допомогою цього налаштування можна дозволити користувачам створювати додаткові профілі та вмикати режим гостя у веб-переглядачі <ph name="LACROS_NAME" />. + + Якщо для цього правила (схоже як для правил BrowserAddPersonEnabled і BrowserGuestModeEnabled) вибрано значення false або його не налаштовано, користувач не зможе створювати додаткові профілі та вмикати режим гостя. + + Якщо для цього правила вибрано значення true, користувач зможе створювати додаткові профілі та вмикати режим гостя. + + Зверніть увагу: якщо для цього правила вибрано значення true, а для правила BrowserAddPersonEnabled – false, користувач не зможе створювати додаткові профілі. Те саме стосується правила BrowserGuestModeEnabled і режиму гостя.</translation> <translation id="2517466659416174529">Дозволити фоновим вкладкам зависати</translation> <translation id="2518231489509538392">Дозволити відтворення аудіо</translation> <translation id="2521581787935130926">Показувати ярлик додатка на панелі закладок</translation> @@ -3243,6 +3250,7 @@ Якщо це правило деактивовано, функцію буде примусово вимкнено. </translation> +<translation id="5432043531153963184">Заборонити користувачам створювати додаткові профілі та вмикати режим гостя у веб-переглядачі <ph name="LACROS_NAME" /></translation> <translation id="5442026853063570579">Це правило також керує доступом до Параметрів розробника Android. Якщо для нього встановлено значення DeveloperToolsDisallowed (значення 2), користувачі не матимуть доступу до Параметрів розробника. Якщо це правило не налаштовано або для нього встановлено інше значення, користувачі можуть отримувати доступ до Параметрів розробника, сім разів торкнувшись номера складання в додатку Налаштування Android.</translation> <translation id="5445596354079213552">Це правило працює, лише коли припиняється дія автоматичних оновлень пристрою й він перестає відповідати вимогам до мінімальної дозволеної версії <ph name="PRODUCT_OS_NAME" />, як указано в правилі <ph name="DEVICE_MINIMUM_VERSION_POLICY_NAME" />. @@ -3761,6 +3769,7 @@ <translation id="6132506775968708399">Блокувати сторонні файли cookie</translation> <translation id="6133088669883929098">Дозволити всім сайтам генерувати ключі</translation> <translation id="6135398260575578389">Безпечний перегляд увімкнено в режимі покращеного захисту. Цей режим забезпечує вищий рівень захисту, але в Google надсилатиметься більше інформації.</translation> +<translation id="6135895880862759946">Дозволити користувачам створювати додаткові профілі та вмикати режим гостя у веб-переглядачі <ph name="LACROS_NAME" /></translation> <translation id="6138636318340561140">Перевіряти статус URL-адрес у реальному часі за допомогою Безпечного перегляду</translation> <translation id="6141402445226505817">Завжди приблизно визначати часовий пояс</translation> <translation id="6144046700495610112">Якщо це правило активовано, дані автозаповнення форм із попереднього веб-переглядача за умовчанням імпортуються під час першого запуску. Якщо це правило деактивовано або не налаштовано, дані автозаповнення форм не імпортуються під час першого запуску. @@ -5136,6 +5145,12 @@ <translation id="7933141401888114454">Вмикає створення контрольованих користувачів</translation> <translation id="793473937901685727">Налаштування доступності сертифікатів для додатків ARC</translation> <translation id="7937766917976512374">Дозволити чи заборонити запис відео</translation> +<translation id="7940359358774136765">Вмикає сторінку за адресою chrome://password-change, що дозволяє користувачам змінювати паролі SAML під час сеансу. Це дає змогу синхронізувати пароль SAML і пароль екрана блокування пристрою. + + Це правило також вмикає сповіщення про завершення терміну дії пароля SAML, щоб користувачі могли вчасно змінити його під час сеансу. + Ці сповіщення з'являються, лише якщо постачальник ідентифікаторів SAML надсилає на пристрій інформацію про завершення терміну дії пароля під час входу через SAML. + + Якщо це правило вимкнено або не налаштовано, паролі SAML не можна буде змінювати на сторінці chrome://password-change, а сповіщення про завершення терміну їх дії не з'являтимуться.</translation> <translation id="7941975817681987555">Не передбачати дії в мережі</translation> <translation id="7951605113561734721">Визначає сертифікати клієнтів на рівні пристрою, які потрібно реєструвати через протокол керування пристроєм.</translation> <translation id="7952007677054834789">Налаштовує сторінки, які завантажуються під час запуску, а також домашню сторінку та сторінку нової вкладки за умовчанням у <ph name="PRODUCT_NAME" />. Користувачі не можуть змінювати їх.
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb index 9362160..7371fd6 100644 --- a/components/policy/resources/policy_templates_vi.xtb +++ b/components/policy/resources/policy_templates_vi.xtb
@@ -916,6 +916,9 @@ Hệ thống sẽ tìm nạp từ xa các nội dung đề xuất này từ các máy chủ của Google. Nếu bạn đặt tùy chọn cài đặt này thành false, thì hệ thống sẽ không tìm nạp hay hiển thị nội dung đề xuất.</translation> +<translation id="2246011554082893079">Kiểm soát khả năng sử dụng <ph name="BOREALIS_NAME" /> trên thiết bị này. + + Nếu bạn tắt chính sách này, tất cả người dùng của thiết bị sẽ không sử dụng được <ph name="BOREALIS_NAME" />. Khi bạn bật hoặc không đặt chính sách này, <ph name="BOREALIS_NAME" /> sẽ chỉ sử dụng được nếu không bị chế độ cài đặt hoặc chính sách khác vô hiệu hóa.</translation> <translation id="225340736558643885">Bật cảnh báo đối với biểu mẫu không an toàn</translation> <translation id="2258126710006312594">Cho phép người dùng truy cập từ xa chuyển tệp từ/đến máy chủ</translation> <translation id="2261329877420573811">Nếu bạn chọn <ph name="PRINTERS_WHITELIST" /> cho <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, việc đặt <ph name="DEVICE_NATIVE_PRINTERS_WHITELIST_POLICY_NAME" /> sẽ chỉ định những máy in mà người dùng có thể sử dụng. Người dùng chỉ có thể sử dụng những máy in có mã nhận dạng khớp với giá trị trong chính sách này. Các mã nhận dạng này phải tương ứng với trường <ph name="ID_FIELD" /> hoặc <ph name="GUID_FIELD" /> ở tệp được chỉ định trong <ph name="DEVICE_PRINTERS_POLICY_NAME" />. @@ -1465,6 +1468,9 @@ <translation id="2960013482187484833">Dùng máy in được sử dụng gần đây nhất làm lựa chọn mặc định trong chế độ Xem trước bản in</translation> <translation id="2960128438010718932">Lịch trình thử nghiệm cho việc áp dụng bản cập nhật mới</translation> <translation id="2960691910306063964">Bật hoặc tắt xác thực không có mã PIN cho các máy chủ truy cập từ xa</translation> +<translation id="2964056138564883247">Kiểm soát khả năng sử dụng <ph name="BOREALIS_NAME" /> đối với người dùng này. + + Nếu bạn tắt chính sách này, <ph name="BOREALIS_NAME" /> sẽ không sử dụng được. Khi bạn bật hoặc không đặt chính sách này, <ph name="BOREALIS_NAME" /> sẽ chỉ sử dụng được nếu không bị chế độ cài đặt hoặc chính sách khác vô hiệu hóa.</translation> <translation id="2964373560810620158">Ngăn người dùng sử dụng trình duyệt <ph name="LACROS_NAME" /></translation> <translation id="2969797921412053304">Chính sách này định cấu hình URL sẽ được cấp quyền sử dụng tính năng chứng thực từ xa danh tính thiết bị trong quy trình SAML trên màn hình đăng nhập. @@ -2737,6 +2743,7 @@ Nếu bạn đặt chính sách này, thì người dùng sẽ không thể thay đổi được. Nếu bạn không đặt chính sách này, thì người dùng sẽ quyết định xem kệ có tự động ẩn hay không.</translation> <translation id="4812714598405913256">Định cấu hình thông báo hết thời hạn tự động cập nhật cho chính sách DeviceMinimumVersion</translation> <translation id="4816674326202173458">Cho phép người dùng doanh nghiệp trở thành người dùng vừa chính vừa phụ (Hành vi mặc định cho người dùng không được quản lý)</translation> +<translation id="4820432864264617413">Không cho phép một người dùng chạy <ph name="BOREALIS_NAME" /></translation> <translation id="4826326557828204741">Tác vụ sẽ thực hiện khi đạt độ trễ không hoạt động trong khi chạy bằng nguồn pin</translation> <translation id="482803100714220060">Hiển thị URL đầy đủ</translation> <translation id="4832852360828533362">Báo cáo người dùng và thiết bị</translation> @@ -2750,6 +2757,7 @@ Nếu bạn không đặt chính sách này hoặc đặt giá trị không hợp lệ, chế độ tắt của các tính năng hệ thống sẽ "bị chặn".</translation> <translation id="4835470005923546373">Tắt chế độ in đồ họa nền theo mặc định</translation> <translation id="4835622243021053389">Bật tính năng xác thực NTLMv2.</translation> +<translation id="485419696366295465">Kiểm soát các chính sách liên quan đến hệ thống con <ph name="BOREALIS_NAME" />.</translation> <translation id="4855636880814771207">Nếu bạn đặt chính sách này thành Bật hoặc không đặt chính sách này, thì người dùng có thể bật hoặc tắt Bluetooth. Nếu bạn đặt chính sách này thành Tắt, thì <ph name="PRODUCT_OS_NAME" /> sẽ tắt Bluetooth và người dùng không thể bật được. @@ -3321,6 +3329,7 @@ <translation id="554903022911579950">Kerberos</translation> <translation id="555022085242359084">Bật chế độ tương phản cao trên màn hình đăng nhập</translation> <translation id="555077880566103058">Cho phép tất cả các trang web tự động chạy plugin <ph name="FLASH_PLUGIN_NAME" /></translation> +<translation id="5556607617517096419">Borealis</translation> <translation id="5559079916187891399">Chính sách này không ảnh hưởng đến các ứng dụng Android.</translation> <translation id="5560039246134246593">Thêm thông số cho quá trình tìm nạp khởi đầu Biến thể trong <ph name="PRODUCT_NAME" />. @@ -3536,6 +3545,7 @@ <translation id="5814301096961727113">Đặt trạng thái phản hồi bằng giọng nói mặc định trên màn hình đăng nhập</translation> <translation id="5815129011704381141">Tự động khởi động lại sau khi cập nhật</translation> <translation id="582857022372205358">Bật chế độ in hai mặt với cạnh ngắn</translation> +<translation id="5830196507442186669">Cho phép các thiết bị sử dụng <ph name="BOREALIS_NAME" /> trên <ph name="PRODUCT_OS_NAME" /></translation> <translation id="5832274826894536455">Chính sách không còn dùng nữa</translation> <translation id="5835253272509953988">Nếu bạn đặt chính sách này thành Bật, người dùng có thể yêu cầu <ph name="PRODUCT_NAME" /> kiểm tra xem tên người dùng và mật khẩu đã nhập có bị rò rỉ hay không. @@ -3748,6 +3758,7 @@ <translation id="6097601282776163274">Bật tính năng thu thập dữ liệu ẩn danh có khóa URL</translation> <translation id="6099853574908182288">Chế độ in màu mặc định</translation> <translation id="6102342563050263313">Bật tùy chọn cuộn đến những phần văn bản cụ thể trong URL</translation> +<translation id="6102449843040973938">Cho phép <ph name="BOREALIS_NAME" /> chạy trên một thiết bị</translation> <translation id="6107642964266628393">Kiểm soát cách thức và thời điểm áp dụng bản cập nhật Chrome OS.</translation> <translation id="6111936128861357925">Cho phép trò chơi trứng khủng long Phục sinh</translation> <translation id="6123052603197028610">Không cho phép gửi các truy vấn đến máy chủ của Google để truy xuất dấu thời gian</translation> @@ -3814,6 +3825,7 @@ Điều này sẽ khiến người dùng có nguy cơ gặp phải các rủi ro bảo mật liên quan đến việc chạy hệ thống con âm thanh không ở trong môi trường hộp cát. Nếu bạn không đặt chính sách này, thì cấu hình mặc định cho hộp cát âm thanh sẽ được sử dụng. Cấu hình này có thể khác nhau tùy theo nền tảng. Chính sách này nhằm cho phép doanh nghiệp có thể tắt hộp cát âm thanh một cách linh hoạt nếu họ sử dụng các tùy chọn thiết lập phần mềm bảo mật gây cản trở hộp cát.</translation> +<translation id="6252773211180267325">Cho phép một người dùng chạy <ph name="BOREALIS_NAME" /></translation> <translation id="6261643884958898336">Báo cáo thông tin nhận dạng máy</translation> <translation id="6265892395051519509">Cho phép sử dụng cảm biến trên các trang web này</translation> <translation id="6273015149273504999"> @@ -4283,6 +4295,7 @@ <translation id="6856743875250214792">Chính sách này không được dùng nữa và đã bị xóa trong M66, vì chính sách này trước đây chỉ dùng để kiểm tra nội bộ và tiềm ẩn nguy cơ bảo mật. Chỉ định cờ sẽ được áp dụng cho <ph name="PRODUCT_NAME" /> khi khởi động. Cờ được chỉ định sẽ chỉ được áp dụng trên màn hình đăng nhập. Các cờ được đặt qua chính sách này không phản ánh trong các phiên của người dùng.</translation> +<translation id="6857240169209507953">Không cho phép <ph name="BOREALIS_NAME" /> chạy trên một thiết bị</translation> <translation id="685769593149966548">Buộc sử dụng Chế độ hạn chế nghiêm ngặt cho YouTube</translation> <translation id="686079137349561371">Microsoft Windows 7 trở lên</translation> <translation id="68818134518270542">Nếu bạn đặt chính sách này, hệ thống sẽ chỉ định những ứng dụng mà người dùng có thể bật làm ứng dụng ghi chú trên màn hình khóa của <ph name="PRODUCT_OS_NAME" />. @@ -4708,6 +4721,7 @@ Nếu chính sách này được đặt thành 'RemoveLRUIfDormant', tính năng dọn sạch tự động sẽ tiếp tục xóa người dùng đã không đăng nhập trong ít nhất 3 tháng theo thứ tự gần đây ít đăng nhập nhất cho tới khi có đủ dung lượng trống. Nếu chính sách này không được đặt, tính năng dọn sạch tự động sẽ sử dụng chiến lược tích hợp sẵn mặc định. Hiện tại đó là chiến lược 'RemoveLRUIfDormant'.</translation> +<translation id="7334517274921831425">Cho phép người dùng sử dụng <ph name="BOREALIS_NAME" /> trên <ph name="PRODUCT_OS_NAME" /></translation> <translation id="7336785017449297672">Kiểm soát các tùy chọn cài đặt đồng hồ và múi giờ.</translation> <translation id="7336878834592315572">Lưu giữ cookie trong thời hạn phiên</translation> <translation id="7338217396351647423">Nếu bạn đặt chính sách này, thì bộ chính sách cần chuyển giao cho thời gian chạy ARC sẽ được chỉ rõ. Quản trị viên có thể sử dụng bộ chính sách này để chọn các ứng dụng Android tự động cài đặt. Nhập giá trị ở định dạng JSON hợp lệ.
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb index 2bc49f6..a6bb2cb 100644 --- a/components/policy/resources/policy_templates_zh-TW.xtb +++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -896,6 +896,9 @@ <translation id="2241498944622759244">此功能從未推出,因此這項政策目前已淘汰。如果將這項政策設為 True 或不設定,<ph name="PRODUCT_NAME" /> 會提供與目前網頁相關的網頁建議。 這些建議擷取自遠端的 Google 伺服器。 如果設為 False,則系統不會進行擷取,也不會顯示建議。</translation> +<translation id="2246011554082893079">這項政策可控管 <ph name="BOREALIS_NAME" /> 是否適用於這部裝置。 + + 如果將這項政策設為 False,<ph name="BOREALIS_NAME" /> 就不適用於此裝置的所有使用者。如果不設定這項政策或設為 True,<ph name="BOREALIS_NAME" /> 只要未遭到其他政策或設定所停用,便適用於這部裝置。</translation> <translation id="225340736558643885">啟用不安全表單的警告功能</translation> <translation id="2258126710006312594">允許遠端存取使用者向主機傳輸檔案,或從主機接收檔案</translation> <translation id="2261329877420573811">如果在 <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> 中選擇了 <ph name="PRINTERS_WHITELIST" />,系統會根據 <ph name="DEVICE_NATIVE_PRINTERS_WHITELIST_POLICY_NAME" /> 的設定指定使用者可操作的印表機。只有 ID 與這項政策值相符的印表機,才會提供給使用者。印表機 ID 必須與 <ph name="DEVICE_PRINTERS_POLICY_NAME" /> 政策指定檔案的 <ph name="ID_FIELD" /> 或 <ph name="GUID_FIELD" /> 欄位值相符。 @@ -1441,6 +1444,9 @@ <translation id="2960013482187484833">將最近使用的印表機設為列印預覽中的預設選項</translation> <translation id="2960128438010718932">分階段套用更新的時程</translation> <translation id="2960691910306063964">針對遠端存取主機啟用或停用無 PIN 碼驗證機制</translation> +<translation id="2964056138564883247">這項政策可控管 <ph name="BOREALIS_NAME" /> 是否適用於這位使用者。 + + 如果將這項政策設為 False,<ph name="BOREALIS_NAME" /> 就不適用於該使用者。如果不設定這項政策或設為 True,<ph name="BOREALIS_NAME" /> 只要未遭到其他政策或設定所停用,便適用於這位使用者。</translation> <translation id="2964373560810620158">禁止使用者使用 <ph name="LACROS_NAME" /> 瀏覽器</translation> <translation id="2969797921412053304">這項政策會設定哪些網址可在登入畫面的 SAML 流程中,取得使用裝置身分遠端認證機制的存取權。 @@ -2693,6 +2699,7 @@ 如果設定這項政策,使用者將無法變更。如果未設定,使用者可自行決定是否要自動隱藏檔案櫃。</translation> <translation id="4812714598405913256">設定 DeviceMinimumVersion 政策的自動更新期限訊息</translation> <translation id="4816674326202173458">允許企業使用者成為主要或次要使用者 (非管理化環境中使用者的預設行為)</translation> +<translation id="4820432864264617413">禁止使用者執行 <ph name="BOREALIS_NAME" /></translation> <translation id="4826326557828204741">使用電池電源的情況下,系統在達到閒置延遲時間時所採取的動作</translation> <translation id="482803100714220060">顯示完整網址</translation> <translation id="4832852360828533362">使用者與裝置回報功能</translation> @@ -2706,6 +2713,7 @@ 如果未設定這項政策或設為無效的值,系統功能的停用模式將設為「已封鎖」。</translation> <translation id="4835470005923546373">預設停用背景圖形列印模式</translation> <translation id="4835622243021053389">啟用 NTLMv2 驗證。</translation> +<translation id="485419696366295465">控管 <ph name="BOREALIS_NAME" /> 子系統的相關政策。</translation> <translation id="4855636880814771207">如果將這項政策設為啟用或不設定,使用者將可開啟或關閉藍牙。 如果將這項政策設為停用,<ph name="PRODUCT_OS_NAME" />會關閉藍牙,且使用者無法開啟。 @@ -3268,6 +3276,7 @@ <translation id="554903022911579950">Kerberos</translation> <translation id="555022085242359084">在登入畫面上啟用高對比模式</translation> <translation id="555077880566103058">允許所有網站自動執行 <ph name="FLASH_PLUGIN_NAME" /> 外掛程式</translation> +<translation id="5556607617517096419">Borealis</translation> <translation id="5559079916187891399">這項政策對 Android 應用程式沒有影響。</translation> <translation id="5560039246134246593">在 <ph name="PRODUCT_NAME" /> 中擷取變異版本種子時新增參數。 @@ -3462,6 +3471,7 @@ <translation id="5814301096961727113">設定互動朗讀在登入畫面的預設狀態</translation> <translation id="5815129011704381141">更新完成後自動重新啟動</translation> <translation id="582857022372205358">啟用短邊雙面列印</translation> +<translation id="5830196507442186669">允許裝置在 <ph name="PRODUCT_OS_NAME" />中使用 <ph name="BOREALIS_NAME" /></translation> <translation id="5832274826894536455">已淘汰的政策</translation> <translation id="5835253272509953988">如果將這項政策設為啟用,使用者將可讓 <ph name="PRODUCT_NAME" /> 檢查已輸入的使用者名稱和密碼是否有外洩情況。這項政策一經設定,使用者就無法在 <ph name="PRODUCT_NAME" /> 中變更。如果不設定這項政策,系統可執行憑證外洩檢查,但使用者可停用該功能。 @@ -3658,6 +3668,7 @@ <translation id="6097601282776163274">啟用輸入網址匿名資料收集功能</translation> <translation id="6099853574908182288">預設列印色彩模式</translation> <translation id="6102342563050263313">啟用捲動至網址片段所指定文字的功能</translation> +<translation id="6102449843040973938">允許在裝置上執行 <ph name="BOREALIS_NAME" /></translation> <translation id="6107642964266628393">控管 Chrome 作業系統的更新方式和更新時間。</translation> <translation id="6111936128861357925">允許 Dinosaur Easter Egg Game (恐龍復活節彩蛋遊戲)</translation> <translation id="6123052603197028610">不允許向 Google 伺服器發送擷取時間戳記的查詢</translation> @@ -3721,6 +3732,7 @@ 如果不採用沙箱機制執行音訊子系統,可能會讓使用者面臨安全性風險。 如果不設定這項政策,系統會使用音訊沙箱的預設設定 (視不同平台而定)。 這項政策的用途是讓企業能彈性停用音訊沙箱,避免安全性軟體的設定干擾沙箱運作。</translation> +<translation id="6252773211180267325">允許使用者執行 <ph name="BOREALIS_NAME" /></translation> <translation id="6261643884958898336">回報裝置識別資訊</translation> <translation id="6265892395051519509">允許在這些網站上存取感應器</translation> <translation id="6273015149273504999"> @@ -4188,6 +4200,7 @@ <translation id="6856743875250214792">這項政策僅供內部測試,而且有安全性方面的問題,因此 M66 已淘汰並移除這項政策。 指定要在 <ph name="PRODUCT_NAME" /> 啟動時套用的設定。系統僅會在進入登入畫面時套用指定的設定。透過這個政策所指定的設定不會反映在使用者工作階段中。</translation> +<translation id="6857240169209507953">禁止在裝置上執行 <ph name="BOREALIS_NAME" /></translation> <translation id="685769593149966548">強制執行 YouTube 高度嚴格篩選模式</translation> <translation id="686079137349561371">Microsoft Windows 7 以上版本</translation> <translation id="68818134518270542">你可以透過這項政策指定應用程式,允許使用者在 <ph name="PRODUCT_OS_NAME" />螢幕鎖定畫面上以筆記應用程式的形式開啟。 @@ -4613,6 +4626,7 @@ 如果這項政策設為「RemoveLRUIfDormant」,自動清理作業將會根據使用者的近期登入次數,從次數最少的使用者開始,依序把至少 3 個月未登入的使用者從裝置上移除,直到有足夠的可用空間為止。 如果未設定這項政策,自動清理作業將會採用目前的預設內建策略:「RemoveLRUIfDormant」。</translation> +<translation id="7334517274921831425">允許使用者在 <ph name="PRODUCT_OS_NAME" />中使用 <ph name="BOREALIS_NAME" /></translation> <translation id="7336785017449297672">控管時鐘和時區設定。</translation> <translation id="7336878834592315572">在工作階段期間保留 Cookie</translation> <translation id="7338217396351647423">設定這項政策會指定要傳送給 ARC 執行階段的一組政策。管理員可以使用這組政策來選取要自動安裝的 Android 應用程式。輸入的值必須採用有效的 JSON 格式。
diff --git a/components/power_metrics/BUILD.gn b/components/power_metrics/BUILD.gn deleted file mode 100644 index 64daf044..0000000 --- a/components/power_metrics/BUILD.gn +++ /dev/null
@@ -1,17 +0,0 @@ -# Copyright 2020 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. - -if (is_android) { - static_library("power_metrics") { - sources = [ - "android_battery_metrics.cc", - "android_battery_metrics.h", - ] - - deps = [ - "//base", - "//net", - ] - } -}
diff --git a/components/power_metrics/DEPS b/components/power_metrics/DEPS deleted file mode 100644 index ba0a8ec..0000000 --- a/components/power_metrics/DEPS +++ /dev/null
@@ -1,3 +0,0 @@ -include_rules = [ - "+net/android", -]
diff --git a/components/power_metrics/DIR_METADATA b/components/power_metrics/DIR_METADATA deleted file mode 100644 index e80036e..0000000 --- a/components/power_metrics/DIR_METADATA +++ /dev/null
@@ -1,3 +0,0 @@ -monorail: { - component: "Speed>Metrics" -}
diff --git a/components/power_metrics/OWNERS b/components/power_metrics/OWNERS deleted file mode 100644 index 08a5eab..0000000 --- a/components/power_metrics/OWNERS +++ /dev/null
@@ -1,3 +0,0 @@ -eseckler@chromium.org -skyostil@chromium.org -khokhlov@google.com
diff --git a/components/safe_browsing/core/db/v4_local_database_manager.cc b/components/safe_browsing/core/db/v4_local_database_manager.cc index e6027f5..508deed 100644 --- a/components/safe_browsing/core/db/v4_local_database_manager.cc +++ b/components/safe_browsing/core/db/v4_local_database_manager.cc
@@ -12,10 +12,13 @@ #include "base/callback_helpers.h" #include "base/command_line.h" #include "base/containers/contains.h" +#include "base/containers/fixed_flat_map.h" +#include "base/files/file.h" #include "base/files/file_util.h" #include "base/memory/ref_counted.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" +#include "base/strings/string_piece.h" #include "base/strings/string_tokenizer.h" #include "base/task/post_task.h" #include "base/task/thread_pool.h" @@ -45,6 +48,14 @@ const ThreatSeverity kLeastSeverity = std::numeric_limits<ThreatSeverity>::max(); +// This map contain pairs of the old and the new name for certain .store files. +constexpr auto kStoreFilesToRename = + base::MakeFixedFlatMap<base::StringPiece, base::StringPiece>({ + {"CertCsdDownloadWhitelist.store", "CertCsdDownloadAllowlist.store"}, + {"UrlCsdDownloadWhitelist.store", "UrlCsdDownloadAllowlist.store"}, + {"UrlCsdWhitelist.store", "UrlCsdAllowlist.store"}, + }); + ListInfos GetListInfos() { // NOTE(vakh): When adding a store here, add the corresponding store-specific // histograms also. @@ -72,8 +83,6 @@ const bool kSyncAlways = true; const bool kSyncNever = false; - // TODO(jkarlin): Rename files on disk with 'whitelist' in them to - // 'allowlist'. return ListInfos({ ListInfo(kSyncOnDesktopBuilds, "IpMalware.store", GetIpMalwareId(), SB_THREAT_TYPE_UNUSED), @@ -87,17 +96,17 @@ SB_THREAT_TYPE_URL_BINARY_MALWARE), ListInfo(kSyncOnDesktopBuilds, "ChromeExtMalware.store", GetChromeExtMalwareId(), SB_THREAT_TYPE_EXTENSION), - ListInfo(kSyncOnChromeDesktopBuilds, "CertCsdDownloadWhitelist.store", + ListInfo(kSyncOnChromeDesktopBuilds, "CertCsdDownloadAllowlist.store", GetCertCsdDownloadAllowlistId(), SB_THREAT_TYPE_UNUSED), ListInfo(kSyncOnChromeDesktopBuilds, "ChromeUrlClientIncident.store", GetChromeUrlClientIncidentId(), SB_THREAT_TYPE_BLOCKLISTED_RESOURCE), ListInfo(kSyncAlways, "UrlBilling.store", GetUrlBillingId(), SB_THREAT_TYPE_BILLING), - ListInfo(kSyncOnChromeDesktopBuilds, "UrlCsdDownloadWhitelist.store", + ListInfo(kSyncOnChromeDesktopBuilds, "UrlCsdDownloadAllowlist.store", GetUrlCsdDownloadAllowlistId(), SB_THREAT_TYPE_UNUSED), ListInfo(kSyncOnChromeDesktopBuilds || kSyncOnIos, - "UrlCsdWhitelist.store", GetUrlCsdAllowlistId(), + "UrlCsdAllowlist.store", GetUrlCsdAllowlistId(), SB_THREAT_TYPE_CSD_ALLOWLIST), ListInfo(kSyncOnChromeDesktopBuilds, "UrlSubresourceFilter.store", GetUrlSubresourceFilterId(), SB_THREAT_TYPE_SUBRESOURCE_FILTER), @@ -291,6 +300,8 @@ : base::ThreadPool::CreateSequencedTaskRunner( {base::MayBlock(), base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN})) { + RenameOldStoreFiles(); + DCHECK(!base_path_.empty()); DCHECK(!list_infos_.empty()); } @@ -539,8 +550,6 @@ } bool V4LocalDatabaseManager::IsDownloadProtectionEnabled() const { - // TODO(vakh): Investigate the possibility of using a command line switch for - // this instead. return true; } @@ -920,6 +929,61 @@ } } +void V4LocalDatabaseManager::RenameOldStoreFiles() { + for (auto const& pair : kStoreFilesToRename) { + const base::StringPiece& old_name = pair.first; + const base::StringPiece& new_name = pair.second; + + const base::FilePath old_store_path = base_path_.AppendASCII(old_name); + + // Is the old filename also being used for a valid V4Store? + auto it = std::find_if( + std::begin(list_infos_), std::end(list_infos_), + [&old_name](ListInfo const& li) { return li.filename() == old_name; }); + bool old_filename_in_use = list_infos_.end() != it; + base::UmaHistogramBoolean("SafeBrowsing.V4Store.OldFileNameInUse" + + GetUmaSuffixForStore(old_store_path), + old_filename_in_use); + if (old_filename_in_use) { + NOTREACHED() << "Trying to rename a store file that's in use: " + << old_name; + continue; + } + + bool old_path_exists = base::PathExists(old_store_path); + base::UmaHistogramBoolean("SafeBrowsing.V4Store.OldFileNameExists" + + GetUmaSuffixForStore(old_store_path), + old_path_exists); + if (!old_path_exists) { + continue; + } + + const base::FilePath new_store_path = base_path_.AppendASCII(new_name); + bool new_path_exists = base::PathExists(new_store_path); + base::UmaHistogramBoolean("SafeBrowsing.V4Store.NewFileNameExists" + + GetUmaSuffixForStore(new_store_path), + new_path_exists); + if (new_path_exists) { + continue; + } + + task_runner_->PostTask( + FROM_HERE, base::BindOnce(&V4LocalDatabaseManager::RenameStoreFile, + old_store_path, new_store_path)); + } +} + +// static +void V4LocalDatabaseManager::RenameStoreFile(const base::FilePath& old_path, + const base::FilePath& new_path) { + base::File::Error error = base::File::FILE_OK; + base::ReplaceFile(old_path, new_path, &error); + + UMA_HISTOGRAM_ENUMERATION( + "SafeBrowsing.V4Store.RenameStatus" + GetUmaSuffixForStore(new_path), + -error, -base::File::FILE_ERROR_MAX); +} + void V4LocalDatabaseManager::RespondSafeToQueuedChecks() { DCHECK(CurrentlyOnThread(ThreadID::IO));
diff --git a/components/safe_browsing/core/db/v4_local_database_manager.h b/components/safe_browsing/core/db/v4_local_database_manager.h index f10bf7f7..a16fcd69 100644 --- a/components/safe_browsing/core/db/v4_local_database_manager.h +++ b/components/safe_browsing/core/db/v4_local_database_manager.h
@@ -228,9 +228,6 @@ // Called when the database has been updated and schedules the next update. void DatabaseUpdated(); - // Delete any *.store files from disk that are no longer used. - void DeleteUnusedStoreFiles(); - // Matches the full_hashes for a |check| with the hashes stored in // |artificially_marked_store_and_hash_prefixes_|. For each full hash match, // it populates |full_hash_to_store_and_hash_prefixes| with the matched hash @@ -272,6 +269,13 @@ // "mark_as_malware", "mark_as_uws". void PopulateArtificialDatabase(); + // Rename *.store files on disk per |kStoreFilesToRename|. + void RenameOldStoreFiles(); + + // Renames the file at |old_path| to |new_path|. + static void RenameStoreFile(const base::FilePath& old_path, + const base::FilePath& new_path); + // Schedules a full-hash check for a given set of prefixes. void ScheduleFullHashCheck(std::unique_ptr<PendingCheck> check);
diff --git a/components/safe_browsing/core/db/v4_local_database_manager_unittest.cc b/components/safe_browsing/core/db/v4_local_database_manager_unittest.cc index f07ea315..8a634b836 100644 --- a/components/safe_browsing/core/db/v4_local_database_manager_unittest.cc +++ b/components/safe_browsing/core/db/v4_local_database_manager_unittest.cc
@@ -1511,4 +1511,152 @@ EXPECT_EQ(expected_lists, synced_lists); } +TEST_F(V4LocalDatabaseManagerTest, RenameStoreFile_RenameSuccess) { + const std::string prefix = "SafeBrowsing.V4Store."; + const std::string old_store_name = "UrlCsdWhitelist"; + const std::string old_name_in_use_histogram = + prefix + "OldFileNameInUse." + old_store_name; + const std::string old_name_exists_histogram = + prefix + "OldFileNameExists." + old_store_name; + const std::string new_store_name = "UrlCsdAllowlist"; + const std::string new_name_exists_histogram = + prefix + "NewFileNameExists." + new_store_name; + const std::string rename_status_histogram = + prefix + "RenameStatus." + new_store_name; + + base::HistogramTester histograms; + histograms.ExpectTotalCount(old_name_in_use_histogram, 0); + histograms.ExpectTotalCount(old_name_exists_histogram, 0); + histograms.ExpectTotalCount(new_name_exists_histogram, 0); + histograms.ExpectTotalCount(rename_status_histogram, 0); + + auto old_store_path = + base_dir_.GetPath().AppendASCII(old_store_name + ".store"); + ASSERT_FALSE(base::PathExists(old_store_path)); + + // Now write an empty file at |old_store_path|. + base::WriteFile(old_store_path, "", 0); + ASSERT_TRUE(base::PathExists(old_store_path)); + + // Reset the database manager so that RenameOldStoreFiles() is called. + ResetLocalDatabaseManager(); + WaitForTasksOnTaskRunner(); + ASSERT_FALSE(base::PathExists(old_store_path)); + + auto new_file_path = + base_dir_.GetPath().AppendASCII(new_store_name + ".store"); + ASSERT_TRUE(base::PathExists(new_file_path)); + + histograms.ExpectTotalCount(old_name_in_use_histogram, 1); + histograms.ExpectBucketCount(old_name_in_use_histogram, false, 1); + + histograms.ExpectTotalCount(old_name_exists_histogram, 1); + histograms.ExpectBucketCount(old_name_exists_histogram, true, 1); + + histograms.ExpectTotalCount(new_name_exists_histogram, 1); + histograms.ExpectBucketCount(new_name_exists_histogram, false, 1); + + histograms.ExpectTotalCount(rename_status_histogram, 1); + histograms.ExpectBucketCount(rename_status_histogram, 0, 1); + + // Cleanup + base::DeleteFile(new_file_path); +} + +TEST_F(V4LocalDatabaseManagerTest, + RenameStoreOldFileDoesNotExist_DoesNotRename) { + const std::string prefix = "SafeBrowsing.V4Store."; + const std::string old_store_name = "UrlCsdWhitelist"; + const std::string old_name_in_use_histogram = + prefix + "OldFileNameInUse." + old_store_name; + const std::string old_name_exists_histogram = + prefix + "OldFileNameExists." + old_store_name; + const std::string new_store_name = "UrlCsdAllowlist"; + const std::string new_name_exists_histogram = + prefix + "NewFileNameExists." + new_store_name; + const std::string rename_status_histogram = + prefix + "RenameStatus." + new_store_name; + + base::HistogramTester histograms; + histograms.ExpectTotalCount(old_name_in_use_histogram, 0); + histograms.ExpectTotalCount(old_name_exists_histogram, 0); + histograms.ExpectTotalCount(new_name_exists_histogram, 0); + histograms.ExpectTotalCount(rename_status_histogram, 0); + + auto old_store_path = + base_dir_.GetPath().AppendASCII(old_store_name + ".store"); + ASSERT_FALSE(base::PathExists(old_store_path)); + + // Reset the database manager so that RenameOldStoreFiles() is called. + ResetLocalDatabaseManager(); + WaitForTasksOnTaskRunner(); + + histograms.ExpectTotalCount(old_name_in_use_histogram, 1); + histograms.ExpectBucketCount(old_name_in_use_histogram, false, 1); + + histograms.ExpectTotalCount(old_name_exists_histogram, 1); + histograms.ExpectBucketCount(old_name_exists_histogram, false, 1); + + histograms.ExpectTotalCount(new_name_exists_histogram, 0); + histograms.ExpectTotalCount(rename_status_histogram, 0); + + // Cleanup + base::DeleteFile(old_store_path); +} + +TEST_F(V4LocalDatabaseManagerTest, RenameStoreNewFileExists_DoesNotRename) { + const std::string prefix = "SafeBrowsing.V4Store."; + const std::string old_store_name = "UrlCsdWhitelist"; + const std::string old_name_in_use_histogram = + prefix + "OldFileNameInUse." + old_store_name; + const std::string old_name_exists_histogram = + prefix + "OldFileNameExists." + old_store_name; + const std::string new_store_name = "UrlCsdAllowlist"; + const std::string new_name_exists_histogram = + prefix + "NewFileNameExists." + new_store_name; + const std::string rename_status_histogram = + prefix + "RenameStatus." + new_store_name; + + base::HistogramTester histograms; + histograms.ExpectTotalCount(old_name_in_use_histogram, 0); + histograms.ExpectTotalCount(old_name_exists_histogram, 0); + histograms.ExpectTotalCount(new_name_exists_histogram, 0); + histograms.ExpectTotalCount(rename_status_histogram, 0); + + auto old_store_path = + base_dir_.GetPath().AppendASCII(old_store_name + ".store"); + ASSERT_FALSE(base::PathExists(old_store_path)); + + // Now write an empty old file. + base::WriteFile(old_store_path, "", 0); + ASSERT_TRUE(base::PathExists(old_store_path)); + + auto new_store_path = + base_dir_.GetPath().AppendASCII(new_store_name + ".store"); + ASSERT_FALSE(base::PathExists(new_store_path)); + + // Now write an empty new file. + base::WriteFile(new_store_path, "", 0); + ASSERT_TRUE(base::PathExists(new_store_path)); + + // Reset the database manager so that RenameOldStoreFiles() is called. + ResetLocalDatabaseManager(); + WaitForTasksOnTaskRunner(); + + histograms.ExpectTotalCount(old_name_in_use_histogram, 1); + histograms.ExpectBucketCount(old_name_in_use_histogram, false, 1); + + histograms.ExpectTotalCount(old_name_exists_histogram, 1); + histograms.ExpectBucketCount(old_name_exists_histogram, true, 1); + + histograms.ExpectTotalCount(new_name_exists_histogram, 1); + histograms.ExpectBucketCount(new_name_exists_histogram, true, 1); + + histograms.ExpectTotalCount(rename_status_histogram, 0); + + // Cleanup + base::DeleteFile(old_store_path); + base::DeleteFile(new_store_path); +} + } // namespace safe_browsing
diff --git a/components/strings/components_strings_az.xtb b/components/strings/components_strings_az.xtb index 5aef683..df36047 100644 --- a/components/strings/components_strings_az.xtb +++ b/components/strings/components_strings_az.xtb
@@ -540,6 +540,7 @@ <translation id="3037605927509011580">Yapon xalq musiqisi dinləmisiniz?</translation> <translation id="3041612393474885105">Sertifikat Məlumatı</translation> <translation id="3060227939791841287">C9 (Zərf)</translation> +<translation id="3060557858482803256"><ph name="RUN_CHROME_SAFETY_CHECK_FOCUSED_FRIENDLY_MATCH_TEXT" />, Tab düyməsi, sonra Enter düyməsinə basaraq Chrome ayarlarında Təhlükəsizlik Yoxlanışını icra edin</translation> <translation id="3061707000357573562">Təmir Xidməti</translation> <translation id="3064966200440839136">Xarici tətbiqlə ödəniş etmək üçün gizli rejimdən çıxırsınız. Davam edilsin?</translation> <translation id="3080254622891793721">Qrafik</translation> @@ -773,6 +774,7 @@ <translation id="3964661563329879394">{COUNT,plural, =0{Yoxdur}=1{1 saytdan }other{# saytdan }}</translation> <translation id="397105322502079400">Hesablanır...</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> blok edilib</translation> +<translation id="3973357910713125165">Chrome Təhlükəsizlik Yoxlanışını İcra Edin düyməsi, Chrome ayarlarında Təhlükəsizlik Yoxlanışını icra etmək üçün Enter düyməsinə basın</translation> <translation id="3987405730340719549">Chrome bu saytın saxta və ya fırıldaqçı ola biləcəyini təyin etmişdir. Bunun səhvən göstərildiyini düşünürsünüzsə, bu ünvana baş çəkin: https://bugs.chromium.org/p/chromium/issues/entry?template=Safety+Tips+Appeals.</translation> @@ -853,6 +855,7 @@ <h4>Mərhələ 5: Əlavə yardım əldə edin</h4> <p>Xətanı həll edə bilmirsinizsə, sayt sahibi ilə əlaqə saxlayın.</p></translation> <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Şəbəkə Diaqnostikasını İşlətməyə Çalışın<ph name="END_LINK" />.</translation> +<translation id="4229544452621580519">Chrome ayarlarında Təhlükəsizlik Yoxlanışı icra edin</translation> <translation id="4234495348042597185"><ph name="BEGIN_LINK" /><ph name="SITE" /> ilə davam edin<ph name="END_LINK" /></translation> <translation id="4235360514405112390">Düzgün</translation> <translation id="4250431568374086873">Bu sayta olan bağlantınız tam olaraq güvənli deyil</translation> @@ -978,6 +981,7 @@ <translation id="4756388243121344051">&Tarixçə</translation> <translation id="4758311279753947758">Kontakt məlumatı əlavə edin</translation> <translation id="4761104368405085019">Mikrofon işlədin</translation> +<translation id="4761869838909035636">Chrome Təhlükəsizlik Yoxlanışı icra edin</translation> <translation id="4764776831041365478"><ph name="URL" /> ünvanındakı səhifə müvəqqəti olaraq deaktiv ola və ya həmişəlik olaraq yeni ünvana köçə bilər.</translation> <translation id="4766713847338118463">Aşağıdan qoşa ştapel vurun</translation> <translation id="4768815695067202997"><ph name="BEGIN_BOLD" />
diff --git a/components/strings/components_strings_be.xtb b/components/strings/components_strings_be.xtb index f87159b..08823923 100644 --- a/components/strings/components_strings_be.xtb +++ b/components/strings/components_strings_be.xtb
@@ -540,6 +540,7 @@ <translation id="3037605927509011580">Якая неспадзяванка!</translation> <translation id="3041612393474885105">Інфармацыя аб сертыфікаце</translation> <translation id="3060227939791841287">C9 (канверт)</translation> +<translation id="3060557858482803256"><ph name="RUN_CHROME_SAFETY_CHECK_FOCUSED_FRIENDLY_MATCH_TEXT" />, каб выканаць праверку бяспекі ў наладах Chrome, націсніце Tab, затым Enter</translation> <translation id="3061707000357573562">Сэрвіс выпраўленняў</translation> <translation id="3064966200440839136">Выхад з рэжыму інкогніта для плацяжу праз знешнюю праграму. Працягнуць?</translation> <translation id="3080254622891793721">Графіка</translation> @@ -776,6 +777,7 @@ <translation id="3964661563329879394">{COUNT,plural, =0{Няма}=1{З 1 сайта }one{З # сайта }few{З # сайтаў }many{З # сайтаў }other{З # сайта }}</translation> <translation id="397105322502079400">Ідзе разлік...</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> заблакіраваны</translation> +<translation id="3973357910713125165">Кнопка "Запусціць праверку бяспекі Chrome", націсніце Enter, каб выканаць праверку бяспекі ў наладах Chrome</translation> <translation id="3987405730340719549">Chrome выявіў, што гэты сайт можа быць фальшывым ці махлярскім. Калі вы лічыце, што гэта папярэджанне паказваецца вам памылкова, перайдзіце па спасылцы https://bugs.chromium.org/p/chromium/issues/entry?template=Safety+Tips+Appeals.</translation> @@ -857,6 +859,7 @@ <h4>Крок 5. Звярніцеся па дапамогу</h4> <p>Калі праблему вырашыць не ўдалося, звярніцеся да ўладальніка вэб-сайта.</p></translation> <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Паспрабаваць запусціць дыягностыку сеткі<ph name="END_LINK" />.</translation> +<translation id="4229544452621580519">Запусціць праверку бяспекі ў наладах Chrome</translation> <translation id="4234495348042597185"><ph name="BEGIN_LINK" />Перайсці на сайт <ph name="SITE" /><ph name="END_LINK" /></translation> <translation id="4235360514405112390">Сапраўдны</translation> <translation id="4250431568374086873">Ваша падключэнне да гэтага сайта не цалкам бяспечнае</translation> @@ -982,6 +985,7 @@ <translation id="4756388243121344051">&Гісторыя</translation> <translation id="4758311279753947758">Дадаць кантактную інфармацыю</translation> <translation id="4761104368405085019">Выкарыстоўваць мікрафон</translation> +<translation id="4761869838909035636">Запусціць праверку бяспекі Chrome</translation> <translation id="4764776831041365478">Магчыма, вэб-старонка па адрасе <ph name="URL" /> часова недаступная або была перамешчана на новы вэб-адрас.</translation> <translation id="4766713847338118463">Дзве скабы знізу</translation> <translation id="4768815695067202997"><ph name="BEGIN_BOLD" />
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb index 613d6abd..ad4f1ee9 100644 --- a/components/strings/components_strings_ca.xtb +++ b/components/strings/components_strings_ca.xtb
@@ -147,7 +147,7 @@ <translation id="1462951478840426066">Utilitza els tipus de lletra del teu ordinador per crear continguts d'alta fidelitat</translation> <translation id="1463543813647160932">5 x 7</translation> <translation id="1467432559032391204">Esquerra</translation> -<translation id="1468653229182955856"><ph name="ONE_TIME_CODE" /> és el teu codi a <ph name="EMBEDDED_ORIGIN" /> per continuar a <ph name="TOP_ORIGIN" /></translation> +<translation id="1468653229182955856"><ph name="ONE_TIME_CODE" /> és el teu codi per a <ph name="EMBEDDED_ORIGIN" /> per continuar a <ph name="TOP_ORIGIN" /></translation> <translation id="1472675084647422956">Mostra'n més</translation> <translation id="1473183651233018052">JIS B10</translation> <translation id="147358896496811705">2A0</translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb index ee00a41..705217b 100644 --- a/components/strings/components_strings_et.xtb +++ b/components/strings/components_strings_et.xtb
@@ -539,6 +539,7 @@ <translation id="3037605927509011580">Ups, ebaõnn!</translation> <translation id="3041612393474885105">Sertifikaadi andmed</translation> <translation id="3060227939791841287">C9 (ümbrik)</translation> +<translation id="3060557858482803256"><ph name="RUN_CHROME_SAFETY_CHECK_FOCUSED_FRIENDLY_MATCH_TEXT" />, vajutage tabulaatorit ja siis sisestusklahvi, et Chrome'i seadetes ohutuskontroll käitada</translation> <translation id="3061707000357573562">Teenuse paikamine</translation> <translation id="3064966200440839136">Väljute inkognito režiimist, et välise rakenduse kaudu maksta. Kas soovite jätkata?</translation> <translation id="3080254622891793721">Graafika</translation> @@ -776,6 +777,7 @@ <translation id="3964661563329879394">{COUNT,plural, =0{Ükski}=1{1 saidilt }other{# saidilt }}</translation> <translation id="397105322502079400">Arvutamine ...</translation> <translation id="3973234410852337861">Host <ph name="HOST_NAME" /> on blokeeritud</translation> +<translation id="3973357910713125165">Nupp Käita Chrome'i ohutuskontroll, vajutage sisestusklahvi, et Chrome'i seadetes ohutuskontroll käitada</translation> <translation id="3987405730340719549">Chrome tuvastas, et see sait võib olla võlts või petturlik. Kui arvate, et tegemist on veaga, külastage saiti https://bugs.chromium.org/p/chromium/issues/entry?template=Safety+Tips+Appeals.</translation> @@ -857,6 +859,7 @@ <h4>5. toiming: hankige abi</h4> <p>Kui viga ei kao, võtke ühendust veebisaidi omanikuga.</p></translation> <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Proovige käitada võrgudiagnostikat<ph name="END_LINK" />.</translation> +<translation id="4229544452621580519">Käitage Chrome'i seadetes ohutuskontroll</translation> <translation id="4234495348042597185"><ph name="BEGIN_LINK" />Edasi saidile <ph name="SITE" /><ph name="END_LINK" /></translation> <translation id="4235360514405112390">Kehtiv</translation> <translation id="4250431568374086873">Teie ühendus selle saidiga pole täielikult turvaline</translation> @@ -982,6 +985,7 @@ <translation id="4756388243121344051">&Ajalugu</translation> <translation id="4758311279753947758">Lisage kontaktteave</translation> <translation id="4761104368405085019">Mikrofoni kasutamine</translation> +<translation id="4761869838909035636">Käita Chrome'i ohutuskontroll</translation> <translation id="4764776831041365478">Veebileht aadressil <ph name="URL" /> võib olla ajutiselt maas või jäädavalt uuele veebiaadressile teisaldatud.</translation> <translation id="4766713847338118463">Kaks kirjaklambrit all</translation> <translation id="4768815695067202997"><ph name="BEGIN_BOLD" />
diff --git a/components/strings/components_strings_eu.xtb b/components/strings/components_strings_eu.xtb index baa57362..4943d4d 100644 --- a/components/strings/components_strings_eu.xtb +++ b/components/strings/components_strings_eu.xtb
@@ -534,6 +534,7 @@ <translation id="3037605927509011580">Hutsegite bat izan da.</translation> <translation id="3041612393474885105">Ziurtagiriari buruzko informazioa</translation> <translation id="3060227939791841287">C9 (gutun-azala)</translation> +<translation id="3060557858482803256"><ph name="RUN_CHROME_SAFETY_CHECK_FOCUSED_FRIENDLY_MATCH_TEXT" />: sakatu tabuladorea eta, ondoren, sakatu "Sartu" segurtasun-egiaztapena egiteko Chrome-ren ezarpenetan</translation> <translation id="3061707000357573562">Adabaki-zerbitzua</translation> <translation id="3064966200440839136">Ezkutuko modutik irtengo zara kanpoko aplikazio baten bidez ordaintzeko. Aurrera egin nahi duzu?</translation> <translation id="3080254622891793721">Grafikoa</translation> @@ -767,6 +768,7 @@ <translation id="3964661563329879394">{COUNT,plural, =0{Bat ere ez}=1{1 webgunetatik }other{# webgunetatik }}</translation> <translation id="397105322502079400">Kalkulatzen…</translation> <translation id="3973234410852337861">Blokeatuta dago <ph name="HOST_NAME" /></translation> +<translation id="3973357910713125165">"Egin Chrome-ren segurtasun-egiaztapena" botoia: sakatu "Sartu" segurtasun-egiaztapena egiteko Chrome-ren ezarpenetan</translation> <translation id="3987405730340719549">Webgune hau faltsua edo iruzurrezkoa izan litekeela zehaztu du Chrome-k. Abisu honek dioena oker dagoela uste baduzu, joan https://bugs.chromium.org/p/chromium/issues/entry?template=Safety+Tips+Appeals helbidera.</translation> @@ -843,6 +845,7 @@ <h4>5. urratsa: lortu laguntza gehiago</h4> <p>Oraindik ere errorea ikusten baduzu, jarri harremanetan webgunearen jabearekin.</p></translation> <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Exekutatu sare-diagnostikoak<ph name="END_LINK" />.</translation> +<translation id="4229544452621580519">Egin segurtasun-egiaztapena Chrome-ren ezarpenetan</translation> <translation id="4234495348042597185"><ph name="BEGIN_LINK" />Joan <ph name="SITE" /> webgunera<ph name="END_LINK" /></translation> <translation id="4235360514405112390">Balio du</translation> <translation id="4250431568374086873">Webgune honetarako konexioa ez da guztiz segurua</translation> @@ -968,6 +971,7 @@ <translation id="4756388243121344051">&Historia</translation> <translation id="4758311279753947758">Gehitu harremanetarako informazioa</translation> <translation id="4761104368405085019">Erabili mikrofonoa</translation> +<translation id="4761869838909035636">Egin Chrome-ren segurtasun-egiaztapena</translation> <translation id="4764776831041365478">Baliteke <ph name="URL" /> helbideko web-orria tarte batez ez funtzionatzea edo beste web-helbide batera betiko aldatu izatea.</translation> <translation id="4766713847338118463">Bi grapa behean</translation> <translation id="4768815695067202997"><ph name="BEGIN_BOLD" />
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb index d40739d6..9110f8a8 100644 --- a/components/strings/components_strings_fa.xtb +++ b/components/strings/components_strings_fa.xtb
@@ -541,7 +541,7 @@ <translation id="3060557858482803256"><ph name="RUN_CHROME_SAFETY_CHECK_FOCUSED_FRIENDLY_MATCH_TEXT" />، برای راندن «بررسی ایمنی» در تنظیمات Chrome، کلید «جهش» و سپس «ورود» را فشار دهید.</translation> <translation id="3061707000357573562">سرویس وصله</translation> <translation id="3064966200440839136">درحال خروج از حالت ناشناس، برای پرداخت ازطریق یک برنامه خارجی. ادامه میدهید؟</translation> -<translation id="3080254622891793721">گرافیکی</translation> +<translation id="3080254622891793721">ترسیمی</translation> <translation id="3086579638707268289">فعالیتتان در وب تحتنظارت است</translation> <translation id="3087734570205094154">پایین</translation> <translation id="3095940652251934233">Statement</translation>
diff --git a/components/strings/components_strings_fi.xtb b/components/strings/components_strings_fi.xtb index bac5e792..c1dd5d7e 100644 --- a/components/strings/components_strings_fi.xtb +++ b/components/strings/components_strings_fi.xtb
@@ -540,6 +540,7 @@ <translation id="3037605927509011580">Harmin paikka!</translation> <translation id="3041612393474885105">Varmenteen tiedot</translation> <translation id="3060227939791841287">C9 (kirjekuori)</translation> +<translation id="3060557858482803256"><ph name="RUN_CHROME_SAFETY_CHECK_FOCUSED_FRIENDLY_MATCH_TEXT" />, tee turvatarkistus Chromen asetuksissa painamalla sarkainta ja sitten Enter</translation> <translation id="3061707000357573562">Virheenkorjauspalvelu</translation> <translation id="3064966200440839136">Incognito-tilasta poistutaan ulkoisessa sovelluksessa maksamisen vuoksi. Haluatko jatkaa?</translation> <translation id="3080254622891793721">Graafinen</translation> @@ -778,6 +779,7 @@ <translation id="3964661563329879394">{COUNT,plural, =0{Ei mitään}=1{1 sivustolta }other{# sivustolta }}</translation> <translation id="397105322502079400">Lasketaan...</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> on estetty</translation> +<translation id="3973357910713125165">Tee Chromen turvatarkistus ‑painike, tee turvatarkistus Chromen asetuksissa painamalla Enter</translation> <translation id="3987405730340719549">Chrome epäilee tätä sivustoa vilpilliseksi tai valesivustoksi. Jos uskot, että ilmoitus on virheellinen, siirry osoitteeseen https://bugs.chromium.org/p/chromium/issues/entry?template=Safety+Tips+Appeals.</translation> @@ -859,6 +861,7 @@ <h4>Vaihe 5: Pyydä lisäapua</h4> <p>Jos näet virheen vieläkin, ota yhteyttä verkkosivuston omistajaan.</p></translation> <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Kokeile verkon diagnostiikkaa<ph name="END_LINK" /></translation> +<translation id="4229544452621580519">Tee turvatarkistus Chromen asetuksissa</translation> <translation id="4234495348042597185"><ph name="BEGIN_LINK" />Siirry sivustolle <ph name="SITE" /><ph name="END_LINK" /></translation> <translation id="4235360514405112390">Voimassa</translation> <translation id="4250431568374086873">Yhteytesi sivustoon ei ole täysin suojattu.</translation> @@ -984,6 +987,7 @@ <translation id="4756388243121344051">&Historia</translation> <translation id="4758311279753947758">Lisää yhteystiedot</translation> <translation id="4761104368405085019">Käyttää mikrofonia</translation> +<translation id="4761869838909035636">Tee Chromen turvatarkistus</translation> <translation id="4764776831041365478">Osoitteessa <ph name="URL" /> oleva sivu saattaa olla väliaikaisesti pois käytöstä tai se on voitu siirtää pysyvästi uuteen osoitteeseen.</translation> <translation id="4766713847338118463">Kaksi niittiä alareunassa</translation> <translation id="4768815695067202997"><ph name="BEGIN_BOLD" />
diff --git a/components/strings/components_strings_fr-CA.xtb b/components/strings/components_strings_fr-CA.xtb index 1b89734..30fa4c2 100644 --- a/components/strings/components_strings_fr-CA.xtb +++ b/components/strings/components_strings_fr-CA.xtb
@@ -534,6 +534,7 @@ <translation id="3037605927509011580">Aïe aïe aïe!</translation> <translation id="3041612393474885105">Information relative au certificat</translation> <translation id="3060227939791841287">Enveloppe C9</translation> +<translation id="3060557858482803256"><ph name="RUN_CHROME_SAFETY_CHECK_FOCUSED_FRIENDLY_MATCH_TEXT" /> : appuyez sur Tabulation, puis sur Entrée pour effectuer une vérification de sécurité dans les paramètres de Chrome</translation> <translation id="3061707000357573562">Service de correctif</translation> <translation id="3064966200440839136">Vous devez quitter le mode de navigation privée pour effectuer un paiement par l'intermédiaire d'une application externe. Continuer?</translation> <translation id="3080254622891793721">Images</translation> @@ -771,6 +772,7 @@ <translation id="3964661563329879394">{COUNT,plural, =0{Aucun}=1{À partir de 1 site }one{À partir de # site }other{À partir de # sites }}</translation> <translation id="397105322502079400">Calcul en cours...</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> est bloquée</translation> +<translation id="3973357910713125165">Bouton Effectuer une vérification de sécurité de Chrome : appuyez sur Entrée pour effectuer une vérification de sécurité dans les paramètres de Chrome</translation> <translation id="3987405730340719549">Chrome a déterminé que ce site pourrait être faux ou frauduleux. Si vous pensez qu'il s'agit d'une erreur, veuillez visiter la page https://bugs.chromium.org/p/chromium/issues/entry?template=Safety+Tips+Appeals.</translation> @@ -847,6 +849,7 @@ <h4>Étape 5 : Obtenir de l'aide supplémentaire</h4> <p>Si vous voyez toujours l'erreur, communiquez avec le propriétaire du site Web.</p></translation> <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Essayer d'exécuter Network Diagnostics<ph name="END_LINK" />.</translation> +<translation id="4229544452621580519">Effectuer une vérification de sécurité dans les paramètres de Chrome</translation> <translation id="4234495348042597185"><ph name="BEGIN_LINK" />Continuer vers <ph name="SITE" /><ph name="END_LINK" /></translation> <translation id="4235360514405112390">Valide</translation> <translation id="4250431568374086873">Votre connexion à ce site n'est pas totalement sécurisée</translation> @@ -972,6 +975,7 @@ <translation id="4756388243121344051">&Historique</translation> <translation id="4758311279753947758">Ajouter des coordonnées</translation> <translation id="4761104368405085019">Utiliser votre microphone</translation> +<translation id="4761869838909035636">Effectuer une vérification de sécurité de Chrome</translation> <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="4768815695067202997"><ph name="BEGIN_BOLD" />
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb index eb56a67..470f46dc 100644 --- a/components/strings/components_strings_gu.xtb +++ b/components/strings/components_strings_gu.xtb
@@ -540,6 +540,7 @@ <translation id="3037605927509011580">અરર કંઇક ભુલ થઇ!</translation> <translation id="3041612393474885105">પ્રમાણપત્ર માહિતી</translation> <translation id="3060227939791841287">C9 (એન્વલપ)</translation> +<translation id="3060557858482803256"><ph name="RUN_CHROME_SAFETY_CHECK_FOCUSED_FRIENDLY_MATCH_TEXT" />, Chrome સેટિંગમાં સલામતી માટે તપાસ ચલાવવા માટે Tab પછી Enter દબાવો</translation> <translation id="3061707000357573562">પૅચ સેવા</translation> <translation id="3064966200440839136">બાહ્ય ઍપ્લિકેશન મારફતે ચુકવણી કરવા માટે છુપો મોડ છોડી રહ્યાં છીએ. તો ચાલુ રાખીએ?</translation> <translation id="3080254622891793721">ગ્રાફિક</translation> @@ -776,6 +777,7 @@ <translation id="3964661563329879394">{COUNT,plural, =0{કોઈ નહીં}=1{1 સાઇટમાંથી }one{# સાઇટમાંથી }other{# સાઇટમાંથી }}</translation> <translation id="397105322502079400">ગણના કરી રહ્યું છે...</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> અવરોધિત છે</translation> +<translation id="3973357910713125165">Chromeની સલામતી માટે તપાસ ચલાવો બટન, Chrome સેટિંગમાં સલામતી માટે તપાસ ચલાવવા માટે Enter દબાવો</translation> <translation id="3987405730340719549">Chromeની તપાસણીમાં આ સાઇટ બનાવટી અથવા કપટપૂર્ણ હોઈ શકવાનું જણાઈ આવ્યું છે. જો તમે એમ માનતા હો કે આ ભૂલમાં બતાવવામાં આવ્યું છે, તો કૃપા કરીને https://bugs.chromium.org/p/chromium/issues/entry?template=Safety+Tips+Appealsની મુલાકાત લો.</translation> @@ -857,6 +859,7 @@ <h4>પગલું 5: અતિરિક્ત સહાય મેળવો</h4> <p>જો હજુ તમને ભૂલ દેખાય, તો વેબસાઇટના માલિકનો સંપર્ક કરો.</p></translation> <translation id="4226937834893929579"><ph name="BEGIN_LINK" />નેટવર્ક ડાયગ્નોસ્ટિક્સ ચલાવવાનો પ્રયાસ કરો<ph name="END_LINK" />.</translation> +<translation id="4229544452621580519">Chrome સેટિંગમાં સલામતી માટે તપાસ ચલાવો</translation> <translation id="4234495348042597185"><ph name="BEGIN_LINK" /><ph name="SITE" /> પર આગળ વધો<ph name="END_LINK" /></translation> <translation id="4235360514405112390">માન્યતા</translation> <translation id="4250431568374086873">આ સાઇટ પરનું તમારું કનેક્શન પૂર્ણપણે સુરક્ષિત નથી</translation> @@ -982,6 +985,7 @@ <translation id="4756388243121344051">&ઇતિહાસ</translation> <translation id="4758311279753947758">સંપર્ક માહિતી ઉમેરો</translation> <translation id="4761104368405085019">તમારા માઇક્રોફોનનો ઉપયોગ કરો</translation> +<translation id="4761869838909035636">Chromeની સલામતી માટે તપાસ ચલાવો</translation> <translation id="4764776831041365478"><ph name="URL" /> પરનાં વેબપેજ અસ્થાયી ધોરણે બંધ હોઈ શકે છે અથવા તે કાયમ માટે નવા વેબ ઍડ્રેસ પર ખસેડવામાં આવ્યા હોઈ શકે છે.</translation> <translation id="4766713847338118463">નીચે બે સ્ટેપલ લગાવો</translation> <translation id="4768815695067202997"><ph name="BEGIN_BOLD" />
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb index a7cbfc32..1a3b4a2f 100644 --- a/components/strings/components_strings_hi.xtb +++ b/components/strings/components_strings_hi.xtb
@@ -147,7 +147,7 @@ <translation id="1462951478840426066">अपने कंप्यूटर पर मौजूद फ़ॉन्ट इस्तेमाल करें, ताकि आप हाई फ़िडेलिटी कॉन्टेंट बना सकें</translation> <translation id="1463543813647160932">5x7</translation> <translation id="1467432559032391204">बाएं</translation> -<translation id="1468653229182955856">यह <ph name="ONE_TIME_CODE" /> कोड <ph name="EMBEDDED_ORIGIN" /> के लिए है, ताकि आप <ph name="TOP_ORIGIN" /> पर जारी रख सकें</translation> +<translation id="1468653229182955856"><ph name="TOP_ORIGIN" /> पर जारी रखने के लिए, <ph name="EMBEDDED_ORIGIN" /> के लिए आपका कोड <ph name="ONE_TIME_CODE" /> है.</translation> <translation id="1472675084647422956">और दिखाएं</translation> <translation id="1473183651233018052">JIS B10</translation> <translation id="147358896496811705">2ए0</translation> @@ -538,6 +538,7 @@ <translation id="3037605927509011580">हे भगवान!</translation> <translation id="3041612393474885105">प्रमाणपत्र जानकारी</translation> <translation id="3060227939791841287">सी9 (एन्वेलप)</translation> +<translation id="3060557858482803256"><ph name="RUN_CHROME_SAFETY_CHECK_FOCUSED_FRIENDLY_MATCH_TEXT" />, Chrome की सेटिंग में, सुरक्षा जांच करने के लिए पहले Tab दबाएं और फिर Enter दबाएं</translation> <translation id="3061707000357573562">पैच सेवा</translation> <translation id="3064966200440839136">किसी बाहरी ऐप्लिकेशन के ज़रिए भुगतान करने के लिए गुप्त मोड छोड़ रहे हैं. जारी रखना चाहते हैं?</translation> <translation id="3080254622891793721">ग्राफ़िक</translation> @@ -774,6 +775,7 @@ <translation id="3964661563329879394">{COUNT,plural, =0{कुछ नहीं}=1{1 साइट से }one{# साइटों से }other{# साइटों से }}</translation> <translation id="397105322502079400">गणना की जा रही है...</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> को ब्लॉक किया गया है</translation> +<translation id="3973357910713125165">यह 'Chrome की सुरक्षा जांच करें' बटन है. Chrome की सेटिंग में, सुरक्षा जांच करने के लिए Enter दबाएं</translation> <translation id="3987405730340719549">Chrome के हिसाब से यह साइट नकली या धोखाधड़ी करने वाली हो सकती है. अगर आपको लगता है कि ऐसा गलती से दिखाया गया है, तो कृपया https://bugs.chromium.org/p/chromium/issues/entry?template=Safety+Tips+Appeals पर जाएं.</translation> @@ -855,6 +857,7 @@ <h4>पांचवा चरण: ज़्यादा मदद पाएं</h4> <p>अगर आपको अब भी गड़बड़ी दिखाई दे रही है, तो वेबसाइट के मालिक से संपर्क करें.</p></translation> <translation id="4226937834893929579"><ph name="BEGIN_LINK" />नेटवर्क निदान चलाकर देखें<ph name="END_LINK" />.</translation> +<translation id="4229544452621580519">Chrome की सेटिंग में जाकर, सुरक्षा जांच करें</translation> <translation id="4234495348042597185"><ph name="BEGIN_LINK" /><ph name="SITE" /> पर जाएं<ph name="END_LINK" /></translation> <translation id="4235360514405112390">मान्य</translation> <translation id="4250431568374086873">इस साइट से आपका कनेक्शन पूरी तरह से सुरक्षित नहीं है</translation> @@ -980,6 +983,7 @@ <translation id="4756388243121344051">&इतिहास</translation> <translation id="4758311279753947758">संपर्क जानकारी जोड़ें</translation> <translation id="4761104368405085019">अपना माइक्रोफ़ोन उपयोग करें</translation> +<translation id="4761869838909035636">Chrome की सुरक्षा जांच करें</translation> <translation id="4764776831041365478"><ph name="URL" /> पर मौजूद वेबपेज संभवतः अस्थायी रूप से बंद है या उसे स्थायी रूप से किसी नए वेब पते पर ले जाया गया है.</translation> <translation id="4766713847338118463">नीचे की ओर ड्युएल स्टेपल</translation> <translation id="4768815695067202997"><ph name="BEGIN_BOLD" />
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb index 6ed36ed..25d36a2 100644 --- a/components/strings/components_strings_iw.xtb +++ b/components/strings/components_strings_iw.xtb
@@ -540,6 +540,7 @@ <translation id="3037605927509011580">אוי, לא!</translation> <translation id="3041612393474885105">פרטי אישור</translation> <translation id="3060227939791841287">C9 (Envelope)</translation> +<translation id="3060557858482803256"><ph name="RUN_CHROME_SAFETY_CHECK_FOCUSED_FRIENDLY_MATCH_TEXT" />, יש להקיש על Tab ואז על Enter כדי להריץ בדיקת אבטחה בהגדרות Chrome</translation> <translation id="3061707000357573562">שירות תיקון</translation> <translation id="3064966200440839136">בחרת לצאת ממצב אנונימי כדי לשלם באמצעות אפליקציה חיצונית. להמשיך?</translation> <translation id="3080254622891793721">גרפיקה</translation> @@ -777,6 +778,7 @@ <translation id="3964661563329879394">{COUNT,plural, =0{ללא}=1{מאתר אחד }two{משני אתרים }many{מ-# אתרים }other{מ-# אתרים }}</translation> <translation id="397105322502079400">מתבצע חישוב...</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> חסום</translation> +<translation id="3973357910713125165">לחצן להרצת בדיקת אבטחה ב-Chrome, יש להקיש על Enter כדי להריץ בדיקת אבטחה בהגדרות Chrome</translation> <translation id="3987405730340719549">לפי אמצעי האבטחה של Chrome, האתר הזה עשוי להיות מזויף או אתר שנועד להונאה. אם לדעתך זו טעות, יש לעבור אל https://bugs.chromium.org/p/chromium/issues/entry?template=Safety+Tips+Appeals.</translation> @@ -856,6 +858,7 @@ <h4>שלב חמישי: סיוע נוסף</h4> <p>אם השגיאה עדיין מופיעה, יש לפנות לבעלי האתר.</p></translation> <translation id="4226937834893929579"><ph name="BEGIN_LINK" />יש לנסות להפעיל את אבחון הרשת<ph name="END_LINK" />.</translation> +<translation id="4229544452621580519">הרצה של בדיקת אבטחה בהגדרות Chrome</translation> <translation id="4234495348042597185"><ph name="BEGIN_LINK" />המשך אל <ph name="SITE" /><ph name="END_LINK" /></translation> <translation id="4235360514405112390">תקף</translation> <translation id="4250431568374086873">החיבור שלך לאתר הזה לא מאובטח בצורה מלאה</translation> @@ -981,6 +984,7 @@ <translation id="4756388243121344051">&היסטוריה</translation> <translation id="4758311279753947758">הוספת פרטים ליצירת קשר</translation> <translation id="4761104368405085019">להשתמש במיקרופון</translation> +<translation id="4761869838909035636">הרצה של בדיקת אבטחה ב-Chrome</translation> <translation id="4764776831041365478">ייתכן שדף האינטרנט בכתובת <ph name="URL" /> אינו פעיל זמנית, או שהועבר לכתובת אינטרנט חדשה לצמיתות.</translation> <translation id="4766713847338118463">שתי סיכות הידוק בחלק התחתון</translation> <translation id="4768815695067202997"><ph name="BEGIN_BOLD" />
diff --git a/components/strings/components_strings_kk.xtb b/components/strings/components_strings_kk.xtb index 1d3a0b39..3c62a4c2 100644 --- a/components/strings/components_strings_kk.xtb +++ b/components/strings/components_strings_kk.xtb
@@ -540,6 +540,7 @@ <translation id="3037605927509011580">Қап!</translation> <translation id="3041612393474885105">Сертификат ақпараты</translation> <translation id="3060227939791841287">C9 (Envelope)</translation> +<translation id="3060557858482803256"><ph name="RUN_CHROME_SAFETY_CHECK_FOCUSED_FRIENDLY_MATCH_TEXT" />, Chrome параметрлерінен қауіпсіздік шарасын іске қосу үшін Tab, содан кейін Enter пернесін басыңыз.</translation> <translation id="3061707000357573562">Қызметті түзету</translation> <translation id="3064966200440839136">Сыртқы қолданба арқылы төлеу үшін инкогнито режимінен шығасыз. Жалғастыра бересіз бе?</translation> <translation id="3080254622891793721">Кескін</translation> @@ -776,6 +777,7 @@ <translation id="3964661563329879394">{COUNT,plural, =0{Жоқ}=1{1 сайттан }other{# сайттан }}</translation> <translation id="397105322502079400">Есептелуде…</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> бөгелген</translation> +<translation id="3973357910713125165">Chrome қауіпсіздік шарасы түймесін басыңыз. Chrome параметрлерінен қауіпсіздік шарасын іске қосу үшін Enter пернесін басыңыз.</translation> <translation id="3987405730340719549">Chrome бұл сайттың жалған немесе алаяқтық болуы мүмкін екенін анықтады. Бұл хабар қателікпен көрсетілді деп ойласаңыз, мына бетке өтіңіз: https://bugs.chromium.org/p/chromium/issues/entry?template=Safety+Tips+Appeals.</translation> @@ -857,6 +859,7 @@ <h4>5-қадам. Қосымша көмек алыңыз</h4> <p>Қате жойылмаса, веб-сайт иесіне хабарласыңыз.</p></translation> <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Network Diagnostics құралын пайдаланып көріңіз<ph name="END_LINK" />.</translation> +<translation id="4229544452621580519">Chrome параметрлерінен қауіпсіздік шарасын іске қосыңыз</translation> <translation id="4234495348042597185"><ph name="BEGIN_LINK" /><ph name="SITE" /> сайтына өту<ph name="END_LINK" /></translation> <translation id="4235360514405112390">Жарамды</translation> <translation id="4250431568374086873">Бұл сайтпен байланысыңыз толықтай қауіпсіз емес</translation> @@ -982,6 +985,7 @@ <translation id="4756388243121344051">&Тарих</translation> <translation id="4758311279753947758">Контакт ақпаратын қосу</translation> <translation id="4761104368405085019">Микрофоныңызды пайдалану</translation> +<translation id="4761869838909035636">Chrome қауіпсіздік шарасын іске қосу</translation> <translation id="4764776831041365478"><ph name="URL" /> мекенжайындағы веб-бет уақытша істен шыққан немесе тұрақты түрде басқа мекенжайға көшкен болуы мүмкін.</translation> <translation id="4766713847338118463">Төменгі жағын екі рет қапсыру</translation> <translation id="4768815695067202997"><ph name="BEGIN_BOLD" />
diff --git a/components/strings/components_strings_kn.xtb b/components/strings/components_strings_kn.xtb index 4d7374d..4514f160 100644 --- a/components/strings/components_strings_kn.xtb +++ b/components/strings/components_strings_kn.xtb
@@ -536,6 +536,7 @@ <translation id="3037605927509011580">ಓಹ್, ಹೋಯ್ತು!</translation> <translation id="3041612393474885105">ಪ್ರಮಾಣಪತ್ರ ಮಾಹಿತಿ</translation> <translation id="3060227939791841287">C9 (Envelope)</translation> +<translation id="3060557858482803256"><ph name="RUN_CHROME_SAFETY_CHECK_FOCUSED_FRIENDLY_MATCH_TEXT" />, Chrome ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಸುರಕ್ಷತೆಯ ಪರಿಶೀಲನೆಯನ್ನು ರನ್ ಮಾಡಲು Tab ಒತ್ತಿ, ನಂತರ Enter ಒತ್ತಿ</translation> <translation id="3061707000357573562">ಪ್ಯಾಚ್ ಸೇವೆ</translation> <translation id="3064966200440839136">ಬಾಹ್ಯ ಅಪ್ಲಿಕೇಶನ್ ಮೂಲಕರ ಪಾವತಿಸಲು ಅದೃಶ್ಯ ಮೋಡ್ ತೊರೆಯಲಾಗುತ್ತಿದೆ. ಮುಂದುವರಿಸುವುದೇ?</translation> <translation id="3080254622891793721">ಗ್ರಾಫಿಕ್</translation> @@ -770,6 +771,7 @@ <translation id="3964661563329879394">{COUNT,plural, =0{ಯಾವುದೂ ಇಲ್ಲ}=1{1 ಸೈಟ್ನಿಂದ }one{# ಸೈಟ್ಗಳಿಂದ }other{# ಸೈಟ್ಗಳಿಂದ }}</translation> <translation id="397105322502079400">ಎಣಿಸಲಾಗುತ್ತಿದೆ...</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> ಅನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ</translation> +<translation id="3973357910713125165">Chrome ಸುರಕ್ಷತೆಯ ಪರಿಶೀಲನೆ ಬಟನ್ ರನ್ ಮಾಡಿ, Chrome ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಸುರಕ್ಷತೆಯ ಪರಿಶೀಲನೆಯನ್ನು ರನ್ ಮಾಡಲು Enter ಅನ್ನು ಒತ್ತಿರಿ</translation> <translation id="3987405730340719549">ಇದು ನಕಲಿ ಅಥವಾ ವಂಚನೆಯ ಸೈಟ್ ಆಗಿರಬಹುದು ಎಂಬುದನ್ನು Chrome ಪತ್ತೆಹಚ್ಚಿದೆ. ಇದನ್ನು ದೋಷದಿಂದಾಗಿ ತೋರಿಸಲಾಗಿದೆ ಎಂದು ನೀವು ಭಾವಿಸುವುದಾದರೆ, ದಯವಿಟ್ಟು https://bugs.chromium.org/p/chromium/issues/entry?template=Safety+Tips+Appeals ಪುಟಕ್ಕೆ ಭೇಟಿ ನೀಡಿ.</translation> @@ -846,6 +848,7 @@ <h4>ಹಂತ 5: ಹೆಚ್ಚುವರಿ ಸಹಾಯ ಪಡೆಯಿರಿ</h4> <p>ದೋಷವು ಇನ್ನೂ ಕಾಣಿಸಿಕೊಳ್ಳುತ್ತಿದ್ದರೆ, ವೆಬ್ಸೈಟ್ ಮಾಲೀಕರನ್ನು ಸಂಪರ್ಕಿಸಿ.</p></translation> <translation id="4226937834893929579"><ph name="BEGIN_LINK" />ನೆಟ್ವರ್ಕ್ ಡಯಾಗ್ನಾಸ್ಟಿಕ್ಸ್ ರನ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸಿ<ph name="END_LINK" />.</translation> +<translation id="4229544452621580519">Chrome ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಸುರಕ್ಷತೆಯ ಪರಿಶೀಲನೆಯನ್ನು ರನ್ ಮಾಡಿ</translation> <translation id="4234495348042597185"><ph name="BEGIN_LINK" /><ph name="SITE" /> ವೆಬ್ಸೈಟ್ಗೆ ಮುಂದುವರೆಯಿರಿ<ph name="END_LINK" /></translation> <translation id="4235360514405112390">ಮಾನ್ಯವಾಗಿದೆ</translation> <translation id="4250431568374086873">ಈ ಸೈಟ್ಗೆ ನಿಮ್ಮ ಸಂಪರ್ಕವು ಸಂಪೂರ್ಣವಾಗಿ ಸುರಕ್ಷಿತವಾಗಿಲ್ಲ</translation> @@ -971,6 +974,7 @@ <translation id="4756388243121344051">&ಇತಿಹಾಸ</translation> <translation id="4758311279753947758">ಸಂಪರ್ಕ ಮಾಹಿತಿಯನ್ನು ಸೇರಿಸಿ</translation> <translation id="4761104368405085019">ನಿಮ್ಮ ಮೈಕ್ರೊಫೋನ್ ಅನ್ನು ಬಳಸಿ</translation> +<translation id="4761869838909035636">Chrome ಸುರಕ್ಷತೆಯ ಪರಿಶೀಲನೆಯನ್ನು ರನ್ ಮಾಡಿ</translation> <translation id="4764776831041365478"><ph name="URL" /> ನಲ್ಲಿರುವ ವೆಬ್ಪುಟವು ತಾತ್ಕಾಲಿಕವಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸದೇ ಇರಬಹುದು ಅಥವಾ ಅದನ್ನು ಶಾಶ್ವತವಾಗಿ ಹೊಸ ವೆಬ್ ವಿಳಾಸಕ್ಕೆ ಸರಿಸಲಾಗಿರಬಹುದು.</translation> <translation id="4766713847338118463">ಕೆಳಭಾಗದಲ್ಲಿ ಎರಡು ಸ್ಟೇಪಲ್ ಹಾಕಿ</translation> <translation id="4768815695067202997"><ph name="BEGIN_BOLD" />
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb index 83a29c7..08a0a39 100644 --- a/components/strings/components_strings_ko.xtb +++ b/components/strings/components_strings_ko.xtb
@@ -534,6 +534,7 @@ <translation id="3037605927509011580">앗, 이런!</translation> <translation id="3041612393474885105">인증서 정보</translation> <translation id="3060227939791841287">C9(봉투)</translation> +<translation id="3060557858482803256"><ph name="RUN_CHROME_SAFETY_CHECK_FOCUSED_FRIENDLY_MATCH_TEXT" />, Tab과 Enter 키를 차례로 눌러 Chrome 설정에서 안전 확인 실행</translation> <translation id="3061707000357573562">서비스 패치</translation> <translation id="3064966200440839136">시크릿 모드를 종료하고 외부 애플리케이션에서 결제합니다. 계속하시겠습니까?</translation> <translation id="3080254622891793721">그래픽</translation> @@ -771,6 +772,7 @@ <translation id="3964661563329879394">{COUNT,plural, =0{없음}=1{사이트 1개 }other{사이트 #개 }}</translation> <translation id="397105322502079400">계산 중...</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" />이(가) 차단됨</translation> +<translation id="3973357910713125165">Chrome 안전 확인 실행 버튼, Enter 키를 눌러 Chrome 설정에서 안전 확인 실행</translation> <translation id="3987405730340719549">Chrome에서 이 사이트가 허위 또는 사기성 사이트일 수 있다고 판단했습니다. 이 메시지가 실수로 표시되었다고 생각된다면 다음 페이지를 방문해 주시기 바랍니다. https://bugs.chromium.org/p/chromium/issues/entry?template=Safety+Tips+Appeals.</translation> @@ -847,6 +849,7 @@ <h4>5단계: 추가 도움 받기</h4> <p>계속해서 오류가 표시되면 웹사이트 소유자에게 문의하세요.</p></translation> <translation id="4226937834893929579"><ph name="BEGIN_LINK" />네트워크 진단 프로그램을 실행<ph name="END_LINK" />해 보세요.</translation> +<translation id="4229544452621580519">Chrome 설정에서 안전 확인을 실행하세요.</translation> <translation id="4234495348042597185"><ph name="BEGIN_LINK" /><ph name="SITE" />(으)로 이동<ph name="END_LINK" /></translation> <translation id="4235360514405112390">유효</translation> <translation id="4250431568374086873">이 사이트의 보안 연결(HTTPS)은 완벽하지 않습니다.</translation> @@ -972,6 +975,7 @@ <translation id="4756388243121344051">방문 기록(&H)</translation> <translation id="4758311279753947758">연락처 정보 추가</translation> <translation id="4761104368405085019">마이크 사용</translation> +<translation id="4761869838909035636">Chrome 안전 확인 실행</translation> <translation id="4764776831041365478"><ph name="URL" />의 웹페이지가 일시적으로 다운되었거나 새 웹 주소로 완전히 이동했을 수 있습니다.</translation> <translation id="4766713847338118463">하단 듀얼 스테이플</translation> <translation id="4768815695067202997"><ph name="BEGIN_BOLD" />
diff --git a/components/strings/components_strings_ky.xtb b/components/strings/components_strings_ky.xtb index b62c602..bdb6aa18 100644 --- a/components/strings/components_strings_ky.xtb +++ b/components/strings/components_strings_ky.xtb
@@ -540,6 +540,7 @@ <translation id="3037605927509011580">Атаңдын көрү!</translation> <translation id="3041612393474885105">Тастыктама маалыматы</translation> <translation id="3060227939791841287">C9 (Конверт)</translation> +<translation id="3060557858482803256"><ph name="RUN_CHROME_SAFETY_CHECK_FOCUSED_FRIENDLY_MATCH_TEXT" />, Chrome жөндөөлөрүнөн коопсуздукту текшерүү үчүн Tab, андан кийин Enter баскычын басыңыз</translation> <translation id="3061707000357573562">Оңдоо кызматы</translation> <translation id="3064966200440839136">Тышкы колдонмо аркылуу төлөө үчүн жашыруун режимден чыкканы жатасыз. Уланта берелиби?</translation> <translation id="3080254622891793721">Графика</translation> @@ -776,6 +777,7 @@ <translation id="3964661563329879394">{COUNT,plural, =0{Бирөө да жок}=1{1 сайт }other{# сайт }}</translation> <translation id="397105322502079400">Эсептелүүдө…</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> сайты бөгөттөлгөн</translation> +<translation id="3973357910713125165">Chrome'дун коопсуздугун текшерүү баскычы, Chrome жөндөөлөрүнөн коопсуздукту текшерүү үчүн Enter баскычын басыңыз</translation> <translation id="3987405730340719549">Chrome бул жалган сайт болушу мүмкүн экенин аныктады. Эгер бул жаңылыш көрсөтүлүп жатат деп ойлосоңуз, https://bugs.chromium.org/p/chromium/issues/entry?template=Safety+Tips+Appeals баракчасына баш багыңыз.</translation> @@ -857,6 +859,7 @@ <h4>5-кадам: Кошумча жардам алыңыз</h4> <p>Катаны дагы деле көрүп жатсаңыз, вебсайттын ээси менен байланышыңыз.</p></translation> <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Тармак мүчүлүштүгүн аныктоону иштетип көрүңүз<ph name="END_LINK" />.</translation> +<translation id="4229544452621580519">Chrome жөндөөлөрүнөн коопсуздукту текшериңиз</translation> <translation id="4234495348042597185"><ph name="BEGIN_LINK" /><ph name="SITE" /> сайтына улантуу<ph name="END_LINK" /></translation> <translation id="4235360514405112390">Жарактуу</translation> <translation id="4250431568374086873">Бул сайтка туташуу толугу менен коопсуз эмес</translation> @@ -982,6 +985,7 @@ <translation id="4756388243121344051">&Таржымал</translation> <translation id="4758311279753947758">Байланыш маалыматын кошуу</translation> <translation id="4761104368405085019">Микрофонуңузду колдонуңуз</translation> +<translation id="4761869838909035636">Chrome'дун коопсуздугун текшерүү</translation> <translation id="4764776831041365478"><ph name="URL" /> дарегиндеги веб-баракча убактылуу иштебейт же жаңы веб дарекке биротоло көчүрүлгөн окшойт.</translation> <translation id="4766713847338118463">Төмөн жагын эки жолу илмек менен бекитүү</translation> <translation id="4768815695067202997"><ph name="BEGIN_BOLD" />
diff --git a/components/strings/components_strings_lo.xtb b/components/strings/components_strings_lo.xtb index 11d46cb4..bbeda4f 100644 --- a/components/strings/components_strings_lo.xtb +++ b/components/strings/components_strings_lo.xtb
@@ -540,6 +540,7 @@ <translation id="3037605927509011580">ອ່າ, ຖ່າຍຮູບ!</translation> <translation id="3041612393474885105">ຂໍ້ມູນໃບຢັ້ງຢືນ</translation> <translation id="3060227939791841287">C9 (ຊອງຈົດໝາຍ)</translation> +<translation id="3060557858482803256"><ph name="RUN_CHROME_SAFETY_CHECK_FOCUSED_FRIENDLY_MATCH_TEXT" />, ກົດ Tab ຈາກນັ້ນກົດ Enter ເພືີ່ອເປີດໃຊ້ການກວດສອບຄວາມປອດໄພໃນການຕັ້ງຄ່າ Chrome</translation> <translation id="3061707000357573562">ການບໍລິການແກ້ບັນຫາ</translation> <translation id="3064966200440839136">ກຳລັງອອກຈາກໂໝດບໍ່ເຜີຍຕົນຕົວເພື່ອຈ່າຍຜ່ານແອັບພລິເຄຊັນພາຍນອກ. ສືບຕໍ່ບໍ?</translation> <translation id="3080254622891793721">ກຣາບຟິກ</translation> @@ -777,6 +778,7 @@ <translation id="3964661563329879394">{COUNT,plural, =0{ບໍ່ມີ}=1{ຈາກ 1 ເວັບໄຊ }other{ຈາກ # ເວັບໄຊ }}</translation> <translation id="397105322502079400">ກໍາລັງຄິດໄລ່...</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> ຖືກບລັອກໄວ້</translation> +<translation id="3973357910713125165">ເປີດໃຊ້ກວດສອບຄວາມປອດໄພ Chrome, ກົດ Enter ເພື່ອເປີດໃຊ້ການກວດສອບຄວາມປອດໄພໃນ Chrome</translation> <translation id="3987405730340719549">Chrome ໄດ້ກຳນົດວ່າເວັບໄຊນີ້ອາດຈະເປັນເວັບໄຊປອມ ຫຼື ຫຼອກລວງ. ຖ້າທ່ານເຊື່ອວ່າມີການສະແດງສິ່ງນີ້ຢ່າງຜິດພາດ ກະລຸນາເຂົ້າຫາ https://bugs.chromium.org/p/chromium/issues/entry?template=Safety+Tips+Appeals.</translation> @@ -858,6 +860,7 @@ <h4>ຂັ້ນຕອນ 5: ການຂໍຄວາມຊ່ວຍເຫຼືອເພີ່ມເຕີມ</h4> <p>ຖ້າທ່ານຍັງເຫັນຂໍ້ຜິດພາດຢູ່, ກະລຸນາຕິດຕໍ່ຫາເຈົ້າຂອງເວັບໄຊ.</p></translation> <translation id="4226937834893929579"><ph name="BEGIN_LINK" />ລອງເປີດໃຊ້ Network Diagnostics<ph name="END_LINK" />.</translation> +<translation id="4229544452621580519">ເປີດໃຊ້ການກວດສອບຄວາມປອດໄພໃນການຕັ້ງຄ່າ Chrome</translation> <translation id="4234495348042597185"><ph name="BEGIN_LINK" />ໄປທີ່ <ph name="SITE" /><ph name="END_LINK" /></translation> <translation id="4235360514405112390">ຖືກຕ້ອງ</translation> <translation id="4250431568374086873">ການເຊື່ອມຕໍ່ຂອງທ່ານກັບເວັບໄຊນີ້ບໍ່ປອດໄພເຕັມສ່ວນ</translation> @@ -983,6 +986,7 @@ <translation id="4756388243121344051">ປະຫວັດ</translation> <translation id="4758311279753947758">ເພີ່ມຂໍ້ມູນຕິດຕໍ່</translation> <translation id="4761104368405085019">ໃຊ້ໄມໂຄຣໂຟນຂອງທ່ານ</translation> +<translation id="4761869838909035636">ເປີດໃຊ້ການກວດສອບຄວາມປອດໄພ Chrome</translation> <translation id="4764776831041365478">ໜ້າເວັບຢູ່ທີ່ <ph name="URL" /> ອາດຈະໃຊ້ບໍ່ໄດ້ຊົ່ວຄາວ ຫຼືມັນອາດຈະໄດ້ຍ້າຍອອກໄປໃສ່ທີ່ຢູ່ເວັບໃໝ່ຖາວອນແລ້ວ.</translation> <translation id="4766713847338118463">ໜີບກະຫຼັບເຟີຢູ່ລຸ່ມສຸດສອງເທື່ອ</translation> <translation id="4768815695067202997"><ph name="BEGIN_BOLD" />
diff --git a/components/strings/components_strings_lt.xtb b/components/strings/components_strings_lt.xtb index 87627f59..c7390ba2 100644 --- a/components/strings/components_strings_lt.xtb +++ b/components/strings/components_strings_lt.xtb
@@ -540,6 +540,7 @@ <translation id="3037605927509011580">Oi!</translation> <translation id="3041612393474885105">Sertifikato informacija</translation> <translation id="3060227939791841287">C9 (vokas)</translation> +<translation id="3060557858482803256"><ph name="RUN_CHROME_SAFETY_CHECK_FOCUSED_FRIENDLY_MATCH_TEXT" />, paspauskite tabuliavimo klavišą, tada – „Enter“, kad paleistumėte Saugos patikrą „Chrome“ nustatymuose</translation> <translation id="3061707000357573562">Pataisos paslauga</translation> <translation id="3064966200440839136">Išjungiate inkognito režimą, kad galėtumėte sumokėti naudodami išorinę programą. Tęsti?</translation> <translation id="3080254622891793721">Grafiniai elementai</translation> @@ -778,6 +779,7 @@ <translation id="3964661563329879394">{COUNT,plural, =0{Nėra}=1{Iš 1 svetainės }one{Iš # svetainės }few{Iš # svetainių }many{Iš # svetainės }other{Iš # svetainių }}</translation> <translation id="397105322502079400">Skaičiuojama...</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> užblokuota.</translation> +<translation id="3973357910713125165">Paleiskite „Chrome“ Saugos patikros mygtuką, paspausdami „Enter“ paleiskite Saugos patikrą „Chrome“ nustatymuose</translation> <translation id="3987405730340719549">„Chrome“ nustatė, kad ši svetainė gali būti suklastota ar apgavikiška. Jei manote, kad šis pranešimas rodomas per klaidą, apsilankykite adresu https://bugs.chromium.org/p/chromium/issues/entry?template=Safety+Tips+Appeals.</translation> @@ -859,6 +861,7 @@ <h4>5 veiksmas: gaukite papildomos pagalbos</h4> <p>Jei vis tiek rodoma klaida, susisiekite su svetainės savininku.</p></translation> <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Pabandykite paleisti „Windows Network Diagnostics“<ph name="END_LINK" />.</translation> +<translation id="4229544452621580519">Paleiskite Saugos patikrą „Chrome“ nustatymuose</translation> <translation id="4234495348042597185"><ph name="BEGIN_LINK" />Eiti į <ph name="SITE" /><ph name="END_LINK" /></translation> <translation id="4235360514405112390">Tinkamas</translation> <translation id="4250431568374086873">Ryšys su šia svetaine nėra visiškai saugus</translation> @@ -984,6 +987,7 @@ <translation id="4756388243121344051">&Istorija</translation> <translation id="4758311279753947758">Pridėti kontaktinę informaciją</translation> <translation id="4761104368405085019">Naudoti mikrofoną</translation> +<translation id="4761869838909035636">Paleisti „Chrome“ Saugos patikrą</translation> <translation id="4764776831041365478">Tinklalapis šiuo adresu <ph name="URL" /> gali laikinai neveikti arba visam laikui būti perkeltas kitu žiniatinklio adresu.</translation> <translation id="4766713847338118463">Dvi sankabėlės apačioje</translation> <translation id="4768815695067202997"><ph name="BEGIN_BOLD" />
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb index f76d348..7c14c71 100644 --- a/components/strings/components_strings_ml.xtb +++ b/components/strings/components_strings_ml.xtb
@@ -537,6 +537,7 @@ <translation id="3037605927509011580">കഷ്ടം!</translation> <translation id="3041612393474885105">സര്ട്ടിഫിക്കറ്റ് വിവരങ്ങള്</translation> <translation id="3060227939791841287">C9 (എൻവലപ്പ്)</translation> +<translation id="3060557858482803256"><ph name="RUN_CHROME_SAFETY_CHECK_FOCUSED_FRIENDLY_MATCH_TEXT" />, Chrome ക്രമീകരണത്തിൽ സുരക്ഷാ പരിശോധന റൺ ചെയ്യാൻ Tab അമർത്തിയ ശേഷം Enter അമർത്തുക</translation> <translation id="3061707000357573562">പാച്ച് സേവനം</translation> <translation id="3064966200440839136">ബാഹ്യ ആപ്പ് വഴി പണമടയ്ക്കാൻ അദൃശ്യ മോഡ് ഒഴിവാക്കുന്നു. തുടരണോ?</translation> <translation id="3080254622891793721">ഗ്രാഫിക്</translation> @@ -773,6 +774,7 @@ <translation id="3964661563329879394">{COUNT,plural, =0{ഒന്നുമില്ല}=1{ഒരു സൈറ്റിൽ നിന്ന് }other{# സൈറ്റുകളിൽ നിന്ന് }}</translation> <translation id="397105322502079400">കണക്കാക്കുന്നു...</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> ബ്ലോക്കുചെയ്തിരിക്കുന്നു</translation> +<translation id="3973357910713125165">Chrome സുരക്ഷാ പരിശോധന റൺ ചെയ്യുക ബട്ടൺ, Chrome ക്രമീകരണത്തിൽ സുരക്ഷാ പരിശോധന റൺ ചെയ്യാൻ Enter അമർത്തുക</translation> <translation id="3987405730340719549">ഈ സൈറ്റ് വ്യാജമോ വഞ്ചനാപരമോ ആകാമെന്ന് Chrome നിർണ്ണയിച്ചു. ഇത് പിശകിനാൽ കാണിച്ചതാണെന്ന് നിങ്ങൾ വിശ്വസിക്കുന്നുവെങ്കിൽ, https://bugs.chromium.org/p/chromium/issues/entry?template=Safety+Tips+Appeals സന്ദർശിക്കുക.</translation> @@ -852,6 +854,7 @@ <h4>ഘട്ടം 5: അധിക സഹായം സ്വീകരിക്കുക</h4> <p>നിങ്ങൾ ഇപ്പോഴും പിശക് കാണുന്നുവെങ്കിൽ, വെബ്സൈറ്റ് ഉടമയെ ബന്ധപ്പെടുക.</p></translation> <translation id="4226937834893929579"><ph name="BEGIN_LINK" />നെറ്റ്വർക്ക് ഡയഗണോസ്റ്റിക്സ് റൺ ചെയ്തുനോക്കൂ<ph name="END_LINK" />.</translation> +<translation id="4229544452621580519">Chrome ക്രമീകരണത്തിൽ സുരക്ഷാ പരിശോധന റൺ ചെയ്യുക</translation> <translation id="4234495348042597185"><ph name="BEGIN_LINK" /><ph name="SITE" /> എന്ന സൈറ്റിലേക്ക് പോവുക<ph name="END_LINK" /></translation> <translation id="4235360514405112390">സാധുത</translation> <translation id="4250431568374086873">ഈ സൈറ്റിലുള്ള നിങ്ങളുടെ കണക്ഷൻ പൂർണ്ണമായും സുരക്ഷിതമല്ല</translation> @@ -977,6 +980,7 @@ <translation id="4756388243121344051">&ചരിത്രം</translation> <translation id="4758311279753947758">കോൺടാക്റ്റ് വിവരങ്ങൾ ചേർക്കുക</translation> <translation id="4761104368405085019">നിങ്ങളുടെ മൈക്രോഫോൺ ഉപയോഗിക്കുക</translation> +<translation id="4761869838909035636">Chrome സുരക്ഷാ പരിശോധന റൺ ചെയ്യുക</translation> <translation id="4764776831041365478"><ph name="URL" /> ലെ വെബ്പേജ് താല്ക്കാലികമായി പ്രവര്ത്തനരഹിതമായിരിക്കാം, അല്ലെങ്കില് ഒരു പുതിയ വെബ് വിലാസത്തിലേക്ക് ശാശ്വതമായി നീക്കംചെയ്യപ്പെട്ടിരിക്കാം.</translation> <translation id="4766713847338118463">താഴെ ഇരട്ട സ്റ്റേപ്പിൾ ചെയ്യുക</translation> <translation id="4768815695067202997"><ph name="BEGIN_BOLD" />
diff --git a/components/strings/components_strings_ms.xtb b/components/strings/components_strings_ms.xtb index cf61a6a..c41df46 100644 --- a/components/strings/components_strings_ms.xtb +++ b/components/strings/components_strings_ms.xtb
@@ -540,6 +540,7 @@ <translation id="3037605927509011580">Oh, Tidak!</translation> <translation id="3041612393474885105">Maklumat Sijil</translation> <translation id="3060227939791841287">C9 (Sampul Surat)</translation> +<translation id="3060557858482803256"><ph name="RUN_CHROME_SAFETY_CHECK_FOCUSED_FRIENDLY_MATCH_TEXT" />, tekan Tab kemudian Enter untuk menjalankan Semakan Keselamatan dalam tetapan Chrome</translation> <translation id="3061707000357573562">Perkhidmatan Tampung</translation> <translation id="3064966200440839136">Meninggalkan mod inkognito untuk membayar melalui aplikasi luar. Teruskan?</translation> <translation id="3080254622891793721">Grafik</translation> @@ -778,6 +779,7 @@ <translation id="3964661563329879394">{COUNT,plural, =0{Tiada}=1{Daripada 1 tapak }other{Daripada # tapak }}</translation> <translation id="397105322502079400">Mengira...</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> disekat</translation> +<translation id="3973357910713125165">Butang Jalankan Semakan Keselamatan Chrome, tekan Enter untuk menjalankan Semakan Keselamatan dalam tetapan Chrome</translation> <translation id="3987405730340719549">Chrome telah menentukan bahawa tapak ini mungkin palsu atau merupakan suatu penipuan. Jika anda percaya amaran ini tersilap ditunjukkan, sila lawati https://bugs.chromium.org/p/chromium/issues/entry?template=Safety+Tips+Appeals.</translation> @@ -859,6 +861,7 @@ <h4>Langkah 5: Dapatkan bantuan tambahan</h4> <p>Jika ralat masih kelihatan, hubungi pemilik tapak web.</p></translation> <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Cuba jalankan Diagnostik Rangkaian<ph name="END_LINK" />.</translation> +<translation id="4229544452621580519">Jalankan Semakan Keselamatan dalam tetapan Chrome</translation> <translation id="4234495348042597185"><ph name="BEGIN_LINK" />Teruskan ke <ph name="SITE" /><ph name="END_LINK" /></translation> <translation id="4235360514405112390">Sah</translation> <translation id="4250431568374086873">Sambungan anda ke tapak ini tidak selamat sepenuhnya</translation> @@ -984,6 +987,7 @@ <translation id="4756388243121344051">&Sejarah</translation> <translation id="4758311279753947758">Tambahkan maklumat hubungan</translation> <translation id="4761104368405085019">Gunakan mikrofon anda</translation> +<translation id="4761869838909035636">Jalankan Semakan Keselamatan Chrome</translation> <translation id="4764776831041365478">Laman web di <ph name="URL" /> mungkin tergendala buat sementara waktu atau ia mungkin dpindahkan secara kekal ke alamat web baharu.</translation> <translation id="4766713847338118463">Dua kokot bawah</translation> <translation id="4768815695067202997"><ph name="BEGIN_BOLD" />
diff --git a/components/strings/components_strings_my.xtb b/components/strings/components_strings_my.xtb index 5a86aeec..0b7352c9 100644 --- a/components/strings/components_strings_my.xtb +++ b/components/strings/components_strings_my.xtb
@@ -544,6 +544,7 @@ <translation id="3037605927509011580">အော၊ လက်ဖျောက်!</translation> <translation id="3041612393474885105">အသိမှတ်ပြု လက်မှတ် အချက်အလက်</translation> <translation id="3060227939791841287">C9 (စာအိတ်)</translation> +<translation id="3060557858482803256"><ph name="RUN_CHROME_SAFETY_CHECK_FOCUSED_FRIENDLY_MATCH_TEXT" />၊ Chrome ဆက်တင်များတွင် ‘လုံခြုံရေး စစ်ဆေးမှု’ လုပ်ဆောင်ရန် ‘တဘ်ခလုတ်’ ပြီးနောက် Enter နှိပ်ပါ</translation> <translation id="3061707000357573562">ပြင်ဆင်ခြင်း ဝန်ဆောင်မှု</translation> <translation id="3064966200440839136">ပြင်ပအပလီကေးရှင်းဖြင့် ငွေပေးချေရန် ရုပ်ဖျက်မုဒ်မှ ထွက်နေသည်။ ရှေ့ဆက် လိုပါသလား။</translation> <translation id="3080254622891793721">ဂရပ်ဖစ်</translation> @@ -776,6 +777,7 @@ <translation id="3964661563329879394">{COUNT,plural, =0{တစ်ခုမျှမရှိပါ}=1{ဝဘ်ဆိုက် ၁ ခုမှ }other{ဝဘ်ဆိုက် # ခုမှ }}</translation> <translation id="397105322502079400">တွက်ချက်နေ...</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> ကိုပိတ်ဆို့ထားသည်</translation> +<translation id="3973357910713125165">‘Chrome လုံခြုံရေး စစ်ဆေးမှု’ ခလုတ်ကို လုပ်ဆောင်ပါ၊ Chrome ဆက်တင်များတွင် ‘လုံခြုံရေး စစ်ဆေးမှု’ လုပ်ဆောင်ရန် Enter နှိပ်ပါ</translation> <translation id="3987405730340719549">ဤဝဘ်ဆိုက်သည် အတု သို့မဟုတ် လှည့်ဖြားမှု ဖြစ်နိုင်သည်ဟု Chrome က သတ်မှတ်လိုက်သည်။ ၎င်းကို မှားယွင်းပြီး ပြသည်ဟု ယုံကြည်ပါက https://bugs.chromium.org/p/chromium/issues/entry?template=Safety+Tips+Appeals သို့ဝင်ကြည့်ပါ။</translation> @@ -858,6 +860,7 @@ <h4>အဆင့် ၅− နောက်ထပ် အကူအညီများ ရယူရန်</h4> <p>ဤအမှားအယွင်းကို တွေ့နေရဆဲဖြစ်လျှင် ဝဘ်ဆိုက်ပိုင်ရှင်ကို ဆက်သွယ်ပါ။</p></translation> <translation id="4226937834893929579"><ph name="BEGIN_LINK" />ကွန်ရက်ပြဿနာရှာဖွေမှု ပြုလုပ်ကြည့်ပါ<ph name="END_LINK" />။</translation> +<translation id="4229544452621580519">Chrome ဆက်တင်များတွင် ‘လုံခြုံရေး စစ်ဆေးမှု’ လုပ်ဆောင်ပါ</translation> <translation id="4234495348042597185"><ph name="BEGIN_LINK" /><ph name="SITE" /> သို့ ဆက်သွားရန်<ph name="END_LINK" /></translation> <translation id="4235360514405112390">မှန်ကန်သည်</translation> <translation id="4250431568374086873">ဤဝဘ်ဆိုက်သို့ သင့်ချိတ်ဆက်ထားမှုသည် လုံခြုံမှုအပြည့်အဝမရှိပါ</translation> @@ -983,6 +986,7 @@ <translation id="4756388243121344051">မှတ်တမ်း</translation> <translation id="4758311279753947758">ဆက်သွယ်ရန်အချက်အလက် ထည့်ရန်</translation> <translation id="4761104368405085019">သင့်မိုက်ခရိုဖုန်းကို အသုံးပြုရန်</translation> +<translation id="4761869838909035636">‘Chrome လုံခြုံရေး စစ်ဆေးမှု’ လုပ်ဆောင်ရန်</translation> <translation id="4764776831041365478"><ph name="URL" /> ပေါ်က ဝဘ်စာမျက်နှာမှ ယာယီ ဒေါင်းနေတာ ဖြစ်နိုင်သည် သို့မဟုတ် ၎င်းသည် ဝဘ် လိပ်စာ သစ်ဆီသို့ ထာဝရ ရွှေ့ပြောင်းသွားတာ ဖြစ်နိုင်သည်။</translation> <translation id="4766713847338118463">အောက်ခြေတွင် ချုပ်စက်ဖြင့် နှစ်ချက်ချုပ်ရန်</translation> <translation id="4768815695067202997"><ph name="BEGIN_BOLD" />
diff --git a/components/strings/components_strings_or.xtb b/components/strings/components_strings_or.xtb index afb9fc6..c973760 100644 --- a/components/strings/components_strings_or.xtb +++ b/components/strings/components_strings_or.xtb
@@ -534,6 +534,7 @@ <translation id="3037605927509011580">ଇସ!</translation> <translation id="3041612393474885105">ସାର୍ଟିଫିକେଟ୍ ସୂଚନା</translation> <translation id="3060227939791841287">C9 (ଏନଭଲପ୍)</translation> +<translation id="3060557858482803256"><ph name="RUN_CHROME_SAFETY_CHECK_FOCUSED_FRIENDLY_MATCH_TEXT" />, Chrome ସେଟିଂସରେ ସୁରକ୍ଷା ଯାଞ୍ଚ ଚଲାଇବାକୁ Tab କରି Enter କୀ'କୁ ଦବାନ୍ତୁ</translation> <translation id="3061707000357573562">ପ୍ୟାଚ୍ ସେବା</translation> <translation id="3064966200440839136">ଏକ ଏକ୍ସଟର୍ନଲ୍ ଆପ୍ଲିକେସନ୍ ମାଧ୍ୟମରେ ଦେୟ ଦେବାକୁ ଇନ୍କଗ୍ନିଟୋ ମୋଡ୍ ଛାଡୁଛନ୍ତି। ଜାରି ରଖିବେ?</translation> <translation id="3080254622891793721">ଗ୍ରାଫିକ୍</translation> @@ -768,6 +769,7 @@ <translation id="3964661563329879394">{COUNT,plural, =0{କୌଣସିଟି ନୁହେଁ}=1{1ଟି ସାଇଟ୍ରୁ}other{# ଟି ସାଇଟ୍ରୁ }}</translation> <translation id="397105322502079400">ଗଣନା କରାଯାଉଛି…</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" />କୁ ବ୍ଲକ୍ କରାଯାଇଛି</translation> +<translation id="3973357910713125165">"Chrome ସୁରକ୍ଷା ଯାଞ୍ଚ ଚଲାନ୍ତୁ" ବଟନ୍, Chrome ସେଟିଂସରେ ସୁରକ୍ଷା ଯାଞ୍ଚ ଚଲାଇବାକୁ Enter କୀ'କୁ ଦବାନ୍ତୁ</translation> <translation id="3987405730340719549">Chrome ନିର୍ଦ୍ଧାରିତ କରିଛି ଯେ ଏହି ସାଇଟ୍ ନକଲି କିମ୍ବା ପ୍ରତାରଣାମୂଳକ ହୋଇପାରେ। ଯଦି ଆପଣ ବିଶ୍ୱାସ କରୁଛନ୍ତି, ଏହା ତ୍ରୂଟିରେ ଦେଖାଯାଇଛି, ତେବେ ଦୟାକରି https://bugs.chromium.org/p/chromium/issues/entry?template=Safety+Tips+Appealsକୁ ଯାଆନ୍ତୁ।</translation> @@ -844,6 +846,7 @@ <h4>ଷ୍ଟେପ୍ 5: ଅତିରିକ୍ତ ସାହାଯ୍ୟ ପ୍ରାପ୍ତ କରନ୍ତୁ</h4> <p>ଯଦି ଆପଣ ତଥାପି ଏହି ତ୍ରୁଟି ଦେଖନ୍ତି, ତେବେ ୱେବ୍ସାଇଟ୍ ମାଲିକଙ୍କୁ ଯୋଗାଯୋଗ କରନ୍ତୁ।</p></translation> <translation id="4226937834893929579"><ph name="BEGIN_LINK" />ନେଟ୍ୱର୍କ ଡାଏଗ୍ନୋଷ୍ଟିକ୍ ଚଳାଇବାକୁ ଚେଷ୍ଟା କରନ୍ତୁ<ph name="END_LINK" />।</translation> +<translation id="4229544452621580519">Chrome ସେଟିଂସରେ ଏକ ସୁରକ୍ଷା ଯାଞ୍ଚ ଚଲାନ୍ତୁ</translation> <translation id="4234495348042597185"><ph name="BEGIN_LINK" /><ph name="SITE" />କୁ ଯାଆନ୍ତୁ<ph name="END_LINK" /></translation> <translation id="4235360514405112390">ବୈଧ ଅଟେ</translation> <translation id="4250431568374086873">ଏହି ସାଇଟ୍କୁ ଆପଣଙ୍କର ସଂଯୋଗ ପୂର୍ଣ୍ଣରୂପେ ସୁରକ୍ଷିତ ନୁହେଁ</translation> @@ -969,6 +972,7 @@ <translation id="4756388243121344051">&ଇତିବୃତ୍ତି</translation> <translation id="4758311279753947758">ଯୋଗାଯୋଗ ସୂଚନା ଯୋଗ କରନ୍ତୁ</translation> <translation id="4761104368405085019">ଆପଣଙ୍କର ମାଇକ୍ରୋଫୋନ୍ ବ୍ୟବହାର କରନ୍ତୁ</translation> +<translation id="4761869838909035636">Chrome ସୁରକ୍ଷା ଯାଞ୍ଚ ଚଲାନ୍ତୁ</translation> <translation id="4764776831041365478"><ph name="URL" />ରେ ଥିବା ୱେବ୍ପୃଷ୍ଠାଟି ଅସ୍ଥାୟୀରୂପେ ଡାଉନ୍ ଥାଇପାରେ କିମ୍ବା ସ୍ଥାୟୀଭାବେ ଏକ ନୂତନ ୱେବ୍ ଠିକଣାକୁ ସ୍ଥାନାନ୍ତର ହୋଇପାରେ।</translation> <translation id="4766713847338118463">ତଳ ପଟରେ ଦୁଇଟି ଷ୍ଟାପଲ୍</translation> <translation id="4768815695067202997"><ph name="BEGIN_BOLD" />
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb index 175da60..f7633bc 100644 --- a/components/strings/components_strings_ro.xtb +++ b/components/strings/components_strings_ro.xtb
@@ -538,6 +538,7 @@ <translation id="3037605927509011580">Of, nu mai merge!</translation> <translation id="3041612393474885105">Informații despre certificat</translation> <translation id="3060227939791841287">C9 (Plic)</translation> +<translation id="3060557858482803256"><ph name="RUN_CHROME_SAFETY_CHECK_FOCUSED_FRIENDLY_MATCH_TEXT" />, apasă pe Tab, apoi pe Enter pentru a rula verificarea de siguranță în setările Chrome</translation> <translation id="3061707000357573562">Serviciu de corecție</translation> <translation id="3064966200440839136">Vei părăsi modul incognito pentru a plăti folosind o aplicație externă. Continui?</translation> <translation id="3080254622891793721">Grafică</translation> @@ -775,6 +776,7 @@ <translation id="3964661563329879394">{COUNT,plural, =0{Niciunul}=1{De la 1 site }few{De la # site-uri }other{De la # de site-uri }}</translation> <translation id="397105322502079400">Se calculează...</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> este blocat</translation> +<translation id="3973357910713125165">Butonul Rulează verificarea de siguranță pentru Chrome, apasă pe Enter pentru a rula verificarea de siguranță în setările Chrome</translation> <translation id="3987405730340719549">Chrome a identificat acest site ca fiind potențial fals sau fraudulos. În cazul în care consideri că este o greșeală, accesează https://bugs.chromium.org/p/chromium/issues/entry?template=Safety+Tips+Appeals.</translation> @@ -856,6 +858,7 @@ <h4>Pasul 5: primește ajutor suplimentar</h4> <p>Dacă eroarea apare în continuare, contactează proprietarul site-ului.</p></translation> <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Rulează Diagnostice rețea<ph name="END_LINK" />.</translation> +<translation id="4229544452621580519">Rulează o verificare de siguranță în setările Chrome</translation> <translation id="4234495348042597185"><ph name="BEGIN_LINK" />Accesează <ph name="SITE" /><ph name="END_LINK" /></translation> <translation id="4235360514405112390">Valid</translation> <translation id="4250431568374086873">Conexiunea la acest site nu este complet sigură</translation> @@ -981,6 +984,7 @@ <translation id="4756388243121344051">&Istoric</translation> <translation id="4758311279753947758">Adaugă informații de contact</translation> <translation id="4761104368405085019">Utilizează microfonul</translation> +<translation id="4761869838909035636">Rulează verificarea de siguranță pentru Chrome</translation> <translation id="4764776831041365478">Pagina web de la <ph name="URL" /> poate fi temporar nefuncțională sau a fost mutată definitiv la o nouă adresă web.</translation> <translation id="4766713847338118463">Capsare dublă în partea de jos</translation> <translation id="4768815695067202997"><ph name="BEGIN_BOLD" />
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb index 860b9b25..8a2e23c 100644 --- a/components/strings/components_strings_ru.xtb +++ b/components/strings/components_strings_ru.xtb
@@ -534,6 +534,7 @@ <translation id="3037605927509011580">Опаньки...</translation> <translation id="3041612393474885105">Данные сертификата</translation> <translation id="3060227939791841287">C9 (конверт)</translation> +<translation id="3060557858482803256"><ph name="RUN_CHROME_SAFETY_CHECK_FOCUSED_FRIENDLY_MATCH_TEXT" />. Нажмите Tab и затем Ввод, чтобы запустить проверку безопасности в настройках Chrome</translation> <translation id="3061707000357573562">Исправление сервиса</translation> <translation id="3064966200440839136">Вы выйдете из режима инкогнито, чтобы произвести оплату во внешнем приложении. Продолжить?</translation> <translation id="3080254622891793721">Изображения</translation> @@ -770,6 +771,7 @@ <translation id="3964661563329879394">{COUNT,plural, =0{Нет}=1{С 1 сайта }one{С # сайта }few{С # сайтов }many{С # сайтов }other{С # сайта }}</translation> <translation id="397105322502079400">Вычисление…</translation> <translation id="3973234410852337861">Сайт <ph name="HOST_NAME" /> заблокирован</translation> +<translation id="3973357910713125165">Кнопка запуска проверки безопасности. Нажмите Ввод, чтобы запустить проверку безопасности в настройках Chrome</translation> <translation id="3987405730340719549">Браузер Chrome определил, что этот сайт может оказаться поддельным или мошенническим. Если вы думаете, что это сообщение показано по ошибке, заполните форму на странице https://bugs.chromium.org/p/chromium/issues/entry?template=Safety+Tips+Appeals.</translation> @@ -846,6 +848,7 @@ <h4>Шаг 5. Обратитесь за помощью</h4> <p>Если проблему решить не удалось, обратитесь к владельцу сайта.</p></translation> <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Выполните диагностику сети<ph name="END_LINK" />.</translation> +<translation id="4229544452621580519">Запустите проверку безопасности в настройках Chrome</translation> <translation id="4234495348042597185"><ph name="BEGIN_LINK" />Перейти на сайт <ph name="SITE" /><ph name="END_LINK" /></translation> <translation id="4235360514405112390">Действительный</translation> <translation id="4250431568374086873">Подключение к сайту защищено не полностью</translation> @@ -971,6 +974,7 @@ <translation id="4756388243121344051">&История</translation> <translation id="4758311279753947758">Добавить контактные данные</translation> <translation id="4761104368405085019">Использование микрофона</translation> +<translation id="4761869838909035636">Запустить проверку безопасности</translation> <translation id="4764776831041365478">Веб-страница по адресу <ph name="URL" />, возможно, временно недоступна или постоянно перемещена по новому адресу.</translation> <translation id="4766713847338118463">Две скобы снизу</translation> <translation id="4768815695067202997"><ph name="BEGIN_BOLD" />
diff --git a/components/strings/components_strings_sr-Latn.xtb b/components/strings/components_strings_sr-Latn.xtb index 60871e3..6a62ebb 100644 --- a/components/strings/components_strings_sr-Latn.xtb +++ b/components/strings/components_strings_sr-Latn.xtb
@@ -147,7 +147,7 @@ <translation id="1462951478840426066">Koristi fontove na računaru da biste mogli da pravite sadržaj visoke vernosti</translation> <translation id="1463543813647160932">5×7</translation> <translation id="1467432559032391204">Ulevo</translation> -<translation id="1468653229182955856"><ph name="ONE_TIME_CODE" /> je vaš kôd za<ph name="EMBEDDED_ORIGIN" /> pomoću kog možete da nastavite na sajtu <ph name="TOP_ORIGIN" /></translation> +<translation id="1468653229182955856"><ph name="ONE_TIME_CODE" /> je vaš kôd za <ph name="EMBEDDED_ORIGIN" /> pomoću kog možete da nastavite na sajtu <ph name="TOP_ORIGIN" /></translation> <translation id="1472675084647422956">Prikaži više</translation> <translation id="1473183651233018052">JIS B10</translation> <translation id="147358896496811705">2A0</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb index 48fb755..595003a 100644 --- a/components/strings/components_strings_sr.xtb +++ b/components/strings/components_strings_sr.xtb
@@ -147,7 +147,7 @@ <translation id="1462951478840426066">Користи фонтове на рачунару да бисте могли да правите садржај високе верности</translation> <translation id="1463543813647160932">5×7</translation> <translation id="1467432559032391204">Улево</translation> -<translation id="1468653229182955856"><ph name="ONE_TIME_CODE" /> је ваш кôд за<ph name="EMBEDDED_ORIGIN" /> помоћу ког можете да наставите на сајту <ph name="TOP_ORIGIN" /></translation> +<translation id="1468653229182955856"><ph name="ONE_TIME_CODE" /> је ваш кôд за <ph name="EMBEDDED_ORIGIN" /> помоћу ког можете да наставите на сајту <ph name="TOP_ORIGIN" /></translation> <translation id="1472675084647422956">Прикажи више</translation> <translation id="1473183651233018052">JIS B10</translation> <translation id="147358896496811705">2A0</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb index 47147233..edc5038 100644 --- a/components/strings/components_strings_ta.xtb +++ b/components/strings/components_strings_ta.xtb
@@ -538,6 +538,7 @@ <translation id="3037605927509011580">அச்சச்சோ!</translation> <translation id="3041612393474885105">சான்றிதழ் தகவல்</translation> <translation id="3060227939791841287">C9 (என்வலப்)</translation> +<translation id="3060557858482803256"><ph name="RUN_CHROME_SAFETY_CHECK_FOCUSED_FRIENDLY_MATCH_TEXT" />. Chrome அமைப்புகளில் பாதுகாப்புச் சரிபார்ப்பை இயக்க, Tab விசையை அழுத்திவிட்டு Enter விசையை அழுத்துங்கள்</translation> <translation id="3061707000357573562">பேட்ச் சேவை</translation> <translation id="3064966200440839136">வெளிப்புற ஆப்ஸின் மூலம் பணத்தை செலுத்த, மறைநிலையிலிருந்து வெளியேறுகிறீர்கள். தொடரவா?</translation> <translation id="3080254622891793721">கிராஃபிக்</translation> @@ -771,6 +772,7 @@ <translation id="3964661563329879394">{COUNT,plural, =0{ஏதுமில்லை}=1{1 தளத்திலிருந்து }other{# தளங்களிலிருந்து }}</translation> <translation id="397105322502079400">கணக்கிடுகிறது...</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> தடுக்கப்பட்டுள்ளது</translation> +<translation id="3973357910713125165">Chrome பாதுகாப்புச் சரிபார்ப்பை இயக்கும் பட்டன். Chrome அமைப்புகளில் பாதுகாப்புச் சரிபார்ப்பை இயக்க, Enter விசையை அழுத்துங்கள்</translation> <translation id="3987405730340719549">இந்த இணையதளம் பொய்யானதாகவோ மோசடியானதாகவோ இருக்கக்கூடும் என்று Chrome கண்டறிந்துள்ளது. பிழையாக இது காட்டப்படுகிறது என்று நீங்கள் கருதினால் https://bugs.chromium.org/p/chromium/issues/entry?template=Safety+Tips+Appeals என்பதற்குச் செல்லவும்.</translation> @@ -852,6 +854,7 @@ <h4>படி 5: கூடுதல் உதவி பெறுங்கள்</h4> <p>அப்போதும் பிழை வந்தால், இணையதள உரிமையாளரைத் தொடர்புகொள்ளவும்.</p></translation> <translation id="4226937834893929579"><ph name="BEGIN_LINK" />நெட்வொர்க் டயக்னாஸ்டிக்ஸ் கருவியை இயக்கவும்<ph name="END_LINK" />.</translation> +<translation id="4229544452621580519">Chrome அமைப்புகளில் பாதுகாப்புச் சரிபார்ப்பை இயக்குங்கள்</translation> <translation id="4234495348042597185"><ph name="BEGIN_LINK" />இணைப்பிற்கு செல்க <ph name="SITE" /><ph name="END_LINK" /></translation> <translation id="4235360514405112390">செல்லுபடியானது</translation> <translation id="4250431568374086873">இந்தத் தளத்திற்கான உங்கள் இணைப்பு, முழுப் பாதுகாப்புடன் இல்லை</translation> @@ -977,6 +980,7 @@ <translation id="4756388243121344051">&வரலாறு</translation> <translation id="4758311279753947758">தொடர்புத் தகவலைச் சேர்</translation> <translation id="4761104368405085019">உங்கள் மைக்ரோஃபோனைப் பயன்படுத்தலாம்</translation> +<translation id="4761869838909035636">Chrome பாதுகாப்புச் சரிபார்ப்பை இயக்கு</translation> <translation id="4764776831041365478"><ph name="URL" /> இல் உள்ள வலைப்பக்கமானது தற்காலிகமாக இயங்காமல் இருக்கலாம் அல்லது அது ஒரு புதிய வலை முகவரிக்கு நிரந்தரமாக நகர்த்தப்பட்டிருக்கலாம்.</translation> <translation id="4766713847338118463">டூயல் ஸ்டேப்பில் பாட்டம்</translation> <translation id="4768815695067202997"><ph name="BEGIN_BOLD" />
diff --git a/components/strings/components_strings_ur.xtb b/components/strings/components_strings_ur.xtb index f234205c..831550f 100644 --- a/components/strings/components_strings_ur.xtb +++ b/components/strings/components_strings_ur.xtb
@@ -542,6 +542,7 @@ <translation id="3037605927509011580">ارے، رکیں!</translation> <translation id="3041612393474885105">سرٹیفکیٹ کی معلومات</translation> <translation id="3060227939791841287">C9 (Envelope)</translation> +<translation id="3060557858482803256"><ph name="RUN_CHROME_SAFETY_CHECK_FOCUSED_FRIENDLY_MATCH_TEXT" />، Chrome کی ترتیبات میں موجود سیفٹی چیک چلانے کے لئے ٹیب پھر اینٹر دبائیں</translation> <translation id="3061707000357573562">پیچ سروس</translation> <translation id="3064966200440839136">کسی خارجی ایپلیکیشن کے ذریعے ادائیگی کرنے کیلئے پوشیدگی وضع کو چھوڑ رہے ہیں۔ جاری رکھیں؟</translation> <translation id="3080254622891793721">گرافک</translation> @@ -780,6 +781,7 @@ <translation id="3964661563329879394">{COUNT,plural, =0{کوئی سائٹ نہیں}=1{1 سائٹ سے }other{# سائٹس سے }}</translation> <translation id="397105322502079400">حساب لگایا جا رہا ہے…</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> مسدود ہے</translation> +<translation id="3973357910713125165">Chrome کا سیفٹی چیک بٹن چلائیں، Chrome کی ترتیبات میں موجود سیفٹی چیک چلانے کے لئے اینٹر دبائیں</translation> <translation id="3987405730340719549">Chrome اس نتیجے پر پہنچا ہے کہ یہ سائٹ جعلی یا پُر فریب ہو سکتی ہے۔ اگر آپ کو لگتا ہے کہ یہ غلطی سے دکھایا جا رہا ہے تو https://bugs.chromium.org/p/chromium/issues/entry?template=Safety+Tips+Appeals ملاحظہ کریں۔</translation> @@ -861,6 +863,7 @@ <h4>مرحلہ 5: اضافی مدد حاصل کریں</h4> <p>اگر آپ کو اب بھی خرابی دکھائی دیتی ہے، تو ویب سائٹ کے مالک سے رابطہ کریں۔</p></translation> <translation id="4226937834893929579"><ph name="BEGIN_LINK" />نیٹ ورک کی تشخیصات چلانے کی کوشش کریں<ph name="END_LINK" />۔</translation> +<translation id="4229544452621580519">Chrome کی تریبات میں سیفٹی چیک چلائیں</translation> <translation id="4234495348042597185"><ph name="BEGIN_LINK" /><ph name="SITE" /> کی طرف بڑھیں<ph name="END_LINK" /></translation> <translation id="4235360514405112390">درست</translation> <translation id="4250431568374086873">اس سائٹ سے آپ کا کنکشن پوری طرح سے محفوظ نہیں ہے</translation> @@ -986,6 +989,7 @@ <translation id="4756388243121344051">&سرگزشت</translation> <translation id="4758311279753947758">رابطے کی معلومات شامل کریں</translation> <translation id="4761104368405085019">اپنا مائیکروفون استعمال کریں</translation> +<translation id="4761869838909035636">Chrome کا سیفٹی چیک چلائیں</translation> <translation id="4764776831041365478"><ph name="URL" /> پر موجود ویب صفحہ عارضی طور پر سست ہو سکتا ہے یا اسے مستقل طور پر ایک نئے ویب پتے پر منتقل کیا گیا ہو سکتا ہے۔</translation> <translation id="4766713847338118463">نیچے دُہری سٹیپل</translation> <translation id="4768815695067202997"><ph name="BEGIN_BOLD" />
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb index 1078678..2799297d 100644 --- a/components/strings/components_strings_vi.xtb +++ b/components/strings/components_strings_vi.xtb
@@ -540,6 +540,7 @@ <translation id="3037605927509011580">Ôi, hỏng! </translation> <translation id="3041612393474885105">Thông tin Chứng chỉ</translation> <translation id="3060227939791841287">C9 (Phong bì)</translation> +<translation id="3060557858482803256"><ph name="RUN_CHROME_SAFETY_CHECK_FOCUSED_FRIENDLY_MATCH_TEXT" />, nhấn phím Tab rồi nhấn Enter để chạy quy trình Kiểm tra an toàn trong phần cài đặt của Chrome</translation> <translation id="3061707000357573562">Dịch vụ vá lỗi</translation> <translation id="3064966200440839136">Rời khỏi chế độ ẩn danh để thanh toán qua một ứng dụng bên ngoài. Tiếp tục?</translation> <translation id="3080254622891793721">Đồ họa</translation> @@ -777,6 +778,7 @@ <translation id="3964661563329879394">{COUNT,plural, =0{Không có}=1{Của 1 trang web }other{Của # trang web }}</translation> <translation id="397105322502079400">Đang tính...</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> bị chặn</translation> +<translation id="3973357910713125165">Nút Chạy quy trình Kiểm tra an toàn trên Chrome, nhấn Enter để chạy quy trình Kiểm tra an toàn trong phần cài đặt của Chrome</translation> <translation id="3987405730340719549">Chrome đã xác định được rằng đây có thể là trang web giả mạo hoặc lừa đảo. Nếu bạn cho rằng thông báo này hiển thị do lỗi, vui lòng truy cập vào https://bugs.chromium.org/p/chromium/issues/entry?template=Safety+Tips+Appeals.</translation> @@ -858,6 +860,7 @@ <h4>Bước 5: Yêu cầu trợ giúp thêm</h4> <p>Nếu bạn vẫn gặp lỗi này, hãy liên hệ với chủ sở hữu trang web.</p></translation> <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Thử chạy Chẩn đoán mạng<ph name="END_LINK" />.</translation> +<translation id="4229544452621580519">Chạy quy trình Kiểm tra an toàn trong phần cài đặt của Chrome</translation> <translation id="4234495348042597185"><ph name="BEGIN_LINK" />Tiếp tục truy cập vào <ph name="SITE" /><ph name="END_LINK" /></translation> <translation id="4235360514405112390">Hợp lệ</translation> <translation id="4250431568374086873">Kết nối của bạn tới trang web này không đủ an toàn</translation> @@ -983,6 +986,7 @@ <translation id="4756388243121344051">&Lịch sử</translation> <translation id="4758311279753947758">Thêm thông tin liên hệ</translation> <translation id="4761104368405085019">Sử dụng micrô của bạn</translation> +<translation id="4761869838909035636">Chạy quy trình Kiểm tra an toàn trên Chrome</translation> <translation id="4764776831041365478">Trang web tại <ph name="URL" /> có thể tạm thời không hoạt động hay được chuyển vĩnh viễn sang địa chỉ web mới.</translation> <translation id="4766713847338118463">Dập 2 ghim dưới cùng</translation> <translation id="4768815695067202997"><ph name="BEGIN_BOLD" />
diff --git a/components/strings/components_strings_zh-HK.xtb b/components/strings/components_strings_zh-HK.xtb index 517d598c..a06837f 100644 --- a/components/strings/components_strings_zh-HK.xtb +++ b/components/strings/components_strings_zh-HK.xtb
@@ -534,6 +534,7 @@ <translation id="3037605927509011580">糟糕!</translation> <translation id="3041612393474885105">憑證資料</translation> <translation id="3060227939791841287">C9 (信封)</translation> +<translation id="3060557858482803256"><ph name="RUN_CHROME_SAFETY_CHECK_FOCUSED_FRIENDLY_MATCH_TEXT" />,㩒一下 Tab 鍵,然後㩒一下 Enter 鍵就可以喺 Chrome 設定度執行安全檢查</translation> <translation id="3061707000357573562">修補服務</translation> <translation id="3064966200440839136">即將退出無痕模式,改用外部應用程式付款,要繼續嗎?</translation> <translation id="3080254622891793721">圖片</translation> @@ -770,6 +771,7 @@ <translation id="3964661563329879394">{COUNT,plural, =0{無}=1{來自 1 個網站}other{來自 # 個網站}}</translation> <translation id="397105322502079400">計算中…</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> 已遭封鎖</translation> +<translation id="3973357910713125165">執行 Chrome 安全檢查按鈕,㩒一下 Enter 鍵就可以喺 Chrome 設定度執行安全檢查</translation> <translation id="3987405730340719549">Chrome 判斷這可能是偽造或詐騙網站。 如果您認為系統不應顯示此訊息,請前往 https://bugs.chromium.org/p/chromium/issues/entry?template=Safety+Tips+Appeals。</translation> @@ -846,6 +848,7 @@ <h4>步驟 5:尋求更多協助</h4> <p>如果您仍然看到錯誤訊息,請聯絡網站擁有者。</p></translation> <translation id="4226937834893929579"><ph name="BEGIN_LINK" />嘗試執行網絡診斷<ph name="END_LINK" />。</translation> +<translation id="4229544452621580519">在 Chrome 設定中執行安全檢查</translation> <translation id="4234495348042597185"><ph name="BEGIN_LINK" />繼續前往 <ph name="SITE" /><ph name="END_LINK" /></translation> <translation id="4235360514405112390">有效</translation> <translation id="4250431568374086873">您與此網站的連線並非完全安全</translation> @@ -971,6 +974,7 @@ <translation id="4756388243121344051">記錄(&H)</translation> <translation id="4758311279753947758">新增聯絡人資訊</translation> <translation id="4761104368405085019">使用您的麥克風</translation> +<translation id="4761869838909035636">執行 Chrome 安全檢查</translation> <translation id="4764776831041365478"><ph name="URL" /> 的網頁可能暫時無法使用或被永久移至新網址。</translation> <translation id="4766713847338118463">雙釘 (底部)</translation> <translation id="4768815695067202997"><ph name="BEGIN_BOLD" />
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb index 9257b76d..a4cc790 100644 --- a/components/strings/components_strings_zh-TW.xtb +++ b/components/strings/components_strings_zh-TW.xtb
@@ -534,6 +534,7 @@ <translation id="3037605927509011580">糟糕!</translation> <translation id="3041612393474885105">憑證資訊</translation> <translation id="3060227939791841287">C9 (信封)</translation> +<translation id="3060557858482803256"><ph name="RUN_CHROME_SAFETY_CHECK_FOCUSED_FRIENDLY_MATCH_TEXT" />,依序按下 Tab 鍵和 Enter 鍵即可在 Chrome 設定中執行安全檢查</translation> <translation id="3061707000357573562">修補服務</translation> <translation id="3064966200440839136">即將離開無痕模式,改為使用外部應用程式付款,要繼續嗎?</translation> <translation id="3080254622891793721">圖片</translation> @@ -771,6 +772,7 @@ <translation id="3964661563329879394">{COUNT,plural, =0{無}=1{來自 1 個網站 }other{來自 # 個網站 }}</translation> <translation id="397105322502079400">計算中…</translation> <translation id="3973234410852337861"><ph name="HOST_NAME" /> 遭到封鎖</translation> +<translation id="3973357910713125165">Chrome 安全檢查的執行按鈕,按下 Enter 鍵即可在 Chrome 設定中執行安全檢查</translation> <translation id="3987405730340719549">Chrome 判斷這可能是偽造網站或詐騙網站。 如果你認為系統不應顯示這則訊息,請前往 https://bugs.chromium.org/p/chromium/issues/entry?template=Safety+Tips+Appeals。</translation> @@ -847,6 +849,7 @@ <h4>步驟 5:尋求更多協助</h4> <p>如果您仍看見錯誤訊息,請與網站擁有者聯絡。</p></translation> <translation id="4226937834893929579"><ph name="BEGIN_LINK" />嘗試執行網路診斷<ph name="END_LINK" />。</translation> +<translation id="4229544452621580519">在 Chrome 設定中執行安全檢查</translation> <translation id="4234495348042597185"><ph name="BEGIN_LINK" />繼續前往 <ph name="SITE" /><ph name="END_LINK" /></translation> <translation id="4235360514405112390">有效</translation> <translation id="4250431568374086873">你與這個網站的連線可能有安全漏洞</translation> @@ -972,6 +975,7 @@ <translation id="4756388243121344051">記錄(&H)</translation> <translation id="4758311279753947758">新增聯絡資訊</translation> <translation id="4761104368405085019">使用你的麥克風</translation> +<translation id="4761869838909035636">執行 Chrome 安全檢查</translation> <translation id="4764776831041365478"><ph name="URL" /> 的網頁可能暫時離線,或是已經遷移到另一個網址。</translation> <translation id="4766713847338118463">雙釘 (底部)</translation> <translation id="4768815695067202997"><ph name="BEGIN_BOLD" />
diff --git a/components/viz/service/BUILD.gn b/components/viz/service/BUILD.gn index 8985715..248021a 100644 --- a/components/viz/service/BUILD.gn +++ b/components/viz/service/BUILD.gn
@@ -232,6 +232,7 @@ "//skia:skcms", "//third_party/libyuv", "//ui/display/types", + "//ui/gfx/animation/keyframe", ] public_deps = [
diff --git a/components/viz/service/frame_sinks/compositor_frame_sink_support.cc b/components/viz/service/frame_sinks/compositor_frame_sink_support.cc index 808ea63c..c2a02f2d 100644 --- a/components/viz/service/frame_sinks/compositor_frame_sink_support.cc +++ b/components/viz/service/frame_sinks/compositor_frame_sink_support.cc
@@ -158,15 +158,9 @@ const auto& transition_directives = surface->GetActiveFrameMetadata().transition_directives; if (document_transitions_enabled_ && !transition_directives.empty()) { - // TODO(vmpstr): Figure out if `last_frame_time_` is correct here. - // SurfaceAcitvation may have happened some time after we sent the last - // BeginFrame to the client (which is when the frame time is updated). We - // may need to keep track of a separate time that updates when OnBeginFrame - // happens whether or not it is sent to the client. bool started_animation = surface_animation_manager_.ProcessTransitionDirectives( - last_frame_time_, transition_directives, - surface->GetSurfaceSavedFrameStorage()); + transition_directives, surface->GetSurfaceSavedFrameStorage()); // If processing the new directives caused us to start an animation, then // interpoate the frame immediately. This is needed since if we wait until // the next BeginFrame to do the first interpolation, then we maybe have
diff --git a/components/viz/service/surfaces/surface_saved_frame.cc b/components/viz/service/surfaces/surface_saved_frame.cc index 066513a..54fb8d08 100644 --- a/components/viz/service/surfaces/surface_saved_frame.cc +++ b/components/viz/service/surfaces/surface_saved_frame.cc
@@ -13,6 +13,10 @@ namespace viz { +namespace { +constexpr gfx::Size kDefaultTextureSizeForTesting = gfx::Size(20, 20); +} // namespace + SurfaceSavedFrame::SurfaceSavedFrame( CompositorFrameTransitionDirective directive, TransitionDirectiveCompleteCallback directive_finished_callback) @@ -82,6 +86,7 @@ texture_result_.mailbox = gpu::Mailbox::GenerateForSharedImage(); texture_result_.release_callback = SingleReleaseCallback::Create(std::move(release_callback)); + texture_result_.size = kDefaultTextureSizeForTesting; DCHECK(IsValid()); }
diff --git a/components/viz/service/transitions/surface_animation_manager.cc b/components/viz/service/transitions/surface_animation_manager.cc index 43ad4669..40f7c5e 100644 --- a/components/viz/service/transitions/surface_animation_manager.cc +++ b/components/viz/service/transitions/surface_animation_manager.cc
@@ -4,6 +4,7 @@ #include "components/viz/service/transitions/surface_animation_manager.h" +#include <algorithm> #include <utility> #include <vector> @@ -15,6 +16,8 @@ #include "components/viz/common/resources/transferable_resource.h" #include "components/viz/service/surfaces/surface.h" #include "components/viz/service/surfaces/surface_saved_frame_storage.h" +#include "ui/gfx/animation/keyframe/keyframed_animation_curve.h" +#include "ui/gfx/animation/keyframe/timing_function.h" namespace viz { namespace { @@ -23,11 +26,64 @@ return CompositorRenderPassId(id.GetUnsafeValue() + 1); } -// TODO(vmpstr): This is here to make sure that we can compute the progress by -// dividing by duration. However, when we use the animation curves that don't -// rely on progress, this can be removed. constexpr base::TimeDelta kMinimumAnimationDuration = - base::TimeDelta::FromMilliseconds(1); + base::TimeDelta::FromMilliseconds(50); + +// TODO(vmpstr): if we decide upon hard-coded animation durations per +// (https://github.com/vmpstr/shared-element-transitions/issues/9), 500ms for +// transform transitions and 400ms for opacity transitions (staggered) produces +// appealing results. For the time being, we will scale the overall duration to +// produce the opacity duration. Opacity transitions which reveal an element +// (i.e., transition opacity from 0 -> 1) should finish ahead of a translation. +// This way, you'll see the next page fade into view and settle +// while fully opaque. Similarly, transitions which hide an element (i.e., +// transition opacity from 1 -> 0) should, for a brief period, animate with +// full opacity so the user can get a sense of the +// motion before the element disappears. +constexpr float kOpacityTransitionDurationScaleFactor = 0.8f; + +// When performing slides, the amount moved is proportional to the minimum +// viewport dimension -- this controls that proportion. +constexpr float kTranslationProportion = 0.05f; + +// When performing implosions or explosions layers grow or shrink. This value +// determines the scaling done to achieve the larger of the two sizes. +constexpr float kScaleProportion = 1.1f; + +void CreateAndAppendSrcTextureQuad(CompositorRenderPass* render_pass, + const gfx::Rect& output_rect, + const gfx::Transform& src_transform, + float src_opacity, + ResourceId id) { + auto* src_quad_state = render_pass->CreateAndAppendSharedQuadState(); + src_quad_state->SetAll( + /*quad_to_target_transform=*/src_transform, + /*quad_layer_rect=*/output_rect, + /*visible_layer_rect=*/output_rect, + /*mask_filter_info=*/gfx::MaskFilterInfo(), + /*clip_rect=*/gfx::Rect(), + /*is_clipped=*/false, /*are_contents_opaque=*/false, + /*opacity=*/src_opacity, + /*blend_mode=*/SkBlendMode::kSrcOver, /*sorting_context_id=*/0); + + auto* src_quad = render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); + float vertex_opacity[] = {1.f, 1.f, 1.f, 1.f}; + src_quad->SetNew( + /*shared_quad_state=*/src_quad_state, + /*rect=*/output_rect, + /*visible_rect=*/output_rect, + /*needs_blending=*/true, + /*resource_id=*/id, + /*premultiplied_alpha=*/true, + /*uv_top_left=*/gfx::PointF(0, 0), + /*uv_bottom_right=*/gfx::PointF(1, 1), + /*background_color=*/SK_ColorWHITE, + /*vertex_opacity=*/vertex_opacity, + /*y_flipped=*/true, + /*nearest_neighbor=*/true, + /*secure_output_only=*/false, + /*protected_video_type=*/gfx::ProtectedVideoType::kClear); +} } // namespace @@ -41,11 +97,8 @@ } bool SurfaceAnimationManager::ProcessTransitionDirectives( - base::TimeTicks last_frame_time, const std::vector<CompositorFrameTransitionDirective>& directives, SurfaceSavedFrameStorage* storage) { - DCHECK_GE(last_frame_time, current_time_); - current_time_ = last_frame_time; bool started_animation = false; for (auto& directive : directives) { // Don't process directives with sequence ids smaller than or equal to the @@ -108,20 +161,20 @@ saved_root_texture_.emplace( transferable_resource_tracker_.ImportResource(std::move(saved_frame))); + UpdateAnimationCurves(saved_root_texture_->size); state_ = State::kAnimating; - started_time_ = current_time_; return true; } bool SurfaceAnimationManager::NeedsBeginFrame() const { // If we're animating we need to keep pumping frames to advance the animation. // If we're done, we require one more frame to switch back to idle state. - return state_ == State::kAnimating || state_ == State::kLastFrame; + return animator_.IsAnimating() || state_ == State::kLastFrame; } void SurfaceAnimationManager::NotifyFrameAdvanced(base::TimeTicks new_time) { - DCHECK_GE(new_time, current_time_); - current_time_ = new_time; + animator_.Tick(new_time); + switch (state_) { case State::kIdle: NOTREACHED() << "We should not advance frames when idle"; @@ -140,7 +193,7 @@ DCHECK(saved_root_texture_.has_value()); DCHECK(save_directive_.has_value()); DCHECK(animate_directive_sequence_id_.has_value()); - if (current_time_ >= started_time_ + save_directive_->duration()) { + if (!animator_.IsAnimating()) { state_ = State::kLastFrame; sequence_id_finished_callback_.Run(*animate_directive_sequence_id_); } @@ -158,24 +211,6 @@ save_directive_.reset(); animate_directive_sequence_id_.reset(); - - started_time_ = base::TimeTicks(); -} - -double SurfaceAnimationManager::CalculateAnimationProgress() const { - DCHECK(state_ == State::kAnimating || state_ == State::kLastFrame); - if (state_ == State::kLastFrame) - return 1.; - - DCHECK(save_directive_); - base::TimeDelta duration = save_directive_->duration(); - if (duration < kMinimumAnimationDuration) - duration = kMinimumAnimationDuration; - - double result = (current_time_ - started_time_) / duration; - DCHECK_GE(result, 0.); - DCHECK_LE(result, 1.); - return result; } void SurfaceAnimationManager::InterpolateFrame(Surface* surface) { @@ -205,47 +240,39 @@ animation_pass->SetNew(NextRenderPassId(max_id), output_rect, output_rect, gfx::Transform()); - float src_opacity = 1 - CalculateAnimationProgress(); - auto* src_quad_state = animation_pass->CreateAndAppendSharedQuadState(); - src_quad_state->SetAll( - /*quad_to_target_transform=*/gfx::Transform(), - /*quad_layer_rect=*/output_rect, - /*visible_layer_rect=*/output_rect, - /*mask_filter_info=*/gfx::MaskFilterInfo(), - /*clip_rect=*/gfx::Rect(), - /*is_clipped=*/false, - /*are_contents_opaque=*/false, - /*opacity=*/src_opacity, - /*blend_mode=*/SkBlendMode::kSrcOver, /*sorting_context_id=*/0); + bool src_on_top = false; + switch (save_directive_->effect()) { + case CompositorFrameTransitionDirective::Effect::kRevealRight: + case CompositorFrameTransitionDirective::Effect::kRevealLeft: + case CompositorFrameTransitionDirective::Effect::kRevealUp: + case CompositorFrameTransitionDirective::Effect::kRevealDown: + case CompositorFrameTransitionDirective::Effect::kExplode: + case CompositorFrameTransitionDirective::Effect::kFade: + src_on_top = true; + break; + default: + break; + } - auto* src_quad = animation_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); - float vertex_opacity[] = {1.f, 1.f, 1.f, 1.f}; - src_quad->SetNew( - /*shared_quad_state=*/src_quad_state, - /*rect=*/output_rect, - /*visible_rect=*/output_rect, - /*needs_blending=*/true, - /*resource_id=*/saved_root_texture_->id, - /*premultiplied_alpha=*/true, - /*uv_top_left=*/gfx::PointF(0, 0), - /*uv_bottom_right=*/gfx::PointF(1, 1), - /*background_color=*/SK_ColorWHITE, - /*vertex_opacity=*/vertex_opacity, - /*y_flipped=*/true, - /*nearest_neighbor=*/true, - /*secure_output_only=*/false, - /*protected_video_type=*/gfx::ProtectedVideoType::kClear); + gfx::Transform src_transform = src_transform_.Apply(); + gfx::Transform dst_transform = dst_transform_.Apply(); + + if (src_on_top) { + CreateAndAppendSrcTextureQuad(animation_pass.get(), output_rect, + src_transform, src_opacity_, + saved_root_texture_->id); + } auto* dst_quad_state = animation_pass->CreateAndAppendSharedQuadState(); dst_quad_state->SetAll( - /*quad_to_target_transform=*/gfx::Transform(), + /*quad_to_target_transform=*/dst_transform, /*quad_layer_rect=*/output_rect, /*visible_layer_rect=*/output_rect, /*mask_filter_info=*/gfx::MaskFilterInfo(), /*clip_rect=*/gfx::Rect(), /*is_clipped=*/false, /*are_contents_opaque=*/false, - /*opacity=*/1.f, + /*opacity=*/dst_opacity_, /*blend_mode=*/SkBlendMode::kSrcOver, /*sorting_context_id=*/0); auto* dst_quad = @@ -264,6 +291,12 @@ /*force_anti_aliasing_off=*/false, /*backdrop_filter_quality*/ 1.0f); + if (!src_on_top) { + CreateAndAppendSrcTextureQuad(animation_pass.get(), output_rect, + src_transform, src_opacity_, + saved_root_texture_->id); + } + interpolated_frame.render_pass_list.push_back(std::move(animation_pass)); surface->SetInterpolatedFrame(std::move(interpolated_frame)); } @@ -287,5 +320,195 @@ transferable_resource_tracker_.UnrefResource(resource.id); } } +void SurfaceAnimationManager::OnFloatAnimated( + const float& value, + int target_property_id, + gfx::KeyframeModel* keyframe_model) { + if (target_property_id == kDstOpacity) { + dst_opacity_ = value; + } else { + src_opacity_ = value; + } +} + +void SurfaceAnimationManager::OnTransformAnimated( + const gfx::TransformOperations& operations, + int target_property_id, + gfx::KeyframeModel* keyframe_model) { + if (target_property_id == kDstTransform) { + dst_transform_ = operations; + } else { + src_transform_ = operations; + } +} + +void SurfaceAnimationManager::UpdateAnimationCurves( + const gfx::Size& output_size) { + // A small translation. We want to roughly scale this with screen size, but + // we choose the minimum screen dimension to keep horizontal and vertical + // transitions consistent and to avoid the impact of very oblong screen. + const float delta = std::min(output_size.width(), output_size.height()) * + kTranslationProportion; + + gfx::TransformOperations start_transform; + gfx::TransformOperations end_transform; + int transform_property_id = kDstTransform; + + float start_opacity = 0.0f; + float end_opacity = 1.0f; + int opacity_property_id = kDstOpacity; + + DCHECK(save_directive_.has_value()); + + switch (save_directive_->effect()) { + case CompositorFrameTransitionDirective::Effect::kCoverLeft: { + start_transform.AppendTranslate(delta, 0.0f, 0.0f); + break; + } + case CompositorFrameTransitionDirective::Effect::kCoverRight: { + start_transform.AppendTranslate(-delta, 0.0f, 0.0f); + break; + } + case CompositorFrameTransitionDirective::Effect::kCoverUp: { + start_transform.AppendTranslate(0.0f, delta, 0.0f); + break; + } + case CompositorFrameTransitionDirective::Effect::kCoverDown: { + start_transform.AppendTranslate(0.0f, -delta, 0.0f); + break; + } + case CompositorFrameTransitionDirective::Effect::kRevealLeft: { + end_transform.AppendTranslate(-delta, 0.0f, 0.0f); + transform_property_id = kSrcTransform; + std::swap(start_opacity, end_opacity); + opacity_property_id = kSrcOpacity; + break; + } + case CompositorFrameTransitionDirective::Effect::kRevealRight: { + end_transform.AppendTranslate(delta, 0.0f, 0.0f); + transform_property_id = kSrcTransform; + std::swap(start_opacity, end_opacity); + opacity_property_id = kSrcOpacity; + break; + } + case CompositorFrameTransitionDirective::Effect::kRevealUp: { + end_transform.AppendTranslate(0.0f, -delta, 0.0f); + transform_property_id = kSrcTransform; + std::swap(start_opacity, end_opacity); + opacity_property_id = kSrcOpacity; + break; + } + case CompositorFrameTransitionDirective::Effect::kRevealDown: { + end_transform.AppendTranslate(0.0f, delta, 0.0f); + transform_property_id = kSrcTransform; + std::swap(start_opacity, end_opacity); + opacity_property_id = kSrcOpacity; + break; + } + case CompositorFrameTransitionDirective::Effect::kExplode: { + start_transform.AppendTranslate(output_size.width() * 0.5f, + output_size.height() * 0.5f, 0.0f); + start_transform.AppendScale(1.0f, 1.0f, 1.0f); + start_transform.AppendTranslate(-output_size.width() * 0.5f, + -output_size.height() * 0.5f, 0.0f); + + end_transform.AppendTranslate(output_size.width() * 0.5f, + output_size.height() * 0.5f, 0.0f); + end_transform.AppendScale(kScaleProportion, kScaleProportion, 1.0f); + end_transform.AppendTranslate(-output_size.width() * 0.5f, + -output_size.height() * 0.5f, 0.0f); + transform_property_id = kSrcTransform; + std::swap(start_opacity, end_opacity); + opacity_property_id = kSrcOpacity; + break; + } + case CompositorFrameTransitionDirective::Effect::kFade: { + // Fade is effectively an explode with no scaling. + transform_property_id = kSrcTransform; + std::swap(start_opacity, end_opacity); + opacity_property_id = kSrcOpacity; + break; + } + case CompositorFrameTransitionDirective::Effect::kNone: { + transform_property_id = kSrcTransform; + start_opacity = end_opacity = 0.0f; + opacity_property_id = kSrcOpacity; + break; + } + case CompositorFrameTransitionDirective::Effect::kImplode: { + start_transform.AppendTranslate(output_size.width() * 0.5f, + output_size.height() * 0.5f, 0.0f); + start_transform.AppendScale(kScaleProportion, kScaleProportion, 1.0f); + start_transform.AppendTranslate(-output_size.width() * 0.5f, + -output_size.height() * 0.5f, 0.0f); + + end_transform.AppendTranslate(output_size.width() * 0.5f, + output_size.height() * 0.5f, 0.0f); + end_transform.AppendScale(1.0f, 1.0f, 1.0f); + end_transform.AppendTranslate(-output_size.width() * 0.5f, + -output_size.height() * 0.5f, 0.0f); + break; + } + } + + // Ensure we have no conflicting animation. + animator_.RemoveAllKeyframeModels(); + + // We will use the "ease" timing function (used by CSS transitions). + std::unique_ptr<gfx::CubicBezierTimingFunction> timing_function = + gfx::CubicBezierTimingFunction::CreatePreset( + gfx::CubicBezierTimingFunction::EaseType::EASE); + + // Create the transform curve. + base::TimeDelta transform_duration = + std::max(save_directive_->duration(), kMinimumAnimationDuration); + + std::unique_ptr<gfx::KeyframedTransformAnimationCurve> transform_curve( + gfx::KeyframedTransformAnimationCurve::Create()); + transform_curve->AddKeyframe(gfx::TransformKeyframe::Create( + base::TimeDelta(), start_transform, timing_function->Clone())); + transform_curve->AddKeyframe(gfx::TransformKeyframe::Create( + transform_duration, end_transform, timing_function->Clone())); + transform_curve->set_target(this); + animator_.AddKeyframeModel(gfx::KeyframeModel::Create( + std::move(transform_curve), gfx::KeyframeEffect::GetNextKeyframeModelId(), + transform_property_id)); + + // Create the opacity curve. Somewhat more complicated because it may be + // delayed wrt to the transform curve. See description of + // |kOpacityTransitionDurationScaleFactor| above. + base::TimeDelta opacity_duration = + transform_duration * kOpacityTransitionDurationScaleFactor; + base::TimeDelta opacity_delay = start_opacity == 0.0f + ? base::TimeDelta() + : transform_duration - opacity_duration; + + std::unique_ptr<gfx::KeyframedFloatAnimationCurve> float_curve( + gfx::KeyframedFloatAnimationCurve::Create()); + if (!opacity_delay.is_zero()) { + float_curve->AddKeyframe(gfx::FloatKeyframe::Create( + base::TimeDelta(), start_opacity, timing_function->Clone())); + } + float_curve->AddKeyframe(gfx::FloatKeyframe::Create( + opacity_delay, start_opacity, timing_function->Clone())); + float_curve->AddKeyframe(gfx::FloatKeyframe::Create( + opacity_duration, end_opacity, timing_function->Clone())); + float_curve->set_target(this); + animator_.AddKeyframeModel(gfx::KeyframeModel::Create( + std::move(float_curve), gfx::KeyframeEffect::GetNextKeyframeModelId(), + opacity_property_id)); + + // We should now have animations queued up. + DCHECK(animator_.IsAnimating()); + + // To ensure we don't flicker at the beginning of the animation, ensure that + // our initial state is correct before we start ticking. + src_opacity_ = 1.0f; + dst_opacity_ = 1.0f; + src_transform_ = gfx::TransformOperations(); + dst_transform_ = gfx::TransformOperations(); + OnTransformAnimated(start_transform, transform_property_id, nullptr); + OnFloatAnimated(start_opacity, opacity_property_id, nullptr); +} } // namespace viz
diff --git a/components/viz/service/transitions/surface_animation_manager.h b/components/viz/service/transitions/surface_animation_manager.h index bfd641a..22c582a3 100644 --- a/components/viz/service/transitions/surface_animation_manager.h +++ b/components/viz/service/transitions/surface_animation_manager.h
@@ -15,6 +15,8 @@ #include "components/viz/service/surfaces/surface_saved_frame.h" #include "components/viz/service/transitions/transferable_resource_tracker.h" #include "components/viz/service/viz_service_export.h" +#include "ui/gfx/animation/keyframe/animation_curve.h" +#include "ui/gfx/animation/keyframe/keyframe_effect.h" namespace viz { @@ -28,10 +30,12 @@ // TODO(vmpstr): This class should also be responsible for interpolating frames // and providing the result back to the surface, but that is currently not // implemented. -class VIZ_SERVICE_EXPORT SurfaceAnimationManager { +class VIZ_SERVICE_EXPORT SurfaceAnimationManager + : public gfx::FloatAnimationCurve::Target, + public gfx::TransformAnimationCurve::Target { public: SurfaceAnimationManager(); - ~SurfaceAnimationManager(); + ~SurfaceAnimationManager() override; void SetDirectiveFinishedCallback( SurfaceSavedFrame::TransitionDirectiveCompleteCallback @@ -46,7 +50,6 @@ // that we need to interpolate the current active frame, even if we would // normally not do so in the middle of the animation. bool ProcessTransitionDirectives( - base::TimeTicks last_frame_time, const std::vector<CompositorFrameTransitionDirective>& directives, SurfaceSavedFrameStorage* storage); @@ -65,7 +68,30 @@ void RefResources(const std::vector<TransferableResource>& resources); void UnrefResources(const std::vector<ReturnedResource>& resources); + void OnFloatAnimated(const float& value, + int target_property_id, + gfx::KeyframeModel* keyframe_model) override; + + void OnTransformAnimated(const gfx::TransformOperations& operations, + int target_property_id, + gfx::KeyframeModel* keyframe_model) override; + + protected: + float src_opacity() const { return src_opacity_; } + float dst_opacity() const { return dst_opacity_; } + gfx::TransformOperations src_transform() const { return src_transform_; } + gfx::TransformOperations dst_transform() const { return dst_transform_; } + private: + enum TargetProperty : int { + kSrcOpacity = 1, + kDstOpacity, + kSrcTransform, + kDstTransform, + }; + + void UpdateAnimationCurves(const gfx::Size& output_size); + // Helpers to process specific directives. bool ProcessSaveDirective(const CompositorFrameTransitionDirective& directive, SurfaceSavedFrameStorage* storage); @@ -82,10 +108,6 @@ // valid if state is kLastFrame. void FinalizeAndDisposeOfState(); - // Returns a value between 0 and 1 representing the current progress of the - // animation. This call is only valid if state is kAnimating or kLastFrame. - double CalculateAnimationProgress() const; - enum class State { kIdle, kAnimating, kLastFrame }; SurfaceSavedFrame::TransitionDirectiveCompleteCallback @@ -93,16 +115,21 @@ uint32_t last_processed_sequence_id_ = 0; - State state_ = State::kIdle; - - base::TimeTicks started_time_; - base::TimeTicks current_time_; - TransferableResourceTracker transferable_resource_tracker_; base::Optional<TransferableResource> saved_root_texture_; base::Optional<CompositorFrameTransitionDirective> save_directive_; base::Optional<uint32_t> animate_directive_sequence_id_; + + // TODO(vmpstr): if SurfaceAnimationManager ultimately manages multiple + // animations, then the following should be encapsulated in a per-animation + // class. + State state_ = State::kIdle; + gfx::KeyframeEffect animator_; + float src_opacity_ = 1.0f; + float dst_opacity_ = 1.0f; + gfx::TransformOperations src_transform_; + gfx::TransformOperations dst_transform_; }; } // namespace viz
diff --git a/components/viz/service/transitions/surface_animation_manager_unittest.cc b/components/viz/service/transitions/surface_animation_manager_unittest.cc index 441efd7..88d7234 100644 --- a/components/viz/service/transitions/surface_animation_manager_unittest.cc +++ b/components/viz/service/transitions/surface_animation_manager_unittest.cc
@@ -24,11 +24,13 @@ std::vector<CompositorFrameTransitionDirective> CreateSaveDirectiveAsVector( uint32_t sequence_id, - base::TimeDelta duration = base::TimeDelta::FromMilliseconds(100)) { + base::TimeDelta duration = base::TimeDelta::FromMilliseconds(100), + CompositorFrameTransitionDirective::Effect effect = + CompositorFrameTransitionDirective::Effect::kCoverDown) { std::vector<CompositorFrameTransitionDirective> result; - result.emplace_back( - sequence_id, CompositorFrameTransitionDirective::Type::kSave, - CompositorFrameTransitionDirective::Effect::kCoverDown, duration); + result.emplace_back(sequence_id, + CompositorFrameTransitionDirective::Type::kSave, effect, + duration); return result; } @@ -42,6 +44,103 @@ } // namespace +class TestSurfaceAnimationManager : public SurfaceAnimationManager { + public: + TestSurfaceAnimationManager() = default; + ~TestSurfaceAnimationManager() override = default; + + void ValidateStartState(CompositorFrameTransitionDirective::Effect effect) { + switch (effect) { + case CompositorFrameTransitionDirective::Effect::kRevealRight: + case CompositorFrameTransitionDirective::Effect::kRevealLeft: + case CompositorFrameTransitionDirective::Effect::kRevealUp: + case CompositorFrameTransitionDirective::Effect::kRevealDown: + case CompositorFrameTransitionDirective::Effect::kExplode: + case CompositorFrameTransitionDirective::Effect::kFade: + EXPECT_EQ(src_opacity(), 1.0f) << static_cast<int>(effect); + break; + case CompositorFrameTransitionDirective::Effect::kNone: + EXPECT_EQ(src_opacity(), 0.0f) << static_cast<int>(effect); + break; + default: + EXPECT_EQ(dst_opacity(), 0.0f) << static_cast<int>(effect); + break; + } + + switch (effect) { + case CompositorFrameTransitionDirective::Effect::kNone: + case CompositorFrameTransitionDirective::Effect::kFade: + case CompositorFrameTransitionDirective::Effect::kExplode: + case CompositorFrameTransitionDirective::Effect::kRevealDown: + case CompositorFrameTransitionDirective::Effect::kRevealLeft: + case CompositorFrameTransitionDirective::Effect::kRevealRight: + case CompositorFrameTransitionDirective::Effect::kRevealUp: + EXPECT_TRUE(src_transform().Apply().IsIdentity()) + << static_cast<int>(effect); + EXPECT_TRUE(dst_transform().Apply().IsIdentity()) + << static_cast<int>(effect); + break; + case CompositorFrameTransitionDirective::Effect::kCoverDown: + case CompositorFrameTransitionDirective::Effect::kCoverLeft: + case CompositorFrameTransitionDirective::Effect::kCoverRight: + case CompositorFrameTransitionDirective::Effect::kCoverUp: + EXPECT_TRUE(src_transform().Apply().IsIdentity()) + << static_cast<int>(effect); + EXPECT_FALSE(dst_transform().Apply().IsIdentity()) + << static_cast<int>(effect); + EXPECT_TRUE(dst_transform().Apply().IsIdentityOr2DTranslation()); + break; + case CompositorFrameTransitionDirective::Effect::kImplode: + EXPECT_TRUE(src_transform().Apply().IsIdentity()) + << static_cast<int>(effect); + EXPECT_FALSE(dst_transform().Apply().IsIdentity()) + << static_cast<int>(effect); + EXPECT_TRUE(dst_transform().Apply().IsScaleOrTranslation()) + << static_cast<int>(effect); + break; + default: + break; + } + } + void ValidateEndState(CompositorFrameTransitionDirective::Effect effect) { + EXPECT_EQ(dst_opacity(), 1.0f); + EXPECT_TRUE(dst_transform().Apply().IsIdentity()); + + switch (effect) { + case CompositorFrameTransitionDirective::Effect::kRevealRight: + case CompositorFrameTransitionDirective::Effect::kRevealLeft: + case CompositorFrameTransitionDirective::Effect::kRevealUp: + case CompositorFrameTransitionDirective::Effect::kRevealDown: + case CompositorFrameTransitionDirective::Effect::kExplode: + case CompositorFrameTransitionDirective::Effect::kFade: + EXPECT_EQ(src_opacity(), 0.0f) << static_cast<int>(effect); + break; + default: + break; + } + + switch (effect) { + case CompositorFrameTransitionDirective::Effect::kRevealDown: + case CompositorFrameTransitionDirective::Effect::kRevealLeft: + case CompositorFrameTransitionDirective::Effect::kRevealRight: + case CompositorFrameTransitionDirective::Effect::kRevealUp: + EXPECT_FALSE(src_transform().Apply().IsIdentity()) + << static_cast<int>(effect); + EXPECT_TRUE(src_transform().Apply().IsIdentityOr2DTranslation()) + << static_cast<int>(effect); + break; + case CompositorFrameTransitionDirective::Effect::kExplode: + EXPECT_FALSE(src_transform().Apply().IsIdentity()) + << static_cast<int>(effect); + EXPECT_TRUE(src_transform().Apply().IsScaleOrTranslation()) + << static_cast<int>(effect); + break; + default: + break; + } + } +}; + class SurfaceAnimationManagerTest : public testing::Test { public: void SetUp() override { @@ -90,27 +189,30 @@ }; TEST_F(SurfaceAnimationManagerTest, DefaultState) { - SurfaceAnimationManager manager; + TestSurfaceAnimationManager manager; manager.SetDirectiveFinishedCallback(base::DoNothing()); EXPECT_FALSE(manager.NeedsBeginFrame()); - manager.ProcessTransitionDirectives(current_time(), {}, storage()); + manager.ProcessTransitionDirectives({}, storage()); EXPECT_FALSE(manager.NeedsBeginFrame()); } TEST_F(SurfaceAnimationManagerTest, SaveAnimateNeedsBeginFrame) { - SurfaceAnimationManager manager; + TestSurfaceAnimationManager manager; manager.SetDirectiveFinishedCallback(base::DoNothing()); EXPECT_FALSE(manager.NeedsBeginFrame()); - manager.ProcessTransitionDirectives( - current_time(), CreateSaveDirectiveAsVector(1), storage()); + manager.ProcessTransitionDirectives(CreateSaveDirectiveAsVector(1), + storage()); storage()->CompleteForTesting(); - manager.ProcessTransitionDirectives( - current_time(), CreateAnimateDirectiveAsVector(2), storage()); + manager.ProcessTransitionDirectives(CreateAnimateDirectiveAsVector(2), + storage()); + + // Tick curves to set start time. + manager.NotifyFrameAdvanced(AdvanceTime(base::TimeDelta())); EXPECT_TRUE(manager.NeedsBeginFrame()); @@ -129,41 +231,41 @@ } TEST_F(SurfaceAnimationManagerTest, AnimateWithoutSaveIsNoop) { - SurfaceAnimationManager manager; + TestSurfaceAnimationManager manager; manager.SetDirectiveFinishedCallback(base::DoNothing()); EXPECT_FALSE(manager.NeedsBeginFrame()); - manager.ProcessTransitionDirectives( - current_time(), CreateAnimateDirectiveAsVector(1), storage()); + manager.ProcessTransitionDirectives(CreateAnimateDirectiveAsVector(1), + storage()); EXPECT_FALSE(manager.NeedsBeginFrame()); } TEST_F(SurfaceAnimationManagerTest, SaveTimesOut) { - SurfaceAnimationManager manager; + TestSurfaceAnimationManager manager; manager.SetDirectiveFinishedCallback(base::DoNothing()); EXPECT_FALSE(manager.NeedsBeginFrame()); - manager.ProcessTransitionDirectives( - current_time(), CreateSaveDirectiveAsVector(1), storage()); + manager.ProcessTransitionDirectives(CreateSaveDirectiveAsVector(1), + storage()); EXPECT_FALSE(manager.NeedsBeginFrame()); storage()->ExpireForTesting(); - manager.ProcessTransitionDirectives( - AdvanceTime(base::TimeDelta::FromSeconds(6)), - CreateAnimateDirectiveAsVector(2), storage()); + AdvanceTime(base::TimeDelta::FromSeconds(6)); + manager.ProcessTransitionDirectives(CreateAnimateDirectiveAsVector(2), + storage()); EXPECT_FALSE(manager.NeedsBeginFrame()); } TEST_F(SurfaceAnimationManagerTest, RepeatedSavesAreOk) { - SurfaceAnimationManager manager; + TestSurfaceAnimationManager manager; manager.SetDirectiveFinishedCallback(base::DoNothing()); EXPECT_FALSE(manager.NeedsBeginFrame()); uint32_t sequence_id = 1; for (int i = 0; i < 200; ++i) { manager.ProcessTransitionDirectives( - current_time(), CreateSaveDirectiveAsVector(sequence_id), storage()); + CreateSaveDirectiveAsVector(sequence_id), storage()); EXPECT_FALSE(manager.NeedsBeginFrame()); @@ -174,7 +276,11 @@ storage()->CompleteForTesting(); manager.ProcessTransitionDirectives( - current_time(), CreateAnimateDirectiveAsVector(sequence_id), storage()); + CreateAnimateDirectiveAsVector(sequence_id), storage()); + + // Tick curves to set start time. + manager.NotifyFrameAdvanced(AdvanceTime(base::TimeDelta())); + EXPECT_TRUE(manager.NeedsBeginFrame()); manager.NotifyFrameAdvanced( @@ -188,4 +294,88 @@ EXPECT_FALSE(manager.NeedsBeginFrame()); } +TEST_F(SurfaceAnimationManagerTest, CheckStartEndStates) { + TestSurfaceAnimationManager manager; + manager.SetDirectiveFinishedCallback(base::DoNothing()); + EXPECT_FALSE(manager.NeedsBeginFrame()); + + CompositorFrameTransitionDirective::Effect effects[] = { + CompositorFrameTransitionDirective::Effect::kNone, + CompositorFrameTransitionDirective::Effect::kCoverDown, + CompositorFrameTransitionDirective::Effect::kCoverLeft, + CompositorFrameTransitionDirective::Effect::kCoverRight, + CompositorFrameTransitionDirective::Effect::kCoverUp, + CompositorFrameTransitionDirective::Effect::kExplode, + CompositorFrameTransitionDirective::Effect::kFade, + CompositorFrameTransitionDirective::Effect::kImplode, + CompositorFrameTransitionDirective::Effect::kRevealDown, + CompositorFrameTransitionDirective::Effect::kRevealLeft, + CompositorFrameTransitionDirective::Effect::kRevealRight, + CompositorFrameTransitionDirective::Effect::kRevealUp}; + + uint32_t sequence_id = 1; + for (auto effect : effects) { + manager.ProcessTransitionDirectives( + CreateSaveDirectiveAsVector( + sequence_id++, base::TimeDelta::FromMilliseconds(500), effect), + storage()); + + storage()->CompleteForTesting(); + + manager.ProcessTransitionDirectives( + CreateAnimateDirectiveAsVector(sequence_id++), storage()); + + // Tick curves to set start time. + manager.NotifyFrameAdvanced(AdvanceTime(base::TimeDelta())); + + manager.ValidateStartState(effect); + + EXPECT_TRUE(manager.NeedsBeginFrame()); + + manager.NotifyFrameAdvanced( + AdvanceTime(base::TimeDelta::FromMilliseconds(250))); + EXPECT_TRUE(manager.NeedsBeginFrame()); + + manager.NotifyFrameAdvanced( + AdvanceTime(base::TimeDelta::FromMilliseconds(250))); + // We should be at the done state, but still need a frame. + EXPECT_TRUE(manager.NeedsBeginFrame()); + + manager.NotifyFrameAdvanced( + AdvanceTime(base::TimeDelta::FromMilliseconds(1))); + EXPECT_FALSE(manager.NeedsBeginFrame()); + + manager.ValidateEndState(effect); + } +} + +TEST_F(SurfaceAnimationManagerTest, MinimumDuration) { + TestSurfaceAnimationManager manager; + manager.SetDirectiveFinishedCallback(base::DoNothing()); + EXPECT_FALSE(manager.NeedsBeginFrame()); + + // This animation is too short. + manager.ProcessTransitionDirectives( + CreateSaveDirectiveAsVector(1, base::TimeDelta::FromMilliseconds(1)), + storage()); + + storage()->CompleteForTesting(); + + manager.ProcessTransitionDirectives(CreateAnimateDirectiveAsVector(2), + storage()); + + // Tick curves to set start time. + manager.NotifyFrameAdvanced(AdvanceTime(base::TimeDelta())); + + EXPECT_TRUE(manager.NeedsBeginFrame()); + + manager.NotifyFrameAdvanced( + AdvanceTime(base::TimeDelta::FromMilliseconds(10))); + + // Despite ticking beyond the stated duration of the effect, 10ms is still + // way too fast for a transition; we expect to still be transitioning at + // this point. + EXPECT_TRUE(manager.NeedsBeginFrame()); +} + } // namespace viz
diff --git a/content/app/content_main_runner_impl.cc b/content/app/content_main_runner_impl.cc index c3b8292..e49304a9 100644 --- a/content/app/content_main_runner_impl.cc +++ b/content/app/content_main_runner_impl.cc
@@ -169,6 +169,7 @@ #if defined(OS_ANDROID) #include "base/system/sys_info.h" +#include "content/browser/android/battery_metrics.h" #include "content/browser/android/browser_startup_controller.h" #include "content/common/android/cpu_affinity.h" #endif @@ -1006,8 +1007,17 @@ tracing::InitTracingPostThreadPoolStartAndFeatureList(); + // PowerMonitor is needed in reduced mode. BrowserMainLoop will safely skip + // initializing it again if it has already been initialized. + base::PowerMonitor::Initialize( + std::make_unique<base::PowerMonitorDeviceSource>()); + #if defined(OS_ANDROID) SetupCpuTimeMetrics(); + + // Requires base::PowerMonitor to be initialized first. + AndroidBatteryMetrics::GetInstance(); + // For child processes, this requires allowing of the // sched_setaffinity() syscall in the sandbox (baseline_policy_android.cc). // When this call is removed, the sandbox allowlist should be updated too. @@ -1020,11 +1030,6 @@ discardable_shared_memory_manager_ = std::make_unique<discardable_memory::DiscardableSharedMemoryManager>(); - // PowerMonitor is needed in reduced mode. BrowserMainLoop will safely skip - // initializing it again if it has already been initialized. - base::PowerMonitor::Initialize( - std::make_unique<base::PowerMonitorDeviceSource>()); - // Requires base::PowerMonitor to be initialized first. power_scheduler::PowerModeArbiter::GetInstance()->OnThreadPoolAvailable();
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn index ab91ea53..02ea3d1 100644 --- a/content/browser/BUILD.gn +++ b/content/browser/BUILD.gn
@@ -2033,6 +2033,8 @@ "android/app_web_message_port.cc", "android/background_sync_network_observer_android.cc", "android/background_sync_network_observer_android.h", + "android/battery_metrics.cc", + "android/battery_metrics.h", "android/browser_startup_controller.cc", "android/browser_startup_controller.h", "android/content_feature_list.cc",
diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc index cd3dfbcc..65b119ef 100644 --- a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc +++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
@@ -2043,8 +2043,9 @@ RunHtmlTest(FILE_PATH_LITERAL("input-color.html")); } +// TODO(https://crbug.com/1186378): Flaky. IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, - AccessibilityInputColorWithPopupOpen) { + DISABLED_AccessibilityInputColorWithPopupOpen) { RunHtmlTest(FILE_PATH_LITERAL("input-color-with-popup-open.html")); }
diff --git a/components/power_metrics/android_battery_metrics.cc b/content/browser/android/battery_metrics.cc similarity index 95% rename from components/power_metrics/android_battery_metrics.cc rename to content/browser/android/battery_metrics.cc index 5d313f5..7299612 100644 --- a/components/power_metrics/android_battery_metrics.cc +++ b/content/browser/android/battery_metrics.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/power_metrics/android_battery_metrics.h" +#include "content/browser/android/battery_metrics.h" #include "base/android/radio_utils.h" #include "base/bind.h" @@ -19,7 +19,7 @@ const base::Feature kForegroundRadioStateCountWakeups{ "ForegroundRadioStateCountWakeups", base::FEATURE_DISABLED_BY_DEFAULT}; -namespace power_metrics { +namespace content { namespace { void Report30SecondRadioUsage(int64_t tx_bytes, int64_t rx_bytes, int wakeups) { @@ -137,10 +137,17 @@ constexpr base::TimeDelta AndroidBatteryMetrics::kMetricsInterval; constexpr base::TimeDelta AndroidBatteryMetrics::kRadioStateInterval; +// static +AndroidBatteryMetrics* AndroidBatteryMetrics::GetInstance() { + static base::NoDestructor<AndroidBatteryMetrics> instance; + return instance.get(); +} + AndroidBatteryMetrics::AndroidBatteryMetrics() : app_visible_(false), on_battery_power_(base::PowerMonitor::IsOnBatteryPower()) { base::PowerMonitor::AddObserver(this); + content::ProcessVisibilityTracker::GetInstance()->AddObserver(this); UpdateMetricsEnabled(); } @@ -148,7 +155,7 @@ base::PowerMonitor::RemoveObserver(this); } -void AndroidBatteryMetrics::OnAppVisibilityChanged(bool visible) { +void AndroidBatteryMetrics::OnVisibilityChanged(bool visible) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); app_visible_ = visible; UpdateMetricsEnabled(); @@ -278,4 +285,4 @@ return observed_capacity_drops_ >= 2; } -} // namespace power_metrics +} // namespace content
diff --git a/components/power_metrics/android_battery_metrics.h b/content/browser/android/battery_metrics.h similarity index 72% rename from components/power_metrics/android_battery_metrics.h rename to content/browser/android/battery_metrics.h index 2373722..50debeb 100644 --- a/components/power_metrics/android_battery_metrics.h +++ b/content/browser/android/battery_metrics.h
@@ -2,30 +2,36 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_POWER_METRICS_ANDROID_BATTERY_METRICS_H_ -#define COMPONENTS_POWER_METRICS_ANDROID_BATTERY_METRICS_H_ +#ifndef CONTENT_BROWSER_ANDROID_BATTERY_METRICS_H_ +#define CONTENT_BROWSER_ANDROID_BATTERY_METRICS_H_ #include "base/android/radio_utils.h" #include "base/macros.h" +#include "base/no_destructor.h" #include "base/power_monitor/power_observer.h" #include "base/sequence_checker.h" #include "base/timer/timer.h" +#include "content/common/process_visibility_tracker.h" -namespace power_metrics { +namespace content { // Records metrics around battery usage on Android. The metrics are only tracked -// while the device is not charging and the app is visible (embedder should call -// OnAppVisibilityChanged()). This class is not thread-safe. -class AndroidBatteryMetrics : public base::PowerObserver { +// while the device is not charging and the app is visible. This class is not +// thread-safe. +class AndroidBatteryMetrics + : public base::PowerObserver, + public ProcessVisibilityTracker::ProcessVisibilityObserver { public: + static AndroidBatteryMetrics* GetInstance(); + + // ProcessVisibilityTracker::ProcessVisibilityObserver implementation: + void OnVisibilityChanged(bool visible) override; + + private: + friend class base::NoDestructor<AndroidBatteryMetrics>; AndroidBatteryMetrics(); ~AndroidBatteryMetrics() override; - // Should be called by the embedder when the embedder app becomes visible or - // invisible. - void OnAppVisibilityChanged(bool visible); - - private: // base::PowerObserver implementation: void OnPowerStateChange(bool on_battery_power) override; @@ -68,6 +74,6 @@ DISALLOW_COPY_AND_ASSIGN(AndroidBatteryMetrics); }; -} // namespace power_metrics +} // namespace content -#endif // COMPONENTS_POWER_METRICS_ANDROID_BATTERY_METRICS_H_ +#endif // CONTENT_BROWSER_ANDROID_BATTERY_METRICS_H_
diff --git a/content/browser/audio/audio_service.cc b/content/browser/audio/audio_service.cc index 1254c70..41dc4a8 100644 --- a/content/browser/audio/audio_service.cc +++ b/content/browser/audio/audio_service.cc
@@ -129,6 +129,14 @@ // UI MessageLoop type, to run AVFoundation and CoreAudio code. // See https://crbug.com/834581. .WithExtraCommandLineSwitches({switches::kMessageLoopTypeUi}) +#elif defined(OS_WIN) + .WithExtraCommandLineSwitches( + GetContentClient() + ->browser() + ->ShouldEnableAudioProcessHighPriority() + ? std::vector<std::string>( + {switches::kAudioProcessHighPriority}) + : std::vector<std::string>()) #endif .Pass()); }
diff --git a/content/browser/devtools/devtools_instrumentation.cc b/content/browser/devtools/devtools_instrumentation.cc index 65af410..04558b19 100644 --- a/content/browser/devtools/devtools_instrumentation.cc +++ b/content/browser/devtools/devtools_instrumentation.cc
@@ -174,6 +174,14 @@ frame_id); } +void HistoryNavigationOutcomeReported(const NavigationRequest* nav_request) { + DCHECK(nav_request); + FrameTreeNode* ftn = nav_request->frame_tree_node(); + DispatchToAgents(ftn, + &protocol::PageHandler::HistoryNavigationOutcomeReported, + nav_request); +} + namespace { protocol::String BuildBlockedByResponseReason( network::mojom::BlockedByResponseReason reason) {
diff --git a/content/browser/devtools/devtools_instrumentation.h b/content/browser/devtools/devtools_instrumentation.h index d3d5937..0e80bf4 100644 --- a/content/browser/devtools/devtools_instrumentation.h +++ b/content/browser/devtools/devtools_instrumentation.h
@@ -116,6 +116,8 @@ void WillBeginDownload(download::DownloadCreateInfo* info, download::DownloadItem* item); +void HistoryNavigationOutcomeReported(const NavigationRequest* nav_request); + void OnSignedExchangeReceived( FrameTreeNode* frame_tree_node, base::Optional<const base::UnguessableToken> devtools_navigation_token,
diff --git a/content/browser/devtools/protocol/input_handler.cc b/content/browser/devtools/protocol/input_handler.cc index 41eece2..9758aa8c 100644 --- a/content/browser/devtools/protocol/input_handler.cc +++ b/content/browser/devtools/protocol/input_handler.cc
@@ -116,7 +116,7 @@ : base::TimeTicks::Now(); } -bool SetKeyboardEventText(base::char16* to, Maybe<std::string> from) { +bool SetKeyboardEventText(char16_t* to, Maybe<std::string> from) { if (!from.isJust()) return true;
diff --git a/content/browser/devtools/protocol/native_input_event_builder_mac.mm b/content/browser/devtools/protocol/native_input_event_builder_mac.mm index 3e608a4..fede3262 100644 --- a/content/browser/devtools/protocol/native_input_event_builder_mac.mm +++ b/content/browser/devtools/protocol/native_input_event_builder_mac.mm
@@ -19,7 +19,7 @@ if (event.GetType() == blink::WebInputEvent::Type::kRawKeyDown || event.GetType() == blink::WebInputEvent::Type::kKeyDown) type = NSKeyDown; - const base::char16* textStartAddr = &event.text[0]; + const char16_t* textStartAddr = &event.text[0]; const int textLength = std::find(textStartAddr, textStartAddr + NativeWebKeyboardEvent::kTextLengthCap, '\0') -
diff --git a/content/browser/devtools/protocol/page_handler.cc b/content/browser/devtools/protocol/page_handler.cc index 449d6c1..208fad8 100644 --- a/content/browser/devtools/protocol/page_handler.cc +++ b/content/browser/devtools/protocol/page_handler.cc
@@ -32,6 +32,9 @@ #include "content/browser/devtools/protocol/emulation_handler.h" #include "content/browser/devtools/protocol/handler_helpers.h" #include "content/browser/manifest/manifest_manager_host.h" +#include "content/browser/renderer_host/back_forward_cache_can_store_document_result.h" +#include "content/browser/renderer_host/back_forward_cache_metrics.h" +#include "content/browser/renderer_host/navigation_entry_impl.h" #include "content/browser/renderer_host/navigation_request.h" #include "content/browser/renderer_host/navigator.h" #include "content/browser/renderer_host/render_widget_host_impl.h" @@ -1248,5 +1251,21 @@ callback->sendSuccess(Maybe<Binary>()); } +void PageHandler::HistoryNavigationOutcomeReported( + const NavigationRequest* navigation) { + if (!enabled_) + return; + + FrameTreeNode* ftn = navigation->frame_tree_node(); + std::string devtools_navigation_token = + navigation->devtools_navigation_token().ToString(); + std::string frame_id = ftn->devtools_frame_token().ToString(); + + frontend_->HistoryNavigationOutcomeReported( + devtools_navigation_token, frame_id, + const_cast<NavigationRequest*>(navigation) + ->IsServedFromBackForwardCache()); +} + } // namespace protocol } // namespace content
diff --git a/content/browser/devtools/protocol/page_handler.h b/content/browser/devtools/protocol/page_handler.h index 6a616bf..f217d2e 100644 --- a/content/browser/devtools/protocol/page_handler.h +++ b/content/browser/devtools/protocol/page_handler.h
@@ -98,6 +98,8 @@ WebContentsImpl* GetWebContents(); + void HistoryNavigationOutcomeReported(const NavigationRequest* nav_request); + Response Enable() override; Response Disable() override;
diff --git a/content/browser/devtools/protocol_config.json b/content/browser/devtools/protocol_config.json index 8e260fba..386077f 100644 --- a/content/browser/devtools/protocol_config.json +++ b/content/browser/devtools/protocol_config.json
@@ -66,7 +66,7 @@ "include": ["enable", "disable", "reload", "navigate", "stopLoading", "getNavigationHistory", "navigateToHistoryEntry", "resetNavigationHistory", "captureScreenshot", "startScreencast", "stopScreencast", "screencastFrameAck", "handleJavaScriptDialog", "setColorPickerEnabled", "printToPDF", "bringToFront", "setDownloadBehavior", "getAppManifest", "crash", "close", "setWebLifecycleState", "captureSnapshot", "getInstallabilityErrors", "getManifestIcons"], - "include_events": ["colorPicked", "interstitialShown", "interstitialHidden", "javascriptDialogOpening", "javascriptDialogClosed", "downloadWillBegin", "downloadProgress", "screencastVisibilityChanged", "screencastFrame"], + "include_events": ["colorPicked", "interstitialShown", "interstitialHidden", "javascriptDialogOpening", "javascriptDialogClosed", "downloadWillBegin", "downloadProgress", "screencastVisibilityChanged", "screencastFrame", "historyNavigationOutcomeReported"], "async": ["captureScreenshot", "printToPDF", "navigate", "getAppManifest", "reload", "captureSnapshot", "getInstallabilityErrors", "getManifestIcons"] }, {
diff --git a/content/browser/devtools/service_worker_devtools_agent_host.cc b/content/browser/devtools/service_worker_devtools_agent_host.cc index 89a6465..c2e0d4aa 100644 --- a/content/browser/devtools/service_worker_devtools_agent_host.cc +++ b/content/browser/devtools/service_worker_devtools_agent_host.cc
@@ -25,7 +25,6 @@ #include "content/browser/url_loader_factory_params_helper.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" -#include "content/public/browser/render_process_host.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "net/cookies/site_for_cookies.h" #include "services/network/public/mojom/network_context.mojom-forward.h" @@ -77,6 +76,7 @@ : base::Time()), cross_origin_embedder_policy_(std::move(cross_origin_embedder_policy)), coep_reporter_(std::move(coep_reporter)) { + UpdateProcessHost(); NotifyCreated(); } @@ -175,6 +175,7 @@ state_ = WORKER_NOT_READY; worker_process_id_ = worker_process_id; worker_route_id_ = worker_route_id; + UpdateProcessHost(); } void ServiceWorkerDevToolsAgentHost::WorkerStopped() { @@ -195,6 +196,25 @@ version_id_, attached)); } +void ServiceWorkerDevToolsAgentHost::UpdateProcessHost() { + process_observation_.Reset(); + if (auto* rph = RenderProcessHost::FromID(worker_process_id_)) + process_observation_.Observe(rph); +} + +// TODO(caseq): this is only relevant for shutdown, where a RPH may +// go along with StoragePartition and we won't receive any signals from +// the DevToolsWorkerManager, so agents would be still attached and +// may access the storage partition. This is meant to be a temporary +// workaround, the proper fix is likely to have ServiceWorkerInstance +// deleted in such case. +void ServiceWorkerDevToolsAgentHost::RenderProcessHostDestroyed( + RenderProcessHost* host) { + GetRendererChannel()->SetRenderer(mojo::NullRemote(), mojo::NullReceiver(), + ChildProcessHost::kInvalidUniqueID); + process_observation_.Reset(); +} + void ServiceWorkerDevToolsAgentHost::UpdateLoaderFactories( base::OnceClosure callback) { RenderProcessHost* rph = RenderProcessHost::FromID(worker_process_id_);
diff --git a/content/browser/devtools/service_worker_devtools_agent_host.h b/content/browser/devtools/service_worker_devtools_agent_host.h index cd66c5b5..2e2e7900 100644 --- a/content/browser/devtools/service_worker_devtools_agent_host.h +++ b/content/browser/devtools/service_worker_devtools_agent_host.h
@@ -10,10 +10,13 @@ #include <map> #include "base/macros.h" +#include "base/scoped_observation.h" #include "base/time/time.h" #include "base/unguessable_token.h" #include "content/browser/devtools/devtools_agent_host_impl.h" #include "content/browser/devtools/service_worker_devtools_manager.h" +#include "content/public/browser/render_process_host.h" +#include "content/public/browser/render_process_host_observer.h" #include "services/network/public/cpp/cross_origin_embedder_policy.h" #include "services/network/public/mojom/cross_origin_embedder_policy.mojom.h" #include "third_party/blink/public/mojom/devtools/devtools_agent.mojom.h" @@ -22,7 +25,8 @@ class BrowserContext; -class ServiceWorkerDevToolsAgentHost : public DevToolsAgentHostImpl { +class ServiceWorkerDevToolsAgentHost : public DevToolsAgentHostImpl, + RenderProcessHostObserver { public: using List = std::vector<scoped_refptr<ServiceWorkerDevToolsAgentHost>>; using Map = std::map<std::string, @@ -89,11 +93,15 @@ private: ~ServiceWorkerDevToolsAgentHost() override; void UpdateIsAttached(bool attached); + void UpdateProcessHost(); // DevToolsAgentHostImpl overrides. bool AttachSession(DevToolsSession* session, bool acquire_wake_lock) override; void DetachSession(DevToolsSession* session) override; + // RenderProcessHostObserver implementation. + void RenderProcessHostDestroyed(RenderProcessHost* host) override; + void UpdateLoaderFactories(base::OnceClosure callback); enum WorkerState { @@ -115,6 +123,8 @@ cross_origin_embedder_policy_; mojo::Remote<network::mojom::CrossOriginEmbedderPolicyReporter> coep_reporter_; + base::ScopedObservation<RenderProcessHost, RenderProcessHostObserver> + process_observation_{this}; DISALLOW_COPY_AND_ASSIGN(ServiceWorkerDevToolsAgentHost); };
diff --git a/content/browser/download/drag_download_util.cc b/content/browser/download/drag_download_util.cc index 92f4328..11cfe3ca 100644 --- a/content/browser/download/drag_download_util.cc +++ b/content/browser/download/drag_download_util.cc
@@ -27,7 +27,7 @@ base::string16* mime_type, base::FilePath* file_name, GURL* url) { - const base::char16 separator = L':'; + const char16_t separator = L':'; size_t mime_type_end_pos = metadata.find(separator); if (mime_type_end_pos == base::string16::npos)
diff --git a/content/browser/indexed_db/indexed_db_leveldb_coding.cc b/content/browser/indexed_db/indexed_db_leveldb_coding.cc index 74f573f4..881aa65 100644 --- a/content/browser/indexed_db/indexed_db_leveldb_coding.cc +++ b/content/browser/indexed_db/indexed_db_leveldb_coding.cc
@@ -133,11 +133,10 @@ // Backing store is UTF-16BE, convert from host endianness. size_t length = value.length(); size_t current = into->size(); - into->resize(into->size() + length * sizeof(base::char16)); + into->resize(into->size() + length * sizeof(char16_t)); - const base::char16* src = value.c_str(); - base::char16* dst = - reinterpret_cast<base::char16*>(&*into->begin() + current); + const char16_t* src = value.c_str(); + char16_t* dst = reinterpret_cast<char16_t*>(&*into->begin() + current); for (unsigned i = 0; i < length; ++i) *dst++ = base::HostToNet16(*src++); } @@ -295,17 +294,16 @@ } // Backing store is UTF-16BE, convert to host endianness. - DCHECK(!(slice->size() % sizeof(base::char16))); - size_t length = slice->size() / sizeof(base::char16); + DCHECK(!(slice->size() % sizeof(char16_t))); + size_t length = slice->size() / sizeof(char16_t); base::string16 decoded; decoded.reserve(length); - const base::char16* encoded = - reinterpret_cast<const base::char16*>(slice->begin()); + const char16_t* encoded = reinterpret_cast<const char16_t*>(slice->begin()); for (unsigned i = 0; i < length; ++i) decoded.push_back(base::NetToHost16(*encoded++)); *value = decoded; - slice->remove_prefix(length * sizeof(base::char16)); + slice->remove_prefix(length * sizeof(char16_t)); return true; } @@ -316,7 +314,7 @@ int64_t length = 0; if (!DecodeVarInt(slice, &length) || length < 0) return false; - size_t bytes = length * sizeof(base::char16); + size_t bytes = length * sizeof(char16_t); if (slice->size() < bytes) return false; @@ -549,9 +547,9 @@ int64_t length = 0; if (!DecodeVarInt(slice, &length) || length < 0) return false; - if (slice->size() < static_cast<size_t>(length) * sizeof(base::char16)) + if (slice->size() < static_cast<size_t>(length) * sizeof(char16_t)) return false; - slice->remove_prefix(length * sizeof(base::char16)); + slice->remove_prefix(length * sizeof(char16_t)); return true; } case kIndexedDBKeyDateTypeByte: @@ -611,19 +609,19 @@ *ok = false; return 0; } - DCHECK_GE(slice1->size(), len1 * sizeof(base::char16)); - DCHECK_GE(slice2->size(), len2 * sizeof(base::char16)); - if (slice1->size() < len1 * sizeof(base::char16) || - slice2->size() < len2 * sizeof(base::char16)) { + DCHECK_GE(slice1->size(), len1 * sizeof(char16_t)); + DCHECK_GE(slice2->size(), len2 * sizeof(char16_t)); + if (slice1->size() < len1 * sizeof(char16_t) || + slice2->size() < len2 * sizeof(char16_t)) { *ok = false; return 0; } // Extract the string data, and advance the passed slices. - StringPiece string1(slice1->begin(), len1 * sizeof(base::char16)); - StringPiece string2(slice2->begin(), len2 * sizeof(base::char16)); - slice1->remove_prefix(len1 * sizeof(base::char16)); - slice2->remove_prefix(len2 * sizeof(base::char16)); + StringPiece string1(slice1->begin(), len1 * sizeof(char16_t)); + StringPiece string2(slice2->begin(), len2 * sizeof(char16_t)); + slice1->remove_prefix(len1 * sizeof(char16_t)); + slice2->remove_prefix(len2 * sizeof(char16_t)); *ok = true; // Strings are UTF-16BE encoded, so a simple memcmp is sufficient.
diff --git a/content/browser/indexed_db/indexed_db_leveldb_coding_unittest.cc b/content/browser/indexed_db/indexed_db_leveldb_coding_unittest.cc index 84653e37..b856c5c 100644 --- a/content/browser/indexed_db/indexed_db_leveldb_coding_unittest.cc +++ b/content/browser/indexed_db/indexed_db_leveldb_coding_unittest.cc
@@ -259,8 +259,8 @@ } TEST(IndexedDBLevelDBCodingTest, EncodeString) { - const base::char16 test_string_a[] = {'f', 'o', 'o', '\0'}; - const base::char16 test_string_b[] = {0xdead, 0xbeef, '\0'}; + const char16_t test_string_a[] = {'f', 'o', 'o', '\0'}; + const char16_t test_string_b[] = {0xdead, 0xbeef, '\0'}; EXPECT_EQ(0u, WrappedEncodeString(ASCIIToUTF16("")).size()); EXPECT_EQ(2u, WrappedEncodeString(ASCIIToUTF16("a")).size()); @@ -270,8 +270,8 @@ } TEST(IndexedDBLevelDBCodingTest, DecodeString) { - const base::char16 test_string_a[] = {'f', 'o', 'o', '\0'}; - const base::char16 test_string_b[] = {0xdead, 0xbeef, '\0'}; + const char16_t test_string_a[] = {'f', 'o', 'o', '\0'}; + const char16_t test_string_b[] = {0xdead, 0xbeef, '\0'}; std::vector<base::string16> test_cases = {base::string16(), ASCIIToUTF16("a"), ASCIIToUTF16("foo"), test_string_a, @@ -307,8 +307,8 @@ } TEST(IndexedDBLevelDBCodingTest, EncodeStringWithLength) { - const base::char16 test_string_a[] = {'f', 'o', 'o', '\0'}; - const base::char16 test_string_b[] = {0xdead, 0xbeef, '\0'}; + const char16_t test_string_a[] = {'f', 'o', 'o', '\0'}; + const char16_t test_string_b[] = {0xdead, 0xbeef, '\0'}; EXPECT_EQ(1u, WrappedEncodeStringWithLength(base::string16()).size()); EXPECT_EQ(3u, WrappedEncodeStringWithLength(ASCIIToUTF16("a")).size()); @@ -319,11 +319,11 @@ } TEST(IndexedDBLevelDBCodingTest, DecodeStringWithLength) { - const base::char16 test_string_a[] = {'f', 'o', 'o', '\0'}; - const base::char16 test_string_b[] = {0xdead, 0xbeef, '\0'}; + const char16_t test_string_a[] = {'f', 'o', 'o', '\0'}; + const char16_t test_string_b[] = {0xdead, 0xbeef, '\0'}; const int kLongStringLen = 1234; - base::char16 long_string[kLongStringLen + 1]; + char16_t long_string[kLongStringLen + 1]; for (int i = 0; i < kLongStringLen; ++i) long_string[i] = i; long_string[kLongStringLen] = 0; @@ -374,12 +374,12 @@ } TEST(IndexedDBLevelDBCodingTest, CompareEncodedStringsWithLength) { - const base::char16 test_string_a[] = {0x1000, 0x1000, '\0'}; - const base::char16 test_string_b[] = {0x1000, 0x1000, 0x1000, '\0'}; - const base::char16 test_string_c[] = {0x1000, 0x1000, 0x1001, '\0'}; - const base::char16 test_string_d[] = {0x1001, 0x1000, 0x1000, '\0'}; - const base::char16 test_string_e[] = {0xd834, 0xdd1e, '\0'}; - const base::char16 test_string_f[] = {0xfffd, '\0'}; + const char16_t test_string_a[] = {0x1000, 0x1000, '\0'}; + const char16_t test_string_b[] = {0x1000, 0x1000, 0x1000, '\0'}; + const char16_t test_string_c[] = {0x1000, 0x1000, 0x1001, '\0'}; + const char16_t test_string_d[] = {0x1001, 0x1000, 0x1000, '\0'}; + const char16_t test_string_e[] = {0xd834, 0xdd1e, '\0'}; + const char16_t test_string_f[] = {0xfffd, '\0'}; std::vector<base::string16> test_cases = { ASCIIToUTF16(""),
diff --git a/content/browser/media/media_web_contents_observer.cc b/content/browser/media/media_web_contents_observer.cc index fd5f3ae8..4af82e30 100644 --- a/content/browser/media/media_web_contents_observer.cc +++ b/content/browser/media/media_web_contents_observer.cc
@@ -583,44 +583,14 @@ DCHECK(rfh); if (media_player_remotes_.contains(player_id)) { - // Collect debug information to help explain the numbers of attempts at - // |player_id| reuse that we're seeing. - // TODO(https://crbug.com/1172882): Remove once enough data has been - // collected. - const auto rfh_player_count = base::ranges::count_if( - media_player_remotes_, [player_id](const auto& player_id_and_remote) { - return player_id_and_remote.first.frame_routing_id == - player_id.frame_routing_id; - }); - const auto renderer_exit_count = - RenderFrameHostImpl::FromID(player_id.frame_routing_id) - ->renderer_exit_count(); - - NavigationEntry* const previous_entry = - web_contents()->GetController().GetEntryAtOffset(-1); - const GURL previous_main_url = - previous_entry ? previous_entry->GetURL() : GURL(); - // Also get the next entry in case this was a Back navigation. - NavigationEntry* const next_entry = - web_contents()->GetController().GetEntryAtOffset(1); - const GURL next_main_url = next_entry ? next_entry->GetURL() : GURL(); - - SCOPED_CRASH_KEY_BOOL("bug1172882", "is_main_frame", !rfh->GetParent()); - SCOPED_CRASH_KEY_NUMBER("bug1172882", "rfh_player_count", rfh_player_count); - SCOPED_CRASH_KEY_NUMBER("bug1172882", "renderer_exit_count", - renderer_exit_count); - SCOPED_CRASH_KEY_STRING256("bug1172882", "last_committed_url", - rfh->GetLastCommittedURL().spec()); - SCOPED_CRASH_KEY_STRING256("bug1172882", "main_url", - web_contents()->GetLastCommittedURL().spec()); - SCOPED_CRASH_KEY_STRING256("bug1172882", "previous_main_url", - previous_main_url.spec()); - SCOPED_CRASH_KEY_STRING256("bug1172882", "next_main_url", - next_main_url.spec()); - base::debug::DumpWithoutCrashing(); - - mojo::ReportBadMessage("Unexpected player_id reuse"); - return; + // Original remote associated with |player_id| will be overridden. If the + // original player is still alive, this will break our ability to control + // it from the browser process. We don't know that the original player is + // actually still alive. + // TODO(https://crbug.com/1172882): Determine the root cause of duplication + // and/or refactor to make ID purely a browser-side concept. + LOG(ERROR) << __func__ << " Duplicate media player id (" + << player_id.delegate_id << ")"; } media_player_remotes_[player_id].Bind(std::move(player_remote));
diff --git a/content/browser/prerender/prerender_host.cc b/content/browser/prerender/prerender_host.cc index ff34973..18292e2 100644 --- a/content/browser/prerender/prerender_host.cc +++ b/content/browser/prerender/prerender_host.cc
@@ -285,6 +285,13 @@ // Start prerendering navigation. NavigationController::LoadURLParams load_url_params(attributes_->url); load_url_params.initiator_origin = initiator_origin_; + + // Just use the referrer from attributes, as NoStatePrefetch does. + // TODO(crbug.com/1176054): For cross-origin prerender, follow the spec steps + // for "sufficiently-strict speculative navigation referrer policies". + if (attributes_->referrer) + load_url_params.referrer = Referrer(*attributes_->referrer); + // TODO(https://crbug.com/1132746): Set up other fields of `load_url_params` // as well, and add tests for them. page_holder_->GetNavigationController().LoadURLWithParams(load_url_params);
diff --git a/content/browser/renderer_host/back_forward_cache_metrics.cc b/content/browser/renderer_host/back_forward_cache_metrics.cc index f0b5aa3..6c0cb38 100644 --- a/content/browser/renderer_host/back_forward_cache_metrics.cc +++ b/content/browser/renderer_host/back_forward_cache_metrics.cc
@@ -7,6 +7,7 @@ #include "base/metrics/histogram_macros.h" #include "base/metrics/metrics_hashes.h" #include "base/metrics/sparse_histogram.h" +#include "content/browser/devtools/devtools_instrumentation.h" #include "content/browser/renderer_host/frame_tree_node.h" #include "content/browser/renderer_host/navigation_entry_impl.h" #include "content/browser/renderer_host/navigation_request.h" @@ -124,6 +125,7 @@ RecordMetricsForHistoryNavigationCommit(navigation, back_forward_cache_allowed); RecordHistoryNavigationUkm(navigation); + devtools_instrumentation::HistoryNavigationOutcomeReported(navigation); } page_store_result_ =
diff --git a/content/browser/renderer_host/dwrite_font_proxy_impl_win.cc b/content/browser/renderer_host/dwrite_font_proxy_impl_win.cc index 2644be6..50a1aa1 100644 --- a/content/browser/renderer_host/dwrite_font_proxy_impl_win.cc +++ b/content/browser/renderer_host/dwrite_font_proxy_impl_win.cc
@@ -52,7 +52,7 @@ L"Segoe UI", L"Calibri", L"Times New Roman", L"Courier New"}; struct RequiredFontStyle { - const base::char16* family_name; + const char16_t* family_name; DWRITE_FONT_WEIGHT required_weight; DWRITE_FONT_STRETCH required_stretch; DWRITE_FONT_STYLE required_style;
diff --git a/content/browser/renderer_host/native_web_keyboard_event_aura.cc b/content/browser/renderer_host/native_web_keyboard_event_aura.cc index efd25d60..69de5931 100644 --- a/content/browser/renderer_host/native_web_keyboard_event_aura.cc +++ b/content/browser/renderer_host/native_web_keyboard_event_aura.cc
@@ -125,7 +125,7 @@ } NativeWebKeyboardEvent::NativeWebKeyboardEvent(const ui::KeyEvent& key_event, - base::char16 character) + char16_t character) : WebKeyboardEvent(ui::MakeWebKeyboardEvent(key_event)), os_event(nullptr), skip_in_browser(false) {
diff --git a/content/browser/renderer_host/native_web_keyboard_event_mac.mm b/content/browser/renderer_host/native_web_keyboard_event_mac.mm index abe389e..0227b1f1 100644 --- a/content/browser/renderer_host/native_web_keyboard_event_mac.mm +++ b/content/browser/renderer_host/native_web_keyboard_event_mac.mm
@@ -29,7 +29,7 @@ return flags; } -size_t WebKeyboardEventTextLength(const base::char16* text) { +size_t WebKeyboardEventTextLength(const char16_t* text) { size_t text_length = 0; while (text_length < blink::WebKeyboardEvent::kTextLengthCap && text[text_length]) {
diff --git a/content/browser/webauth/authenticator_common.cc b/content/browser/webauth/authenticator_common.cc index 51db6c12..a96383ac 100644 --- a/content/browser/webauth/authenticator_common.cc +++ b/content/browser/webauth/authenticator_common.cc
@@ -98,6 +98,15 @@ namespace { +std::string Base64UrlEncode(const base::span<const uint8_t> input) { + std::string ret; + base::Base64UrlEncode( + base::StringPiece(reinterpret_cast<const char*>(input.data()), + input.size()), + base::Base64UrlEncodePolicy::OMIT_PADDING, &ret); + return ret; +} + // Validates whether the given origin is authorized to use the provided App // ID value, mostly according to the rules in // https://fidoalliance.org/specs/fido-u2f-v1.2-ps-20170411/fido-appid-and-facets-v1.2-ps-20170411.html#determining-if-a-caller-s-facetid-is-authorized-for-an-appid. @@ -321,8 +330,8 @@ common_info->authenticator_data = response_data.attestation_object() .authenticator_data() .SerializeToByteArray(); - common_info->raw_id = response_data.raw_credential_id(); - common_info->id = response_data.GetId(); + common_info->raw_id = response_data.attestation_object().GetCredentialId(); + common_info->id = Base64UrlEncode(common_info->raw_id); response->info = std::move(common_info); // The transport list must not contain duplicates but the order doesn't matter @@ -425,14 +434,14 @@ auto common_info = blink::mojom::CommonCredentialInfo::New(); common_info->client_data_json.assign(client_data_json.begin(), client_data_json.end()); - common_info->raw_id = response_data.raw_credential_id(); - common_info->id = response_data.GetId(); + common_info->raw_id = response_data.credential->id(); + common_info->id = Base64UrlEncode(common_info->raw_id); response->info = std::move(common_info); response->info->authenticator_data = - response_data.auth_data().SerializeToByteArray(); - response->signature = response_data.signature(); - response_data.user_entity() - ? response->user_handle.emplace(response_data.user_entity()->id) + response_data.authenticator_data.SerializeToByteArray(); + response->signature = response_data.signature; + response_data.user_entity + ? response->user_handle.emplace(response_data.user_entity->id) : response->user_handle.emplace(); for (RequestExtension ext : requested_extensions) { @@ -440,7 +449,7 @@ case RequestExtension::kAppID: DCHECK(app_id); response->echo_appid_extension = true; - if (response_data.GetRpIdHash() == + if (response_data.authenticator_data.application_parameter() == CreateApplicationParameter(*app_id)) { response->appid_extension = true; } @@ -448,7 +457,7 @@ case RequestExtension::kPRF: { response->echo_prf = true; base::Optional<base::span<const uint8_t>> hmac_secret = - response_data.hmac_secret(); + response_data.hmac_secret; if (hmac_secret) { auto prf_values = blink::mojom::PRFValues::New(); DCHECK(hmac_secret->size() == 32 || hmac_secret->size() == 64); @@ -460,19 +469,18 @@ } response->prf_results = std::move(prf_values); } else { - response->prf_not_evaluated = - response_data.hmac_secret_not_evaluated(); + response->prf_not_evaluated = response_data.hmac_secret_not_evaluated; } break; } case RequestExtension::kLargeBlobRead: response->echo_large_blob = true; - response->large_blob = response_data.large_blob(); + response->large_blob = response_data.large_blob; break; case RequestExtension::kLargeBlobWrite: response->echo_large_blob = true; response->echo_large_blob_written = true; - response->large_blob_written = response_data.large_blob_written(); + response->large_blob_written = response_data.large_blob_written; break; case RequestExtension::kHMACSecret: case RequestExtension::kCredProps: @@ -640,15 +648,6 @@ return discovery_factory; } -std::string Base64UrlEncode(const base::span<const uint8_t> input) { - std::string ret; - base::Base64UrlEncode( - base::StringPiece(reinterpret_cast<const char*>(input.data()), - input.size()), - base::Base64UrlEncodePolicy::OMIT_PADDING, &ret); - return ret; -} - // ToJSONString encodes |in| as a JSON string, using the specific escaping rules // required by https://github.com/w3c/webauthn/pull/1375. std::string ToJSONString(base::StringPiece in) { @@ -855,8 +854,8 @@ void AuthenticatorCommon::OnLargeBlobUncompressed( device::AuthenticatorGetAssertionResponse response, data_decoder::DataDecoder::ResultOrError<mojo_base::BigBuffer> result) { - response.set_large_blob( - device::fido_parsing_utils::MaterializeOrNull(result.value)); + response.large_blob = + device::fido_parsing_utils::MaterializeOrNull(result.value); InvokeCallbackAndCleanup( std::move(get_assertion_response_callback_), blink::mojom::AuthenticatorStatus::SUCCESS, @@ -1721,14 +1720,14 @@ // built-in. In that case, consider that credential pre-selected. if (empty_allow_list_ && (response_data->size() > 1 || - (response_data->at(0).user_entity() && - (response_data->at(0).user_entity()->name || - response_data->at(0).user_entity()->display_name)))) { + (response_data->at(0).user_entity && + (response_data->at(0).user_entity->name || + response_data->at(0).user_entity->display_name)))) { std::vector<device::PublicKeyCredentialUserEntity> users_list; users_list.reserve(response_data->size()); for (const auto& response : *response_data) { - if (response.user_entity()) { - users_list.push_back(*response.user_entity()); + if (response.user_entity) { + users_list.push_back(*response.user_entity); } } request_delegate_->SelectAccount( @@ -1745,8 +1744,8 @@ void AuthenticatorCommon::OnAccountSelected( device::AuthenticatorGetAssertionResponse response) { - if (response.large_blob()) { - std::vector<uint8_t> blob = std::move(*response.large_blob()); + if (response.large_blob) { + std::vector<uint8_t> blob = std::move(*response.large_blob); data_decoder_.GzipUncompress( blob, base::BindOnce(&AuthenticatorCommon::OnLargeBlobUncompressed, weak_factory_.GetWeakPtr(), std::move(response)));
diff --git a/content/browser/webauth/authenticator_impl_unittest.cc b/content/browser/webauth/authenticator_impl_unittest.cc index 77c3b4d..7f58385 100644 --- a/content/browser/webauth/authenticator_impl_unittest.cc +++ b/content/browser/webauth/authenticator_impl_unittest.cc
@@ -5325,7 +5325,7 @@ std::sort(responses.begin(), responses.end(), [](const device::AuthenticatorGetAssertionResponse& a, const device::AuthenticatorGetAssertionResponse& b) { - return a.user_entity()->id < b.user_entity()->id; + return a.user_entity->id < b.user_entity->id; }); std::vector<std::string> string_reps; @@ -5333,7 +5333,7 @@ responses.begin(), responses.end(), std::back_inserter(string_reps), [](const device::AuthenticatorGetAssertionResponse& response) { const device::PublicKeyCredentialUserEntity& user = - response.user_entity().value(); + response.user_entity.value(); return base::HexEncode(user.id.data(), user.id.size()) + ":" + user.name.value_or("") + ":" + user.display_name.value_or(""); }); @@ -5343,7 +5343,7 @@ const auto selected = std::find_if( responses.begin(), responses.end(), [this](const device::AuthenticatorGetAssertionResponse& response) { - return response.user_entity()->id == selected_user_id_; + return response.user_entity->id == selected_user_id_; }); ASSERT_TRUE(selected != responses.end());
diff --git a/content/public/browser/content_browser_client.cc b/content/public/browser/content_browser_client.cc index 3b4fad3..8b699a6 100644 --- a/content/public/browser/content_browser_client.cc +++ b/content/public/browser/content_browser_client.cc
@@ -736,6 +736,10 @@ return false; } +bool ContentBrowserClient::ShouldEnableAudioProcessHighPriority() { + return base::FeatureList::IsEnabled(features::kAudioProcessHighPriorityWin); +} + #endif // defined(OS_WIN) std::vector<std::unique_ptr<blink::URLLoaderThrottle>>
diff --git a/content/public/browser/content_browser_client.h b/content/public/browser/content_browser_client.h index 92060e2..bd19bd6 100644 --- a/content/public/browser/content_browser_client.h +++ b/content/public/browser/content_browser_client.h
@@ -1235,6 +1235,10 @@ // Performs a fast and orderly shutdown of the browser. virtual void SessionEnding() {} + + // Returns true if the audio process should run with high priority. false + // otherwise. + virtual bool ShouldEnableAudioProcessHighPriority(); #endif // Binds a new media remoter service to |receiver|, if supported by the
diff --git a/content/public/browser/native_web_keyboard_event.h b/content/public/browser/native_web_keyboard_event.h index 1a025a2..456e530 100644 --- a/content/public/browser/native_web_keyboard_event.h +++ b/content/public/browser/native_web_keyboard_event.h
@@ -52,7 +52,7 @@ explicit NativeWebKeyboardEvent(const ui::KeyEvent& key_event); #if defined(USE_AURA) // Create a legacy keypress event specified by |character|. - NativeWebKeyboardEvent(const ui::KeyEvent& key_event, base::char16 character); + NativeWebKeyboardEvent(const ui::KeyEvent& key_event, char16_t character); #endif #endif
diff --git a/content/public/common/content_switches.cc b/content/public/common/content_switches.cc index 71d2b75..9e995c4 100644 --- a/content/public/common/content_switches.cc +++ b/content/public/common/content_switches.cc
@@ -1028,6 +1028,9 @@ // Causes the second GPU process used for gpu info collection to display a // dialog on launch. const char kGpu2StartupDialog[] = "gpu2-startup-dialog"; + +// Use high priority for the audio process. +const char kAudioProcessHighPriority[] = "audio-process-high-priority"; #endif #if defined(ENABLE_IPC_FUZZER)
diff --git a/content/public/common/content_switches.h b/content/public/common/content_switches.h index f711444d..00cc8c3 100644 --- a/content/public/common/content_switches.h +++ b/content/public/common/content_switches.h
@@ -286,6 +286,7 @@ CONTENT_EXPORT extern const char kPpapiSubpixelRenderingSetting[]; CONTENT_EXPORT extern const char kRaiseTimerFrequency[]; CONTENT_EXPORT extern const char kGpu2StartupDialog[]; +CONTENT_EXPORT extern const char kAudioProcessHighPriority[]; #endif #if defined(ENABLE_IPC_FUZZER)
diff --git a/content/public/test/fake_speech_recognition_manager.cc b/content/public/test/fake_speech_recognition_manager.cc index d42116d..9b301d3 100644 --- a/content/public/test/fake_speech_recognition_manager.cc +++ b/content/public/test/fake_speech_recognition_manager.cc
@@ -72,8 +72,6 @@ EXPECT_EQ(session_id, session_id_); EXPECT_TRUE(listener_ != nullptr); - listener_->OnRecognitionStart(session_id_); - // Delegate can get a copy of events. if (delegate_) delegate_->GetEventListener()->OnRecognitionStart(session_id_); @@ -136,8 +134,6 @@ return; VLOG(1) << "Setting fake recognition result."; - listener_->OnAudioStart(session_id_); - listener_->OnSoundStart(session_id_); listener_->OnAudioEnd(session_id_); blink::mojom::SpeechRecognitionResultPtr result = blink::mojom::SpeechRecognitionResult::New();
diff --git a/content/renderer/media/OWNERS b/content/renderer/media/OWNERS index b31b987c..482d786f 100644 --- a/content/renderer/media/OWNERS +++ b/content/renderer/media/OWNERS
@@ -8,5 +8,8 @@ guidou@chromium.org olka@chromium.org +# WebAudio OWNERS. +per-file renderer_webaudiodevice_impl.*=file://third_party/blink/renderer/modules/webaudio/OWNERS + # Original (legacy) owner. emircan@chromium.org
diff --git a/content/renderer/render_view_browsertest.cc b/content/renderer/render_view_browsertest.cc index 8b135b75..a52eafb 100644 --- a/content/renderer/render_view_browsertest.cc +++ b/content/renderer/render_view_browsertest.cc
@@ -391,10 +391,10 @@ NativeWebKeyboardEvent keyup_event(*event3); SendNativeKeyEvent(keyup_event); - base::char16 c = DomCodeToUsLayoutCharacter( + char16_t c = DomCodeToUsLayoutCharacter( UsLayoutKeyboardCodeToDomCode(static_cast<ui::KeyboardCode>(key_code)), flags); - output->assign(1, static_cast<base::char16>(c)); + output->assign(1, static_cast<char16_t>(c)); return 1; } #endif @@ -422,10 +422,10 @@ NativeWebKeyboardEvent keyup_web_event(keyup_event); SendNativeKeyEvent(keyup_web_event); - base::char16 c = DomCodeToUsLayoutCharacter( + char16_t c = DomCodeToUsLayoutCharacter( UsLayoutKeyboardCodeToDomCode(static_cast<ui::KeyboardCode>(key_code)), flags); - output->assign(1, static_cast<base::char16>(c)); + output->assign(1, static_cast<char16_t>(c)); return 1; } #endif
diff --git a/content/test/gpu/gpu_tests/test_expectations/context_lost_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/context_lost_expectations.txt index 4087d5c..d6c073a 100644 --- a/content/test/gpu/gpu_tests/test_expectations/context_lost_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/context_lost_expectations.txt
@@ -22,9 +22,9 @@ # release release-x64 ] # GPU # tags: [ amd amd-0x6613 amd-0x679e amd-0x6821 amd-0x7340 -# apple apple-apple-a12z +# apple apple-apple-m1 null-metal-renderer:-apple-m1 # arm -# google google-0xffff google-angle-(metal-renderer:-apple-a12z) +# google google-0xffff # intel intel-0xa2e intel-0xd26 intel-0xa011 intel-0x3e92 intel-0x3e9b # intel-0x5912 # nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184
diff --git a/content/test/gpu/gpu_tests/test_expectations/depth_capture_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/depth_capture_expectations.txt index 0ee93b6d..9c59c7b 100644 --- a/content/test/gpu/gpu_tests/test_expectations/depth_capture_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/depth_capture_expectations.txt
@@ -22,9 +22,9 @@ # release release-x64 ] # GPU # tags: [ amd amd-0x6613 amd-0x679e amd-0x6821 amd-0x7340 -# apple apple-apple-a12z +# apple apple-apple-m1 null-metal-renderer:-apple-m1 # arm -# google google-0xffff google-angle-(metal-renderer:-apple-a12z) +# google google-0xffff # intel intel-0xa2e intel-0xd26 intel-0xa011 intel-0x3e92 intel-0x3e9b # intel-0x5912 # nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184
diff --git a/content/test/gpu/gpu_tests/test_expectations/gpu_process_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/gpu_process_expectations.txt index 3a4d51bb..fb903a9 100644 --- a/content/test/gpu/gpu_tests/test_expectations/gpu_process_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/gpu_process_expectations.txt
@@ -22,9 +22,9 @@ # release release-x64 ] # GPU # tags: [ amd amd-0x6613 amd-0x679e amd-0x6821 amd-0x7340 -# apple apple-apple-a12z +# apple apple-apple-m1 null-metal-renderer:-apple-m1 # arm -# google google-0xffff google-angle-(metal-renderer:-apple-a12z) +# google google-0xffff # intel intel-0xa2e intel-0xd26 intel-0xa011 intel-0x3e92 intel-0x3e9b # intel-0x5912 # nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184
diff --git a/content/test/gpu/gpu_tests/test_expectations/hardware_accelerated_feature_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/hardware_accelerated_feature_expectations.txt index 08cef66..0f33313e 100644 --- a/content/test/gpu/gpu_tests/test_expectations/hardware_accelerated_feature_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/hardware_accelerated_feature_expectations.txt
@@ -22,9 +22,9 @@ # release release-x64 ] # GPU # tags: [ amd amd-0x6613 amd-0x679e amd-0x6821 amd-0x7340 -# apple apple-apple-a12z +# apple apple-apple-m1 null-metal-renderer:-apple-m1 # arm -# google google-0xffff google-angle-(metal-renderer:-apple-a12z) +# google google-0xffff # intel intel-0xa2e intel-0xd26 intel-0xa011 intel-0x3e92 intel-0x3e9b # intel-0x5912 # nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184
diff --git a/content/test/gpu/gpu_tests/test_expectations/info_collection_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/info_collection_expectations.txt index 975034c3..ab6f906 100644 --- a/content/test/gpu/gpu_tests/test_expectations/info_collection_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/info_collection_expectations.txt
@@ -22,9 +22,9 @@ # release release-x64 ] # GPU # tags: [ amd amd-0x6613 amd-0x679e amd-0x6821 amd-0x7340 -# apple apple-apple-a12z +# apple apple-apple-m1 null-metal-renderer:-apple-m1 # arm -# google google-0xffff google-angle-(metal-renderer:-apple-a12z) +# google google-0xffff # intel intel-0xa2e intel-0xd26 intel-0xa011 intel-0x3e92 intel-0x3e9b # intel-0x5912 # nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184
diff --git a/content/test/gpu/gpu_tests/test_expectations/maps_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/maps_expectations.txt index c3aff1b3..9893016a 100644 --- a/content/test/gpu/gpu_tests/test_expectations/maps_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/maps_expectations.txt
@@ -22,9 +22,9 @@ # release release-x64 ] # GPU # tags: [ amd amd-0x6613 amd-0x679e amd-0x6821 amd-0x7340 -# apple apple-apple-a12z +# apple apple-apple-m1 null-metal-renderer:-apple-m1 # arm -# google google-0xffff google-angle-(metal-renderer:-apple-a12z) +# google google-0xffff # intel intel-0xa2e intel-0xd26 intel-0xa011 intel-0x3e92 intel-0x3e9b # intel-0x5912 # nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184
diff --git a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt index 1b4c028..57a9b66 100644 --- a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
@@ -22,9 +22,9 @@ # release release-x64 ] # GPU # tags: [ amd amd-0x6613 amd-0x679e amd-0x6821 amd-0x7340 -# apple apple-apple-a12z +# apple apple-apple-m1 null-metal-renderer:-apple-m1 # arm -# google google-0xffff google-angle-(metal-renderer:-apple-a12z) +# google google-0xffff # intel intel-0xa2e intel-0xd26 intel-0xa011 intel-0x3e92 intel-0x3e9b # intel-0x5912 # nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184 @@ -406,4 +406,4 @@ crbug.com/1069339 [ mojave amd-0x6821 ] Pixel_OffscreenCanvasIBRCWebGLHighPerfWorker [ RetryOnFailure ] # finder:disable Very low flake rate (1 in 1k+ builds) # Failures on Mac FYI arm64 Release (Apple DTK) -crbug.com/1175753 [ mac release apple-apple-a12z ] Pixel_Video_BackdropFilter [ Skip ] +crbug.com/1175753 [ mac release apple-apple-m1 ] Pixel_Video_BackdropFilter [ Skip ]
diff --git a/content/test/gpu/gpu_tests/test_expectations/power_measurement_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/power_measurement_expectations.txt index f222a380..141e58d 100644 --- a/content/test/gpu/gpu_tests/test_expectations/power_measurement_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/power_measurement_expectations.txt
@@ -22,9 +22,9 @@ # release release-x64 ] # GPU # tags: [ amd amd-0x6613 amd-0x679e amd-0x6821 amd-0x7340 -# apple apple-apple-a12z +# apple apple-apple-m1 null-metal-renderer:-apple-m1 # arm -# google google-0xffff google-angle-(metal-renderer:-apple-a12z) +# google google-0xffff # intel intel-0xa2e intel-0xd26 intel-0xa011 intel-0x3e92 intel-0x3e9b # intel-0x5912 # nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184
diff --git a/content/test/gpu/gpu_tests/test_expectations/screenshot_sync_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/screenshot_sync_expectations.txt index f15ce94..e589c0e 100644 --- a/content/test/gpu/gpu_tests/test_expectations/screenshot_sync_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/screenshot_sync_expectations.txt
@@ -22,9 +22,9 @@ # release release-x64 ] # GPU # tags: [ amd amd-0x6613 amd-0x679e amd-0x6821 amd-0x7340 -# apple apple-apple-a12z +# apple apple-apple-m1 null-metal-renderer:-apple-m1 # arm -# google google-0xffff google-angle-(metal-renderer:-apple-a12z) +# google google-0xffff # intel intel-0xa2e intel-0xd26 intel-0xa011 intel-0x3e92 intel-0x3e9b # intel-0x5912 # nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184
diff --git a/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt index 337a341..82ca8a89 100644 --- a/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt
@@ -22,9 +22,9 @@ # release release-x64 ] # GPU # tags: [ amd amd-0x6613 amd-0x679e amd-0x6821 amd-0x7340 -# apple apple-apple-a12z +# apple apple-apple-m1 null-metal-renderer:-apple-m1 # arm -# google google-0xffff google-angle-(metal-renderer:-apple-a12z) +# google google-0xffff # intel intel-0xa2e intel-0xd26 intel-0xa011 intel-0x3e92 intel-0x3e9b # intel-0x5912 # nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt index 1b2e03f2..76847e3 100644 --- a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
@@ -22,9 +22,9 @@ # release release-x64 ] # GPU # tags: [ amd amd-0x6613 amd-0x679e amd-0x6821 amd-0x7340 -# apple apple-apple-a12z +# apple apple-apple-m1 null-metal-renderer:-apple-m1 # arm -# google google-0xffff google-angle-(metal-renderer:-apple-a12z) +# google google-0xffff # intel intel-0xa2e intel-0xd26 intel-0xa011 intel-0x3e92 intel-0x3e9b # intel-0x5912 # nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184 @@ -772,42 +772,42 @@ crbug.com/1027605 [ mac amd-0x679e no-passthrough ] deqp/functional/gles3/transformfeedback/random_separate_triangles.html [ Failure ] # ARM-based Mac DTKs -crbug.com/1130112 [ mac apple-apple-a12z ] deqp/functional/gles3/texturefiltering/cube_combinations_00.html [ Failure ] -crbug.com/1130112 [ mac apple-apple-a12z ] deqp/functional/gles3/texturefiltering/cube_combinations_02.html [ Failure ] -crbug.com/1130112 [ mac apple-apple-a12z ] deqp/functional/gles3/texturefiltering/cube_combinations_04.html [ Failure ] -crbug.com/1130112 [ mac apple-apple-a12z ] deqp/functional/gles3/texturefiltering/cube_sizes_03.html [ Failure ] -crbug.com/1130112 [ mac apple-apple-a12z ] deqp/functional/gles3/texturefiltering/cube_sizes_04.html [ Failure ] -crbug.com/1130114 [ mac apple-apple-a12z ] conformance2/extensions/ext-color-buffer-float.html [ Failure ] -crbug.com/1130117 [ mac apple-apple-a12z ] deqp/functional/gles3/fbomultisample.2_samples.html [ Failure ] -crbug.com/1130117 [ mac apple-apple-a12z ] deqp/functional/gles3/fbomultisample.4_samples.html [ Failure ] -crbug.com/1130117 [ mac apple-apple-a12z no-asan ] deqp/functional/gles3/multisample.html [ Failure ] -crbug.com/1130118 [ mac apple-apple-a12z ] conformance2/rendering/blitframebuffer-filter-srgb.html [ Failure ] -crbug.com/1130118 [ mac apple-apple-a12z ] deqp/functional/gles3/framebufferblit/rect_03.html [ Failure ] -crbug.com/1130118 [ mac apple-apple-a12z ] deqp/functional/gles3/framebufferblit/rect_04.html [ Failure ] -crbug.com/1130118 [ mac apple-apple-a12z ] deqp/functional/gles3/framebufferblit/default_framebuffer_00.html [ Failure ] -crbug.com/1130119 [ mac apple-apple-a12z ] conformance2/glsl3/vector-dynamic-indexing.html [ Failure ] -crbug.com/1130119 [ mac apple-apple-a12z ] conformance2/textures/misc/tex-base-level-bug.html [ Failure ] -crbug.com/1130119 [ mac apple-apple-a12z ] conformance2/textures/webgl_canvas/tex-3d-r32f-red-float.html [ RetryOnFailure ] -crbug.com/1130119 [ mac apple-apple-a12z ] conformance2/rendering/framebuffer-completeness-unaffected.html [ Failure ] -crbug.com/1130119 [ mac apple-apple-a12z passthrough angle-opengl ] conformance2/rendering/framebuffer-render-to-layer.html [ Failure ] -crbug.com/1130119 [ mac apple-apple-a12z ] deqp/functional/gles3/fbocompleteness.html [ Failure ] -crbug.com/1130119 [ mac apple-apple-a12z ] deqp/functional/gles3/fbodepthbuffer.html [ Failure ] -crbug.com/1130119 [ mac apple-apple-a12z ] deqp/functional/gles3/shadertexturefunction/texturegrad.html [ Failure ] -crbug.com/1130119 [ mac apple-apple-a12z ] deqp/functional/gles3/textureshadow/cube_linear_mipmap_linear_greater.html [ RetryOnFailure ] -crbug.com/1130119 [ mac apple-apple-a12z ] deqp/functional/gles3/textureshadow/cube_linear_mipmap_linear_less.html [ RetryOnFailure ] -crbug.com/1130119 [ mac apple-apple-a12z ] deqp/functional/gles3/texturespecification/texstorage2d_format_size.html [ RetryOnFailure ] -crbug.com/1130703 [ mac apple-apple-a12z no-passthrough ] conformance/textures/misc/texture-copying-and-deletion.html [ Failure ] -crbug.com/1130703 [ mac apple-apple-a12z no-passthrough ] conformance/textures/misc/texture-copying-feedback-loops.html [ Failure ] -crbug.com/1130708 [ mac apple-apple-a12z no-passthrough ] conformance2/textures/canvas/tex-2d-rgb5_a1-rgba-unsigned_byte.html [ Failure ] -crbug.com/1130708 [ mac apple-apple-a12z no-passthrough ] conformance2/textures/canvas_sub_rectangle/tex-2d-rgb5_a1-rgba-unsigned_byte.html [ Failure ] -crbug.com/1130708 [ mac apple-apple-a12z no-passthrough ] conformance2/textures/image_bitmap_from_canvas/tex-2d-rgb5_a1-rgba-unsigned_byte.html [ Failure ] -crbug.com/1130708 [ mac apple-apple-a12z no-passthrough ] conformance2/textures/image_bitmap_from_video/tex-2d-rgb5_a1-rgba-unsigned_byte.html [ Failure ] -crbug.com/1130708 [ mac apple-apple-a12z no-passthrough ] conformance2/textures/video/tex-2d-rgb5_a1-rgba-unsigned_byte.html [ Failure ] -crbug.com/1130708 [ mac apple-apple-a12z no-passthrough ] conformance2/textures/webgl_canvas/tex-2d-rgb5_a1-rgba-unsigned_byte.html [ Failure ] -crbug.com/1130708 [ mac apple-apple-a12z no-passthrough ] conformance2/textures/misc/tex-mipmap-levels.html [ Failure ] -crbug.com/1130711 [ mac apple-apple-a12z no-passthrough ] deqp/functional/gles3/negativeshaderapi.html [ Failure ] -crbug.com/1141066 [ mac apple-apple-a12z angle-opengl passthrough ] conformance/textures/misc/texture-copying-and-deletion.html [ Failure ] -crbug.com/1141066 [ mac apple-apple-a12z angle-opengl passthrough ] conformance/textures/misc/texture-copying-feedback-loops.html [ Failure ] +crbug.com/1130112 [ mac apple-apple-m1 ] deqp/functional/gles3/texturefiltering/cube_combinations_00.html [ Failure ] +crbug.com/1130112 [ mac apple-apple-m1 ] deqp/functional/gles3/texturefiltering/cube_combinations_02.html [ Failure ] +crbug.com/1130112 [ mac apple-apple-m1 ] deqp/functional/gles3/texturefiltering/cube_combinations_04.html [ Failure ] +crbug.com/1130112 [ mac apple-apple-m1 ] deqp/functional/gles3/texturefiltering/cube_sizes_03.html [ Failure ] +crbug.com/1130112 [ mac apple-apple-m1 ] deqp/functional/gles3/texturefiltering/cube_sizes_04.html [ Failure ] +crbug.com/1130114 [ mac apple-apple-m1 ] conformance2/extensions/ext-color-buffer-float.html [ Failure ] +crbug.com/1130117 [ mac apple-apple-m1 ] deqp/functional/gles3/fbomultisample.2_samples.html [ Failure ] +crbug.com/1130117 [ mac apple-apple-m1 ] deqp/functional/gles3/fbomultisample.4_samples.html [ Failure ] +crbug.com/1130117 [ mac apple-apple-m1 no-asan ] deqp/functional/gles3/multisample.html [ Failure ] +crbug.com/1130118 [ mac apple-apple-m1 ] conformance2/rendering/blitframebuffer-filter-srgb.html [ Failure ] +crbug.com/1130118 [ mac apple-apple-m1 ] deqp/functional/gles3/framebufferblit/rect_03.html [ Failure ] +crbug.com/1130118 [ mac apple-apple-m1 ] deqp/functional/gles3/framebufferblit/rect_04.html [ Failure ] +crbug.com/1130118 [ mac apple-apple-m1 ] deqp/functional/gles3/framebufferblit/default_framebuffer_00.html [ Failure ] +crbug.com/1130119 [ mac apple-apple-m1 ] conformance2/glsl3/vector-dynamic-indexing.html [ Failure ] +crbug.com/1130119 [ mac apple-apple-m1 ] conformance2/textures/misc/tex-base-level-bug.html [ Failure ] +crbug.com/1130119 [ mac apple-apple-m1 ] conformance2/textures/webgl_canvas/tex-3d-r32f-red-float.html [ RetryOnFailure ] +crbug.com/1130119 [ mac apple-apple-m1 ] conformance2/rendering/framebuffer-completeness-unaffected.html [ Failure ] +crbug.com/1130119 [ mac apple-apple-m1 passthrough angle-opengl ] conformance2/rendering/framebuffer-render-to-layer.html [ Failure ] +crbug.com/1130119 [ mac apple-apple-m1 ] deqp/functional/gles3/fbocompleteness.html [ Failure ] +crbug.com/1130119 [ mac apple-apple-m1 ] deqp/functional/gles3/fbodepthbuffer.html [ Failure ] +crbug.com/1130119 [ mac apple-apple-m1 ] deqp/functional/gles3/shadertexturefunction/texturegrad.html [ Failure ] +crbug.com/1130119 [ mac apple-apple-m1 ] deqp/functional/gles3/textureshadow/cube_linear_mipmap_linear_greater.html [ RetryOnFailure ] +crbug.com/1130119 [ mac apple-apple-m1 ] deqp/functional/gles3/textureshadow/cube_linear_mipmap_linear_less.html [ RetryOnFailure ] +crbug.com/1130119 [ mac apple-apple-m1 ] deqp/functional/gles3/texturespecification/texstorage2d_format_size.html [ RetryOnFailure ] +crbug.com/1130703 [ mac apple-apple-m1 no-passthrough ] conformance/textures/misc/texture-copying-and-deletion.html [ Failure ] +crbug.com/1130703 [ mac apple-apple-m1 no-passthrough ] conformance/textures/misc/texture-copying-feedback-loops.html [ Failure ] +crbug.com/1130708 [ mac apple-apple-m1 no-passthrough ] conformance2/textures/canvas/tex-2d-rgb5_a1-rgba-unsigned_byte.html [ Failure ] +crbug.com/1130708 [ mac apple-apple-m1 no-passthrough ] conformance2/textures/canvas_sub_rectangle/tex-2d-rgb5_a1-rgba-unsigned_byte.html [ Failure ] +crbug.com/1130708 [ mac apple-apple-m1 no-passthrough ] conformance2/textures/image_bitmap_from_canvas/tex-2d-rgb5_a1-rgba-unsigned_byte.html [ Failure ] +crbug.com/1130708 [ mac apple-apple-m1 no-passthrough ] conformance2/textures/image_bitmap_from_video/tex-2d-rgb5_a1-rgba-unsigned_byte.html [ Failure ] +crbug.com/1130708 [ mac apple-apple-m1 no-passthrough ] conformance2/textures/video/tex-2d-rgb5_a1-rgba-unsigned_byte.html [ Failure ] +crbug.com/1130708 [ mac apple-apple-m1 no-passthrough ] conformance2/textures/webgl_canvas/tex-2d-rgb5_a1-rgba-unsigned_byte.html [ Failure ] +crbug.com/1130708 [ mac apple-apple-m1 no-passthrough ] conformance2/textures/misc/tex-mipmap-levels.html [ Failure ] +crbug.com/1130711 [ mac apple-apple-m1 no-passthrough ] deqp/functional/gles3/negativeshaderapi.html [ Failure ] +crbug.com/1141066 [ mac apple-apple-m1 angle-opengl passthrough ] conformance/textures/misc/texture-copying-and-deletion.html [ Failure ] +crbug.com/1141066 [ mac apple-apple-m1 angle-opengl passthrough ] conformance/textures/misc/texture-copying-feedback-loops.html [ Failure ] #################### # Linux failures #
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt index 51d39fe..042b868 100644 --- a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
@@ -22,9 +22,9 @@ # release release-x64 ] # GPU # tags: [ amd amd-0x6613 amd-0x679e amd-0x6821 amd-0x7340 -# apple apple-apple-a12z +# apple apple-apple-m1 null-metal-renderer:-apple-m1 # arm -# google google-0xffff google-angle-(metal-renderer:-apple-a12z) +# google google-0xffff # intel intel-0xa2e intel-0xd26 intel-0xa011 intel-0x3e92 intel-0x3e9b # intel-0x5912 # nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184 @@ -469,21 +469,21 @@ crbug.com/angleproject/4846 [ mac angle-metal passthrough nvidia ] conformance/rendering/more-than-65536-indices.html [ Failure ] # Mac ARM-based DTKs -crbug.com/1130703 [ mac apple-apple-a12z no-passthrough ] conformance/textures/misc/texture-copying-and-deletion.html [ Failure ] -crbug.com/1130703 [ mac apple-apple-a12z no-passthrough ] conformance/textures/misc/texture-copying-feedback-loops.html [ Failure ] +crbug.com/1130703 [ mac apple-apple-m1 no-passthrough ] conformance/textures/misc/texture-copying-and-deletion.html [ Failure ] +crbug.com/1130703 [ mac apple-apple-m1 no-passthrough ] conformance/textures/misc/texture-copying-feedback-loops.html [ Failure ] # TODO(crbug.com/1153984): remove the expectations with the incorrect GPU type for the Metal backend. # finder:disable Want to keep both sets of expectations around until the issue is fixed. -crbug.com/1130758 [ mac apple-apple-a12z ] conformance/extensions/webgl-depth-texture.html [ Failure ] -crbug.com/1130758 [ mac google-angle-(metal-renderer:-apple-a12z) ] conformance/extensions/webgl-depth-texture.html [ Failure ] -crbug.com/1130759 [ mac apple-apple-a12z angle-metal ] conformance/rendering/rendering-stencil-large-viewport.html [ Failure ] -crbug.com/1130759 [ mac google-angle-(metal-renderer:-apple-a12z) angle-metal ] conformance/rendering/rendering-stencil-large-viewport.html [ Failure ] -crbug.com/1130759 [ mac apple-apple-a12z angle-metal ] conformance/textures/misc/texture-mips.html [ Failure ] -crbug.com/1130760 [ mac apple-apple-a12z angle-metal ] conformance/extensions/webgl-draw-buffers.html [ Failure ] -crbug.com/1130760 [ mac google-angle-(metal-renderer:-apple-a12z) angle-metal ] conformance/extensions/webgl-draw-buffers.html [ Failure ] -crbug.com/1130760 [ mac apple-apple-a12z angle-metal ] conformance/ogles/GL/discard/discard_001_to_002.html [ Failure ] -crbug.com/1130760 [ mac google-angle-(metal-renderer:-apple-a12z) angle-metal ] conformance/ogles/GL/discard/discard_001_to_002.html [ Failure ] -crbug.com/1141066 [ mac apple-apple-a12z angle-opengl passthrough ] conformance/textures/misc/texture-copying-and-deletion.html [ Failure ] -crbug.com/1141066 [ mac apple-apple-a12z angle-opengl passthrough ] conformance/textures/misc/texture-copying-feedback-loops.html [ Failure ] +crbug.com/1130758 [ mac apple-apple-m1 ] conformance/extensions/webgl-depth-texture.html [ Failure ] +crbug.com/1130758 [ mac null-metal-renderer:-apple-m1 ] conformance/extensions/webgl-depth-texture.html [ Failure ] +crbug.com/1130759 [ mac apple-apple-m1 angle-metal ] conformance/rendering/rendering-stencil-large-viewport.html [ Failure ] +crbug.com/1130759 [ mac null-metal-renderer:-apple-m1 angle-metal ] conformance/rendering/rendering-stencil-large-viewport.html [ Failure ] +crbug.com/1130759 [ mac apple-apple-m1 angle-metal ] conformance/textures/misc/texture-mips.html [ Failure ] +crbug.com/1130760 [ mac apple-apple-m1 angle-metal ] conformance/extensions/webgl-draw-buffers.html [ Failure ] +crbug.com/1130760 [ mac null-metal-renderer:-apple-m1 angle-metal ] conformance/extensions/webgl-draw-buffers.html [ Failure ] +crbug.com/1130760 [ mac apple-apple-m1 angle-metal ] conformance/ogles/GL/discard/discard_001_to_002.html [ Failure ] +crbug.com/1130760 [ mac null-metal-renderer:-apple-m1 angle-metal ] conformance/ogles/GL/discard/discard_001_to_002.html [ Failure ] +crbug.com/1141066 [ mac apple-apple-m1 angle-opengl passthrough ] conformance/textures/misc/texture-copying-and-deletion.html [ Failure ] +crbug.com/1141066 [ mac apple-apple-m1 angle-opengl passthrough ] conformance/textures/misc/texture-copying-feedback-loops.html [ Failure ] # finder:enable ####################
diff --git a/content/test/gpu/validate_tag_consistency.py b/content/test/gpu/validate_tag_consistency.py index c330bea..f9b2edc 100755 --- a/content/test/gpu/validate_tag_consistency.py +++ b/content/test/gpu/validate_tag_consistency.py
@@ -33,9 +33,9 @@ # release release-x64 ] # GPU # tags: [ amd amd-0x6613 amd-0x679e amd-0x6821 amd-0x7340 -# apple apple-apple-a12z +# apple apple-apple-m1 null-metal-renderer:-apple-m1 # arm -# google google-0xffff google-angle-(metal-renderer:-apple-a12z) +# google google-0xffff # intel intel-0xa2e intel-0xd26 intel-0xa011 intel-0x3e92 intel-0x3e9b # intel-0x5912 # nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184
diff --git a/content/utility/services.cc b/content/utility/services.cc index bb06572..4974ac1 100644 --- a/content/utility/services.cc +++ b/content/utility/services.cc
@@ -7,7 +7,6 @@ #include <utility> #include "base/command_line.h" -#include "base/feature_list.h" #include "base/no_destructor.h" #include "base/threading/thread_task_runner_handle.h" #include "build/branding_buildflags.h" @@ -16,7 +15,7 @@ #include "components/services/storage/public/mojom/storage_service.mojom.h" #include "components/services/storage/storage_service_impl.h" #include "content/child/child_process.h" -#include "content/public/common/content_features.h" +#include "content/public/common/content_switches.h" #include "content/public/utility/content_utility_client.h" #include "content/public/utility/utility_thread.h" #include "device/vr/buildflags/buildflags.h" @@ -176,7 +175,8 @@ #endif #if defined(OS_WIN) - if (base::FeatureList::IsEnabled(features::kAudioProcessHighPriorityWin)) { + if (base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kAudioProcessHighPriority)) { auto success = ::SetPriorityClass(::GetCurrentProcess(), ABOVE_NORMAL_PRIORITY_CLASS); DCHECK(success);
diff --git a/content/web_test/renderer/event_sender.cc b/content/web_test/renderer/event_sender.cc index 485d886..e3af5e1a 100644 --- a/content/web_test/renderer/event_sender.cc +++ b/content/web_test/renderer/event_sender.cc
@@ -1587,7 +1587,7 @@ domKeyString.assign(code_str); domCodeString.assign("Key"); domCodeString.push_back( - base::ToUpperASCII(static_cast<base::char16>(code))); + base::ToUpperASCII(static_cast<char16_t>(code))); } else if (base::IsAsciiDigit(code)) { domKeyString.assign(code_str); domCodeString.assign("Digit");
diff --git a/device/fido/BUILD.gn b/device/fido/BUILD.gn index 4de0869..f56ad5c 100644 --- a/device/fido/BUILD.gn +++ b/device/fido/BUILD.gn
@@ -181,8 +181,6 @@ "platform_credential_store.h", "reset_request_handler.cc", "reset_request_handler.h", - "response_data.cc", - "response_data.h", "set_pin_request_handler.cc", "set_pin_request_handler.h", "u2f_command_constructor.cc",
diff --git a/device/fido/authenticator_get_assertion_response.cc b/device/fido/authenticator_get_assertion_response.cc index ef59c5e..833dbe8 100644 --- a/device/fido/authenticator_get_assertion_response.cc +++ b/device/fido/authenticator_get_assertion_response.cc
@@ -62,16 +62,16 @@ AuthenticatorGetAssertionResponse response(std::move(authenticator_data), std::move(signature)); - response.SetCredential(PublicKeyCredentialDescriptor( - CredentialType::kPublicKey, fido_parsing_utils::Materialize(key_handle))); + response.credential = PublicKeyCredentialDescriptor( + CredentialType::kPublicKey, fido_parsing_utils::Materialize(key_handle)); return std::move(response); } AuthenticatorGetAssertionResponse::AuthenticatorGetAssertionResponse( AuthenticatorData authenticator_data, std::vector<uint8_t> signature) - : authenticator_data_(std::move(authenticator_data)), - signature_(std::move(signature)) {} + : authenticator_data(std::move(authenticator_data)), + signature(std::move(signature)) {} AuthenticatorGetAssertionResponse::AuthenticatorGetAssertionResponse( AuthenticatorGetAssertionResponse&& that) = default; @@ -82,57 +82,4 @@ AuthenticatorGetAssertionResponse::~AuthenticatorGetAssertionResponse() = default; -const std::array<uint8_t, kRpIdHashLength>& -AuthenticatorGetAssertionResponse::GetRpIdHash() const { - return authenticator_data_.application_parameter(); -} - -AuthenticatorGetAssertionResponse& -AuthenticatorGetAssertionResponse::SetCredential( - PublicKeyCredentialDescriptor credential) { - credential_ = std::move(credential); - raw_credential_id_ = credential_->id(); - return *this; -} - -AuthenticatorGetAssertionResponse& -AuthenticatorGetAssertionResponse::SetUserEntity( - PublicKeyCredentialUserEntity user_entity) { - user_entity_ = std::move(user_entity); - return *this; -} - -AuthenticatorGetAssertionResponse& -AuthenticatorGetAssertionResponse::SetNumCredentials(uint8_t num_credentials) { - num_credentials_ = num_credentials; - return *this; -} - -void AuthenticatorGetAssertionResponse::set_large_blob_key( - const base::span<const uint8_t, kLargeBlobKeyLength> large_blob_key) { - large_blob_key_ = fido_parsing_utils::Materialize(large_blob_key); -} - -base::Optional<base::span<const uint8_t>> -AuthenticatorGetAssertionResponse::hmac_secret() const { - if (hmac_secret_) { - return *hmac_secret_; - } - return base::nullopt; -} - -void AuthenticatorGetAssertionResponse::set_hmac_secret( - std::vector<uint8_t> hmac_secret) { - hmac_secret_ = std::move(hmac_secret); -} - -bool AuthenticatorGetAssertionResponse::hmac_secret_not_evaluated() const { - return hmac_secret_not_evaluated_; -} - -void AuthenticatorGetAssertionResponse::set_hmac_secret_not_evaluated( - bool value) { - hmac_secret_not_evaluated_ = value; -} - } // namespace device
diff --git a/device/fido/authenticator_get_assertion_response.h b/device/fido/authenticator_get_assertion_response.h index 93a6c65..8c8be39b 100644 --- a/device/fido/authenticator_get_assertion_response.h +++ b/device/fido/authenticator_get_assertion_response.h
@@ -7,25 +7,28 @@ #include <stdint.h> +#include <array> #include <vector> #include "base/component_export.h" -#include "base/macros.h" #include "base/optional.h" #include "device/fido/authenticator_data.h" #include "device/fido/fido_constants.h" #include "device/fido/public_key_credential_descriptor.h" #include "device/fido/public_key_credential_user_entity.h" -#include "device/fido/response_data.h" namespace device { // Represents response from authenticators for AuthenticatorGetAssertion and // AuthenticatorGetNextAssertion requests. // https://fidoalliance.org/specs/fido-v2.0-rd-20170927/fido-client-to-authenticator-protocol-v2.0-rd-20170927.html#authenticatorGetAssertion -class COMPONENT_EXPORT(DEVICE_FIDO) AuthenticatorGetAssertionResponse - : public ResponseData { +class COMPONENT_EXPORT(DEVICE_FIDO) AuthenticatorGetAssertionResponse { public: + AuthenticatorGetAssertionResponse(const AuthenticatorGetAssertionResponse&) = + delete; + AuthenticatorGetAssertionResponse& operator=( + const AuthenticatorGetAssertionResponse&) = delete; + static base::Optional<AuthenticatorGetAssertionResponse> CreateFromU2fSignResponse( base::span<const uint8_t, kRpIdHashLength> relying_party_id_hash, @@ -37,80 +40,35 @@ AuthenticatorGetAssertionResponse(AuthenticatorGetAssertionResponse&& that); AuthenticatorGetAssertionResponse& operator=( AuthenticatorGetAssertionResponse&& other); - ~AuthenticatorGetAssertionResponse() override; + ~AuthenticatorGetAssertionResponse(); - // ResponseData: - const std::array<uint8_t, kRpIdHashLength>& GetRpIdHash() const override; - - AuthenticatorGetAssertionResponse& SetCredential( - PublicKeyCredentialDescriptor credential); - AuthenticatorGetAssertionResponse& SetUserEntity( - PublicKeyCredentialUserEntity user_entity); - AuthenticatorGetAssertionResponse& SetNumCredentials(uint8_t num_credentials); - - const base::Optional<PublicKeyCredentialDescriptor>& credential() const { - return credential_; - } - const AuthenticatorData& auth_data() const { return authenticator_data_; } - const std::vector<uint8_t>& signature() const { return signature_; } - const base::Optional<PublicKeyCredentialUserEntity>& user_entity() const { - return user_entity_; - } - const base::Optional<uint8_t>& num_credentials() const { - return num_credentials_; - } - - base::Optional<std::array<uint8_t, kLargeBlobKeyLength>> large_blob_key() - const { - return large_blob_key_; - } - void set_large_blob_key( - const base::span<const uint8_t, kLargeBlobKeyLength> large_blob_key); - base::Optional<std::vector<uint8_t>> large_blob() const { - return large_blob_; - } - void set_large_blob(base::Optional<std::vector<uint8_t>> large_blob) { - large_blob_ = std::move(large_blob); - } - bool large_blob_written() const { return large_blob_written_; } - void set_large_blob_written(bool large_blob_written) { - large_blob_written_ = large_blob_written; - } + AuthenticatorData authenticator_data; + base::Optional<PublicKeyCredentialDescriptor> credential; + std::vector<uint8_t> signature; + base::Optional<PublicKeyCredentialUserEntity> user_entity; + base::Optional<uint8_t> num_credentials; // hmac_secret contains the output of the hmac_secret extension. - base::Optional<base::span<const uint8_t>> hmac_secret() const; - void set_hmac_secret(std::vector<uint8_t>); + base::Optional<std::vector<uint8_t>> hmac_secret; // hmac_secret_not_evaluated will be true in cases where the // |FidoAuthenticator| was unable to process the extension, even though it // supports hmac_secret in general. This is intended for a case of Windows, // where some versions of webauthn.dll can only express the extension for // makeCredential, not getAssertion. - bool hmac_secret_not_evaluated() const; - void set_hmac_secret_not_evaluated(bool); - - private: - base::Optional<PublicKeyCredentialDescriptor> credential_; - AuthenticatorData authenticator_data_; - std::vector<uint8_t> signature_; - base::Optional<PublicKeyCredentialUserEntity> user_entity_; - base::Optional<uint8_t> num_credentials_; - base::Optional<std::vector<uint8_t>> hmac_secret_; - bool hmac_secret_not_evaluated_ = false; + bool hmac_secret_not_evaluated = false; // The large blob key associated to the credential. This value is only // returned if the assertion request contains the largeBlobKey extension on a // capable authenticator and the credential has an associated large blob key. - base::Optional<std::array<uint8_t, kLargeBlobKeyLength>> large_blob_key_; + base::Optional<std::array<uint8_t, kLargeBlobKeyLength>> large_blob_key; // The large blob associated with the credential. - base::Optional<std::vector<uint8_t>> large_blob_; + base::Optional<std::vector<uint8_t>> large_blob; // Whether a large blob was successfully written as part of this GetAssertion // request. - bool large_blob_written_ = false; - - DISALLOW_COPY_AND_ASSIGN(AuthenticatorGetAssertionResponse); + bool large_blob_written = false; }; } // namespace device
diff --git a/device/fido/authenticator_make_credential_response.cc b/device/fido/authenticator_make_credential_response.cc index bf92d75..9e66bda 100644 --- a/device/fido/authenticator_make_credential_response.cc +++ b/device/fido/authenticator_make_credential_response.cc
@@ -64,8 +64,7 @@ AuthenticatorMakeCredentialResponse::AuthenticatorMakeCredentialResponse( base::Optional<FidoTransportProtocol> transport_used, AttestationObject attestation_object) - : ResponseData(attestation_object.GetCredentialId()), - attestation_object_(std::move(attestation_object)), + : attestation_object_(std::move(attestation_object)), transport_used_(transport_used) {} AuthenticatorMakeCredentialResponse::AuthenticatorMakeCredentialResponse(
diff --git a/device/fido/authenticator_make_credential_response.h b/device/fido/authenticator_make_credential_response.h index 22d3f7a6..8ed6472 100644 --- a/device/fido/authenticator_make_credential_response.h +++ b/device/fido/authenticator_make_credential_response.h
@@ -17,7 +17,6 @@ #include "device/fido/attestation_object.h" #include "device/fido/fido_constants.h" #include "device/fido/fido_transport_protocol.h" -#include "device/fido/response_data.h" namespace device { @@ -25,8 +24,7 @@ // data, and attestation statement returned by the authenticator as a response // to MakeCredential request. // https://fidoalliance.org/specs/fido-v2.0-rd-20170927/fido-client-to-authenticator-protocol-v2.0-rd-20170927.html#authenticatorMakeCredential -class COMPONENT_EXPORT(DEVICE_FIDO) AuthenticatorMakeCredentialResponse - : public ResponseData { +class COMPONENT_EXPORT(DEVICE_FIDO) AuthenticatorMakeCredentialResponse { public: static base::Optional<AuthenticatorMakeCredentialResponse> CreateFromU2fRegisterResponse( @@ -41,7 +39,7 @@ AuthenticatorMakeCredentialResponse&& that); AuthenticatorMakeCredentialResponse& operator=( AuthenticatorMakeCredentialResponse&& other); - ~AuthenticatorMakeCredentialResponse() override; + ~AuthenticatorMakeCredentialResponse(); std::vector<uint8_t> GetCBOREncodedAttestationObject() const; @@ -60,8 +58,7 @@ // not intended to be trackable.) bool IsAttestationCertificateInappropriatelyIdentifying(); - // ResponseData: - const std::array<uint8_t, kRpIdHashLength>& GetRpIdHash() const override; + const std::array<uint8_t, kRpIdHashLength>& GetRpIdHash() const; const AttestationObject& attestation_object() const { return attestation_object_;
diff --git a/device/fido/cros/authenticator.cc b/device/fido/cros/authenticator.cc index eb093ae..2225dc4e 100644 --- a/device/fido/cros/authenticator.cc +++ b/device/fido/cros/authenticator.cc
@@ -248,9 +248,9 @@ AuthenticatorGetAssertionResponse authenticator_response( std::move(*authenticator_data), std::move(signature)); const std::string& credential_id = assertion.credential_id(); - authenticator_response.SetCredential(PublicKeyCredentialDescriptor( + authenticator_response.credential = PublicKeyCredentialDescriptor( CredentialType::kPublicKey, - std::vector<uint8_t>(credential_id.begin(), credential_id.end()))); + std::vector<uint8_t>(credential_id.begin(), credential_id.end())); std::move(callback).Run(CtapDeviceResponseCode::kSuccess, std::move(authenticator_response)); }
diff --git a/device/fido/ctap_response_unittest.cc b/device/fido/ctap_response_unittest.cc index 8a516b93..c39dd740 100644 --- a/device/fido/ctap_response_unittest.cc +++ b/device/fido/ctap_response_unittest.cc
@@ -499,7 +499,7 @@ certificate.GetArray()[0].GetBytestring(), ::testing::ElementsAreArray(test_data::kCtap2MakeCredentialCertificate)); EXPECT_THAT( - make_credential_response->raw_credential_id(), + make_credential_response->attestation_object().GetCredentialId(), ::testing::ElementsAreArray(test_data::kCtap2MakeCredentialCredentialId)); } @@ -520,14 +520,14 @@ auto get_assertion_response = ReadCTAPGetAssertionResponse( DecodeCBOR(test_data::kDeviceGetAssertionResponse)); ASSERT_TRUE(get_assertion_response); - ASSERT_TRUE(get_assertion_response->num_credentials()); - EXPECT_EQ(*get_assertion_response->num_credentials(), 1u); + ASSERT_TRUE(get_assertion_response->num_credentials); + EXPECT_EQ(*get_assertion_response->num_credentials, 1u); EXPECT_THAT( - get_assertion_response->auth_data().SerializeToByteArray(), + get_assertion_response->authenticator_data.SerializeToByteArray(), ::testing::ElementsAreArray(test_data::kCtap2GetAssertionAuthData)); EXPECT_THAT( - get_assertion_response->signature(), + get_assertion_response->signature, ::testing::ElementsAreArray(test_data::kCtap2GetAssertionSignature)); } @@ -539,7 +539,7 @@ test_data::kApplicationParameter, test_data::kTestU2fRegisterResponse); ASSERT_TRUE(response); - EXPECT_THAT(response->raw_credential_id(), + EXPECT_THAT(response->attestation_object().GetCredentialId(), ::testing::ElementsAreArray(test_data::kU2fSignKeyHandle)); EXPECT_EQ(GetTestAttestationObjectBytes(), response->GetCBOREncodedAttestationObject()); @@ -647,11 +647,11 @@ test_data::kApplicationParameter, GetTestSignResponse(), GetTestCredentialRawIdBytes()); ASSERT_TRUE(response); - EXPECT_EQ(GetTestCredentialRawIdBytes(), response->raw_credential_id()); + EXPECT_EQ(GetTestCredentialRawIdBytes(), response->credential->id()); EXPECT_THAT( - response->auth_data().SerializeToByteArray(), + response->authenticator_data.SerializeToByteArray(), ::testing::ElementsAreArray(test_data::kTestSignAuthenticatorData)); - EXPECT_THAT(response->signature(), + EXPECT_THAT(response->signature, ::testing::ElementsAreArray(test_data::kU2fSignature)); }
diff --git a/device/fido/device_response_converter.cc b/device/fido/device_response_converter.cc index 721599f..d626795 100644 --- a/device/fido/device_response_converter.cc +++ b/device/fido/device_response_converter.cc
@@ -147,7 +147,7 @@ PublicKeyCredentialDescriptor::CreateFromCBORValue(it->second); if (!credential) return base::nullopt; - response.SetCredential(std::move(*credential)); + response.credential = std::move(*credential); } it = response_map.find(CBOR(0x04)); @@ -155,7 +155,7 @@ auto user = PublicKeyCredentialUserEntity::CreateFromCBORValue(it->second); if (!user) return base::nullopt; - response.SetUserEntity(std::move(*user)); + response.user_entity = std::move(*user); } it = response_map.find(CBOR(0x05)); @@ -163,17 +163,21 @@ if (!it->second.is_unsigned()) return base::nullopt; - response.SetNumCredentials(it->second.GetUnsigned()); + response.num_credentials = it->second.GetUnsigned(); } it = response_map.find(CBOR(0x07)); if (it != response_map.end()) { - if (!it->second.is_bytestring() || - it->second.GetBytestring().size() != kLargeBlobKeyLength) { + if (!it->second.is_bytestring()) { return base::nullopt; } - response.set_large_blob_key( - base::make_span<kLargeBlobKeyLength>(it->second.GetBytestring())); + const std::vector<uint8_t>& key = it->second.GetBytestring(); + response.large_blob_key.emplace(); + if (key.size() != response.large_blob_key->size()) { + return base::nullopt; + } + memcpy(response.large_blob_key->data(), key.data(), + response.large_blob_key->size()); } return response;
diff --git a/device/fido/get_assertion_handler_unittest.cc b/device/fido/get_assertion_handler_unittest.cc index 37690ef..3b83766e 100644 --- a/device/fido/get_assertion_handler_unittest.cc +++ b/device/fido/get_assertion_handler_unittest.cc
@@ -345,9 +345,9 @@ EXPECT_EQ(GetAssertionStatus::kSuccess, get_assertion_callback().status()); ASSERT_TRUE(response); ASSERT_EQ(1u, response->size()); - EXPECT_TRUE(response.value()[0].credential()); + EXPECT_TRUE(response.value()[0].credential); EXPECT_THAT( - response.value()[0].raw_credential_id(), + response.value()[0].credential->id(), ::testing::ElementsAreArray(test_data::kTestGetAssertionCredentialId)); } @@ -372,8 +372,8 @@ EXPECT_EQ(GetAssertionStatus::kSuccess, get_assertion_callback().status()); ASSERT_TRUE(response); ASSERT_EQ(1u, response->size()); - ASSERT_TRUE(response.value()[0].user_entity()); - EXPECT_EQ(63u, response.value()[0].user_entity()->name->size()); + ASSERT_TRUE(response.value()[0].user_entity); + EXPECT_EQ(63u, response.value()[0].user_entity->name->size()); } TEST_F(FidoGetAssertionHandlerTest, TruncatedAndInvalidUTF8) {
diff --git a/device/fido/get_assertion_request_handler.cc b/device/fido/get_assertion_request_handler.cc index 3b034a2..55c484a 100644 --- a/device/fido/get_assertion_request_handler.cc +++ b/device/fido/get_assertion_request_handler.cc
@@ -139,12 +139,13 @@ const AuthenticatorGetAssertionResponse& response) { // The underlying code must take care of filling in the credential from the // allow list as needed. - CHECK(response.credential()); + CHECK(response.credential); - if (response.GetRpIdHash() != - fido_parsing_utils::CreateSHA256Hash(request.rp_id) && + const std::array<uint8_t, kRpIdHashLength>& rp_id_hash = + response.authenticator_data.application_parameter(); + if (rp_id_hash != fido_parsing_utils::CreateSHA256Hash(request.rp_id) && (!request.app_id || - response.GetRpIdHash() != request.alternative_application_parameter)) { + rp_id_hash != request.alternative_application_parameter)) { return false; } @@ -157,11 +158,11 @@ // mandatory. // TODO(hongjunchoi) : Add link to section of the CTAP spec once it is // published. - const auto& user_entity = response.user_entity(); + const auto& user_entity = response.user_entity; const bool has_user_identifying_info = user_entity && (user_entity->display_name || user_entity->name || user_entity->icon_url); - if (!response.auth_data().obtained_user_verification() && + if (!response.authenticator_data.obtained_user_verification() && has_user_identifying_info) { return false; } @@ -170,18 +171,18 @@ return false; } - if (response.num_credentials().value_or(0u) > 1 && !user_entity) { + if (response.num_credentials.value_or(0u) > 1 && !user_entity) { return false; } // The authenticatorData on an GetAssertionResponse must not have // attestedCredentialData set. - if (response.auth_data().attested_data().has_value()) { + if (response.authenticator_data.attested_data().has_value()) { return false; } const base::Optional<cbor::Value>& extensions = - response.auth_data().extensions(); + response.authenticator_data.extensions(); if (extensions && !ValidateResponseExtensions(request, options, *extensions)) { FIDO_LOG(ERROR) << "assertion response invalid due to extensions block: " @@ -643,7 +644,7 @@ return; } - const size_t num_responses = response->num_credentials().value_or(1); + const size_t num_responses = response->num_credentials.value_or(1); if (num_responses == 0 || (num_responses > 1 && !request.allow_list.empty())) { std::move(completion_callback_) @@ -756,8 +757,8 @@ DCHECK(authenticator->Options()->supports_large_blobs); std::vector<LargeBlobKey> keys; for (const auto& response : responses_) { - if (response.large_blob_key()) { - keys.emplace_back(*response.large_blob_key()); + if (response.large_blob_key) { + keys.emplace_back(*response.large_blob_key); } } if (!keys.empty()) { @@ -791,10 +792,10 @@ for (auto& response : responses_) { const auto blob = base::ranges::find_if(*blobs, [&response](const auto& pair) { - return pair.first == response.large_blob_key(); + return pair.first == response.large_blob_key; }); if (blob != blobs->end()) { - response.set_large_blob(std::move(blob->second)); + response.large_blob = std::move(blob->second); } } } else { @@ -812,8 +813,8 @@ FIDO_LOG(ERROR) << "Writing large blob failed with code " << static_cast<int>(status); } - responses_.at(0).set_large_blob_written(status == - CtapDeviceResponseCode::kSuccess); + responses_.at(0).large_blob_written = + (status == CtapDeviceResponseCode::kSuccess); std::move(completion_callback_) .Run(GetAssertionStatus::kSuccess, std::move(responses_), authenticator); }
diff --git a/device/fido/get_assertion_task.cc b/device/fido/get_assertion_task.cc index a8e4622..5db360c 100644 --- a/device/fido/get_assertion_task.cc +++ b/device/fido/get_assertion_task.cc
@@ -38,11 +38,11 @@ bool SetResponseCredential( AuthenticatorGetAssertionResponse* response, const std::vector<PublicKeyCredentialDescriptor>& allow_list) { - if (response->credential()) { + if (response->credential) { if (!allow_list.empty() && std::none_of(allow_list.cbegin(), allow_list.cend(), [&response](const auto& credential) { - return credential.id() == response->raw_credential_id(); + return credential.id() == response->credential->id(); })) { return false; } @@ -54,7 +54,7 @@ return false; } - response->SetCredential(allow_list[0]); + response->credential = allow_list[0]; return true; } @@ -278,7 +278,7 @@ // Decrypt any hmac-secret response. const base::Optional<cbor::Value>& extensions_cbor = - response_data->auth_data().extensions(); + response_data->authenticator_data.extensions(); if (extensions_cbor) { // Parsing has already checked that |extensions_cbor| is a map. const cbor::Value::MapValue& extensions = extensions_cbor->GetMap(); @@ -298,7 +298,7 @@ base::nullopt); return; } - response_data->set_hmac_secret(std::move(plaintext.value())); + response_data->hmac_secret = std::move(plaintext.value()); } } } @@ -328,7 +328,7 @@ allow_list_batches_.at(current_allow_list_batch_ - 1))) { CtapGetAssertionRequest request = request_; const PublicKeyCredentialDescriptor& matching_credential = - *response_data->credential(); + *response_data->credential; request.allow_list = {matching_credential}; MaybeSetPRFParameters( &request, GetPRFInputForCredential(options_, matching_credential.id()));
diff --git a/device/fido/get_assertion_task_unittest.cc b/device/fido/get_assertion_task_unittest.cc index 751cb53..9f61825f 100644 --- a/device/fido/get_assertion_task_unittest.cc +++ b/device/fido/get_assertion_task_unittest.cc
@@ -122,19 +122,16 @@ ASSERT_GE(32u + 1u + 4u + 8u, // Minimal ECDSA signature is 8 bytes get_assertion_callback_receiver() .value() - ->auth_data() - .SerializeToByteArray() + ->authenticator_data.SerializeToByteArray() .size()); EXPECT_EQ(0x01, get_assertion_callback_receiver() .value() - ->auth_data() - .SerializeToByteArray()[32]); // UP flag + ->authenticator_data.SerializeToByteArray()[32]); // UP flag // Counter starts at zero and is incremented for every sign request. EXPECT_EQ(1, get_assertion_callback_receiver() .value() - ->auth_data() - .SerializeToByteArray()[36]); // counter + ->authenticator_data.SerializeToByteArray()[36]); // counter } TEST_F(FidoGetAssertionTaskTest, TestIncorrectGetAssertionResponse) {
diff --git a/device/fido/mac/get_assertion_operation.mm b/device/fido/mac/get_assertion_operation.mm index a7c01d15..9b654c3 100644 --- a/device/fido/mac/get_assertion_operation.mm +++ b/device/fido/mac/get_assertion_operation.mm
@@ -95,7 +95,7 @@ } if (empty_allow_list) { - response->SetNumCredentials(credentials->size()); + response->num_credentials = credentials->size(); credentials->pop_front(); matching_credentials_ = std::move(*credentials); } @@ -141,9 +141,9 @@ } AuthenticatorGetAssertionResponse response(std::move(authenticator_data), std::move(*signature)); - response.SetCredential(PublicKeyCredentialDescriptor( - CredentialType::kPublicKey, credential.credential_id)); - response.SetUserEntity(metadata->ToPublicKeyCredentialUserEntity()); + response.credential = PublicKeyCredentialDescriptor( + CredentialType::kPublicKey, credential.credential_id); + response.user_entity = metadata->ToPublicKeyCredentialUserEntity(); return response; }
diff --git a/device/fido/mac/get_assertion_operation_unittest_mac.mm b/device/fido/mac/get_assertion_operation_unittest_mac.mm index b6af4c75..5baa5c5 100644 --- a/device/fido/mac/get_assertion_operation_unittest_mac.mm +++ b/device/fido/mac/get_assertion_operation_unittest_mac.mm
@@ -83,8 +83,8 @@ EXPECT_EQ(CtapDeviceResponseCode::kSuccess, error); auto opt_response = std::move(std::get<1>(result)); ASSERT_TRUE(opt_response); - ASSERT_TRUE(opt_response->credential()); - EXPECT_FALSE(opt_response->credential()->id().empty()); + ASSERT_TRUE(opt_response->credential); + EXPECT_FALSE(opt_response->credential->id().empty()); } } // namespace } // namespace mac
diff --git a/device/fido/make_credential_task_unittest.cc b/device/fido/make_credential_task_unittest.cc index a4e7049..e77469d1 100644 --- a/device/fido/make_credential_task_unittest.cc +++ b/device/fido/make_credential_task_unittest.cc
@@ -95,9 +95,11 @@ // We don't verify the response from the fake, but do a quick sanity check. ASSERT_TRUE(make_credential_callback_receiver().value()); - EXPECT_EQ( - 32u, - make_credential_callback_receiver().value()->raw_credential_id().size()); + EXPECT_EQ(32u, make_credential_callback_receiver() + .value() + ->attestation_object() + .GetCredentialId() + .size()); } TEST_F(FidoMakeCredentialTaskTest, FallbackToU2fRegisterSuccess) {
diff --git a/device/fido/response_data.cc b/device/fido/response_data.cc deleted file mode 100644 index 9a6312b5..0000000 --- a/device/fido/response_data.cc +++ /dev/null
@@ -1,35 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "device/fido/response_data.h" - -#include <utility> - -#include "base/base64url.h" -#include "base/strings/string_piece.h" -#include "device/fido/fido_parsing_utils.h" - -namespace device { - -ResponseData::~ResponseData() = default; - -ResponseData::ResponseData() = default; - -ResponseData::ResponseData(std::vector<uint8_t> raw_credential_id) - : raw_credential_id_(std::move(raw_credential_id)) {} - -ResponseData::ResponseData(ResponseData&& other) = default; - -ResponseData& ResponseData::operator=(ResponseData&& other) = default; - -std::string ResponseData::GetId() const { - std::string id; - base::Base64UrlEncode(base::StringPiece(reinterpret_cast<const char*>( - raw_credential_id_.data()), - raw_credential_id_.size()), - base::Base64UrlEncodePolicy::OMIT_PADDING, &id); - return id; -} - -} // namespace device
diff --git a/device/fido/response_data.h b/device/fido/response_data.h deleted file mode 100644 index 0d9728c7..0000000 --- a/device/fido/response_data.h +++ /dev/null
@@ -1,51 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef DEVICE_FIDO_RESPONSE_DATA_H_ -#define DEVICE_FIDO_RESPONSE_DATA_H_ - -#include <stdint.h> - -#include <array> -#include <memory> -#include <string> -#include <vector> - -#include "base/component_export.h" -#include "base/macros.h" -#include "device/fido/fido_constants.h" - -namespace device { - -// Base class for AuthenticatorMakeCredentialResponse and -// AuthenticatorGetAssertionResponse. -class COMPONENT_EXPORT(DEVICE_FIDO) ResponseData { - public: - virtual ~ResponseData(); - - virtual const std::array<uint8_t, kRpIdHashLength>& GetRpIdHash() const = 0; - - std::string GetId() const; - - const std::vector<uint8_t>& raw_credential_id() const { - return raw_credential_id_; - } - - protected: - explicit ResponseData(std::vector<uint8_t> raw_credential_id); - ResponseData(); - - // Moveable. - ResponseData(ResponseData&& other); - ResponseData& operator=(ResponseData&& other); - - std::vector<uint8_t> raw_credential_id_; - - private: - DISALLOW_COPY_AND_ASSIGN(ResponseData); -}; - -} // namespace device - -#endif // DEVICE_FIDO_RESPONSE_DATA_H_
diff --git a/device/fido/u2f_register_operation_unittest.cc b/device/fido/u2f_register_operation_unittest.cc index 2ac49ac..14de7d0 100644 --- a/device/fido/u2f_register_operation_unittest.cc +++ b/device/fido/u2f_register_operation_unittest.cc
@@ -89,7 +89,10 @@ EXPECT_EQ(CtapDeviceResponseCode::kSuccess, register_callback_receiver().status()); ASSERT_TRUE(register_callback_receiver().value()); - EXPECT_THAT(register_callback_receiver().value()->raw_credential_id(), + EXPECT_THAT(register_callback_receiver() + .value() + ->attestation_object() + .GetCredentialId(), ::testing::ElementsAreArray(test_data::kU2fSignKeyHandle)); } @@ -107,8 +110,11 @@ register_callback_receiver().status()); // We don't verify the response from the fake, but do a quick sanity check. ASSERT_TRUE(register_callback_receiver().value()); - EXPECT_EQ(32ul, - register_callback_receiver().value()->raw_credential_id().size()); + EXPECT_EQ(32ul, register_callback_receiver() + .value() + ->attestation_object() + .GetCredentialId() + .size()); } TEST_F(U2fRegisterOperationTest, TestDelayedSuccess) { @@ -137,7 +143,10 @@ EXPECT_EQ(CtapDeviceResponseCode::kSuccess, register_callback_receiver().status()); ASSERT_TRUE(register_callback_receiver().value()); - EXPECT_THAT(register_callback_receiver().value()->raw_credential_id(), + EXPECT_THAT(register_callback_receiver() + .value() + ->attestation_object() + .GetCredentialId(), ::testing::ElementsAreArray(test_data::kU2fSignKeyHandle)); } @@ -182,7 +191,10 @@ ASSERT_TRUE(register_callback_receiver().value()); EXPECT_EQ(CtapDeviceResponseCode::kSuccess, register_callback_receiver().status()); - EXPECT_THAT(register_callback_receiver().value()->raw_credential_id(), + EXPECT_THAT(register_callback_receiver() + .value() + ->attestation_object() + .GetCredentialId(), ::testing::ElementsAreArray(test_data::kU2fSignKeyHandle)); } @@ -264,7 +276,7 @@ EXPECT_EQ(CtapDeviceResponseCode::kSuccess, cb.status()); ASSERT_TRUE(cb.value()); - EXPECT_THAT(cb.value()->raw_credential_id(), + EXPECT_THAT(cb.value()->attestation_object().GetCredentialId(), ::testing::ElementsAreArray(test_data::kU2fSignKeyHandle)); } }
diff --git a/device/fido/u2f_sign_operation_unittest.cc b/device/fido/u2f_sign_operation_unittest.cc index 7ee2030..cc556d0 100644 --- a/device/fido/u2f_sign_operation_unittest.cc +++ b/device/fido/u2f_sign_operation_unittest.cc
@@ -73,9 +73,9 @@ sign_callback_receiver().WaitForCallback(); EXPECT_EQ(CtapDeviceResponseCode::kSuccess, sign_callback_receiver().status()); - EXPECT_THAT(sign_callback_receiver().value()->signature(), + EXPECT_THAT(sign_callback_receiver().value()->signature, ::testing::ElementsAreArray(test_data::kU2fSignature)); - EXPECT_THAT(sign_callback_receiver().value()->raw_credential_id(), + EXPECT_THAT(sign_callback_receiver().value()->credential->id(), ::testing::ElementsAreArray(test_data::kU2fSignKeyHandle)); } @@ -100,19 +100,16 @@ ASSERT_GE(32u + 1u + 4u + 8u, // Minimal ECDSA signature is 8 bytes sign_callback_receiver() .value() - ->auth_data() - .SerializeToByteArray() + ->authenticator_data.SerializeToByteArray() .size()); EXPECT_EQ(0x01, sign_callback_receiver() .value() - ->auth_data() - .SerializeToByteArray()[32]); // UP flag + ->authenticator_data.SerializeToByteArray()[32]); // UP flag // Counter starts at zero and is incremented for every sign request. EXPECT_EQ(1, sign_callback_receiver() .value() - ->auth_data() - .SerializeToByteArray()[36]); // counter + ->authenticator_data.SerializeToByteArray()[36]); // counter } TEST_F(U2fSignOperationTest, DelayedSuccess) { @@ -140,9 +137,9 @@ sign_callback_receiver().WaitForCallback(); EXPECT_EQ(CtapDeviceResponseCode::kSuccess, sign_callback_receiver().status()); - EXPECT_THAT(sign_callback_receiver().value()->signature(), + EXPECT_THAT(sign_callback_receiver().value()->signature, ::testing::ElementsAreArray(test_data::kU2fSignature)); - EXPECT_THAT(sign_callback_receiver().value()->raw_credential_id(), + EXPECT_THAT(sign_callback_receiver().value()->credential->id(), ::testing::ElementsAreArray(test_data::kU2fSignKeyHandle)); } @@ -175,9 +172,9 @@ sign_callback_receiver().WaitForCallback(); EXPECT_EQ(CtapDeviceResponseCode::kSuccess, sign_callback_receiver().status()); - EXPECT_THAT(sign_callback_receiver().value()->signature(), + EXPECT_THAT(sign_callback_receiver().value()->signature, ::testing::ElementsAreArray(test_data::kU2fSignature)); - EXPECT_THAT(sign_callback_receiver().value()->raw_credential_id(), + EXPECT_THAT(sign_callback_receiver().value()->credential->id(), ::testing::ElementsAreArray(test_data::kU2fSignKeyHandle)); } @@ -208,9 +205,9 @@ sign_callback_receiver().WaitForCallback(); EXPECT_EQ(CtapDeviceResponseCode::kSuccess, sign_callback_receiver().status()); - EXPECT_THAT(sign_callback_receiver().value()->signature(), + EXPECT_THAT(sign_callback_receiver().value()->signature, ::testing::ElementsAreArray(test_data::kU2fSignature)); - EXPECT_THAT(sign_callback_receiver().value()->raw_credential_id(), + EXPECT_THAT(sign_callback_receiver().value()->credential->id(), ::testing::ElementsAreArray(test_data::kU2fSignKeyHandle)); } @@ -351,11 +348,11 @@ EXPECT_EQ(CtapDeviceResponseCode::kSuccess, sign_callback_receiver().status()); const auto& response_value = sign_callback_receiver().value(); - EXPECT_THAT(response_value->signature(), + EXPECT_THAT(response_value->signature, ::testing::ElementsAreArray(test_data::kU2fSignature)); - EXPECT_THAT(response_value->raw_credential_id(), + EXPECT_THAT(response_value->credential->id(), ::testing::ElementsAreArray(test_data::kU2fSignKeyHandle)); - EXPECT_THAT(response_value->GetRpIdHash(), + EXPECT_THAT(response_value->authenticator_data.application_parameter(), ::testing::ElementsAreArray(base::span<const uint8_t, 32>( test_data::kAlternativeApplicationParameter))); }
diff --git a/device/fido/virtual_ctap2_device.cc b/device/fido/virtual_ctap2_device.cc index b486537f..58d51e1 100644 --- a/device/fido/virtual_ctap2_device.cc +++ b/device/fido/virtual_ctap2_device.cc
@@ -411,22 +411,22 @@ const AuthenticatorGetAssertionResponse& response, bool allow_invalid_utf8) { cbor::Value::MapValue response_map; - if (response.credential()) { - response_map.emplace(1, AsCBOR(*response.credential())); + if (response.credential) { + response_map.emplace(1, AsCBOR(*response.credential)); } - response_map.emplace(2, response.auth_data().SerializeToByteArray()); - response_map.emplace(3, response.signature()); + response_map.emplace(2, response.authenticator_data.SerializeToByteArray()); + response_map.emplace(3, response.signature); - if (response.user_entity()) { + if (response.user_entity) { response_map.emplace( - 4, *UserEntityAsCBOR(*response.user_entity(), allow_invalid_utf8)); + 4, *UserEntityAsCBOR(*response.user_entity, allow_invalid_utf8)); } - if (response.num_credentials()) { - response_map.emplace(5, response.num_credentials().value()); + if (response.num_credentials) { + response_map.emplace(5, response.num_credentials.value()); } - if (response.large_blob_key()) { - response_map.emplace(0x07, cbor::Value(*response.large_blob_key())); + if (response.large_blob_key) { + response_map.emplace(0x07, cbor::Value(*response.large_blob_key)); } return WriteCBOR(cbor::Value(std::move(response_map)), allow_invalid_utf8); @@ -1479,13 +1479,13 @@ } if (include_credential) { - assertion.SetCredential( - {CredentialType::kPublicKey, - fido_parsing_utils::Materialize(registration.first)}); + assertion.credential = PublicKeyCredentialDescriptor( + CredentialType::kPublicKey, + fido_parsing_utils::Materialize(registration.first)); } if (registration.second->is_resident) { - assertion.SetUserEntity(registration.second->user.value()); + assertion.user_entity = registration.second->user.value(); } if (request.large_blob_key) { @@ -1493,14 +1493,14 @@ return CtapDeviceResponseCode::kCtap2ErrUnsupportedExtension; } if (registration.second->large_blob_key) { - assertion.set_large_blob_key(*registration.second->large_blob_key); + assertion.large_blob_key = *registration.second->large_blob_key; } } if (!done_first) { if (found_registrations.size() > 1) { DCHECK_LT(found_registrations.size(), 256u); - assertion.SetNumCredentials(found_registrations.size()); + assertion.num_credentials = found_registrations.size(); } *response = EncodeGetAssertionResponse( assertion, config_.allow_invalid_utf8_in_credential_entities);
diff --git a/device/fido/win/type_conversions.cc b/device/fido/win/type_conversions.cc index 5780615..cad10b6 100644 --- a/device/fido/win/type_conversions.cc +++ b/device/fido/win/type_conversions.cc
@@ -96,14 +96,14 @@ std::move(*authenticator_data), std::vector<uint8_t>(assertion.pbSignature, assertion.pbSignature + assertion.cbSignature)); - response.SetCredential(PublicKeyCredentialDescriptor( + response.credential = PublicKeyCredentialDescriptor( CredentialType::kPublicKey, std::vector<uint8_t>( assertion.Credential.pbId, - assertion.Credential.pbId + assertion.Credential.cbId))); + assertion.Credential.pbId + assertion.Credential.cbId)); if (assertion.cbUserId > 0) { - response.SetUserEntity(PublicKeyCredentialUserEntity(std::vector<uint8_t>( - assertion.pbUserId, assertion.pbUserId + assertion.cbUserId))); + response.user_entity = PublicKeyCredentialUserEntity(std::vector<uint8_t>( + assertion.pbUserId, assertion.pbUserId + assertion.cbUserId)); } return response; }
diff --git a/device/fido/win/webauthn_api.cc b/device/fido/win/webauthn_api.cc index 1784045..7950224f 100644 --- a/device/fido/win/webauthn_api.cc +++ b/device/fido/win/webauthn_api.cc
@@ -458,7 +458,7 @@ ToAuthenticatorGetAssertionResponse(*assertion, request.allow_list); if (response && !request_options.prf_inputs.empty()) { // Windows does not yet support passing in inputs for hmac_secret. - response->set_hmac_secret_not_evaluated(true); + response->hmac_secret_not_evaluated = true; } return {response ? CtapDeviceResponseCode::kSuccess : CtapDeviceResponseCode::kCtap2ErrOther,
diff --git a/device/gamepad/public/cpp/gamepad.h b/device/gamepad/public/cpp/gamepad.h index 3477d3d..36c54cd 100644 --- a/device/gamepad/public/cpp/gamepad.h +++ b/device/gamepad/public/cpp/gamepad.h
@@ -120,7 +120,7 @@ bool connected; // Device identifier (based on manufacturer, model, etc.). - base::char16 id[kIdLengthCap]; + char16_t id[kIdLengthCap]; // Time value representing the last time the data for this gamepad was // updated. Measured as TimeTicks::Now().since_origin().InMicroseconds().
diff --git a/device/gamepad/public/cpp/gamepad_mojom_traits_unittest.cc b/device/gamepad/public/cpp/gamepad_mojom_traits_unittest.cc index ebfe28f9..12e944f 100644 --- a/device/gamepad/public/cpp/gamepad_mojom_traits_unittest.cc +++ b/device/gamepad/public/cpp/gamepad_mojom_traits_unittest.cc
@@ -55,9 +55,9 @@ wgp.angular_acceleration = wgv; } - constexpr base::char16 kTestIdString[] = {L'M', L'o', L'c', L'k', L'S', - L't', L'i', L'c', L'k', L' ', - L'3', L'0', L'0', L'0', L'\0'}; + constexpr char16_t kTestIdString[] = {L'M', L'o', L'c', L'k', L'S', + L't', L'i', L'c', L'k', L' ', + L'3', L'0', L'0', L'0', L'\0'}; constexpr size_t kTestIdStringLength = base::size(kTestIdString); Gamepad send;
diff --git a/extensions/browser/api/execute_code_function.h b/extensions/browser/api/execute_code_function.h index 05e45ce..d084c277 100644 --- a/extensions/browser/api/execute_code_function.h +++ b/extensions/browser/api/execute_code_function.h
@@ -10,7 +10,7 @@ #include "extensions/browser/extension_function.h" #include "extensions/browser/script_executor.h" #include "extensions/common/api/extension_types.h" -#include "extensions/common/host_id.h" +#include "extensions/common/mojom/host_id.mojom.h" namespace extensions { @@ -57,8 +57,8 @@ bool success, std::unique_ptr<std::string> data); - const HostID& host_id() const { return host_id_; } - void set_host_id(const HostID& host_id) { host_id_ = host_id; } + const mojom::HostID& host_id() const { return host_id_; } + void set_host_id(const mojom::HostID& host_id) { host_id_ = host_id; } InitResult set_init_result(InitResult init_result) { init_result_ = init_result; @@ -91,7 +91,7 @@ GURL script_url_; // The ID of the injection host. - HostID host_id_; + mojom::HostID host_id_; // The ID of the root frame to inject into. int root_frame_id_ = -1;
diff --git a/extensions/browser/api/guest_view/web_view/web_view_internal_api.cc b/extensions/browser/api/guest_view/web_view/web_view_internal_api.cc index 77a1909..b8b1ec35 100644 --- a/extensions/browser/api/guest_view/web_view/web_view_internal_api.cc +++ b/extensions/browser/api/guest_view/web_view/web_view_internal_api.cc
@@ -85,17 +85,21 @@ return 0; } -HostID GenerateHostIDFromEmbedder(const extensions::Extension* extension, - content::WebContents* web_contents) { - if (extension) - return HostID(HostID::EXTENSIONS, extension->id()); +extensions::mojom::HostID GenerateHostIDFromEmbedder( + const extensions::Extension* extension, + content::WebContents* web_contents) { + if (extension) { + return extensions::mojom::HostID( + extensions::mojom::HostID::HostType::kExtensions, extension->id()); + } if (web_contents && web_contents->GetWebUI()) { const GURL& url = web_contents->GetSiteInstance()->GetSiteURL(); - return HostID(HostID::WEBUI, url.spec()); + return extensions::mojom::HostID( + extensions::mojom::HostID::HostType::kWebUi, url.spec()); } NOTREACHED(); - return HostID(); + return extensions::mojom::HostID(); } // Creates content script files when parsing InjectionItems of "js" or "css" @@ -238,7 +242,7 @@ std::unique_ptr<extensions::UserScriptList> ParseContentScripts( const std::vector<ContentScriptDetails>& content_script_list, const extensions::Extension* extension, - const HostID& host_id, + const extensions::mojom::HostID& host_id, bool incognito_enabled, const GURL& owner_base_url, std::string* error) { @@ -415,14 +419,16 @@ details_ = std::move(details); if (extension()) { - set_host_id(HostID(HostID::EXTENSIONS, extension()->id())); + set_host_id(extensions::mojom::HostID( + extensions::mojom::HostID::HostType::kExtensions, extension()->id())); return set_init_result(SUCCESS); } WebContents* web_contents = GetSenderWebContents(); if (web_contents && web_contents->GetWebUI()) { const GURL& url = render_frame_host()->GetSiteInstance()->GetSiteURL(); - set_host_id(HostID(HostID::WEBUI, url.spec())); + set_host_id(extensions::mojom::HostID( + extensions::mojom::HostID::HostType::kWebUi, url.spec())); return set_init_result(SUCCESS); } return set_init_result_error(""); // TODO(lazyboy): error? @@ -464,7 +470,7 @@ WebUIURLFetcher::WebUILoadFileCallback callback) { WebViewGuest* guest = WebViewGuest::From(source_process_id(), guest_instance_id_); - if (!guest || host_id().type() != HostID::WEBUI) + if (!guest || host_id().type != mojom::HostID::HostType::kWebUi) return false; GURL owner_base_url(guest->GetOwnerSiteURL().GetWithEmptyPath()); @@ -523,7 +529,8 @@ GURL owner_base_url( render_frame_host()->GetSiteInstance()->GetSiteURL().GetWithEmptyPath()); content::WebContents* sender_web_contents = GetSenderWebContents(); - HostID host_id = GenerateHostIDFromEmbedder(extension(), sender_web_contents); + extensions::mojom::HostID host_id = + GenerateHostIDFromEmbedder(extension(), sender_web_contents); bool incognito_enabled = browser_context()->IsOffTheRecord(); std::string error; @@ -565,7 +572,8 @@ DCHECK(manager); content::WebContents* sender_web_contents = GetSenderWebContents(); - HostID host_id = GenerateHostIDFromEmbedder(extension(), sender_web_contents); + extensions::mojom::HostID host_id = + GenerateHostIDFromEmbedder(extension(), sender_web_contents); std::vector<std::string> script_name_list; if (params->script_name_list)
diff --git a/extensions/browser/api/messaging/extension_message_port.cc b/extensions/browser/api/messaging/extension_message_port.cc index fc89cf6a..2c70791b 100644 --- a/extensions/browser/api/messaging/extension_message_port.cc +++ b/extensions/browser/api/messaging/extension_message_port.cc
@@ -151,9 +151,11 @@ ExtensionMessagePort::ExtensionMessagePort( base::WeakPtr<ChannelDelegate> channel_delegate, const PortId& port_id, + const ExtensionId& extension_id, content::BrowserContext* browser_context) : weak_channel_delegate_(channel_delegate), port_id_(port_id), + extension_id_(extension_id), browser_context_(browser_context) {} // static @@ -172,7 +174,9 @@ // NOTE: We don't want all the workers within the extension, so we cannot // reuse other constructor from above. std::unique_ptr<ExtensionMessagePort> port(new ExtensionMessagePort( - channel_delegate, port_id, endpoint.browser_context())); + channel_delegate, port_id, extension_id, endpoint.browser_context())); + port->frame_tracker_ = std::make_unique<FrameTracker>(port.get()); + port->frame_tracker_->TrackExtensionProcessFrames(); port->RegisterWorker(endpoint.GetWorkerId()); return port; }
diff --git a/extensions/browser/api/messaging/extension_message_port.h b/extensions/browser/api/messaging/extension_message_port.h index ea99914..8bb220c 100644 --- a/extensions/browser/api/messaging/extension_message_port.h +++ b/extensions/browser/api/messaging/extension_message_port.h
@@ -93,6 +93,7 @@ ExtensionMessagePort(base::WeakPtr<ChannelDelegate> channel_delegate, const PortId& port_id, + const ExtensionId& extension_id, content::BrowserContext* browser_context); // Registers a frame as a receiver / sender.
diff --git a/extensions/browser/api/messaging/message_service.h b/extensions/browser/api/messaging/message_service.h index c09fbb66..e5067313 100644 --- a/extensions/browser/api/messaging/message_service.h +++ b/extensions/browser/api/messaging/message_service.h
@@ -117,6 +117,9 @@ const PortContext& port_context, bool force_close); + // Returns the number of open channels for test. + size_t GetChannelCountForTest() { return channels_.size(); } + base::WeakPtr<MessagePort::ChannelDelegate> GetChannelDelegate() { return weak_factory_.GetWeakPtr(); }
diff --git a/extensions/browser/extension_user_script_loader.cc b/extensions/browser/extension_user_script_loader.cc index 8525ed70..b5ebd28 100644 --- a/extensions/browser/extension_user_script_loader.cc +++ b/extensions/browser/extension_user_script_loader.cc
@@ -89,7 +89,7 @@ } // Loads user scripts from the extension who owns these scripts. -bool LoadScriptContent(const HostID& host_id, +bool LoadScriptContent(const mojom::HostID& host_id, UserScript::File* script_file, const base::Optional<int>& script_resource_id, const SubstitutionMap* localization_messages, @@ -123,7 +123,7 @@ FROM_HERE, base::BindOnce( &ForwardVerifyContentToIO, - VerifyContentInfo(verifier, host_id.id(), + VerifyContentInfo(verifier, host_id.id, script_file->extension_root(), script_file->relative_path(), content))); } @@ -151,13 +151,13 @@ SubstitutionMap* GetLocalizationMessages( const ExtensionUserScriptLoader::HostsInfo& hosts_info, - const HostID& host_id) { + const mojom::HostID& host_id) { auto iter = hosts_info.find(host_id); if (iter == hosts_info.end()) return nullptr; const ExtensionUserScriptLoader::PathAndLocaleInfo& info = iter->second; return file_util::LoadMessageBundleSubstitutionMap( - info.file_path, host_id.id(), info.default_locale, info.gzip_permission); + info.file_path, host_id.id, info.default_locale, info.gzip_permission); } void FillScriptFileResourceIds(const UserScript::FileList& script_files, @@ -246,8 +246,9 @@ const ExtensionId& extension_id, bool listen_for_extension_system_loaded, scoped_refptr<ContentVerifier> content_verifier) - : UserScriptLoader(browser_context, - HostID(HostID::EXTENSIONS, extension_id)), + : UserScriptLoader( + browser_context, + mojom::HostID(mojom::HostID::HostType::kExtensions, extension_id)), content_verifier_(std::move(content_verifier)) { extension_registry_observer_.Add(ExtensionRegistry::Get(browser_context)); if (listen_for_extension_system_loaded) { @@ -270,7 +271,7 @@ for (const std::unique_ptr<UserScript>& script : *user_scripts) added_script_ids.insert(script->id()); - std::set<HostID> changed_hosts; + std::set<mojom::HostID> changed_hosts; std::unique_ptr<UserScriptList> result; // Block until the scripts have been loaded on the file task runner so that @@ -293,7 +294,7 @@ void ExtensionUserScriptLoader::LoadScripts( std::unique_ptr<UserScriptList> user_scripts, - const std::set<HostID>& changed_hosts, + const std::set<mojom::HostID>& changed_hosts, const std::set<std::string>& added_script_ids, LoadScriptsCallback callback) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); @@ -316,11 +317,11 @@ } void ExtensionUserScriptLoader::UpdateHostsInfo( - const std::set<HostID>& changed_hosts) { + const std::set<mojom::HostID>& changed_hosts) { ExtensionRegistry* registry = ExtensionRegistry::Get(browser_context()); - for (const HostID& host_id : changed_hosts) { + for (const mojom::HostID& host_id : changed_hosts) { const Extension* extension = - registry->GetExtensionById(host_id.id(), ExtensionRegistry::ENABLED); + registry->GetExtensionById(host_id.id, ExtensionRegistry::ENABLED); // |changed_hosts_| may include hosts that have been removed, // which leads to the above lookup failing. In this case, just continue. if (!extension) @@ -338,7 +339,8 @@ content::BrowserContext* browser_context, const Extension* extension, UnloadedExtensionReason reason) { - hosts_info_.erase(HostID(HostID::EXTENSIONS, extension->id())); + hosts_info_.erase( + mojom::HostID(mojom::HostID::HostType::kExtensions, extension->id())); } void ExtensionUserScriptLoader::OnExtensionSystemReady() {
diff --git a/extensions/browser/extension_user_script_loader.h b/extensions/browser/extension_user_script_loader.h index 2872a7af..a24ed8d 100644 --- a/extensions/browser/extension_user_script_loader.h +++ b/extensions/browser/extension_user_script_loader.h
@@ -11,6 +11,7 @@ #include "extensions/browser/user_script_loader.h" #include "extensions/common/extension.h" #include "extensions/common/extension_l10n_util.h" +#include "extensions/common/mojom/host_id.mojom.h" namespace content { class BrowserContext; @@ -29,7 +30,7 @@ std::string default_locale; extension_l10n_util::GzippedMessagesPermission gzip_permission; }; - using HostsInfo = std::map<HostID, PathAndLocaleInfo>; + using HostsInfo = std::map<mojom::HostID, PathAndLocaleInfo>; // The listen_for_extension_system_loaded is only set true when initializing // the Extension System, e.g, when constructs UserScriptManager in @@ -52,13 +53,13 @@ private: // UserScriptLoader: void LoadScripts(std::unique_ptr<UserScriptList> user_scripts, - const std::set<HostID>& changed_hosts, + const std::set<mojom::HostID>& changed_hosts, const std::set<std::string>& added_script_ids, LoadScriptsCallback callback) override; // Updates |hosts_info_| to contain info for each element of // |changed_hosts_|. - void UpdateHostsInfo(const std::set<HostID>& changed_hosts); + void UpdateHostsInfo(const std::set<mojom::HostID>& changed_hosts); // ExtensionRegistryObserver: void OnExtensionUnloaded(content::BrowserContext* browser_context,
diff --git a/extensions/browser/guest_view/web_view/web_view_content_script_manager.cc b/extensions/browser/guest_view/web_view/web_view_content_script_manager.cc index bc62249f..f02d805 100644 --- a/extensions/browser/guest_view/web_view/web_view_content_script_manager.cc +++ b/extensions/browser/guest_view/web_view/web_view_content_script_manager.cc
@@ -18,6 +18,7 @@ #include "extensions/browser/guest_view/web_view/web_view_renderer_state.h" #include "extensions/browser/user_script_loader.h" #include "extensions/browser/user_script_manager.h" +#include "extensions/common/mojom/host_id.mojom.h" using content::BrowserThread; @@ -49,7 +50,7 @@ int embedder_process_id, content::RenderFrameHost* render_frame_host, int view_instance_id, - const HostID& host_id, + const mojom::HostID& host_id, std::unique_ptr<UserScriptList> scripts) { DCHECK_CURRENTLY_ON(BrowserThread::UI); @@ -138,7 +139,7 @@ void WebViewContentScriptManager::RemoveContentScripts( int embedder_process_id, int view_instance_id, - const HostID& host_id, + const mojom::HostID& host_id, const std::vector<std::string>& script_name_list) { DCHECK_CURRENTLY_ON(BrowserThread::UI);
diff --git a/extensions/browser/guest_view/web_view/web_view_content_script_manager.h b/extensions/browser/guest_view/web_view/web_view_content_script_manager.h index 2ac2618..9ee9978 100644 --- a/extensions/browser/guest_view/web_view/web_view_content_script_manager.h +++ b/extensions/browser/guest_view/web_view/web_view_content_script_manager.h
@@ -14,8 +14,7 @@ #include "base/macros.h" #include "base/supports_user_data.h" #include "extensions/browser/user_script_loader.h" - -struct HostID; +#include "extensions/common/mojom/host_id.mojom-forward.h" namespace content { class BrowserContext; @@ -41,7 +40,7 @@ void AddContentScripts(int embedder_process_id, content::RenderFrameHost* render_frame_host, int view_instance_id, - const HostID& host_id, + const mojom::HostID& host_id, std::unique_ptr<UserScriptList> user_scripts); // Removes all content scripts for the WebView identified by @@ -55,7 +54,7 @@ // for this WebView. void RemoveContentScripts(int embedder_process_id, int view_instance_id, - const HostID& host_id, + const mojom::HostID& host_id, const std::vector<std::string>& script_name_list); // Returns the content script IDs added by the WebView specified by @@ -87,7 +86,7 @@ // one webview) to that webview's host ID. All webviews that have content // scripts registered through this WebViewContentScriptManager will have an // entry in this map. - std::map<GuestMapKey, HostID> webview_host_id_map_; + std::map<GuestMapKey, mojom::HostID> webview_host_id_map_; GuestContentScriptMap guest_content_script_map_;
diff --git a/extensions/browser/script_executor.cc b/extensions/browser/script_executor.cc index e64fa6a..f023869f 100644 --- a/extensions/browser/script_executor.cc +++ b/extensions/browser/script_executor.cc
@@ -19,6 +19,7 @@ #include "extensions/browser/extension_registry.h" #include "extensions/browser/url_loader_factory_manager.h" #include "extensions/common/extension_messages.h" +#include "extensions/common/mojom/host_id.mojom.h" #include "ipc/ipc_message.h" #include "ipc/ipc_message_macros.h" @@ -35,12 +36,12 @@ // "<type><host_id><digest>", where <type> is one of "F" (file) and "C" (code), // <host_id> is the host ID, and <digest> is an unspecified hash digest of the // file URL or the code string, respectively. -const std::string GenerateInjectionKey(const HostID& host_id, +const std::string GenerateInjectionKey(const mojom::HostID& host_id, const GURL& script_url, const std::string& code) { const std::string& source = script_url.is_valid() ? script_url.spec() : code; return base::StringPrintf("%c%s%zu", script_url.is_valid() ? 'F' : 'C', - host_id.id().c_str(), base::FastHash(source)); + host_id.id.c_str(), base::FastHash(source)); } // A handler for a single injection request. On creation this will send the @@ -233,8 +234,8 @@ }); DCHECK(root_frame_result != results_.end()); if (root_frame_result->error.empty() && - host_id_.type() == HostID::EXTENSIONS) { - std::move(observer_).Run(web_contents(), {{host_id_.id(), {}}}, + host_id_.type == mojom::HostID::HostType::kExtensions) { + std::move(observer_).Run(web_contents(), {{host_id_.id, {}}}, root_frame_result->url); } } @@ -248,7 +249,7 @@ ScriptsExecutedOnceCallback observer_; // The id of the host (the extension or the webui) doing the injection. - HostID host_id_; + mojom::HostID host_id_; // The request id of the injection. int request_id_ = 0; @@ -289,7 +290,7 @@ ScriptExecutor::~ScriptExecutor() {} -void ScriptExecutor::ExecuteScript(const HostID& host_id, +void ScriptExecutor::ExecuteScript(const mojom::HostID& host_id, mojom::ActionType action_type, const std::string& code, ScriptExecutor::FrameScope frame_scope, @@ -303,11 +304,12 @@ mojom::CSSOrigin css_origin, ScriptExecutor::ResultType result_type, ScriptFinishedCallback callback) { - if (host_id.type() == HostID::EXTENSIONS) { + if (host_id.type == mojom::HostID::HostType::kExtensions) { // Don't execute if the extension has been unloaded. const Extension* extension = ExtensionRegistry::Get(web_contents_->GetBrowserContext()) - ->enabled_extensions().GetByID(host_id.id()); + ->enabled_extensions() + .GetByID(host_id.id); if (!extension) return; } else { @@ -330,7 +332,7 @@ // Generate the unique key that represents this CSS injection or removal // from an extension (i.e. tabs.insertCSS or tabs.removeCSS). - if (host_id.type() == HostID::EXTENSIONS && + if (host_id.type == mojom::HostID::HostType::kExtensions && (action_type == mojom::ActionType::kAddCss || action_type == mojom::ActionType::kRemoveCss)) params.injection_key = GenerateInjectionKey(host_id, script_url, code);
diff --git a/extensions/browser/script_executor.h b/extensions/browser/script_executor.h index 1ce6f6c..2abf990 100644 --- a/extensions/browser/script_executor.h +++ b/extensions/browser/script_executor.h
@@ -15,6 +15,7 @@ #include "extensions/common/constants.h" #include "extensions/common/mojom/action_type.mojom-shared.h" #include "extensions/common/mojom/css_origin.mojom-shared.h" +#include "extensions/common/mojom/host_id.mojom-forward.h" #include "extensions/common/mojom/run_location.mojom-shared.h" #include "extensions/common/user_script.h" @@ -108,7 +109,7 @@ // before a response is received (in this case the callback will be with a // failure and appropriate error message). // TODO(devlin): Make |frame_ids| a std::set<> (since they must be unique). - void ExecuteScript(const HostID& host_id, + void ExecuteScript(const mojom::HostID& host_id, mojom::ActionType action_type, const std::string& code, FrameScope frame_scope,
diff --git a/extensions/browser/url_loader_factory_manager.cc b/extensions/browser/url_loader_factory_manager.cc index 52923d2d..48fc8e3 100644 --- a/extensions/browser/url_loader_factory_manager.cc +++ b/extensions/browser/url_loader_factory_manager.cc
@@ -20,6 +20,7 @@ #include "extensions/common/extension.h" #include "extensions/common/extension_set.h" #include "extensions/common/manifest_handlers/content_scripts_handler.h" +#include "extensions/common/mojom/host_id.mojom.h" #include "extensions/common/script_constants.h" #include "extensions/common/user_script.h" #include "mojo/public/cpp/bindings/pending_remote.h" @@ -264,15 +265,15 @@ // static void URLLoaderFactoryManager::WillExecuteCode(content::RenderFrameHost* frame, - const HostID& host_id) { - if (host_id.type() != HostID::EXTENSIONS) + const mojom::HostID& host_id) { + if (host_id.type != mojom::HostID::HostType::kExtensions) return; const ExtensionRegistry* registry = ExtensionRegistry::Get(frame->GetProcess()->GetBrowserContext()); DCHECK(registry); // WillExecuteCode shouldn't happen during shutdown. const Extension* extension = - registry->enabled_extensions().GetByID(host_id.id()); + registry->enabled_extensions().GetByID(host_id.id); DCHECK(extension); // Guaranteed by the caller - see the doc comment. if (!ShouldCreateSeparateFactoryForContentScripts(*extension))
diff --git a/extensions/browser/url_loader_factory_manager.h b/extensions/browser/url_loader_factory_manager.h index 8cecf213..b0eb6fc 100644 --- a/extensions/browser/url_loader_factory_manager.h +++ b/extensions/browser/url_loader_factory_manager.h
@@ -8,7 +8,7 @@ #include "base/macros.h" #include "content/public/browser/navigation_handle.h" #include "extensions/common/extension.h" -#include "extensions/common/host_id.h" +#include "extensions/common/mojom/host_id.mojom-forward.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "services/network/public/mojom/network_context.mojom.h" #include "url/gurl.h" @@ -52,10 +52,10 @@ // // This method may ask RenderFrameHost to create a separate URLLoaderFactory // object for extension identified by |host_id|. The caller needs to ensure - // that if |host_id.type() == HostID::EXTENSIONS|, then the extension with the - // given id exists and is enabled. + // that if |host_id.type == mojom::HostID::HostType::kExtensions|, then the + // extension with the given id exists and is enabled. static void WillExecuteCode(content::RenderFrameHost* frame, - const HostID& host_id); + const mojom::HostID& host_id); // Creates a URLLoaderFactory that should be used for requests initiated from // |process| by |origin|.
diff --git a/extensions/browser/user_script_loader.cc b/extensions/browser/user_script_loader.cc index 372814d..000c729a 100644 --- a/extensions/browser/user_script_loader.cc +++ b/extensions/browser/user_script_loader.cc
@@ -163,14 +163,13 @@ } UserScriptLoader::UserScriptLoader(BrowserContext* browser_context, - const HostID& host_id) + const mojom::HostID& host_id) : loaded_scripts_(new UserScriptList()), clear_scripts_(false), ready_(false), queued_load_(false), browser_context_(browser_context), - host_id_(host_id) { -} + host_id_(host_id) {} UserScriptLoader::~UserScriptLoader() { for (auto& observer : observers_) @@ -233,7 +232,7 @@ return; if (initial_load_complete()) { SendUpdate(process_host, shared_memory_, - std::set<HostID>()); // Include all hosts. + std::set<mojom::HostID>()); // Include all hosts. } } @@ -310,7 +309,7 @@ removed_script_hosts_.clear(); } -bool UserScriptLoader::HasLoadedScripts(const HostID& host_id) const { +bool UserScriptLoader::HasLoadedScripts(const mojom::HostID& host_id) const { // If there are no loaded scripts (which can happen if either the initial // load hasn't completed or if the loader is currently re-fetching scripts), // then the scripts have not been loaded. @@ -457,10 +456,10 @@ void UserScriptLoader::SendUpdate( content::RenderProcessHost* process, const base::ReadOnlySharedMemoryRegion& shared_memory, - const std::set<HostID>& changed_hosts) { + const std::set<mojom::HostID>& changed_hosts) { // Don't allow injection of non-whitelisted extensions' content scripts // into <webview>. - bool whitelisted_only = process->IsForGuestsOnly() && host_id().id().empty(); + bool whitelisted_only = process->IsForGuestsOnly() && host_id().id.empty(); // Make sure we only send user scripts to processes in our browser_context. if (!ExtensionsBrowserClient::Get()->IsSameContext(
diff --git a/extensions/browser/user_script_loader.h b/extensions/browser/user_script_loader.h index 08745d2..cc26799 100644 --- a/extensions/browser/user_script_loader.h +++ b/extensions/browser/user_script_loader.h
@@ -19,7 +19,7 @@ #include "base/optional.h" #include "base/scoped_observer.h" #include "content/public/browser/render_process_host_creation_observer.h" -#include "extensions/common/host_id.h" +#include "extensions/common/mojom/host_id.mojom.h" #include "extensions/common/user_script.h" namespace base { @@ -62,7 +62,7 @@ UserScript* script); UserScriptLoader(content::BrowserContext* browser_context, - const HostID& host_id); + const mojom::HostID& host_id); ~UserScriptLoader() override; // Add |scripts| to the set of scripts managed by this loader. If provided, @@ -93,7 +93,7 @@ void ClearScripts(); // Returns true if the scripts for the given |host_id| have been loaded. - bool HasLoadedScripts(const HostID& host_id) const; + bool HasLoadedScripts(const mojom::HostID& host_id) const; // Returns true if we have any scripts ready. bool initial_load_complete() const { return shared_memory_.IsValid(); } @@ -115,7 +115,7 @@ // Allows the derived classes to have different ways to load user scripts. // This may not be synchronous with the calls to Add/Remove/Clear scripts. virtual void LoadScripts(std::unique_ptr<UserScriptList> user_scripts, - const std::set<HostID>& changed_hosts, + const std::set<mojom::HostID>& changed_hosts, const std::set<std::string>& added_script_ids, LoadScriptsCallback callback) = 0; @@ -124,7 +124,7 @@ void SetReady(bool ready); content::BrowserContext* browser_context() const { return browser_context_; } - const HostID& host_id() const { return host_id_; } + const mojom::HostID& host_id() const { return host_id_; } private: // content::RenderProcessHostCreationObserver: @@ -152,7 +152,7 @@ // updated. void SendUpdate(content::RenderProcessHost* process, const base::ReadOnlySharedMemoryRegion& shared_memory, - const std::set<HostID>& changed_hosts); + const std::set<mojom::HostID>& changed_hosts); bool is_loading() const { // |loaded_scripts_| is reset when loading. @@ -178,7 +178,7 @@ // The IDs of the extensions which changed in the last update sent to the // renderer. - std::set<HostID> changed_hosts_; + std::set<mojom::HostID> changed_hosts_; // If the initial set of hosts has finished loading. bool ready_; @@ -193,7 +193,7 @@ // ID of the host that owns these scripts, if any. This is only set to a // non-empty value for declarative user script shared memory regions. - HostID host_id_; + mojom::HostID host_id_; // The associated observers. base::ObserverList<Observer>::Unchecked observers_;
diff --git a/extensions/browser/user_script_manager.cc b/extensions/browser/user_script_manager.cc index 61f54cb..9b1683c1 100644 --- a/extensions/browser/user_script_manager.cc +++ b/extensions/browser/user_script_manager.cc
@@ -8,6 +8,7 @@ #include "extensions/browser/extension_util.h" #include "extensions/browser/user_script_loader.h" #include "extensions/common/manifest_handlers/content_scripts_handler.h" +#include "extensions/common/mojom/host_id.mojom.h" namespace extensions { @@ -22,12 +23,12 @@ UserScriptManager::~UserScriptManager() = default; UserScriptLoader* UserScriptManager::GetUserScriptLoaderByID( - const HostID& host_id) { - switch (host_id.type()) { - case HostID::EXTENSIONS: - return GetUserScriptLoaderForExtension(host_id.id()); - case HostID::WEBUI: - return GetUserScriptLoaderForWebUI(GURL(host_id.id())); + const mojom::HostID& host_id) { + switch (host_id.type) { + case mojom::HostID::HostType::kExtensions: + return GetUserScriptLoaderForExtension(host_id.id); + case mojom::HostID::HostType::kWebUi: + return GetUserScriptLoaderForWebUI(GURL(host_id.id)); } }
diff --git a/extensions/browser/user_script_manager.h b/extensions/browser/user_script_manager.h index aa6510c99..90445fe 100644 --- a/extensions/browser/user_script_manager.h +++ b/extensions/browser/user_script_manager.h
@@ -15,7 +15,7 @@ #include "extensions/browser/extension_user_script_loader.h" #include "extensions/browser/web_ui_user_script_loader.h" #include "extensions/common/extension.h" -#include "extensions/common/host_id.h" +#include "extensions/common/mojom/host_id.mojom-forward.h" #include "extensions/common/user_script.h" #include "url/gurl.h" @@ -27,10 +27,10 @@ class UserScriptLoader; // Manages user scripts for all extensions and webview scripts from WebUI pages. -// Owns one UserScriptLoader for manifest extension scripts, and a map of HostID -// to UserScriptLoaders for declarative extension and WebUI scripts. File -// loading and shared memory management operations are delegated to these -// UserScriptLoaders. +// Owns one UserScriptLoader for manifest extension scripts, and a map of +// mojom::HostID to UserScriptLoaders for declarative extension and WebUI +// scripts. File loading and shared memory management operations are delegated +// to these UserScriptLoaders. class UserScriptManager : public ExtensionRegistryObserver { public: explicit UserScriptManager(content::BrowserContext* browser_context); @@ -42,7 +42,7 @@ return &manifest_script_loader_; } - UserScriptLoader* GetUserScriptLoaderByID(const HostID& host_id); + UserScriptLoader* GetUserScriptLoaderByID(const mojom::HostID& host_id); ExtensionUserScriptLoader* GetUserScriptLoaderForExtension( const ExtensionId& extension_id);
diff --git a/extensions/browser/web_ui_user_script_loader.cc b/extensions/browser/web_ui_user_script_loader.cc index b70f0ae..fd6f556 100644 --- a/extensions/browser/web_ui_user_script_loader.cc +++ b/extensions/browser/web_ui_user_script_loader.cc
@@ -17,6 +17,7 @@ #include "base/threading/sequenced_task_runner_handle.h" #include "content/public/browser/browser_context.h" #include "extensions/browser/guest_view/web_view/web_ui/web_ui_url_fetcher.h" +#include "extensions/common/mojom/host_id.mojom.h" #include "url/gurl.h" namespace { @@ -47,7 +48,10 @@ WebUIUserScriptLoader::WebUIUserScriptLoader( content::BrowserContext* browser_context, const GURL& url) - : UserScriptLoader(browser_context, HostID(HostID::WEBUI, url.spec())), + : UserScriptLoader(browser_context, + extensions::mojom::HostID( + extensions::mojom::HostID::HostID::HostType::kWebUi, + url.spec())), complete_fetchers_(0) { SetReady(true); } @@ -70,7 +74,7 @@ void WebUIUserScriptLoader::LoadScripts( std::unique_ptr<extensions::UserScriptList> user_scripts, - const std::set<HostID>& changed_hosts, + const std::set<extensions::mojom::HostID>& changed_hosts, const std::set<std::string>& added_script_ids, LoadScriptsCallback callback) { DCHECK(!user_scripts_cache_) << "Loading scripts in flight.";
diff --git a/extensions/browser/web_ui_user_script_loader.h b/extensions/browser/web_ui_user_script_loader.h index d7812a2e..51d3a5b 100644 --- a/extensions/browser/web_ui_user_script_loader.h +++ b/extensions/browser/web_ui_user_script_loader.h
@@ -13,6 +13,7 @@ #include "base/callback.h" #include "base/macros.h" #include "extensions/browser/user_script_loader.h" +#include "extensions/common/mojom/host_id.mojom-forward.h" class GURL; class WebUIURLFetcher; @@ -38,7 +39,7 @@ int render_frame_id, ScriptsLoadedCallback callback) override; void LoadScripts(std::unique_ptr<extensions::UserScriptList> user_scripts, - const std::set<HostID>& changed_hosts, + const std::set<extensions::mojom::HostID>& changed_hosts, const std::set<std::string>& added_script_ids, LoadScriptsCallback callback) override;
diff --git a/extensions/common/BUILD.gn b/extensions/common/BUILD.gn index 97099a5..2da55be 100644 --- a/extensions/common/BUILD.gn +++ b/extensions/common/BUILD.gn
@@ -46,6 +46,7 @@ "mojom/feature_session_type.mojom", "mojom/frame.mojom", "mojom/guest_view.mojom", + "mojom/host_id.mojom", "mojom/keep_alive.mojom", "mojom/renderer.mojom", "mojom/run_location.mojom", @@ -214,8 +215,6 @@ "guest_view/extensions_guest_view_messages.h", "hashed_extension_id.cc", "hashed_extension_id.h", - "host_id.cc", - "host_id.h", "identifiability_metrics.cc", "identifiability_metrics.h", "image_util.cc",
diff --git a/extensions/common/extension_messages.cc b/extensions/common/extension_messages.cc index 26ba3a0..76cde50 100644 --- a/extensions/common/extension_messages.cc +++ b/extensions/common/extension_messages.cc
@@ -270,30 +270,6 @@ LogParam(p.map(), l); } -void ParamTraits<HostID>::Write(base::Pickle* m, const param_type& p) { - WriteParam(m, p.type()); - WriteParam(m, p.id()); -} - -bool ParamTraits<HostID>::Read(const base::Pickle* m, - base::PickleIterator* iter, - param_type* r) { - HostID::HostType type; - std::string id; - if (!ReadParam(m, iter, &type)) - return false; - if (!ReadParam(m, iter, &id)) - return false; - *r = HostID(type, id); - return true; -} - -void ParamTraits<HostID>::Log( - const param_type& p, std::string* l) { - LogParam(p.type(), l); - LogParam(p.id(), l); -} - void ParamTraits<ExtensionMsg_PermissionSetStruct>::Write(base::Pickle* m, const param_type& p) { WriteParam(m, p.apis);
diff --git a/extensions/common/extension_messages.h b/extensions/common/extension_messages.h index 7f53763..988a37f9 100644 --- a/extensions/common/extension_messages.h +++ b/extensions/common/extension_messages.h
@@ -32,11 +32,11 @@ #include "extensions/common/extension.h" #include "extensions/common/extension_guid.h" #include "extensions/common/extensions_client.h" -#include "extensions/common/host_id.h" #include "extensions/common/message_bundle.h" #include "extensions/common/mojom/action_type.mojom-shared.h" #include "extensions/common/mojom/css_origin.mojom-shared.h" #include "extensions/common/mojom/feature_session_type.mojom.h" +#include "extensions/common/mojom/host_id.mojom.h" #include "extensions/common/mojom/run_location.mojom-shared.h" #include "extensions/common/permissions/permission_set.h" #include "extensions/common/permissions/socket_permission_data.h" @@ -71,7 +71,8 @@ IPC_ENUM_TRAITS_MAX_VALUE(extensions::MessagingEndpoint::Type, extensions::MessagingEndpoint::Type::kLast) -IPC_ENUM_TRAITS_MAX_VALUE(HostID::HostType, HostID::HOST_TYPE_LAST) +IPC_ENUM_TRAITS_MAX_VALUE(extensions::mojom::HostID::HostType, + extensions::mojom::HostID::HostType::kMaxValue) // Parameters structure for ExtensionHostMsg_AddAPIActionToActivityLog and // ExtensionHostMsg_AddEventToActivityLog. @@ -163,13 +164,18 @@ IPC_STRUCT_MEMBER(extensions::EventFilteringInfo, filtering_info) IPC_STRUCT_END() +IPC_STRUCT_TRAITS_BEGIN(extensions::mojom::HostID) + IPC_STRUCT_TRAITS_MEMBER(type) + IPC_STRUCT_TRAITS_MEMBER(id) +IPC_STRUCT_TRAITS_END() + // Allows an extension to execute code in a tab. IPC_STRUCT_BEGIN(ExtensionMsg_ExecuteCode_Params) // The extension API request id, for responding. IPC_STRUCT_MEMBER(int, request_id) // The ID of the requesting injection host. - IPC_STRUCT_MEMBER(HostID, host_id) + IPC_STRUCT_MEMBER(extensions::mojom::HostID, host_id) // Whether the code is JavaScript or CSS. IPC_STRUCT_MEMBER(extensions::mojom::ActionType, action_type) @@ -478,16 +484,6 @@ }; template <> -struct ParamTraits<HostID> { - typedef HostID param_type; - static void Write(base::Pickle* m, const param_type& p); - static bool Read(const base::Pickle* m, - base::PickleIterator* iter, - param_type* r); - static void Log(const param_type& p, std::string* l); -}; - -template <> struct ParamTraits<ExtensionMsg_PermissionSetStruct> { typedef ExtensionMsg_PermissionSetStruct param_type; static void Write(base::Pickle* m, const param_type& p); @@ -571,8 +567,8 @@ // scripts and not all user scripts. IPC_MESSAGE_CONTROL4(ExtensionMsg_UpdateUserScripts, base::ReadOnlySharedMemoryRegion, - HostID /* owner */, - std::set<HostID> /* changed hosts */, + extensions::mojom::HostID /* owner */, + std::set<extensions::mojom::HostID> /* changed hosts */, bool /* whitelisted_only */) // Trigger to execute declarative content script under browser control.
diff --git a/extensions/common/host_id.cc b/extensions/common/host_id.cc deleted file mode 100644 index afc0b28..0000000 --- a/extensions/common/host_id.cc +++ /dev/null
@@ -1,31 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "extensions/common/host_id.h" - -#include <tuple> - -HostID::HostID() - : type_(HostType::EXTENSIONS) { -} - -HostID::HostID(HostType type, const std::string& id) - : type_(type), id_(id) { -} - -HostID::HostID(const HostID& host_id) - : type_(host_id.type()), - id_(host_id.id()) { -} - -HostID::~HostID() { -} - -bool HostID::operator<(const HostID& host_id) const { - return std::tie(type_, id_) < std::tie(host_id.type_, host_id.id_); -} - -bool HostID::operator==(const HostID& host_id) const { - return type_ == host_id.type_ && id_ == host_id.id_; -}
diff --git a/extensions/common/host_id.h b/extensions/common/host_id.h deleted file mode 100644 index 176ea49..0000000 --- a/extensions/common/host_id.h +++ /dev/null
@@ -1,35 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef EXTENSIONS_COMMON_HOST_ID_H_ -#define EXTENSIONS_COMMON_HOST_ID_H_ - -#include <string> - -// IDs of hosts who own user scripts. -// A HostID is immutable after creation. -struct HostID { - enum HostType { EXTENSIONS, WEBUI, HOST_TYPE_LAST = WEBUI }; - - HostID(); - HostID(HostType type, const std::string& id); - HostID(const HostID& host_id); - ~HostID(); - - bool operator<(const HostID& host_id) const; - bool operator==(const HostID& host_id) const; - - HostType type() const { return type_; } - const std::string& id() const { return id_; } - - private: - // The type of the host. - HostType type_; - - // Similar to extension_id, host_id is a unique indentifier for a host, - // e.g., an Extension or WebUI. - std::string id_; -}; - -#endif // EXTENSIONS_COMMON_HOST_ID_H_
diff --git a/extensions/common/manifest_handlers/content_scripts_handler.cc b/extensions/common/manifest_handlers/content_scripts_handler.cc index ae1ff28..4d24f16 100644 --- a/extensions/common/manifest_handlers/content_scripts_handler.cc +++ b/extensions/common/manifest_handlers/content_scripts_handler.cc
@@ -21,9 +21,9 @@ #include "extensions/common/extension.h" #include "extensions/common/extension_features.h" #include "extensions/common/extension_resource.h" -#include "extensions/common/host_id.h" #include "extensions/common/manifest_constants.h" #include "extensions/common/manifest_handlers/permissions_parser.h" +#include "extensions/common/mojom/host_id.mojom.h" #include "extensions/common/mojom/run_location.mojom-shared.h" #include "extensions/common/permissions/permissions_data.h" #include "extensions/common/script_constants.h" @@ -301,7 +301,8 @@ if (!user_script) return false; // Failed to parse script context definition. - user_script->set_host_id(HostID(HostID::EXTENSIONS, extension->id())); + user_script->set_host_id( + mojom::HostID(mojom::HostID::HostType::kExtensions, extension->id())); if (extension->converted_from_user_script()) { user_script->set_emulate_greasemonkey(true); // Greasemonkey matches all frames.
diff --git a/extensions/common/mojom/host_id.mojom b/extensions/common/mojom/host_id.mojom new file mode 100644 index 0000000..e79bc86 --- /dev/null +++ b/extensions/common/mojom/host_id.mojom
@@ -0,0 +1,17 @@ +// Copyright 2021 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. + +module extensions.mojom; + +// IDs of hosts who own user scripts. A HostID is immutable after creation. +struct HostID { + enum HostType { + kExtensions, + kWebUi, + }; + + HostType type = kExtensions; // The type of the host. + string id; // Similar to extension_id, host_id is a unique identifier for a + // host, e.g., an Extension or WebUI. +}; \ No newline at end of file
diff --git a/extensions/common/user_script.cc b/extensions/common/user_script.cc index 0e67b6a..87413aa79 100644 --- a/extensions/common/user_script.cc +++ b/extensions/common/user_script.cc
@@ -212,9 +212,9 @@ } void UserScript::PickleHostID(base::Pickle* pickle, - const HostID& host_id) const { - pickle->WriteInt(host_id.type()); - pickle->WriteString(host_id.id()); + const mojom::HostID& host_id) const { + pickle->WriteInt(static_cast<int>(host_id.type)); + pickle->WriteString(host_id.id); } void UserScript::PickleURLPatternSet(base::Pickle* pickle, @@ -282,12 +282,12 @@ void UserScript::UnpickleHostID(const base::Pickle& pickle, base::PickleIterator* iter, - HostID* host_id) { + mojom::HostID* host_id) { int type = 0; std::string id; CHECK(iter->ReadInt(&type)); CHECK(iter->ReadString(&id)); - *host_id = HostID(static_cast<HostID::HostType>(type), id); + *host_id = mojom::HostID(static_cast<mojom::HostID::HostType>(type), id); } void UserScript::UnpickleURLPatternSet(const base::Pickle& pickle, @@ -328,11 +328,11 @@ } } -UserScriptIDPair::UserScriptIDPair(std::string id, const HostID& host_id) +UserScriptIDPair::UserScriptIDPair(std::string id, const mojom::HostID& host_id) : id(std::move(id)), host_id(host_id) {} UserScriptIDPair::UserScriptIDPair(std::string id) - : id(std::move(id)), host_id(HostID()) {} + : id(std::move(id)), host_id(mojom::HostID()) {} bool operator<(const UserScriptIDPair& a, const UserScriptIDPair& b) { return a.id < b.id;
diff --git a/extensions/common/user_script.h b/extensions/common/user_script.h index 8bce7ea..7a207006 100644 --- a/extensions/common/user_script.h +++ b/extensions/common/user_script.h
@@ -11,7 +11,7 @@ #include "base/files/file_path.h" #include "base/strings/string_piece.h" -#include "extensions/common/host_id.h" +#include "extensions/common/mojom/host_id.mojom.h" #include "extensions/common/mojom/run_location.mojom-shared.h" #include "extensions/common/script_constants.h" #include "extensions/common/url_pattern.h" @@ -192,10 +192,10 @@ FileList& css_scripts() { return css_scripts_; } const FileList& css_scripts() const { return css_scripts_; } - const std::string& extension_id() const { return host_id_.id(); } + const std::string& extension_id() const { return host_id_.id; } - const HostID& host_id() const { return host_id_; } - void set_host_id(const HostID& host_id) { host_id_ = host_id; } + const mojom::HostID& host_id() const { return host_id_; } + void set_host_id(const mojom::HostID& host_id) { host_id_ = host_id; } const ConsumerInstanceType& consumer_instance_type() const { return consumer_instance_type_; @@ -238,7 +238,7 @@ // components. void PickleGlobs(base::Pickle* pickle, const std::vector<std::string>& globs) const; - void PickleHostID(base::Pickle* pickle, const HostID& host_id) const; + void PickleHostID(base::Pickle* pickle, const mojom::HostID& host_id) const; void PickleURLPatternSet(base::Pickle* pickle, const URLPatternSet& pattern_list) const; void PickleScripts(base::Pickle* pickle, const FileList& scripts) const; @@ -249,7 +249,7 @@ std::vector<std::string>* globs); void UnpickleHostID(const base::Pickle& pickle, base::PickleIterator* iter, - HostID* host_id); + mojom::HostID* host_id); void UnpickleURLPatternSet(const base::Pickle& pickle, base::PickleIterator* iter, URLPatternSet* pattern_list); @@ -292,7 +292,7 @@ // The ID of the host this script is a part of. The |ID| of the // |host_id| can be empty if the script is a "standlone" user script. - HostID host_id_; + mojom::HostID host_id_; // The type of the consumer instance that the script will be injected. ConsumerInstanceType consumer_instance_type_ = TAB; @@ -323,11 +323,11 @@ // Information we need while removing scripts from a UserScriptLoader. struct UserScriptIDPair { - UserScriptIDPair(std::string id, const HostID& host_id); + UserScriptIDPair(std::string id, const mojom::HostID& host_id); explicit UserScriptIDPair(std::string id); std::string id; - HostID host_id; + mojom::HostID host_id; }; bool operator<(const UserScriptIDPair& a, const UserScriptIDPair& b);
diff --git a/extensions/common/user_script_unittest.cc b/extensions/common/user_script_unittest.cc index c411782..9f43dd4 100644 --- a/extensions/common/user_script_unittest.cc +++ b/extensions/common/user_script_unittest.cc
@@ -7,6 +7,7 @@ #include "base/files/file_path.h" #include "base/pickle.h" +#include "extensions/common/mojom/host_id.mojom.h" #include "extensions/common/mojom/run_location.mojom-shared.h" #include "extensions/common/user_script.h" #include "testing/gtest/include/gtest/gtest.h" @@ -221,7 +222,7 @@ const std::string kId = "_12"; script1.set_id(kId); const std::string kExtensionId = "foo"; - HostID id(HostID::EXTENSIONS, kExtensionId); + mojom::HostID id(mojom::HostID::HostType::kExtensions, kExtensionId); script1.set_host_id(id); base::Pickle pickle;
diff --git a/extensions/renderer/dispatcher.cc b/extensions/renderer/dispatcher.cc index edcadd3..936cb6f4 100644 --- a/extensions/renderer/dispatcher.cc +++ b/extensions/renderer/dispatcher.cc
@@ -47,6 +47,7 @@ #include "extensions/common/manifest_handlers/background_info.h" #include "extensions/common/manifest_handlers/options_page_info.h" #include "extensions/common/message_bundle.h" +#include "extensions/common/mojom/host_id.mojom.h" #include "extensions/common/permissions/permission_set.h" #include "extensions/common/permissions/permissions_data.h" #include "extensions/common/switches.h" @@ -1275,7 +1276,8 @@ user_script_set_manager_->set_activity_logging_enabled(enabled); } -void Dispatcher::OnUserScriptsUpdated(const std::set<HostID>& changed_hosts) { +void Dispatcher::OnUserScriptsUpdated( + const std::set<mojom::HostID>& changed_hosts) { UpdateActiveExtensions(); }
diff --git a/extensions/renderer/dispatcher.h b/extensions/renderer/dispatcher.h index 481be84..30f0081 100644 --- a/extensions/renderer/dispatcher.h +++ b/extensions/renderer/dispatcher.h
@@ -25,6 +25,7 @@ #include "extensions/common/extensions_client.h" #include "extensions/common/features/feature.h" #include "extensions/common/mojom/feature_session_type.mojom.h" +#include "extensions/common/mojom/host_id.mojom-forward.h" #include "extensions/common/mojom/renderer.mojom.h" #include "extensions/renderer/resource_bundle_source_map.h" #include "extensions/renderer/script_context.h" @@ -262,7 +263,8 @@ void OnUpdatePermissions(const ExtensionMsg_UpdatePermissions_Params& params); // UserScriptSetManager::Observer implementation. - void OnUserScriptsUpdated(const std::set<HostID>& changed_hosts) override; + void OnUserScriptsUpdated( + const std::set<mojom::HostID>& changed_hosts) override; void UpdateActiveExtensions();
diff --git a/extensions/renderer/extension_injection_host.cc b/extensions/renderer/extension_injection_host.cc index cc66b60d..e250341 100644 --- a/extensions/renderer/extension_injection_host.cc +++ b/extensions/renderer/extension_injection_host.cc
@@ -7,17 +7,17 @@ #include "content/public/renderer/render_frame.h" #include "extensions/common/constants.h" #include "extensions/common/manifest_handlers/csp_info.h" +#include "extensions/common/mojom/host_id.mojom.h" #include "extensions/renderer/renderer_extension_registry.h" #include "third_party/blink/public/platform/web_security_origin.h" #include "third_party/blink/public/web/web_local_frame.h" namespace extensions { -ExtensionInjectionHost::ExtensionInjectionHost( - const Extension* extension) - : InjectionHost(HostID(HostID::EXTENSIONS, extension->id())), - extension_(extension) { -} +ExtensionInjectionHost::ExtensionInjectionHost(const Extension* extension) + : InjectionHost( + mojom::HostID(mojom::HostID::HostType::kExtensions, extension->id())), + extension_(extension) {} ExtensionInjectionHost::~ExtensionInjectionHost() { }
diff --git a/extensions/renderer/injection_host.cc b/extensions/renderer/injection_host.cc index 30e8679d..43262b7 100644 --- a/extensions/renderer/injection_host.cc +++ b/extensions/renderer/injection_host.cc
@@ -4,9 +4,8 @@ #include "extensions/renderer/injection_host.h" -InjectionHost::InjectionHost(const HostID& host_id) : - id_(host_id) { -} +InjectionHost::InjectionHost(const extensions::mojom::HostID& host_id) + : id_(host_id) {} InjectionHost::~InjectionHost() { }
diff --git a/extensions/renderer/injection_host.h b/extensions/renderer/injection_host.h index eb30d8fb..21a1a51 100644 --- a/extensions/renderer/injection_host.h +++ b/extensions/renderer/injection_host.h
@@ -6,7 +6,7 @@ #define EXTENSIONS_RENDERER_INJECTION_HOST_H_ #include "base/macros.h" -#include "extensions/common/host_id.h" +#include "extensions/common/mojom/host_id.mojom.h" #include "extensions/common/permissions/permissions_data.h" #include "url/gurl.h" @@ -17,7 +17,7 @@ // An interface for all kinds of hosts who own user scripts. class InjectionHost { public: - InjectionHost(const HostID& host_id); + InjectionHost(const extensions::mojom::HostID& host_id); virtual ~InjectionHost(); // Returns the CSP to be used for the isolated world. Currently this only @@ -38,11 +38,11 @@ int tab_id, bool is_declarative) const = 0; - const HostID& id() const { return id_; } + const extensions::mojom::HostID& id() const { return id_; } private: // The ID of the host. - HostID id_; + extensions::mojom::HostID id_; DISALLOW_COPY_AND_ASSIGN(InjectionHost); };
diff --git a/extensions/renderer/programmatic_script_injector.cc b/extensions/renderer/programmatic_script_injector.cc index 7ce3738..4f7e788 100644 --- a/extensions/renderer/programmatic_script_injector.cc +++ b/extensions/renderer/programmatic_script_injector.cc
@@ -14,6 +14,7 @@ #include "extensions/common/extension_messages.h" #include "extensions/common/manifest_constants.h" #include "extensions/common/mojom/action_type.mojom-shared.h" +#include "extensions/common/mojom/host_id.mojom.h" #include "extensions/common/permissions/api_permission.h" #include "extensions/common/permissions/permissions_data.h" #include "extensions/common/script_constants.h" @@ -109,7 +110,7 @@ ? PermissionsData::PageAccess::kAllowed : PermissionsData::PageAccess::kDenied; } - DCHECK_EQ(injection_host->id().type(), HostID::EXTENSIONS); + DCHECK_EQ(injection_host->id().type, mojom::HostID::HostType::kExtensions); return injection_host->CanExecuteOnFrame( effective_document_url, @@ -178,10 +179,10 @@ } bool ProgrammaticScriptInjector::CanShowUrlInError() const { - if (params_->host_id.type() != HostID::EXTENSIONS) + if (params_->host_id.type != mojom::HostID::HostType::kExtensions) return false; const Extension* extension = - RendererExtensionRegistry::Get()->GetByID(params_->host_id.id()); + RendererExtensionRegistry::Get()->GetByID(params_->host_id.id); if (!extension) return false; return extension->permissions_data()->active_permissions().HasAPIPermission(
diff --git a/extensions/renderer/script_injection.cc b/extensions/renderer/script_injection.cc index 456dbd39..84e30f37 100644 --- a/extensions/renderer/script_injection.cc +++ b/extensions/renderer/script_injection.cc
@@ -18,8 +18,8 @@ #include "content/public/renderer/v8_value_converter.h" #include "extensions/common/extension_features.h" #include "extensions/common/extension_messages.h" -#include "extensions/common/host_id.h" #include "extensions/common/identifiability_metrics.h" +#include "extensions/common/mojom/host_id.mojom.h" #include "extensions/renderer/dom_activity_logger.h" #include "extensions/renderer/extension_frame_helper.h" #include "extensions/renderer/extensions_renderer_client.h" @@ -57,7 +57,7 @@ IsolatedWorldMap& isolated_worlds = g_isolated_worlds.Get(); int id = 0; - const std::string& key = injection_host->id().id(); + const std::string& key = injection_host->id().id; auto iter = isolated_worlds.find(key); if (iter != isolated_worlds.end()) { id = iter->second; @@ -239,7 +239,7 @@ // invalid request (which is treated like a notification). request_id_ = g_next_pending_id++; render_frame_->Send(new ExtensionHostMsg_RequestScriptInjectionPermission( - render_frame_->GetRoutingID(), host_id().id(), injector_->script_type(), + render_frame_->GetRoutingID(), host_id().id, injector_->script_type(), run_location_, request_id_)); } @@ -255,9 +255,9 @@ DCHECK(scripts_run_info); DCHECK(!complete_); bool should_inject_js = injector_->ShouldInjectJs( - run_location_, scripts_run_info->executing_scripts[host_id().id()]); + run_location_, scripts_run_info->executing_scripts[host_id().id]); bool should_inject_or_remove_css = injector_->ShouldInjectOrRemoveCss( - run_location_, scripts_run_info->injected_stylesheets[host_id().id()]); + run_location_, scripts_run_info->injected_stylesheets[host_id().id]); // This can happen if the extension specified a script to // be run in multiple rules, and the script has already run. @@ -267,17 +267,17 @@ } if (should_inject_js) - InjectJs(&(scripts_run_info->executing_scripts[host_id().id()]), + InjectJs(&(scripts_run_info->executing_scripts[host_id().id]), &(scripts_run_info->num_js)); if (should_inject_or_remove_css) - InjectOrRemoveCss(&(scripts_run_info->injected_stylesheets[host_id().id()]), + InjectOrRemoveCss(&(scripts_run_info->injected_stylesheets[host_id().id]), &(scripts_run_info->num_css)); complete_ = did_inject_js_ || !should_inject_js; if (complete_) { - if (host_id().type() == HostID::EXTENSIONS) - RecordContentScriptInjection(ukm_source_id_, host_id().id()); + if (host_id().type == mojom::HostID::HostType::kExtensions) + RecordContentScriptInjection(ukm_source_id_, host_id().id); injector_->OnInjectionComplete(std::move(execution_result_), run_location_, render_frame_); } else { @@ -300,8 +300,10 @@ new TimedScriptInjectionCallback(weak_ptr_factory_.GetWeakPtr())); base::ElapsedTimer exec_timer; - if (injection_host_->id().type() == HostID::EXTENSIONS && log_activity_) - DOMActivityLogger::AttachToWorld(world_id, injection_host_->id().id()); + if (injection_host_->id().type == mojom::HostID::HostType::kExtensions && + log_activity_) { + DOMActivityLogger::AttachToWorld(world_id, injection_host_->id().id); + } // For content scripts executing during page load, we run them asynchronously // in order to reduce UI jank experienced by the user. (We don't do this for @@ -329,7 +331,8 @@ base::Optional<base::TimeDelta> elapsed) { DCHECK(!did_inject_js_); - if (injection_host_->id().type() == HostID::EXTENSIONS && elapsed) { + if (injection_host_->id().type == mojom::HostID::HostType::kExtensions && + elapsed) { UMA_HISTOGRAM_TIMES("Extensions.InjectedScriptExecutionTime", *elapsed); switch (run_location_) { case mojom::RunLocation::kDocumentStart: @@ -366,8 +369,8 @@ execution_result_ = std::make_unique<base::Value>(); } did_inject_js_ = true; - if (host_id().type() == HostID::EXTENSIONS) - RecordContentScriptInjection(ukm_source_id_, host_id().id()); + if (host_id().type == mojom::HostID::HostType::kExtensions) + RecordContentScriptInjection(ukm_source_id_, host_id().id); // If |async_completion_callback_| is set, it means the script finished // asynchronously, and we should run it.
diff --git a/extensions/renderer/script_injection.h b/extensions/renderer/script_injection.h index fe4ea3c4..cba9b0b 100644 --- a/extensions/renderer/script_injection.h +++ b/extensions/renderer/script_injection.h
@@ -14,14 +14,13 @@ #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "base/optional.h" +#include "extensions/common/mojom/host_id.mojom-forward.h" #include "extensions/common/mojom/run_location.mojom-shared.h" #include "extensions/common/user_script.h" #include "extensions/renderer/injection_host.h" #include "extensions/renderer/script_injector.h" #include "services/metrics/public/cpp/ukm_source_id.h" -struct HostID; - namespace content { class RenderFrame; } @@ -83,7 +82,7 @@ // Accessors. content::RenderFrame* render_frame() const { return render_frame_; } - const HostID& host_id() const { return injection_host_->id(); } + const mojom::HostID& host_id() const { return injection_host_->id(); } int64_t request_id() const { return request_id_; } // Called when JS injection for the given frame has been completed or
diff --git a/extensions/renderer/script_injection_manager.cc b/extensions/renderer/script_injection_manager.cc index 1999a887..ae2b981 100644 --- a/extensions/renderer/script_injection_manager.cc +++ b/extensions/renderer/script_injection_manager.cc
@@ -21,6 +21,7 @@ #include "extensions/common/extension_features.h" #include "extensions/common/extension_messages.h" #include "extensions/common/extension_set.h" +#include "extensions/common/mojom/host_id.mojom.h" #include "extensions/renderer/extension_frame_helper.h" #include "extensions/renderer/extension_injection_host.h" #include "extensions/renderer/programmatic_script_injector.h" @@ -314,7 +315,7 @@ const std::string& extension_id) { for (auto iter = pending_injections_.begin(); iter != pending_injections_.end();) { - if ((*iter)->host_id().id() == extension_id) { + if ((*iter)->host_id().id == extension_id) { (*iter)->OnHostRemoved(); iter = pending_injections_.erase(iter); } else { @@ -335,7 +336,7 @@ } void ScriptInjectionManager::OnUserScriptsUpdated( - const std::set<HostID>& changed_hosts) { + const std::set<mojom::HostID>& changed_hosts) { for (auto iter = pending_injections_.begin(); iter != pending_injections_.end();) { if (changed_hosts.count((*iter)->host_id()) > 0) @@ -478,11 +479,11 @@ const ExtensionMsg_ExecuteCode_Params& params, content::RenderFrame* render_frame) { std::unique_ptr<const InjectionHost> injection_host; - if (params.host_id.type() == HostID::EXTENSIONS) { - injection_host = ExtensionInjectionHost::Create(params.host_id.id()); + if (params.host_id.type == mojom::HostID::HostType::kExtensions) { + injection_host = ExtensionInjectionHost::Create(params.host_id.id); if (!injection_host) return; - } else if (params.host_id.type() == HostID::WEBUI) { + } else if (params.host_id.type == mojom::HostID::HostType::kWebUi) { injection_host.reset( new WebUIInjectionHost(params.host_id)); } @@ -525,7 +526,7 @@ auto iter = pending_injections_.begin(); for (; iter != pending_injections_.end(); ++iter) { if ((*iter)->request_id() == request_id) { - DCHECK((*iter)->host_id().type() == HostID::EXTENSIONS); + DCHECK((*iter)->host_id().type == mojom::HostID::HostType::kExtensions); break; } }
diff --git a/extensions/renderer/script_injection_manager.h b/extensions/renderer/script_injection_manager.h index 6f8296af..fe2a0db 100644 --- a/extensions/renderer/script_injection_manager.h +++ b/extensions/renderer/script_injection_manager.h
@@ -15,6 +15,7 @@ #include "base/callback.h" #include "base/macros.h" #include "base/scoped_observer.h" +#include "extensions/common/mojom/host_id.mojom-forward.h" #include "extensions/common/mojom/run_location.mojom-shared.h" #include "extensions/common/user_script.h" #include "extensions/renderer/script_injection.h" @@ -62,7 +63,8 @@ void OnInjectionFinished(ScriptInjection* injection); // UserScriptSetManager::Observer implementation. - void OnUserScriptsUpdated(const std::set<HostID>& changed_hosts) override; + void OnUserScriptsUpdated( + const std::set<mojom::HostID>& changed_hosts) override; // Notifies that an RFOHelper should be removed. void RemoveObserver(RFOHelper* helper);
diff --git a/extensions/renderer/user_script_injector.cc b/extensions/renderer/user_script_injector.cc index 2a679aea..8affdda 100644 --- a/extensions/renderer/user_script_injector.cc +++ b/extensions/renderer/user_script_injector.cc
@@ -108,7 +108,7 @@ } void UserScriptInjector::OnUserScriptsUpdated( - const std::set<HostID>& changed_hosts, + const std::set<mojom::HostID>& changed_hosts, const UserScriptList& scripts) { // When user scripts are updated, all the old script pointers are invalidated. script_ = nullptr;
diff --git a/extensions/renderer/user_script_injector.h b/extensions/renderer/user_script_injector.h index ff59592..8328dd9 100644 --- a/extensions/renderer/user_script_injector.h +++ b/extensions/renderer/user_script_injector.h
@@ -11,6 +11,7 @@ #include "base/macros.h" #include "base/scoped_observer.h" #include "extensions/common/mojom/css_origin.mojom-shared.h" +#include "extensions/common/mojom/host_id.mojom.h" #include "extensions/common/mojom/run_location.mojom-shared.h" #include "extensions/common/user_script.h" #include "extensions/renderer/script_injection.h" @@ -35,7 +36,7 @@ private: // UserScriptSet::Observer implementation. - void OnUserScriptsUpdated(const std::set<HostID>& changed_hosts, + void OnUserScriptsUpdated(const std::set<mojom::HostID>& changed_hosts, const UserScriptList& scripts) override; // ScriptInjector implementation. @@ -85,7 +86,7 @@ std::string script_id_; // The associated host id, preserved for the same reason as |script_id|. - HostID host_id_; + mojom::HostID host_id_; // Indicates whether or not this script is declarative. This influences which // script permissions are checked before injection.
diff --git a/extensions/renderer/user_script_set.cc b/extensions/renderer/user_script_set.cc index d4f51eea..ec891d2 100644 --- a/extensions/renderer/user_script_set.cc +++ b/extensions/renderer/user_script_set.cc
@@ -16,6 +16,7 @@ #include "content/public/renderer/render_thread.h" #include "extensions/common/extension.h" #include "extensions/common/extensions_client.h" +#include "extensions/common/mojom/host_id.mojom.h" #include "extensions/common/permissions/permissions_data.h" #include "extensions/renderer/extension_injection_host.h" #include "extensions/renderer/extensions_renderer_client.h" @@ -71,7 +72,7 @@ void UserScriptSet::GetActiveExtensionIds( std::set<std::string>* ids) const { for (const std::unique_ptr<UserScript>& script : scripts_) { - if (script->host_id().type() != HostID::EXTENSIONS) + if (script->host_id().type != mojom::HostID::HostType::kExtensions) continue; DCHECK(!script->extension_id().empty()); ids->insert(script->extension_id()); @@ -96,7 +97,7 @@ bool UserScriptSet::UpdateUserScripts( base::ReadOnlySharedMemoryRegion shared_memory, - const std::set<HostID>& changed_hosts, + const std::set<mojom::HostID>& changed_hosts, bool whitelisted_only) { bool only_inject_incognito = ExtensionsRendererClient::Get()->IsIncognitoProcess(); @@ -205,13 +206,13 @@ std::unique_ptr<const InjectionHost> injection_host; blink::WebLocalFrame* web_frame = render_frame->GetWebFrame(); - const HostID& host_id = script->host_id(); - if (host_id.type() == HostID::EXTENSIONS) { - injection_host = ExtensionInjectionHost::Create(host_id.id()); + const mojom::HostID& host_id = script->host_id(); + if (host_id.type == mojom::HostID::HostType::kExtensions) { + injection_host = ExtensionInjectionHost::Create(host_id.id); if (!injection_host) return injection; } else { - DCHECK_EQ(host_id.type(), HostID::WEBUI); + DCHECK_EQ(host_id.type, mojom::HostID::HostType::kWebUi); injection_host.reset(new WebUIInjectionHost(host_id)); }
diff --git a/extensions/renderer/user_script_set.h b/extensions/renderer/user_script_set.h index 216b0c8..efb6d21 100644 --- a/extensions/renderer/user_script_set.h +++ b/extensions/renderer/user_script_set.h
@@ -14,6 +14,7 @@ #include "base/macros.h" #include "base/memory/read_only_shared_memory_region.h" #include "base/observer_list.h" +#include "extensions/common/mojom/host_id.mojom-forward.h" #include "extensions/common/mojom/run_location.mojom-shared.h" #include "extensions/common/user_script.h" #include "third_party/blink/public/platform/web_string.h" @@ -37,8 +38,9 @@ // Called when the set of user scripts is updated. |changed_hosts| contains // the hosts whose scripts have been altered. Note that *all* script objects // are invalidated, even if they aren't in |changed_hosts|. - virtual void OnUserScriptsUpdated(const std::set<HostID>& changed_hosts, - const UserScriptList& scripts) = 0; + virtual void OnUserScriptsUpdated( + const std::set<mojom::HostID>& changed_hosts, + const UserScriptList& scripts) = 0; }; UserScriptSet(); @@ -72,7 +74,7 @@ // Updates scripts given the shared memory region containing user scripts. // Returns true if the scripts were successfully updated. bool UpdateUserScripts(base::ReadOnlySharedMemoryRegion shared_memory, - const std::set<HostID>& changed_hosts, + const std::set<mojom::HostID>& changed_hosts, bool whitelisted_only); // Returns the contents of a script file.
diff --git a/extensions/renderer/user_script_set_manager.cc b/extensions/renderer/user_script_set_manager.cc index 6c75c7f..0b35d54e 100644 --- a/extensions/renderer/user_script_set_manager.cc +++ b/extensions/renderer/user_script_set_manager.cc
@@ -7,6 +7,7 @@ #include "components/crx_file/id_util.h" #include "content/public/renderer/render_thread.h" #include "extensions/common/extension_messages.h" +#include "extensions/common/mojom/host_id.mojom.h" #include "extensions/renderer/dispatcher.h" #include "extensions/renderer/script_injection.h" #include "extensions/renderer/user_script_set.h" @@ -38,8 +39,8 @@ int tab_id, const GURL& url, const std::string& extension_id) { - UserScriptSet* user_script_set = - GetProgrammaticScriptsByHostID(HostID(HostID::EXTENSIONS, extension_id)); + UserScriptSet* user_script_set = GetProgrammaticScriptsByHostID( + mojom::HostID(mojom::HostID::HostType::kExtensions, extension_id)); if (!user_script_set) return std::unique_ptr<ScriptInjection>(); @@ -83,31 +84,31 @@ } UserScriptSet* UserScriptSetManager::GetProgrammaticScriptsByHostID( - const HostID& host_id) { + const mojom::HostID& host_id) { UserScriptSetMap::const_iterator it = programmatic_scripts_.find(host_id); return it != programmatic_scripts_.end() ? it->second.get() : NULL; } void UserScriptSetManager::OnUpdateUserScripts( base::ReadOnlySharedMemoryRegion shared_memory, - const HostID& host_id, - const std::set<HostID>& changed_hosts, + const mojom::HostID& host_id, + const std::set<mojom::HostID>& changed_hosts, bool whitelisted_only) { if (!shared_memory.IsValid()) { NOTREACHED() << "Bad scripts handle"; return; } - for (const HostID& host_id : changed_hosts) { - if (host_id.type() == HostID::EXTENSIONS && - !crx_file::id_util::IdIsValid(host_id.id())) { - NOTREACHED() << "Invalid extension id: " << host_id.id(); + for (const mojom::HostID& host_id : changed_hosts) { + if (host_id.type == mojom::HostID::HostType::kExtensions && + !crx_file::id_util::IdIsValid(host_id.id)) { + NOTREACHED() << "Invalid extension id: " << host_id.id; return; } } UserScriptSet* scripts = NULL; - if (!host_id.id().empty()) { + if (!host_id.id.empty()) { // The expectation when there is a host that "owns" this shared // memory region is that the |changed_hosts| is either the empty list // or just the owner. @@ -128,18 +129,20 @@ // If no hosts are included in the set, that indicates that all // hosts were updated. Add them all to the set so that observers and // individual UserScriptSets don't need to know this detail. - const std::set<HostID>* effective_hosts = &changed_hosts; - std::set<HostID> all_hosts; + const std::set<mojom::HostID>* effective_hosts = &changed_hosts; + std::set<mojom::HostID> all_hosts; if (changed_hosts.empty()) { // The meaning of "all hosts(extensions)" varies, depending on whether some // host "owns" this shared memory region. // No owner => all known hosts. // Owner => just the owner host. - if (host_id.id().empty()) { + if (host_id.id.empty()) { std::set<std::string> extension_ids = RendererExtensionRegistry::Get()->GetIDs(); - for (const std::string& extension_id : extension_ids) - all_hosts.insert(HostID(HostID::EXTENSIONS, extension_id)); + for (const std::string& extension_id : extension_ids) { + all_hosts.insert( + mojom::HostID(mojom::HostID::HostType::kExtensions, extension_id)); + } } else { all_hosts.insert(host_id); }
diff --git a/extensions/renderer/user_script_set_manager.h b/extensions/renderer/user_script_set_manager.h index 820d6e49..3a8ea09b 100644 --- a/extensions/renderer/user_script_set_manager.h +++ b/extensions/renderer/user_script_set_manager.h
@@ -15,6 +15,7 @@ #include "base/observer_list.h" #include "content/public/renderer/render_thread_observer.h" #include "extensions/common/extension.h" +#include "extensions/common/mojom/host_id.mojom-forward.h" #include "extensions/common/mojom/run_location.mojom-shared.h" #include "extensions/common/user_script.h" #include "extensions/renderer/user_script_set.h" @@ -46,7 +47,7 @@ class Observer { public: virtual void OnUserScriptsUpdated( - const std::set<HostID>& changed_hosts) = 0; + const std::set<mojom::HostID>& changed_hosts) = 0; }; UserScriptSetManager(); @@ -86,17 +87,18 @@ private: // Map for per-extension sets that may be defined programmatically. - using UserScriptSetMap = std::map<HostID, std::unique_ptr<UserScriptSet>>; + using UserScriptSetMap = + std::map<mojom::HostID, std::unique_ptr<UserScriptSet>>; // content::RenderThreadObserver implementation. bool OnControlMessageReceived(const IPC::Message& message) override; - UserScriptSet* GetProgrammaticScriptsByHostID(const HostID& host_id); + UserScriptSet* GetProgrammaticScriptsByHostID(const mojom::HostID& host_id); // Handle the UpdateUserScripts extension message. void OnUpdateUserScripts(base::ReadOnlySharedMemoryRegion shared_memory, - const HostID& host_id, - const std::set<HostID>& changed_hosts, + const mojom::HostID& host_id, + const std::set<mojom::HostID>& changed_hosts, bool whitelisted_only); // Scripts statically defined in extension manifests.
diff --git a/extensions/renderer/web_ui_injection_host.cc b/extensions/renderer/web_ui_injection_host.cc index 1838ee43..cfc00ae 100644 --- a/extensions/renderer/web_ui_injection_host.cc +++ b/extensions/renderer/web_ui_injection_host.cc
@@ -4,10 +4,8 @@ #include "extensions/renderer/web_ui_injection_host.h" -WebUIInjectionHost::WebUIInjectionHost(const HostID& host_id) - : InjectionHost(host_id), - url_(host_id.id()) { -} +WebUIInjectionHost::WebUIInjectionHost(const extensions::mojom::HostID& host_id) + : InjectionHost(host_id), url_(host_id.id) {} WebUIInjectionHost::~WebUIInjectionHost() { } @@ -22,7 +20,7 @@ } const std::string& WebUIInjectionHost::name() const { - return id().id(); + return id().id; } extensions::PermissionsData::PageAccess WebUIInjectionHost::CanExecuteOnFrame(
diff --git a/extensions/renderer/web_ui_injection_host.h b/extensions/renderer/web_ui_injection_host.h index 2cf9c201..3d94d66 100644 --- a/extensions/renderer/web_ui_injection_host.h +++ b/extensions/renderer/web_ui_injection_host.h
@@ -6,11 +6,12 @@ #define EXTENSIONS_RENDERER_WEB_UI_INJECTION_HOST_H_ #include "base/macros.h" +#include "extensions/common/mojom/host_id.mojom-forward.h" #include "extensions/renderer/injection_host.h" class WebUIInjectionHost : public InjectionHost { public: - WebUIInjectionHost(const HostID& host_id); + WebUIInjectionHost(const extensions::mojom::HostID& host_id); ~WebUIInjectionHost() override; private:
diff --git a/extensions/shell/browser/shell_desktop_controller_aura_unittest.cc b/extensions/shell/browser/shell_desktop_controller_aura_unittest.cc index 4ae676c..575b5a9 100644 --- a/extensions/shell/browser/shell_desktop_controller_aura_unittest.cc +++ b/extensions/shell/browser/shell_desktop_controller_aura_unittest.cc
@@ -127,7 +127,7 @@ EXPECT_EQ(0, client.insert_char_count()); // Dispatch a keypress on the window tree host to verify it is processed. - ui::KeyEvent key_press(base::char16(97), ui::VKEY_A, ui::DomCode::NONE, + ui::KeyEvent key_press(char16_t(97), ui::VKEY_A, ui::DomCode::NONE, ui::EF_NONE); ui::EventDispatchDetails details = controller_->GetPrimaryHost()->dispatcher()->DispatchEvent(
diff --git a/extensions/test/test_content_script_load_waiter.cc b/extensions/test/test_content_script_load_waiter.cc index cdcb0b80..773becf 100644 --- a/extensions/test/test_content_script_load_waiter.cc +++ b/extensions/test/test_content_script_load_waiter.cc
@@ -14,7 +14,7 @@ } ContentScriptLoadWaiter::~ContentScriptLoadWaiter() = default; -void ContentScriptLoadWaiter::RestrictToHostID(const HostID& host_id) { +void ContentScriptLoadWaiter::RestrictToHostID(const mojom::HostID& host_id) { host_id_ = host_id; } @@ -25,7 +25,7 @@ void ContentScriptLoadWaiter::OnScriptsLoaded( UserScriptLoader* loader, content::BrowserContext* browser_context) { - if (host_id_.id().empty() || loader->HasLoadedScripts(host_id_)) { + if (host_id_.id.empty() || loader->HasLoadedScripts(host_id_)) { // Quit when idle in order to allow other observers to run. run_loop_.QuitWhenIdle(); }
diff --git a/extensions/test/test_content_script_load_waiter.h b/extensions/test/test_content_script_load_waiter.h index f2e40a9c..cf03c20f 100644 --- a/extensions/test/test_content_script_load_waiter.h +++ b/extensions/test/test_content_script_load_waiter.h
@@ -8,6 +8,7 @@ #include "base/run_loop.h" #include "base/scoped_observer.h" #include "extensions/browser/user_script_loader.h" +#include "extensions/common/mojom/host_id.mojom.h" namespace content { class BrowserContext; @@ -24,9 +25,9 @@ ContentScriptLoadWaiter& operator=(const ContentScriptLoadWaiter& other) = delete; - // Restricts the waiter to wait until scripts from the provided HostID are - // loaded. - void RestrictToHostID(const HostID& host_id); + // Restricts the waiter to wait until scripts from the provided mojom::HostID + // are loaded. + void RestrictToHostID(const mojom::HostID& host_id); // Waits until the observed UserScriptLoader completes a script load via the // OnScriptsLoaded event. @@ -38,7 +39,7 @@ content::BrowserContext* browser_context) override; void OnUserScriptLoaderDestroyed(UserScriptLoader* loader) override; - HostID host_id_; + mojom::HostID host_id_; base::RunLoop run_loop_; ScopedObserver<UserScriptLoader, UserScriptLoader::Observer> scoped_observer_; };
diff --git a/fuchsia/base/mem_buffer_util.cc b/fuchsia/base/mem_buffer_util.cc index cc448f9..d8b3464 100644 --- a/fuchsia/base/mem_buffer_util.cc +++ b/fuchsia/base/mem_buffer_util.cc
@@ -48,7 +48,7 @@ base::StringPiece name) { return MemBufferFromString( base::StringPiece(reinterpret_cast<const char*>(data.data()), - data.size() * sizeof(base::char16)), + data.size() * sizeof(char16_t)), name); }
diff --git a/fuchsia/engine/browser/navigation_controller_impl.cc b/fuchsia/engine/browser/navigation_controller_impl.cc index 81f96159..759f55e3 100644 --- a/fuchsia/engine/browser/navigation_controller_impl.cc +++ b/fuchsia/engine/browser/navigation_controller_impl.cc
@@ -227,7 +227,13 @@ void NavigationControllerImpl::DidFinishLoad( content::RenderFrameHost* render_frame_host, const GURL& validated_url) { - // The document and its statically-declared subresources are loaded. + // The current document and its statically-declared subresources are loaded. + + // Don't process load completion on the current document if the WebContents + // is already in the process of navigating to a different page. + if (active_navigation_) + return; + is_main_document_loaded_ = true; OnNavigationEntryChanged(); } @@ -242,18 +248,26 @@ void NavigationControllerImpl::DidStartNavigation( content::NavigationHandle* navigation_handle) { - uncommitted_load_error_ = false; if (!navigation_handle->IsInMainFrame() || navigation_handle->IsSameDocument()) { return; } + uncommitted_load_error_ = false; + active_navigation_ = navigation_handle; is_main_document_loaded_ = false; OnNavigationEntryChanged(); } void NavigationControllerImpl::DidFinishNavigation( content::NavigationHandle* navigation_handle) { + if (!navigation_handle->IsInMainFrame() || + navigation_handle->IsSameDocument() || + navigation_handle != active_navigation_) { + return; + } + + active_navigation_ = nullptr; uncommitted_load_error_ = !navigation_handle->HasCommitted() && navigation_handle->GetNetErrorCode() != net::OK; OnNavigationEntryChanged();
diff --git a/fuchsia/engine/browser/navigation_controller_impl.h b/fuchsia/engine/browser/navigation_controller_impl.h index 58dbaad..88239ad3 100644 --- a/fuchsia/engine/browser/navigation_controller_impl.h +++ b/fuchsia/engine/browser/navigation_controller_impl.h
@@ -77,8 +77,10 @@ fuchsia::web::NavigationState pending_navigation_event_; bool waiting_for_navigation_event_ack_ = false; - // True once the main document finishes loading. + // True once the main document finishes loading and there are no outstanding + // navigations. bool is_main_document_loaded_ = false; + content::NavigationHandle* active_navigation_ = nullptr; // True if navigation failed due to an error during page load. bool uncommitted_load_error_ = false;
diff --git a/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.cc b/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.cc index dc051ff..4643405 100644 --- a/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.cc +++ b/gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.cc
@@ -584,7 +584,8 @@ if (size.width() < 1 || size.height() < 1 || size.width() > max_gl_texture_size_ || size.height() > max_gl_texture_size_) { - LOG(ERROR) << "CreateSharedImage: invalid size"; + LOG(ERROR) << "CreateSharedImage: invalid size=" << size.ToString() + << " max_gl_texture_size=" << max_gl_texture_size_; return false; }
diff --git a/infra/config/generated/cr-buildbucket.cfg b/infra/config/generated/cr-buildbucket.cfg index 67cbf32..ee3cf8c 100644 --- a/infra/config/generated/cr-buildbucket.cfg +++ b/infra/config/generated/cr-buildbucket.cfg
@@ -15359,6 +15359,63 @@ } } builders { + name: "Win x64 Builder (reclient)" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builder:Win x64 Builder (reclient)" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Windows-10" + dimensions: "pool:luci.chromium.ci" + exe { + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + cmd: "recipes" + } + properties: "{\"$build/goma\":{\"use_luci_auth\":true},\"$build/reclient\":{\"instance\":\"goma-rbe-chromium\",\"metrics_project\":\"chromium-reclient-metrics\"},\"$kitchen\":{\"devshell\":true,\"emulate_gce\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"chromium.fyi\",\"recipe\":\"chromium\"}" + execution_timeout_secs: 36000 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "chromium.resultdb.result_sink" + value: 100 + } + experiments { + key: "chromium.resultdb.result_sink.gtests_local" + value: 100 + } + experiments { + key: "chromium.resultdb.result_sink.junit_tests" + value: 100 + } + experiments { + key: "luci.use_realms" + value: 100 + } + resultdb { + enable: true + bq_exports { + project: "luci-resultdb" + dataset: "chromium" + table: "ci_test_results" + test_results {} + } + bq_exports { + project: "luci-resultdb" + dataset: "chromium" + table: "gpu_ci_test_results" + test_results { + predicate { + test_id_regexp: "ninja://(chrome/test:|content/test:fuchsia_)telemetry_gpu_integration_test/.+" + } + } + } + history_options { + use_invocation_timestamp: true + } + } + } + builders { name: "Win10 FYI x64 DX12 Vulkan Debug (NVIDIA)" swarming_host: "chromium-swarm.appspot.com" swarming_tags: "vpython:native-python-wrapper"
diff --git a/infra/config/generated/luci-milo.cfg b/infra/config/generated/luci-milo.cfg index d723cb3..eb0109e 100644 --- a/infra/config/generated/luci-milo.cfg +++ b/infra/config/generated/luci-milo.cfg
@@ -5892,6 +5892,11 @@ category: "perfetto" short_name: "win" } + builders { + name: "buildbucket/luci.chromium.ci/Win x64 Builder (reclient)" + category: "win" + short_name: "re" + } header { oncalls { name: "Chromium"
diff --git a/infra/config/generated/luci-scheduler.cfg b/infra/config/generated/luci-scheduler.cfg index 07b1997..1445f3eb 100644 --- a/infra/config/generated/luci-scheduler.cfg +++ b/infra/config/generated/luci-scheduler.cfg
@@ -3698,6 +3698,16 @@ } } job { + id: "Win x64 Builder (reclient)" + realm: "ci" + acl_sets: "ci" + buildbucket { + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "Win x64 Builder (reclient)" + } +} +job { id: "Win10 FYI x64 DX12 Vulkan Debug (NVIDIA)" realm: "ci" acls { @@ -6905,6 +6915,7 @@ triggers: "Win Builder (dbg)" triggers: "Win x64 Builder" triggers: "Win x64 Builder (dbg)" + triggers: "Win x64 Builder (reclient)" triggers: "Win10 FYI x64 SkiaRenderer Dawn Release (NVIDIA)" triggers: "Windows deterministic" triggers: "android-10-arm64-rel"
diff --git a/infra/config/subprojects/chromium/ci.star b/infra/config/subprojects/chromium/ci.star index a156937..34b8792 100644 --- a/infra/config/subprojects/chromium/ci.star +++ b/infra/config/subprojects/chromium/ci.star
@@ -3595,6 +3595,19 @@ os = os.LINUX_DEFAULT, ) +ci.fyi_windows_builder( + name = "Win x64 Builder (reclient)", + console_view_entry = consoles.console_view_entry( + category = "win", + short_name = "re", + ), + goma_backend = None, + reclient_instance = "goma-rbe-chromium", + configure_kitchen = True, + kitchen_emulate_gce = True, + os = os.WINDOWS_DEFAULT, +) + ci.fyi_celab_builder( name = "win-celab-builder-rel", console_view_entry = consoles.console_view_entry(
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_az.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_az.xtb index d7222d6..d95c5d27 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_az.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_az.xtb
@@ -74,6 +74,7 @@ <translation id="7746854981345936341">Chromium məsləhəti. Geri, İrəli və Axtariş kimi bəzi düymələr artıq ekranın aşağısında yerləşir.</translation> <translation id="786327964234957808">Sinxronizasiya hesablarını <ph name="USER_EMAIL1" /> hesabından <ph name="USER_EMAIL2" /> hesabına keçirirsiniz. Mövcud Chromium datanız <ph name="DOMAIN" /> tərəfindən idarə olunur. Datanızı bu cihazdan siləcək, lakin data <ph name="USER_EMAIL1" /> hesabında qalacaq.</translation> <translation id="7890287942691234100">Chromium skanerindən istifadə etməyə başlayın</translation> +<translation id="7931842119211730154">Chromium bağlandıqda Anonim Tablar kilidlənsin</translation> <translation id="7980860476903281594">Chromium icazə verdiyiniz saytlarla məkanınızı paylaşır.</translation> <translation id="8013573822802650211">Chromium istifadə etdiyiniz hər yerdən tabları görmək üçün bütün cihazlarda daxil olun</translation> <translation id="8073677936375100957">Chromium datası bu cihazdan silinsin?</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_be.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_be.xtb index 03183d8..98202b99 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_be.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_be.xtb
@@ -74,6 +74,7 @@ <translation id="7746854981345936341">Падказка Chromium. Цяпер некаторыя кнопкі знаходзяцца ўнізе экрана, напрыклад "Назад", "Уперад", "Пошук".</translation> <translation id="786327964234957808">Вы пераключаецеся з уліковага запісу сінхранізацыі <ph name="USER_EMAIL1" /> на <ph name="USER_EMAIL2" />. Вашымі існуючымі данымі Chromium кіруе дамен <ph name="DOMAIN" />. З гэтай прылады даныя будуць выдалены, але яны застануцца ва ўліковым запісе <ph name="USER_EMAIL1" />.</translation> <translation id="7890287942691234100">Пачніце карыстацца сканерам Chromium</translation> +<translation id="7931842119211730154">Блакіраваць доступ да ўкладак у рэжыме інкогніта пры закрыцці Chromium</translation> <translation id="7980860476903281594">Chromium абагульвае інфармацыю пра ваша месцазнаходжанне толькі з адобранымі вамі сайтамі.</translation> <translation id="8013573822802650211">Каб мець доступ да сваіх укладак з усіх прылад, на якіх вы выкарыстоўваеце Chromium, увайдзіце на іх ва ўліковы запіс</translation> <translation id="8073677936375100957">Выдаліць даныя Chromium з гэтай прылады?</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_et.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_et.xtb index 0d3d845..c2a6d0735 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_et.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_et.xtb
@@ -74,6 +74,7 @@ <translation id="7746854981345936341">Chromiumi nõuanne. Mõned nupud, näiteks Tagasi, Edasi ja Otsing, asuvad nüüd ekraani alaosas.</translation> <translation id="786327964234957808">Vahetate sünkroonitavad kontod aadressilt <ph name="USER_EMAIL1" /> aadressile <ph name="USER_EMAIL2" />. Teie olemasolevaid Chromiumi andmeid haldab domeen <ph name="DOMAIN" />. Teie andmed kustutatakse sellest seadmest, kuid need jäävad alles kontole <ph name="USER_EMAIL1" />.</translation> <translation id="7890287942691234100">Alustage Chromiumi skanneri kasutamist</translation> +<translation id="7931842119211730154">Lukusta Chromiumi sulgemisel inkognito vahelehed</translation> <translation id="7980860476903281594">Chromium jagab teie asukohateavet saitidega, millele olete loa andnud.</translation> <translation id="8013573822802650211">Selleks et näha vahelehti kõikjalt, kus Chromiumi kasutate, logige kõigisse oma seadmetesse sisse</translation> <translation id="8073677936375100957">Kas kustutada sellest seadmest Chromiumi andmed?</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_eu.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_eu.xtb index 086e540..eb16202 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_eu.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_eu.xtb
@@ -74,6 +74,7 @@ <translation id="7746854981345936341">Chromium-i buruzko aholkua: botoi batzuk pantailaren behealdean daude; esaterako, Atzera, Aurrera eta Bilaketa botoiak.</translation> <translation id="786327964234957808"><ph name="USER_EMAIL1" /> kontuaren ordez <ph name="USER_EMAIL2" /> kontua erabiliko duzu sinkronizatzeko. <ph name="DOMAIN" /> da zure orain arteko Chromium datuen kudeatzailea. Aurrera eginez gero, datuak ezabatu egingo dira gailu honetatik, baina <ph name="USER_EMAIL1" /> kontuan egoten jarraituko dute.</translation> <translation id="7890287942691234100">Hasi Chromium-en eskanerra erabiltzen</translation> +<translation id="7931842119211730154">Blokeatu ezkutuko moduko fitxak Chromium ixten duzunean</translation> <translation id="7980860476903281594">Onartzen dituzun webguneekin partekatuko du kokapena Chromium-ek.</translation> <translation id="8013573822802650211">Chromium erabiltzen duzun gailu guztietan zure fitxak eskura izateko, hasi saioa gailu guztietan</translation> <translation id="8073677936375100957">Gailu honetan dituzun Chromium-eko datuak garbitu nahi dituzu?</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_fi.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_fi.xtb index 6aebaacf..795762e 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_fi.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_fi.xtb
@@ -74,6 +74,7 @@ <translation id="7746854981345936341">Chromium-vinkki: Takaisin, Seuraava, Haku ja jotkin muut painikkeet löytyvät nyt näytön alareunasta.</translation> <translation id="786327964234957808">Muutoksen jälkeen synkronointi käyttää tilin <ph name="USER_EMAIL1" /> sijaan tiliä <ph name="USER_EMAIL2" />. <ph name="DOMAIN" /> hallitsee olemassa olevia Chromium-tietojasi. Tiedot poistetaan tältä laitteelta, mutta ne säilyvät tilillä <ph name="USER_EMAIL1" />.</translation> <translation id="7890287942691234100">Aloita Chromium-lukijan käyttö</translation> +<translation id="7931842119211730154">Lukitse incognito-välilehdet, kun suljet Chromiumin</translation> <translation id="7980860476903281594">Chromium jakaa sijaintisi sallimillesi sivustoille.</translation> <translation id="8013573822802650211">Kirjaudu sisään kaikilla laitteillasi, jotta voit nähdä Chromium-välilehtesi missä tahansa</translation> <translation id="8073677936375100957">Poistetaanko Chromium-data tältä laitteelta?</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_fr-CA.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_fr-CA.xtb index 8ca3010..21c7d2f 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_fr-CA.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_fr-CA.xtb
@@ -74,6 +74,7 @@ <translation id="7746854981345936341">Conseil pour Chromium. Certains boutons se trouvent désormais en bas de votre écran, comme Précédent, Suivant et Rechercher.</translation> <translation id="786327964234957808">Vous changez de compte synchronisé pour passer de <ph name="USER_EMAIL1" /> à <ph name="USER_EMAIL2" />. Vos données Chromium actuelles sont gérées par <ph name="DOMAIN" />. Cette opération entraînera la suppression de vos données sur cet appareil, mais celles-ci resteront dans le compte <ph name="USER_EMAIL1" />.</translation> <translation id="7890287942691234100">Commencer à utiliser le lecteur de Chromium</translation> +<translation id="7931842119211730154">Verrouiller les onglets de navigation privée lorsque vous fermez Chromium</translation> <translation id="7980860476903281594">Chromium partage votre position avec les sites que vous autorisez.</translation> <translation id="8013573822802650211">Pour voir vos onglets partout où vous utilisez Chromium, connectez-vous sur tous vos appareils</translation> <translation id="8073677936375100957">Effacer vos données Chromium de cet appareil?</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_gu.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_gu.xtb index 7603fec..e9fe475 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_gu.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_gu.xtb
@@ -74,6 +74,7 @@ <translation id="7746854981345936341">Chromium ટિપ. પાછળ, ફૉર્વર્ડ અને શોધ જેવાં કેટલાક બટનો હવે તમારી સ્ક્રીનના તળિયે છે.</translation> <translation id="786327964234957808">તમે <ph name="USER_EMAIL1" />થી <ph name="USER_EMAIL2" /> પર સિંક એકાઉન્ટને સ્વિચ કરી રહ્યાં છો. તમારો અસ્તિત્વમાંનો Chromium ડેટા <ph name="DOMAIN" /> દ્વારા મેનેજ કરવામાં આવે છે. આ ડિવાઇસ પરથી આ તમારા ડેટાને ડિલીટ કરશે, પરંતુ તમારો ડેટા <ph name="USER_EMAIL1" /> માં રહેશે.</translation> <translation id="7890287942691234100">Chromium સ્કૅનરને ઉપયોગ કરવાનું શરૂ કરો</translation> +<translation id="7931842119211730154">તમે Chromium બંધ કરો, ત્યારે છૂપી ટૅબ લૉક કરો</translation> <translation id="7980860476903281594">Chromium તમે મંજૂરી આપો છો તે સાઇટ સાથે તમારા સ્થાનની માહિતી શેર કરે છે.</translation> <translation id="8013573822802650211">તમે જ્યાંથી Chromiumનો ઉપયોગ કરો ત્યાંથી તમારી ટૅબ જોવા માટે, તમારા બધાં ડિવાઇસ પર સાઇન ઇન કરો</translation> <translation id="8073677936375100957">ડિવાઇસમાંથી તમારા Chromium ડેટાને સાફ કરીએ?</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb index f5d587da..af3a717b 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb
@@ -73,6 +73,7 @@ <translation id="7746854981345936341">क्रोमियम के लिए सलाह. 'वापस जाएं', 'आगे जाएं' और 'खोजें' जैसे कुछ बटन अब आपकी स्क्रीन के सबसे नीचे मिलेंगे.</translation> <translation id="786327964234957808">आप सिंक खातों को <ph name="USER_EMAIL1" /> से <ph name="USER_EMAIL2" /> में बदल रहे हैं. आपके मौजूदा क्रोमियम डेटा को <ph name="DOMAIN" /> प्रबंधित करता है. इससे इस डिवाइस से आपका डेटा मिट जाएगा, लेकिन आपका डेटा <ph name="USER_EMAIL1" /> में बना रहेगा.</translation> <translation id="7890287942691234100">क्रोमियम स्कैनर का इस्तेमाल करना शुरू करें</translation> +<translation id="7931842119211730154">Chromium बंद करने पर अपने गुप्त टैब लॉक करें</translation> <translation id="7980860476903281594">Chromium उन साइटों के साथ आपकी जगह की जानकारी शेयर करता है जिन्हें आप अनुमति देते हैं.</translation> <translation id="8013573822802650211">आप जिन डिवाइस पर क्रोमियम का इस्तेमाल करते हैं उन सभी पर खोले गए टैब देखने के लिए, अपने सभी डिवाइस पर साइन इन करें</translation> <translation id="8073677936375100957">इस डिवाइस से अपना क्रोमियम डेटा हटाएं?</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_iw.xtb index 7323e5f9..08ad7523 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_iw.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_iw.xtb
@@ -74,6 +74,7 @@ <translation id="7746854981345936341">טיפ למשתמשי Chromium. חלק מהלחצנים נמצאים עכשיו בחלק התחתון של המסך, כמו 'הקודם', 'קדימה' ו'חיפוש'.</translation> <translation id="786327964234957808">מתבצע מעבר מחשבון סנכרון <ph name="USER_EMAIL1" /> אל <ph name="USER_EMAIL2" />. נתוני Chromium הקיימים שלך מנוהלים על-ידי <ph name="DOMAIN" />. פעולה זו תמחק את הנתונים שלך מהמכשיר הזה, אבל הם יישארו ב-<ph name="USER_EMAIL1" />.</translation> <translation id="7890287942691234100">התחלת השימוש בסורק של Chromium</translation> +<translation id="7931842119211730154">כרטיסיות מצב אנונימי יינעלו כש-Chromium ייסגר</translation> <translation id="7980860476903281594">המיקום שלך ישותף על ידי Chromium עם אתרים שיאושרו על ידך.</translation> <translation id="8013573822802650211">כדי לראות את הכרטיסיות שלך מכל מקום שבו פתחת את Chromium יש להיכנס לחשבון בכל המכשירים</translation> <translation id="8073677936375100957">למחוק את נתוני Chromium שלך מהמכשיר הזה?</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_kk.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_kk.xtb index b19d13c..4c516e6 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_kk.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_kk.xtb
@@ -74,6 +74,7 @@ <translation id="7746854981345936341">Chromium кеңесі. "Артқа", "Алға" және "Іздеу" сияқты түймелер қазір экранның төменгі жағында орналасқан.</translation> <translation id="786327964234957808"><ph name="USER_EMAIL1" /> синхрондау есептік жазбаларын <ph name="USER_EMAIL2" /> жазбасына ауыстырудасыз. Қолданыстағы Chromium деректерін <ph name="DOMAIN" /> басқарады. Мұның нәтижесінде деректер құрылғыдан жойылады, бірақ <ph name="USER_EMAIL1" /> жазбасында сақталады.</translation> <translation id="7890287942691234100">Chromium сканерін пайдалана бастау</translation> +<translation id="7931842119211730154">Chromium браузерін жабу кезінде инкогнито қойындыларын құлыптау</translation> <translation id="7980860476903281594">Chromium геодерегіңізді сіз рұқсат еткен сайттармен бөліседі.</translation> <translation id="8013573822802650211">Chromium браузерін кез келген жерде пайдаланғанда, қойындыларды көру үшін барлық құрылғыларда есептік жазбаға кіріңіз.</translation> <translation id="8073677936375100957">Chromium деректері осы құрылғыдан жойылсын ба?</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_kn.xtb index 3364e65..cbbc0f7 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_kn.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_kn.xtb
@@ -74,6 +74,7 @@ <translation id="7746854981345936341">Chromium ಸಲಹೆ. ಹಿಂದೆ, ಮುಂದೆ ಮತ್ತು ಹುಡುಕಾಟದಂತಹ ಕೆಲವು ಬಟನ್ಗಳು ಈಗ ನಿಮ್ಮ ಪರದೆಯ ಕೆಳಭಾಗದಲ್ಲಿವೆ.</translation> <translation id="786327964234957808"><ph name="USER_EMAIL1" /> ರಿಂದ <ph name="USER_EMAIL2" /> ಗೆ ನೀವು ಸಿಂಕ್ ಖಾತೆಗಳನ್ನು ಬದಲಾಯಿಸುತ್ತಿರುವಿರಿ. ನಿಮ್ಮ ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ Chromium ಡೇಟಾವನ್ನು <ph name="DOMAIN" /> ರಿಂದ ನಿರ್ವಹಿಸಲಾಗುತ್ತಿದೆ. ಈ ಸಾಧನದಲ್ಲಿರುವ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಇದು ಅಳಿಸಿಹಾಕುತ್ತದೆ, ಆದರೆ ನಿಮ್ಮ ಡೇಟಾ <ph name="USER_EMAIL1" /> ರಲ್ಲಿಯೇ ಇರುತ್ತದೆ.</translation> <translation id="7890287942691234100">Chromium ಸ್ಕ್ಯಾನರ್ ಬಳಸಲು ಪ್ರಾರಂಭಿಸಿ</translation> +<translation id="7931842119211730154">ನೀವು Chromium ಅನ್ನು ಮುಚ್ಚಿದಾಗ ಅಜ್ಞಾತ ಟ್ಯಾಬ್ಗಳನ್ನು ಲಾಕ್ ಮಾಡಿ</translation> <translation id="7980860476903281594">ನೀವು ಅನುಮತಿಸುವ ಸೈಟ್ಗಳ ಜೊತೆಗೆ Chromium ನಿಮ್ಮ ಸ್ಥಳವನ್ನು ಹಂಚಿಕೊಳ್ಳುತ್ತದೆ.</translation> <translation id="8013573822802650211">ನೀವು Chromium ಅನ್ನು ಎಲ್ಲಿ ಬಳಸುತ್ತೀರೋ ಅಲ್ಲಿ ನಿಮ್ಮ ಟ್ಯಾಬ್ಗಳನ್ನು ನೋಡಲು, ನಿಮ್ಮ ಎಲ್ಲಾ ಸಾಧನಗಳಲ್ಲಿ ಸೈನ್ ಇನ್ ಮಾಡಿ</translation> <translation id="8073677936375100957">ಈ ಸಾಧನದಿಂದ ನಿಮ್ಮ Chromium ಡೇಟಾ ತೆರವುಗೊಳಿಸುವುದೇ?</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ko.xtb index 8661bfe..f25d9e25 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_ko.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ko.xtb
@@ -74,6 +74,7 @@ <translation id="7746854981345936341">Chromium 도움말. 뒤로, 앞으로, 검색과 같은 일부 버튼이 화면 하단으로 이동했습니다.</translation> <translation id="786327964234957808">동기화 계정을 <ph name="USER_EMAIL1" />에서 <ph name="USER_EMAIL2" />(으)로 전환합니다. 기존 Chromium 데이터는 <ph name="DOMAIN" />에서 관리됩니다. 이 기기에서는 데이터가 삭제되지만 <ph name="USER_EMAIL1" />에 계속해서 데이터가 보관됩니다.</translation> <translation id="7890287942691234100">Chromium 스캐너 사용 시작</translation> +<translation id="7931842119211730154">Chromium 종료 시 시크릿 탭 잠금</translation> <translation id="7980860476903281594">Chromium은 사용자가 허용한 사이트와 위치 정보를 공유합니다.</translation> <translation id="8013573822802650211">Chromium을 사용하는 어느 곳에서나 탭을 확인하려면 모든 기기에서 로그인하세요.</translation> <translation id="8073677936375100957">기기에서 Chromium 데이터를 삭제하시겠습니까?</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ky.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ky.xtb index 40fa835..74a8ef88 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_ky.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ky.xtb
@@ -74,6 +74,7 @@ <translation id="7746854981345936341">Chromium'дан кеңеш. Артка, Алдыга жана Издөө сыяктуу айрым баскычтар эми экраныңыздын төмөн жагында жайгашкан.</translation> <translation id="786327964234957808">Шайкештирилүүчү каттоо эсебин <ph name="USER_EMAIL1" /> дарегинен <ph name="USER_EMAIL2" /> дарегине которуп жатасыз. Учурдагы Chromium дайын-даректериңиз <ph name="DOMAIN" /> тарабынан башкарылат. Ушуну менен бул түзмөктөн дайын-даректериңиз өчүрүлөт, бирок алар <ph name="USER_EMAIL1" /> дарегинде кала берет.</translation> <translation id="7890287942691234100">Chromium сканерин колдонуп баштоо</translation> +<translation id="7931842119211730154">Chromium жабылганда, жашыруун өтмөктөрдү кулпулоо</translation> <translation id="7980860476903281594">Chromium кайда жүргөнүңүздү сиз уруксат берген сайттар менен бөлүшөт.</translation> <translation id="8013573822802650211">Chromium колдонулган түзмөктөрдүн баарындагы өтмөктөрүңүздү көрүү үчүн бардык түзмөктөрдөн аккаунтуңузга кириңиз</translation> <translation id="8073677936375100957">Chromium'дагы дайын-даректериңиз бул түзмөктөн өчүрүлсүнбү?</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_lo.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_lo.xtb index e53b886..02a68b7a 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_lo.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_lo.xtb
@@ -73,6 +73,7 @@ <translation id="7746854981345936341">ເຄັດລັບກ່ຽວກັບ Chromium. ດຽວນີ້ບາງປຸ່ມຢູ່ສ່ວນລຸ່ມຂອງໜ້າຈໍ ເຊັ່ນ: ກັບຄືນ, ສົ່ງຕໍ່ ແລະ ຊອກຫາ.</translation> <translation id="786327964234957808">ທ່ານກຳລັງປ່ຽນບັນຊີຊິ້ງຂໍ້ມູນຈາກ <ph name="USER_EMAIL1" /> ເປັນ <ph name="USER_EMAIL2" />. ຂໍ້ມູນ Chromium ທີ່ມີຢູ່ຖືກຈັດການໂດຍ <ph name="DOMAIN" />. ນີ້ຈະລຶບຂໍ້ມູນຂອງທ່ານອອກຈາກອຸປະກອນນີ້, ແຕ່ຂໍ້ມູນຂອງທ່ານຈະຍັງຄົງຢູ່ໃນ <ph name="USER_EMAIL1" />.</translation> <translation id="7890287942691234100">ເລີ່ມໃຊ້ເຄື່ອງສະແກນ Chromium</translation> +<translation id="7931842119211730154">ລັອກ incognito tab ເມື່ອທ່ານປິດ Chromium</translation> <translation id="7980860476903281594">Chromium ຈະແບ່ງປັນສະຖານທີ່ຂອງທ່ານໃຫ້ກັບເວັບໄຊທີ່ທ່ານອະນຸຍາດ.</translation> <translation id="8013573822802650211">ເພື່ອເຫັນແຖບຂອງທ່ານຈາກທຸກບ່ອນທີ່ທ່ານໃຊ້ Chromium, ກະລຸນາເຂົ້າສູ່ລະບົບໃນອຸປະກອນທັງໝົດຂອງທ່ານ</translation> <translation id="8073677936375100957">ລຶບລ້າງຂໍ້ມູນ Chromium ຂອງທ່ານຈາກອຸປະກອນນີ້ອອກບໍ?</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_lt.xtb index 0b66fd8..70fb387 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_lt.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_lt.xtb
@@ -74,6 +74,7 @@ <translation id="7746854981345936341">„Chromium“ patarimas. Kai kurie mygtukai dabar yra ekrano apačioje, pvz., mygtukai „Atgal“, „Pirmyn“ ir „Ieškoti“.</translation> <translation id="786327964234957808">Perjungiate sinchronizuojamas paskyras iš <ph name="USER_EMAIL1" /> į <ph name="USER_EMAIL2" />. Esamus „Chromium“ duomenis tvarko <ph name="DOMAIN" />. Tai atlikus bus ištrinti duomenys iš šio įrenginio, bet duomenys liks <ph name="USER_EMAIL1" />.</translation> <translation id="7890287942691234100">Pradėkite naudoti „Chromium“ skaitytuvą</translation> +<translation id="7931842119211730154">Užrakinti inkognito skirtukus uždarius „Chromium“</translation> <translation id="7980860476903281594">„Chromium“ bendrina jūsų vietovę su svetainėmis, kurioms leidžiate gauti tokius duomenis.</translation> <translation id="8013573822802650211">Kad matytumėte skirtukus iš visų įrenginių, kuriuose naudojate „Chromium“, prisijunkite visuose įrenginiuose</translation> <translation id="8073677936375100957">Išvalyti jūsų „Chromium“ duomenis iš šio įrenginio?</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ml.xtb index 959c8704..75e18a8 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_ml.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ml.xtb
@@ -74,6 +74,7 @@ <translation id="7746854981345936341">Chromium നുറുങ്ങ്. മടങ്ങുക, മുമ്പോട്ട് പോകുക, തിരയൽ എന്നീ ചില ബട്ടണുകൾ, ഇപ്പോൾ നിങ്ങളുടെ സ്ക്രീനിന്റെ താഴെയാണ്.</translation> <translation id="786327964234957808">നിങ്ങൾ <ph name="USER_EMAIL1" /> എന്നതിൽ നിന്ന് <ph name="USER_EMAIL2" /> എന്നതിലേക്ക് സമന്വയ അക്കൗണ്ടുകൾ മാറ്റുകയാണ്. <ph name="DOMAIN" /> ഡൊമെയ്നാണ് നിങ്ങളുടെ നിലവിലുള്ള Chromium വിവരങ്ങൾ മാനേജ് ചെയ്യുന്നത്. ഇത് ഈ ഉപകരണത്തിൽ നിന്ന് വിവരങ്ങൾ ഇല്ലാതാക്കുമെങ്കിലും <ph name="USER_EMAIL1" /> എന്നതിൽ തുടർന്നും അവ ഉണ്ടായിരിക്കുന്നതാണ്.</translation> <translation id="7890287942691234100">Chromium സ്കാനർ ഉപയോഗിക്കാൻ ആരംഭിക്കുക</translation> +<translation id="7931842119211730154">Chromium അടയ്ക്കുമ്പോൾ അദൃശ്യ ടാബുകൾ ലോക്ക് ചെയ്യുക</translation> <translation id="7980860476903281594">നിങ്ങൾ അനുവദിക്കുന്ന സൈറ്റുകളുമായി Chromium നിങ്ങളുടെ ലൊക്കേഷൻ പങ്കിടും.</translation> <translation id="8013573822802650211">Chromium ഉപയോഗിക്കുന്നിടത്തെല്ലാം നിങ്ങളുടെ ടാബുകൾ കാണാൻ, നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളിലും സൈൻ ഇൻ ചെയ്യുക</translation> <translation id="8073677936375100957">ഉപകരണത്തില് നിന്ന് Chromium ഡാറ്റ മായ്ക്കണോ?</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ms.xtb index ebd56435..c8007ac 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_ms.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ms.xtb
@@ -74,6 +74,7 @@ <translation id="7746854981345936341">Petua Chromium. Sesetengah butang kini terletak di bahagian bawah skrin anda, seperti Kembali, Ke Hadapan dan Carian.</translation> <translation id="786327964234957808">Anda sedang menukar akaun penyegerakan daripada <ph name="USER_EMAIL1" /> kepada <ph name="USER_EMAIL2" />. Data Chromium sedia ada diurus oleh <ph name="DOMAIN" />. Tindakan ini akan memadamkan data anda daripada peranti ini, tetapi data itu akan kekal disimpan dalam <ph name="USER_EMAIL1" />.</translation> <translation id="7890287942691234100">Mula menggunakan pengimbas Chromium</translation> +<translation id="7931842119211730154">Kunci Tab Inkognito Apabila Anda Menutup Chromium</translation> <translation id="7980860476903281594">Chromium berkongsi lokasi anda dengan laman yang anda benarkan.</translation> <translation id="8013573822802650211">Untuk melihat tab anda daripada mana-mana tempat anda menggunakan Chromium, log masuk ke semua peranti anda</translation> <translation id="8073677936375100957">Kosongkan data Chromium anda daripada peranti ini?</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_my.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_my.xtb index 5af09ac9..60f0a85 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_my.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_my.xtb
@@ -74,6 +74,7 @@ <translation id="7746854981345936341">Chromium အကြံပြုချက်။ 'နောက်သို့'၊ 'ရှေ့သို့' နှင့် 'ရှာဖွေရန်' ကဲ့သို့သော အချို့ခလုတ်များသည် ယခုအခါ မျက်နှာပြင်၏ အောက်ခြေတွင် ရှိပါသည်။</translation> <translation id="786327964234957808">သင်သည် စင့်ခ်အကောင့်များကို <ph name="USER_EMAIL1" /> မှ <ph name="USER_EMAIL2" /> သို့ ပြောင်းနေပါသည်။ သင်၏လက်ရှိ Chromium ဒေတာကို <ph name="DOMAIN" /> က စီမံခန့်ခွဲထားခြင်း ဖြစ်သည်။ ဤသို့ ပြုလုပ်ခြင်းအားဖြင့် ဤစက်ပစ္စည်းရှိ သင့်ဒေတာများကို ဖျက်လိုက်မည်ဖြစ်သော်လည်း ၎င်းဒေတာများသည် <ph name="USER_EMAIL1" /> တွင် ရှိနေဦးမည် ဖြစ်သည်။</translation> <translation id="7890287942691234100">Chromium ရှာဖွေစနစ် စတင်အသုံးပြုခြင်း</translation> +<translation id="7931842119211730154">Chrome ကို ပိတ်သည့်အခါ ရုပ်ဖျက်တဘ်များကို လော့ခ်ချရန်</translation> <translation id="7980860476903281594">Chromium သည် သင်၏တည်နေရာကို သင်ခွင့်ပြုသော ဝဘ်ဆိုက်များအား မျှဝေသည်။</translation> <translation id="8013573822802650211">Chromium အသုံးပြုသည့် နေရာမှန်သမျှမှ သင့်တဘ်များကိုကြည့်ရန် သင့်စက်အားလုံးတွင် လက်မှတ်ထိုးဝင်ပါ</translation> <translation id="8073677936375100957">ဤစက်မှ သင်၏ Chromium ဒေတာများကို ဖယ်ရှားလိုပါသလား။</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_or.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_or.xtb index bc41bf56..a30a5f2 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_or.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_or.xtb
@@ -74,6 +74,7 @@ <translation id="7746854981345936341">Chromium ପରାମର୍ଶ। ବ୍ୟାକ୍, ଫର୍ୱର୍ଡ, ଏବଂ ସର୍ଚ୍ଚ ଭଳି କିଛି ବଟନ୍ ବର୍ତ୍ତମାନ ଆପଣଙ୍କ ସ୍କ୍ରିନ୍ର ତଳେ ଅଛି।</translation> <translation id="786327964234957808">ଆପଣ ସିଙ୍କ ଆକାଉଣ୍ଟ <ph name="USER_EMAIL1" /> ରୁ <ph name="USER_EMAIL2" />କୁ ସ୍ୱିଚ୍ କରୁଛନ୍ତି। ଆପଣଙ୍କର ପୂର୍ବରୁ ଥିବା Chromium ଡାଟା <ph name="DOMAIN" /> ଦ୍ୱାରା ପରିଚାଳିତ ହେଉଛି। ଏହା ଏହି ଡିଭାଇସ୍ରୁ ଆପଣଙ୍କର ଡାଟା ଡିଲିଟ୍ କରିଦେବ, କିନ୍ତୁ ଆପଣଙ୍କର ଡାଟା <ph name="USER_EMAIL1" />ରେ ରହିବ।</translation> <translation id="7890287942691234100">Chromium ସ୍କାନର୍ ବ୍ୟବହାର କରିବାକୁ ଆରମ୍ଭ କରନ୍ତୁ</translation> +<translation id="7931842119211730154">ଆପଣ Chromium ବନ୍ଦ କରିବା ସମୟରେ ଇନକଗ୍ନିଟୋ ଟାବଗୁଡ଼ିକୁ ଲକ୍ କରନ୍ତୁ</translation> <translation id="7980860476903281594">ଆପଣ ଅନୁମତି ଦେଇଥିବା ସାଇଟଗୁଡ଼ିକ ସହିତ Chromium ଆପଣଙ୍କ ଲୋକେସନ୍ ସେୟାର୍ କରିଥାଏ।</translation> <translation id="8013573822802650211">ଆପଣ Chromium ବ୍ୟବହାର କରୁଥିବା ଯେ କୌଣସି ସ୍ଥାନରୁ ଆପଣଙ୍କ ଟାବଗୁଡ଼ିକ ଦେଖିବାକୁ, ଆପଣଙ୍କ ସମସ୍ତ ଡିଭାଇସରେ ସାଇନ୍ ଇନ୍ କରନ୍ତୁ</translation> <translation id="8073677936375100957">ଏହି ଡିଭାଇସ୍ରୁ ଆପଣଙ୍କର Chromium ଡାଟା ଖାଲି କରିବେ କି?</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ro.xtb index 6080bfd..c10e537 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_ro.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ro.xtb
@@ -74,6 +74,7 @@ <translation id="7746854981345936341">Sfat pentru Chromium: unele butoane se află acum în partea de jos a ecranului, cum ar fi Înapoi, Înainte și Caută.</translation> <translation id="786327964234957808">Comuți contul pentru sincronizare de la <ph name="USER_EMAIL1" /> la <ph name="USER_EMAIL2" />. Datele Chromium existente sunt gestionate de <ph name="DOMAIN" />. Astfel, datele vor fi șterse de pe acest dispozitiv, dar vor rămâne în <ph name="USER_EMAIL1" />.</translation> <translation id="7890287942691234100">Începe să folosești scanerul din Chromium</translation> +<translation id="7931842119211730154">Blochează filele incognito când închizi Chromium</translation> <translation id="7980860476903281594">Chromium trimite locația ta către site-urile pe care le permiți.</translation> <translation id="8013573822802650211">Conectează-te pe toate dispozitivele ca să vezi toate filele tale deschise în Chromium</translation> <translation id="8073677936375100957">Ștergi datele tale Chromium de pe dispozitiv?</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ru.xtb index f098dda..6133d07a 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_ru.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ru.xtb
@@ -74,6 +74,7 @@ <translation id="7746854981345936341">Совет для Chromium. Некоторые кнопки, например "Назад", "Вперед" и "Поиск", теперь расположены в нижней части экрана.</translation> <translation id="786327964234957808">Вы переходите из аккаунта <ph name="USER_EMAIL1" /> в <ph name="USER_EMAIL2" />. Данными Chromium управляет администратор домена <ph name="DOMAIN" />. Обратите внимание, что данные будут удалены с устройства, но сохранятся в аккаунте <ph name="USER_EMAIL1" />.</translation> <translation id="7890287942691234100">Используйте сканер в Chromium</translation> +<translation id="7931842119211730154">Блокировать доступ к вкладкам инкогнито при закрытии Chromium</translation> <translation id="7980860476903281594">Chromium сообщает геоданные только тем сайтам, которые вы разрешили.</translation> <translation id="8013573822802650211">Чтобы ваши вкладки всегда были доступны вам при работе с Chromium, выполните вход на всех своих устройствах.</translation> <translation id="8073677936375100957">Удалить данные Chromium с этого устройства?</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_sq.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_sq.xtb index a915bef..10b9f8b 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_sq.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_sq.xtb
@@ -75,6 +75,7 @@ <translation id="786327964234957808">Po i ndërron llogaritë e sinkronizimit nga <ph name="USER_EMAIL1" /> te <ph name="USER_EMAIL2" />. Të dhënat ekzistuese të Chromium po menaxhohen nga <ph name="DOMAIN" />. Kjo do t'i fshijë të dhënat e tua nga kjo pajisje, por të dhënat e tua do të mbeten në <ph name="USER_EMAIL1" />.</translation> <translation id="7890287942691234100">Fillo të përdorësh skanerin e Chromium</translation> <translation id="7931842119211730154">Kyçi skedat "e fshehta" kur të mbyllësh Chromium</translation> +<translation id="7980860476903281594">Chromium e ndan vendndodhjen tënde me sajtet që lejon ti.</translation> <translation id="8013573822802650211">Për të parë skedat e tua nga çdo vend ku përdor Chromium, identifikohu në të gjitha pajisjet e tua</translation> <translation id="8073677936375100957">Të pastrohen të dhënat e tua të Chromium nga kjo pajisje?</translation> <translation id="8175055321229419309">Këshillë: <ph name="BEGIN_LINK" />Zhvendose Chromium te stacioni yt<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ta.xtb index d8c0145..bcc5ab77 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_ta.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ta.xtb
@@ -74,6 +74,7 @@ <translation id="7746854981345936341">Chromium உதவிக்குறிப்பு: 'பின்செல்’, ‘முன்செல்’, ‘தேடு’ போன்ற சில பட்டன்கள் இப்போது உங்கள் திரையின் அடிப்பகுதியில் உள்ளன.</translation> <translation id="786327964234957808">ஒத்திசைவுக் கணக்குகளை <ph name="USER_EMAIL1" /> இலிருந்து <ph name="USER_EMAIL2" />க்கு மாற்றுகிறீர்கள். தற்போதுள்ள Chromium தரவை <ph name="DOMAIN" /> நிர்வகிக்கிறது. இவ்வாறு செய்வதால், இந்தச் சாதனத்திலிருந்து தரவு நீக்கப்படும், எனினும் <ph name="USER_EMAIL1" /> இல் தரவு தொடர்ந்து இருக்கும்.</translation> <translation id="7890287942691234100">Chromium ஸ்கேனரைப் பயன்படுத்தத் தொடங்கவும்</translation> +<translation id="7931842119211730154">Chromiumமை மூடும்போது மறைநிலைத் தாவல்களைப் பூட்டு</translation> <translation id="7980860476903281594">நீங்கள் அனுமதிக்கும் தளங்களுடன் இருப்பிடத் தகவலை Chromium பகிரும்.</translation> <translation id="8013573822802650211">நீங்கள் Chromiumமைப் பயன்படுத்தும் சாதனங்களில் உங்கள் தாவல்களைப் பார்க்க, அனைத்துச் சாதனங்களிலும் உள்நுழையவும்</translation> <translation id="8073677936375100957">இந்தச் சாதனத்திலிருந்து உங்கள் Chromium தரவை அழிக்கவா?</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ur.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ur.xtb index 29e9b6c..dff6152 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_ur.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ur.xtb
@@ -74,6 +74,7 @@ <translation id="7746854981345936341">Chromium تجویز۔ واپس جائیں، فارورڈ کریں، اور تلاش کریں جیسے بعض بٹنز اب آپ کی اسکرین کے نیچے ہیں۔</translation> <translation id="786327964234957808">آپ مطابقت پذیری اکاؤنٹس کو <ph name="USER_EMAIL1" /> سے <ph name="USER_EMAIL2" /> پر سوئچ کر رہے ہیں۔ آپ کا موجودہ Chromium ڈیٹا <ph name="DOMAIN" /> کے زیر انتظام ہے۔ اس سے آپ کا ڈیٹا اس آلہ سے حذف ہو جائے گا، لیکن آپ کا ڈیٹا <ph name="USER_EMAIL1" /> میں باقی رہے گا۔</translation> <translation id="7890287942691234100">Chromium اسکینر کا استعمال شروع کریں</translation> +<translation id="7931842119211730154">جب آپ Chromium کو بند کریں تو پوشیدگی ٹیبز کو مقفل کر دیں</translation> <translation id="7980860476903281594">Chromium آپ کے مقام کی معلومات کا اشتراک ان سائٹس کے ساتھ کرتا ہے جن کی آپ اجازت دیتے ہیں۔</translation> <translation id="8013573822802650211">اپنے ٹیبز کو دیکھنے کے لئے جہاں بھی آپ Chromium استعمال کرتے ہیں، اپنے تمام آلات پر سائن ان کریں</translation> <translation id="8073677936375100957">اس آلہ سے آپ کا Chromium ڈیٹا صاف کریں؟</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_vi.xtb index 9c021dd..39840c5 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_vi.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_vi.xtb
@@ -74,6 +74,7 @@ <translation id="7746854981345936341">Mẹo dành cho Chromium. Một số nút hiện nằm ở cuối màn hình, chẳng hạn như nút Quay lại, Tiến lên và Tìm kiếm.</translation> <translation id="786327964234957808">Bạn đang chuyển các tài khoản đồng bộ hóa từ <ph name="USER_EMAIL1" /> về <ph name="USER_EMAIL2" />. Dữ liệu Chromium hiện có của bạn do <ph name="DOMAIN" /> quản lý. Thao tác này sẽ xóa dữ liệu của bạn khỏi thiết bị này nhưng dữ liệu đó sẽ vẫn còn trong <ph name="USER_EMAIL1" />.</translation> <translation id="7890287942691234100">Bắt đầu dùng trình quét của Chromium</translation> +<translation id="7931842119211730154">Khóa các thẻ Ẩn danh khi bạn đóng Chromium</translation> <translation id="7980860476903281594">Chromium chia sẻ thông tin vị trí của bạn với những trang web mà bạn cho phép.</translation> <translation id="8013573822802650211">Để xem các thẻ của bạn trên bất cứ thiết bị nào mà bạn có dùng Chromium, hãy đăng nhập trên tất cả thiết bị</translation> <translation id="8073677936375100957">Xóa dữ liệu Chromium của bạn khỏi thiết bị này?</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_zh-HK.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_zh-HK.xtb index 8d185265..99dcfad4 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_zh-HK.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_zh-HK.xtb
@@ -74,6 +74,7 @@ <translation id="7746854981345936341">Chromium 提示。而家,有啲掣會喺螢幕底部,例如 [上一頁]、[下一頁] 同埋 [搜尋]。</translation> <translation id="786327964234957808">您正在將同步處理帳戶從 <ph name="USER_EMAIL1" /> 切換到 <ph name="USER_EMAIL2" />。您現有的 Chromium 資料由 <ph name="DOMAIN" /> 管理。這會刪除此裝置上的資料,但這些資料仍會保留在 <ph name="USER_EMAIL1" /> 中。</translation> <translation id="7890287942691234100">開始使用 Chromium 掃瞄器</translation> +<translation id="7931842119211730154">關閉 Chromium 時鎖定無痕式分頁</translation> <translation id="7980860476903281594">Chromium 會與您允許的網站分享您的位置資訊。</translation> <translation id="8013573822802650211">如要在任何使用 Chromium 的裝置上查看分頁,請在所有裝置上登入</translation> <translation id="8073677936375100957">要清除此裝置上的 Chromium 資料嗎?</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_zh-TW.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_zh-TW.xtb index da75a5a..d2a4f117 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_zh-TW.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_zh-TW.xtb
@@ -74,6 +74,7 @@ <translation id="7746854981345936341">Chromium 提示。部分按鈕 (例如 [返回]、[往前] 和 [搜尋]) 現在位於畫面底部。</translation> <translation id="786327964234957808">你設定同步處理的帳戶即將從 <ph name="USER_EMAIL1" /> 改為 <ph name="USER_EMAIL2" />。你現有的 Chrome 資料是由 <ph name="DOMAIN" /> 所管理。系統會將你的資料從這個裝置上刪除,但繼續保留在 <ph name="USER_EMAIL1" /> 中。</translation> <translation id="7890287942691234100">開始使用 Chromium 掃描器</translation> +<translation id="7931842119211730154">關閉 Chromium 時鎖定無痕分頁</translation> <translation id="7980860476903281594">Chromium 會與你允許的網站分享位置資訊。</translation> <translation id="8013573822802650211">在你所有的裝置上登入帳戶後,不論從何處使用 Chromium 都能查看你的分頁</translation> <translation id="8073677936375100957">要清除這個裝置上的 Chromium 資料嗎?</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sq.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sq.xtb index 6337372..a0c659ad2 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_sq.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_sq.xtb
@@ -11,6 +11,7 @@ <translation id="2009224836393115614">Chrome nuk mund t'i kontrollonte fjalëkalimet e tua. Provo të kontrollosh lidhjen e internetit.</translation> <translation id="2147651015520127414">Chrome verifikoi që <ph name="ISSUER" /> ka lëshuar certifikatën e këtij sajti të uebit.</translation> <translation id="2199719347983604670">Të dhënat nga "Sinkronizimi i Chrome"</translation> +<translation id="2342919707875585281">Chrome e ndan vendndodhjen tënde me sajtet që lejon ti.</translation> <translation id="2347208864470321755">Kur ky funksion është i aktivizuar, Chrome do të ofrojë që të përkthejë faqet e shkruara në gjuhë të tjera duke përdorur "Përkthe me Google". <ph name="BEGIN_LINK" />Mëso më shumë<ph name="END_LINK" /></translation> <translation id="2415682770504543561">Bëje Chrome shfletuesin tënd të parazgjedhur</translation> <translation id="2574249610672786438">Për të parë skedat e tua nga çdo vend ku përdor Chrome, identifikohu në të gjitha pajisjet e tua</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_az.xtb b/ios/chrome/app/strings/resources/ios_strings_az.xtb index aa9847a..3c9f2832 100644 --- a/ios/chrome/app/strings/resources/ios_strings_az.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_az.xtb
@@ -538,6 +538,8 @@ <translation id="6524918542306337007">Anonim rejim əlçatan deyil</translation> <translation id="6561262006871132942">Böyüdün</translation> <translation id="6585618849026997638">Əlfəcin əlavə etməklə vacib səhifəyə qayıda bilərsiniz</translation> +<translation id="6603393121510733479">Təşkilatınız şəxsi baxış keçirməni deaktiv edib. +<ph name="BEGIN_LINK" />Ətraflı məlumat<ph name="END_LINK" /></translation> <translation id="6610002944194042868">Tərcümə Seçimləri</translation> <translation id="6620279676667515405">Ləğv edin</translation> <translation id="6624219055418309072">Anonim rejimdə bloklayın</translation> @@ -582,6 +584,8 @@ <translation id="6988572888918530647">Google Hesabını İdarə Edin</translation> <translation id="6995899638241819463">Data pozulması halında parolların ələ keçirilib-keçirilmədiyi bildirilir</translation> <translation id="6998989275928107238">Kimə</translation> +<translation id="7004032350256606903">Təşkilatınız məxfi şəkildə baxış keçirməyinizi tələb edir. +<ph name="BEGIN_LINK" />Ətraflı məlumat<ph name="END_LINK" /></translation> <translation id="7004499039102548441">Son Tablar</translation> <translation id="7006788746334555276">Məzmun Ayarları</translation> <translation id="7015203776128479407">İlkin sinxronizasiya ayarlaması tamamlanmadı. Sinxronizasiya deaktivdir.</translation> @@ -743,6 +747,8 @@ <translation id="8756969031206844760">Parol yenilənsin?</translation> <translation id="8775144690796719618">Yanlış URL</translation> <translation id="8803639129939845298">Güvənli</translation> +<translation id="8806823403540278281">Təşkilatınız məxfi şəkildə baxış keçirməyinizi tələb edir. Tablar Anonim rejimdə yadda saxlanılmır. +<ph name="BEGIN_LINK" />Ətraflı məlumat<ph name="END_LINK" /></translation> <translation id="8820817407110198400">Əlfəcinlər</translation> <translation id="8840513115188359703">Google Hesabınızdan çıxmayacaqsınız.</translation> <translation id="8870413625673593573">Son Qapadılan</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_be.xtb b/ios/chrome/app/strings/resources/ios_strings_be.xtb index 852dafa2..5bd98ed7 100644 --- a/ios/chrome/app/strings/resources/ios_strings_be.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_be.xtb
@@ -538,6 +538,8 @@ <translation id="6524918542306337007">Рэжым інкогніта недаступны</translation> <translation id="6561262006871132942">Павялічыць</translation> <translation id="6585618849026997638">Каб мець магчымасць вярнуцца да важнай для вас старонкі пазней, можна дадаць закладку</translation> +<translation id="6603393121510733479">Ваша арганізацыя адключыла прыватны прагляд. +<ph name="BEGIN_LINK" />Даведацца больш<ph name="END_LINK" /></translation> <translation id="6610002944194042868">Параметры перакладу</translation> <translation id="6620279676667515405">Скасаваць</translation> <translation id="6624219055418309072">Блакіроўка ў рэжыме інкогніта</translation> @@ -582,6 +584,8 @@ <translation id="6988572888918530647">Кіраванне Уліковым запісам Google</translation> <translation id="6995899638241819463">Папярэджваць мяне ў выпадку, калі пры ўцечцы даных былі раскрыты паролі</translation> <translation id="6998989275928107238">Злучэнне з</translation> +<translation id="7004032350256606903">Палітыка вашай арганізацыі патрабуе, каб вы праглядалі старонкі ў рэжыме інкогніта. +<ph name="BEGIN_LINK" />Даведацца больш<ph name="END_LINK" /></translation> <translation id="7004499039102548441">Нядаўнія ўкладкі</translation> <translation id="7006788746334555276">Налады змесціва</translation> <translation id="7015203776128479407">Першапачатковая наладка сінхранізацыі не завершана. Сінхранізацыя выключана.</translation> @@ -743,6 +747,8 @@ <translation id="8756969031206844760">Абнавіць пароль?</translation> <translation id="8775144690796719618">Няправільны URL-адрас</translation> <translation id="8803639129939845298">Бяспечны сайт</translation> +<translation id="8806823403540278281">Палітыка вашай арганізацыі патрабуе, каб вы праглядалі старонкі ў рэжыме інкогніта. У гэтым рэжыме ўкладкі не захоўваюцца. +<ph name="BEGIN_LINK" />Даведацца больш<ph name="END_LINK" /></translation> <translation id="8820817407110198400">Закладкі</translation> <translation id="8840513115188359703">З Уліковага запісу Google вы не выйдзеце.</translation> <translation id="8870413625673593573">Нядаўна закрытыя</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_et.xtb b/ios/chrome/app/strings/resources/ios_strings_et.xtb index a83795d..813de66 100644 --- a/ios/chrome/app/strings/resources/ios_strings_et.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_et.xtb
@@ -538,6 +538,8 @@ <translation id="6524918542306337007">Inkognito režiim pole saadaval</translation> <translation id="6561262006871132942">Suumi sisse</translation> <translation id="6585618849026997638">Saate enda jaoks olulisele lehele naasta, lisades järjehoidja</translation> +<translation id="6603393121510733479">Teie organisatsioon lülitas privaatse sirvimise välja. +<ph name="BEGIN_LINK" />Lisateave<ph name="END_LINK" /></translation> <translation id="6610002944194042868">Tõlkimise valikud</translation> <translation id="6620279676667515405">Tühista</translation> <translation id="6624219055418309072">Inkognito režiimis blokeeritud</translation> @@ -582,6 +584,8 @@ <translation id="6988572888918530647">Google'i konto haldamine</translation> <translation id="6995899638241819463">Hoiata mind, kui paroolid andmetega seotud rikkumise käigus avalikustatakse</translation> <translation id="6998989275928107238">Kellele</translation> +<translation id="7004032350256606903">Teie organisatsioon nõuab, et sirviksite privaatselt. +<ph name="BEGIN_LINK" />Lisateave<ph name="END_LINK" /></translation> <translation id="7004499039102548441">Hiljutised vahelehed</translation> <translation id="7006788746334555276">Sisu seaded</translation> <translation id="7015203776128479407">Sünkroonimise algseadistust ei viidud lõpule. Sünkroonimine on välja lülitatud.</translation> @@ -743,6 +747,8 @@ <translation id="8756969031206844760">Kas värskendada parooli?</translation> <translation id="8775144690796719618">Sobimatu URL</translation> <translation id="8803639129939845298">Turvaline</translation> +<translation id="8806823403540278281">Teie organisatsioon nõuab, et sirviksite privaatselt. Vahelehti inkognito režiimis ei salvestata. +<ph name="BEGIN_LINK" />Lisateave<ph name="END_LINK" /></translation> <translation id="8820817407110198400">Järjehoidjad</translation> <translation id="8840513115188359703">Teid ei logita teie Google'i kontolt välja.</translation> <translation id="8870413625673593573">Viimati suletud</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_eu.xtb b/ios/chrome/app/strings/resources/ios_strings_eu.xtb index ec9eaa6..d4f0dd5 100644 --- a/ios/chrome/app/strings/resources/ios_strings_eu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_eu.xtb
@@ -538,6 +538,8 @@ <translation id="6524918542306337007">Ez dago erabilgarri ezkutuko modua</translation> <translation id="6561262006871132942">Handitu</translation> <translation id="6585618849026997638">Garrantzitsuak iruditzen zaizkizun orriak bizkor atzitu ahal izateko, gehi iezazkiezu laster-markak</translation> +<translation id="6603393121510733479">Zure erakundeak arakatze pribatua desaktibatu du. +<ph name="BEGIN_LINK" />Lortu informazio gehiago<ph name="END_LINK" /></translation> <translation id="6610002944194042868">Itzultzeko aukerak</translation> <translation id="6620279676667515405">Utzi</translation> <translation id="6624219055418309072">Blokeatu ezkutuko moduan</translation> @@ -582,6 +584,8 @@ <translation id="6988572888918530647">Kudeatu Google-ko kontua</translation> <translation id="6995899638241819463">Abisatu pasahitzak arriskuan badaude datuen isilpekotasuna urratu delako</translation> <translation id="6998989275928107238">Hartzailea</translation> +<translation id="7004032350256606903">Modu pribatuan arakatzeko eskatzen dizu zure erakundeak. +<ph name="BEGIN_LINK" />Lortu informazio gehiago<ph name="END_LINK" /></translation> <translation id="7004499039102548441">Azken fitxak</translation> <translation id="7006788746334555276">Edukiaren ezarpenak</translation> <translation id="7015203776128479407">Oraindik ez da amaitu hasierako sinkronizazioaren konfigurazioa. Sinkronizazioa desaktibatuta dago.</translation> @@ -743,6 +747,8 @@ <translation id="8756969031206844760">Pasahitza eguneratu nahi duzu?</translation> <translation id="8775144690796719618">URLak ez du balio</translation> <translation id="8803639129939845298">Segurua da</translation> +<translation id="8806823403540278281">Modu pribatuan arakatzeko eskatzen dizu zure erakundeak. Fitxak ez dira gordetzen ezkutuko moduan. +<ph name="BEGIN_LINK" />Lortu informazio gehiago<ph name="END_LINK" /></translation> <translation id="8820817407110198400">Laster-markak</translation> <translation id="8840513115188359703">Ez da amaituko Google-ko kontuko saioa.</translation> <translation id="8870413625673593573">Itxitako azkenak</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fi.xtb b/ios/chrome/app/strings/resources/ios_strings_fi.xtb index bf437571..0ba019be 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
@@ -538,6 +538,8 @@ <translation id="6524918542306337007">Incognito-tila ei ole käytettävissä</translation> <translation id="6561262006871132942">Lähennä</translation> <translation id="6585618849026997638">Voit palata sinulle tärkeälle sivulle lisäämällä sen kirjanmerkiksi</translation> +<translation id="6603393121510733479">Organisaatiosi on laittanut yksityisen selaamisen pois päältä. +<ph name="BEGIN_LINK" />Lue lisää<ph name="END_LINK" /></translation> <translation id="6610002944194042868">Käännösasetukset</translation> <translation id="6620279676667515405">Peruuta</translation> <translation id="6624219055418309072">Estä incognito-tilassa</translation> @@ -582,6 +584,8 @@ <translation id="6988572888918530647">Hallinnoi Google-tiliäsi</translation> <translation id="6995899638241819463">Varoita, jos salasanoja vaarantuu tietosuojaloukkauksessa</translation> <translation id="6998989275928107238">Vastaanottaja</translation> +<translation id="7004032350256606903">Organisaatiosi edellyttää, että selaat yksityisesti. +<ph name="BEGIN_LINK" />Lue lisää<ph name="END_LINK" /></translation> <translation id="7004499039102548441">Hiljattain suljetut välilehdet</translation> <translation id="7006788746334555276">Sisältöasetukset</translation> <translation id="7015203776128479407">Synkronoinnin ensimääritystä ei tehty loppuun. Synkronointi on pois päältä.</translation> @@ -743,6 +747,8 @@ <translation id="8756969031206844760">Päivitetäänkö salasana?</translation> <translation id="8775144690796719618">Virheellinen URL-osoite</translation> <translation id="8803639129939845298">Turvallinen</translation> +<translation id="8806823403540278281">Organisaatiosi edellyttää, että selaat yksityisesti. Välilehtiä ei tallenneta incognito-tilassa. +<ph name="BEGIN_LINK" />Lue lisää<ph name="END_LINK" /></translation> <translation id="8820817407110198400">Kirjanmerkit</translation> <translation id="8840513115188359703">Sinua ei kirjata ulos Google-tililtäsi.</translation> <translation id="8870413625673593573">Hiljattain suljetut</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb index 7c718a95..552e5856 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb
@@ -538,6 +538,8 @@ <translation id="6524918542306337007">Le mode de navigation privée n'est pas offert</translation> <translation id="6561262006871132942">Zoom avant</translation> <translation id="6585618849026997638">Vous pouvez revenir à une page importante pour vous en ajoutant un favori</translation> +<translation id="6603393121510733479">Votre organisation a désactivé la navigation privée. +<ph name="BEGIN_LINK" />En savoir plus<ph name="END_LINK" /></translation> <translation id="6610002944194042868">Options de traduction</translation> <translation id="6620279676667515405">Annuler</translation> <translation id="6624219055418309072">Bloquer en mode de navigation privée</translation> @@ -581,6 +583,8 @@ <translation id="6988572888918530647">Gérer votre compte Google</translation> <translation id="6995899638241819463">Vous envoyer un avertissement si des mots de passe sont exposés dans une violation de données</translation> <translation id="6998989275928107238">À</translation> +<translation id="7004032350256606903">Votre organisation vous demande de naviguer en mode privé. +<ph name="BEGIN_LINK" />En savoir plus<ph name="END_LINK" /></translation> <translation id="7004499039102548441">Onglets récents</translation> <translation id="7006788746334555276">Paramètres de contenu</translation> <translation id="7015203776128479407">La configuration de la synchronisation initiale n'a pas été terminée. La synchronisation est désactivée.</translation> @@ -742,6 +746,8 @@ <translation id="8756969031206844760">Mettre à jour le mot de passe?</translation> <translation id="8775144690796719618">URL non valide</translation> <translation id="8803639129939845298">Sécuritaire</translation> +<translation id="8806823403540278281">Votre organisation vous demande de naviguer en mode privé. Les onglets ne sont pas enregistrés en mode de navigation privée. +<ph name="BEGIN_LINK" />En savoir plus<ph name="END_LINK" /></translation> <translation id="8820817407110198400">Favoris</translation> <translation id="8840513115188359703">Vous ne serez pas déconnecté(e) de votre compte Google.</translation> <translation id="8870413625673593573">Éléments récemment fermés</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_strings_fr.xtb index 19ba3fe9..7ca0c67 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
@@ -463,7 +463,7 @@ <translation id="5948291296578561264">Cela vous permet d'enregistrer des photos dans votre photothèque.</translation> <translation id="5955891643922670672">Affichage de la version hors connexion</translation> <translation id="5957613098218939406">Plus d'options</translation> -<translation id="5963939892571022323">Échec de la création d'un lien vers le texte en surbrillance.</translation> +<translation id="5963939892571022323">Impossible de créer un lien vers le texte en surbrillance.</translation> <translation id="5964480694698977962">Créer un onglet de navigation privée</translation> <translation id="5965679971710331625">Vous êtes connecté</translation> <translation id="5979837087407522202">Rechercher des mots de passe</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gu.xtb b/ios/chrome/app/strings/resources/ios_strings_gu.xtb index 9555f13..958891e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_gu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
@@ -538,6 +538,8 @@ <translation id="6524918542306337007">છૂપો મોડ ઉપલબ્ધ નથી</translation> <translation id="6561262006871132942">મોટું કરો</translation> <translation id="6585618849026997638">તમે બુકમાર્ક ઉમેરીને તમારા માટે મહત્ત્વપૂર્ણ હોય એવા પેજ પર પાછા જઈ શકો છો</translation> +<translation id="6603393121510733479">તમારી સંસ્થાએ ખાનગી બ્રાઉઝિંગ બંધ કર્યું છે. +<ph name="BEGIN_LINK" />વધુ જાણો<ph name="END_LINK" /></translation> <translation id="6610002944194042868">અનુવાદ માટેના વિકલ્પો</translation> <translation id="6620279676667515405">રદ કરો</translation> <translation id="6624219055418309072">છૂપા મોડમાં બ્લૉક કરો</translation> @@ -582,6 +584,8 @@ <translation id="6988572888918530647">તમારા Google એકાઉન્ટને મેનેજ કરો</translation> <translation id="6995899638241819463">જો ડેટા ઉલ્લંઘનમાં પાસવર્ડ જાહેર થાય તો તમને ચેતવણી આપવામાં આવે છે</translation> <translation id="6998989275928107238">પ્રતિ</translation> +<translation id="7004032350256606903">તમારી સંસ્થા માટે જરૂરી છે કે તમે ખાનગી રીતે બ્રાઉઝ કરો. +<ph name="BEGIN_LINK" />વધુ જાણો<ph name="END_LINK" /></translation> <translation id="7004499039102548441">તાજેતરના ટૅબ્સ</translation> <translation id="7006788746334555276">કન્ટેન્ટ સેટિંગ</translation> <translation id="7015203776128479407">આરંભિક સિંક સેટઅપ પૂરું થયું નથી. સિંક કરવાનું બંધ છે.</translation> @@ -743,6 +747,8 @@ <translation id="8756969031206844760">પાસવર્ડ અપડેટ કરીએ?</translation> <translation id="8775144690796719618">અમાન્ય URL</translation> <translation id="8803639129939845298">સુરક્ષિત</translation> +<translation id="8806823403540278281">તમારી સંસ્થા માટે જરૂરી છે કે તમે ખાનગી રીતે બ્રાઉઝ કરો. છૂપા મોડમાં ટૅબ સાચવવામાં આવતી નથી. +<ph name="BEGIN_LINK" />વધુ જાણો<ph name="END_LINK" /></translation> <translation id="8820817407110198400">બુકમાર્ક</translation> <translation id="8840513115188359703">તમે તમારા Google એકાઉન્ટમાંથી સાઇન આઉટ થશો નહિ.</translation> <translation id="8870413625673593573">તાજેતરમાં બંધ કરેલા</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_strings_hi.xtb index 4de7e0a..bd1bf71 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
@@ -538,6 +538,8 @@ <translation id="6524918542306337007">गुप्त मोड उपलब्ध नहीं है</translation> <translation id="6561262006871132942">ज़ूम इन करें</translation> <translation id="6585618849026997638">किसी भी अहम पेज पर आसानी से वापस जाने के लिए, आप उसे बुकमार्क कर सकते हैं</translation> +<translation id="6603393121510733479">आपके संगठन ने निजी ब्राउज़िंग की सुविधा बंद कर दी है. +<ph name="BEGIN_LINK" />ज़्यादा जानें<ph name="END_LINK" /></translation> <translation id="6610002944194042868">अनुवाद के विकल्प</translation> <translation id="6620279676667515405">अभी नहीं</translation> <translation id="6624219055418309072">गुप्त मोड में ब्लॉक है</translation> @@ -582,6 +584,8 @@ <translation id="6988572888918530647">अपना Google खाता प्रबंधित करें</translation> <translation id="6995899638241819463">डेटा का उल्लंघन होने पर अगर आपके पासवर्ड बिना अनुमति के सार्वजनिक हो जाते हैं, तो आपको चेतावनी मिलती है</translation> <translation id="6998989275928107238">To</translation> +<translation id="7004032350256606903">आपका संगठन चाहता है कि आप निजी मोड में ब्राउज़ करें. +<ph name="BEGIN_LINK" />ज़्यादा जानें<ph name="END_LINK" /></translation> <translation id="7004499039102548441">हाल के टैब</translation> <translation id="7006788746334555276">सामग्री सेटिंग</translation> <translation id="7015203776128479407">शुरुआती सिंक सेटअप पूरा नहीं हुआ. सिंक बंद है.</translation> @@ -743,6 +747,8 @@ <translation id="8756969031206844760">पासवर्ड अपडेट करें?</translation> <translation id="8775144690796719618">गलत यूआरएल</translation> <translation id="8803639129939845298">सुरक्षित</translation> +<translation id="8806823403540278281">आपका संगठन चाहता है कि आप निजी मोड में ब्राउज़ करें. गुप्त मोड में टैब सेव नहीं होते. +<ph name="BEGIN_LINK" />ज़्यादा जानें<ph name="END_LINK" /></translation> <translation id="8820817407110198400">बुकमार्क</translation> <translation id="8840513115188359703">आप अपने Google खाते से प्रस्थान नहीं करेंगे.</translation> <translation id="8870413625673593573">हाल ही में बंद किए गए</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_strings_iw.xtb index 3f3cbd7..b359df04 100644 --- a/ios/chrome/app/strings/resources/ios_strings_iw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
@@ -538,6 +538,8 @@ <translation id="6524918542306337007">מצב אנונימי אינו זמין</translation> <translation id="6561262006871132942">הגדלת התצוגה</translation> <translation id="6585618849026997638">כדי לחזור אל דף שחשוב לך אפשר להוסיף אותו לסימניות</translation> +<translation id="6603393121510733479">הארגון שלך כיבה את אפשרות הגלישה הפרטית. +<ph name="BEGIN_LINK" />מידע נוסף<ph name="END_LINK" /></translation> <translation id="6610002944194042868">אפשרויות תרגום</translation> <translation id="6620279676667515405">ביטול</translation> <translation id="6624219055418309072">חסימה במצב אנונימי</translation> @@ -582,6 +584,8 @@ <translation id="6988572888918530647">ניהול חשבון Google שלך</translation> <translation id="6995899638241819463">הצגת אזהרה אם סיסמאות נחשפות עקב פרצה באבטחת מידע</translation> <translation id="6998989275928107238">אל</translation> +<translation id="7004032350256606903">לפי דרישת הארגון שלך, עליך לגלוש באופן פרטי. +<ph name="BEGIN_LINK" />מידע נוסף<ph name="END_LINK" /></translation> <translation id="7004499039102548441">כרטיסיות אחרונות</translation> <translation id="7006788746334555276">הגדרות תוכן</translation> <translation id="7015203776128479407">הגדרת הסנכרון הראשונית לא הושלמה. הסנכרון מושבת.</translation> @@ -743,6 +747,8 @@ <translation id="8756969031206844760">לעדכן את הסיסמה?</translation> <translation id="8775144690796719618">כתובת אתר לא חוקית</translation> <translation id="8803639129939845298">מאובטח</translation> +<translation id="8806823403540278281">לפי דרישת הארגון שלך, עליך לגלוש באופן פרטי. כרטיסיות אינן נשמרות במצב אנונימי. +<ph name="BEGIN_LINK" />מידע נוסף<ph name="END_LINK" /></translation> <translation id="8820817407110198400">סימניות</translation> <translation id="8840513115188359703">פעולה זו לא תוציא אותך מחשבון Google שלך.</translation> <translation id="8870413625673593573">נסגרו לאחרונה</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kk.xtb b/ios/chrome/app/strings/resources/ios_strings_kk.xtb index 48a5712..d8415f9 100644 --- a/ios/chrome/app/strings/resources/ios_strings_kk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_kk.xtb
@@ -538,6 +538,8 @@ <translation id="6524918542306337007">Инкогнито режимі қолжетімді емес.</translation> <translation id="6561262006871132942">Ұлғайту</translation> <translation id="6585618849026997638">Бетбелгі енгізу арқылы маңызды бетке орала аласыз.</translation> +<translation id="6603393121510733479">Ұйымыңыз құпия шарлау режимін қосқан. +<ph name="BEGIN_LINK" />Толығырақ<ph name="END_LINK" /></translation> <translation id="6610002944194042868">Аудару опциялары</translation> <translation id="6620279676667515405">Бас тарту</translation> <translation id="6624219055418309072">Инкогнито режимінде бөгеу</translation> @@ -582,6 +584,8 @@ <translation id="6988572888918530647">Google есептік жазбасын басқару</translation> <translation id="6995899638241819463">Құпия сөздер қолды болған жағдайда, сізге бұл туралы хабарлау</translation> <translation id="6998989275928107238">Кімге</translation> +<translation id="7004032350256606903">Ұйымыңыз интернетті құпия шарлау арқылы пайдалануыңызды талап етеді. +<ph name="BEGIN_LINK" />Толығырақ<ph name="END_LINK" /></translation> <translation id="7004499039102548441">Соңғы қойындылар</translation> <translation id="7006788746334555276">Мазмұн параметрлері</translation> <translation id="7015203776128479407">Бастапқы синхрондауды реттеу аяқталмады. Синхрондау өшірулі.</translation> @@ -743,6 +747,8 @@ <translation id="8756969031206844760">Құпия сөз жаңартылсын ба?</translation> <translation id="8775144690796719618">Жарамсыз URL</translation> <translation id="8803639129939845298">Қауіпсіз</translation> +<translation id="8806823403540278281">Ұйымыңыз интернетті құпия шарлау арқылы пайдалануыңызды талап етеді. Қойындылар инкогнито режимінде сақталмайды. +<ph name="BEGIN_LINK" />Толығырақ<ph name="END_LINK" /></translation> <translation id="8820817407110198400">Бетбелгілер</translation> <translation id="8840513115188359703">Google есептік жазбаңыздан шықпайсыз.</translation> <translation id="8870413625673593573">Жақында жабылған</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_strings_kn.xtb index d4d9fec..f49aca3 100644 --- a/ios/chrome/app/strings/resources/ios_strings_kn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
@@ -538,6 +538,8 @@ <translation id="6524918542306337007">ಅಜ್ಞಾತ ಮೋಡ್ ಲಭ್ಯವಿಲ್ಲ</translation> <translation id="6561262006871132942">ಝೂಮ್ ಇನ್</translation> <translation id="6585618849026997638">ಬುಕ್ಮಾರ್ಕ್ ಒಂದನ್ನು ಸೇರಿಸುವ ಮೂಲಕ ನಿಮಗೆ ಮುಖ್ಯವಾದ ಪುಟಕ್ಕೆ ನೀವು ಹಿಂತಿರುಗಬಹುದಾಗಿದೆ</translation> +<translation id="6603393121510733479">ನಿಮ್ಮ ಸಂಸ್ಥೆ ಖಾಸಗಿ ಬ್ರೌಸಿಂಗ್ ಅನ್ನು ಆಫ್ ಮಾಡಿದೆ. +<ph name="BEGIN_LINK" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK" /></translation> <translation id="6610002944194042868">ಅನುವಾದ ಆಯ್ಕೆಗಳು</translation> <translation id="6620279676667515405">ರದ್ದುಗೊಳಿಸಿ</translation> <translation id="6624219055418309072">ಅದೃಶ್ಯ ಮೋಡ್ನಲ್ಲಿ ನಿರ್ಬಂಧಿಸಿ</translation> @@ -582,6 +584,8 @@ <translation id="6988572888918530647">ನಿಮ್ಮ Google ಖಾತೆಯನ್ನು ನಿರ್ವಹಿಸಿ</translation> <translation id="6995899638241819463">ಡೇಟಾ ಉಲ್ಲಂಘನೆಯಿಂದಾಗಿ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಬಹಿರಂಗಪಡಿಸಿದರೆ ನಿಮಗೆ ಎಚ್ಚರಿಕೆ ನೀಡಲಾಗುತ್ತದೆ</translation> <translation id="6998989275928107238">ಇವರಿಗೆ</translation> +<translation id="7004032350256606903">ನಿಮ್ಮ ಸಂಸ್ಥೆಯ ನೀತಿಯ ಪ್ರಕಾರ ನೀವು ಖಾಸಗಿಯಾಗಿ ಬ್ರೌಸ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ. +<ph name="BEGIN_LINK" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK" /></translation> <translation id="7004499039102548441">ಇತ್ತೀಚಿನ ಟ್ಯಾಬ್ಗಳು</translation> <translation id="7006788746334555276">ವಿಷಯ ಸೆಟ್ಟಿಂಗ್ಗಳು</translation> <translation id="7015203776128479407">ಪ್ರಾರಂಭಿಕ ಸಿಂಕ್ ಸೆಟಪ್ ಮುಗಿದಿಲ್ಲ. ಸಿಂಕ್ ಆಫ್ ಆಗಿದೆ.</translation> @@ -743,6 +747,8 @@ <translation id="8756969031206844760">ಪಾಸ್ವರ್ಡ್ ಅಪ್ಡೇಟ್ ಮಾಡುವುದೇ?</translation> <translation id="8775144690796719618">ಅಮಾನ್ಯ URL</translation> <translation id="8803639129939845298">ಸುರಕ್ಷಿತ</translation> +<translation id="8806823403540278281">ನಿಮ್ಮ ಸಂಸ್ಥೆಯ ನೀತಿಯ ಪ್ರಕಾರ ನೀವು ಖಾಸಗಿಯಾಗಿ ಬ್ರೌಸ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ. ಅಜ್ಞಾತ ಮೋಡ್ನಲ್ಲಿ ಟ್ಯಾಬ್ಗಳನ್ನು ಉಳಿಸಲಾಗುವುದಿಲ್ಲ. +<ph name="BEGIN_LINK" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK" /></translation> <translation id="8820817407110198400">ಬುಕ್ಮಾರ್ಕ್ಗಳು</translation> <translation id="8840513115188359703">ನಿಮ್ಮನ್ನು ನಿಮ್ಮ Google ಖಾತೆಯಿಂದ ಸೈನ್ ಔಟ್ ಮಾಡುವುದಿಲ್ಲ.</translation> <translation id="8870413625673593573">ಇತ್ತೀಚೆಗೆ ಮುಚ್ಚಿರುವುದು</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_strings_ko.xtb index 97f303f2..9eb4030 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ko.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
@@ -538,6 +538,8 @@ <translation id="6524918542306337007">시크릿 모드를 사용할 수 없음</translation> <translation id="6561262006871132942">확대</translation> <translation id="6585618849026997638">중요한 페이지를 북마크에 추가하여 다시 돌아갈 수 있습니다.</translation> +<translation id="6603393121510733479">조직에서 시크릿 브라우징을 사용 중지했습니다. +<ph name="BEGIN_LINK" />자세히 알아보기<ph name="END_LINK" /></translation> <translation id="6610002944194042868">번역 옵션</translation> <translation id="6620279676667515405">취소</translation> <translation id="6624219055418309072">시크릿 모드에서 차단</translation> @@ -582,6 +584,8 @@ <translation id="6988572888918530647">Google 계정 관리</translation> <translation id="6995899638241819463">데이터 유출로 인해 비밀번호가 노출된 경우 알림</translation> <translation id="6998989275928107238">받는사람</translation> +<translation id="7004032350256606903">조직에서 비공개로 탐색할 것을 요구합니다. +<ph name="BEGIN_LINK" />자세히 알아보기<ph name="END_LINK" /></translation> <translation id="7004499039102548441">최근 탭</translation> <translation id="7006788746334555276">콘텐츠 설정</translation> <translation id="7015203776128479407">초기 동기화 설정이 완료되지 않았습니다. 동기화가 사용 중지되었습니다.</translation> @@ -743,6 +747,8 @@ <translation id="8756969031206844760">비밀번호를 업데이트하시겠습니까?</translation> <translation id="8775144690796719618">URL이 올바르지 않습니다.</translation> <translation id="8803639129939845298">안전함</translation> +<translation id="8806823403540278281">조직에서 비공개로 탐색할 것을 요구합니다. 시크릿 모드에서는 탭이 저장되지 않습니다. +<ph name="BEGIN_LINK" />자세히 알아보기<ph name="END_LINK" /></translation> <translation id="8820817407110198400">북마크</translation> <translation id="8840513115188359703">Google 계정에서 로그아웃되지 않습니다.</translation> <translation id="8870413625673593573">최근에 닫은 탭</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ky.xtb b/ios/chrome/app/strings/resources/ios_strings_ky.xtb index b46c6cb2..abadd08 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ky.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ky.xtb
@@ -538,6 +538,8 @@ <translation id="6524918542306337007">Жашыруун режим жеткиликсиз</translation> <translation id="6561262006871132942">Чоңойтуу</translation> <translation id="6585618849026997638">Маанилүү барактарга кайра кайтып келүү үчүн кыстармаларды кошуп коюңуз</translation> +<translation id="6603393121510733479">Уюмуңуз жекече серептөөнү өчүрүп койду. +<ph name="BEGIN_LINK" />Кеңири маалымат<ph name="END_LINK" /></translation> <translation id="6610002944194042868">Которуу параметрлери</translation> <translation id="6620279676667515405">Жокко чыгаруу</translation> <translation id="6624219055418309072">Жашыруун режимде бөгөттөө</translation> @@ -582,6 +584,8 @@ <translation id="6988572888918530647">Google аккаунтунун жөндөөлөрүнө өтүү</translation> <translation id="6995899638241819463">Сырсөзүңүздү кимдир-бирөө билип алса, эскертүү жөнөтүлсүн</translation> <translation id="6998989275928107238">Кимге</translation> +<translation id="7004032350256606903">Уюмуңуз жекече серептөөнү талап кылат. +<ph name="BEGIN_LINK" />Кеңири маалымат<ph name="END_LINK" /></translation> <translation id="7004499039102548441">Акыркы өтмөктөр</translation> <translation id="7006788746334555276">Мазмун жөндөөлөрү</translation> <translation id="7015203776128479407">Баштапкы шайкештирүү жөндөөсү аяктаган жок. Шайкештештирүү өчүк.</translation> @@ -683,7 +687,7 @@ <translation id="8059533439631660104">Бөлүмдү жыйыштырат.</translation> <translation id="8065292699993359127">URL даректерин Chrome'до Жашыруун режимде ачуу</translation> <translation id="806745655614357130">Дайындарды өзүнчө сактоо</translation> -<translation id="8073670137947914548">Жүктөп алуу аягына чыкты</translation> +<translation id="8073670137947914548">Жүктөлүп алынды</translation> <translation id="8073872304774253879">Издөө жана серептөө аракеттериңизди жакшыртыңыз</translation> <translation id="8076014560081431679">Сакталган сайт жөндөөлөрү өзгөрүлбөйт, андыктан, сайттарды адаттагыдай карай бересиз. <ph name="BEGIN_LINK" />Көбүрөөк маалымат алуу<ph name="END_LINK" /></translation> <translation id="8079602123447022758">Бул жөндөөнү администраторуңуз башкарат. Көбүрөөк маалымат алуу үчүн эки жолу басыңыз</translation> @@ -743,6 +747,8 @@ <translation id="8756969031206844760">Сырсөз жаңыртылсынбы?</translation> <translation id="8775144690796719618">Жараксыз URL</translation> <translation id="8803639129939845298">Корголгон</translation> +<translation id="8806823403540278281">Уюмуңуз жекече серептөөнү талап кылат. Жашыруун режимде өтмөктөр сакталбайт. +<ph name="BEGIN_LINK" />Кеңири маалымат<ph name="END_LINK" /></translation> <translation id="8820817407110198400">Кыстармалар</translation> <translation id="8840513115188359703">Google Каттоо эсебиңизден чыгарылбайсыз.</translation> <translation id="8870413625673593573">Жакында жабылган</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lo.xtb b/ios/chrome/app/strings/resources/ios_strings_lo.xtb index f99b2bef..68e13d5 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lo.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lo.xtb
@@ -538,6 +538,8 @@ <translation id="6524918542306337007">ໂໝດບໍ່ເປີດເຜີຍຕົວຕົນບໍ່ສາມາດໃຊ້ໄດ້</translation> <translation id="6561262006871132942">ຊຸມເຂົ້າ</translation> <translation id="6585618849026997638">ທ່ານສາມາດກັບໄປຫາໜ້າທີ່ສຳຄັນຕໍ່ກັບທ່ານໂດຍການເພີ່ມບຸກມາກໄດ້</translation> +<translation id="6603393121510733479">ອົງການຂອງທ່ານໄດ້ປິດການທ່ອງເວັບແບບສ່ວນຕົວແລ້ວ. +<ph name="BEGIN_LINK" />ສຶກສາເພີ່ມເຕີມ<ph name="END_LINK" /></translation> <translation id="6610002944194042868">ຕົວເລືອກແປພາສາ</translation> <translation id="6620279676667515405">ຍົກເລີກ</translation> <translation id="6624219055418309072">ບລັອກໃນໂໝດບໍ່ເປີດເຜີຍຕົວຕົນ</translation> @@ -582,6 +584,8 @@ <translation id="6988572888918530647">ຈັດການບັນຊີ Google ຂອງທ່ານ</translation> <translation id="6995899638241819463">ເຕືອນບອກທ່ານຖ້າລະຫັດຜ່ານຮົ່ວໄຫຼໃນການລະເມີດຂໍ້ມູນ</translation> <translation id="6998989275928107238">ເຖິງ</translation> +<translation id="7004032350256606903">ອົງການຂອງທ່ານກຳນົດໃຫ້ທ່ານທ່ອງເວັບແບບເປັນສ່ວນຕົວ. +<ph name="BEGIN_LINK" />ສຶກສາເພີ່ມເຕີມ<ph name="END_LINK" /></translation> <translation id="7004499039102548441">ແຖບບໍ່ດົນມານີ້</translation> <translation id="7006788746334555276">ການຕັ້ງຄ່າເນື້ອໃນ</translation> <translation id="7015203776128479407">ການຕັ້ງຄ່າການຊິ້ງຂໍ້ມູນເບື້ອງຕົ້ນບໍ່ທັນສຳເລັດ. ການຊິ້ງຂໍ້ມູນປິດຢູ່.</translation> @@ -743,6 +747,8 @@ <translation id="8756969031206844760">ອັບເດດລະຫັດຜ່ານບໍ?</translation> <translation id="8775144690796719618">URL ໃຊ້ບໍ່ໄດ້</translation> <translation id="8803639129939845298">ປອດໄພ</translation> +<translation id="8806823403540278281">ອົງການຂອງທ່ານກຳນົດໃຫ້ທ່ານທ່ອງເວັບແບບເປັນສ່ວນຕົວ. ຈະບໍ່ມີການບັນທຶກແຖບໄວ້ໃນໂໝດບໍ່ເປີດເຜີຍຕົວຕົນ. +<ph name="BEGIN_LINK" />ສຶກສາເພີ່ມເຕີມ<ph name="END_LINK" /></translation> <translation id="8820817407110198400">ບຸກມາກ</translation> <translation id="8840513115188359703">ທ່ານຈະບໍ່ຖືກນຳອອກຈາກລະບົບບັນຊີ Google ຂອງທ່ານ.</translation> <translation id="8870413625673593573">ປິດບໍ່ດົນມານີ້</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_strings_lt.xtb index 39915b04..71d773e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lt.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
@@ -538,6 +538,8 @@ <translation id="6524918542306337007">Inkognito režimas nepasiekiamas</translation> <translation id="6561262006871132942">Artinti</translation> <translation id="6585618849026997638">Galite grįžti į jums svarbų puslapį pridėję žymę</translation> +<translation id="6603393121510733479">Organizacija išjungė privatų naršymą. +<ph name="BEGIN_LINK" />Sužinokite daugiau<ph name="END_LINK" /></translation> <translation id="6610002944194042868">Vertimo parinktys</translation> <translation id="6620279676667515405">Atšaukti</translation> <translation id="6624219055418309072">Blokuoti inkognito režimu</translation> @@ -582,6 +584,8 @@ <translation id="6988572888918530647">„Google“ paskyros tvarkymas</translation> <translation id="6995899638241819463">Įspėti, jei slaptažodžiai buvo atskleisti įvykus duomenų saugos pažeidimui</translation> <translation id="6998989275928107238">Kam</translation> +<translation id="7004032350256606903">Jūsų organizacija reikalauja, kad naršytumėte privačiai. +<ph name="BEGIN_LINK" />Sužinokite daugiau<ph name="END_LINK" /></translation> <translation id="7004499039102548441">Naujausi skirtukai</translation> <translation id="7006788746334555276">Turinio nustatymai</translation> <translation id="7015203776128479407">Pradinis sinchronizavimo nustatymas nebaigtas. Sinchronizavimas išjungtas.</translation> @@ -743,6 +747,8 @@ <translation id="8756969031206844760">Atnaujinti slaptažodį?</translation> <translation id="8775144690796719618">Netinkamas URL</translation> <translation id="8803639129939845298">Saugūs</translation> +<translation id="8806823403540278281">Jūsų organizacija reikalauja, kad naršytumėte privačiai. Skirtukai nesaugomi inkognito režimu. +<ph name="BEGIN_LINK" />Sužinokite daugiau<ph name="END_LINK" /></translation> <translation id="8820817407110198400">Žymės</translation> <translation id="8840513115188359703">Nebūsite atjungti nuo „Google“ paskyros.</translation> <translation id="8870413625673593573">Neseniai uždaryta</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_strings_ml.xtb index ccbd0a1f..f06eacbf 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ml.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
@@ -538,6 +538,8 @@ <translation id="6524918542306337007">അദൃശ്യ മോഡ് ലഭ്യമല്ല</translation> <translation id="6561262006871132942">സൂം ഇൻ ചെയ്യുക</translation> <translation id="6585618849026997638">ബുക്ക്മാർക്ക് ചേർക്കുന്നതിലൂടെ, നിങ്ങൾക്ക് പ്രധാനപ്പെട്ട പേജിലേക്ക് മടങ്ങാനാകും</translation> +<translation id="6603393121510733479">നിങ്ങളുടെ സ്ഥാപനം സ്വകാര്യ ബ്രൗസിംഗ് ഓഫാക്കി. +<ph name="BEGIN_LINK" />കൂടുതലറിയുക<ph name="END_LINK" /></translation> <translation id="6610002944194042868">വിവർത്തന ഓപ്ഷനുകൾ</translation> <translation id="6620279676667515405">റദ്ദാക്കുക</translation> <translation id="6624219055418309072">അദൃശ്യ മോഡിൽ ബ്ലോക്ക് ചെയ്യുക</translation> @@ -582,6 +584,8 @@ <translation id="6988572888918530647">നിങ്ങളുടെ Google അക്കൗണ്ട് മാനേജ് ചെയ്യുക</translation> <translation id="6995899638241819463">പാസ്വേഡുകൾ, ഡാറ്റാ ലംഘനത്തിന്റെ ഭാഗമായി വെളിപ്പെട്ടാൽ നിങ്ങൾക്ക് മുന്നറിയിപ്പ് നൽകുന്നു</translation> <translation id="6998989275928107238">സ്വീകര്ത്താവ്</translation> +<translation id="7004032350256606903">സ്വകാര്യമായി ബ്രൗസ് ചെയ്യാൻ നിങ്ങളുടെ സ്ഥാപനം ആവശ്യപ്പെടുന്നു. +<ph name="BEGIN_LINK" />കൂടുതലറിയുക<ph name="END_LINK" /></translation> <translation id="7004499039102548441">സമീപകാല ടാബുകൾ</translation> <translation id="7006788746334555276">ഉള്ളടക്ക ക്രമീകരണങ്ങള്</translation> <translation id="7015203776128479407">പ്രാഥമിക സമന്വയ സജ്ജീകരണം പൂർത്തിയാക്കിയിട്ടില്ല. സമന്വയം ഓഫാണ്.</translation> @@ -743,6 +747,8 @@ <translation id="8756969031206844760">പാസ്വേഡ് അപ്ഡേറ്റ് ചെയ്യണോ?</translation> <translation id="8775144690796719618">URL അസാധുവാണ്</translation> <translation id="8803639129939845298">സുരക്ഷിതം</translation> +<translation id="8806823403540278281">സ്വകാര്യമായി ബ്രൗസ് ചെയ്യാൻ നിങ്ങളുടെ സ്ഥാപനം ആവശ്യപ്പെടുന്നു. അദൃശ്യ മോഡിൽ ടാബുകൾ സംരക്ഷിച്ചിട്ടില്ല. +<ph name="BEGIN_LINK" />കൂടുതലറിയുക<ph name="END_LINK" /></translation> <translation id="8820817407110198400">Bookmarks</translation> <translation id="8840513115188359703">നിങ്ങൾ Google അക്കൗണ്ടിൽ നിന്ന് സൈൻ ഔട്ട് ആകില്ല.</translation> <translation id="8870413625673593573">സമീപകാലത്ത് അടച്ചവ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_strings_ms.xtb index cf3cffd..cbc7b82 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ms.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
@@ -538,6 +538,8 @@ <translation id="6524918542306337007">Mod Inkognito Tidak Tersedia</translation> <translation id="6561262006871132942">Zum Masuk</translation> <translation id="6585618849026997638">Anda boleh kembali ke halaman yang penting bagi anda dengan menambah penanda halaman</translation> +<translation id="6603393121510733479">Organisasi anda telah mematikan penyemakan imbas peribadi. +<ph name="BEGIN_LINK" />Ketahui lebih lanjut<ph name="END_LINK" /></translation> <translation id="6610002944194042868">Pilihan Terjemahan</translation> <translation id="6620279676667515405">Batal</translation> <translation id="6624219055418309072">Sekat dalam inkognito</translation> @@ -582,6 +584,8 @@ <translation id="6988572888918530647">Urus Akaun Google Anda</translation> <translation id="6995899638241819463">Beri amaran kepada anda jika kata laluan terdedah dalam pelanggaran data</translation> <translation id="6998989275928107238">Kepada</translation> +<translation id="7004032350256606903">Organisasi anda menghendaki anda menyemak imbas secara peribadi. +<ph name="BEGIN_LINK" />Ketahui lebih lanjut<ph name="END_LINK" /></translation> <translation id="7004499039102548441">Tab Terbaharu</translation> <translation id="7006788746334555276">Tetapan Kandungan</translation> <translation id="7015203776128479407">Penyediaan penyegerakan awal tidak diselesaikan. Penyegerakan dimatikan.</translation> @@ -743,6 +747,8 @@ <translation id="8756969031206844760">Kemas kini kata laluan?</translation> <translation id="8775144690796719618">URL tidak sah</translation> <translation id="8803639129939845298">Selamat</translation> +<translation id="8806823403540278281">Organisasi anda menghendaki anda menyemak imbas secara peribadi. Tab tidak disimpan dalam Mod inkognito. +<ph name="BEGIN_LINK" />Ketahui lebih lanjut<ph name="END_LINK" /></translation> <translation id="8820817407110198400">Penanda buku</translation> <translation id="8840513115188359703">Anda tidak akan dilog keluar daripada Akaun Google anda.</translation> <translation id="8870413625673593573">Ditutup Baru-baru Ini</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_my.xtb b/ios/chrome/app/strings/resources/ios_strings_my.xtb index 19c0e54..66a2970 100644 --- a/ios/chrome/app/strings/resources/ios_strings_my.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_my.xtb
@@ -537,6 +537,8 @@ <translation id="6524918542306337007">'ရုပ်ဖျက်မုဒ်' ကို မရနိုင်ပါ</translation> <translation id="6561262006871132942">ဇူးမ်ဆွဲရန်</translation> <translation id="6585618849026997638">သင့်အတွက်အရေးကြီးသော စာမျက်နှာသို့ လိပ်စာမှတ်ပြီး ပြန်သွားနိုင်သည်</translation> +<translation id="6603393121510733479">သင့်အဖွဲ့အစည်းက ကိုယ်ဖျောက်မုဒ်ဖြင့် ဝင်ရောက်ကြည့်ရှုခြင်းကို ပိတ်ထားသည်။ +<ph name="BEGIN_LINK" />ပိုမိုလေ့လာရန်<ph name="END_LINK" /></translation> <translation id="6610002944194042868">ဘာသာပြန်ရန် ရွေးစရာများ</translation> <translation id="6620279676667515405">မလုပ်တော့</translation> <translation id="6624219055418309072">ရုပ်ဖျက်မုဒ်တွင် ပိတ်ထားသည်</translation> @@ -581,6 +583,8 @@ <translation id="6988572888918530647">သင့် Google Account ကို စီမံခြင်း</translation> <translation id="6995899638241819463">ဒေတာကျိုးပေါက်မှုတွင် စကားဝှက်များ ဖော်ထုတ်ခံရသည့်အခါ သင့်ကို သတိပေးခြင်း</translation> <translation id="6998989275928107238">သို့</translation> +<translation id="7004032350256606903">ကိုယ်ဖျောက်မုဒ်ဖြင့် ဝင်ရောက်ကြည့်ရှုရန် သင့်အဖွဲ့အစည်းက သတ်မှတ်ထားပါသည်။ +<ph name="BEGIN_LINK" />ပိုမိုလေ့လာရန်<ph name="END_LINK" /></translation> <translation id="7004499039102548441">မကြာမီက တဲဘ်များ</translation> <translation id="7006788746334555276">အကြောင်းအရာ ဆက်တင်များ</translation> <translation id="7015203776128479407">ကနဦး စင့်ခ်လုပ်ရန် စနစ်ထည့်သွင်းမှု အပြီးသတ်မထားပါ။ စင့်ခ်လုပ်ခြင်း ပိတ်ထားသည်။</translation> @@ -742,6 +746,8 @@ <translation id="8756969031206844760">စကားဝှက်ကို အပ်ဒိတ်လုပ်လိုပါသလား။</translation> <translation id="8775144690796719618">URL မမှန်ပါ</translation> <translation id="8803639129939845298">လုံခြုံမှုရှိသည်</translation> +<translation id="8806823403540278281">ကိုယ်ဖျောက်မုဒ်ဖြင့် ဝင်ရောက်ကြည့်ရှုရန် သင့်အဖွဲ့အစည်းက သတ်မှတ်ထားပါသည်။ ‘ရုပ်ဖျက်မုဒ်’ တွင် တဘ်များကို မသိမ်းပါ။ +<ph name="BEGIN_LINK" />ပိုမိုလေ့လာရန်<ph name="END_LINK" /></translation> <translation id="8820817407110198400">စာညှပ်များ</translation> <translation id="8840513115188359703">Google အကောင့်မှ သင်ထွက်သွားမည် မဟုတ်ပါ။</translation> <translation id="8870413625673593573">မကြာမီက ပိတ်ခဲ့</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_or.xtb b/ios/chrome/app/strings/resources/ios_strings_or.xtb index e910fea..c92eff9 100644 --- a/ios/chrome/app/strings/resources/ios_strings_or.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_or.xtb
@@ -536,6 +536,8 @@ <translation id="6524918542306337007">ଇନକଗ୍ନିଟୋ ମୋଡ୍ ଉପଲବ୍ଧ ନାହିଁ</translation> <translation id="6561262006871132942">ଜୁମ୍ ଇନ୍ କରନ୍ତୁ</translation> <translation id="6585618849026997638">ଆପଣ ଏକ ବୁକମାର୍କ ଯୋଗ କରି ଆପଣଙ୍କ ପାଇଁ ଗୁରୁତ୍ୱପୂର୍ଣ୍ଣ ଥିବା ଏକ ପୃଷ୍ଠାକୁ ଫେରି ପାରିବେ</translation> +<translation id="6603393121510733479">ଆପଣଙ୍କ ସଂସ୍ଥା ବ୍ୟକ୍ତିଗତ ବ୍ରାଉଜିଂକୁ ବନ୍ଦ କରି ଦେଇଛି। +<ph name="BEGIN_LINK" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="END_LINK" /></translation> <translation id="6610002944194042868">ଅନୁବାଦର ବିକଳ୍ପଗୁଡ଼ିକ</translation> <translation id="6620279676667515405">ବାତିଲ୍ କରନ୍ତୁ</translation> <translation id="6624219055418309072">ଇନକଗ୍ନିଟୋ ମୋଡରେ ବ୍ଲକ୍ କରନ୍ତୁ</translation> @@ -580,6 +582,8 @@ <translation id="6988572888918530647">ଆପଣଙ୍କ Google ଆକାଉଣ୍ଟ ପରିଚାଳନା କରନ୍ତୁ</translation> <translation id="6995899638241819463">ଯଦି ଡାଟା ଚୋରି ଯୋଗୁଁ ପାସ୍ୱାର୍ଡଗୁଡ଼ିକ ବିପଦରେ ପଡ଼ିଯାଏ, ତେବେ ଏହା ଆପଣଙ୍କୁ ଚେତାବନୀ ଦେଇଥାଏ</translation> <translation id="6998989275928107238">ପ୍ରାପ୍ତେଷୁ</translation> +<translation id="7004032350256606903">ଆପଣଙ୍କ ସଂସ୍ଥା ପାଇଁ ଆପଣଙ୍କୁ ବ୍ୟକ୍ତିଗତ ଭାବେ ବ୍ରାଉଜ୍ କରିବାର ଆବଶ୍ୟକତା ଅଛି। +<ph name="BEGIN_LINK" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="END_LINK" /></translation> <translation id="7004499039102548441">ସାମ୍ପ୍ରତିକ ଟାବ୍</translation> <translation id="7006788746334555276">ବିଷୟବସ୍ତୁ ସେଟିଂସ୍</translation> <translation id="7015203776128479407">ପ୍ରାରମ୍ଭିକ ସିଙ୍କ୍ ସେଟ୍ଅପ୍ ସମାପ୍ତ ହୋଇନାହିଁ। ସିଙ୍କ୍ ବନ୍ଦ ଅଛି</translation> @@ -741,6 +745,8 @@ <translation id="8756969031206844760">ପାସ୍ୱାର୍ଡ ଅପ୍ଡେଟ୍ କରିବେ?</translation> <translation id="8775144690796719618">ଅବୈଧ URL</translation> <translation id="8803639129939845298">ସୁରକ୍ଷିତ ଅଛି</translation> +<translation id="8806823403540278281">ଆପଣଙ୍କ ସଂସ୍ଥା ପାଇଁ ଆପଣଙ୍କୁ ବ୍ୟକ୍ତିଗତ ଭାବେ ବ୍ରାଉଜ୍ କରିବାର ଆବଶ୍ୟକତା ଅଛି। ଇନକଗ୍ନିଟୋ ମୋଡରେ ଟାବଗୁଡ଼ିକ ସେଭ୍ ହୁଏ ନାହିଁ। +<ph name="BEGIN_LINK" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="END_LINK" /></translation> <translation id="8820817407110198400">Bookmarks</translation> <translation id="8840513115188359703">ଆପଣ ଆପଣଙ୍କର Google ଆକାଉଣ୍ଟରୁ ସାଇନ୍ ଆଉଟ୍ ହେବେ ନାହିଁ।</translation> <translation id="8870413625673593573">ନିକଟରେ ବନ୍ଦ କରାଯାଇଛି</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb index 551ae40..0bc7c6a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -538,6 +538,8 @@ <translation id="6524918542306337007">Modul incognito nu este disponibil</translation> <translation id="6561262006871132942">Mărește</translation> <translation id="6585618849026997638">Poți să revii la o pagină importantă adăugând un marcaj</translation> +<translation id="6603393121510733479">Organizația ta a dezactivat navigarea privată. +<ph name="BEGIN_LINK" />Află mai multe<ph name="END_LINK" /></translation> <translation id="6610002944194042868">Opțiuni de traducere</translation> <translation id="6620279676667515405">Anulează</translation> <translation id="6624219055418309072">Blochează în modul incognito</translation> @@ -582,6 +584,8 @@ <translation id="6988572888918530647">Gestionează-ți Contul Google</translation> <translation id="6995899638241819463">Avertizează-mă dacă parolele au fost expuse în urma încălcării securității datelor</translation> <translation id="6998989275928107238">La</translation> +<translation id="7004032350256606903">Organizația îți solicită să navighezi în privat. +<ph name="BEGIN_LINK" />Află mai multe<ph name="END_LINK" /></translation> <translation id="7004499039102548441">File recente</translation> <translation id="7006788746334555276">Setări privind conținutul</translation> <translation id="7015203776128479407">Configurarea inițială a sincronizării nu a fost finalizată. Sincronizarea este dezactivată.</translation> @@ -743,6 +747,8 @@ <translation id="8756969031206844760">Actualizezi parola?</translation> <translation id="8775144690796719618">Adresă URL nevalidă</translation> <translation id="8803639129939845298">Securizat</translation> +<translation id="8806823403540278281">Organizația îți solicită să navighezi în privat. Filele nu sunt salvate în modul incognito. +<ph name="BEGIN_LINK" />Află mai multe<ph name="END_LINK" /></translation> <translation id="8820817407110198400">Marcaje</translation> <translation id="8840513115188359703">Nu vei fi deconectat(ă) de la Contul Google.</translation> <translation id="8870413625673593573">Închise recent</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_strings_ru.xtb index 1f70a83..0c82ed0 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ru.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
@@ -538,6 +538,8 @@ <translation id="6524918542306337007">Режим инкогнито недоступен</translation> <translation id="6561262006871132942">Увеличить</translation> <translation id="6585618849026997638">Добавьте страницу с важными сведениями в закладки, и вы всегда сможете вернуться к ней.</translation> +<translation id="6603393121510733479">В вашей организации режим инкогнито отключен. +<ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation> <translation id="6610002944194042868">Параметры перевода</translation> <translation id="6620279676667515405">Отмена</translation> <translation id="6624219055418309072">Запретить использование в режиме инкогнито</translation> @@ -582,6 +584,8 @@ <translation id="6988572888918530647">Перейти в настройки аккаунта Google</translation> <translation id="6995899638241819463">Сообщать, если пароли были раскрыты в результате утечки данных</translation> <translation id="6998989275928107238">Кому</translation> +<translation id="7004032350256606903">Согласно правилам вашей организации, использовать режим инкогнито обязательно. +<ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation> <translation id="7004499039102548441">Недавние вкладки</translation> <translation id="7006788746334555276">Настройки контента</translation> <translation id="7015203776128479407">Первоначальная настройка синхронизации не завершена. Синхронизация выключена.</translation> @@ -743,6 +747,8 @@ <translation id="8756969031206844760">Обновить пароль?</translation> <translation id="8775144690796719618">Недействительный URL</translation> <translation id="8803639129939845298">Защищено</translation> +<translation id="8806823403540278281">Согласно правилам вашей организации, использовать режим инкогнито обязательно. В этом режиме вкладки не сохраняются. +<ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation> <translation id="8820817407110198400">Закладки</translation> <translation id="8840513115188359703">Вы останетесь в аккаунте Google.</translation> <translation id="8870413625673593573">Недавно закрытые</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_strings_ta.xtb index 2ce8286..a2bd7e2 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ta.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
@@ -538,6 +538,8 @@ <translation id="6524918542306337007">மறைநிலைப் பயன்முறையைப் பயன்படுத்த முடியாது</translation> <translation id="6561262006871132942">பெரிதாக்கு</translation> <translation id="6585618849026997638">முக்கியமான பக்கங்களை புக்மார்க் செய்வதன் மூலம் எப்போது வேண்டுமானாலும் அவற்றை உடனடியாக அணுகலாம்</translation> +<translation id="6603393121510733479">மறைநிலை உலாவலை உங்கள் நிறுவனம் முடக்கியுள்ளது. +<ph name="BEGIN_LINK" />மேலும் அறிக<ph name="END_LINK" /></translation> <translation id="6610002944194042868">மொழிபெயர்ப்பு விருப்பத்தேர்வுகள்</translation> <translation id="6620279676667515405">ரத்துசெய்</translation> <translation id="6624219055418309072">மறைநிலையில் தடு</translation> @@ -582,6 +584,8 @@ <translation id="6988572888918530647">உங்கள் Google கணக்கை நிர்வகியுங்கள்</translation> <translation id="6995899638241819463">தரவு மீறலினால் கடவுச்சொற்கள் வெளியாகியிருந்தால் அதுகுறித்து எச்சரி</translation> <translation id="6998989275928107238">பெறுநர்:</translation> +<translation id="7004032350256606903">மறைநிலையில் உலாவுமாறு உங்கள் நிறுவனம் கோருகிறது. +<ph name="BEGIN_LINK" />மேலும் அறிக<ph name="END_LINK" /></translation> <translation id="7004499039102548441">சமீபத்திய தாவல்கள்</translation> <translation id="7006788746334555276">உள்ளடக்க அமைப்புகள்</translation> <translation id="7015203776128479407">ஒத்திசைப்பதற்கான துவக்க அமைவு முடியவில்லை. ஒத்திசைவு முடக்கப்பட்டுள்ளது.</translation> @@ -743,6 +747,8 @@ <translation id="8756969031206844760">கடவுச்சொல்லைப் புதுப்பிக்கவா?</translation> <translation id="8775144690796719618">தவறான URL</translation> <translation id="8803639129939845298">பாதுகாப்பானது</translation> +<translation id="8806823403540278281">மறைநிலையில் உலாவுமாறு உங்கள் நிறுவனம் கோருகிறது. மறைநிலைப் பயன்முறையில் தாவல்கள் சேமிக்கப்படாது. +<ph name="BEGIN_LINK" />மேலும் அறிக<ph name="END_LINK" /></translation> <translation id="8820817407110198400">புக்மார்க்குகள்</translation> <translation id="8840513115188359703">உங்கள் Google கணக்கிலிருந்து வெளியேறமாட்டீர்கள்.</translation> <translation id="8870413625673593573">சமீபத்தில் மூடியவை</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ur.xtb b/ios/chrome/app/strings/resources/ios_strings_ur.xtb index 69dd1e34..b398963 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ur.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ur.xtb
@@ -538,6 +538,8 @@ <translation id="6524918542306337007">پوشیدگی وضع دستیاب نہیں ہے</translation> <translation id="6561262006871132942">زوم ان کریں</translation> <translation id="6585618849026997638">بُک مارک شامل کر کے آپ کسی ایسے صفحے پر واپس جا سکتے ہیں جو آپ کیلئے اہم ہے</translation> +<translation id="6603393121510733479">آپ کی تنظیم نے نجی براؤزنگ کو آف کر دیا ہے۔ +<ph name="BEGIN_LINK" />مزید جانیں<ph name="END_LINK" /></translation> <translation id="6610002944194042868">ترجمہ کے اختیارات</translation> <translation id="6620279676667515405">منسوخ کریں</translation> <translation id="6624219055418309072">پوشیدگی وضع میں مسدود کریں</translation> @@ -582,6 +584,8 @@ <translation id="6988572888918530647">اپنے Google اکاؤنٹ کا نظم کریں</translation> <translation id="6995899638241819463">اگر پاس ورڈز ڈیٹا کی خلاف ورزی میں افشاء ہوتے ہیں تو وارننگ حاصل کریں</translation> <translation id="6998989275928107238">بنام</translation> +<translation id="7004032350256606903">آپ کی تنظیم چاہتی ہے کہ آپ نجی طور پر براؤز کریں۔ +<ph name="BEGIN_LINK" />مزید جانیں<ph name="END_LINK" /></translation> <translation id="7004499039102548441">حالیہ ٹیبز</translation> <translation id="7006788746334555276">مواد کی ترتیبات</translation> <translation id="7015203776128479407">مطابقت پذیری کا ابتدائی سیٹ اپ مکمل نہیں ہوا۔ مطابقت پذیری آف ہے۔</translation> @@ -743,6 +747,8 @@ <translation id="8756969031206844760">پاس ورڈ کو اپ ڈیٹ کریں؟</translation> <translation id="8775144690796719618">غلط URL</translation> <translation id="8803639129939845298">محفوظ</translation> +<translation id="8806823403540278281">آپ کی تنظیم چاہتی ہے کہ آپ نجی طور پر براؤز کریں۔ ٹیبز پوشیدگی وضع میں محفوظ نہیں ہیں۔ +<ph name="BEGIN_LINK" />مزید جانیں<ph name="END_LINK" /></translation> <translation id="8820817407110198400">بُک مارکس</translation> <translation id="8840513115188359703">آپ اپنے Google اکاؤنٹ سے سائن آؤٹ نہیں ہوں گے۔</translation> <translation id="8870413625673593573">حال ہی میں بند کردہ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_strings_vi.xtb index ae0ddacd..ddf77ec 100644 --- a/ios/chrome/app/strings/resources/ios_strings_vi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
@@ -538,6 +538,8 @@ <translation id="6524918542306337007">Không có Chế độ ẩn danh</translation> <translation id="6561262006871132942">Phóng to</translation> <translation id="6585618849026997638">Bạn có thể thêm dấu trang để truy cập lại một trang mà bạn thấy quan trọng</translation> +<translation id="6603393121510733479">Tổ chức của bạn đã tắt tính năng duyệt web ở chế độ riêng tư. +<ph name="BEGIN_LINK" />Tìm hiểu thêm<ph name="END_LINK" /></translation> <translation id="6610002944194042868">Tùy chọn dịch</translation> <translation id="6620279676667515405">Hủy</translation> <translation id="6624219055418309072">Chặn ở chế độ Ẩn danh</translation> @@ -582,6 +584,8 @@ <translation id="6988572888918530647">Quản lý Tài khoản Google</translation> <translation id="6995899638241819463">Cảnh báo bạn nếu mật khẩu bị lộ trong một sự cố rò rỉ dữ liệu</translation> <translation id="6998989275928107238">Đến</translation> +<translation id="7004032350256606903">Tổ chức của bạn yêu cầu bạn duyệt web ở chế độ riêng tư. +<ph name="BEGIN_LINK" />Tìm hiểu thêm<ph name="END_LINK" /></translation> <translation id="7004499039102548441">Các thẻ gần đây</translation> <translation id="7006788746334555276">Cài đặt nội dung</translation> <translation id="7015203776128479407">Quá trình thiết lập đồng bộ hóa ban đầu chưa hoàn tất. Tính năng đồng bộ hóa đã tắt.</translation> @@ -743,6 +747,8 @@ <translation id="8756969031206844760">Bạn có muốn cập nhật mật khẩu không?</translation> <translation id="8775144690796719618">URL không hợp lệ</translation> <translation id="8803639129939845298">Bảo mật</translation> +<translation id="8806823403540278281">Tổ chức của bạn yêu cầu bạn duyệt web ở chế độ riêng tư. Các thẻ không được lưu ở Chế độ ẩn danh. +<ph name="BEGIN_LINK" />Tìm hiểu thêm<ph name="END_LINK" /></translation> <translation id="8820817407110198400">Dấu trang</translation> <translation id="8840513115188359703">Bạn sẽ không được đăng xuất khỏi Tài khoản Google của mình.</translation> <translation id="8870413625673593573">Các thẻ đã Đóng gần đây</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb index 893c747..b37049a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
@@ -536,6 +536,8 @@ <translation id="6524918542306337007">無法使用無痕模式</translation> <translation id="6561262006871132942">放大</translation> <translation id="6585618849026997638">您可新增書籤,以便快速返回您認為重要的網頁</translation> +<translation id="6603393121510733479">您的機構已關閉私密瀏覽功能。 +<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation> <translation id="6610002944194042868">翻譯選項</translation> <translation id="6620279676667515405">取消</translation> <translation id="6624219055418309072">在無痕模式中封鎖</translation> @@ -580,6 +582,8 @@ <translation id="6988572888918530647">管理您的 Google 帳戶</translation> <translation id="6995899638241819463">密碼因資料外洩而被洩露時接收警告</translation> <translation id="6998989275928107238">收件者︰</translation> +<translation id="7004032350256606903">您的機構要求您私密瀏覽內容。 +<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation> <translation id="7004499039102548441">最近開啟的分頁</translation> <translation id="7006788746334555276">內容設定</translation> <translation id="7015203776128479407">尚未完成初始同步處理設定。已關閉同步功能。</translation> @@ -741,6 +745,8 @@ <translation id="8756969031206844760">要更新密碼嗎?</translation> <translation id="8775144690796719618">網址無效</translation> <translation id="8803639129939845298">安全</translation> +<translation id="8806823403540278281">您的機構要求您私密瀏覽內容。在無痕模式下無法儲存分頁。 +<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation> <translation id="8820817407110198400">書籤</translation> <translation id="8840513115188359703">您不會因此登出 Google 帳戶。</translation> <translation id="8870413625673593573">最近關閉的分頁</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb index db6222a3..fcde510 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
@@ -538,6 +538,8 @@ <translation id="6524918542306337007">無法使用無痕模式</translation> <translation id="6561262006871132942">放大</translation> <translation id="6585618849026997638">你可以將重要網頁加入書籤,以便再次造訪</translation> +<translation id="6603393121510733479">貴機構已關閉私密瀏覽功能。 +<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation> <translation id="6610002944194042868">翻譯選項</translation> <translation id="6620279676667515405">取消</translation> <translation id="6624219055418309072">在無痕模式中封鎖</translation> @@ -582,6 +584,8 @@ <translation id="6988572888918530647">管理你的 Google 帳戶</translation> <translation id="6995899638241819463">當密碼因資料侵害事件遭到外洩時發出警告</translation> <translation id="6998989275928107238">收件者</translation> +<translation id="7004032350256606903">貴機構要求你使用私密瀏覽模式。 +<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation> <translation id="7004499039102548441">最近開啟的分頁</translation> <translation id="7006788746334555276">內容設定</translation> <translation id="7015203776128479407">尚未完成初始同步處理設定。已關閉同步功能。</translation> @@ -743,6 +747,8 @@ <translation id="8756969031206844760">要更新密碼嗎?</translation> <translation id="8775144690796719618">網址無效</translation> <translation id="8803639129939845298">安全</translation> +<translation id="8806823403540278281">貴機構要求你使用私密瀏覽模式。在無痕模式下無法儲存分頁。 +<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation> <translation id="8820817407110198400">書籤</translation> <translation id="8840513115188359703">您不會因此登出 Google 帳戶。</translation> <translation id="8870413625673593573">最近關閉的分頁</translation>
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/card_view_controller_egtest.mm b/ios/chrome/browser/ui/autofill/manual_fill/card_view_controller_egtest.mm index 5a1cd12..19c47644b 100644 --- a/ios/chrome/browser/ui/autofill/manual_fill/card_view_controller_egtest.mm +++ b/ios/chrome/browser/ui/autofill/manual_fill/card_view_controller_egtest.mm
@@ -54,8 +54,8 @@ // Unicode characters used in card number: // - 0x0020 - Space. // - 0x2060 - WORD-JOINER (makes string undivisible). -constexpr base::char16 separator[] = {0x2060, 0x0020, 0}; -constexpr base::char16 kMidlineEllipsis[] = { +constexpr char16_t separator[] = {0x2060, 0x0020, 0}; +constexpr char16_t kMidlineEllipsis[] = { 0x2022, 0x2060, 0x2006, 0x2060, 0x2022, 0x2060, 0x2006, 0x2060, 0x2022, 0x2060, 0x2006, 0x2060, 0x2022, 0x2060, 0x2006, 0x2060, 0}; NSString* kObfuscatedNumberPrefix = base::SysUTF16ToNSString(
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_credit_card+CreditCard.mm b/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_credit_card+CreditCard.mm index 994763f..27f4ae2 100644 --- a/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_credit_card+CreditCard.mm +++ b/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_credit_card+CreditCard.mm
@@ -38,7 +38,7 @@ // Unicode characters used in card number: // - 0x0020 - Space. // - 0x2060 - WORD-JOINER (makes string undivisible). - constexpr base::char16 separator[] = {0x2060, 0x0020, 0}; + constexpr char16_t separator[] = {0x2060, 0x0020, 0}; const base::string16 digits = creditCard.LastFourDigits(); NSString* obfuscatedNumber = base::SysUTF16ToNSString( autofill::kMidlineEllipsis + base::string16(separator) +
diff --git a/ios/web/webui/web_ui_ios_impl.mm b/ios/web/webui/web_ui_ios_impl.mm index 4f394b5..a2d5c75d 100644 --- a/ios/web/webui/web_ui_ios_impl.mm +++ b/ios/web/webui/web_ui_ios_impl.mm
@@ -37,13 +37,13 @@ std::string json; for (size_t i = 0; i < arg_list.size(); ++i) { if (i > 0) - parameters += base::char16(','); + parameters += char16_t(','); base::JSONWriter::Write(*arg_list[i], &json); parameters += base::UTF8ToUTF16(json); } - return base::ASCIIToUTF16(function_name) + base::char16('(') + parameters + - base::char16(')') + base::char16(';'); + return base::ASCIIToUTF16(function_name) + char16_t('(') + parameters + + char16_t(')') + char16_t(';'); } WebUIIOSImpl::WebUIIOSImpl(WebState* web_state) : web_state_(web_state) {
diff --git a/media/cdm/win/media_foundation_cdm_factory.cc b/media/cdm/win/media_foundation_cdm_factory.cc index c314a5d..bb94d7ca9 100644 --- a/media/cdm/win/media_foundation_cdm_factory.cc +++ b/media/cdm/win/media_foundation_cdm_factory.cc
@@ -115,10 +115,10 @@ CHECK(base::DirectoryExists(temp_dir)); base::win::ScopedPropVariant propvar; - SetBSTR(temp_dir.value().c_str(), propvar.Receive()); - // TODO(xhwang): Replace with MF_CONTENTDECRYPTIONMODULE_STOREPATH. RETURN_IF_FAILED( - temp_properties->SetValue(MF_EME_CDM_STOREPATH, propvar.get())); + InitPropVariantFromString(temp_dir.value().c_str(), propvar.Receive())); + RETURN_IF_FAILED(temp_properties->SetValue( + MF_CONTENTDECRYPTIONMODULE_STOREPATH, propvar.get())); properties = temp_properties; return S_OK;
diff --git a/media/renderers/paint_canvas_video_renderer.cc b/media/renderers/paint_canvas_video_renderer.cc index 7635237..bc2c803 100644 --- a/media/renderers/paint_canvas_video_renderer.cc +++ b/media/renderers/paint_canvas_video_renderer.cc
@@ -376,7 +376,7 @@ // TODO(crbug.com/828599): This should default to BT.709 color space. auto yuv_cs = kRec601_SkYUVColorSpace; - video_frame->ColorSpace().ToSkYUVColorSpace(&yuv_cs); + video_frame->ColorSpace().ToSkYUVColorSpace(video_frame->BitDepth(), &yuv_cs); const libyuv::YuvConstants* matrix = GetYuvContantsForColorSpace(yuv_cs); if (!video_frame->data(VideoFrame::kUPlane) && @@ -593,7 +593,8 @@ } if (info) { SkYUVColorSpace yuv_color_space; - if (!frame_->ColorSpace().ToSkYUVColorSpace(&yuv_color_space)) { + if (!frame_->ColorSpace().ToSkYUVColorSpace(video_frame->BitDepth(), + &yuv_color_space)) { // TODO(hubbe): This really should default to rec709 // https://crbug.com/828599 yuv_color_space = kRec601_SkYUVColorSpace;
diff --git a/mojo/core/broker_win.cc b/mojo/core/broker_win.cc index e07cfc2..32d10dfc 100644 --- a/mojo/core/broker_win.cc +++ b/mojo/core/broker_win.cc
@@ -110,7 +110,7 @@ const InitData* data = reinterpret_cast<const InitData*>(header + 1); CHECK_EQ(message->payload_size(), sizeof(BrokerMessageHeader) + sizeof(InitData) + - data->pipe_name_length * sizeof(base::char16)); + data->pipe_name_length * sizeof(char16_t)); auto* name_data = reinterpret_cast<const wchar_t*>(data + 1); CHECK(data->pipe_name_length); inviter_endpoint_ = NamedPlatformChannel::ConnectToServer(
diff --git a/mojo/public/cpp/base/string16_mojom_traits.cc b/mojo/public/cpp/base/string16_mojom_traits.cc index d19dd44..237a7c9 100644 --- a/mojo/public/cpp/base/string16_mojom_traits.cc +++ b/mojo/public/cpp/base/string16_mojom_traits.cc
@@ -14,7 +14,7 @@ base::string16* out) { ArrayDataView<uint16_t> view; data.GetDataDataView(&view); - out->assign(reinterpret_cast<const base::char16*>(view.data()), view.size()); + out->assign(reinterpret_cast<const char16_t*>(view.data()), view.size()); return true; } @@ -24,7 +24,7 @@ const base::string16& str) { const auto* bytes = reinterpret_cast<const uint8_t*>(str.data()); return mojo_base::BigBuffer( - base::make_span(bytes, str.size() * sizeof(base::char16))); + base::make_span(bytes, str.size() * sizeof(char16_t))); } // static @@ -34,10 +34,10 @@ mojo_base::BigBuffer buffer; if (!data.ReadData(&buffer)) return false; - if (buffer.size() % sizeof(base::char16)) + if (buffer.size() % sizeof(char16_t)) return false; - *out = base::string16(reinterpret_cast<const base::char16*>(buffer.data()), - buffer.size() / sizeof(base::char16)); + *out = base::string16(reinterpret_cast<const char16_t*>(buffer.data()), + buffer.size() / sizeof(char16_t)); return true; }
diff --git a/net/cert/internal/parse_name.cc b/net/cert/internal/parse_name.cc index 1ecba7d..37eed4414 100644 --- a/net/cert/internal/parse_name.cc +++ b/net/cert/internal/parse_name.cc
@@ -30,7 +30,7 @@ memcpy(base::WriteInto(&in_16bit, in.Length() / 2 + 1), in.UnsafeData(), in.Length()); } - for (base::char16& c : in_16bit) { + for (char16_t& c : in_16bit) { // BMPString is UCS-2 in big-endian order. c = base::NetToHost16(c);
diff --git a/net/cookies/cookie_monster.cc b/net/cookies/cookie_monster.cc index 6d2a2fe..6e59df04 100644 --- a/net/cookies/cookie_monster.cc +++ b/net/cookies/cookie_monster.cc
@@ -75,6 +75,7 @@ #include "net/cookies/cookie_monster_netlog_params.h" #include "net/cookies/cookie_util.h" #include "net/cookies/parsed_cookie.h" +#include "net/http/http_util.h" #include "net/log/net_log.h" #include "net/log/net_log_values.h" #include "url/origin.h" @@ -164,7 +165,7 @@ namespace { bool ContainsControlCharacter(const std::string& s) { - return base::ranges::any_of(s, [](char c) { return c >= 0 && c <= 31; }); + return base::ranges::any_of(s, &HttpUtil::IsControlChar); } typedef std::vector<CanonicalCookie*> CanonicalCookieVector;
diff --git a/net/cookies/cookie_monster_unittest.cc b/net/cookies/cookie_monster_unittest.cc index f169c8cf..e42d8de 100644 --- a/net/cookies/cookie_monster_unittest.cc +++ b/net/cookies/cookie_monster_unittest.cc
@@ -2681,6 +2681,7 @@ const Time now1(Time::Now()); const Time now2(Time::Now() + TimeDelta::FromSeconds(1)); const Time now3(Time::Now() + TimeDelta::FromSeconds(2)); + const Time now4(Time::Now() + TimeDelta::FromSeconds(3)); const Time later(now1 + TimeDelta::FromDays(1)); const GURL url("http://host/path"); const std::string domain("host"); @@ -2692,18 +2693,29 @@ AddCookieToList(url, "foo=bar; path=" + path, now1, &initial_cookies); - // We have to manually build this cookie because it contains a control - // character, and our cookie line parser rejects control characters. + // We have to manually build these cookies because they contain control + // characters, and our cookie line parser rejects control characters. std::unique_ptr<CanonicalCookie> cc = CanonicalCookie::CreateUnsafeCookieForTesting( "baz", "\x05" "boo", - "." + domain, path, now2, later, base::Time(), false, false, - CookieSameSite::NO_RESTRICTION, COOKIE_PRIORITY_DEFAULT, false); + "." + domain, path, now2, later, base::Time(), true /* secure */, + false /* httponly */, CookieSameSite::NO_RESTRICTION, + COOKIE_PRIORITY_DEFAULT, false /* sameparty */); initial_cookies.push_back(std::move(cc)); - AddCookieToList(url, "hello=world; path=" + path, now3, &initial_cookies); + std::unique_ptr<CanonicalCookie> cc2 = + CanonicalCookie::CreateUnsafeCookieForTesting( + "baz", + "\x7F" + "boo", + "." + domain, path, now3, later, base::Time(), true /* secure */, + false /* httponly */, CookieSameSite::NO_RESTRICTION, + COOKIE_PRIORITY_DEFAULT, false /* sameparty */); + initial_cookies.push_back(std::move(cc2)); + + AddCookieToList(url, "hello=world; path=" + path, now4, &initial_cookies); // Inject our initial cookies into the mock PersistentCookieStore. store->SetLoadExpectation(true, std::move(initial_cookies));
diff --git a/net/cookies/parsed_cookie.cc b/net/cookies/parsed_cookie.cc index f6c1cd4..5ef07e0 100644 --- a/net/cookies/parsed_cookie.cc +++ b/net/cookies/parsed_cookie.cc
@@ -122,12 +122,6 @@ return true; } -// RFC 5234 states that control characters are considered to be: -// CTL = %x00-1F / %x7F -bool IsControlCharacter(unsigned char c) { - return c <= 0x1F || c == 0x7F; -} - } // namespace namespace net { @@ -352,7 +346,7 @@ // The greatest common denominator of cookie attribute values is // <any CHAR except CTLs or ";"> according to RFC 6265. for (std::string::const_iterator i = value.begin(); i != value.end(); ++i) { - if (IsControlCharacter(*i) || *i == ';') + if (HttpUtil::IsControlChar(*i) || *i == ';') return false; } return true;
diff --git a/net/dns/dns_config_service_win.cc b/net/dns/dns_config_service_win.cc index f073bd1..4bbe15d 100644 --- a/net/dns/dns_config_service_win.cc +++ b/net/dns/dns_config_service_win.cc
@@ -504,7 +504,7 @@ // Otherwise try to convert it from IDN to punycode. const int kInitialBufferSize = 256; - url::RawCanonOutputT<base::char16, kInitialBufferSize> punycode; + url::RawCanonOutputT<char16_t, kInitialBufferSize> punycode; if (!url::IDNToASCII(base::as_u16cstr(widestr), widestr.length(), &punycode)) return "";
diff --git a/net/ftp/ftp_directory_listing_parser_vms.cc b/net/ftp/ftp_directory_listing_parser_vms.cc index 3c0131a..e487338 100644 --- a/net/ftp/ftp_directory_listing_parser_vms.cc +++ b/net/ftp/ftp_directory_listing_parser_vms.cc
@@ -223,7 +223,7 @@ bool seen_error = false; base::string16 total_of = base::ASCIIToUTF16("Total of "); - base::char16 space[2] = { ' ', 0 }; + char16_t space[2] = {' ', 0}; for (size_t i = 0; i < lines.size(); i++) { if (lines[i].empty()) continue;
diff --git a/net/ftp/ftp_directory_listing_parser_vms_unittest.cc b/net/ftp/ftp_directory_listing_parser_vms_unittest.cc index 7fa7505..83549bf 100644 --- a/net/ftp/ftp_directory_listing_parser_vms_unittest.cc +++ b/net/ftp/ftp_directory_listing_parser_vms_unittest.cc
@@ -179,7 +179,7 @@ // The parser requires a directory header before accepting regular input. lines.push_back(ASCIIToUTF16("garbage")); - base::char16 data[] = {0x0}; + char16_t data[] = {0x0}; lines.push_back(base::string16(data, 1)); std::vector<FtpDirectoryListingEntry> entries;
diff --git a/net/http/http_auth_handler_ntlm_portable_unittest.cc b/net/http/http_auth_handler_ntlm_portable_unittest.cc index 473134e..593ead4 100644 --- a/net/http/http_auth_handler_ntlm_portable_unittest.cc +++ b/net/http/http_auth_handler_ntlm_portable_unittest.cc
@@ -129,8 +129,7 @@ } #endif - str->assign(reinterpret_cast<const base::char16*>(raw.data()), - raw.size() / 2); + str->assign(reinterpret_cast<const char16_t*>(raw.data()), raw.size() / 2); } int GetGenerateAuthTokenResult() {
diff --git a/net/http/http_auth_ntlm_mechanism.cc b/net/http/http_auth_ntlm_mechanism.cc index 377cc26..b4b944d0 100644 --- a/net/http/http_auth_ntlm_mechanism.cc +++ b/net/http/http_auth_ntlm_mechanism.cc
@@ -136,7 +136,7 @@ base::string16 domain; base::string16 user; const base::string16& username = credentials->username(); - const base::char16 backslash_character = '\\'; + const char16_t backslash_character = '\\'; size_t backslash_idx = username.find(backslash_character); if (backslash_idx == base::string16::npos) { user = username;
diff --git a/net/http/http_cache_writers.cc b/net/http/http_cache_writers.cc index a80dc43..5842b09c 100644 --- a/net/http/http_cache_writers.cc +++ b/net/http/http_cache_writers.cc
@@ -10,7 +10,10 @@ #include "base/auto_reset.h" #include "base/bind.h" #include "base/callback_helpers.h" +#include "base/debug/crash_logging.h" +#include "base/debug/dump_without_crashing.h" #include "base/logging.h" +#include "base/strings/stringprintf.h" #include "base/threading/thread_task_runner_handle.h" #include "net/base/net_errors.h" #include "net/disk_cache/disk_cache.h" @@ -22,6 +25,18 @@ namespace { +base::debug::CrashKeyString* GetCacheKeyCrashKey() { + static auto* crash_key = base::debug::AllocateCrashKeyString( + "http_cache_key", base::debug::CrashKeySize::Size256); + return crash_key; +} + +base::debug::CrashKeyString* GetTransactionFlagsCrashKey() { + static auto* crash_key = base::debug::AllocateCrashKeyString( + "http_cache_transaction", base::debug::CrashKeySize::Size256); + return crash_key; +} + bool IsValidResponseForWriter(bool is_partial, const HttpResponseInfo* response_info) { if (!response_info->headers.get()) @@ -379,6 +394,35 @@ int HttpCache::Writers::DoNetworkRead() { DCHECK(network_transaction_); next_state_ = State::NETWORK_READ_COMPLETE; + + // TODO(https://crbug.com/778641): This is a partial mitigation and an attempt + // to gather more info) + if (!network_transaction_) { + static bool reported = false; + if (!reported) { + reported = true; + base::debug::ScopedCrashKeyString key_info( + GetCacheKeyCrashKey(), active_transaction_ + ? active_transaction_->key() + : "(no transaction)"); + base::debug::ScopedCrashKeyString flags_info( + GetTransactionFlagsCrashKey(), + active_transaction_ + ? base::StringPrintf( + "mth=%s/m=%d/p=%d/t=%d/ex=%d/tc=%d/par=%d/pri=%d/nw=%zu", + active_transaction_->method().c_str(), + static_cast<int>(active_transaction_->mode()), + static_cast<int>(active_transaction_->partial() != nullptr), + static_cast<int>(active_transaction_->is_truncated()), + static_cast<int>(IsExclusive()), GetTransactionsCount(), + static_cast<int>(parallel_writing_pattern_), + static_cast<int>(priority_), all_writers_.size()) + : "(no transaction)"); + base::debug::DumpWithoutCrashing(); + } + return ERR_FAILED; + } + CompletionOnceCallback io_callback = base::BindOnce( &HttpCache::Writers::OnIOComplete, weak_factory_.GetWeakPtr()); return network_transaction_->Read(read_buf_.get(), io_buf_len_,
diff --git a/net/http/http_util.cc b/net/http/http_util.cc index 17bb8d20..19cc54b 100644 --- a/net/http/http_util.cc +++ b/net/http/http_util.cc
@@ -523,6 +523,10 @@ return true; } +bool HttpUtil::IsControlChar(char c) { + return (c >= 0x00 && c <= 0x1F) || c == 0x7F; +} + // See RFC 5987 Sec 3.2.1 for the definition of |parmname|. bool HttpUtil::IsParmName(base::StringPiece str) { if (str.empty())
diff --git a/net/http/http_util.h b/net/http/http_util.h index 154c41f..202ff63 100644 --- a/net/http/http_util.h +++ b/net/http/http_util.h
@@ -128,6 +128,10 @@ // Whether the string is a valid |token| as defined in RFC 7230 Sec 3.2.6. static bool IsToken(base::StringPiece str); + // Whether the character is a control character (CTL) as defined in RFC 5234 + // Appendix B.1. + static bool IsControlChar(char c); + // Whether the string is a valid |parmname| as defined in RFC 5987 Sec 3.2.1. static bool IsParmName(base::StringPiece str);
diff --git a/net/http/http_util_unittest.cc b/net/http/http_util_unittest.cc index 75d09aff4..2c1d0bc8 100644 --- a/net/http/http_util_unittest.cc +++ b/net/http/http_util_unittest.cc
@@ -1531,6 +1531,24 @@ EXPECT_TRUE(HttpUtil::IsLWS(' ')); } +TEST(HttpUtilTest, IsControlChar) { + EXPECT_FALSE(HttpUtil::IsControlChar('1')); + EXPECT_FALSE(HttpUtil::IsControlChar('a')); + EXPECT_FALSE(HttpUtil::IsControlChar('.')); + EXPECT_FALSE(HttpUtil::IsControlChar('$')); + EXPECT_FALSE(HttpUtil::IsControlChar('\x7E')); + EXPECT_FALSE(HttpUtil::IsControlChar('\x80')); + EXPECT_FALSE(HttpUtil::IsControlChar('\xFF')); + + EXPECT_TRUE(HttpUtil::IsControlChar('\0')); + EXPECT_TRUE(HttpUtil::IsControlChar('\v')); + EXPECT_TRUE(HttpUtil::IsControlChar('\n')); + EXPECT_TRUE(HttpUtil::IsControlChar('\r')); + EXPECT_TRUE(HttpUtil::IsControlChar('\t')); + EXPECT_TRUE(HttpUtil::IsControlChar('\x01')); + EXPECT_TRUE(HttpUtil::IsControlChar('\x7F')); +} + TEST(HttpUtilTest, ParseAcceptEncoding) { const struct { const char* const value;
diff --git a/net/ntlm/ntlm_client_fuzzer.cc b/net/ntlm/ntlm_client_fuzzer.cc index c2e43de..c4f1ce5 100644 --- a/net/ntlm/ntlm_client_fuzzer.cc +++ b/net/ntlm/ntlm_client_fuzzer.cc
@@ -17,7 +17,7 @@ base::string16 ConsumeRandomLengthString16(FuzzedDataProvider& data_provider, size_t max_chars) { std::string bytes = data_provider.ConsumeRandomLengthString(max_chars * 2); - return base::string16(reinterpret_cast<const base::char16*>(bytes.data()), + return base::string16(reinterpret_cast<const char16_t*>(bytes.data()), bytes.size() / 2); }
diff --git a/net/ntlm/ntlm_client_unittest.cc b/net/ntlm/ntlm_client_unittest.cc index a4a23c7e..b516cd5 100644 --- a/net/ntlm/ntlm_client_unittest.cc +++ b/net/ntlm/ntlm_client_unittest.cc
@@ -81,8 +81,7 @@ } #endif - str->assign(reinterpret_cast<const base::char16*>(raw.data()), - raw.size() / 2); + str->assign(reinterpret_cast<const char16_t*>(raw.data()), raw.size() / 2); return true; }
diff --git a/net/ntlm/ntlm_test_data.h b/net/ntlm/ntlm_test_data.h index 3e1a3fc..6cb1678 100644 --- a/net/ntlm/ntlm_test_data.h +++ b/net/ntlm/ntlm_test_data.h
@@ -23,17 +23,15 @@ namespace test { // Common input values defined in [MS-NLMP] Section 4.2.1. -constexpr base::char16 kPassword[] = {'P', 'a', 's', 's', 'w', - 'o', 'r', 'd', '\0'}; -constexpr base::char16 kNtlmDomain[] = {'D', 'o', 'm', 'a', 'i', 'n', '\0'}; +constexpr char16_t kPassword[] = {'P', 'a', 's', 's', 'w', 'o', 'r', 'd', '\0'}; +constexpr char16_t kNtlmDomain[] = {'D', 'o', 'm', 'a', 'i', 'n', '\0'}; constexpr uint8_t kNtlmDomainRaw[] = {'D', 0x00, 'o', 0x00, 'm', 0x00, 'a', 0x00, 'i', 0x00, 'n', 0x00}; -constexpr base::char16 kUser[] = {'U', 's', 'e', 'r', '\0'}; -constexpr base::char16 kDomainUserCombined[] = {'D', 'o', 'm', 'a', 'i', 'n', - '\\', 'U', 's', 'e', 'r', '\0'}; -constexpr base::char16 kHostname[] = {'C', 'O', 'M', 'P', 'U', - 'T', 'E', 'R', '\0'}; -constexpr base::char16 kServer[] = {'S', 'e', 'r', 'v', 'e', 'r', '\0'}; +constexpr char16_t kUser[] = {'U', 's', 'e', 'r', '\0'}; +constexpr char16_t kDomainUserCombined[] = {'D', 'o', 'm', 'a', 'i', 'n', + '\\', 'U', 's', 'e', 'r', '\0'}; +constexpr char16_t kHostname[] = {'C', 'O', 'M', 'P', 'U', 'T', 'E', 'R', '\0'}; +constexpr char16_t kServer[] = {'S', 'e', 'r', 'v', 'e', 'r', '\0'}; constexpr uint8_t kServerRaw[] = {'S', 0x00, 'e', 0x00, 'r', 0x00, 'v', 0x00, 'e', 0x00, 'r', 0x00};
diff --git a/net/proxy_resolution/win/windows_system_proxy_resolver.cc b/net/proxy_resolution/win/windows_system_proxy_resolver.cc index 4aeb4a6..c85a10f 100644 --- a/net/proxy_resolution/win/windows_system_proxy_resolver.cc +++ b/net/proxy_resolution/win/windows_system_proxy_resolver.cc
@@ -72,7 +72,7 @@ wcslen(result_entry.pwszProxy)); if (!base::IsStringASCII(host_wide)) { const int kInitialBufferSize = 256; - url::RawCanonOutputT<base::char16, kInitialBufferSize> punycode_output; + url::RawCanonOutputT<char16_t, kInitialBufferSize> punycode_output; if (!url::IDNToASCII(base::as_u16cstr(host_wide), host_wide.length(), &punycode_output)) return false;
diff --git a/net/quic/mock_crypto_client_stream.cc b/net/quic/mock_crypto_client_stream.cc index 534953d..dec0e080 100644 --- a/net/quic/mock_crypto_client_stream.cc +++ b/net/quic/mock_crypto_client_stream.cc
@@ -4,8 +4,11 @@ #include "net/quic/mock_crypto_client_stream.h" +#include "net/base/ip_endpoint.h" +#include "net/quic/address_utils.h" #include "net/quic/mock_decrypter.h" #include "net/quic/mock_encrypter.h" +#include "net/quic/quic_chromium_client_session.h" #include "net/third_party/quiche/src/quic/core/crypto/null_decrypter.h" #include "net/third_party/quiche/src/quic/core/crypto/null_encrypter.h" #include "net/third_party/quiche/src/quic/core/crypto/quic_decrypter.h" @@ -14,6 +17,7 @@ #include "net/third_party/quiche/src/quic/core/quic_utils.h" #include "net/third_party/quiche/src/quic/platform/api/quic_ptr_util.h" #include "net/third_party/quiche/src/quic/test_tools/quic_config_peer.h" +#include "net/third_party/quiche/src/quic/test_tools/quic_connection_peer.h" #include "net/third_party/quiche/src/quic/test_tools/quic_test_utils.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/boringssl/src/include/openssl/ssl.h" @@ -89,6 +93,19 @@ } bool MockCryptoClientStream::CryptoConnect() { + IPEndPoint local_ip; + static_cast<QuicChromiumClientSession*>(session()) + ->GetDefaultSocket() + ->GetLocalAddress(&local_ip); + session()->connection()->SetSelfAddress(ToQuicSocketAddress(local_ip)); + + IPEndPoint peer_ip; + static_cast<QuicChromiumClientSession*>(session()) + ->GetDefaultSocket() + ->GetPeerAddress(&peer_ip); + quic::test::QuicConnectionPeer::SetEffectivePeerAddress( + session()->connection(), ToQuicSocketAddress(peer_ip)); + if (session()->connection()->version().KnowsWhichDecrypterToUse()) { session()->connection()->InstallDecrypter( ENCRYPTION_FORWARD_SECURE,
diff --git a/net/quic/quic_chromium_client_session.cc b/net/quic/quic_chromium_client_session.cc index 6b277a8..17d9c5f7 100644 --- a/net/quic/quic_chromium_client_session.cc +++ b/net/quic/quic_chromium_client_session.cc
@@ -2337,7 +2337,6 @@ static_cast<QuicChromiumPacketWriter*>(connection()->writer()) ->set_delegate(nullptr); writer->set_delegate(this); - connection()->SetSelfAddress(self_address); if (!migrate_idle_session_ && !HasActiveRequestStreams()) { // If idle sessions won't be migrated, close the connection. @@ -2353,8 +2352,8 @@ // Migrate to the probed socket immediately: socket, writer and reader will // be acquired by connection and used as default on success. - if (!MigrateToSocket(std::move(socket), std::move(reader), - std::move(writer))) { + if (!MigrateToSocket(self_address, peer_address, std::move(socket), + std::move(reader), std::move(writer))) { LogMigrateToSocketStatus(false); net_log_.AddEvent( NetLogEventType::QUIC_CONNECTION_MIGRATION_FAILURE_AFTER_PROBING); @@ -2363,8 +2362,6 @@ LogMigrateToSocketStatus(true); - // Notify the connection that migration succeeds after probing. - connection()->OnSuccessfulMigration(/*is_port_change=*/true); num_migrations_++; HistogramAndLogMigrationSuccess(connection_id()); } @@ -2397,7 +2394,6 @@ static_cast<QuicChromiumPacketWriter*>(connection()->writer()) ->set_delegate(nullptr); writer->set_delegate(this); - connection()->SetSelfAddress(self_address); // Close streams that are not migratable to the probed |network|. ResetNonMigratableStreams(); @@ -2416,8 +2412,8 @@ // Migrate to the probed socket immediately: socket, writer and reader will // be acquired by connection and used as default on success. - if (!MigrateToSocket(std::move(socket), std::move(reader), - std::move(writer))) { + if (!MigrateToSocket(self_address, peer_address, std::move(socket), + std::move(reader), std::move(writer))) { LogMigrateToSocketStatus(false); net_log_.AddEvent( NetLogEventType::QUIC_CONNECTION_MIGRATION_FAILURE_AFTER_PROBING); @@ -2426,9 +2422,6 @@ LogMigrateToSocketStatus(true); - // Notify the connection that migration succeeds after probing. - connection()->OnSuccessfulMigration(/*is_port_change=*/false); - net_log_.AddEventWithInt64Params( NetLogEventType::QUIC_CONNECTION_MIGRATION_SUCCESS_AFTER_PROBING, "migrate_to_network", network); @@ -3534,9 +3527,12 @@ ->set_delegate(nullptr); new_writer->set_delegate(this); + IPEndPoint self_address; + socket->GetLocalAddress(&self_address); // Migrate to the new socket. - if (!MigrateToSocket(std::move(socket), std::move(new_reader), - std::move(new_writer))) { + if (!MigrateToSocket(ToQuicSocketAddress(self_address), + ToQuicSocketAddress(peer_address), std::move(socket), + std::move(new_reader), std::move(new_writer))) { HistogramAndLogMigrationFailure(MIGRATION_STATUS_TOO_MANY_CHANGES, connection_id(), "Too many changes"); if (close_session_on_error) { @@ -3558,6 +3554,8 @@ } bool QuicChromiumClientSession::MigrateToSocket( + const quic::QuicSocketAddress& self_address, + const quic::QuicSocketAddress& peer_address, std::unique_ptr<DatagramClientSocket> socket, std::unique_ptr<QuicChromiumPacketReader> reader, std::unique_ptr<QuicChromiumPacketWriter> writer) { @@ -3577,8 +3575,8 @@ // WriteToNewSocket completes. DVLOG(1) << "Force blocking the packet writer"; writer->set_force_write_blocked(true); - // TODO(jri): Make SetQuicPacketWriter take a scoped_ptr. - connection()->SetQuicPacketWriter(writer.release(), /*owns_writer=*/true); + MigratePath(self_address, peer_address, writer.release(), + /*owns_writer=*/true); // Post task to write the pending packet or a PING packet to the new // socket. This avoids reentrancy issues if there is a write error
diff --git a/net/quic/quic_chromium_client_session.h b/net/quic/quic_chromium_client_session.h index f9c4a3732..9bc2f7e 100644 --- a/net/quic/quic_chromium_client_session.h +++ b/net/quic/quic_chromium_client_session.h
@@ -784,7 +784,9 @@ // successful migration, or false if number of migrations exceeds // kMaxReadersPerQuicSession. Takes ownership of |socket|, |reader|, // and |writer|. - bool MigrateToSocket(std::unique_ptr<DatagramClientSocket> socket, + bool MigrateToSocket(const quic::QuicSocketAddress& self_address, + const quic::QuicSocketAddress& peer_address, + std::unique_ptr<DatagramClientSocket> socket, std::unique_ptr<QuicChromiumPacketReader> reader, std::unique_ptr<QuicChromiumPacketWriter> writer);
diff --git a/net/quic/quic_chromium_client_session_test.cc b/net/quic/quic_chromium_client_session_test.cc index 856241a..98bd2b3 100644 --- a/net/quic/quic_chromium_client_session_test.cc +++ b/net/quic/quic_chromium_client_session_test.cc
@@ -1892,7 +1892,6 @@ char data[] = "ABCD"; MockQuicData quic_data2(version_); - std::unique_ptr<quic::QuicEncryptedPacket> ack_and_data_out; quic_data2.AddRead( SYNCHRONOUS, server_maker_.MakePingPacket(1, /*include_version=*/false)); quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); @@ -1911,7 +1910,7 @@ quic_data2.AddSocketDataToFactory(&socket_factory_); // Create connected socket. std::unique_ptr<DatagramClientSocket> new_socket = - socket_factory_.CreateDatagramClientSocket(DatagramSocket::DEFAULT_BIND, + socket_factory_.CreateDatagramClientSocket(DatagramSocket::RANDOM_BIND, &net_log_, NetLogSource()); EXPECT_THAT(new_socket->Connect(kIpEndPoint), IsOk()); @@ -1926,8 +1925,13 @@ std::unique_ptr<QuicChromiumPacketWriter> new_writer( CreateQuicChromiumPacketWriter(new_socket.get(), session_.get())); + IPEndPoint local_address; + new_socket->GetLocalAddress(&local_address); + IPEndPoint peer_address; + new_socket->GetPeerAddress(&peer_address); // Migrate session. EXPECT_TRUE(session_->MigrateToSocket( + ToQuicSocketAddress(local_address), ToQuicSocketAddress(peer_address), std::move(new_socket), std::move(new_reader), std::move(new_writer))); // Spin message loop to complete migration. base::RunLoop().RunUntilIdle(); @@ -1966,13 +1970,13 @@ quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); quic_data2.AddWrite( SYNCHRONOUS, - client_maker_.MakePingPacket(i + packet_num, /*include_version=*/true)); + client_maker_.MakePingPacket(packet_num++, /*include_version=*/true)); quic_data2.AddSocketDataToFactory(&socket_factory_); // Create connected socket. std::unique_ptr<DatagramClientSocket> new_socket = - socket_factory_.CreateDatagramClientSocket(DatagramSocket::DEFAULT_BIND, + socket_factory_.CreateDatagramClientSocket(DatagramSocket::RANDOM_BIND, &net_log_, NetLogSource()); EXPECT_THAT(new_socket->Connect(kIpEndPoint), IsOk()); @@ -1987,9 +1991,14 @@ std::unique_ptr<QuicChromiumPacketWriter> new_writer( CreateQuicChromiumPacketWriter(new_socket.get(), session_.get())); + IPEndPoint local_address; + new_socket->GetLocalAddress(&local_address); + IPEndPoint peer_address; + new_socket->GetPeerAddress(&peer_address); // Migrate session. if (i < kMaxReadersPerQuicSession - 1) { EXPECT_TRUE(session_->MigrateToSocket( + ToQuicSocketAddress(local_address), ToQuicSocketAddress(peer_address), std::move(new_socket), std::move(new_reader), std::move(new_writer))); // Spin message loop to complete migration. base::RunLoop().RunUntilIdle(); @@ -1998,6 +2007,7 @@ } else { // Max readers exceeded. EXPECT_FALSE(session_->MigrateToSocket( + ToQuicSocketAddress(local_address), ToQuicSocketAddress(peer_address), std::move(new_socket), std::move(new_reader), std::move(new_writer))); EXPECT_TRUE(quic_data2.AllReadDataConsumed()); EXPECT_FALSE(quic_data2.AllWriteDataConsumed()); @@ -2040,7 +2050,7 @@ // Create connected socket. std::unique_ptr<DatagramClientSocket> new_socket = - socket_factory_.CreateDatagramClientSocket(DatagramSocket::DEFAULT_BIND, + socket_factory_.CreateDatagramClientSocket(DatagramSocket::RANDOM_BIND, &net_log_, NetLogSource()); EXPECT_THAT(new_socket->Connect(kIpEndPoint), IsOk()); @@ -2055,8 +2065,13 @@ std::unique_ptr<QuicChromiumPacketWriter> new_writer( CreateQuicChromiumPacketWriter(new_socket.get(), session_.get())); + IPEndPoint local_address; + new_socket->GetLocalAddress(&local_address); + IPEndPoint peer_address; + new_socket->GetPeerAddress(&peer_address); // Store old socket and migrate session. EXPECT_TRUE(session_->MigrateToSocket( + ToQuicSocketAddress(local_address), ToQuicSocketAddress(peer_address), std::move(new_socket), std::move(new_reader), std::move(new_writer))); // Spin message loop to complete migration. base::RunLoop().RunUntilIdle();
diff --git a/net/quic/quic_stream_factory_test.cc b/net/quic/quic_stream_factory_test.cc index cef1be6..04e7b99 100644 --- a/net/quic/quic_stream_factory_test.cc +++ b/net/quic/quic_stream_factory_test.cc
@@ -3428,6 +3428,7 @@ {kDefaultNetworkForTests, kNewNetworkForTests}); ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); + client_maker_.set_save_packet_frames(true); MockQuicData failed_socket_data(version_); MockQuicData socket_data(version_); @@ -3454,6 +3455,11 @@ // Set up second socket data provider that is used after migration. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read. + if (version_.UsesHttp3()) { + socket_data.AddWrite(SYNCHRONOUS, + client_maker_.MakeCombinedRetransmissionPacket( + {3, 1, 2}, packet_num++, true)); + } // Ping packet to send after migration. socket_data.AddWrite( SYNCHRONOUS, @@ -3695,6 +3701,7 @@ {kDefaultNetworkForTests, kNewNetworkForTests}); ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); + client_maker_.set_save_packet_frames(true); MockQuicData default_socket_data(version_); default_socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); @@ -3710,10 +3717,15 @@ // Set up second socket data provider that is used after migration. alternate_socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read. + if (version_.UsesHttp3()) { + alternate_socket_data.AddWrite( + SYNCHRONOUS, + client_maker_.MakeRetransmissionPacket(1, packet_num++, true)); + } // Ping packet to send after migration. alternate_socket_data.AddWrite( SYNCHRONOUS, - client_maker_.MakePingPacket(packet_num, /*include_version=*/true)); + client_maker_.MakePingPacket(packet_num++, /*include_version=*/true)); alternate_socket_data.AddSocketDataToFactory(socket_factory_.get()); } @@ -3769,6 +3781,7 @@ ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); + client_maker_.set_save_packet_frames(true); // Use the test task runner. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get()); @@ -3830,6 +3843,11 @@ // Set up second socket data provider that is used after migration. // The response to the earlier request is read on this new socket. MockQuicData socket_data1(version_); + if (version_.UsesHttp3()) { + socket_data1.AddWrite(SYNCHRONOUS, + client_maker_.MakeCombinedRetransmissionPacket( + {1, 2}, packet_number++, true)); + } socket_data1.AddWrite( SYNCHRONOUS, client_maker_.MakePingPacket(packet_number++, /*include_version=*/true)); @@ -3909,6 +3927,7 @@ ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); + client_maker_.set_save_packet_frames(true); // Use the test task runner. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get()); @@ -3974,6 +3993,11 @@ // Set up second socket data provider that is used after migration. // The response to the earlier request is read on this new socket. MockQuicData socket_data1(version_); + if (version_.UsesHttp3()) { + socket_data1.AddWrite(SYNCHRONOUS, + client_maker_.MakeCombinedRetransmissionPacket( + {1, 2}, packet_num++, true)); + } socket_data1.AddWrite( SYNCHRONOUS, client_maker_.MakePingPacket(packet_num++, /*include_version=*/true)); @@ -5201,6 +5225,13 @@ EXPECT_EQ(0u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get())); + // Manually initialize the connection's self address. In real life, the + // initialization will be done during crypto handshake. + IPEndPoint ip; + session->GetDefaultSocket()->GetLocalAddress(&ip); + quic::test::QuicConnectionPeer::SetSelfAddress(session->connection(), + ToQuicSocketAddress(ip)); + // Cause the connection to report path degrading to the session. // Session will start to probe a different port. session->connection()->OnPathDegradingDetected(); @@ -6584,6 +6615,7 @@ ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); + client_maker_.set_save_packet_frames(true); // Using a testing task runner so that we can control time. // base::RunLoop() controls mocked socket writes and reads. @@ -6609,11 +6641,26 @@ ConstructGetRequestPacket(packet_num++, GetNthClientInitiatedBidirectionalStreamId(0), true, true)); - socket_data1.AddWrite( - SYNCHRONOUS, - ConstructGetRequestPacket( - packet_num++, GetNthClientInitiatedBidirectionalStreamId(1), - GetNthClientInitiatedBidirectionalStreamId(0), true, true)); + if (version_.UsesHttp3()) { + spdy::Http2HeaderBlock headers = + client_maker_.GetRequestHeaders("GET", "https", "/"); + spdy::SpdyPriority priority = + ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY); + size_t spdy_headers_frame_len; + socket_data1.AddWrite( + SYNCHRONOUS, + client_maker_.MakeRetransmissionAndRequestHeadersPacket( + {1, 2}, packet_num++, GetNthClientInitiatedBidirectionalStreamId(1), + true, true, priority, std::move(headers), + GetNthClientInitiatedBidirectionalStreamId(0), + &spdy_headers_frame_len)); + } else { + socket_data1.AddWrite( + SYNCHRONOUS, + ConstructGetRequestPacket( + packet_num++, GetNthClientInitiatedBidirectionalStreamId(1), + GetNthClientInitiatedBidirectionalStreamId(0), true, true)); + } socket_data1.AddRead( ASYNC, ConstructOkResponsePacket( @@ -6789,6 +6836,11 @@ ConstructGetRequestPacket(packet_num++, GetNthClientInitiatedBidirectionalStreamId(0), true, true)); + if (version_.UsesHttp3()) { + quic_data2.AddWrite(SYNCHRONOUS, + client_maker_.MakeCombinedRetransmissionPacket( + {1, 2}, packet_num++, true)); + } quic_data2.AddRead( ASYNC, ConstructOkResponsePacket( @@ -7435,6 +7487,7 @@ ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); + client_maker_.set_save_packet_frames(true); auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>(); @@ -7490,6 +7543,8 @@ 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false)); socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); if (VersionUsesHttp3(version_.transport_version)) { + socket_data1.AddWrite(ASYNC, client_maker_.MakeCombinedRetransmissionPacket( + {1, 2}, packet_num++, false)); socket_data1.AddWrite( SYNCHRONOUS, client_maker_.MakeAckAndDataPacket( packet_num++, false, GetQpackDecoderStreamId(), 1, 1, @@ -7665,6 +7720,7 @@ ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); + client_maker_.set_save_packet_frames(true); MockQuicData socket_data(version_); socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); @@ -7691,6 +7747,8 @@ 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false)); socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); if (VersionUsesHttp3(version_.transport_version)) { + socket_data1.AddWrite(ASYNC, client_maker_.MakeCombinedRetransmissionPacket( + {1, 2}, packet_num++, false)); socket_data1.AddWrite( SYNCHRONOUS, client_maker_.MakeAckAndDataPacket( packet_num++, false, GetQpackDecoderStreamId(), 1, 1, @@ -7823,6 +7881,7 @@ ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); + client_maker_.set_save_packet_frames(true); int packet_number = 1; MockQuicData socket_data(version_); @@ -7846,8 +7905,8 @@ true, true)); if (VersionUsesHttp3(version_.transport_version)) { socket_data1.AddWrite( - SYNCHRONOUS, client_maker_.MakeRstAndDataPacket( - packet_number++, true, + SYNCHRONOUS, client_maker_.MakeRetransmissionRstAndDataPacket( + {1, 2}, packet_number++, true, GetNthClientInitiatedBidirectionalStreamId(1), quic::QUIC_STREAM_CANCELLED, GetQpackDecoderStreamId(), StreamCancellationQpackDecoderInstruction(1))); @@ -7987,6 +8046,7 @@ ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); + client_maker_.set_save_packet_frames(true); int packet_number = 1; MockQuicData socket_data(version_); @@ -8012,8 +8072,8 @@ true, true)); if (VersionUsesHttp3(version_.transport_version)) { socket_data1.AddWrite( - SYNCHRONOUS, client_maker_.MakeRstAndDataPacket( - packet_number++, true, + SYNCHRONOUS, client_maker_.MakeRetransmissionRstAndDataPacket( + {1}, packet_number++, true, GetNthClientInitiatedBidirectionalStreamId(1), quic::QUIC_STREAM_CANCELLED, GetQpackDecoderStreamId(), StreamCancellationQpackDecoderInstruction(1))); @@ -8156,6 +8216,7 @@ {kDefaultNetworkForTests, kNewNetworkForTests}); ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); + client_maker_.set_save_packet_frames(true); MockQuicData failed_socket_data(version_); MockQuicData socket_data(version_); @@ -8184,8 +8245,9 @@ if (VersionUsesHttp3(version_.transport_version)) { socket_data.AddWrite( SYNCHRONOUS, - client_maker_.MakeRstAndDataPacket( - packet_num++, true, GetNthClientInitiatedBidirectionalStreamId(0), + client_maker_.MakeRetransmissionRstAndDataPacket( + {1}, packet_num++, true, + GetNthClientInitiatedBidirectionalStreamId(0), quic::QUIC_STREAM_CANCELLED, GetQpackDecoderStreamId(), StreamCancellationQpackDecoderInstruction(0))); } else { @@ -8375,6 +8437,7 @@ ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); + client_maker_.set_save_packet_frames(true); // Set up the socket data used by the original network, which encounters a // write error. @@ -8418,6 +8481,8 @@ 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false)); socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); if (VersionUsesHttp3(version_.transport_version)) { + socket_data2.AddWrite(ASYNC, client_maker_.MakeCombinedRetransmissionPacket( + {1, 2}, packet_num++, false)); socket_data2.AddWrite( SYNCHRONOUS, client_maker_.MakeAckAndDataPacket( packet_num++, false, GetQpackDecoderStreamId(), 1, 1, @@ -8563,6 +8628,7 @@ ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); + client_maker_.set_save_packet_frames(true); MockQuicData socket_data(version_); socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); @@ -8610,6 +8676,11 @@ ConstructGetRequestPacket(packet_num++, GetNthClientInitiatedBidirectionalStreamId(0), true, true)); + if (version_.UsesHttp3()) { + socket_data1.AddWrite(SYNCHRONOUS, + client_maker_.MakeCombinedRetransmissionPacket( + {1, 2}, packet_num++, true)); + } socket_data1.AddRead( ASYNC, ConstructOkResponsePacket( @@ -8714,6 +8785,7 @@ ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); + client_maker_.set_save_packet_frames(true); MockQuicData socket_data(version_); socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); @@ -8761,6 +8833,11 @@ ConstructGetRequestPacket(packet_num++, GetNthClientInitiatedBidirectionalStreamId(0), true, true)); + if (version_.UsesHttp3()) { + socket_data1.AddWrite(SYNCHRONOUS, + client_maker_.MakeCombinedRetransmissionPacket( + {1, 2}, packet_num++, true)); + } socket_data1.AddRead( ASYNC, ConstructOkResponsePacket( @@ -8868,6 +8945,7 @@ ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); + client_maker_.set_save_packet_frames(true); // Use the test task runner. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get()); @@ -8935,6 +9013,8 @@ 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false)); socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); if (VersionUsesHttp3(version_.transport_version)) { + socket_data1.AddWrite(ASYNC, client_maker_.MakeCombinedRetransmissionPacket( + {1, 2}, packet_num++, false)); socket_data1.AddWrite( SYNCHRONOUS, client_maker_.MakeAckAndDataPacket( packet_num++, false, GetQpackDecoderStreamId(), 1, 1, @@ -9013,6 +9093,7 @@ ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); + client_maker_.set_save_packet_frames(true); // Using a testing task runner so that we can verify whether the migrate on // write error task is posted. @@ -9064,6 +9145,11 @@ // Set up second socket data provider that is used after // migration. The response to the request is read on this new socket. MockQuicData socket_data1(version_); + if (version_.UsesHttp3()) { + socket_data1.AddWrite(SYNCHRONOUS, + client_maker_.MakeCombinedRetransmissionPacket( + {1, 2}, packet_num++, true)); + } socket_data1.AddWrite( SYNCHRONOUS, client_maker_.MakePingPacket(packet_num++, /*include_version=*/true)); @@ -9140,6 +9226,7 @@ ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); + client_maker_.set_save_packet_frames(true); // Using a testing task runner. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>(); @@ -9186,6 +9273,10 @@ // migration. The request is written to this new socket, and the // response to the request is read on this new socket. MockQuicData socket_data1(version_); + if (version_.UsesHttp3()) { + socket_data1.AddWrite(SYNCHRONOUS, client_maker_.MakeRetransmissionPacket( + 1, packet_num++, true)); + } socket_data1.AddWrite( SYNCHRONOUS, client_maker_.MakePingPacket(packet_num++, /*include_version=*/true)); @@ -9272,6 +9363,7 @@ ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); + client_maker_.set_save_packet_frames(true); // Using a testing task runner. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>(); @@ -9318,6 +9410,10 @@ // migration. The request is written to this new socket, and the // response to the request is read on this new socket. MockQuicData socket_data1(version_); + if (version_.UsesHttp3()) { + socket_data1.AddWrite(SYNCHRONOUS, client_maker_.MakeRetransmissionPacket( + 1, packet_num++, true)); + } socket_data1.AddWrite( SYNCHRONOUS, client_maker_.MakePingPacket(packet_num++, /*include_version=*/true)); @@ -9403,6 +9499,7 @@ ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); + client_maker_.set_save_packet_frames(true); // Using a testing task runner. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>(); @@ -9425,6 +9522,11 @@ // migration. The request is written to this new socket, and the // response to the request is read on this new socket. MockQuicData socket_data1(version_); + + if (version_.UsesHttp3()) { + socket_data1.AddWrite(SYNCHRONOUS, client_maker_.MakeRetransmissionPacket( + 1, packet_num++, true)); + } // The PING packet sent post migration. socket_data1.AddWrite(SYNCHRONOUS, client_maker_.MakePingPacket(packet_num++, true)); @@ -9445,7 +9547,8 @@ "Hello World")); // Read an ACK from server which acks all client data. - socket_data1.AddRead(SYNCHRONOUS, server_maker_.MakeAckPacket(3, 3, 1)); + socket_data1.AddRead(SYNCHRONOUS, + server_maker_.MakeAckPacket(3, packet_num, 1)); socket_data1.AddWrite(ASYNC, client_maker_.MakeAckPacket(packet_num++, 2, 1)); // The PING packet sent for retransmittable on wire. socket_data1.AddWrite(SYNCHRONOUS, @@ -9564,6 +9667,7 @@ ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); + client_maker_.set_save_packet_frames(true); // Using a testing task runner. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>(); @@ -9586,6 +9690,10 @@ // migration. The request is written to this new socket, and the // response to the request is read on this new socket. MockQuicData socket_data1(version_); + if (version_.UsesHttp3()) { + socket_data1.AddWrite(SYNCHRONOUS, client_maker_.MakeRetransmissionPacket( + 1, packet_num++, true)); + } // The PING packet sent post migration. socket_data1.AddWrite(SYNCHRONOUS, client_maker_.MakePingPacket(packet_num++, true)); @@ -9605,7 +9713,8 @@ 2, GetNthClientInitiatedBidirectionalStreamId(0), false, false, "Hello World")); // Read an ACK from server which acks all client data. - socket_data1.AddRead(SYNCHRONOUS, server_maker_.MakeAckPacket(3, 3, 1)); + socket_data1.AddRead(SYNCHRONOUS, + server_maker_.MakeAckPacket(3, packet_num, 1)); socket_data1.AddWrite(ASYNC, client_maker_.MakeAckPacket(packet_num++, 2, 1)); // The PING packet sent for retransmittable on wire. socket_data1.AddWrite(SYNCHRONOUS, @@ -10288,6 +10397,7 @@ ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); + client_maker_.set_save_packet_frames(true); // Using a testing task runner. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>(); @@ -10339,6 +10449,10 @@ ConstructGetRequestPacket(packet_num++, GetNthClientInitiatedBidirectionalStreamId(0), true, true)); + if (version_.UsesHttp3()) { + socket_data1.AddWrite(ASYNC, client_maker_.MakeCombinedRetransmissionPacket( + {1, 2}, packet_num++, true)); + } socket_data1.AddRead( ASYNC, ConstructOkResponsePacket( @@ -10441,6 +10555,7 @@ ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); + client_maker_.set_save_packet_frames(true); MockQuicData socket_data(version_); socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); @@ -10511,6 +10626,8 @@ 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false)); socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); if (VersionUsesHttp3(version_.transport_version)) { + socket_data1.AddWrite(ASYNC, client_maker_.MakeCombinedRetransmissionPacket( + {1, 2}, packet_num++, false)); socket_data1.AddWrite( SYNCHRONOUS, client_maker_.MakeAckAndDataPacket( packet_num++, false, GetQpackDecoderStreamId(), 1, 1, @@ -10596,6 +10713,7 @@ {kDefaultNetworkForTests, kNewNetworkForTests}); ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); + client_maker_.set_save_packet_frames(true); // Using a testing task runner and a test tick tock. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>(); @@ -10615,6 +10733,11 @@ // Set up second socket data provider that is used after migration. MockQuicData alternate_socket_data(version_); alternate_socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read. + if (version_.UsesHttp3()) { + alternate_socket_data.AddWrite( + SYNCHRONOUS, + client_maker_.MakeRetransmissionPacket(1, packet_num++, true)); + } // Ping packet to send after migration. alternate_socket_data.AddWrite( SYNCHRONOUS, @@ -10721,6 +10844,7 @@ {kDefaultNetworkForTests, kNewNetworkForTests}); ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); + client_maker_.set_save_packet_frames(true); // Using a testing task runner and a test tick tock. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>(); @@ -10740,6 +10864,11 @@ // Set up second socket data provider that is used after migration. MockQuicData alternate_socket_data(version_); alternate_socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read. + if (version_.UsesHttp3()) { + alternate_socket_data.AddWrite( + SYNCHRONOUS, + client_maker_.MakeRetransmissionPacket(1, packet_num++, true)); + } // Ping packet to send after migration. alternate_socket_data.AddWrite( SYNCHRONOUS, @@ -10839,6 +10968,7 @@ ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); + client_maker_.set_save_packet_frames(true); MockQuicData socket_data1(version_); socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); @@ -10896,6 +11026,11 @@ // migration. The request is rewritten to this new socket, and the // response to the request is read on this new socket. MockQuicData socket_data2(version_); + if (version_.UsesHttp3()) { + socket_data2.AddWrite(SYNCHRONOUS, + client_maker_.MakeCombinedRetransmissionPacket( + {1, 2}, packet_num++, true)); + } socket_data2.AddWrite( SYNCHRONOUS, client_maker_.MakePingPacket(packet_num++, /*include_version=*/true));
diff --git a/net/quic/quic_test_packet_maker.cc b/net/quic/quic_test_packet_maker.cc index 663424f..17c26bf 100644 --- a/net/quic/quic_test_packet_maker.cc +++ b/net/quic/quic_test_packet_maker.cc
@@ -281,6 +281,34 @@ } std::unique_ptr<quic::QuicReceivedPacket> +QuicTestPacketMaker::MakeRetransmissionRstAndDataPacket( + const std::vector<uint64_t>& original_packet_numbers, + uint64_t num, + bool include_version, + quic::QuicStreamId rst_stream_id, + quic::QuicRstStreamErrorCode rst_error_code, + quic::QuicStreamId data_stream_id, + absl::string_view data) { + DCHECK(save_packet_frames_); + InitializeHeader(num, include_version); + + for (auto it : original_packet_numbers) { + for (auto frame : saved_frames_[quic::QuicPacketNumber(it)]) { + frames_.push_back(frame); + } + } + + if (version_.HasIetfQuicFrames()) { + AddQuicStopSendingFrame(rst_stream_id, rst_error_code); + } + AddQuicRstStreamFrame(rst_stream_id, rst_error_code); + + AddQuicStreamFrame(data_stream_id, /* fin = */ false, data); + + return BuildPacket(); +} + +std::unique_ptr<quic::QuicReceivedPacket> QuicTestPacketMaker::MakeDataAndRstPacket( uint64_t num, bool include_version, @@ -443,6 +471,24 @@ } std::unique_ptr<quic::QuicReceivedPacket> +QuicTestPacketMaker::MakeCombinedRetransmissionPacket( + const std::vector<uint64_t>& original_packet_numbers, + uint64_t new_packet_number, + bool should_include_version) { + DCHECK(save_packet_frames_); + InitializeHeader(new_packet_number, should_include_version); + for (auto it : original_packet_numbers) { + for (auto& frame : CloneFrames(saved_frames_[quic::QuicPacketNumber(it)])) { + if (frame.type != quic::PADDING_FRAME) { + frames_.push_back(frame); + } + } + } + + return BuildPacket(); +} + +std::unique_ptr<quic::QuicReceivedPacket> QuicTestPacketMaker::MakeRstAndConnectionClosePacket( uint64_t num, bool include_version, @@ -723,6 +769,52 @@ } std::unique_ptr<quic::QuicReceivedPacket> +QuicTestPacketMaker::MakeRetransmissionAndRequestHeadersPacket( + const std::vector<uint64_t>& original_packet_numbers, + uint64_t packet_number, + quic::QuicStreamId stream_id, + bool should_include_version, + bool fin, + spdy::SpdyPriority priority, + spdy::Http2HeaderBlock headers, + quic::QuicStreamId parent_stream_id, + size_t* spdy_headers_frame_length) { + DCHECK(save_packet_frames_); + InitializeHeader(packet_number, should_include_version); + + for (auto it : original_packet_numbers) { + for (auto frame : saved_frames_[quic::QuicPacketNumber(it)]) { + frames_.push_back(frame); + } + } + + if (quic::VersionUsesHttp3(version_.transport_version)) { + MaybeAddHttp3SettingsFrames(); + + if (priority != quic::QuicStream::kDefaultUrgency) { + std::string priority_data = + GenerateHttp3PriorityData(priority, stream_id); + AddQuicStreamFrame(2, false, priority_data); + } + + std::string data = QpackEncodeHeaders(stream_id, std::move(headers), + spdy_headers_frame_length); + AddQuicStreamFrame(stream_id, fin, data); + + return BuildPacket(); + } + + spdy::SpdySerializedFrame spdy_frame = MakeSpdyHeadersFrame( + stream_id, fin, priority, std::move(headers), parent_stream_id); + if (spdy_headers_frame_length) + *spdy_headers_frame_length = spdy_frame.size(); + AddQuicStreamFrame(GetHeadersStreamId(), false, + absl::string_view(spdy_frame.data(), spdy_frame.size())); + + return BuildPacket(); +} + +std::unique_ptr<quic::QuicReceivedPacket> QuicTestPacketMaker::MakeRequestHeadersAndRstPacket( uint64_t packet_number, quic::QuicStreamId stream_id,
diff --git a/net/quic/quic_test_packet_maker.h b/net/quic/quic_test_packet_maker.h index 5e2f3bdc..d2fce907 100644 --- a/net/quic/quic_test_packet_maker.h +++ b/net/quic/quic_test_packet_maker.h
@@ -107,6 +107,15 @@ quic::QuicStreamId data_stream_id, absl::string_view data); + std::unique_ptr<quic::QuicReceivedPacket> MakeRetransmissionRstAndDataPacket( + const std::vector<uint64_t>& original_packet_numbers, + uint64_t num, + bool include_version, + quic::QuicStreamId rst_stream_id, + quic::QuicRstStreamErrorCode rst_error_code, + quic::QuicStreamId data_stream_id, + absl::string_view data); + std::unique_ptr<quic::QuicReceivedPacket> MakeDataAndRstPacket( uint64_t num, bool include_version, @@ -303,6 +312,18 @@ quic::QuicStreamId parent_stream_id, size_t* spdy_headers_frame_length); + std::unique_ptr<quic::QuicReceivedPacket> + MakeRetransmissionAndRequestHeadersPacket( + const std::vector<uint64_t>& original_packet_numbers, + uint64_t packet_number, + quic::QuicStreamId stream_id, + bool should_include_version, + bool fin, + spdy::SpdyPriority priority, + spdy::Http2HeaderBlock headers, + quic::QuicStreamId parent_stream_id, + size_t* spdy_headers_frame_length); + std::unique_ptr<quic::QuicReceivedPacket> MakeRequestHeadersAndRstPacket( uint64_t packet_number, quic::QuicStreamId stream_id, @@ -374,6 +395,11 @@ uint64_t new_packet_number, bool should_include_version); + std::unique_ptr<quic::QuicReceivedPacket> MakeCombinedRetransmissionPacket( + const std::vector<uint64_t>& original_packet_numbers, + uint64_t new_packet_number, + bool should_include_version); + std::unique_ptr<quic::QuicReceivedPacket> MakeAckAndPriorityUpdatePacket( uint64_t packet_number, bool should_include_version,
diff --git a/net/third_party/mozilla_security_manager/nsPKCS12Blob.cpp b/net/third_party/mozilla_security_manager/nsPKCS12Blob.cpp index b8aad56..16ae514 100644 --- a/net/third_party/mozilla_security_manager/nsPKCS12Blob.cpp +++ b/net/third_party/mozilla_security_manager/nsPKCS12Blob.cpp
@@ -54,10 +54,10 @@ // unicodeToItem // -// For the NSS PKCS#12 library, must convert base::char16s (shorts) to +// For the NSS PKCS#12 library, must convert char16_ts (shorts) to // a buffer of octets. Must handle byte order correctly. // TODO: Is there a Mozilla way to do this? In the string lib? -void unicodeToItem(const base::char16* uni, SECItem* item) { +void unicodeToItem(const char16_t* uni, SECItem* item) { int len = 0; while (uni[len++] != 0); SECITEM_AllocItem(NULL, item, sizeof(PRUnichar) * len);
diff --git a/pdf/out_of_process_instance.cc b/pdf/out_of_process_instance.cc index f113ebbc..d292678 100644 --- a/pdf/out_of_process_instance.cc +++ b/pdf/out_of_process_instance.cc
@@ -1100,8 +1100,8 @@ } std::vector<PDFEngine::Client::SearchStringResult> -OutOfProcessInstance::SearchString(const base::char16* string, - const base::char16* term, +OutOfProcessInstance::SearchString(const char16_t* string, + const char16_t* term, bool case_sensitive) { PP_PrivateFindResult* pp_results; uint32_t count = 0;
diff --git a/pdf/out_of_process_instance.h b/pdf/out_of_process_instance.h index 50d6dda8..fac7aeb 100644 --- a/pdf/out_of_process_instance.h +++ b/pdf/out_of_process_instance.h
@@ -111,8 +111,8 @@ const void* data, int length) override; std::unique_ptr<UrlLoader> CreateUrlLoader() override; - std::vector<SearchStringResult> SearchString(const base::char16* string, - const base::char16* term, + std::vector<SearchStringResult> SearchString(const char16_t* string, + const char16_t* term, bool case_sensitive) override; void DocumentLoadComplete() override; void DocumentLoadFailed() override;
diff --git a/pdf/pdf_engine.h b/pdf/pdf_engine.h index 76f898c..ce696dd 100644 --- a/pdf/pdf_engine.h +++ b/pdf/pdf_engine.h
@@ -222,8 +222,8 @@ int length; }; virtual std::vector<SearchStringResult> SearchString( - const base::char16* string, - const base::char16* term, + const char16_t* string, + const char16_t* term, bool case_sensitive) = 0; // Notifies the client that the document has finished loading.
diff --git a/pdf/pdf_view_web_plugin.cc b/pdf/pdf_view_web_plugin.cc index 1a0fb88..7f1d49e8 100644 --- a/pdf/pdf_view_web_plugin.cc +++ b/pdf/pdf_view_web_plugin.cc
@@ -232,8 +232,8 @@ } std::vector<PDFEngine::Client::SearchStringResult> -PdfViewWebPlugin::SearchString(const base::char16* string, - const base::char16* term, +PdfViewWebPlugin::SearchString(const char16_t* string, + const char16_t* term, bool case_sensitive) { return {}; }
diff --git a/pdf/pdf_view_web_plugin.h b/pdf/pdf_view_web_plugin.h index 79f82a15..359d7e97 100644 --- a/pdf/pdf_view_web_plugin.h +++ b/pdf/pdf_view_web_plugin.h
@@ -71,8 +71,8 @@ const void* data, int length) override; std::unique_ptr<UrlLoader> CreateUrlLoader() override; - std::vector<SearchStringResult> SearchString(const base::char16* string, - const base::char16* term, + std::vector<SearchStringResult> SearchString(const char16_t* string, + const char16_t* term, bool case_sensitive) override; void DocumentLoadComplete() override; void DocumentLoadFailed() override;
diff --git a/pdf/pdfium/findtext_unittest.cc b/pdf/pdfium/findtext_unittest.cc index 818a6f6..6b59ef2 100644 --- a/pdf/pdfium/findtext_unittest.cc +++ b/pdf/pdfium/findtext_unittest.cc
@@ -27,8 +27,8 @@ MOCK_METHOD(void, NotifyNumberOfFindResultsChanged, (int, bool), (override)); MOCK_METHOD(void, NotifySelectedFindResultChanged, (int), (override)); - std::vector<SearchStringResult> SearchString(const base::char16* string, - const base::char16* term, + std::vector<SearchStringResult> SearchString(const char16_t* string, + const char16_t* term, bool case_sensitive) override { EXPECT_TRUE(case_sensitive); base::string16 haystack = base::string16(string);
diff --git a/pdf/pdfium/pdfium_api_string_buffer_adapter.cc b/pdf/pdfium/pdfium_api_string_buffer_adapter.cc index 9e02e349..0eb8a43 100644 --- a/pdf/pdfium/pdfium_api_string_buffer_adapter.cc +++ b/pdf/pdfium/pdfium_api_string_buffer_adapter.cc
@@ -55,8 +55,8 @@ PDFiumAPIStringBufferSizeInBytesAdapter(base::string16* str, size_t expected_size, bool check_expected_size) - : adapter_(str, expected_size / sizeof(base::char16), check_expected_size) { - DCHECK(expected_size % sizeof(base::char16) == 0); + : adapter_(str, expected_size / sizeof(char16_t), check_expected_size) { + DCHECK(expected_size % sizeof(char16_t) == 0); } PDFiumAPIStringBufferSizeInBytesAdapter:: @@ -67,8 +67,8 @@ } void PDFiumAPIStringBufferSizeInBytesAdapter::Close(size_t actual_size) { - DCHECK(actual_size % sizeof(base::char16) == 0); - adapter_.Close(actual_size / sizeof(base::char16)); + DCHECK(actual_size % sizeof(char16_t) == 0); + adapter_.Close(actual_size / sizeof(char16_t)); } // explicit instantiations
diff --git a/pdf/pdfium/pdfium_api_string_buffer_adapter.h b/pdf/pdfium/pdfium_api_string_buffer_adapter.h index 320488b8..e5e3ff5 100644 --- a/pdf/pdfium/pdfium_api_string_buffer_adapter.h +++ b/pdf/pdfium/pdfium_api_string_buffer_adapter.h
@@ -81,11 +81,11 @@ ~PDFiumAPIStringBufferSizeInBytesAdapter(); // Returns a pointer to |str_|'s buffer. The buffer's size is large enough to - // hold |expected_size_| + sizeof(base::char16) bytes, so the PDFium API that + // hold |expected_size_| + sizeof(char16_t) bytes, so the PDFium API that // uses the pointer has space to write a null-terminator. void* GetData(); - // Resizes |str_| to |actual_size| - sizeof(base::char16) bytes, thereby + // Resizes |str_| to |actual_size| - sizeof(char16_t) bytes, thereby // removing the extra null-terminator. This must be called prior to the // adapter's destruction. The pointer returned by GetData() should be // considered invalid.
diff --git a/pdf/pdfium/pdfium_engine.cc b/pdf/pdfium/pdfium_engine.cc index adc0719..69875bd7 100644 --- a/pdf/pdfium/pdfium_engine.cc +++ b/pdf/pdfium/pdfium_engine.cc
@@ -155,10 +155,10 @@ std::vector<HyphenPosition> hyphen_positions; HyphenPosition current_hyphen_position; bool current_hyphen_position_is_valid = false; - constexpr base::char16 kPdfiumHyphenEOL = 0xfffe; + constexpr char16_t kPdfiumHyphenEOL = 0xfffe; for (size_t i = 0; i < text->size(); ++i) { - const base::char16& current_char = (*text)[i]; + const char16_t& current_char = (*text)[i]; if (current_char == kPdfiumHyphenEOL) { if (current_hyphen_position_is_valid) hyphen_positions.push_back(current_hyphen_position); @@ -179,7 +179,7 @@ // With all the hyphen positions, do the search and replace. while (!hyphen_positions.empty()) { - static constexpr base::char16 kCr[] = {L'\r', L'\0'}; + static constexpr char16_t kCr[] = {L'\r', L'\0'}; const HyphenPosition& position = hyphen_positions.back(); if (position.next_whitespace_position != 0) { (*text)[position.next_whitespace_position] = L'\n'; @@ -190,16 +190,16 @@ } // Adobe Reader also get rid of trailing spaces right before a CRLF. - static constexpr base::char16 kSpaceCrCn[] = {L' ', L'\r', L'\n', L'\0'}; - static constexpr base::char16 kCrCn[] = {L'\r', L'\n', L'\0'}; + static constexpr char16_t kSpaceCrCn[] = {L' ', L'\r', L'\n', L'\0'}; + static constexpr char16_t kCrCn[] = {L'\r', L'\n', L'\0'}; base::ReplaceSubstringsAfterOffset(text, 0, kSpaceCrCn, kCrCn); } // Replace CR/LF with just LF on POSIX. void FormatStringForOS(base::string16* text) { #if defined(OS_POSIX) - static constexpr base::char16 kCr[] = {L'\r', L'\0'}; - static constexpr base::char16 kBlank[] = {L'\0'}; + static constexpr char16_t kCr[] = {L'\r', L'\0'}; + static constexpr char16_t kBlank[] = {L'\0'}; base::ReplaceChars(*text, kCr, kBlank, text); #elif defined(OS_WIN) // Do nothing @@ -213,7 +213,7 @@ // For triple clicks, look for line breaks. // The actual algorithm used in Blink is much more complicated, so do a simple // approximation. -bool FindMultipleClickBoundary(bool is_double_click, base::char16 cur) { +bool FindMultipleClickBoundary(bool is_double_click, char16_t cur) { if (!is_double_click) return cur == '\n'; @@ -1213,7 +1213,7 @@ // now it doesn't. int start_index = char_index; do { - base::char16 cur = pages_[page_index]->GetCharAtIndex(start_index); + char16_t cur = pages_[page_index]->GetCharAtIndex(start_index); if (FindMultipleClickBoundary(is_double_click, cur)) break; } while (--start_index >= 0); @@ -1223,7 +1223,7 @@ int end_index = char_index; int total = pages_[page_index]->GetCharCount(); while (end_index++ <= total) { - base::char16 cur = pages_[page_index]->GetCharAtIndex(end_index); + char16_t cur = pages_[page_index]->GetCharAtIndex(end_index); if (FindMultipleClickBoundary(is_double_click, cur)) break; } @@ -1867,7 +1867,7 @@ // Various types of quotions marks need to be converted to the simple ASCII // version for searching to get better matching. base::string16 adjusted_term = term; - for (base::char16& c : adjusted_term) + for (char16_t& c : adjusted_term) c = SimplifyForSearch(c); const int original_text_length = pages_[current_page]->GetCharCount(); @@ -1905,7 +1905,7 @@ // whitespace characters. Calculating where the collapsed regions are after // the fact is as complex as collapsing them manually. for (size_t i = 0; i < page_text.size(); i++) { - base::char16 c = page_text[i]; + char16_t c = page_text[i]; // Collapse whitespace regions by inserting a ' ' into the // adjusted text and recording any removed whitespace indices as preceding // it. @@ -2179,7 +2179,7 @@ base::string16 result; for (size_t i = 0; i < selection_.size(); ++i) { - static constexpr base::char16 kNewLineChar = L'\n'; + static constexpr char16_t kNewLineChar = L'\n'; base::string16 current_selection_text = selection_[i].GetText(); if (i != 0) { if (selection_[i - 1].page_index() > selection_[i].page_index())
diff --git a/pdf/pdfium/pdfium_form_filler.cc b/pdf/pdfium/pdfium_form_filler.cc index b0c57366af..171d842 100644 --- a/pdf/pdfium/pdfium_form_filler.cc +++ b/pdf/pdfium/pdfium_form_filler.cc
@@ -25,7 +25,7 @@ int g_last_timer_id = 0; std::string WideStringToString(FPDF_WIDESTRING wide_string) { - return base::UTF16ToUTF8(reinterpret_cast<const base::char16*>(wide_string)); + return base::UTF16ToUTF8(reinterpret_cast<const char16_t*>(wide_string)); } } // namespace @@ -611,7 +611,7 @@ PDFiumEngine* engine = GetEngine(param); std::string rv = engine->client_->Prompt(question_str, default_str); base::string16 rv_16 = base::UTF8ToUTF16(rv); - int rv_bytes = rv_16.size() * sizeof(base::char16); + int rv_bytes = rv_16.size() * sizeof(char16_t); if (response) { int bytes_to_copy = rv_bytes < length ? rv_bytes : length; memcpy(response, rv_16.c_str(), bytes_to_copy);
diff --git a/pdf/pdfium/pdfium_page.cc b/pdf/pdfium/pdfium_page.cc index b809e44..1f66fcaa 100644 --- a/pdf/pdfium/pdfium_page.cc +++ b/pdf/pdfium/pdfium_page.cc
@@ -847,10 +847,10 @@ } } -base::char16 PDFiumPage::GetCharAtIndex(int index) { +char16_t PDFiumPage::GetCharAtIndex(int index) { if (!available_) return L'\0'; - return static_cast<base::char16>(FPDFText_GetUnicode(GetTextPage(), index)); + return static_cast<char16_t>(FPDFText_GetUnicode(GetTextPage(), index)); } int PDFiumPage::GetCharCount() {
diff --git a/pdf/pdfium/pdfium_page.h b/pdf/pdfium/pdfium_page.h index 41bbd6c4..529e1bb 100644 --- a/pdf/pdfium/pdfium_page.h +++ b/pdf/pdfium/pdfium_page.h
@@ -153,7 +153,7 @@ static Area FormTypeToArea(int form_type); // Gets the character at the given index. - base::char16 GetCharAtIndex(int index); + char16_t GetCharAtIndex(int index); // Gets the number of characters in the page. int GetCharCount();
diff --git a/pdf/pdfium/pdfium_range.cc b/pdf/pdfium/pdfium_range.cc index 437b478b..cbb5a0fe 100644 --- a/pdf/pdfium/pdfium_range.cc +++ b/pdf/pdfium/pdfium_range.cc
@@ -25,7 +25,7 @@ } // namespace -bool IsIgnorableCharacter(base::char16 c) { +bool IsIgnorableCharacter(char16_t c) { return (c == kZeroWidthSpace) || (c == kPDFSoftHyphenMarker); } @@ -111,7 +111,7 @@ api_string_adapter.Close(written); } - base::EraseIf(rv, [](base::char16 c) { return IsIgnorableCharacter(c); }); + base::EraseIf(rv, [](char16_t c) { return IsIgnorableCharacter(c); }); return rv; }
diff --git a/pdf/pdfium/pdfium_range.h b/pdf/pdfium/pdfium_range.h index 75512ec1..d4fbccb 100644 --- a/pdf/pdfium/pdfium_range.h +++ b/pdf/pdfium/pdfium_range.h
@@ -16,13 +16,13 @@ namespace chrome_pdf { -constexpr base::char16 kZeroWidthSpace = 0x200B; -constexpr base::char16 kPDFSoftHyphenMarker = 0xFFFE; +constexpr char16_t kZeroWidthSpace = 0x200B; +constexpr char16_t kPDFSoftHyphenMarker = 0xFFFE; // Helper for identifying characters that PDFium outputs, via FPDFText_GetText, // that have special meaning, but should not be included in things like copied // text or when running find. -bool IsIgnorableCharacter(base::char16 c); +bool IsIgnorableCharacter(char16_t c); // Describes location of a string of characters. class PDFiumRange {
diff --git a/pdf/preview_mode_client.cc b/pdf/preview_mode_client.cc index 36de088c..e8bc9aa 100644 --- a/pdf/preview_mode_client.cc +++ b/pdf/preview_mode_client.cc
@@ -124,8 +124,8 @@ } std::vector<PDFEngine::Client::SearchStringResult> -PreviewModeClient::SearchString(const base::char16* string, - const base::char16* term, +PreviewModeClient::SearchString(const char16_t* string, + const char16_t* term, bool case_sensitive) { NOTREACHED(); return std::vector<SearchStringResult>();
diff --git a/pdf/preview_mode_client.h b/pdf/preview_mode_client.h index 0df963ac..91e6070 100644 --- a/pdf/preview_mode_client.h +++ b/pdf/preview_mode_client.h
@@ -64,8 +64,8 @@ const void* data, int length) override; std::unique_ptr<UrlLoader> CreateUrlLoader() override; - std::vector<SearchStringResult> SearchString(const base::char16* string, - const base::char16* term, + std::vector<SearchStringResult> SearchString(const char16_t* string, + const char16_t* term, bool case_sensitive) override; void DocumentLoadComplete() override; void DocumentLoadFailed() override;
diff --git a/pdf/test/test_client.cc b/pdf/test/test_client.cc index 1c7b87a7..7532f1c 100644 --- a/pdf/test/test_client.cc +++ b/pdf/test/test_client.cc
@@ -44,8 +44,8 @@ } std::vector<PDFEngine::Client::SearchStringResult> TestClient::SearchString( - const base::char16* string, - const base::char16* term, + const char16_t* string, + const char16_t* term, bool case_sensitive) { return std::vector<SearchStringResult>(); }
diff --git a/pdf/test/test_client.h b/pdf/test/test_client.h index 65b4265..d0d45766 100644 --- a/pdf/test/test_client.h +++ b/pdf/test/test_client.h
@@ -32,8 +32,8 @@ const std::string& default_answer) override; std::string GetURL() override; std::unique_ptr<UrlLoader> CreateUrlLoader() override; - std::vector<SearchStringResult> SearchString(const base::char16* string, - const base::char16* term, + std::vector<SearchStringResult> SearchString(const char16_t* string, + const char16_t* term, bool case_sensitive) override; pp::Instance* GetPluginInstance() override; bool IsPrintPreview() override;
diff --git a/remoting/host/keyboard_layout_monitor_mac.cc b/remoting/host/keyboard_layout_monitor_mac.cc index 71bec35..cd9913b 100644 --- a/remoting/host/keyboard_layout_monitor_mac.cc +++ b/remoting/host/keyboard_layout_monitor_mac.cc
@@ -205,8 +205,7 @@ key_actions[shift_level].set_character( base::UTF16ToUTF8(base::StringPiece16( - reinterpret_cast<const base::char16*>(result_array), - result_length))); + reinterpret_cast<const char16_t*>(result_array), result_length))); } if (key_actions.size() == 0) {
diff --git a/services/device/hid/hid_device_info.cc b/services/device/hid/hid_device_info.cc index 1b88096..4490b44 100644 --- a/services/device/hid/hid_device_info.cc +++ b/services/device/hid/hid_device_info.cc
@@ -33,7 +33,7 @@ const std::string& product_name, const std::string& serial_number, mojom::HidBusType bus_type, - const std::vector<uint8_t> report_descriptor, + base::span<const uint8_t> report_descriptor, std::string device_node) { std::vector<mojom::HidCollectionInfoPtr> collections; bool has_report_id; @@ -66,7 +66,8 @@ device_ = mojom::HidDeviceInfo::New( base::GenerateGUID(), physical_device_id, vendor_id, product_id, - product_name, serial_number, bus_type, report_descriptor, + product_name, serial_number, bus_type, + std::vector<uint8_t>(report_descriptor.begin(), report_descriptor.end()), std::move(collections), has_report_id, max_input_report_size, max_output_report_size, max_feature_report_size, device_node, protected_input_report_ids, protected_output_report_ids,
diff --git a/services/device/hid/hid_device_info.h b/services/device/hid/hid_device_info.h index e5ae5a0..464df94 100644 --- a/services/device/hid/hid_device_info.h +++ b/services/device/hid/hid_device_info.h
@@ -12,7 +12,7 @@ #include <vector> #include "base/containers/flat_set.h" -#include "base/macros.h" +#include "base/containers/span.h" #include "base/memory/ref_counted.h" #include "base/strings/string16.h" #include "build/build_config.h" @@ -51,9 +51,8 @@ const std::string& product_name, const std::string& serial_number, mojom::HidBusType bus_type, - const std::vector<uint8_t> report_descriptor, + base::span<const uint8_t> report_descriptor, std::string device_node = ""); - HidDeviceInfo(PlatformDeviceIdMap platform_device_id_map, const std::string& physical_device_id, uint16_t vendor_id, @@ -65,6 +64,8 @@ size_t max_input_report_size, size_t max_output_report_size, size_t max_feature_report_size); + HidDeviceInfo(const HidDeviceInfo& entry) = delete; + HidDeviceInfo& operator=(const HidDeviceInfo& entry) = delete; const mojom::HidDeviceInfoPtr& device() { return device_; } @@ -111,8 +112,6 @@ PlatformDeviceIdMap platform_device_id_map_; mojom::HidDeviceInfoPtr device_; - - DISALLOW_COPY_AND_ASSIGN(HidDeviceInfo); }; } // namespace device
diff --git a/services/device/hid/hid_service_win.cc b/services/device/hid/hid_service_win.cc index 0584ae9..f7d6651 100644 --- a/services/device/hid/hid_service_win.cc +++ b/services/device/hid/hid_service_win.cc
@@ -699,7 +699,7 @@ // 1023 characters plus NULL terminator is more than enough for a USB // string descriptor which is limited to 126 characters. - base::char16 buffer[1024]; + char16_t buffer[1024]; if (HidD_GetProductString(device_handle.Get(), &buffer[0], sizeof(buffer))) { // NULL termination guaranteed by the API.
diff --git a/services/device/hid/test_report_descriptors.cc b/services/device/hid/test_report_descriptors.cc index 0234145..6e515751 100644 --- a/services/device/hid/test_report_descriptors.cc +++ b/services/device/hid/test_report_descriptors.cc
@@ -4,1966 +4,2014 @@ #include "services/device/hid/test_report_descriptors.h" -#include "base/stl_util.h" - namespace device { -// Digitizer descriptor from HID descriptor tool -// http://www.usb.org/developers/hidpage/dt2_4.zip -const uint8_t kDigitizer[] = { - 0x05, 0x0d, // Usage Page (Digitizer) - 0x09, 0x01, // Usage (0x1) - 0xa1, 0x01, // Collection (Application) - 0x85, 0x01, // Report ID (0x1) - 0x09, 0x21, // Usage (0x21) - 0xa1, 0x00, // Collection (Physical) - 0x05, 0x01, // Usage Page (Generic Desktop) - 0x09, 0x30, // Usage (0x30) - 0x09, 0x31, // Usage (0x31) - 0x75, 0x10, // Report Size (16) - 0x95, 0x02, // Report Count (2) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xe0, 0x2e, // Logical Maximum (12000) - 0x35, 0x00, // Physical Minimum (0) - 0x45, 0x0c, // Physical Maximum (12) - 0x65, 0x13, // Unit (Inch) - 0x55, 0x00, // Unit Exponent (0) - 0xa4, // Push - 0x81, 0x02, // Input (Dat|Var|Abs|NoWrp|Lin|Prf|NoNull|BitF) - 0x05, 0x0d, // Usage Page (Digitizer) - 0x09, 0x32, // Usage (0x32) - 0x09, 0x44, // Usage (0x44) - 0x09, 0x42, // Usage (0x42) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x01, // Logical Maximum (1) - 0x35, 0x00, // Physical Minimum (0) - 0x45, 0x01, // Physical Maximum (1) - 0x75, 0x01, // Report Size (1) - 0x95, 0x03, // Report Count (3) - 0x65, 0x00, // Unit (0) - 0x81, 0x02, // Input (Dat|Var|Abs|NoWrp|Lin|Prf|NoNull|BitF) - 0x95, 0x01, // Report Count (1) - 0x75, 0x05, // Report Size (5) - 0x81, 0x03, // Input (Con|Var|Abs|NoWrp|Lin|Prf|NoNull|BitF) - 0xc0, // End Collection - 0x85, 0x02, // Report ID (0x2) - 0x09, 0x20, // Usage (0x20) - 0xa1, 0x00, // Collection (Physical) - 0xb4, // Pop - 0xa4, // Push - 0x09, 0x30, // Usage (0x30) - 0x09, 0x31, // Usage (0x31) - 0x81, 0x02, // Input (Dat|Var|Abs|NoWrp|Lin|Prf|NoNull|BitF) - 0x05, 0x0d, // Usage Page (Digitizer) - 0x09, 0x32, // Usage (0x32) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x01, // Logical Maximum (1) - 0x35, 0x00, // Physical Minimum (0) - 0x45, 0x01, // Physical Maximum (1) - 0x65, 0x00, // Unit (0) - 0x75, 0x01, // Report Size (1) - 0x81, 0x02, // Input (Dat|Var|Abs|NoWrp|Lin|Prf|NoNull|BitF) - 0x05, 0x09, // Usage Page (Button) - 0x19, 0x00, // Usage Minimum (0) - 0x29, 0x10, // Usage Maximum (16) - 0x25, 0x10, // Logical Maximum (16) - 0x75, 0x05, // Report Size (5) - 0x81, 0x40, // Input (Dat|Arr|Abs|NoWrp|Lin|Prf|Null|BitF) - 0x75, 0x02, // Report Size (2) - 0x81, 0x01, // Input (Con|Arr|Abs|NoWrp|Lin|Prf|NoNull|BitF) - 0xc0, // End Collection - 0x85, 0x03, // Report ID (0x3) - 0x05, 0x0d, // Usage Page (Digitizer) - 0x09, 0x20, // Usage (0x20) - 0xa1, 0x00, // Collection (Physical) - 0xb4, // Pop - 0x09, 0x30, // Usage (0x30) - 0x09, 0x31, // Usage (0x31) - 0x81, 0x02, // Input (Dat|Var|Abs|NoWrp|Lin|Prf|NoNull|BitF) - 0x05, 0x0d, // Usage Page (Digitizer) - 0x09, 0x32, // Usage (0x32) - 0x09, 0x44, // Usage (0x44) - 0x75, 0x01, // Report Size (1) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x01, // Logical Maximum (1) - 0x35, 0x00, // Physical Minimum (0) - 0x45, 0x01, // Physical Maximum (1) - 0x65, 0x00, // Unit (0) - 0x81, 0x02, // Input (Dat|Var|Abs|NoWrp|Lin|Prf|NoNull|BitF) - 0x95, 0x06, // Report Count (6) - 0x81, 0x03, // Input (Con|Var|Abs|NoWrp|Lin|Prf|NoNull|BitF) - 0x09, 0x30, // Usage (0x30) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x7f, // Logical Maximum (127) - 0x35, 0x00, // Physical Minimum (0) - 0x45, 0x2d, // Physical Maximum (45) - 0x67, 0x11, 0xe1, // Unit (Newtons) - 0x00, 0x00, // Default - 0x55, 0x04, // Unit Exponent (4) - 0x75, 0x08, // Report Size (8) - 0x95, 0x01, // Report Count (1) - 0x81, 0x12, // Input (Dat|Var|Abs|NoWrp|NoLin|Prf|NoNull|BitF) - 0xc0, // End Collection - 0xc0 // End Collection -}; -const size_t kDigitizerSize = base::size(kDigitizer); +// static +base::span<const uint8_t> TestReportDescriptors::Digitizer() { + // Digitizer descriptor from HID descriptor tool + // http://www.usb.org/developers/hidpage/dt2_4.zip + constexpr uint8_t kDigitizer[] = { + 0x05, 0x0d, // Usage Page (Digitizer) + 0x09, 0x01, // Usage (0x1) + 0xa1, 0x01, // Collection (Application) + 0x85, 0x01, // Report ID (0x1) + 0x09, 0x21, // Usage (0x21) + 0xa1, 0x00, // Collection (Physical) + 0x05, 0x01, // Usage Page (Generic Desktop) + 0x09, 0x30, // Usage (0x30) + 0x09, 0x31, // Usage (0x31) + 0x75, 0x10, // Report Size (16) + 0x95, 0x02, // Report Count (2) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xe0, 0x2e, // Logical Maximum (12000) + 0x35, 0x00, // Physical Minimum (0) + 0x45, 0x0c, // Physical Maximum (12) + 0x65, 0x13, // Unit (Inch) + 0x55, 0x00, // Unit Exponent (0) + 0xa4, // Push + 0x81, 0x02, // Input (Dat|Var|Abs|NoWrp|Lin|Prf|NoNull|BitF) + 0x05, 0x0d, // Usage Page (Digitizer) + 0x09, 0x32, // Usage (0x32) + 0x09, 0x44, // Usage (0x44) + 0x09, 0x42, // Usage (0x42) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x35, 0x00, // Physical Minimum (0) + 0x45, 0x01, // Physical Maximum (1) + 0x75, 0x01, // Report Size (1) + 0x95, 0x03, // Report Count (3) + 0x65, 0x00, // Unit (0) + 0x81, 0x02, // Input (Dat|Var|Abs|NoWrp|Lin|Prf|NoNull|BitF) + 0x95, 0x01, // Report Count (1) + 0x75, 0x05, // Report Size (5) + 0x81, 0x03, // Input (Con|Var|Abs|NoWrp|Lin|Prf|NoNull|BitF) + 0xc0, // End Collection + 0x85, 0x02, // Report ID (0x2) + 0x09, 0x20, // Usage (0x20) + 0xa1, 0x00, // Collection (Physical) + 0xb4, // Pop + 0xa4, // Push + 0x09, 0x30, // Usage (0x30) + 0x09, 0x31, // Usage (0x31) + 0x81, 0x02, // Input (Dat|Var|Abs|NoWrp|Lin|Prf|NoNull|BitF) + 0x05, 0x0d, // Usage Page (Digitizer) + 0x09, 0x32, // Usage (0x32) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x35, 0x00, // Physical Minimum (0) + 0x45, 0x01, // Physical Maximum (1) + 0x65, 0x00, // Unit (0) + 0x75, 0x01, // Report Size (1) + 0x81, 0x02, // Input (Dat|Var|Abs|NoWrp|Lin|Prf|NoNull|BitF) + 0x05, 0x09, // Usage Page (Button) + 0x19, 0x00, // Usage Minimum (0) + 0x29, 0x10, // Usage Maximum (16) + 0x25, 0x10, // Logical Maximum (16) + 0x75, 0x05, // Report Size (5) + 0x81, 0x40, // Input (Dat|Arr|Abs|NoWrp|Lin|Prf|Null|BitF) + 0x75, 0x02, // Report Size (2) + 0x81, 0x01, // Input (Con|Arr|Abs|NoWrp|Lin|Prf|NoNull|BitF) + 0xc0, // End Collection + 0x85, 0x03, // Report ID (0x3) + 0x05, 0x0d, // Usage Page (Digitizer) + 0x09, 0x20, // Usage (0x20) + 0xa1, 0x00, // Collection (Physical) + 0xb4, // Pop + 0x09, 0x30, // Usage (0x30) + 0x09, 0x31, // Usage (0x31) + 0x81, 0x02, // Input (Dat|Var|Abs|NoWrp|Lin|Prf|NoNull|BitF) + 0x05, 0x0d, // Usage Page (Digitizer) + 0x09, 0x32, // Usage (0x32) + 0x09, 0x44, // Usage (0x44) + 0x75, 0x01, // Report Size (1) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x35, 0x00, // Physical Minimum (0) + 0x45, 0x01, // Physical Maximum (1) + 0x65, 0x00, // Unit (0) + 0x81, 0x02, // Input (Dat|Var|Abs|NoWrp|Lin|Prf|NoNull|BitF) + 0x95, 0x06, // Report Count (6) + 0x81, 0x03, // Input (Con|Var|Abs|NoWrp|Lin|Prf|NoNull|BitF) + 0x09, 0x30, // Usage (0x30) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x7f, // Logical Maximum (127) + 0x35, 0x00, // Physical Minimum (0) + 0x45, 0x2d, // Physical Maximum (45) + 0x67, 0x11, 0xe1, // Unit (Newtons) + 0x00, 0x00, // Default + 0x55, 0x04, // Unit Exponent (4) + 0x75, 0x08, // Report Size (8) + 0x95, 0x01, // Report Count (1) + 0x81, 0x12, // Input (Dat|Var|Abs|NoWrp|NoLin|Prf|NoNull|BitF) + 0xc0, // End Collection + 0xc0 // End Collection + }; + return base::make_span(kDigitizer); +} -// Keyboard descriptor from HID descriptor tool -// http://www.usb.org/developers/hidpage/dt2_4.zip -const uint8_t kKeyboard[] = { - 0x05, 0x01, // Usage Page (Generic Desktop) - 0x09, 0x06, // Usage (0x6) - 0xa1, 0x01, // Collection (Application) - 0x05, 0x07, // Usage Page (Keyboard) - 0x19, 0xe0, // Usage Minimum (224) - 0x29, 0xe7, // Usage Maximum (231) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x01, // Logical Maximum (1) - 0x75, 0x01, // Report Size (1) - 0x95, 0x08, // Report Count (8) - 0x81, 0x02, // Input (Dat|Var|Abs|NoWrp|Lin|Prf|NoNull|BitF) - 0x95, 0x01, // Report Count (1) - 0x75, 0x08, // Report Size (8) - 0x81, 0x03, // Input (Con|Var|Abs|NoWrp|Lin|Prf|NoNull|BitF) - 0x95, 0x05, // Report Count (5) - 0x75, 0x01, // Report Size (1) - 0x05, 0x08, // Usage Page (Led) - 0x19, 0x01, // Usage Minimum (1) - 0x29, 0x05, // Usage Maximum (5) - 0x91, 0x02, // Output (Dat|Var|Abs|NoWrp|Lin|Prf|NoNull|BitF) - 0x95, 0x01, // Report Count (1) - 0x75, 0x03, // Report Size (3) - 0x91, 0x03, // Output (Con|Var|Abs|NoWrp|Lin|Prf|NoNull|BitF) - 0x95, 0x06, // Report Count (6) - 0x75, 0x08, // Report Size (8) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x65, // Logical Maximum (101) - 0x05, 0x07, // Usage Page (Keyboard) - 0x19, 0x00, // Usage Minimum (0) - 0x29, 0x65, // Usage Maximum (101) - 0x81, 0x00, // Input (Dat|Arr|Abs|NoWrp|Lin|Prf|NoNull|BitF) - 0xc0 // End Collection -}; -const size_t kKeyboardSize = base::size(kKeyboard); +// static +base::span<const uint8_t> TestReportDescriptors::Keyboard() { + // Keyboard descriptor from HID descriptor tool + // http://www.usb.org/developers/hidpage/dt2_4.zip + constexpr uint8_t kKeyboard[] = { + 0x05, 0x01, // Usage Page (Generic Desktop) + 0x09, 0x06, // Usage (0x6) + 0xa1, 0x01, // Collection (Application) + 0x05, 0x07, // Usage Page (Keyboard) + 0x19, 0xe0, // Usage Minimum (224) + 0x29, 0xe7, // Usage Maximum (231) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x75, 0x01, // Report Size (1) + 0x95, 0x08, // Report Count (8) + 0x81, 0x02, // Input (Dat|Var|Abs|NoWrp|Lin|Prf|NoNull|BitF) + 0x95, 0x01, // Report Count (1) + 0x75, 0x08, // Report Size (8) + 0x81, 0x03, // Input (Con|Var|Abs|NoWrp|Lin|Prf|NoNull|BitF) + 0x95, 0x05, // Report Count (5) + 0x75, 0x01, // Report Size (1) + 0x05, 0x08, // Usage Page (Led) + 0x19, 0x01, // Usage Minimum (1) + 0x29, 0x05, // Usage Maximum (5) + 0x91, 0x02, // Output (Dat|Var|Abs|NoWrp|Lin|Prf|NoNull|BitF) + 0x95, 0x01, // Report Count (1) + 0x75, 0x03, // Report Size (3) + 0x91, 0x03, // Output (Con|Var|Abs|NoWrp|Lin|Prf|NoNull|BitF) + 0x95, 0x06, // Report Count (6) + 0x75, 0x08, // Report Size (8) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x65, // Logical Maximum (101) + 0x05, 0x07, // Usage Page (Keyboard) + 0x19, 0x00, // Usage Minimum (0) + 0x29, 0x65, // Usage Maximum (101) + 0x81, 0x00, // Input (Dat|Arr|Abs|NoWrp|Lin|Prf|NoNull|BitF) + 0xc0 // End Collection + }; + return base::make_span(kKeyboard); +} -// Monitor descriptor from HID descriptor tool -// http://www.usb.org/developers/hidpage/dt2_4.zip -const uint8_t kMonitor[] = { - 0x05, 0x80, // Usage Page (Monitor 0) - 0x09, 0x01, // Usage (0x1) - 0xa1, 0x01, // Collection (Application) - 0x85, 0x01, // Report ID (0x1) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xff, 0x00, // Logical Maximum (255) - 0x75, 0x08, // Report Size (8) - 0x95, 0x80, // Report Count (128) - 0x09, 0x02, // Usage (0x2) - 0xb2, 0x02, 0x01, // Feature (Dat|Var|Abs|NoWrp|Lin|Prf|NoNull|Buff) - 0x85, 0x02, // Report ID (0x2) - 0x95, 0xf3, // Report Count (243) - 0x09, 0x03, // Usage (0x3) - 0xb2, 0x02, 0x01, // Feature (Dat|Var|Abs|NoWrp|Lin|Prf|NoNull|Buff) - 0x85, 0x03, // Report ID (0x3) - 0x05, 0x82, // Usage Page (Monitor 2) - 0x67, 0xE1, 0x00, // Unit (System: SI, Lum. Intensity: Candela) - 0x00, 0x01, // ... continuation - 0x55, 0x0E, // Unit Exponent (-2) - 0x95, 0x01, // Report Count (1) - 0x75, 0x10, // Report Size (16) - 0x26, 0xc8, 0x00, // Logical Maximum (200) - 0x09, 0x10, // Usage (0x10) - 0xb1, 0x02, // Feature (Dat|Var|Abs|NoWrp|Lin|Prf|NoNull|BitF) - 0x85, 0x04, // Report ID (0x4) - 0x25, 0x64, // Logical Maximum (100) - 0x09, 0x12, // Usage (0x12) - 0xb1, 0x02, // Feature (Dat|Var|Abs|NoWrp|Lin|Prf|NoNull|BitF) - 0x95, 0x06, // Report Count (6) - 0x26, 0xff, 0x00, // Logical Maximum (255) - 0x09, 0x16, // Usage (0x16) - 0x09, 0x18, // Usage (0x18) - 0x09, 0x1a, // Usage (0x1A) - 0x09, 0x6c, // Usage (0x6C) - 0x09, 0x6e, // Usage (0x6E) - 0x09, 0x70, // Usage (0x70) - 0xb1, 0x02, // Feature (Dat|Var|Abs|NoWrp|Lin|Prf|NoNull|BitF) - 0x85, 0x05, // Report ID (0x5) - 0x25, 0x7f, // Logical Maximum (127) - 0x09, 0x20, // Usage (0x20) - 0x09, 0x22, // Usage (0x22) - 0x09, 0x30, // Usage (0x30) - 0x09, 0x32, // Usage (0x32) - 0x09, 0x42, // Usage (0x42) - 0x09, 0x44, // Usage (0x44) - 0xb1, 0x02, // Feature (Dat|Var|Abs|NoWrp|Lin|Prf|NoNull|BitF) - 0xc0 // End Collection -}; -const size_t kMonitorSize = base::size(kMonitor); +// static +base::span<const uint8_t> TestReportDescriptors::Monitor() { + // Monitor descriptor from HID descriptor tool + // http://www.usb.org/developers/hidpage/dt2_4.zip + constexpr uint8_t kMonitor[] = { + 0x05, 0x80, // Usage Page (Monitor 0) + 0x09, 0x01, // Usage (0x1) + 0xa1, 0x01, // Collection (Application) + 0x85, 0x01, // Report ID (0x1) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xff, 0x00, // Logical Maximum (255) + 0x75, 0x08, // Report Size (8) + 0x95, 0x80, // Report Count (128) + 0x09, 0x02, // Usage (0x2) + 0xb2, 0x02, 0x01, // Feature (Dat|Var|Abs|NoWrp|Lin|Prf|NoNull|Buff) + 0x85, 0x02, // Report ID (0x2) + 0x95, 0xf3, // Report Count (243) + 0x09, 0x03, // Usage (0x3) + 0xb2, 0x02, 0x01, // Feature (Dat|Var|Abs|NoWrp|Lin|Prf|NoNull|Buff) + 0x85, 0x03, // Report ID (0x3) + 0x05, 0x82, // Usage Page (Monitor 2) + 0x67, 0xE1, 0x00, // Unit (System: SI, Lum. Intensity: Candela) + 0x00, 0x01, // ... continuation + 0x55, 0x0E, // Unit Exponent (-2) + 0x95, 0x01, // Report Count (1) + 0x75, 0x10, // Report Size (16) + 0x26, 0xc8, 0x00, // Logical Maximum (200) + 0x09, 0x10, // Usage (0x10) + 0xb1, 0x02, // Feature (Dat|Var|Abs|NoWrp|Lin|Prf|NoNull|BitF) + 0x85, 0x04, // Report ID (0x4) + 0x25, 0x64, // Logical Maximum (100) + 0x09, 0x12, // Usage (0x12) + 0xb1, 0x02, // Feature (Dat|Var|Abs|NoWrp|Lin|Prf|NoNull|BitF) + 0x95, 0x06, // Report Count (6) + 0x26, 0xff, 0x00, // Logical Maximum (255) + 0x09, 0x16, // Usage (0x16) + 0x09, 0x18, // Usage (0x18) + 0x09, 0x1a, // Usage (0x1A) + 0x09, 0x6c, // Usage (0x6C) + 0x09, 0x6e, // Usage (0x6E) + 0x09, 0x70, // Usage (0x70) + 0xb1, 0x02, // Feature (Dat|Var|Abs|NoWrp|Lin|Prf|NoNull|BitF) + 0x85, 0x05, // Report ID (0x5) + 0x25, 0x7f, // Logical Maximum (127) + 0x09, 0x20, // Usage (0x20) + 0x09, 0x22, // Usage (0x22) + 0x09, 0x30, // Usage (0x30) + 0x09, 0x32, // Usage (0x32) + 0x09, 0x42, // Usage (0x42) + 0x09, 0x44, // Usage (0x44) + 0xb1, 0x02, // Feature (Dat|Var|Abs|NoWrp|Lin|Prf|NoNull|BitF) + 0xc0 // End Collection + }; + return base::make_span(kMonitor); +} -// Mouse descriptor from HID descriptor tool -// http://www.usb.org/developers/hidpage/dt2_4.zip -const uint8_t kMouse[] = { - 0x05, 0x01, // Usage Page (Generic Desktop) - 0x09, 0x02, // Usage (0x2) - 0xa1, 0x01, // Collection (Application) - 0x09, 0x01, // Usage (0x1) - 0xa1, 0x00, // Collection (Physical) - 0x05, 0x09, // Usage Page (Button) - 0x19, 0x01, // Usage Minimum (1) - 0x29, 0x03, // Usage Maximum (3) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x01, // Logical Maximum (1) - 0x95, 0x03, // Report Count (3) - 0x75, 0x01, // Report Size (1) - 0x81, 0x02, // Input (Dat|Var|Abs|NoWrp|Lin|Prf|NoNull|BitF) - 0x95, 0x01, // Report Count (1) - 0x75, 0x05, // Report Size (5) - 0x81, 0x03, // Input (Con|Var|Abs|NoWrp|Lin|Prf|NoNull|BitF) - 0x05, 0x01, // Usage Page (Generic Desktop) - 0x09, 0x30, // Usage (0x30) - 0x09, 0x31, // Usage (0x31) - 0x15, 0x81, // Logical Minimum (129) - 0x25, 0x7f, // Logical Maximum (127) - 0x75, 0x08, // Report Size (8) - 0x95, 0x02, // Report Count (2) - 0x81, 0x06, // Input (Dat|Var|Rel|NoWrp|Lin|Prf|NoNull|BitF) - 0xc0, // End Collection - 0xc0 // End Collection -}; -const size_t kMouseSize = base::size(kMouse); +// static +base::span<const uint8_t> TestReportDescriptors::Mouse() { + // Mouse descriptor from HID descriptor tool + // http://www.usb.org/developers/hidpage/dt2_4.zip + constexpr uint8_t kMouse[] = { + 0x05, 0x01, // Usage Page (Generic Desktop) + 0x09, 0x02, // Usage (0x2) + 0xa1, 0x01, // Collection (Application) + 0x09, 0x01, // Usage (0x1) + 0xa1, 0x00, // Collection (Physical) + 0x05, 0x09, // Usage Page (Button) + 0x19, 0x01, // Usage Minimum (1) + 0x29, 0x03, // Usage Maximum (3) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x95, 0x03, // Report Count (3) + 0x75, 0x01, // Report Size (1) + 0x81, 0x02, // Input (Dat|Var|Abs|NoWrp|Lin|Prf|NoNull|BitF) + 0x95, 0x01, // Report Count (1) + 0x75, 0x05, // Report Size (5) + 0x81, 0x03, // Input (Con|Var|Abs|NoWrp|Lin|Prf|NoNull|BitF) + 0x05, 0x01, // Usage Page (Generic Desktop) + 0x09, 0x30, // Usage (0x30) + 0x09, 0x31, // Usage (0x31) + 0x15, 0x81, // Logical Minimum (129) + 0x25, 0x7f, // Logical Maximum (127) + 0x75, 0x08, // Report Size (8) + 0x95, 0x02, // Report Count (2) + 0x81, 0x06, // Input (Dat|Var|Rel|NoWrp|Lin|Prf|NoNull|BitF) + 0xc0, // End Collection + 0xc0 // End Collection + }; + return base::make_span(kMouse); +} -// Logitech Unifying receiver descriptor -const uint8_t kLogitechUnifyingReceiver[] = { - 0x06, 0x00, 0xFF, // Usage Page (Vendor) - 0x09, 0x01, // Usage (0x1) - 0xA1, 0x01, // Collection (Application) - 0x85, 0x10, // Report ID (0x10) - 0x75, 0x08, // Report Size (8) - 0x95, 0x06, // Report Count (6) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x09, 0x01, // Usage (0x1) - 0x81, 0x00, // Input (Dat|Arr|Abs|NoWrp|Lin|Prf|NoNull|BitF) - 0x09, 0x01, // Usage (0x1) - 0x91, 0x00, // Output (Dat|Arr|Abs|NoWrp|Lin|Prf|NoNull|BitF) - 0xC0, // End Collection - 0x06, 0x00, 0xFF, // Usage Page (Vendor) - 0x09, 0x02, // Usage (0x2) - 0xA1, 0x01, // Collection (Application) - 0x85, 0x11, // Report ID (0x11) - 0x75, 0x08, // Report Size (8) - 0x95, 0x13, // Report Count (19) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x09, 0x02, // Usage (0x2) - 0x81, 0x00, // Input (Dat|Arr|Abs|NoWrp|Lin|Prf|NoNull|BitF) - 0x09, 0x02, // Usage (0x2) - 0x91, 0x00, // Output (Dat|Arr|Abs|NoWrp|Lin|Prf|NoNull|BitF) - 0xC0, // End Collection - 0x06, 0x00, 0xFF, // Usage Page (Vendor) - 0x09, 0x04, // Usage (0x4) - 0xA1, 0x01, // Collection (Application) - 0x85, 0x20, // Report ID (0x20) - 0x75, 0x08, // Report Size (8) - 0x95, 0x0E, // Report Count (14) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x09, 0x41, // Usage (0x41) - 0x81, 0x00, // Input (Dat|Arr|Abs|NoWrp|Lin|Prf|NoNull|BitF) - 0x09, 0x41, // Usage (0x41) - 0x91, 0x00, // Output (Dat|Arr|Abs|NoWrp|Lin|Prf|NoNull|BitF) - 0x85, 0x21, // Report ID (0x21) - 0x95, 0x1F, // Report Count (31) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x09, 0x42, // Usage (0x42) - 0x81, 0x00, // Input (Dat|Arr|Abs|NoWrp|Lin|Prf|NoNull|BitF) - 0x09, 0x42, // Usage (0x42) - 0x91, 0x00, // Output (Dat|Arr|Abs|NoWrp|Lin|Prf|NoNull|BitF) - 0xC0 // End Collection -}; -const size_t kLogitechUnifyingReceiverSize = - base::size(kLogitechUnifyingReceiver); +// static +base::span<const uint8_t> TestReportDescriptors::LogitechUnifyingReceiver() { + // Logitech Unifying receiver descriptor + constexpr uint8_t kLogitechUnifyingReceiver[] = { + 0x06, 0x00, 0xFF, // Usage Page (Vendor) + 0x09, 0x01, // Usage (0x1) + 0xA1, 0x01, // Collection (Application) + 0x85, 0x10, // Report ID (0x10) + 0x75, 0x08, // Report Size (8) + 0x95, 0x06, // Report Count (6) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x09, 0x01, // Usage (0x1) + 0x81, 0x00, // Input (Dat|Arr|Abs|NoWrp|Lin|Prf|NoNull|BitF) + 0x09, 0x01, // Usage (0x1) + 0x91, 0x00, // Output (Dat|Arr|Abs|NoWrp|Lin|Prf|NoNull|BitF) + 0xC0, // End Collection + 0x06, 0x00, 0xFF, // Usage Page (Vendor) + 0x09, 0x02, // Usage (0x2) + 0xA1, 0x01, // Collection (Application) + 0x85, 0x11, // Report ID (0x11) + 0x75, 0x08, // Report Size (8) + 0x95, 0x13, // Report Count (19) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x09, 0x02, // Usage (0x2) + 0x81, 0x00, // Input (Dat|Arr|Abs|NoWrp|Lin|Prf|NoNull|BitF) + 0x09, 0x02, // Usage (0x2) + 0x91, 0x00, // Output (Dat|Arr|Abs|NoWrp|Lin|Prf|NoNull|BitF) + 0xC0, // End Collection + 0x06, 0x00, 0xFF, // Usage Page (Vendor) + 0x09, 0x04, // Usage (0x4) + 0xA1, 0x01, // Collection (Application) + 0x85, 0x20, // Report ID (0x20) + 0x75, 0x08, // Report Size (8) + 0x95, 0x0E, // Report Count (14) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x09, 0x41, // Usage (0x41) + 0x81, 0x00, // Input (Dat|Arr|Abs|NoWrp|Lin|Prf|NoNull|BitF) + 0x09, 0x41, // Usage (0x41) + 0x91, 0x00, // Output (Dat|Arr|Abs|NoWrp|Lin|Prf|NoNull|BitF) + 0x85, 0x21, // Report ID (0x21) + 0x95, 0x1F, // Report Count (31) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x09, 0x42, // Usage (0x42) + 0x81, 0x00, // Input (Dat|Arr|Abs|NoWrp|Lin|Prf|NoNull|BitF) + 0x09, 0x42, // Usage (0x42) + 0x91, 0x00, // Output (Dat|Arr|Abs|NoWrp|Lin|Prf|NoNull|BitF) + 0xC0 // End Collection + }; + return base::make_span(kLogitechUnifyingReceiver); +} -// http://eleccelerator.com/wiki/index.php?title=DualShock_4#HID_Report_Descriptor -const uint8_t kSonyDualshock3[] = { - 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) - 0x09, 0x04, // Usage (Joystick) - 0xA1, 0x01, // Collection (Application) - 0xA1, 0x02, // Collection (Logical) - 0x85, 0x01, // Report ID (1) - 0x75, 0x08, // Report Size (8) - 0x95, 0x01, // Report Count (1) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position) NOTE: reserved byte - 0x75, 0x01, // Report Size (1) - 0x95, 0x13, // Report Count (19) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x01, // Logical Maximum (1) - 0x35, 0x00, // Physical Minimum (0) - 0x45, 0x01, // Physical Maximum (1) - 0x05, 0x09, // Usage Page (Button) - 0x19, 0x01, // Usage Minimum (0x01) - 0x29, 0x13, // Usage Maximum (0x13) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position) - 0x75, 0x01, // Report Size (1) - 0x95, 0x0D, // Report Count (13) - 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00) - 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position) NOTE: 32 bit integer, - // where 0:18 are buttons and 19:31 are reserved - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) - 0x09, 0x01, // Usage (Pointer) - 0xA1, 0x00, // Collection (Physical) - 0x75, 0x08, // Report Size (8) - 0x95, 0x04, // Report Count (4) - 0x35, 0x00, // Physical Minimum (0) - 0x46, 0xFF, 0x00, // Physical Maximum (255) - 0x09, 0x30, // Usage (X) - 0x09, 0x31, // Usage (Y) - 0x09, 0x32, // Usage (Z) - 0x09, 0x35, // Usage (Rz) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position) NOTE: four joysticks - 0xC0, // End Collection - 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) - 0x75, 0x08, // Report Size (8) - 0x95, 0x27, // Report Count (39) - 0x09, 0x01, // Usage (Pointer) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position) - 0x75, 0x08, // Report Size (8) - 0x95, 0x30, // Report Count (48) - 0x09, 0x01, // Usage (Pointer) - 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x75, 0x08, // Report Size (8) - 0x95, 0x30, // Report Count (48) - 0x09, 0x01, // Usage (Pointer) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0xC0, // End Collection - 0xA1, 0x02, // Collection (Logical) - 0x85, 0x02, // Report ID (2) - 0x75, 0x08, // Report Size (8) - 0x95, 0x30, // Report Count (48) - 0x09, 0x01, // Usage (Pointer) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0xC0, // End Collection - 0xA1, 0x02, // Collection (Logical) - 0x85, 0xEE, // Report ID (238) - 0x75, 0x08, // Report Size (8) - 0x95, 0x30, // Report Count (48) - 0x09, 0x01, // Usage (Pointer) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0xC0, // End Collection - 0xA1, 0x02, // Collection (Logical) - 0x85, 0xEF, // Report ID (239) - 0x75, 0x08, // Report Size (8) - 0x95, 0x30, // Report Count (48) - 0x09, 0x01, // Usage (Pointer) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0xC0, // End Collection - 0xC0, // End Collection -}; -const size_t kSonyDualshock3Size = base::size(kSonyDualshock3); +// static +base::span<const uint8_t> TestReportDescriptors::SonyDualshock3Usb() { + // http://eleccelerator.com/wiki/index.php?title=DualShock_4#HID_Report_Descriptor + constexpr uint8_t kSonyDualshock3[] = { + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 0x09, 0x04, // Usage (Joystick) + 0xA1, 0x01, // Collection (Application) + 0xA1, 0x02, // Collection (Logical) + 0x85, 0x01, // Report ID (1) + 0x75, 0x08, // Report Size (8) + 0x95, 0x01, // Report Count (1) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position) NOTE: reserved byte + 0x75, 0x01, // Report Size (1) + 0x95, 0x13, // Report Count (19) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x35, 0x00, // Physical Minimum (0) + 0x45, 0x01, // Physical Maximum (1) + 0x05, 0x09, // Usage Page (Button) + 0x19, 0x01, // Usage Minimum (0x01) + 0x29, 0x13, // Usage Maximum (0x13) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position) + 0x75, 0x01, // Report Size (1) + 0x95, 0x0D, // Report Count (13) + 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00) + 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position) NOTE: 32 bit integer, + // where 0:18 are buttons and 19:31 are reserved + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 0x09, 0x01, // Usage (Pointer) + 0xA1, 0x00, // Collection (Physical) + 0x75, 0x08, // Report Size (8) + 0x95, 0x04, // Report Count (4) + 0x35, 0x00, // Physical Minimum (0) + 0x46, 0xFF, 0x00, // Physical Maximum (255) + 0x09, 0x30, // Usage (X) + 0x09, 0x31, // Usage (Y) + 0x09, 0x32, // Usage (Z) + 0x09, 0x35, // Usage (Rz) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position) NOTE: four joysticks + 0xC0, // End Collection + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 0x75, 0x08, // Report Size (8) + 0x95, 0x27, // Report Count (39) + 0x09, 0x01, // Usage (Pointer) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position) + 0x75, 0x08, // Report Size (8) + 0x95, 0x30, // Report Count (48) + 0x09, 0x01, // Usage (Pointer) + 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x75, 0x08, // Report Size (8) + 0x95, 0x30, // Report Count (48) + 0x09, 0x01, // Usage (Pointer) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0xC0, // End Collection + 0xA1, 0x02, // Collection (Logical) + 0x85, 0x02, // Report ID (2) + 0x75, 0x08, // Report Size (8) + 0x95, 0x30, // Report Count (48) + 0x09, 0x01, // Usage (Pointer) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0xC0, // End Collection + 0xA1, 0x02, // Collection (Logical) + 0x85, 0xEE, // Report ID (238) + 0x75, 0x08, // Report Size (8) + 0x95, 0x30, // Report Count (48) + 0x09, 0x01, // Usage (Pointer) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0xC0, // End Collection + 0xA1, 0x02, // Collection (Logical) + 0x85, 0xEF, // Report ID (239) + 0x75, 0x08, // Report Size (8) + 0x95, 0x30, // Report Count (48) + 0x09, 0x01, // Usage (Pointer) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0xC0, // End Collection + 0xC0, // End Collection + }; + return base::make_span(kSonyDualshock3); +} -// http://eleccelerator.com/wiki/index.php?title=DualShock_4#HID_Report_Descriptor -const uint8_t kSonyDualshock4[] = { - 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) - 0x09, 0x05, // Usage (Game Pad) - 0xA1, 0x01, // Collection (Application) - 0x85, 0x01, // Report ID (1) - 0x09, 0x30, // Usage (X) - 0x09, 0x31, // Usage (Y) - 0x09, 0x32, // Usage (Z) - 0x09, 0x35, // Usage (Rz) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x75, 0x08, // Report Size (8) - 0x95, 0x04, // Report Count (4) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State, - // No Null Position) - 0x09, 0x39, // Usage (Hat switch) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x07, // Logical Maximum (7) - 0x35, 0x00, // Physical Minimum (0) - 0x46, 0x3B, 0x01, // Physical Maximum (315) - 0x65, 0x14, // Unit (System: English Rotation, Length: Centimeter) - 0x75, 0x04, // Report Size (4) - 0x95, 0x01, // Report Count (1) - 0x81, 0x42, // Input (Data,Var,Abs,No Wrap,Linear,Preferred - // State,Null State) - 0x65, 0x00, // Unit (None) - 0x05, 0x09, // Usage Page (Button) - 0x19, 0x01, // Usage Minimum (0x01) - 0x29, 0x0E, // Usage Maximum (0x0E) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x01, // Logical Maximum (1) - 0x75, 0x01, // Report Size (1) - 0x95, 0x0E, // Report Count (14) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State, - // No Null Position) - 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00) - 0x09, 0x20, // Usage (0x20) - 0x75, 0x06, // Report Size (6) - 0x95, 0x01, // Report Count (1) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x7F, // Logical Maximum (127) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State, - // No Null Position) - 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) - 0x09, 0x33, // Usage (Rx) - 0x09, 0x34, // Usage (Ry) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x75, 0x08, // Report Size (8) - 0x95, 0x02, // Report Count (2) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State, - // No Null Position) - 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00) - 0x09, 0x21, // Usage (0x21) - 0x95, 0x36, // Report Count (54) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State, - // No Null Position) - 0x85, 0x05, // Report ID (5) - 0x09, 0x22, // Usage (0x22) - 0x95, 0x1F, // Report Count (31) - 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear,Preferred State, - // No Null Position,Non-volatile) - 0x85, 0x04, // Report ID (4) - 0x09, 0x23, // Usage (0x23) - 0x95, 0x24, // Report Count (36) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0x02, // Report ID (2) - 0x09, 0x24, // Usage (0x24) - 0x95, 0x24, // Report Count (36) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0x08, // Report ID (8) - 0x09, 0x25, // Usage (0x25) - 0x95, 0x03, // Report Count (3) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0x10, // Report ID (16) - 0x09, 0x26, // Usage (0x26) - 0x95, 0x04, // Report Count (4) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0x11, // Report ID (17) - 0x09, 0x27, // Usage (0x27) - 0x95, 0x02, // Report Count (2) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0x12, // Report ID (18) - 0x06, 0x02, 0xFF, // Usage Page (Vendor Defined 0xFF02) - 0x09, 0x21, // Usage (0x21) - 0x95, 0x0F, // Report Count (15) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0x13, // Report ID (19) - 0x09, 0x22, // Usage (0x22) - 0x95, 0x16, // Report Count (22) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0x14, // Report ID (20) - 0x06, 0x05, 0xFF, // Usage Page (Vendor Defined 0xFF05) - 0x09, 0x20, // Usage (0x20) - 0x95, 0x10, // Report Count (16) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0x15, // Report ID (21) - 0x09, 0x21, // Usage (0x21) - 0x95, 0x2C, // Report Count (44) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x06, 0x80, 0xFF, // Usage Page (Vendor Defined 0xFF80) - 0x85, 0x80, // Report ID (128) - 0x09, 0x20, // Usage (0x20) - 0x95, 0x06, // Report Count (6) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0x81, // Report ID (129) - 0x09, 0x21, // Usage (0x21) - 0x95, 0x06, // Report Count (6) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0x82, // Report ID (130) - 0x09, 0x22, // Usage (0x22) - 0x95, 0x05, // Report Count (5) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0x83, // Report ID (131) - 0x09, 0x23, // Usage (0x23) - 0x95, 0x01, // Report Count (1) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0x84, // Report ID (132) - 0x09, 0x24, // Usage (0x24) - 0x95, 0x04, // Report Count (4) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0x85, // Report ID (133) - 0x09, 0x25, // Usage (0x25) - 0x95, 0x06, // Report Count (6) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0x86, // Report ID (134) - 0x09, 0x26, // Usage (0x26) - 0x95, 0x06, // Report Count (6) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0x87, // Report ID (135) - 0x09, 0x27, // Usage (0x27) - 0x95, 0x23, // Report Count (35) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0x88, // Report ID (136) - 0x09, 0x28, // Usage (0x28) - 0x95, 0x22, // Report Count (34) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0x89, // Report ID (137) - 0x09, 0x29, // Usage (0x29) - 0x95, 0x02, // Report Count (2) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0x90, // Report ID (144) - 0x09, 0x30, // Usage (0x30) - 0x95, 0x05, // Report Count (5) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0x91, // Report ID (145) - 0x09, 0x31, // Usage (0x31) - 0x95, 0x03, // Report Count (3) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0x92, // Report ID (146) - 0x09, 0x32, // Usage (0x32) - 0x95, 0x03, // Report Count (3) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0x93, // Report ID (147) - 0x09, 0x33, // Usage (0x33) - 0x95, 0x0C, // Report Count (12) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0xA0, // Report ID (160) - 0x09, 0x40, // Usage (0x40) - 0x95, 0x06, // Report Count (6) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0xA1, // Report ID (161) - 0x09, 0x41, // Usage (0x41) - 0x95, 0x01, // Report Count (1) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0xA2, // Report ID (162) - 0x09, 0x42, // Usage (0x42) - 0x95, 0x01, // Report Count (1) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0xA3, // Report ID (163) - 0x09, 0x43, // Usage (0x43) - 0x95, 0x30, // Report Count (48) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0xA4, // Report ID (164) - 0x09, 0x44, // Usage (0x44) - 0x95, 0x0D, // Report Count (13) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0xA5, // Report ID (165) - 0x09, 0x45, // Usage (0x45) - 0x95, 0x15, // Report Count (21) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0xA6, // Report ID (166) - 0x09, 0x46, // Usage (0x46) - 0x95, 0x15, // Report Count (21) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0xF0, // Report ID (240) - 0x09, 0x47, // Usage (0x47) - 0x95, 0x3F, // Report Count (63) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0xF1, // Report ID (241) - 0x09, 0x48, // Usage (0x48) - 0x95, 0x3F, // Report Count (63) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0xF2, // Report ID (242) - 0x09, 0x49, // Usage (0x49) - 0x95, 0x0F, // Report Count (15) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0xA7, // Report ID (167) - 0x09, 0x4A, // Usage (0x4A) - 0x95, 0x01, // Report Count (1) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0xA8, // Report ID (168) - 0x09, 0x4B, // Usage (0x4B) - 0x95, 0x01, // Report Count (1) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0xA9, // Report ID (169) - 0x09, 0x4C, // Usage (0x4C) - 0x95, 0x08, // Report Count (8) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0xAA, // Report ID (170) - 0x09, 0x4E, // Usage (0x4E) - 0x95, 0x01, // Report Count (1) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0xAB, // Report ID (171) - 0x09, 0x4F, // Usage (0x4F) - 0x95, 0x39, // Report Count (57) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0xAC, // Report ID (172) - 0x09, 0x50, // Usage (0x50) - 0x95, 0x39, // Report Count (57) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0xAD, // Report ID (173) - 0x09, 0x51, // Usage (0x51) - 0x95, 0x0B, // Report Count (11) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0xAE, // Report ID (174) - 0x09, 0x52, // Usage (0x52) - 0x95, 0x01, // Report Count (1) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0xAF, // Report ID (175) - 0x09, 0x53, // Usage (0x53) - 0x95, 0x02, // Report Count (2) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x85, 0xB0, // Report ID (176) - 0x09, 0x54, // Usage (0x54) - 0x95, 0x3F, // Report Count (63) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0xC0, // End Collection +// static +base::span<const uint8_t> TestReportDescriptors::SonyDualshock4Usb() { + // http://eleccelerator.com/wiki/index.php?title=DualShock_4#HID_Report_Descriptor + constexpr uint8_t kSonyDualshock4[] = { + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 0x09, 0x05, // Usage (Game Pad) + 0xA1, 0x01, // Collection (Application) + 0x85, 0x01, // Report ID (1) + 0x09, 0x30, // Usage (X) + 0x09, 0x31, // Usage (Y) + 0x09, 0x32, // Usage (Z) + 0x09, 0x35, // Usage (Rz) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x75, 0x08, // Report Size (8) + 0x95, 0x04, // Report Count (4) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State, + // No Null Position) + 0x09, 0x39, // Usage (Hat switch) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x07, // Logical Maximum (7) + 0x35, 0x00, // Physical Minimum (0) + 0x46, 0x3B, 0x01, // Physical Maximum (315) + 0x65, 0x14, // Unit (System: English Rotation, Length: Centimeter) + 0x75, 0x04, // Report Size (4) + 0x95, 0x01, // Report Count (1) + 0x81, 0x42, // Input (Data,Var,Abs,No Wrap,Linear,Preferred + // State,Null State) + 0x65, 0x00, // Unit (None) + 0x05, 0x09, // Usage Page (Button) + 0x19, 0x01, // Usage Minimum (0x01) + 0x29, 0x0E, // Usage Maximum (0x0E) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x75, 0x01, // Report Size (1) + 0x95, 0x0E, // Report Count (14) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State, + // No Null Position) + 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00) + 0x09, 0x20, // Usage (0x20) + 0x75, 0x06, // Report Size (6) + 0x95, 0x01, // Report Count (1) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x7F, // Logical Maximum (127) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State, + // No Null Position) + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 0x09, 0x33, // Usage (Rx) + 0x09, 0x34, // Usage (Ry) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x75, 0x08, // Report Size (8) + 0x95, 0x02, // Report Count (2) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State, + // No Null Position) + 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00) + 0x09, 0x21, // Usage (0x21) + 0x95, 0x36, // Report Count (54) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State, + // No Null Position) + 0x85, 0x05, // Report ID (5) + 0x09, 0x22, // Usage (0x22) + 0x95, 0x1F, // Report Count (31) + 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear,Preferred State, + // No Null Position,Non-volatile) + 0x85, 0x04, // Report ID (4) + 0x09, 0x23, // Usage (0x23) + 0x95, 0x24, // Report Count (36) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0x02, // Report ID (2) + 0x09, 0x24, // Usage (0x24) + 0x95, 0x24, // Report Count (36) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0x08, // Report ID (8) + 0x09, 0x25, // Usage (0x25) + 0x95, 0x03, // Report Count (3) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0x10, // Report ID (16) + 0x09, 0x26, // Usage (0x26) + 0x95, 0x04, // Report Count (4) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0x11, // Report ID (17) + 0x09, 0x27, // Usage (0x27) + 0x95, 0x02, // Report Count (2) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0x12, // Report ID (18) + 0x06, 0x02, 0xFF, // Usage Page (Vendor Defined 0xFF02) + 0x09, 0x21, // Usage (0x21) + 0x95, 0x0F, // Report Count (15) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0x13, // Report ID (19) + 0x09, 0x22, // Usage (0x22) + 0x95, 0x16, // Report Count (22) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0x14, // Report ID (20) + 0x06, 0x05, 0xFF, // Usage Page (Vendor Defined 0xFF05) + 0x09, 0x20, // Usage (0x20) + 0x95, 0x10, // Report Count (16) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0x15, // Report ID (21) + 0x09, 0x21, // Usage (0x21) + 0x95, 0x2C, // Report Count (44) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x06, 0x80, 0xFF, // Usage Page (Vendor Defined 0xFF80) + 0x85, 0x80, // Report ID (128) + 0x09, 0x20, // Usage (0x20) + 0x95, 0x06, // Report Count (6) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0x81, // Report ID (129) + 0x09, 0x21, // Usage (0x21) + 0x95, 0x06, // Report Count (6) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0x82, // Report ID (130) + 0x09, 0x22, // Usage (0x22) + 0x95, 0x05, // Report Count (5) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0x83, // Report ID (131) + 0x09, 0x23, // Usage (0x23) + 0x95, 0x01, // Report Count (1) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0x84, // Report ID (132) + 0x09, 0x24, // Usage (0x24) + 0x95, 0x04, // Report Count (4) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0x85, // Report ID (133) + 0x09, 0x25, // Usage (0x25) + 0x95, 0x06, // Report Count (6) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0x86, // Report ID (134) + 0x09, 0x26, // Usage (0x26) + 0x95, 0x06, // Report Count (6) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0x87, // Report ID (135) + 0x09, 0x27, // Usage (0x27) + 0x95, 0x23, // Report Count (35) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0x88, // Report ID (136) + 0x09, 0x28, // Usage (0x28) + 0x95, 0x22, // Report Count (34) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0x89, // Report ID (137) + 0x09, 0x29, // Usage (0x29) + 0x95, 0x02, // Report Count (2) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0x90, // Report ID (144) + 0x09, 0x30, // Usage (0x30) + 0x95, 0x05, // Report Count (5) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0x91, // Report ID (145) + 0x09, 0x31, // Usage (0x31) + 0x95, 0x03, // Report Count (3) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0x92, // Report ID (146) + 0x09, 0x32, // Usage (0x32) + 0x95, 0x03, // Report Count (3) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0x93, // Report ID (147) + 0x09, 0x33, // Usage (0x33) + 0x95, 0x0C, // Report Count (12) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0xA0, // Report ID (160) + 0x09, 0x40, // Usage (0x40) + 0x95, 0x06, // Report Count (6) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0xA1, // Report ID (161) + 0x09, 0x41, // Usage (0x41) + 0x95, 0x01, // Report Count (1) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0xA2, // Report ID (162) + 0x09, 0x42, // Usage (0x42) + 0x95, 0x01, // Report Count (1) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0xA3, // Report ID (163) + 0x09, 0x43, // Usage (0x43) + 0x95, 0x30, // Report Count (48) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0xA4, // Report ID (164) + 0x09, 0x44, // Usage (0x44) + 0x95, 0x0D, // Report Count (13) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0xA5, // Report ID (165) + 0x09, 0x45, // Usage (0x45) + 0x95, 0x15, // Report Count (21) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0xA6, // Report ID (166) + 0x09, 0x46, // Usage (0x46) + 0x95, 0x15, // Report Count (21) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0xF0, // Report ID (240) + 0x09, 0x47, // Usage (0x47) + 0x95, 0x3F, // Report Count (63) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0xF1, // Report ID (241) + 0x09, 0x48, // Usage (0x48) + 0x95, 0x3F, // Report Count (63) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0xF2, // Report ID (242) + 0x09, 0x49, // Usage (0x49) + 0x95, 0x0F, // Report Count (15) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0xA7, // Report ID (167) + 0x09, 0x4A, // Usage (0x4A) + 0x95, 0x01, // Report Count (1) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0xA8, // Report ID (168) + 0x09, 0x4B, // Usage (0x4B) + 0x95, 0x01, // Report Count (1) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0xA9, // Report ID (169) + 0x09, 0x4C, // Usage (0x4C) + 0x95, 0x08, // Report Count (8) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0xAA, // Report ID (170) + 0x09, 0x4E, // Usage (0x4E) + 0x95, 0x01, // Report Count (1) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0xAB, // Report ID (171) + 0x09, 0x4F, // Usage (0x4F) + 0x95, 0x39, // Report Count (57) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0xAC, // Report ID (172) + 0x09, 0x50, // Usage (0x50) + 0x95, 0x39, // Report Count (57) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0xAD, // Report ID (173) + 0x09, 0x51, // Usage (0x51) + 0x95, 0x0B, // Report Count (11) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0xAE, // Report ID (174) + 0x09, 0x52, // Usage (0x52) + 0x95, 0x01, // Report Count (1) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0xAF, // Report ID (175) + 0x09, 0x53, // Usage (0x53) + 0x95, 0x02, // Report Count (2) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x85, 0xB0, // Report ID (176) + 0x09, 0x54, // Usage (0x54) + 0x95, 0x3F, // Report Count (63) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0xC0, // End Collection + }; + return base::make_span(kSonyDualshock4); +} -}; -const size_t kSonyDualshock4Size = base::size(kSonyDualshock4); +// static +base::span<const uint8_t> +TestReportDescriptors::MicrosoftXboxWirelessControllerBluetooth() { + constexpr uint8_t kMicrosoftXboxWirelessController[] = { + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 0x09, 0x05, // Usage (Game Pad) + 0xA1, 0x01, // Collection (Application) + 0x85, 0x01, // Report ID (1) + 0x09, 0x01, // Usage (Pointer) + 0xA1, 0x00, // Collection (Physical) + 0x09, 0x30, // Usage (X) + 0x09, 0x31, // Usage (Y) + 0x15, 0x00, // Logical Minimum (0) + 0x27, 0xFF, 0xFF, 0x00, 0x00, // Logical Maximum (65534) + 0x95, 0x02, // Report Count (2) + 0x75, 0x10, // Report Size (16) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0xC0, // End Collection + 0x09, 0x01, // Usage (Pointer) + 0xA1, 0x00, // Collection (Physical) + 0x09, 0x33, // Usage (Rx) + 0x09, 0x34, // Usage (Ry) + 0x15, 0x00, // Logical Minimum (0) + 0x27, 0xFF, 0xFF, 0x00, 0x00, // Logical Maximum (65534) + 0x95, 0x02, // Report Count (2) + 0x75, 0x10, // Report Size (16) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0xC0, // End Collection + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 0x09, 0x32, // Usage (Z) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x03, // Logical Maximum (1023) + 0x95, 0x01, // Report Count (1) + 0x75, 0x0A, // Report Size (10) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x00, // Logical Maximum (0) + 0x75, 0x06, // Report Size (6) + 0x95, 0x01, // Report Count (1) + 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 0x09, 0x35, // Usage (Rz) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x03, // Logical Maximum (1023) + 0x95, 0x01, // Report Count (1) + 0x75, 0x0A, // Report Size (10) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x00, // Logical Maximum (0) + 0x75, 0x06, // Report Size (6) + 0x95, 0x01, // Report Count (1) + 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 0x09, 0x39, // Usage (Hat switch) + 0x15, 0x01, // Logical Minimum (1) + 0x25, 0x08, // Logical Maximum (8) + 0x35, 0x00, // Physical Minimum (0) + 0x46, 0x3B, 0x01, // Physical Maximum (315) + 0x66, 0x14, 0x00, // Unit (System: English Rotation, + // Length: Centimeter) + 0x75, 0x04, // Report Size (4) + 0x95, 0x01, // Report Count (1) + 0x81, 0x42, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,Null State) + 0x75, 0x04, // Report Size (4) + 0x95, 0x01, // Report Count (1) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x00, // Logical Maximum (0) + 0x35, 0x00, // Physical Minimum (0) + 0x45, 0x00, // Physical Maximum (0) + 0x65, 0x00, // Unit (None) + 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x05, 0x09, // Usage Page (Button) + 0x19, 0x01, // Usage Minimum (0x01) + 0x29, 0x0A, // Usage Maximum (0x0A) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x75, 0x01, // Report Size (1) + 0x95, 0x0A, // Report Count (10) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x00, // Logical Maximum (0) + 0x75, 0x06, // Report Size (6) + 0x95, 0x01, // Report Count (1) + 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 0x09, 0x80, // Usage (Sys Control) + 0x85, 0x02, // Report ID (2) + 0xA1, 0x00, // Collection (Physical) + 0x09, 0x85, // Usage (Sys Main Menu) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x95, 0x01, // Report Count (1) + 0x75, 0x01, // Report Size (1) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x00, // Logical Maximum (0) + 0x75, 0x07, // Report Size (7) + 0x95, 0x01, // Report Count (1) + 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0xC0, // End Collection + 0x05, 0x0F, // Usage Page (PID Page) + 0x09, 0x21, // Usage (0x21) + 0x85, 0x03, // Report ID (3) + 0xA1, 0x02, // Collection (Logical) + 0x09, 0x97, // Usage (0x97) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x75, 0x04, // Report Size (4) + 0x95, 0x01, // Report Count (1) + 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position, + // Non-volatile) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x00, // Logical Maximum (0) + 0x75, 0x04, // Report Size (4) + 0x95, 0x01, // Report Count (1) + 0x91, 0x03, // Output (Const,Var,Abs,No Wrap, + // Linear,Preferred State,No Null + // Position,Non-volatile) + 0x09, 0x70, // Usage (0x70) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x64, // Logical Maximum (100) + 0x75, 0x08, // Report Size (8) + 0x95, 0x04, // Report Count (4) + 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position, + // Non-volatile) + 0x09, 0x50, // Usage (0x50) + 0x66, 0x01, 0x10, // Unit (System: SI Linear, Time: + // Seconds) + 0x55, 0x0E, // Unit Exponent (-2) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x75, 0x08, // Report Size (8) + 0x95, 0x01, // Report Count (1) + 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position, + // Non-volatile) + 0x09, 0xA7, // Usage (0xA7) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x75, 0x08, // Report Size (8) + 0x95, 0x01, // Report Count (1) + 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position, + // Non-volatile) + 0x65, 0x00, // Unit (None) + 0x55, 0x00, // Unit Exponent (0) + 0x09, 0x7C, // Usage (0x7C) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x75, 0x08, // Report Size (8) + 0x95, 0x01, // Report Count (1) + 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position, + // Non-volatile) + 0xC0, // End Collection + 0x85, 0x04, // Report ID (4) + 0x05, 0x06, // Usage Page (Generic Dev Ctrls) + 0x09, 0x20, // Usage (Battery Strength) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x75, 0x08, // Report Size (8) + 0x95, 0x01, // Report Count (1) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null + // Position) + 0xC0, // End Collection + 0x00, // Unknown (bTag: 0x00, bType: 0x00) + }; + return base::make_span(kMicrosoftXboxWirelessController); +} -const uint8_t kMicrosoftXboxWirelessController[] = { - 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) - 0x09, 0x05, // Usage (Game Pad) - 0xA1, 0x01, // Collection (Application) - 0x85, 0x01, // Report ID (1) - 0x09, 0x01, // Usage (Pointer) - 0xA1, 0x00, // Collection (Physical) - 0x09, 0x30, // Usage (X) - 0x09, 0x31, // Usage (Y) - 0x15, 0x00, // Logical Minimum (0) - 0x27, 0xFF, 0xFF, 0x00, 0x00, // Logical Maximum (65534) - 0x95, 0x02, // Report Count (2) - 0x75, 0x10, // Report Size (16) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0xC0, // End Collection - 0x09, 0x01, // Usage (Pointer) - 0xA1, 0x00, // Collection (Physical) - 0x09, 0x33, // Usage (Rx) - 0x09, 0x34, // Usage (Ry) - 0x15, 0x00, // Logical Minimum (0) - 0x27, 0xFF, 0xFF, 0x00, 0x00, // Logical Maximum (65534) - 0x95, 0x02, // Report Count (2) - 0x75, 0x10, // Report Size (16) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0xC0, // End Collection - 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) - 0x09, 0x32, // Usage (Z) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x03, // Logical Maximum (1023) - 0x95, 0x01, // Report Count (1) - 0x75, 0x0A, // Report Size (10) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x00, // Logical Maximum (0) - 0x75, 0x06, // Report Size (6) - 0x95, 0x01, // Report Count (1) - 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) - 0x09, 0x35, // Usage (Rz) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x03, // Logical Maximum (1023) - 0x95, 0x01, // Report Count (1) - 0x75, 0x0A, // Report Size (10) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x00, // Logical Maximum (0) - 0x75, 0x06, // Report Size (6) - 0x95, 0x01, // Report Count (1) - 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) - 0x09, 0x39, // Usage (Hat switch) - 0x15, 0x01, // Logical Minimum (1) - 0x25, 0x08, // Logical Maximum (8) - 0x35, 0x00, // Physical Minimum (0) - 0x46, 0x3B, 0x01, // Physical Maximum (315) - 0x66, 0x14, 0x00, // Unit (System: English Rotation, Length: - // Centimeter) - 0x75, 0x04, // Report Size (4) - 0x95, 0x01, // Report Count (1) - 0x81, 0x42, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,Null State) - 0x75, 0x04, // Report Size (4) - 0x95, 0x01, // Report Count (1) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x00, // Logical Maximum (0) - 0x35, 0x00, // Physical Minimum (0) - 0x45, 0x00, // Physical Maximum (0) - 0x65, 0x00, // Unit (None) - 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x05, 0x09, // Usage Page (Button) - 0x19, 0x01, // Usage Minimum (0x01) - 0x29, 0x0A, // Usage Maximum (0x0A) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x01, // Logical Maximum (1) - 0x75, 0x01, // Report Size (1) - 0x95, 0x0A, // Report Count (10) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x00, // Logical Maximum (0) - 0x75, 0x06, // Report Size (6) - 0x95, 0x01, // Report Count (1) - 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) - 0x09, 0x80, // Usage (Sys Control) - 0x85, 0x02, // Report ID (2) - 0xA1, 0x00, // Collection (Physical) - 0x09, 0x85, // Usage (Sys Main Menu) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x01, // Logical Maximum (1) - 0x95, 0x01, // Report Count (1) - 0x75, 0x01, // Report Size (1) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x00, // Logical Maximum (0) - 0x75, 0x07, // Report Size (7) - 0x95, 0x01, // Report Count (1) - 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0xC0, // End Collection - 0x05, 0x0F, // Usage Page (PID Page) - 0x09, 0x21, // Usage (0x21) - 0x85, 0x03, // Report ID (3) - 0xA1, 0x02, // Collection (Logical) - 0x09, 0x97, // Usage (0x97) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x01, // Logical Maximum (1) - 0x75, 0x04, // Report Size (4) - 0x95, 0x01, // Report Count (1) - 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position, - // Non-volatile) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x00, // Logical Maximum (0) - 0x75, 0x04, // Report Size (4) - 0x95, 0x01, // Report Count (1) - 0x91, 0x03, // Output (Const,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position, - // Non-volatile) - 0x09, 0x70, // Usage (0x70) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x64, // Logical Maximum (100) - 0x75, 0x08, // Report Size (8) - 0x95, 0x04, // Report Count (4) - 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position, - // Non-volatile) - 0x09, 0x50, // Usage (0x50) - 0x66, 0x01, 0x10, // Unit (System: SI Linear, Time: - // Seconds) - 0x55, 0x0E, // Unit Exponent (-2) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x75, 0x08, // Report Size (8) - 0x95, 0x01, // Report Count (1) - 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position, - // Non-volatile) - 0x09, 0xA7, // Usage (0xA7) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x75, 0x08, // Report Size (8) - 0x95, 0x01, // Report Count (1) - 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position, - // Non-volatile) - 0x65, 0x00, // Unit (None) - 0x55, 0x00, // Unit Exponent (0) - 0x09, 0x7C, // Usage (0x7C) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x75, 0x08, // Report Size (8) - 0x95, 0x01, // Report Count (1) - 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position, - // Non-volatile) - 0xC0, // End Collection - 0x85, 0x04, // Report ID (4) - 0x05, 0x06, // Usage Page (Generic Dev Ctrls) - 0x09, 0x20, // Usage (Battery Strength) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x75, 0x08, // Report Size (8) - 0x95, 0x01, // Report Count (1) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null - // Position) - 0xC0, // End Collection - 0x00, // Unknown (bTag: 0x00, bType: 0x00) -}; -const size_t kMicrosoftXboxWirelessControllerSize = - base::size(kMicrosoftXboxWirelessController); +// static +base::span<const uint8_t> +TestReportDescriptors::NintendoSwitchProControllerUsb() { + constexpr uint8_t kNintendoSwitchProController[] = { + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 0x15, 0x00, // Logical Minimum (0) + 0x09, 0x04, // Usage (Joystick) + 0xA1, 0x01, // Collection (Application) + 0x85, 0x30, // Report ID (48) + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 0x05, 0x09, // Usage Page (Button) + 0x19, 0x01, // Usage Minimum (0x01) + 0x29, 0x0A, // Usage Maximum (0x0A) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x75, 0x01, // Report Size (1) + 0x95, 0x0A, // Report Count (10) + 0x55, 0x00, // Unit Exponent (0) + 0x65, 0x00, // Unit (None) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x05, 0x09, // Usage Page (Button) + 0x19, 0x0B, // Usage Minimum (0x0B) + 0x29, 0x0E, // Usage Maximum (0x0E) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x75, 0x01, // Report Size (1) + 0x95, 0x04, // Report Count (4) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x75, 0x01, // Report Size (1) + 0x95, 0x02, // Report Count (2) + 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x0B, 0x01, 0x00, 0x01, 0x00, // Usage (0x010001) + 0xA1, 0x00, // Collection (Physical) + 0x0B, 0x30, 0x00, 0x01, 0x00, // Usage (0x010030) + 0x0B, 0x31, 0x00, 0x01, 0x00, // Usage (0x010031) + 0x0B, 0x32, 0x00, 0x01, 0x00, // Usage (0x010032) + 0x0B, 0x35, 0x00, 0x01, 0x00, // Usage (0x010035) + 0x15, 0x00, // Logical Minimum (0) + 0x27, 0xFF, 0xFF, 0x00, 0x00, // Logical Maximum (65534) + 0x75, 0x10, // Report Size (16) + 0x95, 0x04, // Report Count (4) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0xC0, // End Collection + 0x0B, 0x39, 0x00, 0x01, 0x00, // Usage (0x010039) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x07, // Logical Maximum (7) + 0x35, 0x00, // Physical Minimum (0) + 0x46, 0x3B, 0x01, // Physical Maximum (315) + 0x65, 0x14, // Unit (System: English Rotation, + // Length: Centimeter) + 0x75, 0x04, // Report Size (4) + 0x95, 0x01, // Report Count (1) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x05, 0x09, // Usage Page (Button) + 0x19, 0x0F, // Usage Minimum (0x0F) + 0x29, 0x12, // Usage Maximum (0x12) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x75, 0x01, // Report Size (1) + 0x95, 0x04, // Report Count (4) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x75, 0x08, // Report Size (8) + 0x95, 0x34, // Report Count (52) + 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00) + 0x85, 0x21, // Report ID (33) + 0x09, 0x01, // Usage (0x01) + 0x75, 0x08, // Report Size (8) + 0x95, 0x3F, // Report Count (63) + 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x85, 0x81, // Report ID (-127) + 0x09, 0x02, // Usage (0x02) + 0x75, 0x08, // Report Size (8) + 0x95, 0x3F, // Report Count (63) + 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x85, 0x01, // Report ID (1) + 0x09, 0x03, // Usage (0x03) + 0x75, 0x08, // Report Size (8) + 0x95, 0x3F, // Report Count (63) + 0x91, 0x83, // Output (Const,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position, + // Volatile) + 0x85, 0x10, // Report ID (16) + 0x09, 0x04, // Usage (0x04) + 0x75, 0x08, // Report Size (8) + 0x95, 0x3F, // Report Count (63) + 0x91, 0x83, // Output (Const,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position, + // Volatile) + 0x85, 0x80, // Report ID (-128) + 0x09, 0x05, // Usage (0x05) + 0x75, 0x08, // Report Size (8) + 0x95, 0x3F, // Report Count (63) + 0x91, 0x83, // Output (Const,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position, + // Volatile) + 0x85, 0x82, // Report ID (-126) + 0x09, 0x06, // Usage (0x06) + 0x75, 0x08, // Report Size (8) + 0x95, 0x3F, // Report Count (63) + 0x91, 0x83, // Output (Const,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position, + // Volatile) + 0xC0, // End Collection + }; + return base::make_span(kNintendoSwitchProController); +} -const uint8_t kNintendoSwitchProController[] = { - 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) - 0x15, 0x00, // Logical Minimum (0) - 0x09, 0x04, // Usage (Joystick) - 0xA1, 0x01, // Collection (Application) - 0x85, 0x30, // Report ID (48) - 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) - 0x05, 0x09, // Usage Page (Button) - 0x19, 0x01, // Usage Minimum (0x01) - 0x29, 0x0A, // Usage Maximum (0x0A) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x01, // Logical Maximum (1) - 0x75, 0x01, // Report Size (1) - 0x95, 0x0A, // Report Count (10) - 0x55, 0x00, // Unit Exponent (0) - 0x65, 0x00, // Unit (None) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x05, 0x09, // Usage Page (Button) - 0x19, 0x0B, // Usage Minimum (0x0B) - 0x29, 0x0E, // Usage Maximum (0x0E) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x01, // Logical Maximum (1) - 0x75, 0x01, // Report Size (1) - 0x95, 0x04, // Report Count (4) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x75, 0x01, // Report Size (1) - 0x95, 0x02, // Report Count (2) - 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x0B, 0x01, 0x00, 0x01, 0x00, // Usage (0x010001) - 0xA1, 0x00, // Collection (Physical) - 0x0B, 0x30, 0x00, 0x01, 0x00, // Usage (0x010030) - 0x0B, 0x31, 0x00, 0x01, 0x00, // Usage (0x010031) - 0x0B, 0x32, 0x00, 0x01, 0x00, // Usage (0x010032) - 0x0B, 0x35, 0x00, 0x01, 0x00, // Usage (0x010035) - 0x15, 0x00, // Logical Minimum (0) - 0x27, 0xFF, 0xFF, 0x00, 0x00, // Logical Maximum (65534) - 0x75, 0x10, // Report Size (16) - 0x95, 0x04, // Report Count (4) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0xC0, // End Collection - 0x0B, 0x39, 0x00, 0x01, 0x00, // Usage (0x010039) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x07, // Logical Maximum (7) - 0x35, 0x00, // Physical Minimum (0) - 0x46, 0x3B, 0x01, // Physical Maximum (315) - 0x65, 0x14, // Unit (System: English Rotation, Length: - // Centimeter) - 0x75, 0x04, // Report Size (4) - 0x95, 0x01, // Report Count (1) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x05, 0x09, // Usage Page (Button) - 0x19, 0x0F, // Usage Minimum (0x0F) - 0x29, 0x12, // Usage Maximum (0x12) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x01, // Logical Maximum (1) - 0x75, 0x01, // Report Size (1) - 0x95, 0x04, // Report Count (4) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x75, 0x08, // Report Size (8) - 0x95, 0x34, // Report Count (52) - 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00) - 0x85, 0x21, // Report ID (33) - 0x09, 0x01, // Usage (0x01) - 0x75, 0x08, // Report Size (8) - 0x95, 0x3F, // Report Count (63) - 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x85, 0x81, // Report ID (-127) - 0x09, 0x02, // Usage (0x02) - 0x75, 0x08, // Report Size (8) - 0x95, 0x3F, // Report Count (63) - 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x85, 0x01, // Report ID (1) - 0x09, 0x03, // Usage (0x03) - 0x75, 0x08, // Report Size (8) - 0x95, 0x3F, // Report Count (63) - 0x91, 0x83, // Output (Const,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position, - // Volatile) - 0x85, 0x10, // Report ID (16) - 0x09, 0x04, // Usage (0x04) - 0x75, 0x08, // Report Size (8) - 0x95, 0x3F, // Report Count (63) - 0x91, 0x83, // Output (Const,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position, - // Volatile) - 0x85, 0x80, // Report ID (-128) - 0x09, 0x05, // Usage (0x05) - 0x75, 0x08, // Report Size (8) - 0x95, 0x3F, // Report Count (63) - 0x91, 0x83, // Output (Const,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position, - // Volatile) - 0x85, 0x82, // Report ID (-126) - 0x09, 0x06, // Usage (0x06) - 0x75, 0x08, // Report Size (8) - 0x95, 0x3F, // Report Count (63) - 0x91, 0x83, // Output (Const,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position, - // Volatile) - 0xC0, // End Collection -}; -const size_t kNintendoSwitchProControllerSize = - base::size(kNintendoSwitchProController); +// static +base::span<const uint8_t> +TestReportDescriptors::MicrosoftXboxAdaptiveControllerBluetooth() { + constexpr uint8_t kMicrosoftXboxAdaptiveController[] = { + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 0x09, 0x05, // Usage (Game Pad) + 0xA1, 0x01, // Collection (Application) + 0x85, 0x01, // Report ID (1) + 0x09, 0x01, // Usage (Pointer) + 0xA1, 0x00, // Collection (Physical) + 0x09, 0x30, // Usage (X) + 0x09, 0x31, // Usage (Y) + 0x15, 0x00, // Logical Minimum (0) + 0x27, 0xFF, 0xFF, 0x00, 0x00, // Logical Maximum (65534) + 0x95, 0x02, // Report Count (2) + 0x75, 0x10, // Report Size (16) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0xC0, // End Collection + 0x09, 0x01, // Usage (Pointer) + 0xA1, 0x00, // Collection (Physical) + 0x09, 0x32, // Usage (Z) + 0x09, 0x35, // Usage (Rz) + 0x15, 0x00, // Logical Minimum (0) + 0x27, 0xFF, 0xFF, 0x00, 0x00, // Logical Maximum (65534) + 0x95, 0x02, // Report Count (2) + 0x75, 0x10, // Report Size (16) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0xC0, // End Collection + 0x05, 0x02, // Usage Page (Sim Ctrls) + 0x09, 0xC5, // Usage (Brake) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x03, // Logical Maximum (1023) + 0x95, 0x01, // Report Count (1) + 0x75, 0x0A, // Report Size (10) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x00, // Logical Maximum (0) + 0x75, 0x06, // Report Size (6) + 0x95, 0x01, // Report Count (1) + 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x05, 0x02, // Usage Page (Sim Ctrls) + 0x09, 0xC4, // Usage (Accelerator) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x03, // Logical Maximum (1023) + 0x95, 0x01, // Report Count (1) + 0x75, 0x0A, // Report Size (10) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x00, // Logical Maximum (0) + 0x75, 0x06, // Report Size (6) + 0x95, 0x01, // Report Count (1) + 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 0x09, 0x39, // Usage (Hat switch) + 0x15, 0x01, // Logical Minimum (1) + 0x25, 0x08, // Logical Maximum (8) + 0x35, 0x00, // Physical Minimum (0) + 0x46, 0x3B, 0x01, // Physical Maximum (315) + 0x66, 0x14, 0x00, // Unit (System: English Rotation, + // Length: Centimeter) + 0x75, 0x04, // Report Size (4) + 0x95, 0x01, // Report Count (1) + 0x81, 0x42, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,Null State) + 0x75, 0x04, // Report Size (4) + 0x95, 0x01, // Report Count (1) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x00, // Logical Maximum (0) + 0x35, 0x00, // Physical Minimum (0) + 0x45, 0x00, // Physical Maximum (0) + 0x65, 0x00, // Unit (None) + 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x05, 0x09, // Usage Page (Button) + 0x19, 0x01, // Usage Minimum (0x01) + 0x29, 0x0F, // Usage Maximum (0x0F) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x75, 0x01, // Report Size (1) + 0x95, 0x0F, // Report Count (15) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x00, // Logical Maximum (0) + 0x75, 0x01, // Report Size (1) + 0x95, 0x01, // Report Count (1) + 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x05, 0x0C, // Usage Page (Consumer) + 0x0A, 0x24, 0x02, // Usage (AC Back) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x95, 0x01, // Report Count (1) + 0x75, 0x01, // Report Size (1) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x00, // Logical Maximum (0) + 0x75, 0x07, // Report Size (7) + 0x95, 0x01, // Report Count (1) + 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 0x09, 0x01, // Usage (Pointer) + 0xA1, 0x00, // Collection (Physical) + 0x09, 0x40, // Usage (Vx) + 0x09, 0x41, // Usage (Vy) + 0x15, 0x00, // Logical Minimum (0) + 0x27, 0xFF, 0xFF, 0x00, 0x00, // Logical Maximum (65534) + 0x95, 0x02, // Report Count (2) + 0x75, 0x10, // Report Size (16) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0xC0, // End Collection + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 0x09, 0x01, // Usage (Pointer) + 0xA1, 0x00, // Collection (Physical) + 0x09, 0x43, // Usage (Vbrx) + 0x09, 0x44, // Usage (Vbry) + 0x15, 0x00, // Logical Minimum (0) + 0x27, 0xFF, 0xFF, 0x00, 0x00, // Logical Maximum (65534) + 0x95, 0x02, // Report Count (2) + 0x75, 0x10, // Report Size (16) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0xC0, // End Collection + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 0x09, 0x42, // Usage (Vz) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x03, // Logical Maximum (1023) + 0x95, 0x01, // Report Count (1) + 0x75, 0x0A, // Report Size (10) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x00, // Logical Maximum (0) + 0x75, 0x06, // Report Size (6) + 0x95, 0x01, // Report Count (1) + 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 0x09, 0x45, // Usage (Vbrz) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x03, // Logical Maximum (1023) + 0x95, 0x01, // Report Count (1) + 0x75, 0x0A, // Report Size (10) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x00, // Logical Maximum (0) + 0x75, 0x06, // Report Size (6) + 0x95, 0x01, // Report Count (1) + 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 0x09, 0x37, // Usage (Dial) + 0x15, 0x01, // Logical Minimum (1) + 0x25, 0x08, // Logical Maximum (8) + 0x35, 0x00, // Physical Minimum (0) + 0x46, 0x3B, 0x01, // Physical Maximum (315) + 0x66, 0x14, 0x00, // Unit (System: English Rotation, + // Length: Centimeter) + 0x75, 0x04, // Report Size (4) + 0x95, 0x01, // Report Count (1) + 0x81, 0x42, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,Null State) + 0x75, 0x04, // Report Size (4) + 0x95, 0x01, // Report Count (1) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x00, // Logical Maximum (0) + 0x35, 0x00, // Physical Minimum (0) + 0x45, 0x00, // Physical Maximum (0) + 0x65, 0x00, // Unit (None) + 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x05, 0x09, // Usage Page (Button) + 0x19, 0x10, // Usage Minimum (0x10) + 0x29, 0x1E, // Usage Maximum (0x1E) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x75, 0x01, // Report Size (1) + 0x95, 0x0F, // Report Count (15) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x00, // Logical Maximum (0) + 0x75, 0x01, // Report Size (1) + 0x95, 0x01, // Report Count (1) + 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x05, 0x0C, // Usage Page (Consumer) + 0x0A, 0x82, 0x00, // Usage (Mode Step) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x95, 0x01, // Report Count (1) + 0x75, 0x01, // Report Size (1) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x00, // Logical Maximum (0) + 0x75, 0x07, // Report Size (7) + 0x95, 0x01, // Report Count (1) + 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x05, 0x0C, // Usage Page (Consumer) + 0x09, 0x01, // Usage (Consumer Control) + 0xA1, 0x01, // Collection (Application) + 0x0A, 0x81, 0x00, // Usage (Assign Selection) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x95, 0x01, // Report Count (1) + 0x75, 0x04, // Report Size (4) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x00, // Logical Maximum (0) + 0x95, 0x01, // Report Count (1) + 0x75, 0x04, // Report Size (4) + 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x0A, 0x84, 0x00, // Usage (Enter Channel) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x95, 0x01, // Report Count (1) + 0x75, 0x04, // Report Size (4) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x00, // Logical Maximum (0) + 0x95, 0x01, // Report Count (1) + 0x75, 0x04, // Report Size (4) + 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x0A, 0x85, 0x00, // Usage (Order Movie) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x95, 0x01, // Report Count (1) + 0x75, 0x08, // Report Size (8) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x0A, 0x99, 0x00, // Usage (Media Select Security) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x95, 0x01, // Report Count (1) + 0x75, 0x04, // Report Size (4) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x00, // Logical Maximum (0) + 0x95, 0x01, // Report Count (1) + 0x75, 0x04, // Report Size (4) + 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x0A, 0x9E, 0x00, // Usage (Media Select SAP) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x95, 0x01, // Report Count (1) + 0x75, 0x08, // Report Size (8) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x0A, 0xA1, 0x00, // Usage (Once) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x95, 0x01, // Report Count (1) + 0x75, 0x08, // Report Size (8) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x0A, 0xA2, 0x00, // Usage (Daily) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x95, 0x01, // Report Count (1) + 0x75, 0x08, // Report Size (8) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x0A, 0xA3, 0x00, // Usage (Weekly) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x95, 0x01, // Report Count (1) + 0x75, 0x08, // Report Size (8) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x0A, 0xA4, 0x00, // Usage (Monthly) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x95, 0x01, // Report Count (1) + 0x75, 0x08, // Report Size (8) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x0A, 0xB9, 0x00, // Usage (Random Play) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x95, 0x01, // Report Count (1) + 0x75, 0x08, // Report Size (8) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x0A, 0xBA, 0x00, // Usage (Select Disc) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x95, 0x01, // Report Count (1) + 0x75, 0x08, // Report Size (8) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x0A, 0xBB, 0x00, // Usage (Enter Disc) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x95, 0x01, // Report Count (1) + 0x75, 0x08, // Report Size (8) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x0A, 0xBE, 0x00, // Usage (Track Normal) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x95, 0x01, // Report Count (1) + 0x75, 0x08, // Report Size (8) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x0A, 0xC0, 0x00, // Usage (Frame Forward) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x95, 0x01, // Report Count (1) + 0x75, 0x08, // Report Size (8) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x0A, 0xC1, 0x00, // Usage (Frame Back) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x95, 0x01, // Report Count (1) + 0x75, 0x08, // Report Size (8) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x0A, 0xC2, 0x00, // Usage (Mark) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x95, 0x01, // Report Count (1) + 0x75, 0x08, // Report Size (8) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x0A, 0xC3, 0x00, // Usage (Clear Mark) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x95, 0x01, // Report Count (1) + 0x75, 0x08, // Report Size (8) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x0A, 0xC4, 0x00, // Usage (Repeat From Mark) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x95, 0x01, // Report Count (1) + 0x75, 0x08, // Report Size (8) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x0A, 0xC5, 0x00, // Usage (Return To Mark) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x95, 0x01, // Report Count (1) + 0x75, 0x08, // Report Size (8) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x0A, 0xC6, 0x00, // Usage (Search Mark Forward) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x95, 0x01, // Report Count (1) + 0x75, 0x08, // Report Size (8) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x0A, 0xC7, 0x00, // Usage (Search Mark Backwards) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x95, 0x01, // Report Count (1) + 0x75, 0x08, // Report Size (8) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x0A, 0xC8, 0x00, // Usage (Counter Reset) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x95, 0x01, // Report Count (1) + 0x75, 0x08, // Report Size (8) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0xC0, // End Collection + 0x05, 0x0C, // Usage Page (Consumer) + 0x09, 0x01, // Usage (Consumer Control) + 0x85, 0x02, // Report ID (2) + 0xA1, 0x01, // Collection (Application) + 0x05, 0x0C, // Usage Page (Consumer) + 0x0A, 0x23, 0x02, // Usage (AC Home) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x95, 0x01, // Report Count (1) + 0x75, 0x01, // Report Size (1) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x00, // Logical Maximum (0) + 0x75, 0x07, // Report Size (7) + 0x95, 0x01, // Report Count (1) + 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0xC0, // End Collection + 0x05, 0x0F, // Usage Page (PID Page) + 0x09, 0x21, // Usage (0x21) + 0x85, 0x03, // Report ID (3) + 0xA1, 0x02, // Collection (Logical) + 0x09, 0x97, // Usage (0x97) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x75, 0x04, // Report Size (4) + 0x95, 0x01, // Report Count (1) + 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position, + // Non-volatile) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x00, // Logical Maximum (0) + 0x75, 0x04, // Report Size (4) + 0x95, 0x01, // Report Count (1) + 0x91, 0x03, // Output (Const,Var,Abs,No Wrap, + // Linear,Preferred State,No Null + // Position,Non-volatile) + 0x09, 0x70, // Usage (0x70) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x64, // Logical Maximum (100) + 0x75, 0x08, // Report Size (8) + 0x95, 0x04, // Report Count (4) + 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position, + // Non-volatile) + 0x09, 0x50, // Usage (0x50) + 0x66, 0x01, 0x10, // Unit (System: SI Linear, Time: + // Seconds) + 0x55, 0x0E, // Unit Exponent (-2) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x75, 0x08, // Report Size (8) + 0x95, 0x01, // Report Count (1) + 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position, + // Non-volatile) + 0x09, 0xA7, // Usage (0xA7) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x75, 0x08, // Report Size (8) + 0x95, 0x01, // Report Count (1) + 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position, + // Non-volatile) + 0x65, 0x00, // Unit (None) + 0x55, 0x00, // Unit Exponent (0) + 0x09, 0x7C, // Usage (0x7C) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x75, 0x08, // Report Size (8) + 0x95, 0x01, // Report Count (1) + 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position, + // Non-volatile) + 0xC0, // End Collection + 0x05, 0x06, // Usage Page (Generic Dev Ctrls) + 0x09, 0x20, // Usage (Battery Strength) + 0x85, 0x04, // Report ID (4) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x75, 0x08, // Report Size (8) + 0x95, 0x01, // Report Count (1) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00) + 0x09, 0x01, // Usage (0x01) + 0xA1, 0x02, // Collection (Logical) + 0x85, 0x06, // Report ID (6) + 0x09, 0x01, // Usage (0x01) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x64, // Logical Maximum (100) + 0x75, 0x08, // Report Size (8) + 0x95, 0x01, // Report Count (1) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap, + // Linear,Preferred State,No Null + // Position,Non-volatile) + 0x09, 0x02, // Usage (0x02) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x64, // Logical Maximum (100) + 0x75, 0x08, // Report Size (8) + 0x95, 0x01, // Report Count (1) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap, + // Linear,Preferred State,No Null + // Position,Non-volatile) + 0x09, 0x03, // Usage (0x03) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x75, 0x08, // Report Size (8) + 0x95, 0x01, // Report Count (1) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap, + // Linear,Preferred State,No Null + // Position,Non-volatile) + 0x09, 0x04, // Usage (0x04) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x75, 0x08, // Report Size (8) + 0x95, 0x3C, // Report Count (60) + 0xB2, 0x02, 0x01, // Feature (Data,Var,Abs,No Wrap, + // Linear,Preferred State,No Null + // Position,Non-volatile,Buffered + // Bytes) + 0xC0, // End Collection + 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00) + 0x09, 0x02, // Usage (0x02) + 0xA1, 0x02, // Collection (Logical) + 0x85, 0x07, // Report ID (7) + 0x09, 0x05, // Usage (0x05) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x64, // Logical Maximum (100) + 0x75, 0x08, // Report Size (8) + 0x95, 0x01, // Report Count (1) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap, + // Linear,Preferred State,No Null + // Position,Non-volatile) + 0x09, 0x06, // Usage (0x06) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x64, // Logical Maximum (100) + 0x75, 0x08, // Report Size (8) + 0x95, 0x01, // Report Count (1) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap, + // Linear,Preferred State,No Null + // Position,Non-volatile) + 0x09, 0x07, // Usage (0x07) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x64, // Logical Maximum (100) + 0x75, 0x08, // Report Size (8) + 0x95, 0x01, // Report Count (1) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap, + // Linear,Preferred State,No Null + // Position,Non-volatile) + 0xC0, // End Collection + 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00) + 0x09, 0x03, // Usage (0x03) + 0xA1, 0x02, // Collection (Logical) + 0x85, 0x08, // Report ID (8) + 0x09, 0x08, // Usage (0x08) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x64, // Logical Maximum (100) + 0x75, 0x08, // Report Size (8) + 0x95, 0x01, // Report Count (1) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap, + // Linear,Preferred State,No Null + // Position,Non-volatile) + 0x09, 0x09, // Usage (0x09) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x64, // Logical Maximum (100) + 0x75, 0x08, // Report Size (8) + 0x95, 0x01, // Report Count (1) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap, + // Linear,Preferred State,No Null + // Position,Non-volatile) + 0x09, 0x0A, // Usage (0x0A) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x75, 0x08, // Report Size (8) + 0x95, 0x01, // Report Count (1) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap, + // Linear,Preferred State,No Null + // Position,Non-volatile) + 0xC0, // End Collection + 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00) + 0x09, 0x04, // Usage (0x04) + 0xA1, 0x01, // Collection (Application) + 0x85, 0x09, // Report ID (9) + 0x09, 0x0B, // Usage (0x0B) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x64, // Logical Maximum (100) + 0x75, 0x08, // Report Size (8) + 0x95, 0x01, // Report Count (1) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap, + // Linear,Preferred State,No Null + // Position,Non-volatile) + 0x09, 0x0C, // Usage (0x0C) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x64, // Logical Maximum (100) + 0x75, 0x08, // Report Size (8) + 0x95, 0x01, // Report Count (1) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap, + // Linear,Preferred State,No Null + // Position,Non-volatile) + 0x09, 0x0D, // Usage (0x0D) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x64, // Logical Maximum (100) + 0x75, 0x08, // Report Size (8) + 0x95, 0x01, // Report Count (1) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap, + // Linear,Preferred State,No Null + // Position,Non-volatile) + 0x09, 0x0E, // Usage (0x0E) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x75, 0x08, // Report Size (8) + 0x95, 0x01, // Report Count (1) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap, + // Linear,Preferred State,No Null + // Position,Non-volatile) + 0x09, 0x0F, // Usage (0x0F) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x75, 0x08, // Report Size (8) + 0x95, 0x3C, // Report Count (60) + 0xB2, 0x02, 0x01, // Feature (Data,Var,Abs,No Wrap, + // Linear,Preferred State,No Null + // Position,Non-volatile,Buffered + // Bytes) + 0xC0, // End Collection + 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00) + 0x09, 0x05, // Usage (0x05) + 0xA1, 0x01, // Collection (Application) + 0x85, 0x0A, // Report ID (10) + 0x09, 0x10, // Usage (0x10) + 0x15, 0x00, // Logical Minimum (0) + 0x27, 0xFF, 0xFF, 0xFF, 0x7F, // Logical Maximum (2147483646) + 0x75, 0x20, // Report Size (32) + 0x95, 0x01, // Report Count (1) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x09, 0x11, // Usage (0x11) + 0x15, 0x00, // Logical Minimum (0) + 0x27, 0xFF, 0xFF, 0xFF, 0x7F, // Logical Maximum (2147483646) + 0x75, 0x20, // Report Size (32) + 0x95, 0x01, // Report Count (1) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x09, 0x12, // Usage (0x12) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x75, 0x08, // Report Size (8) + 0x95, 0x02, // Report Count (2) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x09, 0x13, // Usage (0x13) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x75, 0x08, // Report Size (8) + 0x95, 0x01, // Report Count (1) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0xC0, // End Collection + 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00) + 0x09, 0x06, // Usage (0x06) + 0xA1, 0x02, // Collection (Logical) + 0x85, 0x0B, // Report ID (11) + 0x09, 0x14, // Usage (0x14) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x64, // Logical Maximum (100) + 0x75, 0x08, // Report Size (8) + 0x95, 0x01, // Report Count (1) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap, + // Linear,Preferred State,No Null + // Position,Non-volatile) + 0xC0, // End Collection + 0xC0, // End Collection + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 0x09, 0x06, // Usage (Keyboard) + 0xA1, 0x01, // Collection (Application) + 0x85, 0x05, // Report ID (5) + 0x05, 0x07, // Usage Page (Kbrd/Keypad) + 0x19, 0xE0, // Usage Minimum (0xE0) + 0x29, 0xE7, // Usage Maximum (0xE7) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x75, 0x01, // Report Size (1) + 0x95, 0x08, // Report Count (8) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x95, 0x01, // Report Count (1) + 0x75, 0x08, // Report Size (8) + 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0x95, 0x06, // Report Count (6) + 0x75, 0x08, // Report Size (8) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x65, // Logical Maximum (101) + 0x05, 0x07, // Usage Page (Kbrd/Keypad) + 0x19, 0x00, // Usage Minimum (0x00) + 0x29, 0x65, // Usage Maximum (0x65) + 0x81, 0x00, // Input (Data,Array,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0xC0, // End Collection + 0x00, // Unknown (bTag: 0x00, bType: 0x00) + }; + return base::make_span(kMicrosoftXboxAdaptiveController); +} -const uint8_t kMicrosoftXboxAdaptiveController[] = { - 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) - 0x09, 0x05, // Usage (Game Pad) - 0xA1, 0x01, // Collection (Application) - 0x85, 0x01, // Report ID (1) - 0x09, 0x01, // Usage (Pointer) - 0xA1, 0x00, // Collection (Physical) - 0x09, 0x30, // Usage (X) - 0x09, 0x31, // Usage (Y) - 0x15, 0x00, // Logical Minimum (0) - 0x27, 0xFF, 0xFF, 0x00, 0x00, // Logical Maximum (65534) - 0x95, 0x02, // Report Count (2) - 0x75, 0x10, // Report Size (16) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0xC0, // End Collection - 0x09, 0x01, // Usage (Pointer) - 0xA1, 0x00, // Collection (Physical) - 0x09, 0x32, // Usage (Z) - 0x09, 0x35, // Usage (Rz) - 0x15, 0x00, // Logical Minimum (0) - 0x27, 0xFF, 0xFF, 0x00, 0x00, // Logical Maximum (65534) - 0x95, 0x02, // Report Count (2) - 0x75, 0x10, // Report Size (16) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0xC0, // End Collection - 0x05, 0x02, // Usage Page (Sim Ctrls) - 0x09, 0xC5, // Usage (Brake) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x03, // Logical Maximum (1023) - 0x95, 0x01, // Report Count (1) - 0x75, 0x0A, // Report Size (10) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x00, // Logical Maximum (0) - 0x75, 0x06, // Report Size (6) - 0x95, 0x01, // Report Count (1) - 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x05, 0x02, // Usage Page (Sim Ctrls) - 0x09, 0xC4, // Usage (Accelerator) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x03, // Logical Maximum (1023) - 0x95, 0x01, // Report Count (1) - 0x75, 0x0A, // Report Size (10) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x00, // Logical Maximum (0) - 0x75, 0x06, // Report Size (6) - 0x95, 0x01, // Report Count (1) - 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) - 0x09, 0x39, // Usage (Hat switch) - 0x15, 0x01, // Logical Minimum (1) - 0x25, 0x08, // Logical Maximum (8) - 0x35, 0x00, // Physical Minimum (0) - 0x46, 0x3B, 0x01, // Physical Maximum (315) - 0x66, 0x14, 0x00, // Unit (System: English Rotation, Length: - // Centimeter) - 0x75, 0x04, // Report Size (4) - 0x95, 0x01, // Report Count (1) - 0x81, 0x42, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,Null State) - 0x75, 0x04, // Report Size (4) - 0x95, 0x01, // Report Count (1) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x00, // Logical Maximum (0) - 0x35, 0x00, // Physical Minimum (0) - 0x45, 0x00, // Physical Maximum (0) - 0x65, 0x00, // Unit (None) - 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x05, 0x09, // Usage Page (Button) - 0x19, 0x01, // Usage Minimum (0x01) - 0x29, 0x0F, // Usage Maximum (0x0F) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x01, // Logical Maximum (1) - 0x75, 0x01, // Report Size (1) - 0x95, 0x0F, // Report Count (15) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x00, // Logical Maximum (0) - 0x75, 0x01, // Report Size (1) - 0x95, 0x01, // Report Count (1) - 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x05, 0x0C, // Usage Page (Consumer) - 0x0A, 0x24, 0x02, // Usage (AC Back) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x01, // Logical Maximum (1) - 0x95, 0x01, // Report Count (1) - 0x75, 0x01, // Report Size (1) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x00, // Logical Maximum (0) - 0x75, 0x07, // Report Size (7) - 0x95, 0x01, // Report Count (1) - 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) - 0x09, 0x01, // Usage (Pointer) - 0xA1, 0x00, // Collection (Physical) - 0x09, 0x40, // Usage (Vx) - 0x09, 0x41, // Usage (Vy) - 0x15, 0x00, // Logical Minimum (0) - 0x27, 0xFF, 0xFF, 0x00, 0x00, // Logical Maximum (65534) - 0x95, 0x02, // Report Count (2) - 0x75, 0x10, // Report Size (16) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0xC0, // End Collection - 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) - 0x09, 0x01, // Usage (Pointer) - 0xA1, 0x00, // Collection (Physical) - 0x09, 0x43, // Usage (Vbrx) - 0x09, 0x44, // Usage (Vbry) - 0x15, 0x00, // Logical Minimum (0) - 0x27, 0xFF, 0xFF, 0x00, 0x00, // Logical Maximum (65534) - 0x95, 0x02, // Report Count (2) - 0x75, 0x10, // Report Size (16) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0xC0, // End Collection - 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) - 0x09, 0x42, // Usage (Vz) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x03, // Logical Maximum (1023) - 0x95, 0x01, // Report Count (1) - 0x75, 0x0A, // Report Size (10) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x00, // Logical Maximum (0) - 0x75, 0x06, // Report Size (6) - 0x95, 0x01, // Report Count (1) - 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) - 0x09, 0x45, // Usage (Vbrz) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x03, // Logical Maximum (1023) - 0x95, 0x01, // Report Count (1) - 0x75, 0x0A, // Report Size (10) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x00, // Logical Maximum (0) - 0x75, 0x06, // Report Size (6) - 0x95, 0x01, // Report Count (1) - 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) - 0x09, 0x37, // Usage (Dial) - 0x15, 0x01, // Logical Minimum (1) - 0x25, 0x08, // Logical Maximum (8) - 0x35, 0x00, // Physical Minimum (0) - 0x46, 0x3B, 0x01, // Physical Maximum (315) - 0x66, 0x14, 0x00, // Unit (System: English Rotation, Length: - // Centimeter) - 0x75, 0x04, // Report Size (4) - 0x95, 0x01, // Report Count (1) - 0x81, 0x42, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,Null State) - 0x75, 0x04, // Report Size (4) - 0x95, 0x01, // Report Count (1) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x00, // Logical Maximum (0) - 0x35, 0x00, // Physical Minimum (0) - 0x45, 0x00, // Physical Maximum (0) - 0x65, 0x00, // Unit (None) - 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x05, 0x09, // Usage Page (Button) - 0x19, 0x10, // Usage Minimum (0x10) - 0x29, 0x1E, // Usage Maximum (0x1E) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x01, // Logical Maximum (1) - 0x75, 0x01, // Report Size (1) - 0x95, 0x0F, // Report Count (15) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x00, // Logical Maximum (0) - 0x75, 0x01, // Report Size (1) - 0x95, 0x01, // Report Count (1) - 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x05, 0x0C, // Usage Page (Consumer) - 0x0A, 0x82, 0x00, // Usage (Mode Step) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x01, // Logical Maximum (1) - 0x95, 0x01, // Report Count (1) - 0x75, 0x01, // Report Size (1) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x00, // Logical Maximum (0) - 0x75, 0x07, // Report Size (7) - 0x95, 0x01, // Report Count (1) - 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x05, 0x0C, // Usage Page (Consumer) - 0x09, 0x01, // Usage (Consumer Control) - 0xA1, 0x01, // Collection (Application) - 0x0A, 0x81, 0x00, // Usage (Assign Selection) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x95, 0x01, // Report Count (1) - 0x75, 0x04, // Report Size (4) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x00, // Logical Maximum (0) - 0x95, 0x01, // Report Count (1) - 0x75, 0x04, // Report Size (4) - 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x0A, 0x84, 0x00, // Usage (Enter Channel) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x95, 0x01, // Report Count (1) - 0x75, 0x04, // Report Size (4) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x00, // Logical Maximum (0) - 0x95, 0x01, // Report Count (1) - 0x75, 0x04, // Report Size (4) - 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x0A, 0x85, 0x00, // Usage (Order Movie) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x95, 0x01, // Report Count (1) - 0x75, 0x08, // Report Size (8) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x0A, 0x99, 0x00, // Usage (Media Select Security) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x95, 0x01, // Report Count (1) - 0x75, 0x04, // Report Size (4) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x00, // Logical Maximum (0) - 0x95, 0x01, // Report Count (1) - 0x75, 0x04, // Report Size (4) - 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x0A, 0x9E, 0x00, // Usage (Media Select SAP) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x95, 0x01, // Report Count (1) - 0x75, 0x08, // Report Size (8) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x0A, 0xA1, 0x00, // Usage (Once) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x95, 0x01, // Report Count (1) - 0x75, 0x08, // Report Size (8) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x0A, 0xA2, 0x00, // Usage (Daily) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x95, 0x01, // Report Count (1) - 0x75, 0x08, // Report Size (8) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x0A, 0xA3, 0x00, // Usage (Weekly) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x95, 0x01, // Report Count (1) - 0x75, 0x08, // Report Size (8) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x0A, 0xA4, 0x00, // Usage (Monthly) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x95, 0x01, // Report Count (1) - 0x75, 0x08, // Report Size (8) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x0A, 0xB9, 0x00, // Usage (Random Play) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x95, 0x01, // Report Count (1) - 0x75, 0x08, // Report Size (8) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x0A, 0xBA, 0x00, // Usage (Select Disc) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x95, 0x01, // Report Count (1) - 0x75, 0x08, // Report Size (8) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x0A, 0xBB, 0x00, // Usage (Enter Disc) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x95, 0x01, // Report Count (1) - 0x75, 0x08, // Report Size (8) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x0A, 0xBE, 0x00, // Usage (Track Normal) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x95, 0x01, // Report Count (1) - 0x75, 0x08, // Report Size (8) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x0A, 0xC0, 0x00, // Usage (Frame Forward) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x95, 0x01, // Report Count (1) - 0x75, 0x08, // Report Size (8) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x0A, 0xC1, 0x00, // Usage (Frame Back) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x95, 0x01, // Report Count (1) - 0x75, 0x08, // Report Size (8) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x0A, 0xC2, 0x00, // Usage (Mark) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x95, 0x01, // Report Count (1) - 0x75, 0x08, // Report Size (8) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x0A, 0xC3, 0x00, // Usage (Clear Mark) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x95, 0x01, // Report Count (1) - 0x75, 0x08, // Report Size (8) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x0A, 0xC4, 0x00, // Usage (Repeat From Mark) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x95, 0x01, // Report Count (1) - 0x75, 0x08, // Report Size (8) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x0A, 0xC5, 0x00, // Usage (Return To Mark) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x95, 0x01, // Report Count (1) - 0x75, 0x08, // Report Size (8) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x0A, 0xC6, 0x00, // Usage (Search Mark Forward) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x95, 0x01, // Report Count (1) - 0x75, 0x08, // Report Size (8) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x0A, 0xC7, 0x00, // Usage (Search Mark Backwards) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x95, 0x01, // Report Count (1) - 0x75, 0x08, // Report Size (8) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x0A, 0xC8, 0x00, // Usage (Counter Reset) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x95, 0x01, // Report Count (1) - 0x75, 0x08, // Report Size (8) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0xC0, // End Collection - 0x05, 0x0C, // Usage Page (Consumer) - 0x09, 0x01, // Usage (Consumer Control) - 0x85, 0x02, // Report ID (2) - 0xA1, 0x01, // Collection (Application) - 0x05, 0x0C, // Usage Page (Consumer) - 0x0A, 0x23, 0x02, // Usage (AC Home) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x01, // Logical Maximum (1) - 0x95, 0x01, // Report Count (1) - 0x75, 0x01, // Report Size (1) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x00, // Logical Maximum (0) - 0x75, 0x07, // Report Size (7) - 0x95, 0x01, // Report Count (1) - 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0xC0, // End Collection - 0x05, 0x0F, // Usage Page (PID Page) - 0x09, 0x21, // Usage (0x21) - 0x85, 0x03, // Report ID (3) - 0xA1, 0x02, // Collection (Logical) - 0x09, 0x97, // Usage (0x97) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x01, // Logical Maximum (1) - 0x75, 0x04, // Report Size (4) - 0x95, 0x01, // Report Count (1) - 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position, - // Non-volatile) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x00, // Logical Maximum (0) - 0x75, 0x04, // Report Size (4) - 0x95, 0x01, // Report Count (1) - 0x91, 0x03, // Output (Const,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position, - // Non-volatile) - 0x09, 0x70, // Usage (0x70) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x64, // Logical Maximum (100) - 0x75, 0x08, // Report Size (8) - 0x95, 0x04, // Report Count (4) - 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position, - // Non-volatile) - 0x09, 0x50, // Usage (0x50) - 0x66, 0x01, 0x10, // Unit (System: SI Linear, Time: - // Seconds) - 0x55, 0x0E, // Unit Exponent (-2) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x75, 0x08, // Report Size (8) - 0x95, 0x01, // Report Count (1) - 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position, - // Non-volatile) - 0x09, 0xA7, // Usage (0xA7) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x75, 0x08, // Report Size (8) - 0x95, 0x01, // Report Count (1) - 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position, - // Non-volatile) - 0x65, 0x00, // Unit (None) - 0x55, 0x00, // Unit Exponent (0) - 0x09, 0x7C, // Usage (0x7C) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x75, 0x08, // Report Size (8) - 0x95, 0x01, // Report Count (1) - 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position, - // Non-volatile) - 0xC0, // End Collection - 0x05, 0x06, // Usage Page (Generic Dev Ctrls) - 0x09, 0x20, // Usage (Battery Strength) - 0x85, 0x04, // Report ID (4) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x75, 0x08, // Report Size (8) - 0x95, 0x01, // Report Count (1) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00) - 0x09, 0x01, // Usage (0x01) - 0xA1, 0x02, // Collection (Logical) - 0x85, 0x06, // Report ID (6) - 0x09, 0x01, // Usage (0x01) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x64, // Logical Maximum (100) - 0x75, 0x08, // Report Size (8) - 0x95, 0x01, // Report Count (1) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position, - // Non-volatile) - 0x09, 0x02, // Usage (0x02) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x64, // Logical Maximum (100) - 0x75, 0x08, // Report Size (8) - 0x95, 0x01, // Report Count (1) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position, - // Non-volatile) - 0x09, 0x03, // Usage (0x03) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x75, 0x08, // Report Size (8) - 0x95, 0x01, // Report Count (1) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position, - // Non-volatile) - 0x09, 0x04, // Usage (0x04) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x75, 0x08, // Report Size (8) - 0x95, 0x3C, // Report Count (60) - 0xB2, 0x02, 0x01, // Feature (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position, - // Non-volatile,Buffered Bytes) - 0xC0, // End Collection - 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00) - 0x09, 0x02, // Usage (0x02) - 0xA1, 0x02, // Collection (Logical) - 0x85, 0x07, // Report ID (7) - 0x09, 0x05, // Usage (0x05) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x64, // Logical Maximum (100) - 0x75, 0x08, // Report Size (8) - 0x95, 0x01, // Report Count (1) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position, - // Non-volatile) - 0x09, 0x06, // Usage (0x06) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x64, // Logical Maximum (100) - 0x75, 0x08, // Report Size (8) - 0x95, 0x01, // Report Count (1) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position, - // Non-volatile) - 0x09, 0x07, // Usage (0x07) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x64, // Logical Maximum (100) - 0x75, 0x08, // Report Size (8) - 0x95, 0x01, // Report Count (1) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position, - // Non-volatile) - 0xC0, // End Collection - 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00) - 0x09, 0x03, // Usage (0x03) - 0xA1, 0x02, // Collection (Logical) - 0x85, 0x08, // Report ID (8) - 0x09, 0x08, // Usage (0x08) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x64, // Logical Maximum (100) - 0x75, 0x08, // Report Size (8) - 0x95, 0x01, // Report Count (1) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position, - // Non-volatile) - 0x09, 0x09, // Usage (0x09) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x64, // Logical Maximum (100) - 0x75, 0x08, // Report Size (8) - 0x95, 0x01, // Report Count (1) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position, - // Non-volatile) - 0x09, 0x0A, // Usage (0x0A) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x75, 0x08, // Report Size (8) - 0x95, 0x01, // Report Count (1) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position, - // Non-volatile) - 0xC0, // End Collection - 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00) - 0x09, 0x04, // Usage (0x04) - 0xA1, 0x01, // Collection (Application) - 0x85, 0x09, // Report ID (9) - 0x09, 0x0B, // Usage (0x0B) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x64, // Logical Maximum (100) - 0x75, 0x08, // Report Size (8) - 0x95, 0x01, // Report Count (1) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position, - // Non-volatile) - 0x09, 0x0C, // Usage (0x0C) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x64, // Logical Maximum (100) - 0x75, 0x08, // Report Size (8) - 0x95, 0x01, // Report Count (1) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position, - // Non-volatile) - 0x09, 0x0D, // Usage (0x0D) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x64, // Logical Maximum (100) - 0x75, 0x08, // Report Size (8) - 0x95, 0x01, // Report Count (1) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position, - // Non-volatile) - 0x09, 0x0E, // Usage (0x0E) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x75, 0x08, // Report Size (8) - 0x95, 0x01, // Report Count (1) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position, - // Non-volatile) - 0x09, 0x0F, // Usage (0x0F) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x75, 0x08, // Report Size (8) - 0x95, 0x3C, // Report Count (60) - 0xB2, 0x02, 0x01, // Feature (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position, - // Non-volatile,Buffered Bytes) - 0xC0, // End Collection - 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00) - 0x09, 0x05, // Usage (0x05) - 0xA1, 0x01, // Collection (Application) - 0x85, 0x0A, // Report ID (10) - 0x09, 0x10, // Usage (0x10) - 0x15, 0x00, // Logical Minimum (0) - 0x27, 0xFF, 0xFF, 0xFF, 0x7F, // Logical Maximum (2147483646) - 0x75, 0x20, // Report Size (32) - 0x95, 0x01, // Report Count (1) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x09, 0x11, // Usage (0x11) - 0x15, 0x00, // Logical Minimum (0) - 0x27, 0xFF, 0xFF, 0xFF, 0x7F, // Logical Maximum (2147483646) - 0x75, 0x20, // Report Size (32) - 0x95, 0x01, // Report Count (1) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x09, 0x12, // Usage (0x12) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x75, 0x08, // Report Size (8) - 0x95, 0x02, // Report Count (2) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x09, 0x13, // Usage (0x13) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x75, 0x08, // Report Size (8) - 0x95, 0x01, // Report Count (1) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0xC0, // End Collection - 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00) - 0x09, 0x06, // Usage (0x06) - 0xA1, 0x02, // Collection (Logical) - 0x85, 0x0B, // Report ID (11) - 0x09, 0x14, // Usage (0x14) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x64, // Logical Maximum (100) - 0x75, 0x08, // Report Size (8) - 0x95, 0x01, // Report Count (1) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position, - // Non-volatile) - 0xC0, // End Collection - 0xC0, // End Collection - 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) - 0x09, 0x06, // Usage (Keyboard) - 0xA1, 0x01, // Collection (Application) - 0x85, 0x05, // Report ID (5) - 0x05, 0x07, // Usage Page (Kbrd/Keypad) - 0x19, 0xE0, // Usage Minimum (0xE0) - 0x29, 0xE7, // Usage Maximum (0xE7) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x01, // Logical Maximum (1) - 0x75, 0x01, // Report Size (1) - 0x95, 0x08, // Report Count (8) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x95, 0x01, // Report Count (1) - 0x75, 0x08, // Report Size (8) - 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0x95, 0x06, // Report Count (6) - 0x75, 0x08, // Report Size (8) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x65, // Logical Maximum (101) - 0x05, 0x07, // Usage Page (Kbrd/Keypad) - 0x19, 0x00, // Usage Minimum (0x00) - 0x29, 0x65, // Usage Maximum (0x65) - 0x81, 0x00, // Input (Data,Array,Abs,No Wrap,Linear, - // Preferred State,No Null Position) - 0xC0, // End Collection - 0x00, // Unknown (bTag: 0x00, bType: 0x00) -}; -const size_t kMicrosoftXboxAdaptiveControllerSize = - base::size(kMicrosoftXboxAdaptiveController); +// static +base::span<const uint8_t> TestReportDescriptors::NexusPlayerController() { + constexpr uint8_t kNexusPlayerController[] = { + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 0x09, 0x05, // Usage (Game Pad) + 0xA1, 0x01, // Collection (Application) + 0x85, 0x01, // Report ID (1) + 0x05, 0x09, // Usage Page (Button) + 0x0A, 0x01, 0x00, // Usage (0x01) + 0x0A, 0x02, 0x00, // Usage (0x02) + 0x0A, 0x04, 0x00, // Usage (0x04) + 0x0A, 0x05, 0x00, // Usage (0x05) + 0x0A, 0x07, 0x00, // Usage (0x07) + 0x0A, 0x08, 0x00, // Usage (0x08) + 0x0A, 0x0E, 0x00, // Usage (0x0E) + 0x0A, 0x0F, 0x00, // Usage (0x0F) + 0x0A, 0x0D, 0x00, // Usage (0x0D) + 0x05, 0x0C, // Usage Page (Consumer) + 0x0A, 0x24, 0x02, // Usage (AC Back) + 0x0A, 0x23, 0x02, // Usage (AC Home) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x75, 0x01, // Report Size (1) + 0x95, 0x0B, // Report Count (11) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position) + 0x75, 0x01, // Report Size (1) + 0x95, 0x01, // Report Count (1) + 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position) + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 0x75, 0x04, // Report Size (4) + 0x95, 0x01, // Report Count (1) + 0x25, 0x07, // Logical Maximum (7) + 0x46, 0x3B, 0x01, // Physical Maximum (315) + 0x66, 0x14, 0x00, // Unit (System: English Rotation, Length: + // Centimeter) + 0x09, 0x39, // Usage (Hat switch) + 0x81, 0x42, // Input (Data,Var,Abs,No Wrap,Linear,Preferred + // State,Null State) + 0x66, 0x00, 0x00, // Unit (None) + 0xA1, 0x00, // Collection (Physical) + 0x09, 0x30, // Usage (X) + 0x09, 0x31, // Usage (Y) + 0x09, 0x32, // Usage (Z) + 0x09, 0x35, // Usage (Rz) + 0x05, 0x02, // Usage Page (Sim Ctrls) + 0x09, 0xC5, // Usage (Brake) + 0x09, 0xC4, // Usage (Accelerator) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x35, 0x00, // Physical Minimum (0) + 0x46, 0xFF, 0x00, // Physical Maximum (255) + 0x75, 0x08, // Report Size (8) + 0x95, 0x06, // Report Count (6) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position) + 0xC0, // End Collection + 0x85, 0x02, // Report ID (2) + 0x05, 0x08, // Usage Page (LEDs) + 0x0A, 0x01, 0x00, // Usage (Num Lock) + 0x0A, 0x02, 0x00, // Usage (Caps Lock) + 0x0A, 0x03, 0x00, // Usage (Scroll Lock) + 0x0A, 0x04, 0x00, // Usage (Compose) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x75, 0x01, // Report Size (1) + 0x95, 0x04, // Report Count (4) + 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x75, 0x04, // Report Size (4) + 0x95, 0x01, // Report Count (1) + 0x91, 0x03, // Output (Const,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0xC0, // End Collection + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 0x09, 0x05, // Usage (Game Pad) + 0xA1, 0x01, // Collection (Application) + 0x85, 0x03, // Report ID (3) + 0x05, 0x06, // Usage Page (Generic Dev Ctrls) + 0x09, 0x20, // Usage (Battery Strength) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x75, 0x08, // Report Size (8) + 0x95, 0x01, // Report Count (1) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position) + 0x06, 0xBC, 0xFF, // Usage Page (Vendor Defined 0xFFBC) + 0x0A, 0xAD, 0xBD, // Usage (0xBDAD) + 0x75, 0x08, // Report Size (8) + 0x95, 0x06, // Report Count (6) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position) + 0xC0, // End Collection + 0x00, // Unknown (bTag: 0x00, bType: 0x00) + }; + return base::make_span(kNexusPlayerController); +} -const uint8_t kNexusPlayerController[] = { - 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) - 0x09, 0x05, // Usage (Game Pad) - 0xA1, 0x01, // Collection (Application) - 0x85, 0x01, // Report ID (1) - 0x05, 0x09, // Usage Page (Button) - 0x0A, 0x01, 0x00, // Usage (0x01) - 0x0A, 0x02, 0x00, // Usage (0x02) - 0x0A, 0x04, 0x00, // Usage (0x04) - 0x0A, 0x05, 0x00, // Usage (0x05) - 0x0A, 0x07, 0x00, // Usage (0x07) - 0x0A, 0x08, 0x00, // Usage (0x08) - 0x0A, 0x0E, 0x00, // Usage (0x0E) - 0x0A, 0x0F, 0x00, // Usage (0x0F) - 0x0A, 0x0D, 0x00, // Usage (0x0D) - 0x05, 0x0C, // Usage Page (Consumer) - 0x0A, 0x24, 0x02, // Usage (AC Back) - 0x0A, 0x23, 0x02, // Usage (AC Home) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x01, // Logical Maximum (1) - 0x75, 0x01, // Report Size (1) - 0x95, 0x0B, // Report Count (11) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State, - // No Null Position) - 0x75, 0x01, // Report Size (1) - 0x95, 0x01, // Report Count (1) - 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear,Preferred State, - // No Null Position) - 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) - 0x75, 0x04, // Report Size (4) - 0x95, 0x01, // Report Count (1) - 0x25, 0x07, // Logical Maximum (7) - 0x46, 0x3B, 0x01, // Physical Maximum (315) - 0x66, 0x14, 0x00, // Unit (System: English Rotation, Length: Centimeter) - 0x09, 0x39, // Usage (Hat switch) - 0x81, 0x42, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State, - // Null State) - 0x66, 0x00, 0x00, // Unit (None) - 0xA1, 0x00, // Collection (Physical) - 0x09, 0x30, // Usage (X) - 0x09, 0x31, // Usage (Y) - 0x09, 0x32, // Usage (Z) - 0x09, 0x35, // Usage (Rz) - 0x05, 0x02, // Usage Page (Sim Ctrls) - 0x09, 0xC5, // Usage (Brake) - 0x09, 0xC4, // Usage (Accelerator) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x35, 0x00, // Physical Minimum (0) - 0x46, 0xFF, 0x00, // Physical Maximum (255) - 0x75, 0x08, // Report Size (8) - 0x95, 0x06, // Report Count (6) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position) - 0xC0, // End Collection - 0x85, 0x02, // Report ID (2) - 0x05, 0x08, // Usage Page (LEDs) - 0x0A, 0x01, 0x00, // Usage (Num Lock) - 0x0A, 0x02, 0x00, // Usage (Caps Lock) - 0x0A, 0x03, 0x00, // Usage (Scroll Lock) - 0x0A, 0x04, 0x00, // Usage (Compose) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x01, // Logical Maximum (1) - 0x75, 0x01, // Report Size (1) - 0x95, 0x04, // Report Count (4) - 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear,Preferred State, - // No Null Position,Non-volatile) - 0x75, 0x04, // Report Size (4) - 0x95, 0x01, // Report Count (1) - 0x91, 0x03, // Output (Const,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0xC0, // End Collection - 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) - 0x09, 0x05, // Usage (Game Pad) - 0xA1, 0x01, // Collection (Application) - 0x85, 0x03, // Report ID (3) - 0x05, 0x06, // Usage Page (Generic Dev Ctrls) - 0x09, 0x20, // Usage (Battery Strength) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x75, 0x08, // Report Size (8) - 0x95, 0x01, // Report Count (1) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State, - // No Null Position) - 0x06, 0xBC, 0xFF, // Usage Page (Vendor Defined 0xFFBC) - 0x0A, 0xAD, 0xBD, // Usage (0xBDAD) - 0x75, 0x08, // Report Size (8) - 0x95, 0x06, // Report Count (6) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State, - // No Null Position) - 0xC0, // End Collection - 0x00, // Unknown (bTag: 0x00, bType: 0x00) -}; -const size_t kNexusPlayerControllerSize = base::size(kNexusPlayerController); +// static +base::span<const uint8_t> TestReportDescriptors::SteamControllerKeyboard() { + constexpr uint8_t kSteamControllerKeyboard[] = { + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 0x09, 0x06, // Usage (Keyboard) + 0x95, 0x01, // Report Count (1) + 0xA1, 0x01, // Collection (Application) + 0x05, 0x07, // Usage Page (Kbrd/Keypad) + 0x19, 0xE0, // Usage Minimum (0xE0) + 0x29, 0xE7, // Usage Maximum (0xE7) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x75, 0x01, // Report Size (1) + 0x95, 0x08, // Report Count (8) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State, + // No Null Position) + 0x95, 0x01, // Report Count (1) + 0x75, 0x08, // Report Size (8) + 0x81, 0x01, // Input (Const,Array,Abs,No Wrap,Linear,Preferred + // State,No Null Position) + 0x95, 0x05, // Report Count (5) + 0x75, 0x01, // Report Size (1) + 0x05, 0x08, // Usage Page (LEDs) + 0x19, 0x01, // Usage Minimum (Num Lock) + 0x29, 0x05, // Usage Maximum (Kana) + 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear,Preferred State, + // No Null Position,Non-volatile) + 0x95, 0x01, // Report Count (1) + 0x75, 0x03, // Report Size (3) + 0x91, 0x01, // Output (Const,Array,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x95, 0x06, // Report Count (6) + 0x75, 0x08, // Report Size (8) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x65, // Logical Maximum (101) + 0x05, 0x07, // Usage Page (Kbrd/Keypad) + 0x19, 0x00, // Usage Minimum (0x00) + 0x29, 0x65, // Usage Maximum (0x65) + 0x81, 0x00, // Input (Data,Array,Abs,No Wrap,Linear,Preferred + // State,No Null Position) + 0xC0, // End Collection + }; + return base::make_span(kSteamControllerKeyboard); +} -const uint8_t kSteamControllerKeyboard[] = { - 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) - 0x09, 0x06, // Usage (Keyboard) - 0x95, 0x01, // Report Count (1) - 0xA1, 0x01, // Collection (Application) - 0x05, 0x07, // Usage Page (Kbrd/Keypad) - 0x19, 0xE0, // Usage Minimum (0xE0) - 0x29, 0xE7, // Usage Maximum (0xE7) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x01, // Logical Maximum (1) - 0x75, 0x01, // Report Size (1) - 0x95, 0x08, // Report Count (8) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State, - // No Null Position) - 0x95, 0x01, // Report Count (1) - 0x75, 0x08, // Report Size (8) - 0x81, 0x01, // Input (Const,Array,Abs,No Wrap,Linear,Preferred - // State,No Null Position) - 0x95, 0x05, // Report Count (5) - 0x75, 0x01, // Report Size (1) - 0x05, 0x08, // Usage Page (LEDs) - 0x19, 0x01, // Usage Minimum (Num Lock) - 0x29, 0x05, // Usage Maximum (Kana) - 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear,Preferred State, - // No Null Position,Non-volatile) - 0x95, 0x01, // Report Count (1) - 0x75, 0x03, // Report Size (3) - 0x91, 0x01, // Output (Const,Array,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x95, 0x06, // Report Count (6) - 0x75, 0x08, // Report Size (8) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x65, // Logical Maximum (101) - 0x05, 0x07, // Usage Page (Kbrd/Keypad) - 0x19, 0x00, // Usage Minimum (0x00) - 0x29, 0x65, // Usage Maximum (0x65) - 0x81, 0x00, // Input (Data,Array,Abs,No Wrap,Linear,Preferred - // State,No Null Position) - 0xC0, // End Collection -}; -const size_t kSteamControllerKeyboardSize = - base::size(kSteamControllerKeyboard); +// static +base::span<const uint8_t> TestReportDescriptors::SteamControllerMouse() { + constexpr uint8_t kSteamControllerMouse[] = { + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 0x09, 0x02, // Usage (Mouse) + 0xA1, 0x01, // Collection (Application) + 0x09, 0x01, // Usage (Pointer) + 0xA1, 0x00, // Collection (Physical) + 0x05, 0x09, // Usage Page (Button) + 0x19, 0x01, // Usage Minimum (0x01) + 0x29, 0x05, // Usage Maximum (0x05) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x95, 0x05, // Report Count (5) + 0x75, 0x01, // Report Size (1) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position) + 0x95, 0x01, // Report Count (1) + 0x75, 0x03, // Report Size (3) + 0x81, 0x01, // Input (Const,Array,Abs,No Wrap,Linear,Preferred + // State,No Null Position) + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 0x09, 0x30, // Usage (X) + 0x09, 0x31, // Usage (Y) + 0x09, 0x38, // Usage (Wheel) + 0x15, 0x81, // Logical Minimum (-127) + 0x25, 0x7F, // Logical Maximum (127) + 0x75, 0x08, // Report Size (8) + 0x95, 0x03, // Report Count (3) + 0x81, 0x06, // Input (Data,Var,Rel,No Wrap,Linear,Preferred + // State,No Null Position) + 0xC0, // End Collection + 0xC0, // End Collection + }; + return base::make_span(kSteamControllerMouse); +} -const uint8_t kSteamControllerMouse[] = { - 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) - 0x09, 0x02, // Usage (Mouse) - 0xA1, 0x01, // Collection (Application) - 0x09, 0x01, // Usage (Pointer) - 0xA1, 0x00, // Collection (Physical) - 0x05, 0x09, // Usage Page (Button) - 0x19, 0x01, // Usage Minimum (0x01) - 0x29, 0x05, // Usage Maximum (0x05) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x01, // Logical Maximum (1) - 0x95, 0x05, // Report Count (5) - 0x75, 0x01, // Report Size (1) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position) - 0x95, 0x01, // Report Count (1) - 0x75, 0x03, // Report Size (3) - 0x81, 0x01, // Input (Const,Array,Abs,No Wrap,Linear,Preferred - // State,No Null Position) - 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) - 0x09, 0x30, // Usage (X) - 0x09, 0x31, // Usage (Y) - 0x09, 0x38, // Usage (Wheel) - 0x15, 0x81, // Logical Minimum (-127) - 0x25, 0x7F, // Logical Maximum (127) - 0x75, 0x08, // Report Size (8) - 0x95, 0x03, // Report Count (3) - 0x81, 0x06, // Input (Data,Var,Rel,No Wrap,Linear,Preferred - // State,No Null Position) - 0xC0, // End Collection - 0xC0, // End Collection -}; -const size_t kSteamControllerMouseSize = base::size(kSteamControllerMouse); +// static +base::span<const uint8_t> TestReportDescriptors::SteamControllerVendor() { + constexpr uint8_t kSteamControllerVendor[] = { + 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00) + 0x09, 0x01, // Usage (0x01) + 0xA1, 0x01, // Collection (Application) + 0x15, 0x00, // Logical Minimum (0) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x75, 0x08, // Report Size (8) + 0x95, 0x40, // Report Count (64) + 0x09, 0x01, // Usage (0x01) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position) + 0x95, 0x40, // Report Count (64) + 0x09, 0x01, // Usage (0x01) + 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x95, 0x40, // Report Count (64) + 0x09, 0x01, // Usage (0x01) + 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0xC0, // End Collection + }; + return base::make_span(kSteamControllerVendor); +} -const uint8_t kSteamControllerVendor[] = { - 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00) - 0x09, 0x01, // Usage (0x01) - 0xA1, 0x01, // Collection (Application) - 0x15, 0x00, // Logical Minimum (0) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x75, 0x08, // Report Size (8) - 0x95, 0x40, // Report Count (64) - 0x09, 0x01, // Usage (0x01) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State, - // No Null Position) - 0x95, 0x40, // Report Count (64) - 0x09, 0x01, // Usage (0x01) - 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear,Preferred State, - // No Null Position,Non-volatile) - 0x95, 0x40, // Report Count (64) - 0x09, 0x01, // Usage (0x01) - 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0xC0, // End Collection -}; -const size_t kSteamControllerVendorSize = base::size(kSteamControllerVendor); +// static +base::span<const uint8_t> TestReportDescriptors::XSkillsUsbAdapter() { + constexpr uint8_t kXSkillsUsbAdapter[] = { + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 0x09, 0x04, // Usage (Joystick) + 0xA1, 0x01, // Collection (Application) + 0x05, 0x09, // Usage Page (Button) + 0x19, 0x01, // Usage Minimum (0x01) + 0x29, 0x0C, // Usage Maximum (0x0C) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x35, 0x00, // Physical Minimum (0) + 0x45, 0x01, // Physical Maximum (1) + 0x75, 0x01, // Report Size (1) + 0x95, 0x0C, // Report Count (12) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position) + 0x95, 0x04, // Report Count (4) + 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position) + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 0x09, 0x30, // Usage (X) + 0x09, 0x31, // Usage (Y) + 0x09, 0x35, // Usage (Rz) + 0x09, 0x32, // Usage (Z) + 0x26, 0xFF, 0x00, // Logical Maximum (255) + 0x46, 0xFF, 0x00, // Physical Maximum (255) + 0x66, 0x00, 0x00, // Unit (None) + 0x75, 0x08, // Report Size (8) + 0x95, 0x04, // Report Count (4) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position) + 0x09, 0x33, // Usage (Rx) + 0x09, 0x34, // Usage (Ry) + 0x26, 0x0F, 0x00, // Logical Maximum (15) + 0x46, 0x0F, 0x00, // Physical Maximum (15) + 0x75, 0x04, // Report Size (4) + 0x95, 0x02, // Report Count (2) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position) + 0x75, 0x08, // Report Size (8) + 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00) + 0x19, 0x01, // Usage Minimum (0x01) + 0x29, 0x04, // Usage Maximum (0x04) + 0x95, 0x04, // Report Count (4) + 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0xC0, // End Collection + }; + return base::make_span(kXSkillsUsbAdapter); +} -const uint8_t kXSkillsUsbAdapter[] = { - 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) - 0x09, 0x04, // Usage (Joystick) - 0xA1, 0x01, // Collection (Application) - 0x05, 0x09, // Usage Page (Button) - 0x19, 0x01, // Usage Minimum (0x01) - 0x29, 0x0C, // Usage Maximum (0x0C) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x01, // Logical Maximum (1) - 0x35, 0x00, // Physical Minimum (0) - 0x45, 0x01, // Physical Maximum (1) - 0x75, 0x01, // Report Size (1) - 0x95, 0x0C, // Report Count (12) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State, - // No Null Position) - 0x95, 0x04, // Report Count (4) - 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear,Preferred State, - // No Null Position) - 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) - 0x09, 0x30, // Usage (X) - 0x09, 0x31, // Usage (Y) - 0x09, 0x35, // Usage (Rz) - 0x09, 0x32, // Usage (Z) - 0x26, 0xFF, 0x00, // Logical Maximum (255) - 0x46, 0xFF, 0x00, // Physical Maximum (255) - 0x66, 0x00, 0x00, // Unit (None) - 0x75, 0x08, // Report Size (8) - 0x95, 0x04, // Report Count (4) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State, - // No Null Position) - 0x09, 0x33, // Usage (Rx) - 0x09, 0x34, // Usage (Ry) - 0x26, 0x0F, 0x00, // Logical Maximum (15) - 0x46, 0x0F, 0x00, // Physical Maximum (15) - 0x75, 0x04, // Report Size (4) - 0x95, 0x02, // Report Count (2) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State, - // No Null Position) - 0x75, 0x08, // Report Size (8) - 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00) - 0x19, 0x01, // Usage Minimum (0x01) - 0x29, 0x04, // Usage Maximum (0x04) - 0x95, 0x04, // Report Count (4) - 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear,Preferred State, - // No Null Position,Non-volatile) - 0xC0, // End Collection -}; -const size_t kXSkillsUsbAdapterSize = base::size(kXSkillsUsbAdapter); +// static +base::span<const uint8_t> TestReportDescriptors::BelkinNostromoKeyboard() { + constexpr uint8_t kBelkinNostromoKeyboard[] = { + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 0x09, 0x06, // Usage (Keyboard) + 0xA1, 0x01, // Collection (Application) + 0x05, 0x07, // Usage Page (Kbrd/Keypad) + 0x19, 0xE0, // Usage Minimum (0xE0) + 0x29, 0xE7, // Usage Maximum (0xE7) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x75, 0x01, // Report Size (1) + 0x95, 0x08, // Report Count (8) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State, + // No Null Position) + 0x95, 0x01, // Report Count (1) + 0x75, 0x08, // Report Size (8) + 0x81, 0x01, // Input (Const,Array,Abs,No Wrap,Linear,Preferred + // State,No Null Position) + 0x95, 0x06, // Report Count (6) + 0x75, 0x08, // Report Size (8) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x65, // Logical Maximum (101) + 0x05, 0x07, // Usage Page (Kbrd/Keypad) + 0x19, 0x00, // Usage Minimum (0x00) + 0x29, 0x65, // Usage Maximum (0x65) + 0x81, 0x00, // Input (Data,Array,Abs,No Wrap,Linear,Preferred + // State,No Null Position) + 0xC0, // End Collection + }; + return base::make_span(kBelkinNostromoKeyboard); +} -const uint8_t kBelkinNostromoKeyboard[] = { - 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) - 0x09, 0x06, // Usage (Keyboard) - 0xA1, 0x01, // Collection (Application) - 0x05, 0x07, // Usage Page (Kbrd/Keypad) - 0x19, 0xE0, // Usage Minimum (0xE0) - 0x29, 0xE7, // Usage Maximum (0xE7) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x01, // Logical Maximum (1) - 0x75, 0x01, // Report Size (1) - 0x95, 0x08, // Report Count (8) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State, - // No Null Position) - 0x95, 0x01, // Report Count (1) - 0x75, 0x08, // Report Size (8) - 0x81, 0x01, // Input (Const,Array,Abs,No Wrap,Linear,Preferred - // State,No Null Position) - 0x95, 0x06, // Report Count (6) - 0x75, 0x08, // Report Size (8) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x65, // Logical Maximum (101) - 0x05, 0x07, // Usage Page (Kbrd/Keypad) - 0x19, 0x00, // Usage Minimum (0x00) - 0x29, 0x65, // Usage Maximum (0x65) - 0x81, 0x00, // Input (Data,Array,Abs,No Wrap,Linear,Preferred - // State,No Null Position) - 0xC0, // End Collection -}; -const size_t kBelkinNostromoKeyboardSize = base::size(kBelkinNostromoKeyboard); - -const uint8_t kBelkinNostromoMouseAndExtra[] = { - 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) - 0x09, 0x02, // Usage (Mouse) - 0xA1, 0x01, // Collection (Application) - 0x09, 0x01, // Usage (Pointer) - 0xA1, 0x00, // Collection (Physical) - 0x05, 0x09, // Usage Page (Button) - 0x19, 0x01, // Usage Minimum (0x01) - 0x29, 0x03, // Usage Maximum (0x03) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x01, // Logical Maximum (1) - 0x95, 0x03, // Report Count (3) - 0x75, 0x01, // Report Size (1) - 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position) - 0x95, 0x01, // Report Count (1) - 0x75, 0x05, // Report Size (5) - 0x81, 0x01, // Input (Const,Array,Abs,No Wrap,Linear,Preferred - // State,No Null Position) - 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) - 0x09, 0x30, // Usage (X) - 0x09, 0x31, // Usage (Y) - 0x09, 0x38, // Usage (Wheel) - 0x15, 0x81, // Logical Minimum (-127) - 0x25, 0x7F, // Logical Maximum (127) - 0x75, 0x08, // Report Size (8) - 0x95, 0x03, // Report Count (3) - 0x81, 0x06, // Input (Data,Var,Rel,No Wrap,Linear,Preferred - // State,No Null Position) - 0x05, 0x08, // Usage Page (LEDs) - 0x19, 0x01, // Usage Minimum (Num Lock) - 0x29, 0x03, // Usage Maximum (Scroll Lock) - 0x15, 0x00, // Logical Minimum (0) - 0x25, 0x01, // Logical Maximum (1) - 0x35, 0x00, // Physical Minimum (0) - 0x45, 0x01, // Physical Maximum (1) - 0x75, 0x01, // Report Size (1) - 0x95, 0x03, // Report Count (3) - 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0x75, 0x05, // Report Size (5) - 0x95, 0x01, // Report Count (1) - 0x91, 0x01, // Output (Const,Array,Abs,No Wrap,Linear,Preferred - // State,No Null Position,Non-volatile) - 0xC0, // End Collection - 0xC0, // End Collection -}; -const size_t kBelkinNostromoMouseAndExtraSize = - base::size(kBelkinNostromoMouseAndExtra); +// static +base::span<const uint8_t> TestReportDescriptors::BelkinNostromoMouseAndExtra() { + constexpr uint8_t kBelkinNostromoMouseAndExtra[] = { + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 0x09, 0x02, // Usage (Mouse) + 0xA1, 0x01, // Collection (Application) + 0x09, 0x01, // Usage (Pointer) + 0xA1, 0x00, // Collection (Physical) + 0x05, 0x09, // Usage Page (Button) + 0x19, 0x01, // Usage Minimum (0x01) + 0x29, 0x03, // Usage Maximum (0x03) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x95, 0x03, // Report Count (3) + 0x75, 0x01, // Report Size (1) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position) + 0x95, 0x01, // Report Count (1) + 0x75, 0x05, // Report Size (5) + 0x81, 0x01, // Input (Const,Array,Abs,No Wrap,Linear,Preferred + // State,No Null Position) + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 0x09, 0x30, // Usage (X) + 0x09, 0x31, // Usage (Y) + 0x09, 0x38, // Usage (Wheel) + 0x15, 0x81, // Logical Minimum (-127) + 0x25, 0x7F, // Logical Maximum (127) + 0x75, 0x08, // Report Size (8) + 0x95, 0x03, // Report Count (3) + 0x81, 0x06, // Input (Data,Var,Rel,No Wrap,Linear,Preferred + // State,No Null Position) + 0x05, 0x08, // Usage Page (LEDs) + 0x19, 0x01, // Usage Minimum (Num Lock) + 0x29, 0x03, // Usage Maximum (Scroll Lock) + 0x15, 0x00, // Logical Minimum (0) + 0x25, 0x01, // Logical Maximum (1) + 0x35, 0x00, // Physical Minimum (0) + 0x45, 0x01, // Physical Maximum (1) + 0x75, 0x01, // Report Size (1) + 0x95, 0x03, // Report Count (3) + 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0x75, 0x05, // Report Size (5) + 0x95, 0x01, // Report Count (1) + 0x91, 0x01, // Output (Const,Array,Abs,No Wrap,Linear,Preferred + // State,No Null Position,Non-volatile) + 0xC0, // End Collection + 0xC0, // End Collection + }; + return base::make_span(kBelkinNostromoMouseAndExtra); +} } // namespace device
diff --git a/services/device/hid/test_report_descriptors.h b/services/device/hid/test_report_descriptors.h index b116b64..b135aad0 100644 --- a/services/device/hid/test_report_descriptors.h +++ b/services/device/hid/test_report_descriptors.h
@@ -5,76 +5,59 @@ #ifndef SERVICES_DEVICE_HID_TEST_REPORT_DESCRIPTORS_H_ #define SERVICES_DEVICE_HID_TEST_REPORT_DESCRIPTORS_H_ -#include <stddef.h> +#include "base/containers/span.h" + #include <stdint.h> namespace device { -// Digitizer descriptor from HID descriptor tool -// http://www.usb.org/developers/hidpage/dt2_4.zip -extern const uint8_t kDigitizer[]; -extern const size_t kDigitizerSize; +class TestReportDescriptors { + public: + // Descriptors from the HID descriptor tool. + // http://www.usb.org/developers/hidpage/dt2_4.zip + static base::span<const uint8_t> Digitizer(); + static base::span<const uint8_t> Keyboard(); + static base::span<const uint8_t> Monitor(); + static base::span<const uint8_t> Mouse(); -// Keyboard descriptor from HID descriptor tool -// http://www.usb.org/developers/hidpage/dt2_4.zip -extern const uint8_t kKeyboard[]; -extern const size_t kKeyboardSize; + // The report descriptor from a Logitech Unifying receiver. + static base::span<const uint8_t> LogitechUnifyingReceiver(); -// Monitor descriptor from HID descriptor tool -// http://www.usb.org/developers/hidpage/dt2_4.zip -extern const uint8_t kMonitor[]; -extern const size_t kMonitorSize; + // The report descriptor from a Sony Dualshock 3 connected over USB. + static base::span<const uint8_t> SonyDualshock3Usb(); -// Mouse descriptor from HID descriptor tool -// http://www.usb.org/developers/hidpage/dt2_4.zip -extern const uint8_t kMouse[]; -extern const size_t kMouseSize; + // The report descriptor from a Sony Dualshock 4 connected over USB. + static base::span<const uint8_t> SonyDualshock4Usb(); -// Logitech Unifying receiver descriptor -extern const uint8_t kLogitechUnifyingReceiver[]; -extern const size_t kLogitechUnifyingReceiverSize; + // The report descriptor from a Microsoft Xbox Wireless Controller connected + // over Bluetooth. + static base::span<const uint8_t> MicrosoftXboxWirelessControllerBluetooth(); -// Sony Dualshock 3 USB descriptor -extern const uint8_t kSonyDualshock3[]; -extern const size_t kSonyDualshock3Size; + // The report descriptor from a Nintendo Switch Pro Controller connected over + // USB. + static base::span<const uint8_t> NintendoSwitchProControllerUsb(); -// Sony Dualshock 4 USB descriptor -extern const uint8_t kSonyDualshock4[]; -extern const size_t kSonyDualshock4Size; + // The report descriptor from a Microsoft Xbox Adaptive Controller connected + // over Bluetooth. + static base::span<const uint8_t> MicrosoftXboxAdaptiveControllerBluetooth(); -// Microsoft Xbox Wireless Controller Bluetooth descriptor -extern const uint8_t kMicrosoftXboxWirelessController[]; -extern const size_t kMicrosoftXboxWirelessControllerSize; + // The report descriptor from a Nexus Player Controller. + static base::span<const uint8_t> NexusPlayerController(); -// Nintendo Switch Pro Controller USB descriptor -extern const uint8_t kNintendoSwitchProController[]; -extern const size_t kNintendoSwitchProControllerSize; + // The report descriptors from a Steam Controller. Steam Controller exposes + // three HID interfaces. + static base::span<const uint8_t> SteamControllerKeyboard(); + static base::span<const uint8_t> SteamControllerMouse(); + static base::span<const uint8_t> SteamControllerVendor(); -// Microsoft Xbox Adaptive Controller Bluetooth descriptor -extern const uint8_t kMicrosoftXboxAdaptiveController[]; -extern const size_t kMicrosoftXboxAdaptiveControllerSize; + // The report descriptor from an XSkills Gamecube USB controller adapter. + static base::span<const uint8_t> XSkillsUsbAdapter(); -// Nexus Player Controller descriptor -extern const uint8_t kNexusPlayerController[]; -extern const size_t kNexusPlayerControllerSize; - -// Steam Controller descriptors -extern const uint8_t kSteamControllerKeyboard[]; -extern const size_t kSteamControllerKeyboardSize; -extern const uint8_t kSteamControllerMouse[]; -extern const size_t kSteamControllerMouseSize; -extern const uint8_t kSteamControllerVendor[]; -extern const size_t kSteamControllerVendorSize; - -// XSkills Gamecube USB controller adapter descriptor -extern const uint8_t kXSkillsUsbAdapter[]; -extern const size_t kXSkillsUsbAdapterSize; - -// Belkin Nostromo SpeedPad descriptors -extern const uint8_t kBelkinNostromoKeyboard[]; -extern const size_t kBelkinNostromoKeyboardSize; -extern const uint8_t kBelkinNostromoMouseAndExtra[]; -extern const size_t kBelkinNostromoMouseAndExtraSize; + // The report descriptors from a Belkin Nostromo SpeedPad. The Nostromo + // SpeedPad exposes two HID interfaces. + static base::span<const uint8_t> BelkinNostromoKeyboard(); + static base::span<const uint8_t> BelkinNostromoMouseAndExtra(); +}; } // namespace device
diff --git a/services/device/public/cpp/hid/hid_collection.cc b/services/device/public/cpp/hid/hid_collection.cc index 9520b7f..3b66554 100644 --- a/services/device/public/cpp/hid/hid_collection.cc +++ b/services/device/public/cpp/hid/hid_collection.cc
@@ -135,7 +135,8 @@ case HidReportDescriptorItem::kTagDelimiter: // Update the value associated with a local or global item in the item // state table. - state.SetItemValue(current_item->tag(), current_item->GetShortData()); + state.SetItemValue(current_item->tag(), current_item->GetShortData(), + current_item->payload_size()); break; default: break;
diff --git a/services/device/public/cpp/hid/hid_device_filter_unittest.cc b/services/device/public/cpp/hid/hid_device_filter_unittest.cc index 9ce84e0..32581d18 100644 --- a/services/device/public/cpp/hid/hid_device_filter_unittest.cc +++ b/services/device/public/cpp/hid/hid_device_filter_unittest.cc
@@ -30,8 +30,7 @@ void SetUp() override { device_info_ = new HidDeviceInfo( kTestDeviceId, "1", 0x046d, 0xc31c, "Test Keyboard", "123ABC", - mojom::HidBusType::kHIDBusTypeUSB, - std::vector<uint8_t>(kKeyboard, kKeyboard + kKeyboardSize)); + mojom::HidBusType::kHIDBusTypeUSB, TestReportDescriptors::Keyboard()); } protected:
diff --git a/services/device/public/cpp/hid/hid_item_state_table.cc b/services/device/public/cpp/hid/hid_item_state_table.cc index 6acb2cb..cf3baba6 100644 --- a/services/device/public/cpp/hid/hid_item_state_table.cc +++ b/services/device/public/cpp/hid/hid_item_state_table.cc
@@ -42,13 +42,28 @@ return (global_stack.back().usage_page << (sizeof(uint16_t) * 8)) | usage; } +// Interprets |value| as a two's complement signed integer |payload_size| bytes +// wide. The value is returned as a 32-bit signed integer, extending the sign +// bit as needed. +int32_t Int32FromValueAndSize(uint32_t value, size_t payload_size) { + if (payload_size == 1) + return int8_t{uint8_t{value}}; + + if (payload_size == 2) + return int16_t{uint16_t{value}}; + + DCHECK_EQ(payload_size, 4u); + return value; +} + } // namespace HidItemStateTable::HidItemStateTable() = default; HidItemStateTable::~HidItemStateTable() = default; void HidItemStateTable::SetItemValue(HidReportDescriptorItem::Tag tag, - uint32_t value) { + uint32_t value, + size_t payload_size) { if (IsGlobalItem(tag)) { if (global_stack.empty()) global_stack.emplace_back(); @@ -58,16 +73,16 @@ global.usage_page = value; break; case HidReportDescriptorItem::kTagLogicalMinimum: - global.logical_minimum = int32_t{value}; + global.logical_minimum = Int32FromValueAndSize(value, payload_size); break; case HidReportDescriptorItem::kTagLogicalMaximum: - global.logical_maximum = int32_t{value}; + global.logical_maximum = Int32FromValueAndSize(value, payload_size); break; case HidReportDescriptorItem::kTagPhysicalMinimum: - global.physical_minimum = int32_t{value}; + global.physical_minimum = Int32FromValueAndSize(value, payload_size); break; case HidReportDescriptorItem::kTagPhysicalMaximum: - global.physical_maximum = int32_t{value}; + global.physical_maximum = Int32FromValueAndSize(value, payload_size); break; case HidReportDescriptorItem::kTagUnitExponent: global.unit_exponent = value;
diff --git a/services/device/public/cpp/hid/hid_item_state_table.h b/services/device/public/cpp/hid/hid_item_state_table.h index c5f702e..4cc79f4 100644 --- a/services/device/public/cpp/hid/hid_item_state_table.h +++ b/services/device/public/cpp/hid/hid_item_state_table.h
@@ -63,7 +63,9 @@ ~HidItemStateTable(); // Set the value of a local or global item. - void SetItemValue(HidReportDescriptorItem::Tag tag, uint32_t value); + void SetItemValue(HidReportDescriptorItem::Tag tag, + uint32_t value, + size_t payload_size); // The collection that will be modified when main items are encountered. HidCollection* collection = nullptr;
diff --git a/services/device/public/cpp/hid/hid_report_descriptor.cc b/services/device/public/cpp/hid/hid_report_descriptor.cc index 78e1bb33..c9ba82d 100644 --- a/services/device/public/cpp/hid/hid_report_descriptor.cc +++ b/services/device/public/cpp/hid/hid_report_descriptor.cc
@@ -18,12 +18,12 @@ } // namespace -HidReportDescriptor::HidReportDescriptor(const std::vector<uint8_t>& bytes) { +HidReportDescriptor::HidReportDescriptor(base::span<const uint8_t> bytes) { size_t header_index = 0; HidReportDescriptorItem* item = nullptr; while (header_index < bytes.size()) { - items_.push_back(HidReportDescriptorItem::Create( - &bytes[header_index], bytes.size() - header_index, item)); + items_.push_back( + HidReportDescriptorItem::Create(bytes.subspan(header_index), item)); header_index += items_.back()->GetSize(); } collections_ = HidCollection::BuildCollections(items_);
diff --git a/services/device/public/cpp/hid/hid_report_descriptor.h b/services/device/public/cpp/hid/hid_report_descriptor.h index 650558d5..c10c905 100644 --- a/services/device/public/cpp/hid/hid_report_descriptor.h +++ b/services/device/public/cpp/hid/hid_report_descriptor.h
@@ -11,6 +11,7 @@ #include <memory> #include <vector> +#include "base/containers/span.h" #include "services/device/public/cpp/hid/hid_collection.h" #include "services/device/public/cpp/hid/hid_report_descriptor_item.h" #include "services/device/public/mojom/hid.mojom.h" @@ -21,7 +22,7 @@ // See section 6.2.2 of HID specifications (v1.11). class HidReportDescriptor { public: - HidReportDescriptor(const std::vector<uint8_t>& bytes); + explicit HidReportDescriptor(base::span<const uint8_t> bytes); ~HidReportDescriptor(); const std::vector<std::unique_ptr<HidReportDescriptorItem>>& items() const {
diff --git a/services/device/public/cpp/hid/hid_report_descriptor_item.cc b/services/device/public/cpp/hid/hid_report_descriptor_item.cc index c40fd7d..2ead4898 100644 --- a/services/device/public/cpp/hid/hid_report_descriptor_item.cc +++ b/services/device/public/cpp/hid/hid_report_descriptor_item.cc
@@ -8,6 +8,7 @@ #include <string.h> #include "base/check.h" +#include "base/logging.h" namespace device { @@ -22,27 +23,26 @@ } // namespace HidReportDescriptorItem::HidReportDescriptorItem( - const uint8_t* bytes, - size_t size, + base::span<const uint8_t> bytes, HidReportDescriptorItem* previous) : previous_(previous), next_(nullptr), parent_(nullptr), shortData_(0), payload_size_(0) { - Header* header = (Header*)&bytes[0]; - tag_ = (Tag)(header->tag << 2 | header->type); + const auto* header = reinterpret_cast<const Header*>(bytes.data()); + tag_ = static_cast<Tag>(header->tag << 2 | header->type); if (IsLong()) { // In a long item, payload size is the second byte. - if (size >= 2) + if (bytes.size() >= 2) payload_size_ = bytes[1]; } else { // As per HID spec, a bSize value of 3 means 4 bytes. payload_size_ = header->size == 0x3 ? 4 : header->size; - DCHECK(payload_size_ <= sizeof(shortData_)); - if (GetHeaderSize() + payload_size() <= size) - memcpy(&shortData_, &bytes[GetHeaderSize()], payload_size()); + DCHECK_LE(payload_size_, sizeof(shortData_)); + if (GetHeaderSize() + payload_size() <= bytes.size()) + memcpy(&shortData_, bytes.data() + GetHeaderSize(), payload_size()); } if (previous) {
diff --git a/services/device/public/cpp/hid/hid_report_descriptor_item.h b/services/device/public/cpp/hid/hid_report_descriptor_item.h index 9bb16a2a..72b993f 100644 --- a/services/device/public/cpp/hid/hid_report_descriptor_item.h +++ b/services/device/public/cpp/hid/hid_report_descriptor_item.h
@@ -10,6 +10,8 @@ #include <memory> +#include "base/containers/span.h" + namespace device { // An element of a HID report descriptor. @@ -123,17 +125,17 @@ "incorrect report info size"); private: - HidReportDescriptorItem(const uint8_t* bytes, - size_t size, + HidReportDescriptorItem(base::span<const uint8_t> bytes, HidReportDescriptorItem* previous); public: ~HidReportDescriptorItem() {} - static std::unique_ptr<HidReportDescriptorItem> - Create(const uint8_t* bytes, size_t size, HidReportDescriptorItem* previous) { + static std::unique_ptr<HidReportDescriptorItem> Create( + base::span<const uint8_t> bytes, + HidReportDescriptorItem* previous) { return std::unique_ptr<HidReportDescriptorItem>( - new HidReportDescriptorItem(bytes, size, previous)); + new HidReportDescriptorItem(bytes, previous)); } // Previous element in report descriptor. @@ -159,10 +161,11 @@ uint32_t GetShortData() const; // Size of this item in bytes, including the header. size_t GetSize() const; + // Size of this item in bytes, excluding the header. + size_t payload_size() const { return payload_size_; } private: size_t GetHeaderSize() const; - size_t payload_size() const { return payload_size_; } HidReportDescriptorItem* previous_; HidReportDescriptorItem* next_;
diff --git a/services/device/public/cpp/hid/hid_report_descriptor_unittest.cc b/services/device/public/cpp/hid/hid_report_descriptor_unittest.cc index f2d3d61..ad77739b 100644 --- a/services/device/public/cpp/hid/hid_report_descriptor_unittest.cc +++ b/services/device/public/cpp/hid/hid_report_descriptor_unittest.cc
@@ -257,14 +257,14 @@ // Set the logical and physical minimums and maximums. Subsequent report items // will inherit these values. - void SetLogicalAndPhysicalBounds(uint32_t logical_minimum, - uint32_t logical_maximum, - uint32_t physical_minimum, - uint32_t physical_maximum) { - globals_.logical_minimum = int32_t{logical_minimum}; - globals_.logical_maximum = int32_t{logical_maximum}; - globals_.physical_minimum = int32_t{physical_minimum}; - globals_.physical_maximum = int32_t{physical_maximum}; + void SetLogicalAndPhysicalBounds(int32_t logical_minimum, + int32_t logical_maximum, + int32_t physical_minimum, + int32_t physical_maximum) { + globals_.logical_minimum = logical_minimum; + globals_.logical_maximum = logical_maximum; + globals_.physical_minimum = physical_minimum; + globals_.physical_maximum = physical_maximum; } // Set the |report_size| in bits, and the |report_count|. Subsequent report @@ -315,15 +315,12 @@ const_cast<HidCollection*>(c)->AddReportItem(tag, report_info, state); } - void ValidateDetails( - const bool expected_has_report_id, - const size_t expected_max_input_report_size, - const size_t expected_max_output_report_size, - const size_t expected_max_feature_report_size, - const uint8_t* bytes, - size_t size) { - descriptor_ = std::make_unique<HidReportDescriptor>( - std::vector<uint8_t>(bytes, bytes + size)); + void ValidateDetails(const bool expected_has_report_id, + const size_t expected_max_input_report_size, + const size_t expected_max_output_report_size, + const size_t expected_max_feature_report_size, + base::span<const uint8_t> report_descriptor_data) { + descriptor_ = std::make_unique<HidReportDescriptor>(report_descriptor_data); std::vector<HidCollectionInfoPtr> actual_collection_infos; bool actual_has_report_id; size_t actual_max_input_report_size; @@ -431,9 +428,8 @@ ASSERT_EQ(expected_children.size(), actual_children.size()); } - void ValidateCollections(const uint8_t* bytes, size_t size) { - descriptor_ = std::make_unique<HidReportDescriptor>( - std::vector<uint8_t>(bytes, bytes + size)); + void ValidateCollections(base::span<const uint8_t> report_descriptor_data) { + descriptor_ = std::make_unique<HidReportDescriptor>(report_descriptor_data); const auto& actual_collections = descriptor_->collections(); auto actual_collection_iter = actual_collections.begin(); auto expected_collection_iter = expected_collections_.begin(); @@ -461,7 +457,7 @@ ASSERT_FALSE(IsAlwaysProtected(*digitizer->usage)); digitizer->report_ids = {0x01, 0x02, 0x03}; AddTopCollectionInfo(std::move(digitizer)); - ValidateDetails(true, 6, 0, 0, kDigitizer, kDigitizerSize); + ValidateDetails(true, 6, 0, 0, TestReportDescriptors::Digitizer()); } TEST_F(HidReportDescriptorTest, ValidateCollections_Digitizer) { @@ -520,7 +516,7 @@ SetReportSizeAndCount(8, 1); AddReportItem(stylus_down, kInput, kNonLinearVariable, {kUsageDigitizerTipPressure}); - ValidateCollections(kDigitizer, kDigitizerSize); + ValidateCollections(TestReportDescriptors::Digitizer()); } TEST_F(HidReportDescriptorTest, ValidateDetails_Keyboard) { @@ -529,7 +525,7 @@ mojom::kPageGenericDesktop); ASSERT_TRUE(IsAlwaysProtected(*keyboard->usage)); AddTopCollectionInfo(std::move(keyboard)); - ValidateDetails(false, 8, 1, 0, kKeyboard, kKeyboardSize); + ValidateDetails(false, 8, 1, 0, TestReportDescriptors::Keyboard()); } TEST_F(HidReportDescriptorTest, ValidateCollections_Keyboard) { @@ -550,7 +546,7 @@ SetReportSizeAndCount(8, 6); AddReportItemRange(top, kInput, kNonNullableArray, kUsageKeyboard, kUsageKeyboardApplication); - ValidateCollections(kKeyboard, kKeyboardSize); + ValidateCollections(TestReportDescriptors::Keyboard()); } TEST_F(HidReportDescriptorTest, ValidateDetails_Monitor) { @@ -559,7 +555,7 @@ ASSERT_FALSE(IsAlwaysProtected(*monitor->usage)); monitor->report_ids = {0x01, 0x02, 0x03, 0x04, 0x05}; AddTopCollectionInfo(std::move(monitor)); - ValidateDetails(true, 0, 0, 243, kMonitor, kMonitorSize); + ValidateDetails(true, 0, 0, 243, TestReportDescriptors::Monitor()); } TEST_F(HidReportDescriptorTest, ValidateCollections_Monitor) { @@ -593,7 +589,7 @@ {kUsageMonitorHorizontalPosition, kUsageMonitorHorizontalSize, kUsageMonitorVerticalPosition, kUsageMonitorVerticalSize, kUsageMonitorTrapezoidalDistortion, kUsageMonitorTilt}); - ValidateCollections(kMonitor, kMonitorSize); + ValidateCollections(TestReportDescriptors::Monitor()); } TEST_F(HidReportDescriptorTest, ValidateDetails_Mouse) { @@ -602,7 +598,7 @@ mojom::kPageGenericDesktop); ASSERT_TRUE(IsAlwaysProtected(*mouse->usage)); AddTopCollectionInfo(std::move(mouse)); - ValidateDetails(false, 3, 0, 0, kMouse, kMouseSize); + ValidateDetails(false, 3, 0, 0, TestReportDescriptors::Mouse()); } TEST_F(HidReportDescriptorTest, ValidateCollections_Mouse) { @@ -616,11 +612,11 @@ kUsageButton + 3); SetReportSizeAndCount(5, 1); AddReportConstant(physical, kInput, kConstant); - SetLogicalAndPhysicalBounds(0x81, 0x7f, 0, 0); + SetLogicalAndPhysicalBounds(-127, 127, 0, 0); SetReportSizeAndCount(8, 2); AddReportItem(physical, kInput, kRelativeVariable, {kUsageGenericDesktopX, kUsageGenericDesktopY}); - ValidateCollections(kMouse, kMouseSize); + ValidateCollections(TestReportDescriptors::Mouse()); } TEST_F(HidReportDescriptorTest, ValidateDetails_LogitechUnifyingReceiver) { @@ -639,8 +635,8 @@ AddTopCollectionInfo(std::move(hidpp_short)); AddTopCollectionInfo(std::move(hidpp_long)); AddTopCollectionInfo(std::move(hidpp_dj)); - ValidateDetails(true, 31, 31, 0, kLogitechUnifyingReceiver, - kLogitechUnifyingReceiverSize); + ValidateDetails(true, 31, 31, 0, + TestReportDescriptors::LogitechUnifyingReceiver()); } TEST_F(HidReportDescriptorTest, ValidateCollections_LogitechUnifyingReceiver) { @@ -675,7 +671,7 @@ {kUsageVendor + 0x42}); AddReportItem(dj_collection, kOutput, kNonNullableArray, {kUsageVendor + 0x42}); - ValidateCollections(kLogitechUnifyingReceiver, kLogitechUnifyingReceiverSize); + ValidateCollections(TestReportDescriptors::LogitechUnifyingReceiver()); } TEST_F(HidReportDescriptorTest, ValidateDetails_SonyDualshock3) { @@ -685,7 +681,7 @@ ASSERT_FALSE(IsAlwaysProtected(*top_info->usage)); top_info->report_ids = {0x01, 0x02, 0xee, 0xef}; AddTopCollectionInfo(std::move(top_info)); - ValidateDetails(true, 48, 48, 48, kSonyDualshock3, kSonyDualshock3Size); + ValidateDetails(true, 48, 48, 48, TestReportDescriptors::SonyDualshock3Usb()); } TEST_F(HidReportDescriptorTest, ValidateCollections_SonyDualshock3) { @@ -732,7 +728,7 @@ SetReportId(0xef); AddReportItem(report_ef_collection, kFeature, kAbsoluteVariable, {kUsageGenericDesktopPointer}); - ValidateCollections(kSonyDualshock3, kSonyDualshock3Size); + ValidateCollections(TestReportDescriptors::SonyDualshock3Usb()); } TEST_F(HidReportDescriptorTest, ValidateDetails_SonyDualshock4) { @@ -746,7 +742,7 @@ 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xf0, 0xf1, 0xf2, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0}; AddTopCollectionInfo(std::move(top_info)); - ValidateDetails(true, 63, 31, 63, kSonyDualshock4, kSonyDualshock4Size); + ValidateDetails(true, 63, 31, 63, TestReportDescriptors::SonyDualshock4Usb()); } TEST_F(HidReportDescriptorTest, ValidateCollections_SonyDualshock4) { @@ -900,7 +896,7 @@ SetReportId(0xb0); SetReportSizeAndCount(8, 63); AddReportItem(top, kFeature, kAbsoluteVariable, {kUsageVendor80 + 0x54}); - ValidateCollections(kSonyDualshock4, kSonyDualshock4Size); + ValidateCollections(TestReportDescriptors::SonyDualshock4Usb()); } TEST_F(HidReportDescriptorTest, ValidateDetails_XboxWirelessController) { @@ -910,8 +906,9 @@ ASSERT_FALSE(IsAlwaysProtected(*top_info->usage)); top_info->report_ids = {0x01, 0x02, 0x03, 0x04}; AddTopCollectionInfo(std::move(top_info)); - ValidateDetails(true, 15, 8, 0, kMicrosoftXboxWirelessController, - kMicrosoftXboxWirelessControllerSize); + ValidateDetails( + true, 15, 8, 0, + TestReportDescriptors::MicrosoftXboxWirelessControllerBluetooth()); } TEST_F(HidReportDescriptorTest, ValidateCollections_XboxWirelessController) { @@ -992,8 +989,8 @@ SetReportId(0x04); AddReportItem(top, kInput, kAbsoluteVariable, {kUsageGenericDeviceBatteryStrength}); - ValidateCollections(kMicrosoftXboxWirelessController, - kMicrosoftXboxWirelessControllerSize); + ValidateCollections( + TestReportDescriptors::MicrosoftXboxWirelessControllerBluetooth()); } TEST_F(HidReportDescriptorTest, ValidateDetails_NintendoSwitchProController) { @@ -1003,8 +1000,8 @@ ASSERT_FALSE(IsAlwaysProtected(*top_info->usage)); top_info->report_ids = {0x30, 0x21, 0x81, 0x01, 0x10, 0x80, 0x82}; AddTopCollectionInfo(std::move(top_info)); - ValidateDetails(true, 63, 63, 0, kNintendoSwitchProController, - kNintendoSwitchProControllerSize); + ValidateDetails(true, 63, 63, 0, + TestReportDescriptors::NintendoSwitchProControllerUsb()); } TEST_F(HidReportDescriptorTest, @@ -1053,8 +1050,7 @@ AddReportItem(top, kOutput, kVolatileConstant, {kUsageVendor + 0x05}); SetReportId(0x82); AddReportItem(top, kOutput, kVolatileConstant, {kUsageVendor + 0x06}); - ValidateCollections(kNintendoSwitchProController, - kNintendoSwitchProControllerSize); + ValidateCollections(TestReportDescriptors::NintendoSwitchProControllerUsb()); } TEST_F(HidReportDescriptorTest, ValidateDetails_XboxAdaptiveController) { @@ -1071,8 +1067,9 @@ keyboard_info->report_ids = {0x05}; AddTopCollectionInfo(std::move(gamepad_info)); AddTopCollectionInfo(std::move(keyboard_info)); - ValidateDetails(true, 54, 8, 64, kMicrosoftXboxAdaptiveController, - kMicrosoftXboxAdaptiveControllerSize); + ValidateDetails( + true, 54, 8, 64, + TestReportDescriptors::MicrosoftXboxAdaptiveControllerBluetooth()); } TEST_F(HidReportDescriptorTest, ValidateCollections_XboxAdaptiveController) { @@ -1348,8 +1345,8 @@ SetReportSizeAndCount(8, 6); AddReportItemRange(keyboard, kInput, kNonNullableArray, kUsageKeyboard, kUsageKeyboardApplication); - ValidateCollections(kMicrosoftXboxAdaptiveController, - kMicrosoftXboxAdaptiveControllerSize); + ValidateCollections( + TestReportDescriptors::MicrosoftXboxAdaptiveControllerBluetooth()); } TEST_F(HidReportDescriptorTest, ValidateDetails_NexusPlayerController) { @@ -1365,8 +1362,8 @@ status_info->report_ids = {0x03}; AddTopCollectionInfo(std::move(gamepad_info)); AddTopCollectionInfo(std::move(status_info)); - ValidateDetails(true, 8, 1, 0, kNexusPlayerController, - kNexusPlayerControllerSize); + ValidateDetails(true, 8, 1, 0, + TestReportDescriptors::NexusPlayerController()); } TEST_F(HidReportDescriptorTest, ValidateCollections_NexusPlayerController) { @@ -1413,7 +1410,7 @@ {kUsageGenericDeviceBatteryStrength}); SetReportSizeAndCount(8, 6); AddReportItem(status, kInput, kAbsoluteVariable, {0xffbcbdad}); - ValidateCollections(kNexusPlayerController, kNexusPlayerControllerSize); + ValidateCollections(TestReportDescriptors::NexusPlayerController()); } TEST_F(HidReportDescriptorTest, ValidateDetails_SteamControllerKeyboard) { @@ -1422,8 +1419,8 @@ mojom::kPageGenericDesktop); ASSERT_TRUE(IsAlwaysProtected(*info->usage)); AddTopCollectionInfo(std::move(info)); - ValidateDetails(false, 8, 1, 0, kSteamControllerKeyboard, - kSteamControllerKeyboardSize); + ValidateDetails(false, 8, 1, 0, + TestReportDescriptors::SteamControllerKeyboard()); } TEST_F(HidReportDescriptorTest, ValidateCollections_SteamControllerKeyboard) { @@ -1444,7 +1441,7 @@ SetLogicalAndPhysicalBounds(0, 101, 0, 0); AddReportItemRange(top, kInput, kNonNullableArray, kUsageKeyboard, kUsageKeyboardApplication); - ValidateCollections(kSteamControllerKeyboard, kSteamControllerKeyboardSize); + ValidateCollections(TestReportDescriptors::SteamControllerKeyboard()); } TEST_F(HidReportDescriptorTest, ValidateDetails_SteamControllerMouse) { @@ -1453,8 +1450,8 @@ mojom::kPageGenericDesktop); ASSERT_TRUE(IsAlwaysProtected(*info->usage)); AddTopCollectionInfo(std::move(info)); - ValidateDetails(false, 4, 0, 0, kSteamControllerMouse, - kSteamControllerMouseSize); + ValidateDetails(false, 4, 0, 0, + TestReportDescriptors::SteamControllerMouse()); } TEST_F(HidReportDescriptorTest, ValidateCollections_SteamControllerMouse) { @@ -1468,12 +1465,12 @@ kUsageButton + 5); SetReportSizeAndCount(3, 1); AddReportConstant(pointer, kInput, kConstantArray); - SetLogicalAndPhysicalBounds(0x81, 0x7f, 0, 0); + SetLogicalAndPhysicalBounds(-127, 127, 0, 0); SetReportSizeAndCount(8, 3); AddReportItem(pointer, kInput, kRelativeVariable, {kUsageGenericDesktopX, kUsageGenericDesktopY, kUsageGenericDesktopWheel}); - ValidateCollections(kSteamControllerMouse, kSteamControllerMouseSize); + ValidateCollections(TestReportDescriptors::SteamControllerMouse()); } TEST_F(HidReportDescriptorTest, ValidateDetails_SteamControllerVendor) { @@ -1481,8 +1478,8 @@ info->usage = HidUsageAndPage::New(0x01, mojom::kPageVendor); ASSERT_FALSE(IsAlwaysProtected(*info->usage)); AddTopCollectionInfo(std::move(info)); - ValidateDetails(false, 64, 64, 64, kSteamControllerVendor, - kSteamControllerVendorSize); + ValidateDetails(false, 64, 64, 64, + TestReportDescriptors::SteamControllerVendor()); } TEST_F(HidReportDescriptorTest, ValidateCollections_SteamControllerVendor) { @@ -1492,7 +1489,7 @@ AddReportItem(top, kInput, kAbsoluteVariable, {kUsageVendor + 0x01}); AddReportItem(top, kOutput, kAbsoluteVariable, {kUsageVendor + 0x01}); AddReportItem(top, kFeature, kAbsoluteVariable, {kUsageVendor + 0x01}); - ValidateCollections(kSteamControllerVendor, kSteamControllerVendorSize); + ValidateCollections(TestReportDescriptors::SteamControllerVendor()); } TEST_F(HidReportDescriptorTest, ValidateDetails_XSkillsUsbAdapter) { @@ -1501,7 +1498,7 @@ mojom::kPageGenericDesktop); ASSERT_FALSE(IsAlwaysProtected(*info->usage)); AddTopCollectionInfo(std::move(info)); - ValidateDetails(false, 7, 4, 0, kXSkillsUsbAdapter, kXSkillsUsbAdapterSize); + ValidateDetails(false, 7, 4, 0, TestReportDescriptors::XSkillsUsbAdapter()); } TEST_F(HidReportDescriptorTest, ValidateCollections_XSkillsUsbAdapter) { @@ -1525,7 +1522,7 @@ SetReportSizeAndCount(8, 4); AddReportItemRange(top, kOutput, kAbsoluteVariable, kUsageVendor + 0x01, kUsageVendor + 0x04); - ValidateCollections(kXSkillsUsbAdapter, kXSkillsUsbAdapterSize); + ValidateCollections(TestReportDescriptors::XSkillsUsbAdapter()); } TEST_F(HidReportDescriptorTest, ValidateDetails_BelkinNostromoKeyboard) { @@ -1534,8 +1531,8 @@ mojom::kPageGenericDesktop); ASSERT_TRUE(IsAlwaysProtected(*info->usage)); AddTopCollectionInfo(std::move(info)); - ValidateDetails(false, 8, 0, 0, kBelkinNostromoKeyboard, - kBelkinNostromoKeyboardSize); + ValidateDetails(false, 8, 0, 0, + TestReportDescriptors::BelkinNostromoKeyboard()); } TEST_F(HidReportDescriptorTest, ValidateCollections_BelkinNostromoKeyboard) { @@ -1551,7 +1548,7 @@ SetReportSizeAndCount(8, 6); AddReportItemRange(top, kInput, kNonNullableArray, kUsageKeyboard, kUsageKeyboardApplication); - ValidateCollections(kBelkinNostromoKeyboard, kBelkinNostromoKeyboardSize); + ValidateCollections(TestReportDescriptors::BelkinNostromoKeyboard()); } TEST_F(HidReportDescriptorTest, ValidateDetails_BelkinNostromoMouseAndExtra) { @@ -1560,8 +1557,8 @@ mojom::kPageGenericDesktop); ASSERT_TRUE(IsAlwaysProtected(*info->usage)); AddTopCollectionInfo(std::move(info)); - ValidateDetails(false, 4, 1, 0, kBelkinNostromoMouseAndExtra, - kBelkinNostromoMouseAndExtraSize); + ValidateDetails(false, 4, 1, 0, + TestReportDescriptors::BelkinNostromoMouseAndExtra()); } TEST_F(HidReportDescriptorTest, @@ -1576,7 +1573,7 @@ kUsageButton + 3); SetReportSizeAndCount(5, 1); AddReportConstant(pointer, kInput, kConstantArray); - SetLogicalAndPhysicalBounds(0x81, 0x7f, 0, 0); + SetLogicalAndPhysicalBounds(-127, 127, 0, 0); SetReportSizeAndCount(8, 3); AddReportItem(pointer, kInput, kRelativeVariable, {kUsageGenericDesktopX, kUsageGenericDesktopY, @@ -1587,8 +1584,7 @@ kUsageLedScrollLock); SetReportSizeAndCount(5, 1); AddReportConstant(pointer, kOutput, kConstantArray); - ValidateCollections(kBelkinNostromoMouseAndExtra, - kBelkinNostromoMouseAndExtraSize); + ValidateCollections(TestReportDescriptors::BelkinNostromoMouseAndExtra()); } TEST_F(HidReportDescriptorTest, InvalidReportSizeIgnored) { @@ -1601,22 +1597,19 @@ 0x75, 0x40, // Report Size (64) 0x90 // Output }; - static const size_t kInvalidReportSizeDescriptorSize = - base::size(kInvalidReportSizeDescriptor); + auto report_descriptor_data = base::make_span(kInvalidReportSizeDescriptor); auto info = HidCollectionInfo::New(); info->usage = HidUsageAndPage::New(0, 0); AddTopCollectionInfo(std::move(info)); // Maximum report sizes should not be affected by the invalid report item. - ValidateDetails(false, 0, 0, 0, kInvalidReportSizeDescriptor, - kInvalidReportSizeDescriptorSize); + ValidateDetails(false, 0, 0, 0, report_descriptor_data); // The report item with invalid size should still be included in the // collection info. auto* top = AddTopCollection(0, kCollectionTypePhysical); SetReportSizeAndCount(64, 1); AddReportConstant(top, kOutput, kNonNullableArray); - ValidateCollections(kInvalidReportSizeDescriptor, - kInvalidReportSizeDescriptorSize); + ValidateCollections(report_descriptor_data); } TEST_F(HidReportDescriptorTest, ReasonablyHugeReportNotIgnored) { @@ -1629,20 +1622,18 @@ 0x75, 0x08, // Report Size (8) 0x90 // Output }; - static const size_t kReasonablyHugeReportDescriptorSize = - base::size(kReasonablyHugeReportDescriptor); + auto report_descriptor_data = + base::make_span(kReasonablyHugeReportDescriptor); auto info = HidCollectionInfo::New(); info->usage = HidUsageAndPage::New(0, 0); AddTopCollectionInfo(std::move(info)); // Maximum report sizes should include the huge report. - ValidateDetails(false, 0, 65535, 0, kReasonablyHugeReportDescriptor, - kReasonablyHugeReportDescriptorSize); + ValidateDetails(false, 0, 65535, 0, report_descriptor_data); auto* top = AddTopCollection(0, kCollectionTypePhysical); SetReportSizeAndCount(8, 65535); AddReportConstant(top, kOutput, kNonNullableArray); - ValidateCollections(kReasonablyHugeReportDescriptor, - kReasonablyHugeReportDescriptorSize); + ValidateCollections(report_descriptor_data); } TEST_F(HidReportDescriptorTest, UnreasonablyHugeReportIgnored) { @@ -1655,22 +1646,20 @@ 0x75, 0x08, // Report Size (8) 0x90 // Output }; - static const size_t kUnreasonablyHugeReportDescriptorSize = - base::size(kUnreasonablyHugeReportDescriptor); + auto report_descriptor_data = + base::make_span(kUnreasonablyHugeReportDescriptor); auto info = HidCollectionInfo::New(); info->usage = HidUsageAndPage::New(0, 0); AddTopCollectionInfo(std::move(info)); // Maximum report sizes should not be affected by the huge report. - ValidateDetails(false, 0, 0, 0, kUnreasonablyHugeReportDescriptor, - kUnreasonablyHugeReportDescriptorSize); + ValidateDetails(false, 0, 0, 0, report_descriptor_data); // The unreasonably huge report item should still be included in the // collection info. auto* top = AddTopCollection(0, kCollectionTypePhysical); SetReportSizeAndCount(8, 65536); AddReportConstant(top, kOutput, kNonNullableArray); - ValidateCollections(kUnreasonablyHugeReportDescriptor, - kUnreasonablyHugeReportDescriptorSize); + ValidateCollections(report_descriptor_data); } TEST_F(HidReportDescriptorTest, HighlyNestedReportLimitsDepth) { @@ -1688,15 +1677,13 @@ 0x75, 0x08, // Report Size (8) 0x90 // Output }; - static const size_t kHighlyNestedReportDescriptorSize = - base::size(kHighlyNestedReportDescriptor); + auto report_descriptor_data = base::make_span(kHighlyNestedReportDescriptor); auto info = HidCollectionInfo::New(); info->usage = HidUsageAndPage::New(0, 0); AddTopCollectionInfo(std::move(info)); // The item in the innermost collection should still be reflected in the // maximum report size. - ValidateDetails(false, 0, 1, 0, kHighlyNestedReportDescriptor, - kHighlyNestedReportDescriptorSize); + ValidateDetails(false, 0, 1, 0, report_descriptor_data); // Construct nested collections up to the depth limit. The item from the // innermost collection should be propagated to all its parents even though @@ -1706,8 +1693,7 @@ parent = AddChild(parent, 0, kCollectionTypePhysical); SetReportSizeAndCount(8, 1); AddReportConstant(parent, kOutput, kNonNullableArray); - ValidateCollections(kHighlyNestedReportDescriptor, - kHighlyNestedReportDescriptorSize); + ValidateCollections(report_descriptor_data); } TEST_F(HidReportDescriptorTest, ExtraEndCollectionIgnored) { @@ -1723,8 +1709,6 @@ 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0}; - static const size_t kExtraEndCollectionDescriptorSize = - base::size(kExtraEndCollectionDescriptor); // Construct nested collections up to the depth limit. If the extra End // Collection item was ignored, the depth limit should have prevented the @@ -1732,8 +1716,82 @@ auto* parent = AddTopCollection(0, kCollectionTypePhysical); for (size_t i = 1; i < 50; ++i) parent = AddChild(parent, 0, kCollectionTypePhysical); - ValidateCollections(kExtraEndCollectionDescriptor, - kExtraEndCollectionDescriptorSize); + ValidateCollections(base::make_span(kExtraEndCollectionDescriptor)); +} + +TEST_F(HidReportDescriptorTest, OneByteLogicalMinMax) { + static const uint8_t kOneByteLogicalMinMaxDescriptor[] = { + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 0x09, 0x04, // Usage (Joystick) + 0xA1, 0x01, // Collection (Application) + 0x75, 0x08, // Report Size (8) + 0x95, 0x01, // Report Count (1) + 0x09, 0x30, // Usage (X) + 0x15, 0x81, // Logical Minimum (-127) + 0x25, 0x7F, // Logical Maximum (127) + 0x35, 0x81, // Physical Minimum (-127) + 0x45, 0x7F, // Physical Maximum (127) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No + // Null Position) + 0xC0, // End Collection + }; + + auto* top = AddTopCollection(kUsageGenericDesktopJoystick, + kCollectionTypeApplication); + SetReportSizeAndCount(8, 1); + SetLogicalAndPhysicalBounds(-127, 127, -127, 127); + AddReportItem(top, kInput, kAbsoluteVariable, {kUsageGenericDesktopX}); + ValidateCollections(base::make_span(kOneByteLogicalMinMaxDescriptor)); +} + +TEST_F(HidReportDescriptorTest, TwoByteLogicalMinMax) { + static const uint8_t kTwoByteLogicalMinMaxDescriptor[] = { + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 0x09, 0x04, // Usage (Joystick) + 0xA1, 0x01, // Collection (Application) + 0x75, 0x10, // Report Size (16) + 0x95, 0x01, // Report Count (1) + 0x09, 0x30, // Usage (X) + 0x16, 0x01, 0x80, // Logical Minimum (-32767) + 0x26, 0xFF, 0x7F, // Logical Maximum (32767) + 0x36, 0x01, 0x80, // Physical Minimum (-32767) + 0x46, 0xFF, 0x7F, // Physical Maximum (32767) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred + // State,No Null Position) + 0xC0, // End Collection + }; + + auto* top = AddTopCollection(kUsageGenericDesktopJoystick, + kCollectionTypeApplication); + SetReportSizeAndCount(16, 1); + SetLogicalAndPhysicalBounds(-32767, 32767, -32767, 32767); + AddReportItem(top, kInput, kAbsoluteVariable, {kUsageGenericDesktopX}); + ValidateCollections(base::make_span(kTwoByteLogicalMinMaxDescriptor)); +} + +TEST_F(HidReportDescriptorTest, FourByteLogicalMinMax) { + static const uint8_t kFourByteLogicalMinMaxDescriptor[] = { + 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) + 0x09, 0x04, // Usage (Joystick) + 0xA1, 0x01, // Collection (Application) + 0x75, 0x20, // Report Size (32) + 0x95, 0x01, // Report Count (1) + 0x09, 0x30, // Usage (X) + 0x17, 0x01, 0x00, 0x00, 0x80, // Logical Minimum (-2147483647) + 0x27, 0xFF, 0xFF, 0xFF, 0x7F, // Logical Maximum (2147483647) + 0x37, 0x01, 0x00, 0x00, 0x80, // Physical Minimum (-2147483647) + 0x47, 0xFF, 0xFF, 0xFF, 0x7F, // Physical Maximum (2147483647) + 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear, + // Preferred State,No Null Position) + 0xC0, // End Collection + }; + + auto* top = AddTopCollection(kUsageGenericDesktopJoystick, + kCollectionTypeApplication); + SetReportSizeAndCount(32, 1); + SetLogicalAndPhysicalBounds(-2147483647, 2147483647, -2147483647, 2147483647); + AddReportItem(top, kInput, kAbsoluteVariable, {kUsageGenericDesktopX}); + ValidateCollections(base::make_span(kFourByteLogicalMinMaxDescriptor)); } } // namespace device
diff --git a/services/device/usb/usb_descriptors.cc b/services/device/usb/usb_descriptors.cc index a707fb0..ae0d30d 100644 --- a/services/device/usb/usb_descriptors.cc +++ b/services/device/usb/usb_descriptors.cc
@@ -374,9 +374,9 @@ return false; // The string is returned by the device in UTF-16LE. - *output = base::string16( - reinterpret_cast<const base::char16*>(descriptor.data() + 2), - length / 2 - 1); + *output = + base::string16(reinterpret_cast<const char16_t*>(descriptor.data() + 2), + (length - 2) / sizeof(char16_t)); return true; }
diff --git a/services/media_session/public/cpp/media_image_manager.cc b/services/media_session/public/cpp/media_image_manager.cc index 73fde77..6cb1fc3f 100644 --- a/services/media_session/public/cpp/media_image_manager.cc +++ b/services/media_session/public/cpp/media_image_manager.cc
@@ -157,8 +157,7 @@ const base::string16& type) { // These hashes are calculated in // MediaImageManagerTest_CheckExpectedImageTypeHashes - switch ( - base::PersistentHash(type.data(), type.size() * sizeof(base::char16))) { + switch (base::PersistentHash(type.data(), type.size() * sizeof(char16_t))) { case 0xfd295465: // image/bmp return kBMPTypeScore; case 0xce81e113: // image/gif
diff --git a/services/media_session/public/cpp/media_image_manager_unittest.cc b/services/media_session/public/cpp/media_image_manager_unittest.cc index dceed3b..8d1284c 100644 --- a/services/media_session/public/cpp/media_image_manager_unittest.cc +++ b/services/media_session/public/cpp/media_image_manager_unittest.cc
@@ -58,7 +58,7 @@ // Uncomment these lines to print the hashes if new ones need to be added. // printf("0x%x %s\n", // base::PersistentHash(type16.data(), - // type16.size() * sizeof(base::char16)), + // type16.size() * sizeof(char16_t)), // type.c_str()); EXPECT_TRUE(MediaImageManager::GetImageTypeScore(type16));
diff --git a/services/network/public/cpp/content_security_policy/content_security_policy.cc b/services/network/public/cpp/content_security_policy/content_security_policy.cc index 44f9ca1a..58c5a9c 100644 --- a/services/network/public/cpp/content_security_policy/content_security_policy.cc +++ b/services/network/public/cpp/content_security_policy/content_security_policy.cc
@@ -331,7 +331,7 @@ if (path[0] != '/') return false; - url::RawCanonOutputT<base::char16> unescaped; + url::RawCanonOutputT<char16_t> unescaped; url::DecodeURLEscapeSequences(path.data(), path.size(), url::DecodeURLMode::kUTF8OrIsomorphic, &unescaped);
diff --git a/services/network/public/cpp/content_security_policy/csp_source.cc b/services/network/public/cpp/content_security_policy/csp_source.cc index 3fe19c7..a1b56325 100644 --- a/services/network/public/cpp/content_security_policy/csp_source.cc +++ b/services/network/public/cpp/content_security_policy/csp_source.cc
@@ -22,7 +22,7 @@ } bool DecodePath(const base::StringPiece& path, std::string* output) { - url::RawCanonOutputT<base::char16> unescaped; + url::RawCanonOutputT<char16_t> unescaped; url::DecodeURLEscapeSequences(path.data(), path.size(), url::DecodeURLMode::kUTF8OrIsomorphic, &unescaped);
diff --git a/services/proxy_resolver/proxy_resolver_v8.cc b/services/proxy_resolver/proxy_resolver_v8.cc index ee82064f..56a5cfb8 100644 --- a/services/proxy_resolver/proxy_resolver_v8.cc +++ b/services/proxy_resolver/proxy_resolver_v8.cc
@@ -234,7 +234,7 @@ // Otherwise try to convert it from IDN to punycode. const int kInitialBufferSize = 256; - url::RawCanonOutputT<base::char16, kInitialBufferSize> punycode_output; + url::RawCanonOutputT<char16_t, kInitialBufferSize> punycode_output; if (!url::IDNToASCII(hostname_utf16.data(), hostname_utf16.length(), &punycode_output)) { return false;
diff --git a/services/tracing/perfetto/privacy_filtered_fields-inl.h b/services/tracing/perfetto/privacy_filtered_fields-inl.h index 227f520..2514c761 100644 --- a/services/tracing/perfetto/privacy_filtered_fields-inl.h +++ b/services/tracing/perfetto/privacy_filtered_fields-inl.h
@@ -200,10 +200,36 @@ constexpr MessageInfo kChromeMemoryPressureNotification = { kChromeMemoryPressureNotificationIndices, nullptr}; +// Proto Message: ChromeTaskAnnotator +constexpr int kChromeTaskAnnotatorIndices[] = {1, -1}; +constexpr MessageInfo kChromeTaskAnnotator = {kChromeTaskAnnotatorIndices, + nullptr}; + +// Proto Message: ChromeBrowserContext +constexpr int kChromeBrowserContextIndices[] = {1, -1}; +constexpr MessageInfo kChromeBrowserContext = {kChromeBrowserContextIndices, + nullptr}; + +// Proto Message: ChromeProfileDestroyer +constexpr int kChromeProfileDestroyerIndices[] = {1, 2, 4, 5, 6, -1}; +constexpr MessageInfo kChromeProfileDestroyer = {kChromeProfileDestroyerIndices, + nullptr}; + +// Proto Message: ChromeTaskPostedToDisabledQueue +constexpr int kChromeTaskPostedToDisabledQueueIndices[] = {2, 3, 4, -1}; +constexpr MessageInfo kChromeTaskPostedToDisabledQueue = { + kChromeTaskPostedToDisabledQueueIndices, nullptr}; + +// Proto Message: ChromeTaskGraphRunner +constexpr int kChromeTaskGraphRunnerIndices[] = {1, -1}; +constexpr MessageInfo kChromeTaskGraphRunner = {kChromeTaskGraphRunnerIndices, + nullptr}; + // Proto Message: TrackEvent constexpr int kTrackEventIndices[] = { - 1, 2, 3, 5, 6, 9, 10, 11, 12, 16, 17, 24, 25, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 38, 39, 40, 41, 42, 43, 1001, -1}; + 1, 2, 3, 5, 6, 9, 10, 11, 12, 16, 17, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 38, 39, + 40, 41, 42, 43, 1001, 1002, 1003, 1004, 1005, 1006, -1}; constexpr MessageInfo const* kTrackEventComplexMessages[] = { nullptr, nullptr, @@ -235,7 +261,12 @@ &kChromeWindowHandleEventInfo, nullptr, &kChromeContentSettingsEventInfo, - &kChromeMemoryPressureNotification}; + &kChromeMemoryPressureNotification, + &kChromeTaskAnnotator, + &kChromeBrowserContext, + &kChromeProfileDestroyer, + &kChromeTaskPostedToDisabledQueue, + &kChromeTaskGraphRunner}; constexpr MessageInfo kTrackEvent = {kTrackEventIndices, kTrackEventComplexMessages};
diff --git a/services/tracing/public/cpp/stack_sampling/loader_lock_sampler_test_strings.h b/services/tracing/public/cpp/stack_sampling/loader_lock_sampler_test_strings.h index 6e4093d..34daf591 100644 --- a/services/tracing/public/cpp/stack_sampling/loader_lock_sampler_test_strings.h +++ b/services/tracing/public/cpp/stack_sampling/loader_lock_sampler_test_strings.h
@@ -9,8 +9,8 @@ namespace loader_lock_sampler_test { -// wchar_t is used instead of base::char16 because this is included by -// loader_lock_sampler_test_dll.cc, which doesn't depend on base. +// wchar_t is used because this is included by loader_lock_sampler_test_dll.cc, +// which calls native Windows APIs. extern const wchar_t kWaitForLockEventName[]; extern const wchar_t kDropLockEventName[];
diff --git a/skia/BUILD.gn b/skia/BUILD.gn index 09e39b19..ea76d2a 100644 --- a/skia/BUILD.gn +++ b/skia/BUILD.gn
@@ -959,6 +959,8 @@ "//third_party/test_fonts", ] data_deps = [ "//third_party/test_fonts" ] + additional_manifests = + [ "//build/config/fuchsia/test/sys_launcher_capabilities.test-cmx" ] } if (skia_support_skottie) {
diff --git a/sql/statement.cc b/sql/statement.cc index c3a2a70..f59d420e 100644 --- a/sql/statement.cc +++ b/sql/statement.cc
@@ -368,11 +368,11 @@ return false; const void* data = ColumnBlob(col); - size_t len = ColumnByteLength(col) / sizeof(base::char16); + size_t len = ColumnByteLength(col) / sizeof(char16_t); val->resize(len); if (val->size() != len) return false; - val->assign(reinterpret_cast<const base::char16*>(data), len); + val->assign(reinterpret_cast<const char16_t*>(data), len); return true; }
diff --git a/storage/browser/database/database_util.cc b/storage/browser/database/database_util.cc index f555600..1488e05 100644 --- a/storage/browser/database/database_util.cc +++ b/storage/browser/database/database_util.cc
@@ -16,8 +16,8 @@ namespace { bool IsSafeSuffix(const base::string16& suffix) { - base::char16 prev_c = 0; - for (const base::char16 c : suffix) { + char16_t prev_c = 0; + for (const char16_t c : suffix) { if (!(base::IsAsciiAlpha(c) || base::IsAsciiDigit(c) || c == '-' || c == '.' || c == '_')) { return false;
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json index c52b3556..d889606 100644 --- a/testing/buildbot/chromium.android.json +++ b/testing/buildbot/chromium.android.json
@@ -40967,7 +40967,8 @@ "name": "shard #${SHARD_INDEX} logcats" } ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 2 }, "test": "android_browsertests", "test_id_prefix": "ninja://chrome/test:android_browsertests/" @@ -41179,7 +41180,6 @@ "--git-revision=${got_revision}", "--test-launcher-filter-file=../../testing/buildbot/filters/android.pie_arm64_rel.chrome_public_test_apk.filter" ], - "experiment_percentage": 10, "merge": { "args": [ "--bucket",
diff --git a/testing/buildbot/chromium.perf.calibration.json b/testing/buildbot/chromium.perf.calibration.json index ae2c9ce..8515823d9 100644 --- a/testing/buildbot/chromium.perf.calibration.json +++ b/testing/buildbot/chromium.perf.calibration.json
@@ -34,7 +34,7 @@ "ignore_task_failure": false, "io_timeout": 21600, "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 31 + "shards": 28 }, "trigger_script": { "args": [
diff --git a/testing/buildbot/filters/android.pie_arm64_rel.chrome_public_test_apk.filter b/testing/buildbot/filters/android.pie_arm64_rel.chrome_public_test_apk.filter index 43e455ae..7603816 100644 --- a/testing/buildbot/filters/android.pie_arm64_rel.chrome_public_test_apk.filter +++ b/testing/buildbot/filters/android.pie_arm64_rel.chrome_public_test_apk.filter
@@ -92,3 +92,7 @@ # crbug.com/1169250 -org.chromium.chrome.browser.omnibox.LocationBarTest.testFocusLogic_keyboardVisibility + +# crbug.com/1183540: Re-enable once the test sharding is optimized for batched tests, +# and does not cause timeout. +-org.chromium.chrome.browser.contextualsearch.ContextualSearchManagerTest.*
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl index dcc7e2a4..cca6db3 100644 --- a/testing/buildbot/test_suite_exceptions.pyl +++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -37,6 +37,7 @@ 'device_type': 'sailfish', }, ], + 'shards': 2, }, }, 'android-pie-x86-rel': { @@ -833,9 +834,6 @@ 'args': [ '--test-launcher-filter-file=../../testing/buildbot/filters/android.pie_arm64_rel.chrome_public_test_apk.filter', # https://crbug.com/1010211 ], - # TODO(crbug.com/1183540): Remove experimental once the test sharding is - # optimized for batched tests, and does not cause timeout. - 'experiment_percentage': 10, }, 'android-pie-x86-rel': { 'args': [
diff --git a/testing/libfuzzer/fuzzers/language_detection_fuzzer.cc b/testing/libfuzzer/fuzzers/language_detection_fuzzer.cc index f1ebbf3..942fdd3 100644 --- a/testing/libfuzzer/fuzzers/language_detection_fuzzer.cc +++ b/testing/libfuzzer/fuzzers/language_detection_fuzzer.cc
@@ -20,15 +20,15 @@ int lang_len = ch & 0xF; int html_lang_len = (ch >> 4) & 0xF; int text_len = static_cast<int>(size) - lang_len - html_lang_len; - if ((text_len < 0) || (text_len % 2 != 0)) { + if ((text_len < 0) || (text_len % sizeof(char16_t) != 0)) { return 0; } std::string lang(reinterpret_cast<const char*>(data), lang_len); std::string html_lang(reinterpret_cast<const char*>(data + lang_len), html_lang_len); base::string16 text( - reinterpret_cast<const base::char16*>(data + lang_len + html_lang_len), - text_len / 2); + reinterpret_cast<const char16_t*>(data + lang_len + html_lang_len), + text_len / sizeof(char16_t)); std::string model_detected_language; bool is_model_reliable; float model_reliability_score;
diff --git a/testing/test.gni b/testing/test.gni index 43316e7..2708c5f83 100644 --- a/testing/test.gni +++ b/testing/test.gni
@@ -233,14 +233,28 @@ _pkg_target = "${_output_name}_pkg" _exec_target = "${_output_name}__exec" - # TODO(1019938): switch the default to tests.cmx which doesn't request - # the deprecated-ambient-replace-as-executable feature. + # TODO(1019938): make minimum_capabilities.test-cmx the default and have + # everything added via additional_manifests if (!defined(invoker.manifest)) { - manifest = "//build/config/fuchsia/tests-with-exec.cmx" + if (!defined(invoker.additional_manifests)) { + manifest = "//build/config/fuchsia/tests-with-exec.cmx" + } else { + manifest = "//build/config/fuchsia/test/minimum_capabilities.test-cmx" + } } else { manifest = invoker.manifest } + if (defined(invoker.additional_manifests)) { + combined_manifest = "${target_name}.test-cmx" + cmc_merge(combined_manifest) { + sources = [ manifest ] + sources += invoker.additional_manifests + output_name = target_name + } + manifest = "${target_out_dir}/${combined_manifest}" + } + if (use_clang_coverage) { component_with_coverage_manifest = "${target_name}-coverage.test-cmx" cmc_merge(component_with_coverage_manifest) { @@ -271,8 +285,12 @@ cr_fuchsia_package(_pkg_target) { binary = ":$_exec_target" package_name_override = _output_name + deps = [] if (use_clang_coverage) { - deps = [ ":$component_with_coverage_manifest" ] + deps += [ ":$component_with_coverage_manifest" ] + } + if (defined(invoker.additional_manifests)) { + deps += [ ":$combined_manifest" ] } }
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 44700713..ae80140a 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -6584,6 +6584,24 @@ ] } ], + "SmartDimAutoMLModel": [ + { + "platforms": [ + "chromeos" + ], + "experiments": [ + { + "name": "Enabled", + "params": { + "smart_dim_experimental_version": "20210201.1" + }, + "enable_features": [ + "SmartDimExperimentalComponent" + ] + } + ] + } + ], "SmartSuggestionForLargeDownloads": [ { "platforms": [
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc index 6370db2e..008d725 100644 --- a/third_party/blink/common/features.cc +++ b/third_party/blink/common/features.cc
@@ -483,11 +483,6 @@ "IgnoreCrossOriginWindowWhenNamedAccessOnWindow", base::FEATURE_DISABLED_BY_DEFAULT}; -// When enabled, scripts in iframes are not force deferred by the DeferAllScript -// intervention. -const base::Feature kDisableForceDeferInChildFrames{ - "DisableForceDeferInChildFrames", base::FEATURE_DISABLED_BY_DEFAULT}; - // Enables redirecting subresources in the page to better compressed and // optimized versions to provide data savings. const base::Feature kSubresourceRedirect{"SubresourceRedirect", @@ -868,5 +863,10 @@ const base::Feature kScopeMemoryCachePerContext{ "ScopeMemoryCachePerContext", base::FEATURE_DISABLED_BY_DEFAULT}; +// Allow image context menu selections to penetrate through transparent +// elements. +const base::Feature kEnablePenetratingImageSelection{ + "EnablePenetratingImageSelection", base::FEATURE_DISABLED_BY_DEFAULT}; + } // namespace features } // namespace blink
diff --git a/third_party/blink/common/indexeddb/indexeddb_key_unittest.cc b/third_party/blink/common/indexeddb/indexeddb_key_unittest.cc index 17aec06..7017b6f 100644 --- a/third_party/blink/common/indexeddb/indexeddb_key_unittest.cc +++ b/third_party/blink/common/indexeddb/indexeddb_key_unittest.cc
@@ -34,9 +34,9 @@ keys.push_back(IndexedDBKey(date, mojom::IDBKeyType::Date)); estimates.push_back(24u); // Overhead + sizeof(double). - const base::string16 string(1024, static_cast<base::char16>('X')); + const base::string16 string(1024, static_cast<char16_t>('X')); keys.push_back(IndexedDBKey(std::move(string))); - // Overhead + string length * sizeof(base::char16). + // Overhead + string length * sizeof(char16_t). estimates.push_back(2064u); const size_t array_size = 1024;
diff --git a/third_party/blink/common/input/web_coalesced_input_event_mojom_traits.cc b/third_party/blink/common/input/web_coalesced_input_event_mojom_traits.cc index 06c3f54..cc9fdca 100644 --- a/third_party/blink/common/input/web_coalesced_input_event_mojom_traits.cc +++ b/third_party/blink/common/input/web_coalesced_input_event_mojom_traits.cc
@@ -14,7 +14,7 @@ namespace mojo { namespace { -void CopyString(base::char16* dst, const base::string16& text) { +void CopyString(char16_t* dst, const base::string16& text) { size_t pos = 0; for (base::i18n::UTF16CharIterator iter(text); !iter.end() && pos < blink::WebKeyboardEvent::kTextLengthCap - 1;
diff --git a/third_party/blink/common/messaging/string_message_codec.cc b/third_party/blink/common/messaging/string_message_codec.cc index 0a2e6da..130cdca 100644 --- a/third_party/blink/common/messaging/string_message_codec.cc +++ b/third_party/blink/common/messaging/string_message_codec.cc
@@ -74,8 +74,8 @@ } bool ContainsOnlyLatin1(const base::string16& data) { - base::char16 x = 0; - for (base::char16 c : data) + char16_t x = 0; + for (char16_t c : data) x |= c; return !(x & 0xFF00); } @@ -93,7 +93,7 @@ WriteUint32(data_latin1.size(), &buffer); WriteBytes(data_latin1.c_str(), data_latin1.size(), &buffer); } else { - size_t num_bytes = data.size() * sizeof(base::char16); + size_t num_bytes = data.size() * sizeof(char16_t); if ((buffer.size() + 1 + BytesNeededForUint32(num_bytes)) & 1) WriteUint8(kPaddingTag, &buffer); WriteUint8(kTwoByteStringTag, &buffer); @@ -134,7 +134,7 @@ uint32_t num_bytes; if (!ReadUint32(&ptr, end, &num_bytes)) return false; - result->assign(reinterpret_cast<const base::char16*>(ptr), num_bytes / 2); + result->assign(reinterpret_cast<const char16_t*>(ptr), num_bytes / 2); return true; } }
diff --git a/third_party/blink/common/page_state/page_state_serialization.cc b/third_party/blink/common/page_state/page_state_serialization.cc index 33f3bc9..b0914088 100644 --- a/third_party/blink/common/page_state/page_state_serialization.cc +++ b/third_party/blink/common/page_state/page_state_serialization.cc
@@ -292,8 +292,8 @@ // Pickles a base::string16 as <int length>:<char*16 data> tuple>. void WriteString(const base::string16& str, SerializeObject* obj) { - const base::char16* data = str.data(); - size_t length_in_bytes = str.length() * sizeof(base::char16); + const char16_t* data = str.data(); + size_t length_in_bytes = str.length() * sizeof(char16_t); CHECK_LT(length_in_bytes, static_cast<size_t>(std::numeric_limits<int>::max())); @@ -314,7 +314,7 @@ // This reads a serialized base::Optional<base::string16> from obj. If a string // can't be read, nullptr is returned. -const base::char16* ReadStringNoCopy(SerializeObject* obj, int* num_chars) { +const char16_t* ReadStringNoCopy(SerializeObject* obj, int* num_chars) { int length_in_bytes; if (!obj->iter.ReadInt(&length_in_bytes)) { obj->parse_error = true; @@ -331,13 +331,13 @@ } if (num_chars) - *num_chars = length_in_bytes / sizeof(base::char16); - return reinterpret_cast<const base::char16*>(data); + *num_chars = length_in_bytes / sizeof(char16_t); + return reinterpret_cast<const char16_t*>(data); } base::Optional<base::string16> ReadString(SerializeObject* obj) { int num_chars; - const base::char16* chars = ReadStringNoCopy(obj, &num_chars); + const char16_t* chars = ReadStringNoCopy(obj, &num_chars); base::Optional<base::string16> result; if (chars) result.emplace(chars, num_chars);
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h index 20c1fc1..8757272 100644 --- a/third_party/blink/public/common/features.h +++ b/third_party/blink/public/common/features.h
@@ -148,8 +148,6 @@ BLINK_COMMON_EXPORT extern const base::Feature kIgnoreCrossOriginWindowWhenNamedAccessOnWindow; -BLINK_COMMON_EXPORT extern const base::Feature kDisableForceDeferInChildFrames; - BLINK_COMMON_EXPORT extern const base::Feature kTransformInterop; BLINK_COMMON_EXPORT extern const base::Feature kSubresourceRedirect; @@ -358,6 +356,8 @@ BLINK_COMMON_EXPORT extern const base::Feature kScopeMemoryCachePerContext; +BLINK_COMMON_EXPORT extern const base::Feature kEnablePenetratingImageSelection; + } // namespace features } // namespace blink
diff --git a/third_party/blink/public/common/input/web_keyboard_event.h b/third_party/blink/public/common/input/web_keyboard_event.h index 5bd16ca..96aa206c 100644 --- a/third_party/blink/public/common/input/web_keyboard_event.h +++ b/third_party/blink/public/common/input/web_keyboard_event.h
@@ -59,8 +59,8 @@ // Windows guarantee one character per event. The Mac does not, but in // reality that's all it ever gives. We're generous, and cap it a bit // longer. - base::char16 text[kTextLengthCap] = {}; - base::char16 unmodified_text[kTextLengthCap] = {}; + char16_t text[kTextLengthCap] = {}; + char16_t unmodified_text[kTextLengthCap] = {}; WebKeyboardEvent(Type type, int modifiers, base::TimeTicks time_stamp) : WebInputEvent(type, modifiers, time_stamp) {}
diff --git a/third_party/blink/public/devtools_protocol/browser_protocol.pdl b/third_party/blink/public/devtools_protocol/browser_protocol.pdl index 496da47..f670ba95 100644 --- a/third_party/blink/public/devtools_protocol/browser_protocol.pdl +++ b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
@@ -7299,6 +7299,18 @@ string name Network.MonotonicTime timestamp + # Fired for all history navigations if BackForwardCache feature is enabled. Do not assume + # any ordering with the Page.frameNavigated event. This event is fired only for main-frame + # history navigation where the document changes (non-same-document navigations). + experimental event historyNavigationOutcomeReported + parameters + # The request id of the associated navigation. + Network.RequestId requestId + # The frame id of the associated frame. + FrameId frameId + # Indicates whether the frame is restored from BackForwardCache. + boolean isRestoredFromBackForwardCache + event loadEventFired parameters Network.MonotonicTime timestamp
diff --git a/third_party/blink/public/mojom/web_feature/web_feature.mojom b/third_party/blink/public/mojom/web_feature/web_feature.mojom index dfb949c9..f1e3475 100644 --- a/third_party/blink/public/mojom/web_feature/web_feature.mojom +++ b/third_party/blink/public/mojom/web_feature/web_feature.mojom
@@ -3157,6 +3157,7 @@ kV8ScreenAdvanced_Id_AttributeGetter = 3847, kV8ScreenAdvanced_PointerTypes_AttributeGetter = 3848, kV8ScreenAdvanced_Label_AttributeGetter = 3849, + kPermissionsPolicyHeader = 3850, // Add new features immediately above this line. Don't change assigned // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/blink/public/strings/translations/blink_strings_fa.xtb b/third_party/blink/public/strings/translations/blink_strings_fa.xtb index 38f837c..1a6f01a 100644 --- a/third_party/blink/public/strings/translations/blink_strings_fa.xtb +++ b/third_party/blink/public/strings/translations/blink_strings_fa.xtb
@@ -103,7 +103,7 @@ <translation id="3944740393230681990">گفتار آغازین</translation> <translation id="3960700977367013758">نوار پیمایش</translation> <translation id="4103419683916926126">میلی ثانیه</translation> -<translation id="4151657705144244502">گرافیک</translation> +<translation id="4151657705144244502">ترسیمی</translation> <translation id="4160057747563657758">تلفن</translation> <translation id="4193965531860883258">پیشگفتار</translation> <translation id="4201051445878709314">نمایش ماه قبلی</translation>
diff --git a/third_party/blink/public/web/web_local_frame.h b/third_party/blink/public/web/web_local_frame.h index ee414a8b..315c95a 100644 --- a/third_party/blink/public/web/web_local_frame.h +++ b/third_party/blink/public/web/web_local_frame.h
@@ -603,6 +603,7 @@ // Context menu ----------------------------------------------------------- // Returns the node that the context menu opened over. + virtual WebNode ContextMenuImageNode() const = 0; virtual WebNode ContextMenuNode() const = 0; // Copy to the clipboard the image located at a particular point in visual
diff --git a/third_party/blink/renderer/bindings/idl_in_core.gni b/third_party/blink/renderer/bindings/idl_in_core.gni index c533066..0be8b5c5 100644 --- a/third_party/blink/renderer/bindings/idl_in_core.gni +++ b/third_party/blink/renderer/bindings/idl_in_core.gni
@@ -111,7 +111,8 @@ "//third_party/blink/renderer/core/css/style_sheet.idl", "//third_party/blink/renderer/core/css/style_sheet_list.idl", "//third_party/blink/renderer/core/document_transition/document_transition.idl", - "//third_party/blink/renderer/core/document_transition/document_transition_init.idl", + "//third_party/blink/renderer/core/document_transition/document_transition_prepare_options.idl", + "//third_party/blink/renderer/core/document_transition/document_transition_start_options.idl", "//third_party/blink/renderer/core/document_transition/document_transition_supplement.idl", "//third_party/blink/renderer/core/dom/abort_controller.idl", "//third_party/blink/renderer/core/dom/abort_signal.idl",
diff --git a/third_party/blink/renderer/core/core_idl_files.gni b/third_party/blink/renderer/core/core_idl_files.gni index cd6f623..5b91cf3 100644 --- a/third_party/blink/renderer/core/core_idl_files.gni +++ b/third_party/blink/renderer/core/core_idl_files.gni
@@ -660,7 +660,8 @@ "css/property_definition.idl", "css/cssom/css_matrix_component_options.idl", "css/cssom/css_numeric_type.idl", - "document_transition/document_transition_init.idl", + "document_transition/document_transition_prepare_options.idl", + "document_transition/document_transition_start_options.idl", "dom/element_creation_options.idl", "dom/element_definition_options.idl", "dom/element_registration_options.idl",
diff --git a/third_party/blink/renderer/core/css/resolver/style_resolver.cc b/third_party/blink/renderer/core/css/resolver/style_resolver.cc index 448804d..58bbc47 100644 --- a/third_party/blink/renderer/core/css/resolver/style_resolver.cc +++ b/third_party/blink/renderer/core/css/resolver/style_resolver.cc
@@ -732,18 +732,10 @@ StyleResolverState state(GetDocument(), *element, style_request); - bool can_cache_animation_base_computed_style = - style_request.IsPseudoStyleRequest() || - (!style_request.parent_override && - !style_request.layout_parent_override && - style_request.matching_behavior == kMatchAllRules); - state.SetCanCacheBaseStyle(can_cache_animation_base_computed_style); - STACK_UNINITIALIZED StyleCascade cascade(state); ApplyBaseStyle(element, style_recalc_context, style_request, state, cascade, - cascade.MutableMatchResult(), style_request.matching_behavior, - can_cache_animation_base_computed_style); + cascade.MutableMatchResult(), style_request.matching_behavior); if (style_request.IsPseudoStyleRequest() && state.HadNoMatchedProperties()) return state.TakeStyle(); @@ -882,12 +874,11 @@ StyleResolverState& state, StyleCascade& cascade, MatchResult& match_result, - RuleMatchingBehavior matching_behavior, - bool can_cache_animation_base_computed_style) { + RuleMatchingBehavior matching_behavior) { DCHECK(style_request.pseudo_id != kPseudoIdFirstLineInherited); - bool base_is_usable = can_cache_animation_base_computed_style && - CanReuseBaseComputedStyle(state); + bool base_is_usable = + state.CanCacheBaseStyle() && CanReuseBaseComputedStyle(state); const ComputedStyle* animation_base_computed_style = base_is_usable ? CachedAnimationBaseComputedStyle(state) : nullptr; if (ShouldComputeBaseComputedStyle(animation_base_computed_style)) { @@ -1496,7 +1487,7 @@ // TODO(crbug.com/1145970): Use actual StyleRecalcContext. StyleRecalcContext style_recalc_context; ApplyBaseStyle(&element, style_recalc_context, style_request, state, cascade, - cascade.MutableMatchResult(), kMatchAllRules, true); + cascade.MutableMatchResult(), kMatchAllRules); ApplyInterpolations(state, cascade, interpolations); return state.TakeStyle();
diff --git a/third_party/blink/renderer/core/css/resolver/style_resolver.h b/third_party/blink/renderer/core/css/resolver/style_resolver.h index dd974f6..6a98391 100644 --- a/third_party/blink/renderer/core/css/resolver/style_resolver.h +++ b/third_party/blink/renderer/core/css/resolver/style_resolver.h
@@ -163,8 +163,7 @@ StyleResolverState& state, StyleCascade& cascade, MatchResult& match_result, - RuleMatchingBehavior matching_behavior, - bool can_cache_animation_base_computed_style); + RuleMatchingBehavior matching_behavior); void ApplyInterpolations(StyleResolverState& state, StyleCascade& cascade, ActiveInterpolationsMap& interpolations);
diff --git a/third_party/blink/renderer/core/css/resolver/style_resolver_state.cc b/third_party/blink/renderer/core/css/resolver/style_resolver_state.cc index 01ec7c62..f925643 100644 --- a/third_party/blink/renderer/core/css/resolver/style_resolver_state.cc +++ b/third_party/blink/renderer/core/css/resolver/style_resolver_state.cc
@@ -34,6 +34,17 @@ namespace blink { +namespace { + +bool CanCacheBaseStyle(const StyleRequest& style_request) { + return style_request.IsPseudoStyleRequest() || + (!style_request.parent_override && + !style_request.layout_parent_override && + style_request.matching_behavior == kMatchAllRules); +} + +} // namespace + StyleResolverState::StyleResolverState(Document& document, Element& element, const StyleRequest& style_request) @@ -49,7 +60,8 @@ pseudo_element_), element_type_(style_request.IsPseudoStyleRequest() ? ElementType::kPseudoElement - : ElementType::kElement) { + : ElementType::kElement), + can_cache_base_style_(blink::CanCacheBaseStyle(style_request)) { DCHECK(!!parent_style_ == !!layout_parent_style_); if (!parent_style_) {
diff --git a/third_party/blink/renderer/core/css/resolver/style_resolver_state.h b/third_party/blink/renderer/core/css/resolver/style_resolver_state.h index 8f9278d8..825d102 100644 --- a/third_party/blink/renderer/core/css/resolver/style_resolver_state.h +++ b/third_party/blink/renderer/core/css/resolver/style_resolver_state.h
@@ -165,7 +165,6 @@ // stored in the MatchedPropertiesCache. const CSSValue& ResolveLightDarkPair(const CSSProperty&, const CSSValue&); - void SetCanCacheBaseStyle(bool state) { can_cache_base_style_ = state; } bool CanCacheBaseStyle() const { return can_cache_base_style_; } bool HadNoMatchedProperties() const { return had_no_matched_properties_; }
diff --git a/third_party/blink/renderer/core/document_transition/document_transition.cc b/third_party/blink/renderer/core/document_transition/document_transition.cc index a72faa13..99a9914b 100644 --- a/third_party/blink/renderer/core/document_transition/document_transition.cc +++ b/third_party/blink/renderer/core/document_transition/document_transition.cc
@@ -5,7 +5,8 @@ #include "third_party/blink/renderer/core/document_transition/document_transition.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_document_transition_init.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_document_transition_prepare_options.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_document_transition_start_options.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/frame/local_frame_view.h" #include "third_party/blink/renderer/core/page/page.h" @@ -16,7 +17,8 @@ namespace blink { namespace { -const int32_t kDefaultDurationMs = 300; +constexpr base::TimeDelta kDefaultDuration = + base::TimeDelta::FromMilliseconds(300); DocumentTransition::Request::Effect ParseEffect(const String& input) { using MapType = HashMap<String, DocumentTransition::Request::Effect>; @@ -40,6 +42,19 @@ : DocumentTransition::Request::Effect::kNone; } +base::TimeDelta ParseDuration(const DocumentTransitionPrepareOptions* options) { + return options->hasDuration() + ? base::TimeDelta::FromMilliseconds(options->duration()) + : kDefaultDuration; +} + +DocumentTransition::Request::Effect ParseRootTransition( + const DocumentTransitionPrepareOptions* options) { + return options->hasRootTransition() + ? ParseEffect(options->rootTransition()) + : DocumentTransition::Request::Effect::kNone; +} + } // namespace DocumentTransition::DocumentTransition(Document* document) @@ -50,6 +65,7 @@ visitor->Trace(document_); visitor->Trace(prepare_promise_resolver_); visitor->Trace(start_promise_resolver_); + visitor->Trace(active_shared_elements_); ScriptWrappable::Trace(visitor); ActiveScriptWrappable::Trace(visitor); @@ -65,6 +81,7 @@ start_promise_resolver_->Detach(); start_promise_resolver_ = nullptr; } + active_shared_elements_.clear(); } bool DocumentTransition::HasPendingActivity() const { @@ -73,9 +90,10 @@ return false; } -ScriptPromise DocumentTransition::prepare(ScriptState* script_state, - const DocumentTransitionInit* params, - ExceptionState& exception_state) { +ScriptPromise DocumentTransition::prepare( + ScriptState* script_state, + const DocumentTransitionPrepareOptions* options, + ExceptionState& exception_state) { // Reject any previous prepare promises. if (state_ == State::kPreparing || state_ == State::kPrepared) { if (prepare_promise_resolver_) { @@ -106,15 +124,19 @@ return ScriptPromise(); } - // We're going to be creating a new transition, initialize the params. - ParseAndSetTransitionParameters(params); + // We're going to be creating a new transition, parse the options. + auto duration = ParseDuration(options); + auto effect = ParseRootTransition(options); + if (options->hasSharedElements()) + active_shared_elements_ = options->sharedElements(); + prepare_shared_element_count_ = active_shared_elements_.size(); prepare_promise_resolver_ = MakeGarbageCollected<ScriptPromiseResolver>(script_state); state_ = State::kPreparing; pending_request_ = Request::CreatePrepare( - effect_, duration_, + effect, duration, ConvertToBaseOnceCallback(CrossThreadBindOnce( &DocumentTransition::NotifyPrepareFinished, WrapCrossThreadWeakPersistent(this), last_prepare_sequence_id_))); @@ -123,8 +145,10 @@ return prepare_promise_resolver_->Promise(); } -ScriptPromise DocumentTransition::start(ScriptState* script_state, - ExceptionState& exception_state) { +ScriptPromise DocumentTransition::start( + ScriptState* script_state, + const DocumentTransitionStartOptions* options, + ExceptionState& exception_state) { if (state_ != State::kPrepared) { exception_state.ThrowDOMException( DOMExceptionCode::kInvalidStateError, @@ -132,6 +156,23 @@ return ScriptPromise(); } + DCHECK(active_shared_elements_.IsEmpty()); + if (options->hasSharedElements()) + active_shared_elements_ = options->sharedElements(); + + // We need to have the same amount of shared elements (even if null) as the + // prepared ones. + if (prepare_shared_element_count_ != active_shared_elements_.size()) { + exception_state.ThrowDOMException( + DOMExceptionCode::kInvalidStateError, + String::Format("Start request sharedElement count (%u) must match the " + "prepare sharedElement count (%u).", + active_shared_elements_.size(), + prepare_shared_element_count_)); + active_shared_elements_.clear(); + return ScriptPromise(); + } + last_start_sequence_id_ = next_sequence_id_++; state_ = State::kStarted; start_promise_resolver_ = @@ -171,6 +212,7 @@ prepare_promise_resolver_->Resolve(); prepare_promise_resolver_ = nullptr; state_ = State::kPrepared; + active_shared_elements_.clear(); } void DocumentTransition::NotifyStartFinished(uint32_t sequence_id) { @@ -188,6 +230,7 @@ start_promise_resolver_->Resolve(); start_promise_resolver_ = nullptr; state_ = State::kIdle; + active_shared_elements_.clear(); } std::unique_ptr<DocumentTransition::Request> @@ -195,12 +238,8 @@ return std::move(pending_request_); } -void DocumentTransition::ParseAndSetTransitionParameters( - const DocumentTransitionInit* params) { - duration_ = base::TimeDelta::FromMilliseconds( - params->hasDuration() ? params->duration() : kDefaultDurationMs); - effect_ = params->hasRootTransition() ? ParseEffect(params->rootTransition()) - : Request::Effect::kNone; +bool DocumentTransition::IsActiveElement(const Element* element) const { + return active_shared_elements_.Contains(element); } } // namespace blink
diff --git a/third_party/blink/renderer/core/document_transition/document_transition.h b/third_party/blink/renderer/core/document_transition/document_transition.h index 356ffc63..e1001ed6 100644 --- a/third_party/blink/renderer/core/document_transition/document_transition.h +++ b/third_party/blink/renderer/core/document_transition/document_transition.h
@@ -10,13 +10,15 @@ #include "third_party/blink/renderer/bindings/core/v8/script_promise.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" #include "third_party/blink/renderer/core/core_export.h" +#include "third_party/blink/renderer/core/dom/element.h" #include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h" #include "third_party/blink/renderer/platform/bindings/script_wrappable.h" namespace blink { class Document; -class DocumentTransitionInit; +class DocumentTransitionPrepareOptions; +class DocumentTransitionStartOptions; class ScriptState; class CORE_EXPORT DocumentTransition @@ -41,13 +43,18 @@ // JavaScript API implementation. ScriptPromise prepare(ScriptState*, - const DocumentTransitionInit*, + const DocumentTransitionPrepareOptions*, ExceptionState&); - ScriptPromise start(ScriptState*, ExceptionState&); + ScriptPromise start(ScriptState*, + const DocumentTransitionStartOptions*, + ExceptionState&); // This uses std::move semantics to take the request from this object. std::unique_ptr<Request> TakePendingRequest(); + // Returns true if the given element is active in this transition. + bool IsActiveElement(const Element*) const; + private: friend class DocumentTransitionTest; @@ -58,16 +65,23 @@ void NotifyPrepareFinished(uint32_t sequence_id); void NotifyStartFinished(uint32_t sequence_id); - void ParseAndSetTransitionParameters(const DocumentTransitionInit* params); - Member<Document> document_; State state_ = State::kIdle; Member<ScriptPromiseResolver> prepare_promise_resolver_; Member<ScriptPromiseResolver> start_promise_resolver_; - base::TimeDelta duration_; - Request::Effect effect_ = Request::Effect::kNone; + + // `active_shared_elements_` represents elements that are identified as shared + // during the current step of the transition. Specifically, it represents + // `prepare()` call sharedElements if the state is kPreparing and `start()` + // call sharedElements if the state is kStarted. + // `prepare_shared_element_count_` represents the number of shared elements + // that were specified in the `prepare()` call. This is used to verify that + // the number of shared elements specified in the `prepare()` and `start()` + // calls is the same. + HeapVector<Member<Element>> active_shared_elements_; + wtf_size_t prepare_shared_element_count_ = 0u; std::unique_ptr<Request> pending_request_;
diff --git a/third_party/blink/renderer/core/document_transition/document_transition.idl b/third_party/blink/renderer/core/document_transition/document_transition.idl index 0ca7ef4..e1b8042 100644 --- a/third_party/blink/renderer/core/document_transition/document_transition.idl +++ b/third_party/blink/renderer/core/document_transition/document_transition.idl
@@ -13,9 +13,9 @@ // - Rejects any previous unresolved prepare() promises. // - Returns a promise that resolves after the transition has been // prepared. - [CallWith=ScriptState, RaisesException] Promise<void> prepare(optional DocumentTransitionInit params = {}); + [CallWith=ScriptState, RaisesException] Promise<void> prepare(optional DocumentTransitionPrepareOptions options = {}); // Can only be called after prepare(), during the task during // which prepare() most recently resolved. - [CallWith=ScriptState, RaisesException] Promise<void> start(); + [CallWith=ScriptState, RaisesException] Promise<void> start(optional DocumentTransitionStartOptions options = {}); };
diff --git a/third_party/blink/renderer/core/document_transition/document_transition_init.idl b/third_party/blink/renderer/core/document_transition/document_transition_prepare_options.idl similarity index 71% rename from third_party/blink/renderer/core/document_transition/document_transition_init.idl rename to third_party/blink/renderer/core/document_transition/document_transition_prepare_options.idl index 3ff0d26..5bb8910 100644 --- a/third_party/blink/renderer/core/document_transition/document_transition_init.idl +++ b/third_party/blink/renderer/core/document_transition/document_transition_prepare_options.idl
@@ -17,7 +17,8 @@ "reveal-up" }; -dictionary DocumentTransitionInit { - RootTransitionType rootTransition = "none"; - DOMTimeStamp duration = 0; +dictionary DocumentTransitionPrepareOptions { + RootTransitionType rootTransition; + DOMTimeStamp duration; + sequence<Element?> sharedElements; };
diff --git a/third_party/blink/renderer/core/document_transition/document_transition_start_options.idl b/third_party/blink/renderer/core/document_transition/document_transition_start_options.idl new file mode 100644 index 0000000..8bc91eb --- /dev/null +++ b/third_party/blink/renderer/core/document_transition/document_transition_start_options.idl
@@ -0,0 +1,7 @@ +// Copyright 2021 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. + +dictionary DocumentTransitionStartOptions { + sequence<Element?> sharedElements; +};
diff --git a/third_party/blink/renderer/core/document_transition/document_transition_test.cc b/third_party/blink/renderer/core/document_transition/document_transition_test.cc index 38b6fcb..236403e 100644 --- a/third_party/blink/renderer/core/document_transition/document_transition_test.cc +++ b/third_party/blink/renderer/core/document_transition/document_transition_test.cc
@@ -7,7 +7,8 @@ #include "base/test/scoped_feature_list.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_tester.h" #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_testing.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_document_transition_init.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_document_transition_prepare_options.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_document_transition_start_options.h" #include "third_party/blink/renderer/bindings/core/v8/v8_root_transition_type.h" #include "third_party/blink/renderer/core/document_transition/document_transition_supplement.h" #include "third_party/blink/renderer/core/testing/core_unit_test_helper.h" @@ -29,7 +30,7 @@ // Testing the compositor interaction is not in scope for these unittests. So, // instead of setting up a full commit flow, simulate it by calling the commit // callback directly. - void UpdateAllLifecyclePhasesAndSimulateCommit() { + void UpdateAllLifecyclePhasesAndFinishDirectives() { UpdateAllLifecyclePhasesForTest(); for (auto& request : GetChromeClient() .layer_tree_host() @@ -58,7 +59,7 @@ } TEST_F(DocumentTransitionTest, TransitionPreparePromiseResolves) { - DocumentTransitionInit init; + DocumentTransitionPrepareOptions options; auto* transition = DocumentTransitionSupplement::documentTransition(GetDocument()); ASSERT_TRUE(transition); @@ -69,10 +70,11 @@ ExceptionState& exception_state = v8_scope.GetExceptionState(); ScriptPromiseTester promise_tester( - script_state, transition->prepare(script_state, &init, exception_state)); + script_state, + transition->prepare(script_state, &options, exception_state)); EXPECT_EQ(GetState(transition), State::kPreparing); - UpdateAllLifecyclePhasesAndSimulateCommit(); + UpdateAllLifecyclePhasesAndFinishDirectives(); promise_tester.WaitUntilSettled(); EXPECT_TRUE(promise_tester.IsFulfilled()); @@ -87,16 +89,18 @@ ScriptState* script_state = v8_scope.GetScriptState(); ExceptionState& exception_state = v8_scope.GetExceptionState(); - DocumentTransitionInit init; + DocumentTransitionPrepareOptions options; ScriptPromiseTester first_promise_tester( - script_state, transition->prepare(script_state, &init, exception_state)); + script_state, + transition->prepare(script_state, &options, exception_state)); EXPECT_EQ(GetState(transition), State::kPreparing); ScriptPromiseTester second_promise_tester( - script_state, transition->prepare(script_state, &init, exception_state)); + script_state, + transition->prepare(script_state, &options, exception_state)); EXPECT_EQ(GetState(transition), State::kPreparing); - UpdateAllLifecyclePhasesAndSimulateCommit(); + UpdateAllLifecyclePhasesAndFinishDirectives(); first_promise_tester.WaitUntilSettled(); second_promise_tester.WaitUntilSettled(); @@ -113,8 +117,8 @@ V8TestingScope v8_scope; ScriptState* script_state = v8_scope.GetScriptState(); ExceptionState& exception_state = v8_scope.GetExceptionState(); - DocumentTransitionInit default_init; - transition->prepare(script_state, &default_init, exception_state); + DocumentTransitionPrepareOptions default_options; + transition->prepare(script_state, &default_options, exception_state); auto request = transition->TakePendingRequest(); ASSERT_TRUE(request); @@ -123,10 +127,10 @@ EXPECT_EQ(directive.effect(), DocumentTransition::Request::Effect::kNone); // Test "explode" effect parsing. - DocumentTransitionInit explode_init; - explode_init.setRootTransition( + DocumentTransitionPrepareOptions explode_options; + explode_options.setRootTransition( V8RootTransitionType(V8RootTransitionType::Enum::kExplode)); - transition->prepare(script_state, &explode_init, exception_state); + transition->prepare(script_state, &explode_options, exception_state); request = transition->TakePendingRequest(); ASSERT_TRUE(request); @@ -135,6 +139,156 @@ EXPECT_EQ(directive.effect(), DocumentTransition::Request::Effect::kExplode); } +TEST_F(DocumentTransitionTest, DurationParsing) { + // Test default init. + auto* transition = + DocumentTransitionSupplement::documentTransition(GetDocument()); + + V8TestingScope v8_scope; + ScriptState* script_state = v8_scope.GetScriptState(); + ExceptionState& exception_state = v8_scope.GetExceptionState(); + DocumentTransitionPrepareOptions default_options; + transition->prepare(script_state, &default_options, exception_state); + + auto request = transition->TakePendingRequest(); + ASSERT_TRUE(request); + + auto directive = request->ConstructDirective(); + EXPECT_EQ(directive.duration(), base::TimeDelta::FromMilliseconds(300)); + + // Test set duration parsing. + DocumentTransitionPrepareOptions explode_options; + explode_options.setDuration(123); + transition->prepare(script_state, &explode_options, exception_state); + + request = transition->TakePendingRequest(); + ASSERT_TRUE(request); + + directive = request->ConstructDirective(); + EXPECT_EQ(directive.duration(), base::TimeDelta::FromMilliseconds(123)); +} + +TEST_F(DocumentTransitionTest, PrepareSharedElementsWantToBeComposited) { + SetHtmlInnerHTML(R"HTML( + <div id=e1></div> + <div id=e2></div> + <div id=e3></div> + )HTML"); + + auto* e1 = GetDocument().getElementById("e1"); + auto* e2 = GetDocument().getElementById("e2"); + auto* e3 = GetDocument().getElementById("e3"); + + auto* transition = + DocumentTransitionSupplement::documentTransition(GetDocument()); + + V8TestingScope v8_scope; + ScriptState* script_state = v8_scope.GetScriptState(); + ExceptionState& exception_state = v8_scope.GetExceptionState(); + + EXPECT_FALSE(e1->ShouldCompositeForDocumentTransition()); + EXPECT_FALSE(e2->ShouldCompositeForDocumentTransition()); + EXPECT_FALSE(e3->ShouldCompositeForDocumentTransition()); + + DocumentTransitionPrepareOptions options; + // Set two of the elements to be shared. + options.setSharedElements({e1, e3}); + transition->prepare(script_state, &options, exception_state); + + EXPECT_TRUE(e1->ShouldCompositeForDocumentTransition()); + EXPECT_FALSE(e2->ShouldCompositeForDocumentTransition()); + EXPECT_TRUE(e3->ShouldCompositeForDocumentTransition()); + + UpdateAllLifecyclePhasesAndFinishDirectives(); + + EXPECT_FALSE(e1->ShouldCompositeForDocumentTransition()); + EXPECT_FALSE(e2->ShouldCompositeForDocumentTransition()); + EXPECT_FALSE(e3->ShouldCompositeForDocumentTransition()); +} + +TEST_F(DocumentTransitionTest, StartSharedElementCountMismatch) { + SetHtmlInnerHTML(R"HTML( + <div id=e1></div> + <div id=e2></div> + <div id=e3></div> + )HTML"); + + auto* e1 = GetDocument().getElementById("e1"); + auto* e2 = GetDocument().getElementById("e2"); + auto* e3 = GetDocument().getElementById("e3"); + + auto* transition = + DocumentTransitionSupplement::documentTransition(GetDocument()); + + V8TestingScope v8_scope; + ScriptState* script_state = v8_scope.GetScriptState(); + ExceptionState& exception_state = v8_scope.GetExceptionState(); + + DocumentTransitionPrepareOptions prepare_options; + // Set two of the elements to be shared. + prepare_options.setSharedElements({e1, e3}); + transition->prepare(script_state, &prepare_options, exception_state); + + UpdateAllLifecyclePhasesAndFinishDirectives(); + + DocumentTransitionStartOptions start_options; + // Set all of the elements as shared. This should cause an exception. + start_options.setSharedElements({e1, e2, e3}); + + EXPECT_FALSE(exception_state.HadException()); + transition->start(script_state, &start_options, exception_state); + EXPECT_TRUE(exception_state.HadException()); + + EXPECT_FALSE(e1->ShouldCompositeForDocumentTransition()); + EXPECT_FALSE(e2->ShouldCompositeForDocumentTransition()); + EXPECT_FALSE(e3->ShouldCompositeForDocumentTransition()); +} + +TEST_F(DocumentTransitionTest, StartSharedElementsWantToBeComposited) { + SetHtmlInnerHTML(R"HTML( + <div id=e1></div> + <div id=e2></div> + <div id=e3></div> + )HTML"); + + auto* e1 = GetDocument().getElementById("e1"); + auto* e2 = GetDocument().getElementById("e2"); + auto* e3 = GetDocument().getElementById("e3"); + + auto* transition = + DocumentTransitionSupplement::documentTransition(GetDocument()); + + V8TestingScope v8_scope; + ScriptState* script_state = v8_scope.GetScriptState(); + ExceptionState& exception_state = v8_scope.GetExceptionState(); + + DocumentTransitionPrepareOptions prepare_options; + // Set two of the elements to be shared. + prepare_options.setSharedElements({e1, e3}); + transition->prepare(script_state, &prepare_options, exception_state); + + EXPECT_TRUE(e1->ShouldCompositeForDocumentTransition()); + EXPECT_FALSE(e2->ShouldCompositeForDocumentTransition()); + EXPECT_TRUE(e3->ShouldCompositeForDocumentTransition()); + + UpdateAllLifecyclePhasesAndFinishDirectives(); + + DocumentTransitionStartOptions start_options; + // Set two different elements as shared. + start_options.setSharedElements({e1, e2}); + transition->start(script_state, &start_options, exception_state); + + EXPECT_TRUE(e1->ShouldCompositeForDocumentTransition()); + EXPECT_TRUE(e2->ShouldCompositeForDocumentTransition()); + EXPECT_FALSE(e3->ShouldCompositeForDocumentTransition()); + + UpdateAllLifecyclePhasesAndFinishDirectives(); + + EXPECT_FALSE(e1->ShouldCompositeForDocumentTransition()); + EXPECT_FALSE(e2->ShouldCompositeForDocumentTransition()); + EXPECT_FALSE(e3->ShouldCompositeForDocumentTransition()); +} + TEST_F(DocumentTransitionTest, AdditionalPrepareAfterPreparedSucceeds) { auto* transition = DocumentTransitionSupplement::documentTransition(GetDocument()); @@ -143,21 +297,23 @@ ScriptState* script_state = v8_scope.GetScriptState(); ExceptionState& exception_state = v8_scope.GetExceptionState(); - DocumentTransitionInit init; + DocumentTransitionPrepareOptions options; ScriptPromiseTester first_promise_tester( - script_state, transition->prepare(script_state, &init, exception_state)); + script_state, + transition->prepare(script_state, &options, exception_state)); EXPECT_EQ(GetState(transition), State::kPreparing); - UpdateAllLifecyclePhasesAndSimulateCommit(); + UpdateAllLifecyclePhasesAndFinishDirectives(); first_promise_tester.WaitUntilSettled(); EXPECT_TRUE(first_promise_tester.IsFulfilled()); EXPECT_EQ(GetState(transition), State::kPrepared); ScriptPromiseTester second_promise_tester( - script_state, transition->prepare(script_state, &init, exception_state)); + script_state, + transition->prepare(script_state, &options, exception_state)); EXPECT_EQ(GetState(transition), State::kPreparing); - UpdateAllLifecyclePhasesAndSimulateCommit(); + UpdateAllLifecyclePhasesAndFinishDirectives(); second_promise_tester.WaitUntilSettled(); EXPECT_TRUE(second_promise_tester.IsFulfilled()); EXPECT_EQ(GetState(transition), State::kPrepared); @@ -168,16 +324,16 @@ ScriptState* script_state = v8_scope.GetScriptState(); ExceptionState& exception_state = v8_scope.GetExceptionState(); - DocumentTransitionInit init; + DocumentTransitionPrepareOptions options; ScriptPromiseTester tester( script_state, DocumentTransitionSupplement::documentTransition(GetDocument()) - ->prepare(script_state, &init, exception_state)); + ->prepare(script_state, &options, exception_state)); // ActiveScriptWrappable should keep the transition alive. ThreadState::Current()->CollectAllGarbageForTesting(); - UpdateAllLifecyclePhasesAndSimulateCommit(); + UpdateAllLifecyclePhasesAndFinishDirectives(); tester.WaitUntilSettled(); EXPECT_TRUE(tester.IsFulfilled()); } @@ -192,7 +348,8 @@ ScriptState* script_state = v8_scope.GetScriptState(); ExceptionState& exception_state = v8_scope.GetExceptionState(); - transition->start(script_state, exception_state); + DocumentTransitionStartOptions options; + transition->start(script_state, &options, exception_state); EXPECT_EQ(GetState(transition), State::kIdle); EXPECT_FALSE(transition->TakePendingRequest()); EXPECT_TRUE(exception_state.HadException()); @@ -206,18 +363,21 @@ ScriptState* script_state = v8_scope.GetScriptState(); ExceptionState& exception_state = v8_scope.GetExceptionState(); - DocumentTransitionInit init; + DocumentTransitionPrepareOptions prepare_options; ScriptPromiseTester prepare_tester( - script_state, transition->prepare(script_state, &init, exception_state)); + script_state, + transition->prepare(script_state, &prepare_options, exception_state)); EXPECT_EQ(GetState(transition), State::kPreparing); - UpdateAllLifecyclePhasesAndSimulateCommit(); + UpdateAllLifecyclePhasesAndFinishDirectives(); prepare_tester.WaitUntilSettled(); EXPECT_TRUE(prepare_tester.IsFulfilled()); EXPECT_EQ(GetState(transition), State::kPrepared); + DocumentTransitionStartOptions start_options; ScriptPromiseTester start_tester( - script_state, transition->start(script_state, exception_state)); + script_state, + transition->start(script_state, &start_options, exception_state)); // Take the request. auto start_request = transition->TakePendingRequest(); EXPECT_TRUE(start_request); @@ -225,7 +385,7 @@ // Subsequent starts should get an exception. EXPECT_FALSE(exception_state.HadException()); - transition->start(script_state, exception_state); + transition->start(script_state, &start_options, exception_state); EXPECT_TRUE(exception_state.HadException()); EXPECT_FALSE(transition->TakePendingRequest()); @@ -243,21 +403,24 @@ ScriptState* script_state = v8_scope.GetScriptState(); ExceptionState& exception_state = v8_scope.GetExceptionState(); - DocumentTransitionInit init; + DocumentTransitionPrepareOptions prepare_options; ScriptPromiseTester prepare_tester( - script_state, transition->prepare(script_state, &init, exception_state)); + script_state, + transition->prepare(script_state, &prepare_options, exception_state)); EXPECT_EQ(GetState(transition), State::kPreparing); - UpdateAllLifecyclePhasesAndSimulateCommit(); + UpdateAllLifecyclePhasesAndFinishDirectives(); prepare_tester.WaitUntilSettled(); EXPECT_TRUE(prepare_tester.IsFulfilled()); EXPECT_EQ(GetState(transition), State::kPrepared); + DocumentTransitionStartOptions start_options; ScriptPromiseTester start_tester( - script_state, transition->start(script_state, exception_state)); + script_state, + transition->start(script_state, &start_options, exception_state)); EXPECT_EQ(GetState(transition), State::kStarted); - UpdateAllLifecyclePhasesAndSimulateCommit(); + UpdateAllLifecyclePhasesAndFinishDirectives(); start_tester.WaitUntilSettled(); EXPECT_TRUE(start_tester.IsFulfilled());
diff --git a/third_party/blink/renderer/core/dom/document.idl b/third_party/blink/renderer/core/dom/document.idl index 7e2a1ac..a831dba 100644 --- a/third_party/blink/renderer/core/dom/document.idl +++ b/third_party/blink/renderer/core/dom/document.idl
@@ -21,9 +21,8 @@ // https://html.spec.whatwg.org/C/#the-document-object enum DocumentReadyState { "loading", "interactive", "complete" }; - -// https://w3c.github.io/page-visibility/#visibility-states-and-the-visibilitystate-enum -enum VisibilityState { "hidden", "visible", "prerender"}; +// https://w3c.github.io/page-visibility/#visibilitystate-enum +enum VisibilityState { "hidden", "visible" }; // https://wicg.github.io/cors-rfc1918/#feature-detect enum AddressSpace { "local", "private", "public" };
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc index d3080bc..e168b80 100644 --- a/third_party/blink/renderer/core/dom/element.cc +++ b/third_party/blink/renderer/core/dom/element.cc
@@ -68,6 +68,7 @@ #include "third_party/blink/renderer/core/display_lock/display_lock_context.h" #include "third_party/blink/renderer/core/display_lock/display_lock_document_state.h" #include "third_party/blink/renderer/core/display_lock/display_lock_utilities.h" +#include "third_party/blink/renderer/core/document_transition/document_transition_supplement.h" #include "third_party/blink/renderer/core/dom/attr.h" #include "third_party/blink/renderer/core/dom/dataset_dom_string_map.h" #include "third_party/blink/renderer/core/dom/document.h" @@ -5952,6 +5953,13 @@ } } +bool Element::ShouldCompositeForDocumentTransition() const { + auto* document_transition_supplement = + DocumentTransitionSupplement::FromIfExists(GetDocument()); + return document_transition_supplement && + document_transition_supplement->GetTransition()->IsActiveElement(this); +} + inline void Element::SetInlineStyleFromString( const AtomicString& new_style_string) { DCHECK(IsStyledElement());
diff --git a/third_party/blink/renderer/core/dom/element.h b/third_party/blink/renderer/core/dom/element.h index 939b8bc..fe435103 100644 --- a/third_party/blink/renderer/core/dom/element.h +++ b/third_party/blink/renderer/core/dom/element.h
@@ -947,6 +947,11 @@ void NotifyInlineStyleMutation(); + // Returns true if this element should composite due to a document transition. + // See third_party/blink/renderer/core/document_transition/README.md for more + // information. + bool ShouldCompositeForDocumentTransition() const; + protected: const ElementData* GetElementData() const { return element_data_.Get(); } UniqueElementData& EnsureUniqueElementData();
diff --git a/third_party/blink/renderer/core/dom/frame_request_callback_collection.cc b/third_party/blink/renderer/core/dom/frame_request_callback_collection.cc index 3c593fc..4ca5703 100644 --- a/third_party/blink/renderer/core/dom/frame_request_callback_collection.cc +++ b/third_party/blink/renderer/core/dom/frame_request_callback_collection.cc
@@ -61,6 +61,8 @@ double high_res_now_ms_legacy) { TRACE_EVENT0("blink", "FrameRequestCallbackCollection::ExecuteFrameCallbacks"); + ExecutionContext::ScopedRequestAnimationFrameStatus scoped_raf_status( + context_); // First, generate a list of callbacks to consider. Callbacks registered from // this point on are considered only for the "next" frame, not this one.
diff --git a/third_party/blink/renderer/core/dom/scripted_animation_controller_test.cc b/third_party/blink/renderer/core/dom/scripted_animation_controller_test.cc index 1539108..d4c19ae8 100644 --- a/third_party/blink/renderer/core/dom/scripted_animation_controller_test.cc +++ b/third_party/blink/renderer/core/dom/scripted_animation_controller_test.cc
@@ -210,4 +210,23 @@ EXPECT_FALSE(Controller().HasFrameCallback()); } +TEST_F(ScriptedAnimationControllerTest, TestIsInRequestAnimationFrame) { + EXPECT_FALSE(Controller().GetExecutionContext()->IsInRequestAnimationFrame()); + + bool ran_callback = false; + Controller().RegisterFrameCallback( + MakeGarbageCollected<RunTaskCallback>(base::BindRepeating( + [](ScriptedAnimationController* controller, bool* ran_callback) { + EXPECT_TRUE( + controller->GetExecutionContext()->IsInRequestAnimationFrame()); + *ran_callback = true; + }, + WrapPersistent(&Controller()), WTF::Unretained(&ran_callback)))); + + Controller().ServiceScriptedAnimations(base::TimeTicks()); + EXPECT_TRUE(ran_callback); + + EXPECT_FALSE(Controller().GetExecutionContext()->IsInRequestAnimationFrame()); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/finder/async_find_buffer.cc b/third_party/blink/renderer/core/editing/finder/async_find_buffer.cc index dc8b97ee..0500805 100644 --- a/third_party/blink/renderer/core/editing/finder/async_find_buffer.cc +++ b/third_party/blink/renderer/core/editing/finder/async_find_buffer.cc
@@ -19,10 +19,14 @@ String search_text, FindOptions options, Callback completeCallback) { - iterations_ = 0; - search_start_time_ = base::TimeTicks::Now(); - NextIteration(search_range, search_text, options, - std::move(completeCallback)); + pending_find_match_task_ = PostCancellableTask( + *search_range->OwnerDocument() + .GetTaskRunner(TaskType::kInternalFindInPage) + .get(), + FROM_HERE, + WTF::Bind(&AsyncFindBuffer::Run, WrapWeakPersistent(this), + WrapWeakPersistent(search_range), search_text, options, + std::move(completeCallback))); } void AsyncFindBuffer::Cancel() { @@ -38,38 +42,16 @@ EphemeralRangeInFlatTree range = FindBuffer::FindMatchInRange( EphemeralRangeInFlatTree(search_range), search_text, options, kFindBufferTaskTimeoutMs); - if (range.IsNotNull() && range.IsCollapsed()) { // FindBuffer reached time limit - Start/End of range is last checked // position search_range->setStart(ToPositionInDOMTree(range.StartPosition())); - NextIteration(search_range, search_text, options, - std::move(completeCallback)); + FindMatchInRange(search_range, search_text, options, + std::move(completeCallback)); return; } - // Search finished, return the result - UMA_HISTOGRAM_COUNTS_100("SharedHighlights.AsyncTask.Iterations", - iterations_); - UMA_HISTOGRAM_TIMES("SharedHighlights.AsyncTask.SearchDuration", - base::TimeTicks::Now() - search_start_time_); - std::move(completeCallback).Run(range); } -void AsyncFindBuffer::NextIteration(Range* search_range, - String search_text, - FindOptions options, - Callback completeCallback) { - iterations_++; - pending_find_match_task_ = PostCancellableTask( - *search_range->OwnerDocument() - .GetTaskRunner(TaskType::kInternalFindInPage) - .get(), - FROM_HERE, - WTF::Bind(&AsyncFindBuffer::Run, WrapWeakPersistent(this), - WrapWeakPersistent(search_range), search_text, options, - std::move(completeCallback))); -} - } // namespace blink
diff --git a/third_party/blink/renderer/core/editing/finder/async_find_buffer.h b/third_party/blink/renderer/core/editing/finder/async_find_buffer.h index e426f2f..9d581ee 100644 --- a/third_party/blink/renderer/core/editing/finder/async_find_buffer.h +++ b/third_party/blink/renderer/core/editing/finder/async_find_buffer.h
@@ -32,19 +32,7 @@ FindOptions options, Callback completeCallback); - void NextIteration(Range* search_range, - String search_text, - FindOptions options, - Callback completeCallback); - TaskHandle pending_find_match_task_; - - // Number of iterations it took to complete |FindMatchInRange| request. Used - // for recording UMA histograms. - int iterations_ = 0; - - // |FindMatchInRange| start time. Used for recorsing UMA histograms. - base::TimeTicks search_start_time_; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/execution_context/execution_context.h b/third_party/blink/renderer/core/execution_context/execution_context.h index 2e5b560..8939805 100644 --- a/third_party/blink/renderer/core/execution_context/execution_context.h +++ b/third_party/blink/renderer/core/execution_context/execution_context.h
@@ -407,6 +407,30 @@ void FileSharedArrayBufferCreationIssue(); + bool IsInRequestAnimationFrame() const { + return is_in_request_animation_frame_; + } + + // For use by FrameRequestCallbackCollection::ExecuteFrameCallbacks(); + // IsInRequestAnimationFrame() for the corresponding ExecutionContext will + // return true while this instance exists. + class ScopedRequestAnimationFrameStatus { + STACK_ALLOCATED(); + + public: + explicit ScopedRequestAnimationFrameStatus(ExecutionContext* context) + : context_(context) { + DCHECK(!context_->is_in_request_animation_frame_); + context_->is_in_request_animation_frame_ = true; + } + ~ScopedRequestAnimationFrameStatus() { + context_->is_in_request_animation_frame_ = false; + } + + private: + ExecutionContext* context_; + }; + protected: explicit ExecutionContext(v8::Isolate* isolate, Agent*); ExecutionContext(const ExecutionContext&) = delete; @@ -447,6 +471,8 @@ bool has_filed_shared_array_buffer_transfer_issue_ = false; bool has_filed_shared_array_buffer_creation_issue_ = false; + bool is_in_request_animation_frame_ = false; + Member<PublicURLManager> public_url_manager_; const Member<ContentSecurityPolicyDelegate> csp_delegate_;
diff --git a/third_party/blink/renderer/core/execution_context/security_context_init.cc b/third_party/blink/renderer/core/execution_context/security_context_init.cc index f3ea66e..451c912 100644 --- a/third_party/blink/renderer/core/execution_context/security_context_init.cc +++ b/third_party/blink/renderer/core/execution_context/security_context_init.cc
@@ -142,6 +142,8 @@ RuntimeEnabledFeatures::PermissionsPolicyHeaderEnabled() ? response.HttpHeaderField(http_names::kPermissionsPolicyReportOnly) : g_empty_string; + if (!permissions_policy_header.IsEmpty()) + UseCounter::Count(execution_context_, WebFeature::kPermissionsPolicyHeader); PolicyParserMessageBuffer feature_policy_logger( "Error with Feature-Policy header: ");
diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc index eeb2ef4..6a70c4a4 100644 --- a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc +++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
@@ -2449,6 +2449,10 @@ return ContextMenuNodeInner(); } +WebNode WebLocalFrameImpl::ContextMenuImageNode() const { + return ContextMenuImageNodeInner(); +} + void WebLocalFrameImpl::WillBeDetached() { if (frame_->IsMainFrame()) ViewImpl()->DidDetachLocalMainFrame(); @@ -2774,6 +2778,15 @@ .ContextMenuNodeForFrame(GetFrame()); } +Node* WebLocalFrameImpl::ContextMenuImageNodeInner() const { + if (!ViewImpl() || !ViewImpl()->GetPage()) + return nullptr; + return ViewImpl() + ->GetPage() + ->GetContextMenuController() + .ContextMenuImageNodeForFrame(GetFrame()); +} + void WebLocalFrameImpl::WaitForDebuggerWhenShown() { DCHECK(frame_->IsLocalRoot()); DevToolsAgentImpl()->WaitForDebuggerWhenShown();
diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.h b/third_party/blink/renderer/core/frame/web_local_frame_impl.h index a41ba59..44d642f 100644 --- a/third_party/blink/renderer/core/frame/web_local_frame_impl.h +++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.h
@@ -267,6 +267,7 @@ bool async) override; void SetTickmarks(const WebElement& target, const WebVector<gfx::Rect>& tickmarks) override; + WebNode ContextMenuImageNode() const override; WebNode ContextMenuNode() const override; void CopyImageAtForTesting(const gfx::Point&) override; void ShowContextMenuFromExternal( @@ -538,6 +539,7 @@ WebPluginContainerImpl* GetPluginToPrintHelper( const WebNode& constrain_to_node); + Node* ContextMenuImageNodeInner() const; Node* ContextMenuNodeInner() const; void InitializeCoreFrameInternal(
diff --git a/third_party/blink/renderer/core/inspector/inspector_memory_agent.cc b/third_party/blink/renderer/core/inspector/inspector_memory_agent.cc index d475b448..8f2ae00 100644 --- a/third_party/blink/renderer/core/inspector/inspector_memory_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_memory_agent.cc
@@ -170,7 +170,7 @@ for (const auto* module : module_cache.GetModules()) { modules->emplace_back( protocol::Memory::Module::create() - .setName(module->GetDebugBasename().value().c_str()) + .setName(module->GetDebugBasename().AsUTF16Unsafe().c_str()) .setUuid(module->GetId().c_str()) .setBaseAddress( String::Format("0x%" PRIxPTR, module->GetBaseAddress()))
diff --git a/third_party/blink/renderer/core/layout/hit_test_result.cc b/third_party/blink/renderer/core/layout/hit_test_result.cc index 821f016e..1a8f35d 100644 --- a/third_party/blink/renderer/core/layout/hit_test_result.cc +++ b/third_party/blink/renderer/core/layout/hit_test_result.cc
@@ -392,12 +392,14 @@ } Image* HitTestResult::GetImage() const { - Node* inner_node_or_image_map_image = InnerNodeOrImageMapImage(); - if (!inner_node_or_image_map_image) + return GetImage(InnerNodeOrImageMapImage()); +} + +Image* HitTestResult::GetImage(const Node* node) { + if (!node) return nullptr; - LayoutObject* layout_object = - inner_node_or_image_map_image->GetLayoutObject(); + LayoutObject* layout_object = node->GetLayoutObject(); if (layout_object && layout_object->IsImage()) { auto* image = To<LayoutImage>(layout_object); if (image->CachedImage() && !image->CachedImage()->ErrorOccurred()) @@ -416,9 +418,8 @@ .EnclosingBoundingBox(); } -KURL HitTestResult::AbsoluteImageURL() const { - Node* inner_node_or_image_map_image = InnerNodeOrImageMapImage(); - if (!inner_node_or_image_map_image) +KURL HitTestResult::AbsoluteImageURL(const Node* node) { + if (!node) return KURL(); AtomicString url_string; @@ -426,25 +427,26 @@ // even if they don't have a LayoutImage (e.g. because the image didn't load // and we are using an alt container). For other elements we don't create alt // containers so ensure they contain a loaded image. - auto* html_input_element = - DynamicTo<HTMLInputElement>(inner_node_or_image_map_image); - if (IsA<HTMLImageElement>(*inner_node_or_image_map_image) || + auto* html_input_element = DynamicTo<HTMLInputElement>(node); + if (IsA<HTMLImageElement>(*node) || (html_input_element && html_input_element->type() == input_type_names::kImage)) - url_string = To<Element>(*inner_node_or_image_map_image).ImageSourceURL(); - else if ((inner_node_or_image_map_image->GetLayoutObject() && - inner_node_or_image_map_image->GetLayoutObject()->IsImage()) && - (IsA<HTMLEmbedElement>(*inner_node_or_image_map_image) || - IsA<HTMLObjectElement>(*inner_node_or_image_map_image) || - IsA<SVGImageElement>(*inner_node_or_image_map_image))) - url_string = To<Element>(*inner_node_or_image_map_image).ImageSourceURL(); + url_string = To<Element>(*node).ImageSourceURL(); + else if ((node->GetLayoutObject() && node->GetLayoutObject()->IsImage()) && + (IsA<HTMLEmbedElement>(*node) || IsA<HTMLObjectElement>(*node) || + IsA<SVGImageElement>(*node))) + url_string = To<Element>(*node).ImageSourceURL(); if (url_string.IsEmpty()) return KURL(); - return inner_node_or_image_map_image->GetDocument().CompleteURL( + return node->GetDocument().CompleteURL( StripLeadingAndTrailingHTMLSpaces(url_string)); } +KURL HitTestResult::AbsoluteImageURL() const { + return AbsoluteImageURL(InnerNodeOrImageMapImage()); +} + KURL HitTestResult::AbsoluteMediaURL() const { if (HTMLMediaElement* media_elt = MediaElement()) return media_elt->currentSrc();
diff --git a/third_party/blink/renderer/core/layout/hit_test_result.h b/third_party/blink/renderer/core/layout/hit_test_result.h index 4aab548..4a61ec2 100644 --- a/third_party/blink/renderer/core/layout/hit_test_result.h +++ b/third_party/blink/renderer/core/layout/hit_test_result.h
@@ -150,8 +150,10 @@ bool IsSelected(const HitTestLocation& location) const; String Title(TextDirection&) const; const AtomicString& AltDisplayString() const; + static Image* GetImage(const Node* node); Image* GetImage() const; IntRect ImageRect() const; + static KURL AbsoluteImageURL(const Node* node); KURL AbsoluteImageURL() const; KURL AbsoluteMediaURL() const; MediaStreamDescriptor* GetMediaStreamDescriptor() const;
diff --git a/third_party/blink/renderer/core/layout/hit_testing_test.cc b/third_party/blink/renderer/core/layout/hit_testing_test.cc index 961889d..958da2c 100644 --- a/third_party/blink/renderer/core/layout/hit_testing_test.cc +++ b/third_party/blink/renderer/core/layout/hit_testing_test.cc
@@ -2,7 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "base/test/metrics/histogram_tester.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/renderer/core/css/css_property_names.h" +#include "third_party/blink/renderer/core/dom/events/native_event_listener.h" #include "third_party/blink/renderer/core/editing/text_affinity.h" #include "third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.h" #include "third_party/blink/renderer/core/testing/core_unit_test_helper.h"
diff --git a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc index 01d28a4..1c80c07 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc
@@ -279,10 +279,11 @@ if (parent->SetStaticPositionForPositionedLayout(*layout_box)) { NGLogicalOutOfFlowPositionedNode candidate((NGBlockNode(layout_box)), NGLogicalStaticPosition()); - NodeToLayout node_to_layout = SetUpNodeForLayout(candidate); - LayoutOOFNode( - node_to_layout, /* only_layout */ nullptr, - CalculateOffset(node_to_layout, /* only_layout */ nullptr)); + NodeInfo node_info = SetupNodeInfo(candidate); + NodeToLayout node_to_layout = { + node_info, CalculateOffset(node_info, /* only_layout */ nullptr)}; + LayoutOOFNode(node_to_layout, + /* only_layout */ nullptr); parent->SetStaticPositionForPositionedLayout(*layout_box); } } @@ -540,10 +541,11 @@ } if (layout_box != only_layout) candidate.node.InsertIntoLegacyPositionedObjects(); - NodeToLayout node_to_layout = SetUpNodeForLayout(candidate); + NodeInfo node_info = SetupNodeInfo(candidate); + NodeToLayout node_to_layout = {node_info, + CalculateOffset(node_info, only_layout)}; scoped_refptr<const NGLayoutResult> result = - LayoutOOFNode(node_to_layout, only_layout, - CalculateOffset(node_to_layout, only_layout)); + LayoutOOFNode(node_to_layout, only_layout); container_builder_->AddChild(result->PhysicalFragment(), result->OutOfFlowPositionedOffset(), candidate.inline_container); @@ -696,53 +698,48 @@ Vector<NGLogicalOutOfFlowPositionedNode>* descendants, LayoutUnit column_inline_progression, Vector<MulticolChildInfo>* multicol_children) { - struct PendingDescendant { - NodeToLayout node_to_layout; - OffsetInfo offset_info; - }; - nested_fragmentation_context_ = multicol_children; original_column_block_size_ = ShrinkLogicalSize(container_builder_->InitialBorderBoxSize(), container_builder_->BorderScrollbarPadding()) .block_size; - Vector<Vector<PendingDescendant>> descendants_to_layout; + Vector<Vector<NodeToLayout>> descendants_to_layout; while (descendants->size() > 0) { // Sort the descendants by fragmentainer index in |descendants_to_layout|. // This will ensure that the descendants are laid out in the correct order. for (auto& descendant : *descendants) { - NodeToLayout node_to_layout = SetUpNodeForLayout(descendant); - PendingDescendant pending_descendant = { - node_to_layout, - CalculateOffset(node_to_layout, /* only_layout */ nullptr)}; + NodeInfo node_info = SetupNodeInfo(descendant); + NodeToLayout node_to_layout = { + node_info, CalculateOffset(node_info, /* only_layout */ nullptr)}; // Determine in which fragmentainer this OOF element will start its layout // and adjust the offset to be relative to that fragmentainer. wtf_size_t start_index = 0; ComputeStartFragmentIndexAndRelativeOffset( - node_to_layout.container_info, - node_to_layout.default_writing_direction.GetWritingMode(), - *pending_descendant.offset_info.block_estimate, &start_index, - &pending_descendant.offset_info.offset); + node_info.container_info, + node_info.default_writing_direction.GetWritingMode(), + *node_to_layout.offset_info.block_estimate, &start_index, + &node_to_layout.offset_info.offset); if (start_index >= descendants_to_layout.size()) descendants_to_layout.resize(start_index + 1); - descendants_to_layout[start_index].emplace_back(pending_descendant); + descendants_to_layout[start_index].emplace_back(node_to_layout); } // Layout the OOF descendants in order of fragmentainer index. + Vector<NodeToLayout> fragmented_descendants; for (wtf_size_t index = 0; index < descendants_to_layout.size(); index++) { - const Vector<PendingDescendant>& pending_descendants = + const Vector<NodeToLayout>& pending_descendants = descendants_to_layout[index]; - for (auto& descendant : pending_descendants) { - scoped_refptr<const NGLayoutResult> result = - LayoutOOFNode(descendant.node_to_layout, /* only_layout */ nullptr, - descendant.offset_info, index); - // TODO(almaher): Handle nested OOFs and inner multicols with pending - // OOFs in the case of nested fragmentation. - container_builder_->PropagateOOFPositionedInfo( - result->PhysicalFragment(), result->OutOfFlowPositionedOffset()); - } + LayoutOOFsInFragmentainer(pending_descendants, index, + column_inline_progression, + &fragmented_descendants, multicol_children); + // Extend |descendants_to_layout| if an OOF element fragments into a + // fragmentainer at an index that does not yet exist in + // |descendants_to_layout|. + if (index == descendants_to_layout.size() - 1 && + !fragmented_descendants.IsEmpty()) + descendants_to_layout.resize(index + 2); } // Sweep any descendants that might have been bubbled up from the fragment // to the |container_builder_|. This happens when we have nested absolute @@ -751,27 +748,9 @@ descendants_to_layout.Shrink(0); container_builder_->SwapOutOfFlowFragmentainerDescendants(descendants); } - - // Add all of the descendant layout results as children to the fragment at - // the associated index. - // TODO(almaher): Since we perform layout one fragmentainer at a time, we - // can get rid of |fragmentainer_descendant_results_| and place the OOFs - // inside the fragmentainers directly in the loop above. - wtf_size_t index = 0; - while (!fragmentainer_descendant_results_.IsEmpty()) { - // We don't allow keys of 0, so shift the index by 1. - auto it = fragmentainer_descendant_results_.find(index + 1); - if (it != fragmentainer_descendant_results_.end()) { - Vector<scoped_refptr<const NGLayoutResult>>& results = it->value; - AddOOFResultsToFragmentainer(results, index, column_inline_progression, - multicol_children); - fragmentainer_descendant_results_.erase(it); - } - index++; - } } -NGOutOfFlowLayoutPart::NodeToLayout NGOutOfFlowLayoutPart::SetUpNodeForLayout( +NGOutOfFlowLayoutPart::NodeInfo NGOutOfFlowLayoutPart::SetupNodeInfo( const NGLogicalOutOfFlowPositionedNode& oof_node) { NGBlockNode node = oof_node.node; const NGPhysicalContainerFragment* containing_block_fragment = @@ -835,19 +814,19 @@ builder.SetAvailableSize(container_content_size); builder.SetPercentageResolutionSize(container_content_size); - return NodeToLayout( - node, builder.ToConstraintSpace(), oof_static_position, - container_physical_content_size, container_info, - default_writing_direction, - /* is_fragmentainer_descendant */ containing_block_fragment, - oof_node.inline_container); + return NodeInfo(node, builder.ToConstraintSpace(), oof_static_position, + container_physical_content_size, container_info, + default_writing_direction, + /* is_fragmentainer_descendant */ containing_block_fragment, + oof_node.inline_container); } scoped_refptr<const NGLayoutResult> NGOutOfFlowLayoutPart::LayoutOOFNode( const NodeToLayout& oof_node_to_layout, const LayoutBox* only_layout, - OffsetInfo offset_info, - wtf_size_t fragmentainer_index) { + const NGConstraintSpace* fragmentainer_constraint_space) { + const NodeInfo& node_info = oof_node_to_layout.node_info; + OffsetInfo offset_info = oof_node_to_layout.offset_info; if (offset_info.has_cached_layout_result) { DCHECK(offset_info.initial_layout_result); return offset_info.initial_layout_result; @@ -857,11 +836,9 @@ freeze_scrollbars; do { scoped_refptr<const NGLayoutResult> layout_result = - Layout(oof_node_to_layout, offset_info, fragmentainer_index); + Layout(oof_node_to_layout, fragmentainer_constraint_space); - // TODO(almaher): Remove the check for is_fragmentainer_descendant. - if (!freeze_scrollbars.has_value() && - !oof_node_to_layout.is_fragmentainer_descendant) { + if (!freeze_scrollbars.has_value()) { // Since out-of-flow positioning sets up a constraint space with fixed // inline-size, the regular layout code (|NGBlockNode::Layout()|) cannot // re-layout if it discovers that a scrollbar was added or removed. Handle @@ -870,16 +847,15 @@ // logical widths, it means that scrollbars appeared or disappeared. We // have the same logic in legacy layout in // |LayoutBlockFlow::UpdateBlockLayout()|. - if (oof_node_to_layout.node.GetLayoutBox() - ->IntrinsicLogicalWidthsDirty() && - AbsoluteNeedsChildInlineSize(oof_node_to_layout.node)) { + if (node_info.node.GetLayoutBox()->IntrinsicLogicalWidthsDirty() && + AbsoluteNeedsChildInlineSize(node_info.node)) { // Freeze the scrollbars for this layout pass. We don't want them to // change *again*. freeze_scrollbars.emplace(); // The offset itself does not need to be recalculated. However, the // |node_dimensions| and |initial_layout_result| may need to be updated, // so recompute the OffsetInfo. - offset_info = CalculateOffset(oof_node_to_layout, only_layout, + offset_info = CalculateOffset(node_info, only_layout, /* is_first_run */ false); continue; } @@ -890,17 +866,17 @@ } NGOutOfFlowLayoutPart::OffsetInfo NGOutOfFlowLayoutPart::CalculateOffset( - const NodeToLayout& oof_node_to_layout, + const NodeInfo& node_info, const LayoutBox* only_layout, bool is_first_run) { OffsetInfo offset_info; - const ComputedStyle& candidate_style = oof_node_to_layout.node.Style(); + const ComputedStyle& candidate_style = node_info.node.Style(); const WritingDirectionMode candidate_writing_direction = candidate_style.GetWritingDirection(); const auto container_writing_direction = - oof_node_to_layout.container_info.writing_direction; + node_info.container_info.writing_direction; LogicalSize container_content_size_in_candidate_writing_mode = - oof_node_to_layout.container_physical_content_size.ConvertToLogical( + node_info.container_physical_content_size.ConvertToLogical( candidate_writing_direction.GetWritingMode()); // Determine if we need to actually run the full OOF-positioned sizing, and @@ -914,9 +890,9 @@ // containing-block). // Note: Only check for cache results if this is our first layout pass. if (is_first_run && allow_first_tier_oof_cache_ && - !oof_node_to_layout.inline_container) { + !node_info.inline_container) { if (scoped_refptr<const NGLayoutResult> cached_result = - oof_node_to_layout.node.CachedLayoutResultForOutOfFlowPositioned( + node_info.node.CachedLayoutResultForOutOfFlowPositioned( container_content_size_in_candidate_writing_mode)) { offset_info.initial_layout_result = cached_result; offset_info.has_cached_layout_result = true; @@ -925,9 +901,8 @@ } NGBoxStrut border_padding = - ComputeBorders(oof_node_to_layout.constraint_space, - oof_node_to_layout.node) + - ComputePadding(oof_node_to_layout.constraint_space, candidate_style); + ComputeBorders(node_info.constraint_space, node_info.node) + + ComputePadding(node_info.constraint_space, candidate_style); // In order to calculate the offsets, we may need to know the size. @@ -938,11 +913,11 @@ // then lay out again at the correct block-offset. bool has_computed_block_dimensions = false; - bool is_replaced = oof_node_to_layout.node.IsReplaced(); + bool is_replaced = node_info.node.IsReplaced(); bool should_be_considered_as_replaced = - oof_node_to_layout.node.ShouldBeConsideredAsReplaced(); + node_info.node.ShouldBeConsideredAsReplaced(); offset_info.absolute_needs_child_block_size = - AbsoluteNeedsChildBlockSize(oof_node_to_layout.node); + AbsoluteNeedsChildBlockSize(node_info.node); base::Optional<MinMaxSizes> min_max_sizes; base::Optional<MinMaxSizes> minmax_intrinsic_sizes_for_ar; @@ -950,9 +925,8 @@ // is auto and we have a definite block size, we want to use that for the // inline size calculation. bool compute_inline_from_ar = - IsInlineSizeComputableFromBlockSize(oof_node_to_layout.node) && - !is_replaced; - if (AbsoluteNeedsChildInlineSize(oof_node_to_layout.node) || + IsInlineSizeComputableFromBlockSize(node_info.node) && !is_replaced; + if (AbsoluteNeedsChildInlineSize(node_info.node) || NeedMinMaxSize(candidate_style) || should_be_considered_as_replaced || compute_inline_from_ar) { MinMaxSizesInput input(kIndefiniteSize, MinMaxSizesType::kContent); @@ -963,10 +937,9 @@ // If we can determine our block-size ahead of time (it doesn't depend on // our content), we use this for our %-block-size. ComputeOutOfFlowBlockDimensions( - oof_node_to_layout.node, oof_node_to_layout.constraint_space, - border_padding, oof_node_to_layout.static_position, base::nullopt, - base::nullopt, container_writing_direction, - &offset_info.node_dimensions); + node_info.node, node_info.constraint_space, border_padding, + node_info.static_position, base::nullopt, base::nullopt, + container_writing_direction, &offset_info.node_dimensions); has_computed_block_dimensions = true; input.percentage_resolution_block_size = offset_info.node_dimensions.size.block_size; @@ -976,17 +949,16 @@ MinMaxSizesInput intrinsic_input(input); intrinsic_input.type = MinMaxSizesType::kIntrinsic; minmax_intrinsic_sizes_for_ar = - oof_node_to_layout.node + node_info.node .ComputeMinMaxSizes(candidate_writing_direction.GetWritingMode(), - intrinsic_input, - &oof_node_to_layout.constraint_space) + intrinsic_input, &node_info.constraint_space) .sizes; } min_max_sizes = - oof_node_to_layout.node + node_info.node .ComputeMinMaxSizes(candidate_writing_direction.GetWritingMode(), - input, &oof_node_to_layout.constraint_space) + input, &node_info.constraint_space) .sizes; } @@ -994,9 +966,8 @@ base::Optional<LogicalSize> aspect_ratio; bool has_aspect_ratio_without_intrinsic_size = false; if (is_replaced) { - ComputeReplacedSize(oof_node_to_layout.node, - oof_node_to_layout.constraint_space, min_max_sizes, - &replaced_size, &aspect_ratio); + ComputeReplacedSize(node_info.node, node_info.constraint_space, + min_max_sizes, &replaced_size, &aspect_ratio); DCHECK(replaced_size.has_value() != aspect_ratio.has_value()); has_aspect_ratio_without_intrinsic_size = aspect_ratio.has_value(); // If we only have aspect ratio, and no replaced size, intrinsic size @@ -1010,19 +981,18 @@ } } else if (!candidate_style.AspectRatio().IsAuto()) { has_aspect_ratio_without_intrinsic_size = true; - aspect_ratio = oof_node_to_layout.node.GetAspectRatio(); + aspect_ratio = node_info.node.GetAspectRatio(); } else if (should_be_considered_as_replaced) { - replaced_size = LogicalSize{ - min_max_sizes->ShrinkToFit( - oof_node_to_layout.constraint_space.AvailableSize().inline_size), - kIndefiniteSize}; + replaced_size = + LogicalSize{min_max_sizes->ShrinkToFit( + node_info.constraint_space.AvailableSize().inline_size), + kIndefiniteSize}; } ComputeOutOfFlowInlineDimensions( - oof_node_to_layout.node, oof_node_to_layout.constraint_space, - border_padding, oof_node_to_layout.static_position, min_max_sizes, - minmax_intrinsic_sizes_for_ar, replaced_size, container_writing_direction, - &offset_info.node_dimensions); + node_info.node, node_info.constraint_space, border_padding, + node_info.static_position, min_max_sizes, minmax_intrinsic_sizes_for_ar, + replaced_size, container_writing_direction, &offset_info.node_dimensions); // |should_be_considered_as_replaced| sets the inline-size. // It does not set the block-size. This is a compatibility quirk. @@ -1050,8 +1020,7 @@ if (offset_info.absolute_needs_child_block_size) { DCHECK(!has_computed_block_dimensions); offset_info.initial_layout_result = GenerateFragment( - oof_node_to_layout.node, - container_content_size_in_candidate_writing_mode, + node_info.node, container_content_size_in_candidate_writing_mode, offset_info.block_estimate, offset_info.node_dimensions, /* block_offset */ LayoutUnit(), /* break_token */ nullptr, @@ -1072,28 +1041,26 @@ // our |min_max_sizes|, only run if needed. if (!has_computed_block_dimensions) { ComputeOutOfFlowBlockDimensions( - oof_node_to_layout.node, oof_node_to_layout.constraint_space, - border_padding, oof_node_to_layout.static_position, - offset_info.block_estimate, replaced_size, container_writing_direction, - &offset_info.node_dimensions); + node_info.node, node_info.constraint_space, border_padding, + node_info.static_position, offset_info.block_estimate, replaced_size, + container_writing_direction, &offset_info.node_dimensions); has_computed_block_dimensions = true; } offset_info.block_estimate = offset_info.node_dimensions.size.block_size; // Calculate the offsets. - NGBoxStrut inset = - offset_info.node_dimensions.inset - .ConvertToPhysical(candidate_writing_direction) - .ConvertToLogical(oof_node_to_layout.default_writing_direction); + NGBoxStrut inset = offset_info.node_dimensions.inset + .ConvertToPhysical(candidate_writing_direction) + .ConvertToLogical(node_info.default_writing_direction); // |inset| is relative to the container's padding-box. Convert this to being // relative to the default container's border-box. - offset_info.offset = oof_node_to_layout.container_info.rect.offset; + offset_info.offset = node_info.container_info.rect.offset; offset_info.offset.inline_offset += inset.inline_start; offset_info.offset.block_offset += inset.block_start; if (!only_layout && !can_traverse_fragments_) { - AdjustOffsetForSplitInline(oof_node_to_layout.node, container_builder_, + AdjustOffsetForSplitInline(node_info.node, container_builder_, offset_info.offset); } @@ -1102,87 +1069,57 @@ scoped_refptr<const NGLayoutResult> NGOutOfFlowLayoutPart::Layout( const NodeToLayout& oof_node_to_layout, - const OffsetInfo& offset_info, - wtf_size_t fragmentainer_index) { + const NGConstraintSpace* fragmentainer_constraint_space) { + const NodeInfo& node_info = oof_node_to_layout.node_info; + const OffsetInfo& offset_info = oof_node_to_layout.offset_info; const WritingDirectionMode candidate_writing_direction = - oof_node_to_layout.node.Style().GetWritingDirection(); + node_info.node.Style().GetWritingDirection(); LogicalSize container_content_size_in_candidate_writing_mode = - oof_node_to_layout.container_physical_content_size.ConvertToLogical( + node_info.container_physical_content_size.ConvertToLogical( candidate_writing_direction.GetWritingMode()); LogicalOffset offset = offset_info.offset; // Reset the |layout_result| computed earlier to allow fragmentation in the // next layout pass, if needed. scoped_refptr<const NGLayoutResult> layout_result = - !oof_node_to_layout.is_fragmentainer_descendant - ? offset_info.initial_layout_result - : nullptr; + !fragmentainer_constraint_space ? offset_info.initial_layout_result + : nullptr; - // TODO(almaher): Clean up the code for handling break tokens. Break tokens - // should now be handled by LayoutFragmentainerDescendants(). - const NGBlockBreakToken* break_token = nullptr; - do { - if (break_token) { - layout_result = nullptr; - fragmentainer_index++; - - // Skip over spanning fragments when finding the next fragmentainer to add - // an OOF result to. - while (fragmentainer_index < container_builder_->Children().size() && - !container_builder_->Children()[fragmentainer_index] - .fragment->IsFragmentainerBox()) { - fragmentainer_index++; - } - offset.block_offset = LayoutUnit(); + // Skip this step if we produced a fragment that can be reused when + // estimating the block-size. + if (!layout_result) { + bool should_use_fixed_block_size = !!offset_info.block_estimate; + if (fragmentainer_constraint_space) { + should_use_fixed_block_size &= + !offset_info.absolute_needs_child_block_size; } - // Skip this step if we produced a fragment that can be reused when - // estimating the block-size. - if (!layout_result) { - const NGConstraintSpace* fragmentainer_constraint_space = nullptr; - bool should_use_fixed_block_size = !!offset_info.block_estimate; - if (oof_node_to_layout.is_fragmentainer_descendant) { - fragmentainer_constraint_space = - &GetFragmentainerConstraintSpace(fragmentainer_index); - should_use_fixed_block_size &= - !offset_info.absolute_needs_child_block_size; - } + layout_result = GenerateFragment( + node_info.node, container_content_size_in_candidate_writing_mode, + offset_info.block_estimate, offset_info.node_dimensions, + offset.block_offset, oof_node_to_layout.break_token, + fragmentainer_constraint_space, should_use_fixed_block_size); + } - layout_result = GenerateFragment( - oof_node_to_layout.node, - container_content_size_in_candidate_writing_mode, - offset_info.block_estimate, offset_info.node_dimensions, - offset.block_offset, break_token, fragmentainer_constraint_space, - should_use_fixed_block_size); - } + // TODO(layout-dev): Handle abortions caused by block fragmentation. + DCHECK_EQ(layout_result->Status(), NGLayoutResult::kSuccess); - // TODO(layout-dev): Handle abortions caused by block fragmentation. - DCHECK_EQ(layout_result->Status(), NGLayoutResult::kSuccess); + if (node_info.node.GetLayoutBox()->IsLayoutNGObject()) { + To<LayoutBlock>(node_info.node.GetLayoutBox()) + ->SetIsLegacyInitiatedOutOfFlowLayout(false); + } + // Legacy grid and flexbox handle OOF-positioned margins on their own, and + // break if we set them here. + if (!container_builder_->GetLayoutObject() + ->Style() + ->IsDisplayFlexibleOrGridBox()) { + node_info.node.GetLayoutBox()->SetMargin( + offset_info.node_dimensions.margins.ConvertToPhysical( + candidate_writing_direction)); + } - if (oof_node_to_layout.node.GetLayoutBox()->IsLayoutNGObject()) { - To<LayoutBlock>(oof_node_to_layout.node.GetLayoutBox()) - ->SetIsLegacyInitiatedOutOfFlowLayout(false); - } - // Legacy grid and flexbox handle OOF-positioned margins on their own, and - // break if we set them here. - if (!container_builder_->GetLayoutObject() - ->Style() - ->IsDisplayFlexibleOrGridBox()) { - oof_node_to_layout.node.GetLayoutBox()->SetMargin( - offset_info.node_dimensions.margins.ConvertToPhysical( - candidate_writing_direction)); - } - - layout_result->GetMutableForOutOfFlow().SetOutOfFlowPositionedOffset( - offset, allow_first_tier_oof_cache_); - if (oof_node_to_layout.is_fragmentainer_descendant) { - AddOOFResultToFragmentainerResults(layout_result, fragmentainer_index); - - const auto& physical_fragment = - To<NGPhysicalBoxFragment>(layout_result->PhysicalFragment()); - break_token = To<NGBlockBreakToken>(physical_fragment.BreakToken()); - } - } while (break_token); + layout_result->GetMutableForOutOfFlow().SetOutOfFlowPositionedOffset( + offset, allow_first_tier_oof_cache_); return layout_result; } @@ -1250,14 +1187,32 @@ return node.Layout(space, break_token); } -void NGOutOfFlowLayoutPart::AddOOFResultsToFragmentainer( - const Vector<scoped_refptr<const NGLayoutResult>>& results, +void NGOutOfFlowLayoutPart::LayoutOOFsInFragmentainer( + const Vector<NodeToLayout>& pending_descendants, wtf_size_t index, LayoutUnit column_inline_progression, + Vector<NodeToLayout>* fragmented_descendants, Vector<MulticolChildInfo>* multicol_children) { wtf_size_t num_children = container_builder_->Children().size(); bool is_new_fragment = index >= num_children; + // Skip over any column spanners. + if (!is_new_fragment && + !container_builder_->Children()[index].fragment->IsFragmentainerBox()) + return; + + DCHECK(fragmented_descendants); + Vector<NodeToLayout> descendants_continued; + std::swap(*fragmented_descendants, descendants_continued); + + // If |index| is greater than the number of current children, and there are + // no OOF children to be added, we will still need to add an empty + // fragmentainer in its place. Otherwise, return early since there is no work + // to do. + if (pending_descendants.IsEmpty() && descendants_continued.IsEmpty() && + !is_new_fragment) + return; + // If an OOF positioned element is in a nested context, and it fragments // beyond the last fragmentainer, we don't create a new column for it. // Rather, we will add it to the last existing fragmentainter at the @@ -1265,21 +1220,13 @@ bool create_new_fragment = is_new_fragment && !nested_fragmentation_context_; bool add_to_last_fragment = is_new_fragment && nested_fragmentation_context_; - wtf_size_t num_new_fragmentainers; - if (is_new_fragment) - num_new_fragmentainers = index - num_children + 1; - - // If |index| is greater than the number of current children, we need to add - // empty column fragments at all of the indexes leading up to |index|. - if (create_new_fragment) { - const Vector<scoped_refptr<const NGLayoutResult>> empty_results; - while (index > num_children) { - AddOOFResultsToFragmentainer(empty_results, /*index */ num_children, - column_inline_progression); - num_children++; - } - DCHECK_EQ(index, container_builder_->Children().size()); + LayoutUnit additional_inline_offset; + if (is_new_fragment) { + wtf_size_t num_new_fragmentainers = index - num_children + 1; + additional_inline_offset = + column_inline_progression * num_new_fragmentainers; } + const NGConstraintSpace& space = GetFragmentainerConstraintSpace(index); // If we are a new fragment, find a non-spanner fragmentainer as a basis. @@ -1317,19 +1264,76 @@ NGSimplifiedOOFLayoutAlgorithm algorithm(params, fragment, create_new_fragment); - for (const auto& result : results) { - // If we are adding the result to the last fragmentainer rather than - // creating a new fragmentainer to hold it, adjust the inline offset as if - // we had created a new fragmentainer. - if (add_to_last_fragment) { - LogicalOffset oof_offset = result->OutOfFlowPositionedOffset(); - oof_offset.inline_offset += - column_inline_progression * num_new_fragmentainers; - result->GetMutableForOutOfFlow().SetOutOfFlowPositionedOffset( - oof_offset, allow_first_tier_oof_cache_); - } - algorithm.AppendOutOfFlowResult(result); + // Layout any OOF elements that are a continuation of layout first. + for (auto& descendant : descendants_continued) { + AddOOFToFragmentainer(descendant, &space, additional_inline_offset, + add_to_last_fragment, &algorithm, + fragmented_descendants); } + // Once we've laid out the OOF elements that are a continuation of layout, we + // can layout the OOF elements that start layout in the current fragmentainer. + for (auto& descendant : pending_descendants) { + AddOOFToFragmentainer(descendant, &space, additional_inline_offset, + add_to_last_fragment, &algorithm, + fragmented_descendants); + } + + // Finalize layout on the cloned fragmentainer and replace all existing + // references to the old result. + ReplaceFragmentainer(index, column_inline_progression, create_new_fragment, + &algorithm, multicol_children); +} + +void NGOutOfFlowLayoutPart::AddOOFToFragmentainer( + const NodeToLayout& descendant, + const NGConstraintSpace* fragmentainer_space, + LayoutUnit additional_inline_offset, + bool add_to_last_fragment, + NGSimplifiedOOFLayoutAlgorithm* algorithm, + Vector<NodeToLayout>* fragmented_descendants) { + scoped_refptr<const NGLayoutResult> result = + LayoutOOFNode(descendant, /* only_layout */ nullptr, fragmentainer_space); + + // If we are adding the result to the last fragmentainer rather than + // creating a new fragmentainer to hold it, adjust the inline offset as if + // we had created a new fragmentainer. + if (add_to_last_fragment) { + LogicalOffset oof_offset = result->OutOfFlowPositionedOffset(); + oof_offset.inline_offset += additional_inline_offset; + result->GetMutableForOutOfFlow().SetOutOfFlowPositionedOffset( + oof_offset, allow_first_tier_oof_cache_); + } + // TODO(almaher): Handle nested OOFs and inner multicols with pending + // OOFs in the case of nested fragmentation. + container_builder_->PropagateOOFPositionedInfo( + result->PhysicalFragment(), result->OutOfFlowPositionedOffset()); + algorithm->AppendOutOfFlowResult(result); + + const auto& physical_fragment = + To<NGPhysicalBoxFragment>(result->PhysicalFragment()); + const NGBlockBreakToken* break_token = + To<NGBlockBreakToken>(physical_fragment.BreakToken()); + if (break_token) { + // We must continue layout in the next fragmentainer. Update any information + // in NodeToLayout, and add the node to |fragmented_descendants|. + NodeToLayout fragmented_descendant = descendant; + fragmented_descendant.break_token = break_token; + fragmented_descendant.offset_info.offset.block_offset = LayoutUnit(); + fragmented_descendants->emplace_back(fragmented_descendant); + } +} + +void NGOutOfFlowLayoutPart::ReplaceFragmentainer( + wtf_size_t index, + LayoutUnit column_inline_progression, + bool create_new_fragment, + NGSimplifiedOOFLayoutAlgorithm* algorithm, + Vector<MulticolChildInfo>* multicol_children) { + wtf_size_t num_children = container_builder_->Children().size(); + const NGBlockNode& node = container_builder_->Node(); + const auto& fragmentainer = container_builder_->Children()[index]; + const NGPhysicalBoxFragment& fragment = + To<NGPhysicalBoxFragment>(*fragmentainer.fragment.get()); if (create_new_fragment) { LogicalOffset offset; @@ -1349,11 +1353,11 @@ offset = fragmentainer.offset; offset.inline_offset += column_inline_progression; } - scoped_refptr<const NGLayoutResult> new_result = algorithm.Layout(); + scoped_refptr<const NGLayoutResult> new_result = algorithm->Layout(); node.AddColumnResult(new_result); container_builder_->AddChild(new_result->PhysicalFragment(), offset); } else { - scoped_refptr<const NGLayoutResult> new_result = algorithm.Layout(); + scoped_refptr<const NGLayoutResult> new_result = algorithm->Layout(); node.ReplaceColumnResult(new_result, fragment); const NGPhysicalContainerFragment* new_fragment = &new_result->PhysicalFragment(); @@ -1378,15 +1382,8 @@ } } -const NGConstraintSpace& NGOutOfFlowLayoutPart::GetFragmentainerConstraintSpace( +NGConstraintSpace NGOutOfFlowLayoutPart::GetFragmentainerConstraintSpace( wtf_size_t index) { - // Increase the index by 1 to avoid a key of 0. - wtf_size_t stored_index = index + 1; - - auto it = fragmentainer_constraint_space_map_.find(stored_index); - if (it != fragmentainer_constraint_space_map_.end()) - return it->value; - wtf_size_t num_children = container_builder_->Children().size(); bool is_new_fragment = index >= num_children; // Allow margins to be discarded if this is not the first column in the @@ -1437,29 +1434,10 @@ // TODO(bebeaudr): Need to handle different fragmentation types. It won't // always be multi-column. - NGConstraintSpace fragmentainer_constraint_space = - CreateConstraintSpaceForColumns(*container_builder_->ConstraintSpace(), - column_size, percentage_resolution_size, - allow_discard_start_margin, - /* balance_columns */ false); - - return fragmentainer_constraint_space_map_ - .insert(stored_index, fragmentainer_constraint_space) - .stored_value->value; -} - -void NGOutOfFlowLayoutPart::AddOOFResultToFragmentainerResults( - const scoped_refptr<const NGLayoutResult> result, - wtf_size_t index) { - // Increase the index by 1 to avoid a key of 0. - wtf_size_t stored_index = index + 1; - Vector<scoped_refptr<const NGLayoutResult>> results; - - auto it = fragmentainer_descendant_results_.find(stored_index); - if (it != fragmentainer_descendant_results_.end()) - results = it->value; - results.emplace_back(result); - fragmentainer_descendant_results_.Set(stored_index, results); + return CreateConstraintSpaceForColumns( + *container_builder_->ConstraintSpace(), column_size, + percentage_resolution_size, allow_discard_start_margin, + /* balance_columns */ false); } // Compute in which fragmentainer the OOF element will start its layout and
diff --git a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.h b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.h index 05ae9f8..4789308 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.h +++ b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.h
@@ -27,6 +27,7 @@ class NGBoxFragmentBuilder; class NGLayoutResult; class NGPhysicalContainerFragment; +class NGSimplifiedOOFLayoutAlgorithm; struct NGLink; struct NGLogicalOutOfFlowPositionedNode; @@ -102,37 +103,35 @@ }; // Info needed to perform Layout() on an OOF positioned node. - struct NodeToLayout { + struct NodeInfo { NGBlockNode node; const NGConstraintSpace constraint_space; const NGLogicalStaticPosition static_position; PhysicalSize container_physical_content_size; const ContainingBlockInfo container_info; const WritingDirectionMode default_writing_direction; - bool is_fragmentainer_descendant = false; bool inline_container = false; - NodeToLayout(NGBlockNode node, - const NGConstraintSpace constraint_space, - const NGLogicalStaticPosition static_position, - PhysicalSize container_physical_content_size, - const ContainingBlockInfo container_info, - const WritingDirectionMode default_writing_direction, - bool is_fragmentainer_descendant, - bool inline_container) + NodeInfo(NGBlockNode node, + const NGConstraintSpace constraint_space, + const NGLogicalStaticPosition static_position, + PhysicalSize container_physical_content_size, + const ContainingBlockInfo container_info, + const WritingDirectionMode default_writing_direction, + bool is_fragmentainer_descendant, + bool inline_container) : node(node), constraint_space(constraint_space), static_position(static_position), container_physical_content_size(container_physical_content_size), container_info(container_info), default_writing_direction(default_writing_direction), - is_fragmentainer_descendant(is_fragmentainer_descendant), inline_container(inline_container) {} }; // Stores the calculated offset for an OOF positioned node, along with the // information that was used in calculating the offset that will be used, in - // addition to the information in NodeToLayout, to perform a final layout + // addition to the information in NodeInfo, to perform a final layout // pass. struct OffsetInfo { LogicalOffset offset; @@ -151,6 +150,12 @@ bool has_cached_layout_result = false; }; + struct NodeToLayout { + NodeInfo node_info; + OffsetInfo offset_info; + const NGBlockBreakToken* break_token = nullptr; + }; + bool SweepLegacyCandidates(HashSet<const LayoutObject*>* placed_objects); const ContainingBlockInfo GetContainingBlockInfo( @@ -174,25 +179,22 @@ LayoutUnit column_inline_progression, Vector<MulticolChildInfo>* multicol_children = nullptr); - NodeToLayout SetUpNodeForLayout( - const NGLogicalOutOfFlowPositionedNode& oof_node); + NodeInfo SetupNodeInfo(const NGLogicalOutOfFlowPositionedNode& oof_node); scoped_refptr<const NGLayoutResult> LayoutOOFNode( const NodeToLayout& oof_node_to_layout, const LayoutBox* only_layout, - OffsetInfo offset_info, - wtf_size_t fragmentainer_index = 0); + const NGConstraintSpace* fragmentainer_constraint_space = nullptr); // TODO(almaher): We are calculating more than just the offset. Consider // changing this to a more accurate name. - OffsetInfo CalculateOffset(const NodeToLayout& oof_node_to_layout, + OffsetInfo CalculateOffset(const NodeInfo& node_info, const LayoutBox* only_layout, bool is_first_run = true); scoped_refptr<const NGLayoutResult> Layout( const NodeToLayout& oof_node_to_layout, - const OffsetInfo& offset_info, - wtf_size_t fragmentainer_index); + const NGConstraintSpace* fragmentainer_constraint_space); bool IsContainingBlockForCandidate(const NGLogicalOutOfFlowPositionedNode&); @@ -205,15 +207,34 @@ const NGBlockBreakToken* break_token, const NGConstraintSpace* fragmentainer_constraint_space, bool should_use_fixed_block_size); - void AddOOFResultsToFragmentainer( - const Vector<scoped_refptr<const NGLayoutResult>>& results, + + // Performs layout on the OOFs stored in |pending_descendants| and + // |fragmented_descendants|, adding them as children in the fragmentainer + // found at the provided |index|. If a fragmentainer does not already exist at + // the given |index|, one will be created (unless we are in a nested + // fragmentation context). The OOFs stored in |fragmented_descendants| are + // those that are continuing layout from a previous fragmentainer. + // |fragmented_descendants| is also an output variable in that any OOF that + // has not finished layout in the current pass will be added back to + // |fragmented_descendants| to continue layout in the next fragmentainer. + void LayoutOOFsInFragmentainer( + const Vector<NodeToLayout>& pending_descendants, wtf_size_t index, LayoutUnit column_inline_progression, + Vector<NodeToLayout>* fragmented_descendants, Vector<MulticolChildInfo>* multicol_children = nullptr); - const NGConstraintSpace& GetFragmentainerConstraintSpace(wtf_size_t index); - void AddOOFResultToFragmentainerResults( - const scoped_refptr<const NGLayoutResult> result, - wtf_size_t index); + void AddOOFToFragmentainer(const NodeToLayout& descendant, + const NGConstraintSpace* fragmentainer_space, + LayoutUnit additional_inline_offset, + bool add_to_last_fragment, + NGSimplifiedOOFLayoutAlgorithm* algorithm, + Vector<NodeToLayout>* fragmented_descendants); + void ReplaceFragmentainer(wtf_size_t index, + LayoutUnit column_inline_progression, + bool create_new_fragment, + NGSimplifiedOOFLayoutAlgorithm* algorithm, + Vector<MulticolChildInfo>* multicol_children); + NGConstraintSpace GetFragmentainerConstraintSpace(wtf_size_t index); void ComputeStartFragmentIndexAndRelativeOffset( const ContainingBlockInfo& container_info, WritingMode default_writing_mode, @@ -225,11 +246,6 @@ ContainingBlockInfo default_containing_block_info_for_absolute_; ContainingBlockInfo default_containing_block_info_for_fixed_; HashMap<const LayoutObject*, ContainingBlockInfo> containing_blocks_map_; - HashMap<wtf_size_t, NGConstraintSpace> fragmentainer_constraint_space_map_; - // Map of fragmentainer indexes to a list of descendant layout results to - // be added as children. - HashMap<wtf_size_t, Vector<scoped_refptr<const NGLayoutResult>>> - fragmentainer_descendant_results_; const WritingMode writing_mode_; const WritingDirectionMode default_writing_direction_; // The block size of the multi-column (before adjustment for spanners, etc.)
diff --git a/third_party/blink/renderer/core/loader/document_loader.cc b/third_party/blink/renderer/core/loader/document_loader.cc index cf7d7af..f9fa0db 100644 --- a/third_party/blink/renderer/core/loader/document_loader.cc +++ b/third_party/blink/renderer/core/loader/document_loader.cc
@@ -2318,7 +2318,6 @@ document->MaybeHandleHttpRefresh( response_.HttpHeaderField(http_names::kRefresh), Document::kHttpRefreshFromHeader); - ReportPreviewsIntervention(); } const AtomicString& DocumentLoader::MimeType() const { @@ -2411,34 +2410,6 @@ this, main_resource_identifier_, response_); } -void DocumentLoader::ReportPreviewsIntervention() const { - // Only send reports for main frames. - if (!frame_->IsMainFrame()) - return; - - // Verify that certain types are not on main frame requests. - DCHECK_NE(PreviewsTypes::kSubresourceRedirectOn, previews_state_); - - static_assert(PreviewsTypes::kPreviewsStateLast == - PreviewsTypes::kSubresourceRedirectOn, - "If a new Preview type is added, verify that the Intervention " - "Report should be sent (or not sent) for that type."); - - // If the preview type is not unspecified, off, or no transform, it is a - // preview that needs to be reported. - if (previews_state_ == PreviewsTypes::kPreviewsUnspecified || - previews_state_ & PreviewsTypes::kPreviewsOff || - previews_state_ & PreviewsTypes::kPreviewsNoTransform) { - return; - } - - Intervention::GenerateReport( - frame_, "LitePageServed", - "Modified page load behavior on the page because the page was expected " - "to take a long amount of time to load. " - "https://www.chromestatus.com/feature/5148050062311424"); -} - void DocumentLoader::ApplyClientHintsConfig( const WebVector<network::mojom::WebClientHintsType>& enabled_client_hints) { for (auto ch : enabled_client_hints)
diff --git a/third_party/blink/renderer/core/loader/document_loader.h b/third_party/blink/renderer/core/loader/document_loader.h index ab6dd98..02a12491 100644 --- a/third_party/blink/renderer/core/loader/document_loader.h +++ b/third_party/blink/renderer/core/loader/document_loader.h
@@ -423,9 +423,6 @@ // to the parser in a nested message loop. void ProcessDataBuffer(const char* bytes = nullptr, size_t length = 0); - // Sends an intervention report if the page is being served as a preview. - void ReportPreviewsIntervention() const; - // WebNavigationBodyLoader::Client void BodyCodeCacheReceived(mojo_base::BigBuffer data) override; void BodyDataReceived(base::span<const char> data) override;
diff --git a/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.cc b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.cc index 216bd7a9..d7472c6 100644 --- a/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.cc +++ b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.cc
@@ -118,6 +118,10 @@ return; int frame_width = frame_view_->GetPage()->GetVisualViewport().Size().Width(); + if (frame_width == 0) { + return; + } + int total_text_width; int text_content_outside_viewport_percentage = 0;
diff --git a/third_party/blink/renderer/core/page/context_menu_controller.cc b/third_party/blink/renderer/core/page/context_menu_controller.cc index e962054..094a487e 100644 --- a/third_party/blink/renderer/core/page/context_menu_controller.cc +++ b/third_party/blink/renderer/core/page/context_menu_controller.cc
@@ -30,8 +30,13 @@ #include <memory> #include <utility> +#include "base/metrics/field_trial_params.h" +#include "base/metrics/histogram_functions.h" +#include "services/metrics/public/cpp/ukm_entry_builder.h" +#include "services/metrics/public/cpp/ukm_recorder.h" #include "third_party/blink/public/common/context_menu_data/context_menu_data.h" #include "third_party/blink/public/common/context_menu_data/edit_flags.h" +#include "third_party/blink/public/common/features.h" #include "third_party/blink/public/common/input/web_menu_source_type.h" #include "third_party/blink/public/mojom/context_menu/context_menu.mojom-blink.h" #include "third_party/blink/public/platform/impression_conversions.h" @@ -40,6 +45,7 @@ #include "third_party/blink/public/web/web_text_check_client.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/dom/element_traversal.h" +#include "third_party/blink/renderer/core/dom/events/event_target.h" #include "third_party/blink/renderer/core/dom/node.h" #include "third_party/blink/renderer/core/editing/editing_tri_state.h" #include "third_party/blink/renderer/core/editing/editor.h" @@ -74,10 +80,55 @@ #include "third_party/blink/renderer/core/page/focus_controller.h" #include "third_party/blink/renderer/core/page/page.h" #include "third_party/blink/renderer/core/page/scrolling/text_fragment_selector_generator.h" +#include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/platform/exported/wrapped_resource_response.h" namespace blink { +namespace { + +// Returns true if node or any of its ancestors have a context menu event +// listener. Uses already_visited_nodes to track nodes which have already +// been checked across multiple calls to this function, which could cause +// the output to be false despite having an ancestor context menu listener. +bool UnvisitedNodeOrAncestorHasContextMenuListener( + Node* node, + HeapHashSet<Member<Node>>& already_visited_nodes) { + Node* current_node_for_parent_traversal = node; + while (current_node_for_parent_traversal != nullptr) { + if (current_node_for_parent_traversal->HasEventListeners( + event_type_names::kContextmenu)) { + return true; + } + // If we've already checked this node, all of its ancestors must not + // have had listeners (or, we already detected a listener and broke out + // early). + if (!already_visited_nodes.insert(current_node_for_parent_traversal) + .is_new_entry) { + break; + } + current_node_for_parent_traversal = + current_node_for_parent_traversal->parentNode(); + } + return false; +} + +void MaybeRecordImageSelectionUkm( + ukm::SourceId source_id, + ContextMenuController::ImageSelectionOutcome outcome) { + DCHECK_NE(source_id, ukm::kInvalidSourceId); + static bool enable = base::GetFieldTrialParamByFeatureAsInt( + features::kEnablePenetratingImageSelection, "logUkm", false); + + if (enable) { + ukm::UkmEntryBuilder builder(source_id, "Blink.ContextMenu.ImageSelection"); + builder.SetMetric("Outcome", outcome); + builder.Record(ukm::UkmRecorder::Get()); + } +} + +} // namespace + ContextMenuController::ContextMenuController(Page* page) : page_(page) {} ContextMenuController::~ContextMenuController() = default; @@ -134,6 +185,105 @@ ClearContextMenu(); } +Node* ContextMenuController::GetContextMenuNodeWithImageContents( + const bool report_histograms) { + uint32_t outcome = 0; + uint32_t hit_test_depth = 0; + LocalFrame* top_hit_frame = + hit_test_result_.InnerNode()->GetDocument().GetFrame(); + Node* found_image_node = nullptr; + HeapHashSet<Member<Node>> already_visited_nodes_for_context_menu_listener; + + for (const auto& raw_node : hit_test_result_.ListBasedTestResult()) { + hit_test_depth++; + Node* node = raw_node.Get(); + + // Execute context menu listener and cross frame checks before image check + // because these checks should also apply to the image node itself before + // breaking. + if (UnvisitedNodeOrAncestorHasContextMenuListener( + node, already_visited_nodes_for_context_menu_listener)) { + outcome |= EnumToBitmask(kFoundContextMenuListener); + // Don't break because it allows us to log the failure reason only + // if an image node was otherwise available lower in the hit test. + } + if (top_hit_frame != node->GetDocument().GetFrame()) { + outcome |= EnumToBitmask(kBlockedByCrossFrameNode); + // Don't break because it allows us to log the failure reason only + // if an image node was otherwise available lower in the hit test. + } + + if (IsA<HTMLCanvasElement>(node) || + !HitTestResult::AbsoluteImageURL(node).IsEmpty()) { + found_image_node = node; + + if (hit_test_depth == 1) { + outcome |= EnumToBitmask(kImageFoundStandard); + // The context menu listener check is only necessary when penetrating, + // so clear the bit so we don't want to log it if the image was on top. + outcome &= ~EnumToBitmask(kFoundContextMenuListener); + } else { + outcome |= EnumToBitmask(kImageFoundPenetrating); + } + break; + } + // IMPORTANT: Check after image checks above so that non-transparent + // image elements don't trigger the opaque check. + if (node->GetLayoutBox() != nullptr && + node->GetLayoutBox()->BackgroundIsKnownToBeOpaqueInRect( + HitTestLocation::RectForPoint( + hit_test_result_.PointInInnerNodeFrame()))) { + outcome |= EnumToBitmask(kBlockedByOpaqueNode); + // Don't break because it allows us to log the failure reason only + // if an image node was otherwise available lower in the hit test. + } + } + + // Only log if we found an image node within the hit test. + if (report_histograms && (found_image_node != nullptr)) { + base::UmaHistogramCounts1000("Blink.ContextMenu.ImageSelection.Depth", + hit_test_depth); + for (uint32_t i = 0; i < kMaxValue; i++) { + unsigned val = 1 << i; + if (outcome & val) { + base::UmaHistogramEnumeration( + "Blink.ContextMenu.ImageSelection.Outcome", + ImageSelectionOutcome(i)); + MaybeRecordImageSelectionUkm( + found_image_node->GetDocument().UkmSourceID(), + ImageSelectionOutcome(i)); + } + } + } + // If there is anything preventing this image selection, return nullptr. + uint32_t blocking_image_selection_mask = + ~(EnumToBitmask(kImageFoundStandard) | + EnumToBitmask(kImageFoundPenetrating)); + if (outcome & blocking_image_selection_mask) { + return nullptr; + } + return found_image_node; +} + +// TODO(crbug.com/1184297) Cache image node when the context menu is shown and +// return that rather than refetching. +Node* ContextMenuController::ContextMenuImageNodeForFrame(LocalFrame* frame) { + if (base::FeatureList::IsEnabled( + features::kEnablePenetratingImageSelection)) { + // Don't report histograms because they were already sent for this node when + // ContextMenuData was populated. + Node* potential_image_node = GetContextMenuNodeWithImageContents( + /*report_histograms=*/false); + return potential_image_node != nullptr && + potential_image_node->GetDocument().GetFrame() == frame + ? potential_image_node + : nullptr; + } + return ContextMenuNodeForFrame(frame); +} + +// TODO(crbug.com/1184297) Cache image node when the context menu is shown and +// return that rather than refetching. Node* ContextMenuController::ContextMenuNodeForFrame(LocalFrame* frame) { return hit_test_result_.InnerNodeFrame() == frame ? hit_test_result_.InnerNodeOrImageMapImage() @@ -252,6 +402,11 @@ HitTestRequest::HitTestRequestType type = HitTestRequest::kReadOnly | HitTestRequest::kActive | HitTestRequest::kRetargetForInert; + if (base::FeatureList::IsEnabled( + features::kEnablePenetratingImageSelection)) { + type |= HitTestRequest::kPenetratingList | HitTestRequest::kListBased; + } + HitTestLocation location(point); HitTestResult result(type, location); if (frame) @@ -303,22 +458,8 @@ data.title_text = html_element->title().Utf8(); data.alt_text = html_element->AltText().Utf8(); } - - // Links, Images, Media tags, and Image/Media-Links take preference over - // all else. - if (IsA<HTMLCanvasElement>(result.InnerNode())) { - data.media_type = mojom::blink::ContextMenuDataMediaType::kCanvas; - data.has_image_contents = true; - } else if (!result.AbsoluteImageURL().IsEmpty()) { - data.src_url = result.AbsoluteImageURL(); - data.media_type = mojom::blink::ContextMenuDataMediaType::kImage; - data.media_flags |= ContextMenuData::kMediaCanPrint; - - // An image can be null for many reasons, like being blocked, no image - // data received from server yet. - data.has_image_contents = result.GetImage() && !result.GetImage()->IsNull(); - } else if (!result.AbsoluteMediaURL().IsEmpty() || - result.GetMediaStreamDescriptor()) { + if (!result.AbsoluteMediaURL().IsEmpty() || + result.GetMediaStreamDescriptor()) { if (!result.AbsoluteMediaURL().IsEmpty()) data.src_url = result.AbsoluteMediaURL(); @@ -420,8 +561,34 @@ data.media_flags |= ContextMenuData::kMediaCanRotate; } } - } + } else { + // Check image media last to ensure that penetrating image selection + // does not override a topmost media element. + // TODO(benwgold): Consider extending penetration to all media types. + Node* potential_image_node = result.InnerNodeOrImageMapImage(); + if (base::FeatureList::IsEnabled( + features::kEnablePenetratingImageSelection)) { + SCOPED_BLINK_UMA_HISTOGRAM_TIMER( + "Blink.ContextMenu.ImageSelection.ElapsedTime"); + potential_image_node = + GetContextMenuNodeWithImageContents(/*report_histograms=*/true); + } + if (potential_image_node != nullptr && + IsA<HTMLCanvasElement>(potential_image_node)) { + data.media_type = mojom::blink::ContextMenuDataMediaType::kCanvas; + data.has_image_contents = true; + } else if (potential_image_node != nullptr && + !HitTestResult::AbsoluteImageURL(potential_image_node) + .IsEmpty()) { + data.src_url = HitTestResult::AbsoluteImageURL(potential_image_node); + data.media_type = mojom::blink::ContextMenuDataMediaType::kImage; + data.media_flags |= ContextMenuData::kMediaCanPrint; + data.has_image_contents = + HitTestResult::GetImage(potential_image_node) && + !HitTestResult::GetImage(potential_image_node)->IsNull(); + } + } // If it's not a link, an image, a media element, or an image/media link, // show a selection menu or a more generic page menu. if (selected_frame->GetDocument()->Loader()) {
diff --git a/third_party/blink/renderer/core/page/context_menu_controller.h b/third_party/blink/renderer/core/page/context_menu_controller.h index 5dfb099..8aea0b8 100644 --- a/third_party/blink/renderer/core/page/context_menu_controller.h +++ b/third_party/blink/renderer/core/page/context_menu_controller.h
@@ -45,7 +45,7 @@ class Page; struct ContextMenuData; -class CORE_EXPORT ContextMenuController +class CORE_EXPORT ContextMenuController final : public GarbageCollected<ContextMenuController>, public mojom::blink::ContextMenuClient { public: @@ -65,22 +65,53 @@ void CustomContextMenuItemSelected(unsigned action); + Node* ContextMenuImageNodeForFrame(LocalFrame*); Node* ContextMenuNodeForFrame(LocalFrame*); // mojom::blink::ContextMenuClient methods. void CustomContextMenuAction(uint32_t action) override; void ContextMenuClosed(const KURL& link_followed) override; + // These values are persisted to logs. Entries should not be renumbered and + // numeric values should never be reused. Keep in sync with enum in + // tools/metrics/histograms/enums.xml + enum ImageSelectionOutcome : uint32_t { + // An image node was found to be the topmost node. + kImageFoundStandard = 0, + + // An image node was found below the topmost node. + kImageFoundPenetrating = 1, + + // An opaque node was found when penetrating to attempt to find an image + // nnode. + kBlockedByOpaqueNode = 2, + + // A context menu listener was found to be on one of the penetrated nodes + // or on one of those nodes' ancestors. + kFoundContextMenuListener = 3, + + // A cross frame node was found while penetrating, which is not yet + // supported. + kBlockedByCrossFrameNode = 4, + + kMaxValue = kBlockedByCrossFrameNode, + }; + private: friend class ContextMenuControllerTest; + uint32_t EnumToBitmask(ImageSelectionOutcome outcome) { return 1 << outcome; } + // Returns whether a Context Menu was actually shown. bool ShowContextMenu(LocalFrame*, const PhysicalOffset&, WebMenuSourceType, const MouseEvent* mouse_event = nullptr); + bool ShouldShowContextMenuFromTouch(const ContextMenuData&); + Node* GetContextMenuNodeWithImageContents(const bool report_histograms); + void UpdateTextFragmentSelectorGenerator(LocalFrame*); HeapMojoAssociatedReceiver<mojom::blink::ContextMenuClient, @@ -91,6 +122,7 @@ Member<Page> page_; Member<ContextMenuProvider> menu_provider_; HitTestResult hit_test_result_; + DISALLOW_COPY_AND_ASSIGN(ContextMenuController); };
diff --git a/third_party/blink/renderer/core/page/context_menu_controller_test.cc b/third_party/blink/renderer/core/page/context_menu_controller_test.cc index eebaf46..7d20321 100644 --- a/third_party/blink/renderer/core/page/context_menu_controller_test.cc +++ b/third_party/blink/renderer/core/page/context_menu_controller_test.cc
@@ -5,13 +5,18 @@ #include "third_party/blink/renderer/core/page/context_menu_controller.h" #include "base/optional.h" +#include "base/test/metrics/histogram_tester.h" +#include "base/test/scoped_feature_list.h" #include "build/build_config.h" +#include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/common/context_menu_data/context_menu_data.h" #include "third_party/blink/public/common/context_menu_data/edit_flags.h" +#include "third_party/blink/public/common/features.h" #include "third_party/blink/public/common/input/web_keyboard_event.h" #include "third_party/blink/public/common/input/web_menu_source_type.h" #include "third_party/blink/public/mojom/context_menu/context_menu.mojom-blink.h" +#include "third_party/blink/renderer/core/dom/events/native_event_listener.h" #include "third_party/blink/renderer/core/dom/xml_document.h" #include "third_party/blink/renderer/core/editing/frame_selection.h" #include "third_party/blink/renderer/core/frame/frame_test_helpers.h" @@ -28,6 +33,9 @@ #include "third_party/blink/renderer/platform/mediastream/media_stream_descriptor.h" #include "third_party/blink/renderer/platform/testing/empty_web_media_player.h" #include "third_party/blink/renderer/platform/testing/unit_test_helpers.h" +#include "third_party/blink/renderer/platform/testing/url_test_helpers.h" +#include "third_party/blink/renderer/platform/testing/weburl_loader_mock.h" +#include "third_party/blink/renderer/platform/testing/weburl_loader_mock_factory_impl.h" #include "third_party/blink/renderer/platform/wtf/casting.h" using testing::Return; @@ -36,6 +44,9 @@ namespace { +constexpr char kTestResourceFilename[] = "white-1x1.png"; +constexpr char kTestResourceMimeType[] = "image/png"; + class MockWebMediaPlayerForContextMenu : public EmptyWebMediaPlayer { public: MOCK_CONST_METHOD0(Duration, double()); @@ -74,10 +85,24 @@ ContextMenuData context_menu_data_; }; +void RegisterMockedImageURLLoad(const String& url) { + url_test_helpers::RegisterMockedURLLoad( + url_test_helpers::ToKURL(url.Utf8().c_str()), + test::CoreTestDataPath(kTestResourceFilename), kTestResourceMimeType); +} + } // anonymous namespace -class ContextMenuControllerTest : public testing::Test { +class ContextMenuControllerTest : public testing::Test, + public ::testing::WithParamInterface<bool> { public: + explicit ContextMenuControllerTest( + bool penetrating_image_selection_enabled = GetParam()) { + feature_list_.InitWithFeatureState( + features::kEnablePenetratingImageSelection, + penetrating_image_selection_enabled); + } + void SetUp() override { web_view_helper_.Initialize(&web_frame_client_); @@ -88,6 +113,10 @@ DocumentUpdateReason::kTest); } + void TearDown() override { + url_test_helpers::UnregisterAllURLsAndClearMemoryCache(); + } + bool ShowContextMenu(const PhysicalOffset& location, WebMenuSourceType source) { bool success = @@ -130,12 +159,15 @@ video->SetReadyState(state); } - private: + protected: + base::test::ScopedFeatureList feature_list_; TestWebFrameClientImpl web_frame_client_; frame_test_helpers::WebViewHelper web_view_helper_; }; -TEST_F(ContextMenuControllerTest, VideoNotLoaded) { +INSTANTIATE_TEST_SUITE_P(, ContextMenuControllerTest, ::testing::Bool()); + +TEST_P(ContextMenuControllerTest, VideoNotLoaded) { ContextMenuAllowedScope context_menu_allowed_scope; HitTestResult hit_test_result; const char video_url[] = "https://example.com/foo.webm"; @@ -192,7 +224,7 @@ } } -TEST_F(ContextMenuControllerTest, VideoWithAudioOnly) { +TEST_P(ContextMenuControllerTest, VideoWithAudioOnly) { ContextMenuAllowedScope context_menu_allowed_scope; HitTestResult hit_test_result; const char video_url[] = "https://example.com/foo.webm"; @@ -253,7 +285,7 @@ } } -TEST_F(ContextMenuControllerTest, PictureInPictureEnabledVideoLoaded) { +TEST_P(ContextMenuControllerTest, PictureInPictureEnabledVideoLoaded) { // Make sure Picture-in-Picture is enabled. GetDocument()->GetSettings()->SetPictureInPictureEnabled(true); @@ -310,7 +342,7 @@ } } -TEST_F(ContextMenuControllerTest, PictureInPictureDisabledVideoLoaded) { +TEST_P(ContextMenuControllerTest, PictureInPictureDisabledVideoLoaded) { // Make sure Picture-in-Picture is disabled. GetDocument()->GetSettings()->SetPictureInPictureEnabled(false); @@ -367,7 +399,7 @@ } } -TEST_F(ContextMenuControllerTest, MediaStreamVideoLoaded) { +TEST_P(ContextMenuControllerTest, MediaStreamVideoLoaded) { // Make sure Picture-in-Picture is enabled. GetDocument()->GetSettings()->SetPictureInPictureEnabled(true); @@ -425,7 +457,7 @@ } } -TEST_F(ContextMenuControllerTest, InfiniteDurationVideoLoaded) { +TEST_P(ContextMenuControllerTest, InfiniteDurationVideoLoaded) { // Make sure Picture-in-Picture is enabled. GetDocument()->GetSettings()->SetPictureInPictureEnabled(true); @@ -488,7 +520,7 @@ } } -TEST_F(ContextMenuControllerTest, EditingActionsEnabledInSVGDocument) { +TEST_P(ContextMenuControllerTest, EditingActionsEnabledInSVGDocument) { frame_test_helpers::LoadFrame(LocalMainFrame(), R"SVG(data:image/svg+xml, <svg xmlns='http://www.w3.org/2000/svg' xmlns:h='http://www.w3.org/1999/xhtml' @@ -537,7 +569,7 @@ ContextMenuDataEditFlags::kCanEditRichly); } -TEST_F(ContextMenuControllerTest, EditingActionsEnabledInXMLDocument) { +TEST_P(ContextMenuControllerTest, EditingActionsEnabledInXMLDocument) { frame_test_helpers::LoadFrame(LocalMainFrame(), R"XML(data:text/xml, <root> <style xmlns="http://www.w3.org/1999/xhtml"> @@ -565,7 +597,7 @@ EXPECT_EQ(context_menu_data.selected_text, "Blue text"); } -TEST_F(ContextMenuControllerTest, ShowNonLocatedContextMenuEvent) { +TEST_P(ContextMenuControllerTest, ShowNonLocatedContextMenuEvent) { GetDocument()->documentElement()->setInnerHTML( "<input id='sample' type='text' size='5' value='Sample Input Text'>"); @@ -612,7 +644,7 @@ #if !defined(OS_MAC) // Mac has no way to open a context menu based on a keyboard event. -TEST_F(ContextMenuControllerTest, +TEST_P(ContextMenuControllerTest, ValidateNonLocatedContextMenuOnLargeImageElement) { GetDocument()->documentElement()->setInnerHTML( "<img src=\"http://example.test/cat.jpg\" id=\"sample_image\" " @@ -642,7 +674,7 @@ } #endif -TEST_F(ContextMenuControllerTest, SelectionRectClipped) { +TEST_P(ContextMenuControllerTest, SelectionRectClipped) { GetDocument()->documentElement()->setInnerHTML( "<textarea id='text-area' cols=6 rows=2>Sample editable text</textarea>"); @@ -695,4 +727,661 @@ EXPECT_EQ(context_menu_data.selection_rect, selection_rect); } +class MockEventListener final : public NativeEventListener { + public: + MOCK_METHOD2(Invoke, void(ExecutionContext*, Event*)); +}; + +// Test that a basic image hit test works without penetration enabled. +TEST_P(ContextMenuControllerTest, ContextMenuImageHitTestStandardImageControl) { + if (base::FeatureList::IsEnabled( + features::kEnablePenetratingImageSelection)) { + return; + } + RegisterMockedImageURLLoad("http://test.png"); + ContextMenuAllowedScope context_menu_allowed_scope; + + GetDocument()->documentElement()->setInnerHTML(R"HTML( + <body> + <style> + #target { + top: 0; + left: 0; + position: absolute; + width: 100px; + height: 100px; + z-index: 1; + } + </style> + <img id=target src='http://test.png'> + </body> + )HTML"); + + base::HistogramTester histograms; + + PhysicalOffset location(LayoutUnit(5), LayoutUnit(5)); + EXPECT_TRUE(ShowContextMenu(location, kMenuSourceLongPress)); + + // Context menu info are sent to the WebLocalFrameClient. + ContextMenuData context_menu_data = GetWebFrameClient().GetContextMenuData(); + EXPECT_EQ("http://test.png/", context_menu_data.src_url.spec()); + // EXPECT_TRUE(context_menu_data.has_image_contents); + EXPECT_EQ(mojom::blink::ContextMenuDataMediaType::kImage, + context_menu_data.media_type); + + // No histograms should be sent in the control group. + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kImageFoundStandard, 0); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kImageFoundPenetrating, + 0); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kBlockedByOpaqueNode, 0); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kFoundContextMenuListener, + 0); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kBlockedByCrossFrameNode, + 0); +} + +// Test that a basic image hit test works and is no† impacted by +// penetrating image selection logic. +TEST_P(ContextMenuControllerTest, + ContextMenuImageHitTestStandardImageSelectionExperiment) { + if (!base::FeatureList::IsEnabled( + features::kEnablePenetratingImageSelection)) { + return; + } + + String url = "http://test.png"; + LOG(ERROR) << "URL IS: " << url.Utf8().c_str(); + RegisterMockedImageURLLoad(url); + + ContextMenuAllowedScope context_menu_allowed_scope; + + GetDocument()->documentElement()->setInnerHTML(R"HTML( + <body> + <style> + #target { + top: 0; + left: 0; + position: absolute; + width: 100px; + height: 100px; + z-index: 1; + } + </style> + <img id=target src="http://test.png"> + </body> + )HTML"); + + base::HistogramTester histograms; + + PhysicalOffset location(LayoutUnit(5), LayoutUnit(5)); + EXPECT_TRUE(ShowContextMenu(location, kMenuSourceLongPress)); + + // Context menu info are sent to the WebLocalFrameClient. + ContextMenuData context_menu_data = GetWebFrameClient().GetContextMenuData(); + EXPECT_EQ("http://test.png/", context_menu_data.src_url.spec()); + EXPECT_EQ(mojom::blink::ContextMenuDataMediaType::kImage, + context_menu_data.media_type); + + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kImageFoundStandard, 1); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kImageFoundPenetrating, + 0); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kBlockedByOpaqueNode, 0); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kFoundContextMenuListener, + 0); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kBlockedByCrossFrameNode, + 0); +} + +// Test that image selection can penetrate through a fully transparent div +// above the target image. +TEST_P(ContextMenuControllerTest, ContextMenuImageHitTestSucceededPenetrating) { + if (!base::FeatureList::IsEnabled( + features::kEnablePenetratingImageSelection)) { + return; + } + RegisterMockedImageURLLoad("http://test.png"); + ContextMenuAllowedScope context_menu_allowed_scope; + + GetDocument()->documentElement()->setInnerHTML(R"HTML( + <body> + <style> + #target { + top: 0; + left: 0; + position: absolute; + width: 100px; + height: 100px; + z-index: 1; + } + #occluder { + top: 0; + left: 0; + position: absolute; + width: 100px; + height: 100px; + z-index: 2; + } + </style> + <img id=target src='http://test.png'> + <div id=occluder></div> + </body> + )HTML"); + + base::HistogramTester histograms; + + PhysicalOffset location(LayoutUnit(5), LayoutUnit(5)); + EXPECT_TRUE(ShowContextMenu(location, kMenuSourceLongPress)); + + // Context menu info are sent to the WebLocalFrameClient. + ContextMenuData context_menu_data = GetWebFrameClient().GetContextMenuData(); + EXPECT_EQ("http://test.png/", context_menu_data.src_url.spec()); + EXPECT_EQ(mojom::blink::ContextMenuDataMediaType::kImage, + context_menu_data.media_type); + + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kImageFoundStandard, 0); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kImageFoundPenetrating, + 1); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kBlockedByOpaqueNode, 0); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kFoundContextMenuListener, + 0); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kBlockedByCrossFrameNode, + 0); +} + +// Test that a basic image hit test works and is no† impacted by +// penetrating image selection logic. +TEST_P(ContextMenuControllerTest, ContextMenuImageHitTestStandardCanvas) { + if (!base::FeatureList::IsEnabled( + features::kEnablePenetratingImageSelection)) { + return; + } + ContextMenuAllowedScope context_menu_allowed_scope; + + GetDocument()->documentElement()->setInnerHTML(R"HTML( + <body> + <style> + #target { + top: 0; + left: 0; + position: absolute; + width: 100px; + height: 100px; + z-index: 1; + } + </style> + <canvas id=target> + </body> + )HTML"); + + base::HistogramTester histograms; + + PhysicalOffset location(LayoutUnit(5), LayoutUnit(5)); + EXPECT_TRUE(ShowContextMenu(location, kMenuSourceLongPress)); + + // Context menu info are sent to the WebLocalFrameClient. + ContextMenuData context_menu_data = GetWebFrameClient().GetContextMenuData(); + EXPECT_EQ(mojom::blink::ContextMenuDataMediaType::kCanvas, + context_menu_data.media_type); + + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kImageFoundStandard, 1); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kImageFoundPenetrating, + 0); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kBlockedByOpaqueNode, 0); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kFoundContextMenuListener, + 0); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kBlockedByCrossFrameNode, + 0); +} + +// Test that an image node will not be selected through an opaque div +// above the target image. +TEST_P(ContextMenuControllerTest, ContextMenuImageHitTestOpaqueNodeBlocking) { + if (!base::FeatureList::IsEnabled( + features::kEnablePenetratingImageSelection)) { + return; + } + RegisterMockedImageURLLoad("http://test.png"); + ContextMenuAllowedScope context_menu_allowed_scope; + + GetDocument()->documentElement()->setInnerHTML(R"HTML( + <body> + <style> + #target { + top: 0; + left: 0; + position: absolute; + width: 100px; + height: 100px; + z-index: 1; + } + #opaque { + background: blue; + top: 0; + left: 0; + position: absolute; + width: 100px; + height: 100px; + z-index: 2; + } + #occluder { + top: 0; + left: 0; + position: absolute; + width: 100px; + height: 100px; + z-index: 3; + } + </style> + + <img id=target src='http://test.png'> + <div id=opaque></div> + <div id=occluder></div> + </body> + )HTML"); + + base::HistogramTester histograms; + + PhysicalOffset location(LayoutUnit(5), LayoutUnit(5)); + EXPECT_TRUE(ShowContextMenu(location, kMenuSourceLongPress)); + + // Context menu info are sent to the WebLocalFrameClient. + ContextMenuData context_menu_data = GetWebFrameClient().GetContextMenuData(); + EXPECT_EQ(mojom::blink::ContextMenuDataMediaType::kNone, + context_menu_data.media_type); + + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kImageFoundStandard, 0); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kImageFoundPenetrating, + 1); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kBlockedByOpaqueNode, 1); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kFoundContextMenuListener, + 0); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kBlockedByCrossFrameNode, + 0); +} + +// Test that an image node will not be selected if a node with a context menu +// listener is above the image node, but that we will still log the presence of +// the image. +TEST_P(ContextMenuControllerTest, + ContextMenuImageHitTestContextMenuListenerAboveImageBlocking) { + if (!base::FeatureList::IsEnabled( + features::kEnablePenetratingImageSelection)) { + return; + } + RegisterMockedImageURLLoad("http://test.png"); + ContextMenuAllowedScope context_menu_allowed_scope; + + GetDocument()->documentElement()->setInnerHTML(R"HTML( + <body> + <style> + #target { + top: 0; + left: 0; + position: absolute; + width: 100px; + height: 100px; + z-index: 1; + } + #nodewithlistener { + top: 0; + left: 0; + position: absolute; + width: 100px; + height: 100px; + z-index: 2; + } + #occluder { + top: 0; + left: 0; + position: absolute; + width: 100px; + height: 100px; + z-index: 3; + } + </style> + <img id=target src='http://test.png'> + <div id=nodewithlistener></div> + <div id=occluder></div> + </body> +)HTML"); + + Persistent<MockEventListener> event_listener = + MakeGarbageCollected<MockEventListener>(); + base::HistogramTester histograms; + + Element* target_image = GetDocument()->getElementById("target"); + target_image->addEventListener(event_type_names::kContextmenu, + event_listener); + + PhysicalOffset location(LayoutUnit(5), LayoutUnit(5)); + EXPECT_TRUE(ShowContextMenu(location, kMenuSourceLongPress)); + + // Context menu info are sent to the WebLocalFrameClient. + ContextMenuData context_menu_data = GetWebFrameClient().GetContextMenuData(); + EXPECT_EQ(mojom::blink::ContextMenuDataMediaType::kNone, + context_menu_data.media_type); + + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kImageFoundStandard, 0); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kImageFoundPenetrating, + 1); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kBlockedByOpaqueNode, 0); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kFoundContextMenuListener, + 1); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kBlockedByCrossFrameNode, + 0); +} + +// Test that an image node will not be selected if the image node itself has a +// context menu listener on it (and the image node is not the topmost element) +TEST_P(ContextMenuControllerTest, + ContextMenuImageHitTestContextMenuListenerOnImageBlocking) { + if (!base::FeatureList::IsEnabled( + features::kEnablePenetratingImageSelection)) { + return; + } + RegisterMockedImageURLLoad("http://test.png"); + ContextMenuAllowedScope context_menu_allowed_scope; + + GetDocument()->documentElement()->setInnerHTML(R"HTML( + <body> + <style> + #target { + top: 0; + left: 0; + position: absolute; + width: 100px; + height: 100px; + z-index: 1; + } + #occluder { + top: 0; + left: 0; + position: absolute; + width: 100px; + height: 100px; + z-index: 2; + } + </style> + <img id=target src='http://test.png'> + <div id=occluder></div> + </body> + )HTML"); + + // Attaching a listener for the finished event indicates pending activity. + Persistent<MockEventListener> event_listener = + MakeGarbageCollected<MockEventListener>(); + base::HistogramTester histograms; + + Element* target_image = GetDocument()->getElementById("target"); + target_image->addEventListener(event_type_names::kContextmenu, + event_listener); + + PhysicalOffset location(LayoutUnit(5), LayoutUnit(5)); + EXPECT_TRUE(ShowContextMenu(location, kMenuSourceLongPress)); + + // Context menu info are sent to the WebLocalFrameClient. + ContextMenuData context_menu_data = GetWebFrameClient().GetContextMenuData(); + EXPECT_EQ(mojom::blink::ContextMenuDataMediaType::kNone, + context_menu_data.media_type); + + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kImageFoundStandard, 0); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kImageFoundPenetrating, + 1); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kBlockedByOpaqueNode, 0); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kFoundContextMenuListener, + 1); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kBlockedByCrossFrameNode, + 0); +} + +// Test that an image node will be selected if the image node itself has an +// unrelated event listener on it. +TEST_P(ContextMenuControllerTest, + ContextMenuImageHitTestNonBlockingNonContextMenuListenerOnImage) { + if (!base::FeatureList::IsEnabled( + features::kEnablePenetratingImageSelection)) { + return; + } + RegisterMockedImageURLLoad("http://test.png"); + ContextMenuAllowedScope context_menu_allowed_scope; + + GetDocument()->documentElement()->setInnerHTML(R"HTML( + <body> + <style> + #target { + top: 0; + left: 0; + position: absolute; + width: 100px; + height: 100px; + z-index: 1; + } + #occluder { + top: 0; + left: 0; + position: absolute; + width: 100px; + height: 100px; + z-index: 2; + } + </style> + <img id=target src='http://test.png'> + <div id=occluder></div> + </body> + )HTML"); + + Persistent<MockEventListener> event_listener = + MakeGarbageCollected<MockEventListener>(); + base::HistogramTester histograms; + + Element* target_image = GetDocument()->getElementById("target"); + target_image->addEventListener(event_type_names::kClick, event_listener); + + PhysicalOffset location(LayoutUnit(5), LayoutUnit(5)); + EXPECT_TRUE(ShowContextMenu(location, kMenuSourceLongPress)); + + // Context menu info are sent to the WebLocalFrameClient. + ContextMenuData context_menu_data = GetWebFrameClient().GetContextMenuData(); + EXPECT_EQ(mojom::blink::ContextMenuDataMediaType::kImage, + context_menu_data.media_type); + + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kImageFoundStandard, 0); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kImageFoundPenetrating, + 1); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kBlockedByOpaqueNode, 0); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kFoundContextMenuListener, + 0); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kBlockedByCrossFrameNode, + 0); +} + +// Test that an image node will still be selected if it is the topmost node +// despite an ancestor having a context menu listener attached to it. +TEST_P(ContextMenuControllerTest, + ContextMenuImageHitTestStandardContextMenuListenerAncestorNonBlocking) { + if (!base::FeatureList::IsEnabled( + features::kEnablePenetratingImageSelection)) { + return; + } + RegisterMockedImageURLLoad("http://test.png"); + ContextMenuAllowedScope context_menu_allowed_scope; + + GetDocument()->documentElement()->setInnerHTML(R"HTML( + <body> + <style> + #hiddenancestor { + top: 0; + left: 0; + position: absolute; + width: 1px; + height: 1px; + z-index: 1; + } + #target { + top: 0; + left: 0; + position: absolute; + width: 100px; + height: 100px; + z-index: 2; + } + </style> + <div id=hiddenancestor> + <img id=target src='http://test.png'> + </div> + </body> + )HTML"); + + Persistent<MockEventListener> event_listener = + MakeGarbageCollected<MockEventListener>(); + base::HistogramTester histograms; + + Element* hidden_ancestor = GetDocument()->getElementById("hiddenancestor"); + hidden_ancestor->addEventListener(event_type_names::kContextmenu, + event_listener); + + // This hit test would miss the node with the listener if it was not an + // ancestor. + PhysicalOffset location(LayoutUnit(5), LayoutUnit(5)); + EXPECT_TRUE(ShowContextMenu(location, kMenuSourceLongPress)); + + // Context menu info are sent to the WebLocalFrameClient. + ContextMenuData context_menu_data = GetWebFrameClient().GetContextMenuData(); + // EXPECT_TRUE(context_menu_data.has_image_contents); + + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kImageFoundStandard, 1); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kImageFoundPenetrating, + 0); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kBlockedByOpaqueNode, 0); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kFoundContextMenuListener, + 0); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kBlockedByCrossFrameNode, + 0); +} + +// Test that an image node will not be selected if a non image node with a +// context listener ancestor is above it and verify that topmost context menu +// listener special logic only applies if the topmost node is an image. +TEST_P(ContextMenuControllerTest, + ContextMenuImageHitTestContextMenuListenerAncestorBlocking) { + if (!base::FeatureList::IsEnabled( + features::kEnablePenetratingImageSelection)) { + return; + } + RegisterMockedImageURLLoad("http://test.png"); + ContextMenuAllowedScope context_menu_allowed_scope; + + GetDocument()->documentElement()->setInnerHTML(R"HTML( + <body> + <style> + #target { + top: 0; + left: 0; + position: absolute; + width: 100px; + height: 100px; + z-index: 1; + } + #hiddenancestor { + top: 0; + left: 0; + position: absolute; + width: 1px; + height: 1px; + z-index: 2; + } + #occluder { + top: 0; + left: 0; + position: absolute; + width: 100px; + height: 100px; + z-index: 3; + } + </style> + <img id=target src='http://test.png'> + <div id=hiddenancestor> + <div id=occluder></div> + </div> + </body> + )HTML"); + + Persistent<MockEventListener> event_listener = + MakeGarbageCollected<MockEventListener>(); + base::HistogramTester histograms; + + Element* hidden_ancestor = GetDocument()->getElementById("hiddenancestor"); + hidden_ancestor->addEventListener(event_type_names::kContextmenu, + event_listener); + + PhysicalOffset location(LayoutUnit(5), LayoutUnit(5)); + EXPECT_TRUE(ShowContextMenu(location, kMenuSourceLongPress)); + + // Context menu info are sent to the WebLocalFrameClient. + ContextMenuData context_menu_data = GetWebFrameClient().GetContextMenuData(); + EXPECT_EQ(mojom::blink::ContextMenuDataMediaType::kNone, + context_menu_data.media_type); + + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kImageFoundStandard, 0); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kImageFoundPenetrating, + 1); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kBlockedByOpaqueNode, 0); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kFoundContextMenuListener, + 1); + histograms.ExpectBucketCount("Blink.ContextMenu.ImageSelection.Outcome", + ContextMenuController::kBlockedByCrossFrameNode, + 0); +} + +// TODO(crbug.com/1184996): Add additional unit test for blocking frame logging. + } // namespace blink
diff --git a/third_party/blink/renderer/core/page/scrolling/text_fragment_selector_generator.cc b/third_party/blink/renderer/core/page/scrolling/text_fragment_selector_generator.cc index 842d9ad..6fe8778 100644 --- a/third_party/blink/renderer/core/page/scrolling/text_fragment_selector_generator.cc +++ b/third_party/blink/renderer/core/page/scrolling/text_fragment_selector_generator.cc
@@ -303,17 +303,14 @@ GenerateSelector(); } else { DCHECK_NE(state_, kNotStarted); - if (state_ == kFailure || state_ == kSuccess) { - selector_requested_before_ready_ = false; - if (state_ == kFailure) { - NotifyClientSelectorReady( - TextFragmentSelector(TextFragmentSelector::SelectorType::kInvalid)); - } else { - NotifyClientSelectorReady(*selector_); - } - return; + if (state_ == kFailure) { + std::move(pending_generate_selector_callback_) + .Run( + TextFragmentSelector(TextFragmentSelector::SelectorType::kInvalid) + .ToString()); + } else if (state_ == kSuccess) { + std::move(pending_generate_selector_callback_).Run(selector_->ToString()); } - selector_requested_before_ready_ = true; } } @@ -366,11 +363,11 @@ NOTREACHED(); ABSL_FALLTHROUGH_INTENDED; case kFailure: - OnSelectorReady( + NotifySelectorReady( TextFragmentSelector(TextFragmentSelector::SelectorType::kInvalid)); break; case kSuccess: - OnSelectorReady(*selector_); + NotifySelectorReady(*selector_); break; } } @@ -411,20 +408,48 @@ ResolveSelectorState(); } -void TextFragmentSelectorGenerator::OnSelectorReady( +void TextFragmentSelectorGenerator::NotifySelectorReady( const TextFragmentSelector& selector) { - RecordAllMetrics(selector); - if (pending_generate_selector_callback_) { - NotifyClientSelectorReady(selector); - } -} + // TODO(crbug.com/1133823): Add unit tests for all SharedHighlights.* + // histograms. + UMA_HISTOGRAM_BOOLEAN( + "SharedHighlights.LinkGenerated", + selector.Type() != TextFragmentSelector::SelectorType::kInvalid); -void TextFragmentSelectorGenerator::NotifyClientSelectorReady( - const TextFragmentSelector& selector) { - DCHECK(pending_generate_selector_callback_); - if (base::FeatureList::IsEnabled(features::kPreemptiveLinkToTextGeneration)) - RecordPreemptiveGenerationMetrics(selector); - std::move(pending_generate_selector_callback_).Run(selector.ToString()); + ukm::UkmRecorder* recorder = selection_frame_->GetDocument()->UkmRecorder(); + ukm::SourceId source_id = selection_frame_->GetDocument()->UkmSourceID(); + + if (selector.Type() != TextFragmentSelector::SelectorType::kInvalid) { + UMA_HISTOGRAM_COUNTS_1000("SharedHighlights.LinkGenerated.ParamLength", + selector.ToString().length()); + + UMA_HISTOGRAM_EXACT_LINEAR("SharedHighlights.LinkGenerated.Iterations", + iteration_, kMaxIterationCountToRecord); + UMA_HISTOGRAM_TIMES("SharedHighlights.LinkGenerated.TimeToGenerate", + base::DefaultTickClock::GetInstance()->NowTicks() - + generation_start_time_); + UMA_HISTOGRAM_ENUMERATION( + "SharedHighlights.LinkGenerated.SelectorParameters", + TextFragmentAnchorMetrics::GetParametersForSelector(selector)); + + shared_highlighting::LogLinkGeneratedSuccessUkmEvent(recorder, source_id); + } else { + UMA_HISTOGRAM_EXACT_LINEAR( + "SharedHighlights.LinkGenerated.Error.Iterations", iteration_, + kMaxIterationCountToRecord); + UMA_HISTOGRAM_TIMES("SharedHighlights.LinkGenerated.Error.TimeToGenerate", + base::DefaultTickClock::GetInstance()->NowTicks() - + generation_start_time_); + + LinkGenerationError error = + error_.has_value() ? error_.value() : LinkGenerationError::kUnknown; + shared_highlighting::LogLinkGenerationErrorReason(error); + shared_highlighting::LogLinkGeneratedErrorUkmEvent(recorder, source_id, + error); + } + + if (pending_generate_selector_callback_) + std::move(pending_generate_selector_callback_).Run(selector.ToString()); } void TextFragmentSelectorGenerator::ClearSelection() { @@ -652,69 +677,5 @@ num_range_words_ = 0; iteration_ = 0; selector_ = nullptr; - selector_requested_before_ready_.reset(); } - -void TextFragmentSelectorGenerator::RecordAllMetrics( - const TextFragmentSelector& selector) { - UMA_HISTOGRAM_BOOLEAN( - "SharedHighlights.LinkGenerated", - selector.Type() != TextFragmentSelector::SelectorType::kInvalid); - - ukm::UkmRecorder* recorder = selection_frame_->GetDocument()->UkmRecorder(); - ukm::SourceId source_id = selection_frame_->GetDocument()->UkmSourceID(); - - if (selector.Type() != TextFragmentSelector::SelectorType::kInvalid) { - UMA_HISTOGRAM_COUNTS_1000("SharedHighlights.LinkGenerated.ParamLength", - selector.ToString().length()); - - UMA_HISTOGRAM_EXACT_LINEAR("SharedHighlights.LinkGenerated.Iterations", - iteration_, kMaxIterationCountToRecord); - UMA_HISTOGRAM_TIMES("SharedHighlights.LinkGenerated.TimeToGenerate", - base::DefaultTickClock::GetInstance()->NowTicks() - - generation_start_time_); - UMA_HISTOGRAM_ENUMERATION( - "SharedHighlights.LinkGenerated.SelectorParameters", - TextFragmentAnchorMetrics::GetParametersForSelector(selector)); - - shared_highlighting::LogLinkGeneratedSuccessUkmEvent(recorder, source_id); - } else { - UMA_HISTOGRAM_EXACT_LINEAR( - "SharedHighlights.LinkGenerated.Error.Iterations", iteration_, - kMaxIterationCountToRecord); - UMA_HISTOGRAM_TIMES("SharedHighlights.LinkGenerated.Error.TimeToGenerate", - base::DefaultTickClock::GetInstance()->NowTicks() - - generation_start_time_); - - LinkGenerationError error = - error_.has_value() ? error_.value() : LinkGenerationError::kUnknown; - shared_highlighting::LogLinkGenerationErrorReason(error); - shared_highlighting::LogLinkGeneratedErrorUkmEvent(recorder, source_id, - error); - } -} - -void TextFragmentSelectorGenerator::RecordPreemptiveGenerationMetrics( - const TextFragmentSelector& selector) { - DCHECK(selector_requested_before_ready_.has_value()); - - bool success = - selector.Type() != TextFragmentSelector::SelectorType::kInvalid; - - std::string uma_prefix = "SharedHighlights.LinkGenerated"; - if (selector_requested_before_ready_.value()) { - uma_prefix = base::StrCat({uma_prefix, ".RequestedBeforeReady"}); - } else { - uma_prefix = base::StrCat({uma_prefix, ".RequestedAfterReady"}); - } - base::UmaHistogramBoolean(uma_prefix, success); - - if (!success) { - LinkGenerationError error = - error_.has_value() ? error_.value() : LinkGenerationError::kUnknown; - base::UmaHistogramEnumeration( - "SharedHighlights.LinkGenerated.Error.Requested", error); - } -} - } // namespace blink
diff --git a/third_party/blink/renderer/core/page/scrolling/text_fragment_selector_generator.h b/third_party/blink/renderer/core/page/scrolling/text_fragment_selector_generator.h index d4af08d..5979c10d 100644 --- a/third_party/blink/renderer/core/page/scrolling/text_fragment_selector_generator.h +++ b/third_party/blink/renderer/core/page/scrolling/text_fragment_selector_generator.h
@@ -61,6 +61,9 @@ void NoMatchFound() override; + // Notifies the results of |GenerateSelector|. + void NotifySelectorReady(const TextFragmentSelector& selector); + // Wrappers for tests. String GetPreviousTextBlockForTesting(const Position& position) { return GetPreviousTextBlock(position); @@ -120,15 +123,6 @@ void Reset(); - void RecordAllMetrics(const TextFragmentSelector& selector); - void RecordPreemptiveGenerationMetrics(const TextFragmentSelector& selector); - - // Called when selector generation is complete. - void OnSelectorReady(const TextFragmentSelector& selector); - - // Called to notify clients of the result of |GenerateSelector|. - void NotifyClientSelectorReady(const TextFragmentSelector& selector); - Member<LocalFrame> selection_frame_; Member<Range> selection_range_; std::unique_ptr<TextFragmentSelector> selector_; @@ -143,10 +137,6 @@ GenerationStep step_ = kExact; SelectorState state_ = kNeedsNewCandidate; - // Used when preemptive link generation is enabled to report - // whether |RequestSelector| was called before or after selector was ready. - base::Optional<bool> selector_requested_before_ready_; - base::Optional<shared_highlighting::LinkGenerationError> error_; // Fields used for keeping track of context.
diff --git a/third_party/blink/renderer/core/page/scrolling/text_fragment_selector_generator_test.cc b/third_party/blink/renderer/core/page/scrolling/text_fragment_selector_generator_test.cc index 8922946..6dc8546 100644 --- a/third_party/blink/renderer/core/page/scrolling/text_fragment_selector_generator_test.cc +++ b/third_party/blink/renderer/core/page/scrolling/text_fragment_selector_generator_test.cc
@@ -9,8 +9,6 @@ #include "base/run_loop.h" #include "base/test/bind.h" #include "base/test/metrics/histogram_tester.h" -#include "base/test/scoped_feature_list.h" -#include "components/shared_highlighting/core/common/features.h" #include "components/shared_highlighting/core/common/shared_highlighting_metrics.h" #include "components/ukm/test_ukm_recorder.h" #include "mojo/public/cpp/bindings/receiver_set.h" @@ -33,21 +31,11 @@ const char kErrorUkmMetric[] = "Error"; } // namespace -class TextFragmentSelectorGeneratorTest - : public SimTest, - public ::testing::WithParamInterface<bool> { +class TextFragmentSelectorGeneratorTest : public SimTest { public: void SetUp() override { SimTest::SetUp(); WebView().MainFrameViewWidget()->Resize(gfx::Size(800, 600)); - preemptive_generation_enabled_ = GetParam(); - if (preemptive_generation_enabled_) { - feature_list_.InitAndEnableFeature( - features::kPreemptiveLinkToTextGeneration); - } else { - feature_list_.InitAndDisableFeature( - features::kPreemptiveLinkToTextGeneration); - } } void VerifySelector(Position selected_start, @@ -59,11 +47,7 @@ // Should not have logged errors in a success case. histogram_tester_.ExpectTotalCount("SharedHighlights.LinkGenerated.Error", 0); - histogram_tester_.ExpectTotalCount( - "SharedHighlights.LinkGenerated.Error.Requested", 0); - histogram_tester_.ExpectTotalCount("SharedHighlights.LinkGenerated", - generate_call_count_); auto entries = ukm_recorder()->GetEntriesByName( ukm::builders::SharedHighlights_LinkGenerated::kEntryName); ASSERT_EQ(1u, entries.size()); @@ -79,10 +63,9 @@ String generated_selector = GenerateSelector(selected_start, selected_end); EXPECT_EQ("", generated_selector); - histogram_tester_.ExpectTotalCount("SharedHighlights.LinkGenerated", - generate_call_count_); histogram_tester_.ExpectBucketCount("SharedHighlights.LinkGenerated.Error", error, 1); + auto entries = ukm_recorder()->GetEntriesByName( ukm::builders::SharedHighlights_LinkGenerated::kEntryName); ASSERT_EQ(1u, entries.size()); @@ -94,7 +77,6 @@ } String GenerateSelector(Position selected_start, Position selected_end) { - generate_call_count_++; GetDocument() .GetFrame() ->GetTextFragmentSelectorGenerator() @@ -121,44 +103,6 @@ return selector; } - void VerifyPreemptiveGenerationMetrics(bool success) { - if (!preemptive_generation_enabled_) { - histogram_tester_.ExpectTotalCount( - "SharedHighlights.LinkGenerated.Error.Requested", 0); - histogram_tester_.ExpectTotalCount( - "SharedHighlights.LinkGenerated.RequestedAfterReady", 0); - histogram_tester_.ExpectTotalCount( - "SharedHighlights.LinkGenerated.RequestedBeforeReady", 0); - } else { - EXPECT_EQ( - 1u, histogram_tester_ - .GetAllSamples( - "SharedHighlights.LinkGenerated.RequestedAfterReady") - .size() + - histogram_tester_ - .GetAllSamples( - "SharedHighlights.LinkGenerated.RequestedBeforeReady") - .size()); - - if (!success) { - histogram_tester_.ExpectTotalCount( - "SharedHighlights.LinkGenerated.Error.Requested", 1); - } else { - histogram_tester_.ExpectTotalCount( - "SharedHighlights.LinkGenerated.Error.Requested", 0); - } - } - - // Check async task metrics. - EXPECT_LT(0u, histogram_tester_ - .GetAllSamples("SharedHighlights.AsyncTask.Iterations") - .size()); - EXPECT_LT(0u, - histogram_tester_ - .GetAllSamples("SharedHighlights.AsyncTask.SearchDuration") - .size()); - } - protected: ukm::TestUkmRecorder* ukm_recorder() { return scoped_ukm_recorder_.recorder(); @@ -166,13 +110,10 @@ base::HistogramTester histogram_tester_; ScopedFakeUkmRecorder scoped_ukm_recorder_; - int generate_call_count_ = 0; - bool preemptive_generation_enabled_; - base::test::ScopedFeatureList feature_list_; }; // Basic exact selector case. -TEST_P(TextFragmentSelectorGeneratorTest, EmptySelection) { +TEST_F(TextFragmentSelectorGeneratorTest, EmptySelection) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -189,7 +130,7 @@ } // Basic exact selector case. -TEST_P(TextFragmentSelectorGeneratorTest, ExactTextSelector) { +TEST_F(TextFragmentSelectorGeneratorTest, ExactTextSelector) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -209,7 +150,7 @@ } // Exact selector test where selection contains nested <i> node. -TEST_P(TextFragmentSelectorGeneratorTest, ExactTextWithNestedTextNodes) { +TEST_F(TextFragmentSelectorGeneratorTest, ExactTextWithNestedTextNodes) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -230,7 +171,7 @@ } // Exact selector test where selection contains multiple spaces. -TEST_P(TextFragmentSelectorGeneratorTest, ExactTextWithExtraSpace) { +TEST_F(TextFragmentSelectorGeneratorTest, ExactTextWithExtraSpace) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -251,7 +192,7 @@ // Exact selector where selection is too short, in which case context is // required. -TEST_P(TextFragmentSelectorGeneratorTest, +TEST_F(TextFragmentSelectorGeneratorTest, ExactTextSelector_TooShortNeedsContext) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); @@ -273,7 +214,7 @@ // Exact selector with context test. Case when only one word for prefix and // suffix is enough to disambiguate the selection. -TEST_P(TextFragmentSelectorGeneratorTest, +TEST_F(TextFragmentSelectorGeneratorTest, ExactTextSelector_WithOneWordContext) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); @@ -295,7 +236,7 @@ // Exact selector with context test. Case when multiple words for prefix and // suffix is necessary to disambiguate the selection. -TEST_P(TextFragmentSelectorGeneratorTest, +TEST_F(TextFragmentSelectorGeneratorTest, ExactTextSelector_MultipleWordContext) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); @@ -319,7 +260,7 @@ // Exact selector with context test. Case when multiple words for prefix and // suffix is necessary to disambiguate the selection and prefix and suffix // contain extra space. -TEST_P(TextFragmentSelectorGeneratorTest, +TEST_F(TextFragmentSelectorGeneratorTest, ExactTextSelector_MultipleWordContext_ExtraSpace) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); @@ -343,7 +284,7 @@ // Exact selector with context test. Case when available prefix for all the // occurrences of selected text is the same. In this case suffix should be // extended until unique selector is found. -TEST_P(TextFragmentSelectorGeneratorTest, ExactTextSelector_SamePrefix) { +TEST_F(TextFragmentSelectorGeneratorTest, ExactTextSelector_SamePrefix) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -366,7 +307,7 @@ // Exact selector with context test. Case when available suffix for all the // occurrences of selected text is the same. In this case prefix should be // extended until unique selector is found. -TEST_P(TextFragmentSelectorGeneratorTest, ExactTextSelector_SameSuffix) { +TEST_F(TextFragmentSelectorGeneratorTest, ExactTextSelector_SameSuffix) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -389,7 +330,7 @@ // Exact selector with context test. Case when available prefix and suffix for // all the occurrences of selected text are the same. In this case generation // should be unsuccessful. -TEST_P(TextFragmentSelectorGeneratorTest, ExactTextSelector_SamePrefixSuffix) { +TEST_F(TextFragmentSelectorGeneratorTest, ExactTextSelector_SamePrefixSuffix) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -411,7 +352,7 @@ // Exact selector with context test. Case when available prefix and suffix for // all the occurrences of selected text are the same for the first 10 words. In // this case generation should be unsuccessful. -TEST_P(TextFragmentSelectorGeneratorTest, +TEST_F(TextFragmentSelectorGeneratorTest, ExactTextSelector_SimilarLongPreffixSuffix) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); @@ -434,7 +375,7 @@ } // Exact selector with context test. Case when no prefix is available. -TEST_P(TextFragmentSelectorGeneratorTest, ExactTextSelector_NoPrefix) { +TEST_F(TextFragmentSelectorGeneratorTest, ExactTextSelector_NoPrefix) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -453,7 +394,7 @@ } // Exact selector with context test. Case when no suffix is available. -TEST_P(TextFragmentSelectorGeneratorTest, ExactTextSelector_NoSuffix) { +TEST_F(TextFragmentSelectorGeneratorTest, ExactTextSelector_NoSuffix) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -475,7 +416,7 @@ // Exact selector with context test. Case when available prefix is the // preceding block. -TEST_P(TextFragmentSelectorGeneratorTest, ExactTextSelector_PrevNodePrefix) { +TEST_F(TextFragmentSelectorGeneratorTest, ExactTextSelector_PrevNodePrefix) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -496,7 +437,7 @@ // Exact selector with context test. Case when available prefix is the // preceding block, which is a text node. -TEST_P(TextFragmentSelectorGeneratorTest, +TEST_F(TextFragmentSelectorGeneratorTest, ExactTextSelector_PrevTextNodePrefix) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); @@ -519,7 +460,7 @@ // Exact selector with context test. Case when available suffix is the next // block. -TEST_P(TextFragmentSelectorGeneratorTest, ExactTextSelector_NextNodeSuffix) { +TEST_F(TextFragmentSelectorGeneratorTest, ExactTextSelector_NextNodeSuffix) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -541,7 +482,7 @@ // Exact selector with context test. Case when available suffix is the next // block, which is a text node. -TEST_P(TextFragmentSelectorGeneratorTest, +TEST_F(TextFragmentSelectorGeneratorTest, ExactTextSelector_NexttextNodeSuffix) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); @@ -562,7 +503,7 @@ "First%20paragraph%20with-,not%20unique%20snippet,-text"); } -TEST_P(TextFragmentSelectorGeneratorTest, RangeSelector) { +TEST_F(TextFragmentSelectorGeneratorTest, RangeSelector) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -584,7 +525,7 @@ // It should be more than 300 characters selected from the same node so that // ranges are used. -TEST_P(TextFragmentSelectorGeneratorTest, RangeSelector_SameNode) { +TEST_F(TextFragmentSelectorGeneratorTest, RangeSelector_SameNode) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -613,7 +554,7 @@ // It should be more than 300 characters selected from the same node so that // ranges are used. -TEST_P(TextFragmentSelectorGeneratorTest, +TEST_F(TextFragmentSelectorGeneratorTest, RangeSelector_SameNode_MultipleSelections) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); @@ -663,7 +604,7 @@ // When using all the selected text for the range is not enough for unique // match, context should be added. -TEST_P(TextFragmentSelectorGeneratorTest, RangeSelector_RangeNotUnique) { +TEST_F(TextFragmentSelectorGeneratorTest, RangeSelector_RangeNotUnique) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -685,7 +626,7 @@ // When using all the selected text for the range is not enough for unique // match, context should be added, but only prefxi and no suffix is available. -TEST_P(TextFragmentSelectorGeneratorTest, +TEST_F(TextFragmentSelectorGeneratorTest, RangeSelector_RangeNotUnique_NoSuffix) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); @@ -708,7 +649,7 @@ // When no range end is available it should return empty selector. // There is no range end available because there is no word break in the second // half of the selection. -TEST_P(TextFragmentSelectorGeneratorTest, RangeSelector_NoRangeEnd) { +TEST_F(TextFragmentSelectorGeneratorTest, RangeSelector_NoRangeEnd) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -734,7 +675,7 @@ } // Selection should be autocompleted to contain full words. -TEST_P(TextFragmentSelectorGeneratorTest, WordLimit) { +TEST_F(TextFragmentSelectorGeneratorTest, WordLimit) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -754,7 +695,7 @@ // Selection should be autocompleted to contain full words. The autocompletion // should work with extra spaces. -TEST_P(TextFragmentSelectorGeneratorTest, WordLimit_ExtraSpaces) { +TEST_F(TextFragmentSelectorGeneratorTest, WordLimit_ExtraSpaces) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -776,7 +717,7 @@ // When selection starts at the end of a word, selection shouldn't be // autocompleted to contain extra words. -TEST_P(TextFragmentSelectorGeneratorTest, +TEST_F(TextFragmentSelectorGeneratorTest, WordLimit_SelectionStartsAndEndsAtWordLimit) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); @@ -796,7 +737,7 @@ } // Check the case when selections starts with an non text node. -TEST_P(TextFragmentSelectorGeneratorTest, StartsWithImage) { +TEST_F(TextFragmentSelectorGeneratorTest, StartsWithImage) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -815,7 +756,7 @@ } // Check the case when selections starts with an non text node. -TEST_P(TextFragmentSelectorGeneratorTest, StartsWithBlockWithImage) { +TEST_F(TextFragmentSelectorGeneratorTest, StartsWithBlockWithImage) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -837,7 +778,7 @@ // Check the case when selections starts with a node nested in "inline-block" // node. crbug.com/1151474 -TEST_P(TextFragmentSelectorGeneratorTest, StartsWithInlineBlockChild) { +TEST_F(TextFragmentSelectorGeneratorTest, StartsWithInlineBlockChild) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -873,7 +814,7 @@ } // Check the case when selections ends with an non text node. -TEST_P(TextFragmentSelectorGeneratorTest, EndswithImage) { +TEST_F(TextFragmentSelectorGeneratorTest, EndswithImage) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -893,7 +834,7 @@ } // Check the case when selections starts at the end of the previous block. -TEST_P(TextFragmentSelectorGeneratorTest, StartIsEndofPrevBlock) { +TEST_F(TextFragmentSelectorGeneratorTest, StartIsEndofPrevBlock) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -911,7 +852,7 @@ } // Check the case when selections starts at the end of the previous block. -TEST_P(TextFragmentSelectorGeneratorTest, EndIsStartofNextBlock) { +TEST_F(TextFragmentSelectorGeneratorTest, EndIsStartofNextBlock) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -941,7 +882,7 @@ // want to ensure it correctly traverses the tree back to the previous text node // and not to the <div>(sibling of second <p>). // See crbug.com/1154308 for more context. -TEST_P(TextFragmentSelectorGeneratorTest, PrevNodeIsSiblingsChild) { +TEST_F(TextFragmentSelectorGeneratorTest, PrevNodeIsSiblingsChild) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); @@ -975,7 +916,7 @@ // want to ensure it correctly traverses the tree back to the previous text by // correctly skipping the invisible div but not skipping the second <p>. // See crbug.com/1154308 for more context. -TEST_P(TextFragmentSelectorGeneratorTest, PrevPrevNodeIsSiblingsChild) { +TEST_F(TextFragmentSelectorGeneratorTest, PrevPrevNodeIsSiblingsChild) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); // HTML is intentionally not formatted. Adding new lines and indentation @@ -996,7 +937,7 @@ // Checks that for short selection that have nested block element range selector // is used. -TEST_P(TextFragmentSelectorGeneratorTest, RangeSelector_SameNode_Interrupted) { +TEST_F(TextFragmentSelectorGeneratorTest, RangeSelector_SameNode_Interrupted) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -1013,7 +954,7 @@ } // Check min number of words is used for context if possible. -TEST_P(TextFragmentSelectorGeneratorTest, MultiwordContext) { +TEST_F(TextFragmentSelectorGeneratorTest, MultiwordContext) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -1033,7 +974,7 @@ } // Check min number of words is used for range if possible. -TEST_P(TextFragmentSelectorGeneratorTest, MultiWordRangeSelector) { +TEST_F(TextFragmentSelectorGeneratorTest, MultiWordRangeSelector) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -1054,7 +995,7 @@ } // Checks the case when selection end position is a non text node. -TEST_P(TextFragmentSelectorGeneratorTest, SelectionEndsWithNonText) { +TEST_F(TextFragmentSelectorGeneratorTest, SelectionEndsWithNonText) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -1076,7 +1017,7 @@ // Checks the case when selection end position is a non text node which doesn't // have text child node. -TEST_P(TextFragmentSelectorGeneratorTest, +TEST_F(TextFragmentSelectorGeneratorTest, SelectionEndsWithNonTextWithNoTextChild) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); @@ -1099,7 +1040,7 @@ // Checks the case when selection end position is a non text node which doesn't // have text child node. -TEST_P(TextFragmentSelectorGeneratorTest, SelectionEndsWithImageDiv) { +TEST_F(TextFragmentSelectorGeneratorTest, SelectionEndsWithImageDiv) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -1121,7 +1062,7 @@ // Checks the case when selected range contains a range with same start and end. // The problematic case should have both range end and suffix. -TEST_P(TextFragmentSelectorGeneratorTest, OverlappingRange) { +TEST_F(TextFragmentSelectorGeneratorTest, OverlappingRange) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -1139,7 +1080,7 @@ } // Checks selection across table cells. -TEST_P(TextFragmentSelectorGeneratorTest, Table) { +TEST_F(TextFragmentSelectorGeneratorTest, Table) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -1168,7 +1109,7 @@ } // Checks selection across an input element. -TEST_P(TextFragmentSelectorGeneratorTest, Input) { +TEST_F(TextFragmentSelectorGeneratorTest, Input) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -1187,7 +1128,7 @@ } // Checks selection across an input element. -TEST_P(TextFragmentSelectorGeneratorTest, Input_Submit) { +TEST_F(TextFragmentSelectorGeneratorTest, Input_Submit) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -1206,7 +1147,7 @@ } // Checks selection across an input element. -TEST_P(TextFragmentSelectorGeneratorTest, Input_Submit_prefix) { +TEST_F(TextFragmentSelectorGeneratorTest, Input_Submit_prefix) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -1225,7 +1166,7 @@ } // Basic test case for |GetNextTextBlock|. -TEST_P(TextFragmentSelectorGeneratorTest, GetPreviousTextBlock) { +TEST_F(TextFragmentSelectorGeneratorTest, GetPreviousTextBlock) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -1244,7 +1185,7 @@ } // Check the case when available prefix contains collapsible space. -TEST_P(TextFragmentSelectorGeneratorTest, GetPreviousTextBlock_ExtraSpace) { +TEST_F(TextFragmentSelectorGeneratorTest, GetPreviousTextBlock_ExtraSpace) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -1266,7 +1207,7 @@ // Check the case when available prefix complete text content of the previous // block. -TEST_P(TextFragmentSelectorGeneratorTest, GetPreviousTextBlock_PrevNode) { +TEST_F(TextFragmentSelectorGeneratorTest, GetPreviousTextBlock_PrevNode) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -1288,7 +1229,7 @@ // Check the case when there is a commented block between selection and the // available prefix. -TEST_P(TextFragmentSelectorGeneratorTest, +TEST_F(TextFragmentSelectorGeneratorTest, GetPreviousTextBlock_PrevNode_WithComment) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); @@ -1314,7 +1255,7 @@ // Check the case when available prefix is a text node outside of selection // block. -TEST_P(TextFragmentSelectorGeneratorTest, GetPreviousTextBlock_PrevTextNode) { +TEST_F(TextFragmentSelectorGeneratorTest, GetPreviousTextBlock_PrevTextNode) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -1335,7 +1276,7 @@ // Check the case when available prefix is a parent node text content outside of // selection block. -TEST_P(TextFragmentSelectorGeneratorTest, GetPreviousTextBlock_ParentNode) { +TEST_F(TextFragmentSelectorGeneratorTest, GetPreviousTextBlock_ParentNode) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -1355,7 +1296,7 @@ } // Check the case when available prefix contains non-block tag(e.g. <b>). -TEST_P(TextFragmentSelectorGeneratorTest, GetPreviousTextBlock_NestedTextNode) { +TEST_F(TextFragmentSelectorGeneratorTest, GetPreviousTextBlock_NestedTextNode) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -1375,7 +1316,7 @@ } // Check the case when available prefix is collected until nested block. -TEST_P(TextFragmentSelectorGeneratorTest, GetPreviousTextBlock_NestedBlock) { +TEST_F(TextFragmentSelectorGeneratorTest, GetPreviousTextBlock_NestedBlock) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -1395,7 +1336,7 @@ // Check the case when available prefix includes non-block element but stops at // nested block. -TEST_P(TextFragmentSelectorGeneratorTest, +TEST_F(TextFragmentSelectorGeneratorTest, GetPreviousTextBlock_NestedBlockInNestedText) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); @@ -1415,7 +1356,7 @@ } // Check the case when available prefix includes invisible block. -TEST_P(TextFragmentSelectorGeneratorTest, +TEST_F(TextFragmentSelectorGeneratorTest, GetPreviousTextBlock_NestedInvisibleBlock) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); @@ -1436,7 +1377,7 @@ // Check the case when previous node is used for available prefix when selection // is not at index=0 but there is only space before it. -TEST_P(TextFragmentSelectorGeneratorTest, +TEST_F(TextFragmentSelectorGeneratorTest, GetPreviousTextBlock_SpacesBeforeSelection) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); @@ -1461,7 +1402,7 @@ // Check the case when previous node is used for available prefix when selection // is not at index=0 but there is only invisible block. -TEST_P(TextFragmentSelectorGeneratorTest, +TEST_F(TextFragmentSelectorGeneratorTest, GetPreviousTextBlock_InvisibleBeforeSelection) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); @@ -1491,7 +1432,7 @@ // Similar test for suffix. // Basic test case for |GetNextTextBlock|. -TEST_P(TextFragmentSelectorGeneratorTest, GetNextTextBlock) { +TEST_F(TextFragmentSelectorGeneratorTest, GetNextTextBlock) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -1510,7 +1451,7 @@ } // Check the case when available suffix contains collapsible space. -TEST_P(TextFragmentSelectorGeneratorTest, GetNextTextBlock_ExtraSpace) { +TEST_F(TextFragmentSelectorGeneratorTest, GetNextTextBlock_ExtraSpace) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -1533,7 +1474,7 @@ // Check the case when available suffix is complete text content of the next // block. -TEST_P(TextFragmentSelectorGeneratorTest, GetNextTextBlock_NextNode) { +TEST_F(TextFragmentSelectorGeneratorTest, GetNextTextBlock_NextNode) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -1554,7 +1495,7 @@ // Check the case when there is a commented block between selection and the // available suffix. -TEST_P(TextFragmentSelectorGeneratorTest, +TEST_F(TextFragmentSelectorGeneratorTest, GetNextTextBlock_NextNode_WithComment) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); @@ -1579,7 +1520,7 @@ // Check the case when available suffix is a text node outside of selection // block. -TEST_P(TextFragmentSelectorGeneratorTest, GetNextTextBlock_NextTextNode) { +TEST_F(TextFragmentSelectorGeneratorTest, GetNextTextBlock_NextTextNode) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -1600,7 +1541,7 @@ // Check the case when available suffix is a parent node text content outside of // selection block. -TEST_P(TextFragmentSelectorGeneratorTest, GetNextTextBlock_ParentNode) { +TEST_F(TextFragmentSelectorGeneratorTest, GetNextTextBlock_ParentNode) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -1619,7 +1560,7 @@ } // Check the case when available suffix contains non-block tag(e.g. <b>). -TEST_P(TextFragmentSelectorGeneratorTest, GetNextTextBlock_NestedTextNode) { +TEST_F(TextFragmentSelectorGeneratorTest, GetNextTextBlock_NestedTextNode) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -1638,7 +1579,7 @@ } // Check the case when available suffix is collected until nested block. -TEST_P(TextFragmentSelectorGeneratorTest, GetNextTextBlock_NestedBlock) { +TEST_F(TextFragmentSelectorGeneratorTest, GetNextTextBlock_NestedBlock) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); request.Complete(R"HTML( @@ -1658,7 +1599,7 @@ // Check the case when available suffix includes non-block element but stops at // nested block. -TEST_P(TextFragmentSelectorGeneratorTest, +TEST_F(TextFragmentSelectorGeneratorTest, GetNextTextBlock_NestedBlockInNestedText) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); @@ -1678,7 +1619,7 @@ } // Check the case when available suffix includes invisible block. -TEST_P(TextFragmentSelectorGeneratorTest, +TEST_F(TextFragmentSelectorGeneratorTest, GetNextTextBlock_NestedInvisibleBlock) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); @@ -1699,7 +1640,7 @@ // Check the case when next node is used for available suffix when selection is // not at last index but there is only space after it. -TEST_P(TextFragmentSelectorGeneratorTest, +TEST_F(TextFragmentSelectorGeneratorTest, GetNextTextBlock_SpacesAfterSelection) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); @@ -1725,7 +1666,7 @@ // Check the case when next node is used for available suffix when selection is // not at last index but there is only invisible block after it. -TEST_P(TextFragmentSelectorGeneratorTest, +TEST_F(TextFragmentSelectorGeneratorTest, GetNextTextBlock_InvisibleAfterSelection) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); @@ -1755,7 +1696,7 @@ // Check the case when previous node is used for available prefix when selection // is not at last index but there is only invisible block. Invisible block // contains another block which also should be invisible. -TEST_P(TextFragmentSelectorGeneratorTest, +TEST_F(TextFragmentSelectorGeneratorTest, GetNextTextBlock_InvisibleAfterSelection_WithNestedInvisible) { SimRequest request("https://example.com/test.html", "text/html"); LoadURL("https://example.com/test.html"); @@ -1792,50 +1733,4 @@ ->GetNextTextBlockForTesting(end)); } -TEST_P(TextFragmentSelectorGeneratorTest, CheckMetrics_Success) { - base::test::ScopedFeatureList feature_list; - // Basic exact selector case. - SimRequest request("https://example.com/test.html", "text/html"); - LoadURL("https://example.com/test.html"); - request.Complete(R"HTML( - <!DOCTYPE html> - <div>Test page</div> - <p id='first'>First paragraph text that is longer than 20 chars</p> - <p id='second'>Second paragraph text</p> - )HTML"); - Node* first_paragraph = GetDocument().getElementById("first")->firstChild(); - const auto& selected_start = Position(first_paragraph, 0); - const auto& selected_end = Position(first_paragraph, 28); - ASSERT_EQ("First paragraph text that is", - PlainText(EphemeralRange(selected_start, selected_end))); - - VerifySelector(selected_start, selected_end, - "First%20paragraph%20text%20that%20is"); - VerifyPreemptiveGenerationMetrics(true); -} - -TEST_P(TextFragmentSelectorGeneratorTest, CheckMetrics_Failure) { - SimRequest request("https://example.com/test.html", "text/html"); - LoadURL("https://example.com/test.html"); - request.Complete(R"HTML( - <!DOCTYPE html> - <div>Test page</div> - <p id='first'>First paragraph prefix one two three four five six seven - eight nine ten to not unique snippet of text followed by suffix</p> - <p id='second'>Second paragraph prefix one two three four five six seven - eight nine ten to not unique snippet of text followed by suffix</p> - )HTML"); - Node* first_paragraph = GetDocument().getElementById("first")->firstChild(); - const auto& selected_start = Position(first_paragraph, 80); - const auto& selected_end = Position(first_paragraph, 106); - ASSERT_EQ("not unique snippet of text", - PlainText(EphemeralRange(selected_start, selected_end))); - VerifySelectorFails(selected_start, selected_end, - LinkGenerationError::kContextLimitReached); - VerifyPreemptiveGenerationMetrics(false); -} - -INSTANTIATE_TEST_SUITE_P(All, - TextFragmentSelectorGeneratorTest, - ::testing::Bool()); } // namespace blink
diff --git a/third_party/blink/renderer/modules/webaudio/audio_basic_processor_handler_test.cc b/third_party/blink/renderer/modules/webaudio/audio_basic_processor_handler_test.cc index 11f5fe8..cd671a87 100644 --- a/third_party/blink/renderer/modules/webaudio/audio_basic_processor_handler_test.cc +++ b/third_party/blink/renderer/modules/webaudio/audio_basic_processor_handler_test.cc
@@ -12,9 +12,12 @@ namespace blink { +// Rendering size for these tests. This is the WebAudio default rendering size. +const unsigned kRenderQuantumFrames = 128; + class MockAudioProcessor final : public AudioProcessor { public: - MockAudioProcessor() : AudioProcessor(48000, 2) {} + MockAudioProcessor() : AudioProcessor(48000, 2, kRenderQuantumFrames) {} void Initialize() override { initialized_ = true; } void Uninitialize() override { initialized_ = false; } void Process(const AudioBus*, AudioBus*, uint32_t) override {}
diff --git a/third_party/blink/renderer/modules/webaudio/biquad_dsp_kernel.cc b/third_party/blink/renderer/modules/webaudio/biquad_dsp_kernel.cc index 7353548..02349a85 100644 --- a/third_party/blink/renderer/modules/webaudio/biquad_dsp_kernel.cc +++ b/third_party/blink/renderer/modules/webaudio/biquad_dsp_kernel.cc
@@ -48,13 +48,13 @@ void BiquadDSPKernel::UpdateCoefficientsIfNecessary(int frames_to_process) { if (GetBiquadProcessor()->FilterCoefficientsDirty()) { - float cutoff_frequency[audio_utilities::kRenderQuantumFrames]; - float q[audio_utilities::kRenderQuantumFrames]; - float gain[audio_utilities::kRenderQuantumFrames]; - float detune[audio_utilities::kRenderQuantumFrames]; // in Cents + float cutoff_frequency[RenderQuantumFrames()]; + float q[RenderQuantumFrames()]; + float gain[RenderQuantumFrames()]; + float detune[RenderQuantumFrames()]; // in Cents SECURITY_CHECK(static_cast<unsigned>(frames_to_process) <= - audio_utilities::kRenderQuantumFrames); + RenderQuantumFrames()); if (GetBiquadProcessor()->HasSampleAccurateValues() && GetBiquadProcessor()->IsAudioRate()) {
diff --git a/third_party/blink/renderer/modules/webaudio/biquad_filter_node.cc b/third_party/blink/renderer/modules/webaudio/biquad_filter_node.cc index 0c6e662..89e5060 100644 --- a/third_party/blink/renderer/modules/webaudio/biquad_filter_node.cc +++ b/third_party/blink/renderer/modules/webaudio/biquad_filter_node.cc
@@ -46,15 +46,18 @@ AudioParamHandler& q, AudioParamHandler& gain, AudioParamHandler& detune) - : AudioBasicProcessorHandler(kNodeTypeBiquadFilter, - node, - sample_rate, - std::make_unique<BiquadProcessor>(sample_rate, - 1, - frequency, - q, - gain, - detune)) { + : AudioBasicProcessorHandler( + kNodeTypeBiquadFilter, + node, + sample_rate, + std::make_unique<BiquadProcessor>( + sample_rate, + 1, + node.context()->GetDeferredTaskHandler().RenderQuantumFrames(), + frequency, + q, + gain, + detune)) { DCHECK(Context()); DCHECK(Context()->GetExecutionContext());
diff --git a/third_party/blink/renderer/modules/webaudio/biquad_processor.cc b/third_party/blink/renderer/modules/webaudio/biquad_processor.cc index c9e1417..bf86e53 100644 --- a/third_party/blink/renderer/modules/webaudio/biquad_processor.cc +++ b/third_party/blink/renderer/modules/webaudio/biquad_processor.cc
@@ -32,11 +32,14 @@ BiquadProcessor::BiquadProcessor(float sample_rate, uint32_t number_of_channels, + unsigned render_quantum_frames, AudioParamHandler& frequency, AudioParamHandler& q, AudioParamHandler& gain, AudioParamHandler& detune) - : AudioDSPKernelProcessor(sample_rate, number_of_channels), + : AudioDSPKernelProcessor(sample_rate, + number_of_channels, + render_quantum_frames), type_(FilterType::kLowPass), parameter1_(&frequency), parameter2_(&q), @@ -135,9 +138,9 @@ } void BiquadProcessor::ProcessOnlyAudioParams(uint32_t frames_to_process) { - DCHECK_LE(frames_to_process, audio_utilities::kRenderQuantumFrames); + DCHECK_LE(frames_to_process, RenderQuantumFrames()); - float values[audio_utilities::kRenderQuantumFrames]; + float values[RenderQuantumFrames()]; parameter1_->CalculateSampleAccurateValues(values, frames_to_process); parameter2_->CalculateSampleAccurateValues(values, frames_to_process);
diff --git a/third_party/blink/renderer/modules/webaudio/biquad_processor.h b/third_party/blink/renderer/modules/webaudio/biquad_processor.h index 1552b718..f3efd896 100644 --- a/third_party/blink/renderer/modules/webaudio/biquad_processor.h +++ b/third_party/blink/renderer/modules/webaudio/biquad_processor.h
@@ -57,6 +57,7 @@ BiquadProcessor(float sample_rate, uint32_t number_of_channels, + unsigned render_quantum_frames, AudioParamHandler& frequency, AudioParamHandler& q, AudioParamHandler& gain,
diff --git a/third_party/blink/renderer/modules/webaudio/delay_dsp_kernel.cc b/third_party/blink/renderer/modules/webaudio/delay_dsp_kernel.cc index 808b9e8..c280c59f 100644 --- a/third_party/blink/renderer/modules/webaudio/delay_dsp_kernel.cc +++ b/third_party/blink/renderer/modules/webaudio/delay_dsp_kernel.cc
@@ -31,7 +31,7 @@ namespace blink { DelayDSPKernel::DelayDSPKernel(DelayProcessor* processor) - : AudioDelayDSPKernel(processor, audio_utilities::kRenderQuantumFrames) { + : AudioDelayDSPKernel(processor, processor->RenderQuantumFrames()) { DCHECK(processor); DCHECK_GT(processor->SampleRate(), 0); @@ -63,9 +63,9 @@ } void DelayDSPKernel::ProcessOnlyAudioParams(uint32_t frames_to_process) { - DCHECK_LE(frames_to_process, audio_utilities::kRenderQuantumFrames); + DCHECK_LE(frames_to_process, RenderQuantumFrames()); - float values[audio_utilities::kRenderQuantumFrames]; + float values[RenderQuantumFrames()]; GetDelayProcessor()->DelayTime().CalculateSampleAccurateValues( values, frames_to_process);
diff --git a/third_party/blink/renderer/modules/webaudio/delay_node.cc b/third_party/blink/renderer/modules/webaudio/delay_node.cc index cbdc36a..3e62c31 100644 --- a/third_party/blink/renderer/modules/webaudio/delay_node.cc +++ b/third_party/blink/renderer/modules/webaudio/delay_node.cc
@@ -46,10 +46,12 @@ kNodeTypeDelay, node, sample_rate, - std::make_unique<DelayProcessor>(sample_rate, - 1, - delay_time, - max_delay_time)) { + std::make_unique<DelayProcessor>( + sample_rate, + 1, + node.context()->GetDeferredTaskHandler().RenderQuantumFrames(), + delay_time, + max_delay_time)) { // Initialize the handler so that AudioParams can be processed. Initialize(); }
diff --git a/third_party/blink/renderer/modules/webaudio/delay_processor.cc b/third_party/blink/renderer/modules/webaudio/delay_processor.cc index b1c3580a..addcccc 100644 --- a/third_party/blink/renderer/modules/webaudio/delay_processor.cc +++ b/third_party/blink/renderer/modules/webaudio/delay_processor.cc
@@ -32,9 +32,12 @@ DelayProcessor::DelayProcessor(float sample_rate, unsigned number_of_channels, + unsigned render_quantum_frames, AudioParamHandler& delay_time, double max_delay_time) - : AudioDSPKernelProcessor(sample_rate, number_of_channels), + : AudioDSPKernelProcessor(sample_rate, + number_of_channels, + render_quantum_frames), delay_time_(&delay_time), max_delay_time_(max_delay_time) {} @@ -48,9 +51,9 @@ } void DelayProcessor::ProcessOnlyAudioParams(uint32_t frames_to_process) { - DCHECK_LE(frames_to_process, audio_utilities::kRenderQuantumFrames); + DCHECK_LE(frames_to_process, RenderQuantumFrames()); - float values[audio_utilities::kRenderQuantumFrames]; + float values[RenderQuantumFrames()]; delay_time_->CalculateSampleAccurateValues(values, frames_to_process); }
diff --git a/third_party/blink/renderer/modules/webaudio/delay_processor.h b/third_party/blink/renderer/modules/webaudio/delay_processor.h index bb19b9f..59f58ae 100644 --- a/third_party/blink/renderer/modules/webaudio/delay_processor.h +++ b/third_party/blink/renderer/modules/webaudio/delay_processor.h
@@ -39,6 +39,7 @@ public: DelayProcessor(float sample_rate, unsigned number_of_channels, + unsigned render_quantum_frames, AudioParamHandler& delay_time, double max_delay_time); ~DelayProcessor() override;
diff --git a/third_party/blink/renderer/modules/webaudio/iir_filter_node.cc b/third_party/blink/renderer/modules/webaudio/iir_filter_node.cc index 79baa0b..0b61c25 100644 --- a/third_party/blink/renderer/modules/webaudio/iir_filter_node.cc +++ b/third_party/blink/renderer/modules/webaudio/iir_filter_node.cc
@@ -28,11 +28,13 @@ kNodeTypeIIRFilter, node, sample_rate, - std::make_unique<IIRProcessor>(sample_rate, - 1, - feedforward_coef, - feedback_coef, - is_filter_stable)) { + std::make_unique<IIRProcessor>( + sample_rate, + 1, + node.context()->GetDeferredTaskHandler().RenderQuantumFrames(), + feedforward_coef, + feedback_coef, + is_filter_stable)) { DCHECK(Context()); DCHECK(Context()->GetExecutionContext());
diff --git a/third_party/blink/renderer/modules/webaudio/iir_processor.cc b/third_party/blink/renderer/modules/webaudio/iir_processor.cc index 518b1ea..a60bea8 100644 --- a/third_party/blink/renderer/modules/webaudio/iir_processor.cc +++ b/third_party/blink/renderer/modules/webaudio/iir_processor.cc
@@ -11,10 +11,13 @@ IIRProcessor::IIRProcessor(float sample_rate, uint32_t number_of_channels, + unsigned render_quantum_frames, const Vector<double>& feedforward_coef, const Vector<double>& feedback_coef, bool is_filter_stable) - : AudioDSPKernelProcessor(sample_rate, number_of_channels), + : AudioDSPKernelProcessor(sample_rate, + number_of_channels, + render_quantum_frames), is_filter_stable_(is_filter_stable) { unsigned feedback_length = feedback_coef.size(); unsigned feedforward_length = feedforward_coef.size();
diff --git a/third_party/blink/renderer/modules/webaudio/iir_processor.h b/third_party/blink/renderer/modules/webaudio/iir_processor.h index a2160eeb..3f27c04 100644 --- a/third_party/blink/renderer/modules/webaudio/iir_processor.h +++ b/third_party/blink/renderer/modules/webaudio/iir_processor.h
@@ -19,6 +19,7 @@ public: IIRProcessor(float sample_rate, uint32_t number_of_channels, + unsigned render_quantum_frames, const Vector<double>& feedforward_coef, const Vector<double>& feedback_coef, bool is_filter_stable);
diff --git a/third_party/blink/renderer/modules/webaudio/script_processor_node.cc b/third_party/blink/renderer/modules/webaudio/script_processor_node.cc index 5dd0c899..6414717 100644 --- a/third_party/blink/renderer/modules/webaudio/script_processor_node.cc +++ b/third_party/blink/renderer/modules/webaudio/script_processor_node.cc
@@ -80,11 +80,12 @@ buffer_read_write_index_(0), number_of_input_channels_(number_of_input_channels), number_of_output_channels_(number_of_output_channels), - internal_input_bus_( - AudioBus::Create(number_of_input_channels, - audio_utilities::kRenderQuantumFrames, - false)) { - DCHECK_GE(buffer_size_, audio_utilities::kRenderQuantumFrames); + internal_input_bus_(AudioBus::Create( + number_of_input_channels, + node.context()->GetDeferredTaskHandler().RenderQuantumFrames(), + false)) { + DCHECK_GE(buffer_size_, + node.context()->GetDeferredTaskHandler().RenderQuantumFrames()); DCHECK_LE(number_of_input_channels, BaseAudioContext::MaxNumberOfChannels()); AddInput(); @@ -348,8 +349,8 @@ : AudioNode(context) { // Regardless of the allowed buffer sizes, we still need to process at the // granularity of the AudioNode. - if (buffer_size < audio_utilities::kRenderQuantumFrames) - buffer_size = audio_utilities::kRenderQuantumFrames; + if (buffer_size < context.GetDeferredTaskHandler().RenderQuantumFrames()) + buffer_size = context.GetDeferredTaskHandler().RenderQuantumFrames(); // Create double buffers on both the input and output sides. // These AudioBuffers will be directly accessed in the main thread by
diff --git a/third_party/blink/renderer/modules/webaudio/wave_shaper_dsp_kernel.cc b/third_party/blink/renderer/modules/webaudio/wave_shaper_dsp_kernel.cc index b7db5bb..e5a286a 100644 --- a/third_party/blink/renderer/modules/webaudio/wave_shaper_dsp_kernel.cc +++ b/third_party/blink/renderer/modules/webaudio/wave_shaper_dsp_kernel.cc
@@ -39,29 +39,24 @@ : AudioDSPKernel(processor), tail_time_(0), // 4 times render size to handle 4x oversampling. - virtual_index_(4 * audio_utilities::kRenderQuantumFrames), - index_(4 * audio_utilities::kRenderQuantumFrames), - v1_(4 * audio_utilities::kRenderQuantumFrames), - v2_(4 * audio_utilities::kRenderQuantumFrames), - f_(4 * audio_utilities::kRenderQuantumFrames) { + virtual_index_(4 * RenderQuantumFrames()), + index_(4 * RenderQuantumFrames()), + v1_(4 * RenderQuantumFrames()), + v2_(4 * RenderQuantumFrames()), + f_(4 * RenderQuantumFrames()) { if (processor->Oversample() != WaveShaperProcessor::kOverSampleNone) LazyInitializeOversampling(); } void WaveShaperDSPKernel::LazyInitializeOversampling() { if (!temp_buffer_) { - temp_buffer_ = std::make_unique<AudioFloatArray>( - audio_utilities::kRenderQuantumFrames * 2); - temp_buffer2_ = std::make_unique<AudioFloatArray>( - audio_utilities::kRenderQuantumFrames * 4); - up_sampler_ = - std::make_unique<UpSampler>(audio_utilities::kRenderQuantumFrames); - down_sampler_ = std::make_unique<DownSampler>( - audio_utilities::kRenderQuantumFrames * 2); - up_sampler2_ = - std::make_unique<UpSampler>(audio_utilities::kRenderQuantumFrames * 2); - down_sampler2_ = std::make_unique<DownSampler>( - audio_utilities::kRenderQuantumFrames * 4); + temp_buffer_ = std::make_unique<AudioFloatArray>(RenderQuantumFrames() * 2); + temp_buffer2_ = + std::make_unique<AudioFloatArray>(RenderQuantumFrames() * 4); + up_sampler_ = std::make_unique<UpSampler>(RenderQuantumFrames()); + down_sampler_ = std::make_unique<DownSampler>(RenderQuantumFrames() * 2); + up_sampler2_ = std::make_unique<UpSampler>(RenderQuantumFrames() * 2); + down_sampler2_ = std::make_unique<DownSampler>(RenderQuantumFrames() * 4); } } @@ -305,7 +300,7 @@ void WaveShaperDSPKernel::ProcessCurve2x(const float* source, float* destination, uint32_t frames_to_process) { - DCHECK_EQ(frames_to_process, audio_utilities::kRenderQuantumFrames); + DCHECK_EQ(frames_to_process, RenderQuantumFrames()); float* temp_p = temp_buffer_->Data(); @@ -320,7 +315,7 @@ void WaveShaperDSPKernel::ProcessCurve4x(const float* source, float* destination, uint32_t frames_to_process) { - DCHECK_EQ(frames_to_process, audio_utilities::kRenderQuantumFrames); + DCHECK_EQ(frames_to_process, RenderQuantumFrames()); float* temp_p = temp_buffer_->Data(); float* temp_p2 = temp_buffer2_->Data();
diff --git a/third_party/blink/renderer/modules/webaudio/wave_shaper_node.cc b/third_party/blink/renderer/modules/webaudio/wave_shaper_node.cc index 40bc3647..5828029 100644 --- a/third_party/blink/renderer/modules/webaudio/wave_shaper_node.cc +++ b/third_party/blink/renderer/modules/webaudio/wave_shaper_node.cc
@@ -39,7 +39,10 @@ kNodeTypeWaveShaper, node, sample_rate, - std::make_unique<WaveShaperProcessor>(sample_rate, 1)) { + std::make_unique<WaveShaperProcessor>( + sample_rate, + 1, + node.context()->GetDeferredTaskHandler().RenderQuantumFrames())) { Initialize(); }
diff --git a/third_party/blink/renderer/modules/webaudio/wave_shaper_processor.cc b/third_party/blink/renderer/modules/webaudio/wave_shaper_processor.cc index 76eefdfc..c2cd527 100644 --- a/third_party/blink/renderer/modules/webaudio/wave_shaper_processor.cc +++ b/third_party/blink/renderer/modules/webaudio/wave_shaper_processor.cc
@@ -30,8 +30,11 @@ namespace blink { WaveShaperProcessor::WaveShaperProcessor(float sample_rate, - unsigned number_of_channels) - : AudioDSPKernelProcessor(sample_rate, number_of_channels), + unsigned number_of_channels, + unsigned render_quantum_frames) + : AudioDSPKernelProcessor(sample_rate, + number_of_channels, + render_quantum_frames), oversample_(kOverSampleNone) {} WaveShaperProcessor::~WaveShaperProcessor() {
diff --git a/third_party/blink/renderer/modules/webaudio/wave_shaper_processor.h b/third_party/blink/renderer/modules/webaudio/wave_shaper_processor.h index 5e900ac..6a8b77d 100644 --- a/third_party/blink/renderer/modules/webaudio/wave_shaper_processor.h +++ b/third_party/blink/renderer/modules/webaudio/wave_shaper_processor.h
@@ -43,7 +43,9 @@ public: enum OverSampleType { kOverSampleNone, kOverSample2x, kOverSample4x }; - WaveShaperProcessor(float sample_rate, unsigned number_of_channels); + WaveShaperProcessor(float sample_rate, + unsigned number_of_channels, + unsigned render_quantum_frames); ~WaveShaperProcessor() override;
diff --git a/third_party/blink/renderer/platform/audio/audio_dsp_kernel.h b/third_party/blink/renderer/platform/audio/audio_dsp_kernel.h index 09f2443..e0e3da93 100644 --- a/third_party/blink/renderer/platform/audio/audio_dsp_kernel.h +++ b/third_party/blink/renderer/platform/audio/audio_dsp_kernel.h
@@ -45,10 +45,15 @@ public: AudioDSPKernel(AudioDSPKernelProcessor* kernel_processor) : kernel_processor_(kernel_processor), - sample_rate_(kernel_processor->SampleRate()) {} + sample_rate_(kernel_processor->SampleRate()), + render_quantum_frames_(kernel_processor->RenderQuantumFrames()) {} - AudioDSPKernel(float sample_rate) - : kernel_processor_(nullptr), sample_rate_(sample_rate) {} + // TODO(crbug.com/988121): Need to replace the explicit 128 below with + // something else to support settable render sizes. + explicit AudioDSPKernel(float sample_rate) + : kernel_processor_(nullptr), + sample_rate_(sample_rate), + render_quantum_frames_(128) {} virtual ~AudioDSPKernel(); @@ -63,6 +68,7 @@ virtual void Reset() = 0; float SampleRate() const { return sample_rate_; } + unsigned RenderQuantumFrames() const { return render_quantum_frames_; } double Nyquist() const { return 0.5 * SampleRate(); } AudioDSPKernelProcessor* Processor() { return kernel_processor_; } @@ -77,6 +83,7 @@ // guaranteed to be kept alive while the AudioDSPKernel object is alive. AudioDSPKernelProcessor* kernel_processor_; float sample_rate_; + unsigned render_quantum_frames_; }; } // namespace blink
diff --git a/third_party/blink/renderer/platform/audio/audio_dsp_kernel_processor.cc b/third_party/blink/renderer/platform/audio/audio_dsp_kernel_processor.cc index 16e5c6db..824c2a2 100644 --- a/third_party/blink/renderer/platform/audio/audio_dsp_kernel_processor.cc +++ b/third_party/blink/renderer/platform/audio/audio_dsp_kernel_processor.cc
@@ -37,8 +37,10 @@ // setNumberOfChannels() may later be called if the object is not yet in an // "initialized" state. AudioDSPKernelProcessor::AudioDSPKernelProcessor(float sample_rate, - unsigned number_of_channels) - : AudioProcessor(sample_rate, number_of_channels), has_just_reset_(true) {} + unsigned number_of_channels, + unsigned render_quantum_frames) + : AudioProcessor(sample_rate, number_of_channels, render_quantum_frames), + has_just_reset_(true) {} void AudioDSPKernelProcessor::Initialize() { if (IsInitialized())
diff --git a/third_party/blink/renderer/platform/audio/audio_dsp_kernel_processor.h b/third_party/blink/renderer/platform/audio/audio_dsp_kernel_processor.h index 50ac6c7f..83c76a4 100644 --- a/third_party/blink/renderer/platform/audio/audio_dsp_kernel_processor.h +++ b/third_party/blink/renderer/platform/audio/audio_dsp_kernel_processor.h
@@ -52,7 +52,9 @@ public: // numberOfChannels may be later changed if object is not yet in an // "initialized" state - AudioDSPKernelProcessor(float sample_rate, unsigned number_of_channels); + AudioDSPKernelProcessor(float sample_rate, + unsigned number_of_channels, + unsigned render_quantum_frames); // Subclasses create the appropriate type of processing kernel here. // We'll call this to create a kernel for each channel.
diff --git a/third_party/blink/renderer/platform/audio/audio_processor.h b/third_party/blink/renderer/platform/audio/audio_processor.h index 4633005a..e0ba2c3 100644 --- a/third_party/blink/renderer/platform/audio/audio_processor.h +++ b/third_party/blink/renderer/platform/audio/audio_processor.h
@@ -48,10 +48,13 @@ USING_FAST_MALLOC(AudioProcessor); public: - AudioProcessor(float sample_rate, unsigned number_of_channels) + AudioProcessor(float sample_rate, + unsigned number_of_channels, + unsigned render_quantum_frames) : initialized_(false), number_of_channels_(number_of_channels), - sample_rate_(sample_rate) {} + sample_rate_(sample_rate), + render_quantum_frames_(render_quantum_frames) {} virtual ~AudioProcessor(); @@ -80,6 +83,8 @@ float SampleRate() const { return sample_rate_; } + unsigned RenderQuantumFrames() const { return render_quantum_frames_; } + virtual double TailTime() const = 0; virtual double LatencyTime() const = 0; virtual bool RequiresTailProcessing() const = 0; @@ -88,6 +93,7 @@ bool initialized_; unsigned number_of_channels_; float sample_rate_; + unsigned render_quantum_frames_; }; } // namespace blink
diff --git a/third_party/blink/renderer/platform/fonts/win/font_cache_skia_win.cc b/third_party/blink/renderer/platform/fonts/win/font_cache_skia_win.cc index d342281..316f90f 100644 --- a/third_party/blink/renderer/platform/fonts/win/font_cache_skia_win.cc +++ b/third_party/blink/renderer/platform/fonts/win/font_cache_skia_win.cc
@@ -264,28 +264,28 @@ // large repertoire. Eventually, we need to scan all the fonts // on the system to have a Firefox-like coverage. // Make sure that all of them are lowercased. - const static wchar_t* const kCjkFonts[] = { - L"arial unicode ms", L"ms pgothic", L"simsun", L"gulim", L"pmingliu", - L"wenquanyi zen hei", // Partial CJK Ext. A coverage but more widely + const static UChar* const kCjkFonts[] = { + u"arial unicode ms", u"ms pgothic", u"simsun", u"gulim", u"pmingliu", + u"wenquanyi zen hei", // Partial CJK Ext. A coverage but more widely // known to Chinese users. - L"ar pl shanheisun uni", L"ar pl zenkai uni", - L"han nom a", // Complete CJK Ext. A coverage. - L"code2000" // Complete CJK Ext. A coverage. + u"ar pl shanheisun uni", u"ar pl zenkai uni", + u"han nom a", // Complete CJK Ext. A coverage. + u"code2000" // Complete CJK Ext. A coverage. // CJK Ext. B fonts are not listed here because it's of no use // with our current non-BMP character handling because we use // Uniscribe for it and that code path does not go through here. }; - const static wchar_t* const kCommonFonts[] = { - L"tahoma", L"arial unicode ms", L"lucida sans unicode", - L"microsoft sans serif", L"palatino linotype", + const static UChar* const kCommonFonts[] = { + u"tahoma", u"arial unicode ms", u"lucida sans unicode", + u"microsoft sans serif", u"palatino linotype", // Six fonts below (and code2000 at the end) are not from MS, but // once installed, cover a very wide range of characters. - L"dejavu serif", L"dejavu sasns", L"freeserif", L"freesans", L"gentium", - L"gentiumalt", L"ms pgothic", L"simsun", L"gulim", L"pmingliu", - L"code2000"}; + u"dejavu serif", u"dejavu sasns", u"freeserif", u"freesans", u"gentium", + u"gentiumalt", u"ms pgothic", u"simsun", u"gulim", u"pmingliu", + u"code2000"}; - const wchar_t* const* pan_uni_fonts = nullptr; + const UChar* const* pan_uni_fonts = nullptr; int num_fonts = 0; if (script == USCRIPT_HAN) { pan_uni_fonts = kCjkFonts; @@ -501,25 +501,25 @@ AtomicString& adjusted_name, FontSelectionValue& variant_weight) { struct FamilyWeightSuffix { - const wchar_t* suffix; + const UChar* suffix; size_t length; FontSelectionValue weight; }; // Mapping from suffix to weight from the DirectWrite documentation. // http://msdn.microsoft.com/en-us/library/windows/desktop/dd368082.aspx const static FamilyWeightSuffix kVariantForSuffix[] = { - {L" thin", 5, FontSelectionValue(100)}, - {L" extralight", 11, FontSelectionValue(200)}, - {L" ultralight", 11, FontSelectionValue(200)}, - {L" light", 6, FontSelectionValue(300)}, - {L" regular", 8, FontSelectionValue(400)}, - {L" medium", 7, FontSelectionValue(500)}, - {L" demibold", 9, FontSelectionValue(600)}, - {L" semibold", 9, FontSelectionValue(600)}, - {L" extrabold", 10, FontSelectionValue(800)}, - {L" ultrabold", 10, FontSelectionValue(800)}, - {L" black", 6, FontSelectionValue(900)}, - {L" heavy", 6, FontSelectionValue(900)}}; + {u" thin", 5, FontSelectionValue(100)}, + {u" extralight", 11, FontSelectionValue(200)}, + {u" ultralight", 11, FontSelectionValue(200)}, + {u" light", 6, FontSelectionValue(300)}, + {u" regular", 8, FontSelectionValue(400)}, + {u" medium", 7, FontSelectionValue(500)}, + {u" demibold", 9, FontSelectionValue(600)}, + {u" semibold", 9, FontSelectionValue(600)}, + {u" extrabold", 10, FontSelectionValue(800)}, + {u" ultrabold", 10, FontSelectionValue(800)}, + {u" black", 6, FontSelectionValue(900)}, + {u" heavy", 6, FontSelectionValue(900)}}; size_t num_variants = base::size(kVariantForSuffix); for (size_t i = 0; i < num_variants; i++) { const FamilyWeightSuffix& entry = kVariantForSuffix[i]; @@ -539,7 +539,7 @@ AtomicString& adjusted_name, FontSelectionValue& variant_stretch) { struct FamilyStretchSuffix { - const wchar_t* suffix; + const UChar* suffix; size_t length; FontSelectionValue stretch; }; @@ -548,15 +548,15 @@ // Also includes Narrow as a synonym for Condensed to to support Arial // Narrow and other fonts following the same naming scheme. const static FamilyStretchSuffix kVariantForSuffix[] = { - {L" ultracondensed", 15, UltraCondensedWidthValue()}, - {L" extracondensed", 15, ExtraCondensedWidthValue()}, - {L" condensed", 10, CondensedWidthValue()}, - {L" narrow", 7, CondensedWidthValue()}, - {L" semicondensed", 14, SemiCondensedWidthValue()}, - {L" semiexpanded", 13, SemiExpandedWidthValue()}, - {L" expanded", 9, ExpandedWidthValue()}, - {L" extraexpanded", 14, ExtraExpandedWidthValue()}, - {L" ultraexpanded", 14, UltraExpandedWidthValue()}}; + {u" ultracondensed", 15, UltraCondensedWidthValue()}, + {u" extracondensed", 15, ExtraCondensedWidthValue()}, + {u" condensed", 10, CondensedWidthValue()}, + {u" narrow", 7, CondensedWidthValue()}, + {u" semicondensed", 14, SemiCondensedWidthValue()}, + {u" semiexpanded", 13, SemiExpandedWidthValue()}, + {u" expanded", 9, ExpandedWidthValue()}, + {u" extraexpanded", 14, ExtraExpandedWidthValue()}, + {u" ultraexpanded", 14, UltraExpandedWidthValue()}}; size_t num_variants = base::size(kVariantForSuffix); for (size_t i = 0; i < num_variants; i++) { const FamilyStretchSuffix& entry = kVariantForSuffix[i];
diff --git a/third_party/blink/renderer/platform/fonts/win/font_fallback_win.cc b/third_party/blink/renderer/platform/fonts/win/font_fallback_win.cc index 6f90e69c..7eb9e4a5 100644 --- a/third_party/blink/renderer/platform/fonts/win/font_fallback_win.cc +++ b/third_party/blink/renderer/platform/fonts/win/font_fallback_win.cc
@@ -91,7 +91,8 @@ }; static const FontMap kFontMap[] = { - {USCRIPT_HEBREW, L"courier new"}, {USCRIPT_ARABIC, L"courier new"}, + {USCRIPT_HEBREW, u"courier new"}, + {USCRIPT_ARABIC, u"courier new"}, }; for (const auto& font_family : kFontMap) { @@ -117,112 +118,112 @@ // Based on the "Script and Font Support in Windows" MSDN documentation [1] // with overrides and additional fallbacks as needed. // 1: https://msdn.microsoft.com/en-us/goglobal/bb688099.aspx - static const UChar* const kArabicFonts[] = {L"Tahoma", L"Segoe UI", 0}; - static const UChar* const kArmenianFonts[] = {L"Segoe UI", L"Sylfaen", 0}; - static const UChar* const kBengaliFonts[] = {L"Nirmala UI", L"Vrinda", 0}; - static const UChar* const kBrahmiFonts[] = {L"Segoe UI Historic", 0}; - static const UChar* const kBrailleFonts[] = {L"Segoe UI Symbol", 0}; - static const UChar* const kBugineseFonts[] = {L"Leelawadee UI", 0}; - static const UChar* const kCanadianAaboriginalFonts[] = {L"Gadugi", - L"Euphemia", 0}; - static const UChar* const kCarianFonts[] = {L"Segoe UI Historic", 0}; - static const UChar* const kCherokeeFonts[] = {L"Gadugi", L"Plantagenet", 0}; - static const UChar* const kCopticFonts[] = {L"Segoe UI Symbol", 0}; - static const UChar* const kCuneiformFonts[] = {L"Segoe UI Historic", 0}; - static const UChar* const kCypriotFonts[] = {L"Segoe UI Historic", 0}; - static const UChar* const kCyrillicFonts[] = {L"Times New Roman", 0}; - static const UChar* const kDeseretFonts[] = {L"Segoe UI Symbol", 0}; - static const UChar* const kDevanagariFonts[] = {L"Nirmala UI", L"Mangal", 0}; - static const UChar* const kEgyptianHieroglyphsFonts[] = {L"Segoe UI Historic", + static const UChar* const kArabicFonts[] = {u"Tahoma", u"Segoe UI", 0}; + static const UChar* const kArmenianFonts[] = {u"Segoe UI", u"Sylfaen", 0}; + static const UChar* const kBengaliFonts[] = {u"Nirmala UI", u"Vrinda", 0}; + static const UChar* const kBrahmiFonts[] = {u"Segoe UI Historic", 0}; + static const UChar* const kBrailleFonts[] = {u"Segoe UI Symbol", 0}; + static const UChar* const kBugineseFonts[] = {u"Leelawadee UI", 0}; + static const UChar* const kCanadianAaboriginalFonts[] = {u"Gadugi", + u"Euphemia", 0}; + static const UChar* const kCarianFonts[] = {u"Segoe UI Historic", 0}; + static const UChar* const kCherokeeFonts[] = {u"Gadugi", u"Plantagenet", 0}; + static const UChar* const kCopticFonts[] = {u"Segoe UI Symbol", 0}; + static const UChar* const kCuneiformFonts[] = {u"Segoe UI Historic", 0}; + static const UChar* const kCypriotFonts[] = {u"Segoe UI Historic", 0}; + static const UChar* const kCyrillicFonts[] = {u"Times New Roman", 0}; + static const UChar* const kDeseretFonts[] = {u"Segoe UI Symbol", 0}; + static const UChar* const kDevanagariFonts[] = {u"Nirmala UI", u"Mangal", 0}; + static const UChar* const kEgyptianHieroglyphsFonts[] = {u"Segoe UI Historic", 0}; - static const UChar* const kEthiopicFonts[] = {L"Nyala", - L"Abyssinica SIL", - L"Ethiopia Jiret", - L"Visual Geez Unicode", - L"GF Zemen Unicode", - L"Ebrima", + static const UChar* const kEthiopicFonts[] = {u"Nyala", + u"Abyssinica SIL", + u"Ethiopia Jiret", + u"Visual Geez Unicode", + u"GF Zemen Unicode", + u"Ebrima", 0}; - static const UChar* const kGeorgianFonts[] = {L"Sylfaen", L"Segoe UI", 0}; - static const UChar* const kGlagoliticFonts[] = {L"Segoe UI Historic", - L"Segoe UI Symbol", 0}; - static const UChar* const kGothicFonts[] = {L"Segoe UI Historic", - L"Segoe UI Symbol", 0}; - static const UChar* const kGreekFonts[] = {L"Times New Roman", 0}; - static const UChar* const kGujaratiFonts[] = {L"Nirmala UI", L"Shruti", 0}; - static const UChar* const kGurmukhiFonts[] = {L"Nirmala UI", L"Raavi", 0}; - static const UChar* const kHangulFonts[] = {L"Malgun Gothic", L"Gulim", 0}; - static const UChar* const kHebrewFonts[] = {L"David", L"Segoe UI", 0}; - static const UChar* const kImperialAramaicFonts[] = {L"Segoe UI Historic", 0}; + static const UChar* const kGeorgianFonts[] = {u"Sylfaen", u"Segoe UI", 0}; + static const UChar* const kGlagoliticFonts[] = {u"Segoe UI Historic", + u"Segoe UI Symbol", 0}; + static const UChar* const kGothicFonts[] = {u"Segoe UI Historic", + u"Segoe UI Symbol", 0}; + static const UChar* const kGreekFonts[] = {u"Times New Roman", 0}; + static const UChar* const kGujaratiFonts[] = {u"Nirmala UI", u"Shruti", 0}; + static const UChar* const kGurmukhiFonts[] = {u"Nirmala UI", u"Raavi", 0}; + static const UChar* const kHangulFonts[] = {u"Malgun Gothic", u"Gulim", 0}; + static const UChar* const kHebrewFonts[] = {u"David", u"Segoe UI", 0}; + static const UChar* const kImperialAramaicFonts[] = {u"Segoe UI Historic", 0}; static const UChar* const kInscriptionalPahlaviFonts[] = { - L"Segoe UI Historic", 0}; + u"Segoe UI Historic", 0}; static const UChar* const kInscriptionalParthianFonts[] = { - L"Segoe UI Historic", 0}; - static const UChar* const kJavaneseFonts[] = {L"Javanese Text", 0}; - static const UChar* const kKannadaFonts[] = {L"Tunga", L"Nirmala UI", 0}; + u"Segoe UI Historic", 0}; + static const UChar* const kJavaneseFonts[] = {u"Javanese Text", 0}; + static const UChar* const kKannadaFonts[] = {u"Tunga", u"Nirmala UI", 0}; static const UChar* const kKatakanaOrHiraganaFonts[] = { - L"Meiryo", L"Yu Gothic", L"MS PGothic", L"Microsoft YaHei", 0}; - static const UChar* const kKharoshthiFonts[] = {L"Segoe UI Historic", 0}; + u"Meiryo", u"Yu Gothic", u"MS PGothic", u"Microsoft YaHei", 0}; + static const UChar* const kKharoshthiFonts[] = {u"Segoe UI Historic", 0}; // Try Khmer OS before Vista fonts as it goes along better with Latin // and looks better/larger for the same size. static const UChar* const kKhmerFonts[] = { - L"Leelawadee UI", L"Khmer UI", L"Khmer OS", L"MoolBoran", L"DaunPenh", 0}; - static const UChar* const kLaoFonts[] = {L"Leelawadee UI", - L"Lao UI", - L"DokChampa", - L"Saysettha OT", - L"Phetsarath OT", - L"Code2000", + u"Leelawadee UI", u"Khmer UI", u"Khmer OS", u"MoolBoran", u"DaunPenh", 0}; + static const UChar* const kLaoFonts[] = {u"Leelawadee UI", + u"Lao UI", + u"DokChampa", + u"Saysettha OT", + u"Phetsarath OT", + u"Code2000", 0}; - static const UChar* const kLatinFonts[] = {L"Times New Roman", 0}; - static const UChar* const kLisuFonts[] = {L"Segoe UI", 0}; - static const UChar* const kLycianFonts[] = {L"Segoe UI Historic", 0}; - static const UChar* const kLydianFonts[] = {L"Segoe UI Historic", 0}; - static const UChar* const kMalayalamFonts[] = {L"Nirmala UI", L"Kartika", 0}; - static const UChar* const kMeroiticCursiveFonts[] = {L"Segoe UI Historic", - L"Segoe UI Symbol", 0}; - static const UChar* const kMongolianFonts[] = {L"Mongolian Baiti", 0}; + static const UChar* const kLatinFonts[] = {u"Times New Roman", 0}; + static const UChar* const kLisuFonts[] = {u"Segoe UI", 0}; + static const UChar* const kLycianFonts[] = {u"Segoe UI Historic", 0}; + static const UChar* const kLydianFonts[] = {u"Segoe UI Historic", 0}; + static const UChar* const kMalayalamFonts[] = {u"Nirmala UI", u"Kartika", 0}; + static const UChar* const kMeroiticCursiveFonts[] = {u"Segoe UI Historic", + u"Segoe UI Symbol", 0}; + static const UChar* const kMongolianFonts[] = {u"Mongolian Baiti", 0}; static const UChar* const kMyanmarFonts[] = { - L"Myanmar Text", L"Padauk", L"Parabaik", L"Myanmar3", L"Code2000", 0}; - static const UChar* const kNewTaiLueFonts[] = {L"Microsoft New Tai Lue", 0}; - static const UChar* const kNkoFonts[] = {L"Ebrima", 0}; - static const UChar* const kOghamFonts[] = {L"Segoe UI Historic", - L"Segoe UI Symbol", 0}; - static const UChar* const kOlChikiFonts[] = {L"Nirmala UI", 0}; - static const UChar* const kOldItalicFonts[] = {L"Segoe UI Historic", - L"Segoe UI Symbol", 0}; - static const UChar* const kOldPersianFonts[] = {L"Segoe UI Historic", 0}; - static const UChar* const kOldSouthArabianFonts[] = {L"Segoe UI Historic", 0}; - static const UChar* const kOriyaFonts[] = {L"Kalinga", L"ori1Uni", - L"Lohit Oriya", L"Nirmala UI", 0}; - static const UChar* const kOrkhonFonts[] = {L"Segoe UI Historic", - L"Segoe UI Symbol", 0}; - static const UChar* const kOsmanyaFonts[] = {L"Ebrima", 0}; - static const UChar* const kPhagsPaFonts[] = {L"Microsoft PhagsPa", 0}; - static const UChar* const kRunicFonts[] = {L"Segoe UI Historic", - L"Segoe UI Symbol", 0}; - static const UChar* const kShavianFonts[] = {L"Segoe UI Historic", 0}; - static const UChar* const kSimplifiedHanFonts[] = {L"Microsoft YaHei", - L"simsun", 0}; + u"Myanmar Text", u"Padauk", u"Parabaik", u"Myanmar3", u"Code2000", 0}; + static const UChar* const kNewTaiLueFonts[] = {u"Microsoft New Tai Lue", 0}; + static const UChar* const kNkoFonts[] = {u"Ebrima", 0}; + static const UChar* const kOghamFonts[] = {u"Segoe UI Historic", + u"Segoe UI Symbol", 0}; + static const UChar* const kOlChikiFonts[] = {u"Nirmala UI", 0}; + static const UChar* const kOldItalicFonts[] = {u"Segoe UI Historic", + u"Segoe UI Symbol", 0}; + static const UChar* const kOldPersianFonts[] = {u"Segoe UI Historic", 0}; + static const UChar* const kOldSouthArabianFonts[] = {u"Segoe UI Historic", 0}; + static const UChar* const kOriyaFonts[] = {u"Kalinga", u"ori1Uni", + u"Lohit Oriya", u"Nirmala UI", 0}; + static const UChar* const kOrkhonFonts[] = {u"Segoe UI Historic", + u"Segoe UI Symbol", 0}; + static const UChar* const kOsmanyaFonts[] = {u"Ebrima", 0}; + static const UChar* const kPhagsPaFonts[] = {u"Microsoft PhagsPa", 0}; + static const UChar* const kRunicFonts[] = {u"Segoe UI Historic", + u"Segoe UI Symbol", 0}; + static const UChar* const kShavianFonts[] = {u"Segoe UI Historic", 0}; + static const UChar* const kSimplifiedHanFonts[] = {u"Microsoft YaHei", + u"simsun", 0}; static const UChar* const kSinhalaFonts[] = { - L"Iskoola Pota", L"AksharUnicode", L"Nirmala UI", 0}; - static const UChar* const kSoraSompengFonts[] = {L"Nirmala UI", 0}; - static const UChar* const kSymbolsFonts[] = {L"Segoe UI Symbol", 0}; + u"Iskoola Pota", u"AksharUnicode", u"Nirmala UI", 0}; + static const UChar* const kSoraSompengFonts[] = {u"Nirmala UI", 0}; + static const UChar* const kSymbolsFonts[] = {u"Segoe UI Symbol", 0}; static const UChar* const kSyriacFonts[] = { - L"Estrangelo Edessa", L"Estrangelo Nisibin", L"Code2000", 0}; - static const UChar* const kTaiLeFonts[] = {L"Microsoft Tai Le", 0}; - static const UChar* const kTamilFonts[] = {L"Nirmala UI", L"Latha", 0}; - static const UChar* const kTeluguFonts[] = {L"Nirmala UI", L"Gautami", 0}; - static const UChar* const kThaanaFonts[] = {L"MV Boli", 0}; - static const UChar* const kThaiFonts[] = {L"Tahoma", L"Leelawadee UI", - L"Leelawadee", 0}; + u"Estrangelo Edessa", u"Estrangelo Nisibin", u"Code2000", 0}; + static const UChar* const kTaiLeFonts[] = {u"Microsoft Tai Le", 0}; + static const UChar* const kTamilFonts[] = {u"Nirmala UI", u"Latha", 0}; + static const UChar* const kTeluguFonts[] = {u"Nirmala UI", u"Gautami", 0}; + static const UChar* const kThaanaFonts[] = {u"MV Boli", 0}; + static const UChar* const kThaiFonts[] = {u"Tahoma", u"Leelawadee UI", + u"Leelawadee", 0}; static const UChar* const kTibetanFonts[] = { - L"Microsoft Himalaya", L"Jomolhari", L"Tibetan Machine Uni", 0}; - static const UChar* const kTifinaghFonts[] = {L"Ebrima", 0}; - static const UChar* const kTraditionalHanFonts[] = {L"Microsoft JhengHei", - L"pmingliu", 0}; - static const UChar* const kVaiFonts[] = {L"Ebrima", 0}; - static const UChar* const kYiFonts[] = {L"Microsoft Yi Baiti", L"Nuosu SIL", - L"Code2000", 0}; + u"Microsoft Himalaya", u"Jomolhari", u"Tibetan Machine Uni", 0}; + static const UChar* const kTifinaghFonts[] = {u"Ebrima", 0}; + static const UChar* const kTraditionalHanFonts[] = {u"Microsoft JhengHei", + u"pmingliu", 0}; + static const UChar* const kVaiFonts[] = {u"Ebrima", 0}; + static const UChar* const kYiFonts[] = {u"Microsoft Yi Baiti", u"Nuosu SIL", + u"Code2000", 0}; static const ScriptToFontFamilies kScriptToFontFamilies[] = { {USCRIPT_ARABIC, kArabicFonts}, @@ -373,11 +374,11 @@ const UChar* GetFontBasedOnUnicodeBlock(UBlockCode block_code, SkFontMgr* font_manager) { - static const UChar* const kEmojiFonts[] = {L"Segoe UI Emoji", - L"Segoe UI Symbol"}; - static const UChar* const kMathFonts[] = {L"Cambria Math", L"Segoe UI Symbol", - L"Code2000"}; - static const UChar* const kSymbolFont = L"Segoe UI Symbol"; + static const UChar* const kEmojiFonts[] = {u"Segoe UI Emoji", + u"Segoe UI Symbol"}; + static const UChar* const kMathFonts[] = {u"Cambria Math", u"Segoe UI Symbol", + u"Code2000"}; + static const UChar* const kSymbolFont = u"Segoe UI Symbol"; static const UChar* emoji_font = 0; static const UChar* math_font = 0; static bool initialized = false; @@ -525,7 +526,7 @@ int plane = character >> 16; switch (plane) { case 1: - family = L"code2001"; + family = u"code2001"; break; case 2: // Use a Traditional Chinese ExtB font if in Traditional Chinese locale. @@ -534,12 +535,12 @@ // 0213), but its coverage is rather sparse. // Eventually, this should be controlled by lang/xml:lang. if (icu::Locale::getDefault() == icu::Locale::getTraditionalChinese()) - family = L"pmingliu-extb"; + family = u"pmingliu-extb"; else - family = L"simsun-extb"; + family = u"simsun-extb"; break; default: - family = L"lucida sans unicode"; + family = u"lucida sans unicode"; } }
diff --git a/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder.cc b/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder.cc index baa4c87..15a38cf2 100644 --- a/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder.cc +++ b/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder.cc
@@ -103,24 +103,12 @@ // color space of |image| to RGB. // media::PaintCanvasVideoRenderer::ConvertVideoFrameToRGBPixels() uses libyuv // for the YUV-to-RGB conversion. -// -// NOTE: Ideally, this function should be a static method of -// media::PaintCanvasVideoRenderer. We did not do that because -// media::PaintCanvasVideoRenderer uses the JPEG matrix coefficients for all -// full-range YUV color spaces, but we want to use the JPEG matrix coefficients -// only for full-range BT.601 YUV. bool IsColorSpaceSupportedByPCVR(const avifImage* image) { SkYUVColorSpace yuv_color_space; - if (!GetColorSpace(image).ToSkYUVColorSpace(image->depth, &yuv_color_space)) - return false; - const bool color_space_is_supported = - yuv_color_space == kJPEG_Full_SkYUVColorSpace || - yuv_color_space == kRec601_Limited_SkYUVColorSpace || - yuv_color_space == kRec709_Limited_SkYUVColorSpace || - yuv_color_space == kBT2020_8bit_Limited_SkYUVColorSpace; // libyuv supports the alpha channel only with the I420 pixel format, which is // 8-bit YUV 4:2:0. - return color_space_is_supported && + return GetColorSpace(image).ToSkYUVColorSpace(image->depth, + &yuv_color_space) && (!image->alphaPlane || (image->depth == 8 && image->yuvFormat == AVIF_PIXEL_FORMAT_YUV420 && image->alphaRange == AVIF_RANGE_FULL));
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher_test.cc b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher_test.cc index ae66f3e79..95da7181 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher_test.cc +++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher_test.cc
@@ -31,6 +31,7 @@ #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h" #include <memory> + #include "base/optional.h" #include "base/test/scoped_feature_list.h" #include "build/build_config.h"
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index 93212e5a..39682bb 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -913,9 +913,6 @@ status: "experimental" }, { - name: "FeaturePolicyVibrateFeature" - }, - { name: "FetchUploadStreaming", origin_trial_feature_name: "FetchUploadStreaming", status: "experimental",
diff --git a/third_party/blink/renderer/platform/text/locale_win.cc b/third_party/blink/renderer/platform/text/locale_win.cc index 3c86b593..ed7e012 100644 --- a/third_party/blink/renderer/platform/text/locale_win.cc +++ b/third_party/blink/renderer/platform/text/locale_win.cc
@@ -35,6 +35,7 @@ #include "base/memory/ptr_util.h" #include "base/stl_util.h" +#include "base/strings/string_util.h" #include "third_party/blink/renderer/platform/language.h" #include "third_party/blink/renderer/platform/runtime_enabled_features.h" #include "third_party/blink/renderer/platform/text/date_components.h" @@ -71,7 +72,7 @@ else StringImpl::CopyChars(buffer, locale.Characters16(), locale.length()); buffer[locale.length()] = '\0'; - return ::LocaleNameToLCID(buffer, 0); + return ::LocaleNameToLCID(base::as_writable_wcstr(buffer), 0); } static LCID LCIDFromLocale(const String& locale, bool defaults_for_locale) { @@ -82,7 +83,8 @@ LOCALE_SISO639LANGNAME | (defaults_for_locale ? LOCALE_NOUSEROVERRIDE : 0), lowercase_language_code, kLanguageCodeBufferSize); - String user_default_language_code = String(lowercase_language_code); + String user_default_language_code = + String(base::as_u16cstr(lowercase_language_code)); LCID lcid = LCIDFromLocaleInternal(LOCALE_USER_DEFAULT, user_default_language_code, locale); @@ -126,9 +128,9 @@ if (buffer_size_with_nul <= 0) return String(); StringBuffer<UChar> buffer(buffer_size_with_nul); - ::GetLocaleInfo(lcid_, - type | (defaults_for_locale_ ? LOCALE_NOUSEROVERRIDE : 0), - buffer.Characters(), buffer_size_with_nul); + ::GetLocaleInfo( + lcid_, type | (defaults_for_locale_ ? LOCALE_NOUSEROVERRIDE : 0), + base::as_writable_wcstr(buffer.Characters()), buffer_size_with_nul); buffer.Shrink(buffer_size_with_nul - 1); return String::Adopt(buffer); }
diff --git a/third_party/blink/renderer/platform/weborigin/kurl.cc b/third_party/blink/renderer/platform/weborigin/kurl.cc index 978ad7c..294c1a9a 100644 --- a/third_party/blink/renderer/platform/weborigin/kurl.cc +++ b/third_party/blink/renderer/platform/weborigin/kurl.cc
@@ -102,7 +102,7 @@ explicit KURLCharsetConverter(const WTF::TextEncoding* encoding) : encoding_(encoding) {} - void ConvertFromUTF16(const base::char16* input, + void ConvertFromUTF16(const char16_t* input, int input_length, url::CanonOutput* output) override { std::string encoded = @@ -701,7 +701,7 @@ String DecodeURLEscapeSequences(const String& string, DecodeURLMode mode) { StringUTF8Adaptor string_utf8(string); - url::RawCanonOutputT<base::char16> unescaped; + url::RawCanonOutputT<char16_t> unescaped; url::DecodeURLEscapeSequences(string_utf8.data(), string_utf8.size(), mode, &unescaped); return StringImpl::Create8BitIfPossible(
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 5076bf42..9ca9df4c 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -5633,9 +5633,6 @@ crbug.com/1178160 virtual/threaded-prefer-compositing/external/wpt/css/cssom-view/MediaQueryList-extends-EventTarget.html [ Pass Failure ] crbug.com/1178160 virtual/threaded-prefer-compositing/external/wpt/css/cssom-view/MediaQueryList-extends-EventTarget-interop.html [ Pass Failure ] -# Failing on Webkit Linux Leak -crbug.com/1174806 external/wpt/css/selectors/focus-visible-006.html [ Pass Failure ] - # No support for key combinations like Alt + c in testdriver.Actions for content_shell crbug.com/893480 external/wpt/uievents/interface/keyboard-accesskey-click-event.html [ Timeout ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites index 17c5d0c..8b364d1 100644 --- a/third_party/blink/web_tests/VirtualTestSuites +++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -853,5 +853,9 @@ "bases": ["external/wpt/html/webappapis/user-prompts/cannot-show-simple-dialogs/confirm-different-origin-frame.sub.html", "external/wpt/html/webappapis/user-prompts/cannot-show-simple-dialogs/prompt-different-origin-frame.sub.html"], "args": [ "--enable-features=SuppressDifferentOriginSubframeJSDialogs"] + }, + {"prefix": "inspector-protocol-bfcache", + "bases": ["http/tests/inspector-protocol/bfcache" ], + "args": ["--enable-features=BackForwardCache"] } ]
diff --git a/third_party/blink/web_tests/android/WebviewWPTExpectations b/third_party/blink/web_tests/android/WebviewWPTExpectations index e93bf52..ab809264 100644 --- a/third_party/blink/web_tests/android/WebviewWPTExpectations +++ b/third_party/blink/web_tests/android/WebviewWPTExpectations
@@ -1341,7 +1341,6 @@ crbug.com/1050754 external/wpt/css/css-tables/visibility-collapse-rowspan-004-dynamic.html [ Failure ] crbug.com/1050754 external/wpt/css/css-tables/visibility-hidden-row-001.html [ Failure ] crbug.com/1050754 external/wpt/css/css-tables/visibility-hidden-row-002.html [ Failure ] -crbug.com/1050754 external/wpt/css/css-tables/width-distribution/colspan_redistribution.tentative.html [ Failure ] crbug.com/1050754 external/wpt/css/css-tables/width-distribution/computing-column-measure-1.html [ Failure Pass ] crbug.com/1050754 external/wpt/css/css-text-decor/inheritance.html [ Failure Pass ] crbug.com/1050754 external/wpt/css/css-text-decor/parsing/text-decoration-computed.html [ Failure Pass ]
diff --git a/third_party/blink/web_tests/external/wpt/css/css-tables/width-distribution/colspan_redistribution.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-tables/width-distribution/colspan_redistribution.tentative.html deleted file mode 100644 index d5f74514..0000000 --- a/third_party/blink/web_tests/external/wpt/css/css-tables/width-distribution/colspan_redistribution.tentative.html +++ /dev/null
@@ -1,233 +0,0 @@ -<!doctype html> -<script src='/resources/testharness.js'></script> -<script src='/resources/testharnessreport.js'></script> -<script src="/resources/check-layout-th.js"></script> -<link rel="author" title="Aleks Totic" href="atotic@chromium.org" /> -<link rel="help" href="https://www.w3.org/TR/css-tables-3/#distributing-width-to-columns" /> -<style> - table { - background: gray; - margin-bottom: 24px; - border-spacing: 8px 8px; - } - td { - padding: 0; - background: #BFB; - font-size: 10px; - } - td > div { - display: inline-block; - background: rgba(56,162,56,0.3); - } - .error { - color: red; - } - .brick { - width: 30px; - height: 20px; - } - p { - margin-top:4px; - margin-bottom:4px; - } - .rule1 { - background: #87dc8a; - } - .rule2 { - background: #3ae4cc; - } - .rule1and2 { - background: #fda4a4; - } -</style> -<h1>Colspan > 1 width redistribution</h1> -<p>This page is intended to be used as a wpt testharness test, and for examining what algorithms do. Hovering over cells will display information about the table.</p> -<p>Principles</p> -<ul> - <li>Distribution should be stable: reordered span cells retain their width.</li> -</ul> -<p>Wide cell redistributes its different widths to the spanned cells: percentage, min and max.</p> -<p>Creating understandable tests with percentage cells is complex because the relationship between percentage cell width, and table width is complex. Rules that govern relationship between table grid width and percentage cell width are:</p> -<ol> - <li><span class="rule1">Rule#1</span>, Single column sets minimum table width. Minimum table width is column.min_width / column.percent * 100.</li> - <li><span class="rule2">Rule#2</span>, All percentage columns set minimum table width. <br>Let P% be sum of all percentages, and Mpx sum of minimum widths of all non-percentage columns. The equations below determine minimum table width: - <ul> - <li>table width = Mpx + Ppx </li> - <li>P% + M% = 100%</li> - <li>Ppx * P% = Mpx * M% </li> - <li>Ppx * P% = Mpx * (100-P%) </li> - <li>Ppx = Mpx * (100-P%) / P% </li> - <li>table width = Mpx + Mpx * (100-P%) / P%.</li> - <li>table width = Mpx * (1 + (100-P%)/P%)</li> - </ul> - </li> - <p class="error">FF and Edge interpret rule#2 as maximum table width, while Chrome interprets it as minimum table width. </p> - <p>Table backgrounds will change if they match the 2 rules above: <span class="rule1">Rule#1</span>, <span class="rule2">Rule#2</span>, and both <span class="rule1and2">Rule#1 and Rule#2</span>.</p> -</ol> - <p>All examples have border-spacing:8, td.padding:0.</p> - -<h2>Percentage redistribution</h2> - -<h3>Percentage CSS constrained span cells</h3> - -<p>Rules<br> - <ul> - <li>min width never gets smaller than it started. - <li>min width becomes cell.percent/cells.percent * wide_cell.min_width</li> - <li>max width becomes cell.percent/cells.percent * wide_cell.max_width</li> - </ul> -</p> - -<p>10) auto/300px wide cell, 25%/50px span min width<br> -wide min width gets distributed evenly (-border_spacing) to both cells at 146px<br> -Table width: 146/0.25 + 4*8 = 584 + 32 = 616 -<table data-expected-width="616"> - <tr> - <td style="width:25%" data-expected-width="146"><div style="width:50px">25%/30px</div></td> - <td style="width:25%"><div style="width:50px">25%/30px</div></td> - <td style="width:20px">x</td> - </tr> - <tr> - <td colspan=2 style=""><div style="width:300px">300px min</div></td> - </tr> -</table> - -<p>11) auto/400px wide cell, 20%/50px, 60%/50px spans.<br> -400 - 8px min width gets redistributed to span cells as 98px/294px.<br> -98px/0.2 => min grid width 490 + 4*8 = 522.</p> -<p class="error">Edge disagrees, table is 870</p> -<div style="width:600px"> -<table data-expected-width="522"> - <tr> - <td style="width:20%" data-expected-width="98"><div style="width:50px">20%/50px</div></td> - <td style="width:60%" data-expected-width="294"><div style="width:50px">60%/50px</div></td> - <td style="width:20px">x</td> - </tr> - <tr> - <td colspan=2 style=""><div style="width:400px">400px min</div></td> - </tr> -</table> -</div> - -<p>12) auto/400px wide cell, 50%/150px, 30%/150px spans.<br> -This tests conflict resolution where min-width > redistributed width, and all browsers disagree.<br> -min-width of the 2nd cell is larger than redistributed width, causing differences.<br> -400-8px distributed max width tries to redistribute as 245|147, but gets constrained to 245|150 in Chrome.<br> -table width from cell 1 245/0.5 + 4*8 = 522<br> -table width from cell 2 150/0.3 + 4*8 = 532<br> -cell 1 = 50% of 500 = 250, cell 2 = 30% of 500 = 150 , cell 3 gets the remaining 100</p> -<p class="error">Chrome/FF/Edge end up with tables of different widths: 532/590/685. Chrome's 2nd span cell seems 'most correct' at its original max width of 150. In FF, extra min-width seems to cause more width to be redistributed. If you hover over 30%/150 cell, its min width will change to 100px, and all browsers will agree.</p> -<style> - .test12:hover { - width:100px !important; - } -</style> -<table data-expected-width="532"> - <tr> - <td style="width:50%" data-expected-width="250"><div style="width:150px">50%/150px</div></td> - <td style="width:30%" data-expected-width="150"><div class="test12" style="width:150px">30%/150px</div></td> - <td style="width:20px" data-expected-width="100">x</td> - </tr> - <tr> - <td colspan=2 style=""><div style="width:400px">400px min</div></td> - </tr> -</table> - -<p>13) auto/400px wide cell, 50%/75px/125px, 30%/75px/125px spans.<br> -400-8px min width gets redistributed as 245/147 (no min width limits)<br> -</p> -<p class="error">Edge is different</p> - <table data-expected-width="522"> - <tr> - <td style="width:50%" data-expected-width="245"><div style="width:75px">50%/75</div><div style="width:50px">/125</div></td> - <td style="width:30%" data-expected-width="147"><div style="width:75px">30%/75</div><div style="width:50px">/125</div></td> - <td style="width:20px">x</td> - </tr> - <tr> - <td colspan=2 style=""><div style="width:400px">300px min</div></td> - </tr> -</table> - - -<script> -function measureCellMinMax(cell) { - let d = document.createElement("div"); - let clone = cell.cloneNode(true); - for (child of Array.from(clone.childNodes)) - d.appendChild(child); - d.style.width = "min-content"; - document.body.appendChild(d); - let min = d.offsetWidth; - d.style.width = "max-content"; - let max = d.offsetWidth; - d.remove(); - return {min: min, max: max}; -} -function annotateTable(t) { - let tableWidth = t.offsetWidth; - - let firstCell; - let totalCellPercent = 0; - let nonPercentCellWidth = 0; - let tableMinWidthByCellPercent = 0; - let cellCount = 0; - let cells = Array.from(t.querySelectorAll("td")); - let spacing = (2 + cells.length - 1)*8; - for (let cell of cells) { - if (!firstCell) - firstCell = cell; - cellCount++; - let percent = cell.offsetWidth / (tableWidth - spacing) * 100; - let minmax = measureCellMinMax(cell); - let title = `${cell.offsetWidth.toFixed(1)}px\nmin:${minmax.min}px max:${minmax.max}px ${percent.toFixed(1)}%`; - let cssWidth = cell.style.width; - if (cssWidth) { - let w = parseFloat(cssWidth); - if (cssWidth.match(/\%/)) { - totalCellPercent += w; - let tableMinWidth = minmax.min / (w / 100); - tableMinWidthByCellPercent = Math.max(tableMinWidthByCellPercent, tableMinWidth); - title += `\nmin table: ${tableMinWidth.toFixed(0)}px`; - } else { - nonPercentCellWidth += w; - } - } - title += `\nTable: ${tableWidth.toFixed(0)} spacing: ${spacing}px`; - cell.setAttribute("title", title); - } - - - // Display table statistics in first cell. - if (firstCell) { - let title = firstCell.getAttribute("title"); - let ruleMatch = 0; - if (tableMinWidthByCellPercent != 0) { - if ((tableMinWidthByCellPercent + spacing) == tableWidth) - ruleMatch += 1; - title += `\nTable min by single cell percent: ${tableMinWidthByCellPercent.toFixed(1)}`; - } else { - title += "\nTable min by single cell percent NA"; - } - if (nonPercentCellWidth && totalCellPercent > 0) { - totalCellPercent = Math.min(totalCellPercent, 100); - title += `\nPercent sum: ${totalCellPercent.toFixed(1)}%, non percent width: ${nonPercentCellWidth}px`; - let tableMinBySum = (totalCellPercent / (100 - totalCellPercent) +1) * nonPercentCellWidth; - if (Math.floor((tableMinBySum + spacing)) == Math.floor(tableWidth)) - ruleMatch += 2; - title += `\nTable min by sum ${totalCellPercent}%: ${tableMinBySum.toFixed(1)}px`; - } else { - "Table min by % sum not available"; - } - firstCell.setAttribute("title", title); - switch(ruleMatch) { - case 1: t.classList.toggle('rule1'); break; - case 2: t.classList.toggle('rule2'); break; - case 3: t.classList.toggle('rule1and2'); break; - default: break; - } - } -} -for (let t of Array.from(document.querySelectorAll("table"))) - annotateTable(t); -checkLayout("table"); -</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/cssom-view/scrollIntoView-inline-image.html b/third_party/blink/web_tests/external/wpt/css/cssom-view/scrollIntoView-inline-image.html new file mode 100644 index 0000000..1bdc75a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/cssom-view/scrollIntoView-inline-image.html
@@ -0,0 +1,26 @@ +<!doctype html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<title>scrollIntoView uses the element's bounding rect rather than line box</title> +<link rel="help" href="https://drafts.csswg.org/cssom-view/#scroll-an-element-into-view"> +<style> +img { + height: 100vh; + width: 100px; +} +body { + margin-bottom: 100vh; +} +</style> +<body> +<a id="scrollto">To be scrolled into view</a><img src="/images/blue.png"> +</body> +<script> + +test(t => { + window.scrollTo(0, 0); + const target = document.getElementById("scrollto"); + target.scrollIntoView(); + assert_approx_equals(window.scrollY, target.offsetTop, 1); +}, "Scrolling an inline element with a large line height uses the bounding rect"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/focus-visible-006.html b/third_party/blink/web_tests/external/wpt/css/selectors/focus-visible-006.html index c203c06f..f607df25 100644 --- a/third_party/blink/web_tests/external/wpt/css/selectors/focus-visible-006.html +++ b/third_party/blink/web_tests/external/wpt/css/selectors/focus-visible-006.html
@@ -45,15 +45,16 @@ <span id="el" contenteditable>Focus me</span> </div> <script> - setup({ explicit_done: true }); - + var actions_promise; async_test(function(t) { el.addEventListener("focus", t.step_func_done(function() { assert_equals(getComputedStyle(el).outlineColor, "rgb(0, 128, 0)", `outlineColor for ${el.tagName}#${el.id} should be green`); assert_not_equals(getComputedStyle(el).backgroundColor, "rgb(255, 0, 0)", `backgroundColor for ${el.tagName}#${el.id} should NOT be red`); + // Make sure the test finishes after all the input actions are completed. + actions_promise.then( () => t.done() ); })); - test_driver.click(el).then(done()); + actions_promise = test_driver.click(el); }, "Focus should always match :focus-visible on content editable divs"); </script> </body>
diff --git a/third_party/blink/web_tests/external/wpt/lint.ignore b/third_party/blink/web_tests/external/wpt/lint.ignore index 5d8db431..0b95e5a9 100644 --- a/third_party/blink/web_tests/external/wpt/lint.ignore +++ b/third_party/blink/web_tests/external/wpt/lint.ignore
@@ -740,6 +740,7 @@ # Tests that are false positives for using Ahem as a system font AHEM SYSTEM FONT: acid/acid3/test.html +AHEM SYSTEM FONT: resource-timing/entry-attributes.html AHEM SYSTEM FONT: resource-timing/font-timestamps.html AHEM SYSTEM FONT: resource-timing/resources/all_resource_types.htm AHEM SYSTEM FONT: resource-timing/resources/iframe-reload-TAO.sub.html
diff --git a/third_party/blink/web_tests/external/wpt/resource-timing/entry-attributes.html b/third_party/blink/web_tests/external/wpt/resource-timing/entry-attributes.html index b8d3371..013f4d7 100644 --- a/third_party/blink/web_tests/external/wpt/resource-timing/entry-attributes.html +++ b/third_party/blink/web_tests/external/wpt/resource-timing/entry-attributes.html
@@ -8,7 +8,8 @@ <script src="/resources/testharnessreport.js"></script> <script> -// Returns a promise that settles once the given path has been fetched. +// Returns a promise that settles once the given path has been fetched as an +// image resource. function load_image(path) { return new Promise(resolve => { const img = new Image(); @@ -17,6 +18,21 @@ }); } +// Returns a promise that settles once the given path has been fetched as a +// font resource. +function load_font(path) { + document.getElementById('forFonts').innerHTML = ` + <style> + @font-face { + font-family: ahem; + src: url('${path}'); + } + </style> + <div style="font-family: ahem;">This fetches ahem font.</div> + `; + return document.fonts.ready; +} + function assert_ordered(entry, attributes) { let before = attributes[0]; attributes.slice(1).forEach(after => { @@ -78,7 +94,7 @@ } promise_test(async () => { - // Clean up entries from scripts includes. + // Clear out everything that isn't the one ResourceTiming entry under test. performance.clearResourceTimings(); await load_image("resources/fake_responses.py#hash=1"); const entry_list = performance.getEntriesByType("resource"); @@ -90,7 +106,18 @@ "There should be a hash in the resource name"); assert_http_resource(entry); -}, "URL fragments should be present in the 'name' attribute"); +}, "Image resources should generate conformant entries"); + +promise_test(async () => { + // Clear out everything that isn't the one ResourceTiming entry under test. + performance.clearResourceTimings(); + await load_font("/fonts/Ahem.ttf"); + const entry_list = performance.getEntriesByType("resource"); + if (entry_list.length != 1) { + throw new Error("There should be one entry for one resource"); + } + assert_http_resource(entry_list[0]); +}, "Font resources should generate conformant entries"); </script> </head> @@ -98,5 +125,6 @@ <h1>Description</h1> <p>This test validates that PerformanceResourceTiming entries' attributes are populated with the correct values.</p> +<div id="forFonts"></div> </body> </html>
diff --git a/third_party/blink/web_tests/flag-specific/back-forward-cache/http/tests/inspector-protocol/bfcache/report-back-forward-cache-status-simple-expected.txt b/third_party/blink/web_tests/flag-specific/back-forward-cache/http/tests/inspector-protocol/bfcache/report-back-forward-cache-status-simple-expected.txt new file mode 100644 index 0000000..a8c5f38 --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/back-forward-cache/http/tests/inspector-protocol/bfcache/report-back-forward-cache-status-simple-expected.txt
@@ -0,0 +1,12 @@ +Test that back/forward navigations report the bfcache status +{ + frameId : <string> + isRestoredFromBackForwardCache : false + requestId : <string> +} +{ + frameId : <string> + isRestoredFromBackForwardCache : false + requestId : <string> +} +
diff --git a/third_party/blink/web_tests/flag-specific/back-forward-cache/virtual/synchronous_html_parser/http/tests/inspector-protocol/bfcache/report-back-forward-cache-status-blocklisted-features-expected.txt b/third_party/blink/web_tests/flag-specific/back-forward-cache/virtual/synchronous_html_parser/http/tests/inspector-protocol/bfcache/report-back-forward-cache-status-blocklisted-features-expected.txt new file mode 100644 index 0000000..a8c5f38 --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/back-forward-cache/virtual/synchronous_html_parser/http/tests/inspector-protocol/bfcache/report-back-forward-cache-status-blocklisted-features-expected.txt
@@ -0,0 +1,12 @@ +Test that back/forward navigations report the bfcache status +{ + frameId : <string> + isRestoredFromBackForwardCache : false + requestId : <string> +} +{ + frameId : <string> + isRestoredFromBackForwardCache : false + requestId : <string> +} +
diff --git a/third_party/blink/web_tests/flag-specific/back-forward-cache/virtual/synchronous_html_parser/http/tests/inspector-protocol/bfcache/report-back-forward-cache-status-simple-expected.txt b/third_party/blink/web_tests/flag-specific/back-forward-cache/virtual/synchronous_html_parser/http/tests/inspector-protocol/bfcache/report-back-forward-cache-status-simple-expected.txt new file mode 100644 index 0000000..a8c5f38 --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/back-forward-cache/virtual/synchronous_html_parser/http/tests/inspector-protocol/bfcache/report-back-forward-cache-status-simple-expected.txt
@@ -0,0 +1,12 @@ +Test that back/forward navigations report the bfcache status +{ + frameId : <string> + isRestoredFromBackForwardCache : false + requestId : <string> +} +{ + frameId : <string> + isRestoredFromBackForwardCache : false + requestId : <string> +} +
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/bfcache/report-back-forward-cache-status-blocklisted-features-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/bfcache/report-back-forward-cache-status-blocklisted-features-expected.txt new file mode 100644 index 0000000..a8c5f38 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/bfcache/report-back-forward-cache-status-blocklisted-features-expected.txt
@@ -0,0 +1,12 @@ +Test that back/forward navigations report the bfcache status +{ + frameId : <string> + isRestoredFromBackForwardCache : false + requestId : <string> +} +{ + frameId : <string> + isRestoredFromBackForwardCache : false + requestId : <string> +} +
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/bfcache/report-back-forward-cache-status-blocklisted-features.js b/third_party/blink/web_tests/http/tests/inspector-protocol/bfcache/report-back-forward-cache-status-blocklisted-features.js new file mode 100644 index 0000000..f4e90c68 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/bfcache/report-back-forward-cache-status-blocklisted-features.js
@@ -0,0 +1,39 @@ +(async function(testRunner) { + const {page, session, dp} = await testRunner.startBlank( + `Test that back/forward navigations report the bfcache status`); + + await dp.Page.enable(); + + // Navigate to Page A. + await page.navigate( + 'https://devtools.test:8443/inspector-protocol/resources/empty.html'); + + // Use a sticky blocklisted feature (keyboard lock). + await session.evaluate('navigator.keyboard.lock()'); + + // Navigate to Page B. + await page.navigate( + 'https://devtools.test:8000/inspector-protocol/resources/empty.html'); + + const {result: history} = await dp.Page.getNavigationHistory(); + + // Enable for printing the history. + // testRunner.log(history); + + // Do a 'back' navigation. + const previous = history.entries[history.currentIndex - 1]; + await historyNavigate(previous.id); + + // Do a 'forward' navigation. + const current = history.entries[history.currentIndex]; + await historyNavigate(current.id); + + testRunner.completeTest(); + + async function historyNavigate(entryId) { + const statusReportPromise = dp.Page.onceHistoryNavigationOutcomeReported(); + await dp.Page.navigateToHistoryEntry({entryId}); + const {params: statusReport} = await statusReportPromise; + testRunner.log(statusReport); + } +});
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/bfcache/report-back-forward-cache-status-simple-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/bfcache/report-back-forward-cache-status-simple-expected.txt new file mode 100644 index 0000000..a8c5f38 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/bfcache/report-back-forward-cache-status-simple-expected.txt
@@ -0,0 +1,12 @@ +Test that back/forward navigations report the bfcache status +{ + frameId : <string> + isRestoredFromBackForwardCache : false + requestId : <string> +} +{ + frameId : <string> + isRestoredFromBackForwardCache : false + requestId : <string> +} +
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/bfcache/report-back-forward-cache-status-simple.js b/third_party/blink/web_tests/http/tests/inspector-protocol/bfcache/report-back-forward-cache-status-simple.js new file mode 100644 index 0000000..e45201a --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/bfcache/report-back-forward-cache-status-simple.js
@@ -0,0 +1,33 @@ +(async function(testRunner) { + const {page, session, dp} = await testRunner.startBlank( + `Test that back/forward navigations report the bfcache status`); + + await dp.Page.enable(); + + await page.navigate( + 'https://devtools.test:8443/inspector-protocol/resources/empty.html'); + + await page.navigate( + 'http://devtools.test:8000/inspector-protocol/resources/empty.html'); + + const {result: history} = await dp.Page.getNavigationHistory(); + // Enable for printing the history. + // testRunner.log(history); + + // Do a 'back' navigation. + const previous = history.entries[history.currentIndex - 1]; + await historyNavigate(previous.id); + + // Do a 'forward' navigation. + const current = history.entries[history.currentIndex]; + await historyNavigate(current.id); + + testRunner.completeTest(); + + async function historyNavigate(entryId) { + const statusReportPromise = dp.Page.onceHistoryNavigationOutcomeReported(); + await dp.Page.navigateToHistoryEntry({entryId}); + const {params: statusReport} = await statusReportPromise; + testRunner.log(statusReport); + } +});
diff --git a/third_party/blink/web_tests/virtual/inspector-protocol-bfcache/README.md b/third_party/blink/web_tests/virtual/inspector-protocol-bfcache/README.md new file mode 100644 index 0000000..02b0ee8 --- /dev/null +++ b/third_party/blink/web_tests/virtual/inspector-protocol-bfcache/README.md
@@ -0,0 +1,3 @@ +This suite runs the tests with `--enable-features=BackForwardCache` to enable +inspector-protocol tests for Chrome DevTools Protocol tests that test the +bfcache-related reporting.
diff --git a/third_party/blink/web_tests/virtual/inspector-protocol-bfcache/http/tests/inspector-protocol/bfcache/report-back-forward-cache-status-blocklisted-features-expected.txt b/third_party/blink/web_tests/virtual/inspector-protocol-bfcache/http/tests/inspector-protocol/bfcache/report-back-forward-cache-status-blocklisted-features-expected.txt new file mode 100644 index 0000000..a8c5f38 --- /dev/null +++ b/third_party/blink/web_tests/virtual/inspector-protocol-bfcache/http/tests/inspector-protocol/bfcache/report-back-forward-cache-status-blocklisted-features-expected.txt
@@ -0,0 +1,12 @@ +Test that back/forward navigations report the bfcache status +{ + frameId : <string> + isRestoredFromBackForwardCache : false + requestId : <string> +} +{ + frameId : <string> + isRestoredFromBackForwardCache : false + requestId : <string> +} +
diff --git a/third_party/blink/web_tests/virtual/inspector-protocol-bfcache/http/tests/inspector-protocol/bfcache/report-back-forward-cache-status-simple-expected.txt b/third_party/blink/web_tests/virtual/inspector-protocol-bfcache/http/tests/inspector-protocol/bfcache/report-back-forward-cache-status-simple-expected.txt new file mode 100644 index 0000000..6700009 --- /dev/null +++ b/third_party/blink/web_tests/virtual/inspector-protocol-bfcache/http/tests/inspector-protocol/bfcache/report-back-forward-cache-status-simple-expected.txt
@@ -0,0 +1,12 @@ +Test that back/forward navigations report the bfcache status +{ + frameId : <string> + isRestoredFromBackForwardCache : true + requestId : <string> +} +{ + frameId : <string> + isRestoredFromBackForwardCache : true + requestId : <string> +} +
diff --git a/third_party/blink/web_tests/wpt_internal/prerender/referrer-policy-no-referrer.html b/third_party/blink/web_tests/wpt_internal/prerender/referrer-policy-no-referrer.html new file mode 100644 index 0000000..06177c00 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/prerender/referrer-policy-no-referrer.html
@@ -0,0 +1,20 @@ +<!DOCTYPE html> +<meta name="referrer" content="no-referrer"> +<title>Test noreferrer</title> +<script src="/common/utils.js"></script> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/utils.js"></script> +<script src="resources/referrer-test.js"></script> +<body> +<script> + +// Tests that the referrer on the prerendering navigation request is not sent +// when the triggering page's referrer policy is set to no-referrer. +promise_test(async t => { + await referrer_test('(none)'); +}, 'no referrer'); + +</script> +</body> +
diff --git a/third_party/blink/web_tests/wpt_internal/prerender/referrer-policy-origin.html b/third_party/blink/web_tests/wpt_internal/prerender/referrer-policy-origin.html new file mode 100644 index 0000000..3f3a4196 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/prerender/referrer-policy-origin.html
@@ -0,0 +1,20 @@ +<!DOCTYPE html> +<meta name="referrer" content="origin"> +<title>Test origin referrer</title> +<script src="/common/utils.js"></script> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/utils.js"></script> +<script src="resources/referrer-test.js"></script> +<body> +<script> + +// Tests that the referrer on the prerendering navigation request is the +// triggering page's origin when the referrer policy is set to origin. +promise_test(async t => { + const expected = new URL('', window.origin).href; + await referrer_test(expected); +}, 'origin referrer'); + +</script> +</body>
diff --git a/third_party/blink/web_tests/wpt_internal/prerender/referrer.html b/third_party/blink/web_tests/wpt_internal/prerender/referrer.html new file mode 100644 index 0000000..de2fde3c --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/prerender/referrer.html
@@ -0,0 +1,18 @@ +<!DOCTYPE html> +<title>Test default referrer</title> +<script src="/common/utils.js"></script> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/utils.js"></script> +<script src="resources/referrer-test.js"></script> +<body> +<script> + +// Tests that the referrer on the prerendering navigation request is the +// triggering page's URL by default. +promise_test(async t => { + await referrer_test(window.location.href); +}, 'default referrer'); + +</script> +</body>
diff --git a/third_party/blink/web_tests/wpt_internal/prerender/resources/echo-referrer.py b/third_party/blink/web_tests/wpt_internal/prerender/resources/echo-referrer.py new file mode 100644 index 0000000..690f8fb --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/prerender/resources/echo-referrer.py
@@ -0,0 +1,25 @@ +"""A page that echoes the Referrer header value via BroadcastChannel. +""" + + +def main(request, response): + referrer = request.headers.get(b"referer") + + if referrer is None: + referrer = b"(none)" + + html = u''' +<html> +<head> +<title>Echo referrer</title> +</head> +<body> +<script> +const bc = new BroadcastChannel('prerender-channel'); +bc.postMessage({referrer: '%s'}); +</script> +</body> +</html> +''' + return (200, [("Content-Type", b"text/html")], + html % referrer.decode("utf-8"))
diff --git a/third_party/blink/web_tests/wpt_internal/prerender/resources/referrer-test.js b/third_party/blink/web_tests/wpt_internal/prerender/resources/referrer-test.js new file mode 100644 index 0000000..8e22a9b --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/prerender/resources/referrer-test.js
@@ -0,0 +1,15 @@ +async function referrer_test(expected) { + const bc = new BroadcastChannel('prerender-channel'); + + const gotMessage = new Promise(resolve => { + bc.addEventListener('message', e => { + resolve(e.data); + }, {once: true}); + }); + + // Start prerendering a page that will echo its referrer. + startPrerendering(`resources/echo-referrer.py`); + + const result = await gotMessage; + assert_equals(result.referrer, expected, 'referrer'); +}
diff --git a/third_party/setupdesign/LICENSE b/third_party/setupdesign/LICENSE new file mode 100644 index 0000000..3afb763d --- /dev/null +++ b/third_party/setupdesign/LICENSE
@@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License.
diff --git a/third_party/setupdesign/OWNERS b/third_party/setupdesign/OWNERS new file mode 100644 index 0000000..7600c8f --- /dev/null +++ b/third_party/setupdesign/OWNERS
@@ -0,0 +1,3 @@ +mheikal@chromium.org +smaier@chromium.org +wenyufu@chromium.org
diff --git a/third_party/setupdesign/README.chromium b/third_party/setupdesign/README.chromium new file mode 100644 index 0000000..59117cf --- /dev/null +++ b/third_party/setupdesign/README.chromium
@@ -0,0 +1,13 @@ +Name: Setupdesign +Short Name: setupdesign +URL: https://android.googlesource.com/platform/external/setupdesign/ +Version: unknown +License: Apache 2.0 +License File: LICENSE +Security Critical: no + +Description: +This purely exists as a temporary workaround for the setupdesign library which +only exists in //clank, but doesn't have a LICENSE file with it - for more +context see crbug.com/1184792. This folder should be deleted when +crbug.com/1186270 is resolved.
diff --git a/tools/gdb/gdb_chrome.py b/tools/gdb/gdb_chrome.py index 18481e2a..a25df00 100644 --- a/tools/gdb/gdb_chrome.py +++ b/tools/gdb/gdb_chrome.py
@@ -99,9 +99,9 @@ return blink.ustring_to_string(self.val['_M_dataplus']['_M_p']) -pp_set.add_printer( - 'string16', '^string16|std::basic_string<(unsigned short|base::char16).*>$', - String16Printer) +pp_set.add_printer('string16', + '^string16|std::basic_string<(unsigned short|char16_t).*>$', + String16Printer) class GURLPrinter(StringPrinter):
diff --git a/tools/ipc_fuzzer/fuzzer/fuzzer.cc b/tools/ipc_fuzzer/fuzzer/fuzzer.cc index bd82b04..65b4ca3 100644 --- a/tools/ipc_fuzzer/fuzzer/fuzzer.cc +++ b/tools/ipc_fuzzer/fuzzer/fuzzer.cc
@@ -1268,20 +1268,6 @@ } }; -template <> -struct FuzzTraits<HostID> { - static bool Fuzz(HostID* p, Fuzzer* fuzzer) { - HostID::HostType type = p->type(); - std::string id = p->id(); - if (!FuzzParam(&type, fuzzer)) - return false; - if (!FuzzParam(&id, fuzzer)) - return false; - *p = HostID(type, id); - return true; - } -}; - #if defined(OS_WIN) template <> struct FuzzTraits<HWND> {
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index a5f4c875..908a400 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -123,7 +123,7 @@ 'android-nougat-arm64-rel': 'android_release_bot_minimal_symbols_arm64_fastbuild_webview_google', # TODO(crbug/1182468) Remove android coverage bots after coverage is # running on CQ. - 'android-pie-arm64-coverage-experimental-rel': 'android_release_bot_arm64_webview_google_expectations_native_coverage', + 'android-pie-arm64-coverage-experimental-rel': 'android_release_bot_arm64_webview_google_native_coverage', 'android-pie-arm64-rel': 'android_release_bot_minimal_symbols_arm64_webview_google', 'android-pie-x86-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_webview_google', 'android-weblayer-x86-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_webview_google', @@ -137,7 +137,7 @@ 'android-11-x86-fyi-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_webview_google', 'android-pie-arm64-wpt-rel-non-cq': 'android_release_bot_minimal_symbols_arm64_webview_google', 'android-weblayer-pie-x86-wpt-fyi-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_webview_google', - 'android-weblayer-with-aosp-webview-x86-fyi-rel': 'android_release_bot_minimal_symbols_x86_fastbuild', + 'android-weblayer-with-aosp-webview-x86-fyi-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_resource_allowlisting_static_angle', }, 'chromium.angle': { @@ -789,7 +789,7 @@ # TODO(crbug/1182468) Remove android coverage bots after coverage is # running on CQ. 'android-pie-arm64-coverage-rel': 'android_release_trybot_arm64_webview_google_native_coverage', - 'android-pie-arm64-coverage-experimental-rel': 'android_release_trybot_arm64_webview_google_expectations_native_coverage', + 'android-pie-arm64-coverage-experimental-rel': 'android_release_trybot_arm64_webview_google_native_coverage', 'android-pie-arm64-rel': 'android_release_trybot_arm64_webview_google_expectations', 'android-pie-arm64-wpt-rel-non-cq': 'android_release_trybot_arm64_webview_google', 'android-pie-x86-rel': 'android_release_trybot_x86_fastbuild_webview_google', @@ -1382,11 +1382,6 @@ 'strip_debug_info', 'android_fastbuild', 'webview_google', ], - 'android_release_bot_minimal_symbols_x86_fastbuild': [ - 'android', 'release_bot', 'minimal_symbols', 'strip_debug_info', - 'android_fastbuild', 'x86', - ], - 'android_release_bot_minimal_symbols_arm64_webview_google': [ 'android', 'release_bot', 'minimal_symbols', 'arm64', 'strip_debug_info', 'webview_google', @@ -1397,6 +1392,11 @@ 'webview_google', ], + 'android_release_bot_minimal_symbols_x86_fastbuild_resource_allowlisting_static_angle': [ + 'android', 'release_bot', 'minimal_symbols', 'strip_debug_info', + 'android_fastbuild', 'x86', 'resource_allowlisting', 'static_angle' + ], + 'android_release_bot_minimal_symbols_x86_fastbuild_resource_allowlisting_webview_google': [ 'android', 'release_bot', 'minimal_symbols', 'x86', 'android_fastbuild', 'resource_allowlisting', 'webview_google', @@ -1432,17 +1432,17 @@ # TODO(crbug/1182468) Remove these android coverage expectations after # existing CQ bot is running them. - 'android_release_bot_arm64_webview_google_expectations_native_coverage': [ + 'android_release_bot_arm64_webview_google_native_coverage': [ 'android', 'release_bot', 'arm64', 'strip_debug_info', - 'webview_google', 'fail_on_android_expectations', + 'webview_google', 'use_clang_coverage', 'partial_code_coverage_instrumentation', ], # TODO(crbug/1182468) Remove these android coverage expectations after # existing CQ bot is running them. - 'android_release_trybot_arm64_webview_google_expectations_native_coverage': [ + 'android_release_trybot_arm64_webview_google_native_coverage': [ 'android', 'release_trybot', 'arm64', 'strip_debug_info', - 'webview_google', 'fail_on_android_expectations', + 'webview_google', 'use_clang_coverage', 'partial_code_coverage_instrumentation', ],
diff --git a/tools/mb/mb_config_expectations/chromium.android.fyi.json b/tools/mb/mb_config_expectations/chromium.android.fyi.json index b76be73..fe1aeceb 100644 --- a/tools/mb/mb_config_expectations/chromium.android.fyi.json +++ b/tools/mb/mb_config_expectations/chromium.android.fyi.json
@@ -89,6 +89,7 @@ "android-weblayer-with-aosp-webview-x86-fyi-rel": { "gn_args": { "disable_android_lint": true, + "enable_resource_allowlist_generation": true, "ffmpeg_branding": "Chrome", "is_component_build": false, "is_debug": false, @@ -98,7 +99,8 @@ "target_cpu": "x86", "target_os": "android", "use_errorprone_java_compiler": false, - "use_goma": true + "use_goma": true, + "use_static_angle": true } } } \ No newline at end of file
diff --git a/tools/mb/mb_config_expectations/chromium.android.json b/tools/mb/mb_config_expectations/chromium.android.json index a85e2b92..76ccedf 100644 --- a/tools/mb/mb_config_expectations/chromium.android.json +++ b/tools/mb/mb_config_expectations/chromium.android.json
@@ -465,7 +465,6 @@ "android-pie-arm64-coverage-experimental-rel": { "gn_args": { "coverage_instrumentation_input_file": "//.code-coverage/files_to_instrument.txt", - "fail_on_android_expectations": true, "ffmpeg_branding": "Chrome", "is_component_build": false, "is_debug": false,
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.android.json b/tools/mb/mb_config_expectations/tryserver.chromium.android.json index ba57d69..70f7463 100644 --- a/tools/mb/mb_config_expectations/tryserver.chromium.android.json +++ b/tools/mb/mb_config_expectations/tryserver.chromium.android.json
@@ -296,7 +296,6 @@ "gn_args": { "coverage_instrumentation_input_file": "//.code-coverage/files_to_instrument.txt", "dcheck_always_on": true, - "fail_on_android_expectations": true, "ffmpeg_branding": "Chrome", "is_component_build": false, "is_debug": false,
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 245e0bcf..14044354 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -5888,13 +5888,6 @@ label="Not migrated (Unexpected primary account id with email format)."/> </enum> -<enum name="AutofillOfferNotificationBubbleResult"> - <int value="0" label="User closed bubble via OK button"/> - <int value="1" label="User closed bubble via corner X"/> - <int value="2" label="User did not interact with the bubble"/> - <int value="3" label="Bubble lost focus and was deactivated"/> -</enum> - <enum name="AutofillPredictionSource"> <int value="0" label="PREDICTION_SOURCE_UNKNOWN"/> <int value="1" label="PREDICTION_SOURCE_HEURISTIC"/> @@ -23822,14 +23815,16 @@ <int value="824" label="WebAppSettings"/> <int value="825" label="DevicePciPeripheralDataAccessEnabled"/> <int value="826" label="ContextAwareAccessSignalsAllowlist"/> - <int value="827" label="FetchKeepaliveDurationOnShutdown"/> + <int value="827" label="FetchKeepaliveDurationSecondsOnShutdown"/> <int value="828" label="AllowSystemNotifications"/> - <int value="829" label="SuppressDifferentOriginSubframeJSDialogs"/> + <int value="829" label="SuppressDifferentOriginSubframeDialogs"/> <int value="830" label="DeviceBorealisAllowed"/> <int value="831" label="UserBorealisAllowed"/> <int value="832" label="LacrosSecondaryProfilesAllowed"/> <int value="833" label="GaiaLockScreenOfflineSigninTimeLimitDays"/> <int value="834" label="SamlLockScreenOfflineSigninTimeLimitDays"/> + <int value="835" label="ReportDevicePrintJobs"/> + <int value="836" label="AudioProcessHighPriorityEnabled"/> </enum> <enum name="EnterprisePolicyDeviceIdValidity"> @@ -31750,6 +31745,7 @@ <int value="3847" label="V8ScreenAdvanced_Id_AttributeGetter"/> <int value="3848" label="V8ScreenAdvanced_PointerTypes_AttributeGetter"/> <int value="3849" label="V8ScreenAdvanced_Label_AttributeGetter"/> + <int value="3850" label="PermissionsPolicyHeader"/> </enum> <enum name="FeaturePolicyAllowlistType"> @@ -38971,6 +38967,14 @@ <int value="12" label="Load image metadata"/> </enum> +<enum name="ImageSelectionOutcome"> + <int value="0" label="Image node was the topmost node."/> + <int value="1" label="Image node was below topmost node"/> + <int value="2" label="Blocking opaque node was found"/> + <int value="3" label="Context menu listener was found"/> + <int value="4" label="Blocking cross frame node was found"/> +</enum> + <enum name="ImageSmoothingQuality"> <int value="0" label="Image smoothing quality sets to None"/> <int value="1" label="Image smoothing quality sets to Low"/> @@ -44981,6 +44985,7 @@ <int value="-711890895" label="enable-website-settings-manager"/> <int value="-711422585" label="kSignInProfileCreationEnterprise:disabled"/> <int value="-709058455" label="ui-slow-animations"/> + <int value="-707407907" label="ScanAppMediaLink:enabled"/> <int value="-706733351" label="enable-floating-virtual-keyboard:enabled"/> <int value="-706159808" label="QuickAnswersOnEditableText:disabled"/> <int value="-705746939" label="ChromeDuet:enabled"/> @@ -45727,6 +45732,7 @@ <int value="-11260186" label="enable-offline-pages-as-saved-pages"/> <int value="-10709540" label="OmniboxUIExperimentHideSuggestionUrlScheme:enabled"/> + <int value="-9701088" label="ScanAppMediaLink:disabled"/> <int value="-9599490" label="KernelnextVMs:disabled"/> <int value="-9322265" label="ShowBluetoothDebugLogToggle:enabled"/> <int value="-5492723" label="CCTIncognito:enabled"/>
diff --git a/tools/metrics/histograms/histograms_xml/autofill/histograms.xml b/tools/metrics/histograms/histograms_xml/autofill/histograms.xml index e4a2f26..cf24145 100644 --- a/tools/metrics/histograms/histograms_xml/autofill/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/autofill/histograms.xml
@@ -21,16 +21,6 @@ <histograms> -<variants name="Autofill.OfferNotificationBubble.Type"> - <variant name="CardLinkedOffer" - summary="The bubble for an offer that is linked to a credit card."/> -</variants> - -<variants name="Autofill.PaymentBubble.Show"> - <variant name="FirstShow" summary="The bubble is shown for the first time."/> - <variant name="Reshows" summary="The bubble is re-shown."/> -</variants> - <histogram name="Autofill.Address.IsEnabled.PageLoad" enum="BooleanEnabled" expires_after="2021-08-09"> <owner>jsaul@google.com</owner> @@ -1319,31 +1309,6 @@ </summary> </histogram> -<histogram name="Autofill.OfferNotificationBubbleOffer.{BubbleType}" - enum="BooleanPreviouslyShown" expires_after="2021-09-01"> - <owner>siyua@chromium.org</owner> - <owner>payments-autofill-team@google.com</owner> - <summary> - Records whether the offer notification bubble is the first such offer that - the user has been shown or is reshown due to user actions. The metric is - recorded when the bubble is shown. - </summary> - <token key="BubbleType" variants="Autofill.OfferNotificationBubble.Type"/> -</histogram> - -<histogram - name="Autofill.OfferNotificationBubbleResult.{BubbleType}.{ShowType}" - enum="AutofillOfferNotificationBubbleResult" expires_after="2021-09-01"> - <owner>siyua@chromium.org</owner> - <owner>payments-autofill-team@google.com</owner> - <summary> - Records the reason for closing the offer notification bubble. Recorded when - the bubble is closed. - </summary> - <token key="BubbleType" variants="Autofill.OfferNotificationBubble.Type"/> - <token key="ShowType" variants="Autofill.PaymentBubble.Show"/> -</histogram> - <histogram name="Autofill.PageTranslationStatus" enum="Boolean" expires_after="2021-10-25"> <owner>marsin@google.com</owner>
diff --git a/tools/metrics/histograms/histograms_xml/blink/histograms.xml b/tools/metrics/histograms/histograms_xml/blink/histograms.xml index ad069bbf..ff0e041d 100644 --- a/tools/metrics/histograms/histograms_xml/blink/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/blink/histograms.xml
@@ -626,6 +626,49 @@ </summary> </histogram> +<histogram name="Blink.ContextMenu.ImageSelection.Depth" units="count" + expires_after="2021-09-05"> + <owner>benwgold@google.com</owner> + <owner>flackr@chromium.org</owner> + <summary> + The depth of the discovered image node in the hit test list when performing + a penetrating image selection search. + + Only recorded when the `EnablePenetratingImageSelection` feature is enabled + and a user long presses or right clicks a document (and an image is found). + </summary> +</histogram> + +<histogram name="Blink.ContextMenu.ImageSelection.ElapsedTime" + units="microseconds" expires_after="2021-09-05"> + <owner>benwgold@google.com</owner> + <owner>flackr@chromium.org</owner> + <summary> + The amount of time it took to iterate through the dom looking for an image + node. + + Only recorded when the `EnablePenetratingImageSelection` feature is enabled + and a user long presses or right clicks a document. + + Note: This metric drops reports on clients with low-resolution clocks, which + means these reports will be biased against a portion of the population on + Windows. See Windows.HasHighResolutionTimeTicks for the affected sample. + </summary> +</histogram> + +<histogram name="Blink.ContextMenu.ImageSelection.Outcome" + enum="ImageSelectionOutcome" expires_after="2021-09-05"> + <owner>benwgold@google.com</owner> + <owner>flackr@chromium.org</owner> + <summary> + The outcome of an image selection search that may or may not trigger the + context menu. + + Only recorded when the `EnablePenetratingImageSelection` feature is enabled + and a user long presses or right clicks a document (and an image is found). + </summary> +</histogram> + <histogram name="Blink.CookieStore.MatchType" enum="CookieStoreMatchType" expires_after="M87"> <obsolete>
diff --git a/tools/metrics/histograms/histograms_xml/borealis/histograms.xml b/tools/metrics/histograms/histograms_xml/borealis/histograms.xml index 713f40da..0cea49fc 100644 --- a/tools/metrics/histograms/histograms_xml/borealis/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/borealis/histograms.xml
@@ -24,7 +24,7 @@ <histogram name="Borealis.Install.NumAttempts" enum="BooleanAttempted" expires_after="2021-11-01"> <owner>danielng@google.com</owner> - <owner>src/chrome/browser/chromeos/borealis/OWNERS</owner> + <owner>src/chrome/browser/ash/borealis/OWNERS</owner> <summary> The number of Borealis installation attempts. This is recorded each time a user tries to install Borealis. Specifically, this metric is recorded when a @@ -37,7 +37,7 @@ <histogram name="Borealis.Install.OverallTime" units="ms" expires_after="2021-11-01"> <owner>danielng@google.com</owner> - <owner>src/chrome/browser/chromeos/borealis/OWNERS</owner> + <owner>src/chrome/browser/ash/borealis/OWNERS</owner> <summary> Time taken for a successful installation. An install starts when the "install" or "retry" installer buttons are clicked and @@ -50,7 +50,7 @@ <histogram name="Borealis.Install.Result" enum="BorealisInstallResult" expires_after="2021-11-01"> <owner>danielng@google.com</owner> - <owner>src/chrome/browser/chromeos/borealis/OWNERS</owner> + <owner>src/chrome/browser/ash/borealis/OWNERS</owner> <summary> The installation result, for example, a successful install, a cancelled install, or an error. This is recorded after an installation attempt has @@ -61,7 +61,7 @@ <histogram name="Borealis.Shutdown.Attempt" enum="BooleanAttempted" expires_after="2022-02-02"> <owner>lqu@google.com</owner> - <owner>src/chrome/browser/chromeos/borealis/OWNERS</owner> + <owner>src/chrome/browser/ash/borealis/OWNERS</owner> <summary> Recording every attempt to exit Borealis given the that VM was launched. Recorded regardless of if the shutdown is successful. @@ -81,14 +81,14 @@ <histogram name="Borealis.Startup.NumAttempts" enum="BooleanAttempted" expires_after="2021-11-01"> <owner>danielng@google.com</owner> - <owner>src/chrome/browser/chromeos/borealis/OWNERS</owner> + <owner>src/chrome/browser/ash/borealis/OWNERS</owner> <summary>Recording every attempt to start Borealis (via the UI).</summary> </histogram> <histogram name="Borealis.Startup.OverallTime" units="ms" expires_after="2021-11-01"> <owner>danielng@google.com</owner> - <owner>src/chrome/browser/chromeos/borealis/OWNERS</owner> + <owner>src/chrome/browser/ash/borealis/OWNERS</owner> <summary> Recording the time taken for each successful attempt to start Borealis (via the UI). @@ -98,7 +98,7 @@ <histogram name="Borealis.Startup.Result" enum="BorealisStartupResult" expires_after="2021-11-01"> <owner>danielng@google.com</owner> - <owner>src/chrome/browser/chromeos/borealis/OWNERS</owner> + <owner>src/chrome/browser/ash/borealis/OWNERS</owner> <summary> Recording the result of each attempt to start Borealis, whether it was successful or the error that it faced.
diff --git a/tools/metrics/histograms/histograms_xml/download/histograms.xml b/tools/metrics/histograms/histograms_xml/download/histograms.xml index 2001ae7..fac7cd03 100644 --- a/tools/metrics/histograms/histograms_xml/download/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/download/histograms.xml
@@ -960,7 +960,7 @@ </histogram> <histogram name="Download.ShowedDownloadWarning" enum="DownloadItem.DangerType" - expires_after="2021-08-22"> + expires_after="2022-03-08"> <owner>drubery@chromium.org</owner> <owner>chrome-safebrowsing-alerts@chromium.org</owner> <summary> @@ -968,6 +968,8 @@ be shown on the shelf, e.g., if chrome://downloads is already open when the download completes, or if an extension is using the downloads API. Grouped by the type of danger. + + This metric is used to populate a dashboard on go/crsb-site. </summary> </histogram> @@ -1009,12 +1011,14 @@ </histogram> <histogram name="Download.UserValidatedDangerousDownload" - enum="DownloadItem.DangerType" expires_after="2021-08-22"> + enum="DownloadItem.DangerType" expires_after="2022-03-08"> <owner>drubery@chromium.org</owner> <owner>chrome-safebrowsing-team@chromium.org</owner> <summary> User chose to save a download which was marked dangerous. Grouped by the type of danger. + + This metric is used to populate a dashboard on go/crsb-site. </summary> </histogram>
diff --git a/tools/metrics/histograms/histograms_xml/interstitial/histograms.xml b/tools/metrics/histograms/histograms_xml/interstitial/histograms.xml index 84f35607..07ebb91 100644 --- a/tools/metrics/histograms/histograms_xml/interstitial/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/interstitial/histograms.xml
@@ -40,6 +40,8 @@ are split into their own entries from phishing*. As of M90, social_engineering_ads* and social_engineering_landing* interstitial reasons have been removed because they don't trigger interstitials. + + This metric is used to populate a dashboard on go/crsb-site. </summary> </histogram>
diff --git a/tools/metrics/histograms/histograms_xml/others/histograms.xml b/tools/metrics/histograms/histograms_xml/others/histograms.xml index 977a9830..2212fa39 100644 --- a/tools/metrics/histograms/histograms_xml/others/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/others/histograms.xml
@@ -13632,25 +13632,12 @@ <summary>Win32 APIs that error out during setup.</summary> </histogram> -<histogram name="SharedHighlights.AsyncTask.Iterations" units="iterations" +<histogram name="SharedHighlights.LinkGenerated" units="BooleanSuccess" expires_after="2021-07-11"> <owner>gayane@chromium.org</owner> <owner>chrome-shared-highlighting@google.com</owner> <summary> - Indicates number of iterations it took for AsyncFindBuffer to finish the - search. AsyncFindBuffer is used only for validating generated text fragment - selectors for Shared Highlighting. - </summary> -</histogram> - -<histogram name="SharedHighlights.AsyncTask.SearchDuration" units="ms" - expires_after="2021-07-11"> - <owner>gayane@chromium.org</owner> - <owner>chrome-shared-highlighting@google.com</owner> - <summary> - Time it took in milliseconds for AsyncFindBuffer to finish the search. - AsyncFindBuffer is used only for validating generated text fragment - selectors for Shared Highlighting. + Indicates whether text fragment selector generation was successful. </summary> </histogram> @@ -13659,9 +13646,7 @@ <owner>gayane@chromium.org</owner> <owner>chrome-shared-highlighting@google.com</owner> <summary> - Records errors that caused text fragment selector generation to fail. - Recorded for all the failed link generation runs. This histogram is a - superset of |SharedHighlights.LinkGenerated.Error.Requested|. + Indicates error that caused text fragment selector generation to fail. </summary> </histogram> @@ -13675,16 +13660,6 @@ </summary> </histogram> -<histogram name="SharedHighlights.LinkGenerated.Error.Requested" - enum="LinkGenerationError" expires_after="2021-07-11"> - <owner>gayane@chromium.org</owner> - <owner>chrome-shared-highlighting@google.com</owner> - <summary> - Records errors that caused text fragment selector generation to fail. - Recorded only for failure cases that were requested by users. - </summary> -</histogram> - <histogram name="SharedHighlights.LinkGenerated.Error.TimeToGenerate" units="ms" expires_after="2021-07-11"> <owner>gayane@chromium.org</owner> @@ -13747,23 +13722,6 @@ </summary> </histogram> -<histogram name="SharedHighlights.LinkGenerated{Requested}" - units="BooleanSuccess" expires_after="2021-07-11"> - <owner>gayane@chromium.org</owner> - <owner>chrome-shared-highlighting@google.com</owner> - <summary> - Indicates whether text fragment selector generation was successful for - {Requested}. - </summary> - <token key="Requested"> - <variant name="" summary="all cases"/> - <variant name=".RequestedAfterReady" - summary="cases when selector is requested after its ready."/> - <variant name=".RequestedBeforeReady" - summary="cases when selector is requested before its ready."/> - </token> -</histogram> - <histogram name="SharedMemory.MapBlockedForSecurity" enum="BooleanBlocked" expires_after="M85"> <owner>dcheng@chromium.org</owner>
diff --git a/tools/metrics/histograms/histograms_xml/page/histograms.xml b/tools/metrics/histograms/histograms_xml/page/histograms.xml index 7982be9..b85815cc 100644 --- a/tools/metrics/histograms/histograms_xml/page/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/page/histograms.xml
@@ -156,7 +156,7 @@ </histogram> <histogram name="PageLoad.Clients.Ads.AllPages.PercentTotalBytesAds" units="%" - expires_after="2021-03-28"> + expires_after="2022-03-28"> <owner>alexmt@chromium.org</owner> <owner>johnidel@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/histograms_xml/safe_browsing/histograms.xml b/tools/metrics/histograms/histograms_xml/safe_browsing/histograms.xml index 3f44c1e7..39f0876 100644 --- a/tools/metrics/histograms/histograms_xml/safe_browsing/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/safe_browsing/histograms.xml
@@ -129,7 +129,7 @@ <histogram name="SafeBrowsing.BrowserThrottle.IsCheckCompletedOnProcessResponse" - enum="BooleanCompleted" expires_after="2021-10-30"> + enum="BooleanCompleted" expires_after="2022-03-08"> <owner>xinghuilu@chromium.org</owner> <owner>chrome-safebrowsing-alerts@google.com</owner> <summary> @@ -137,6 +137,8 @@ to process a response. If not, the URL loader will be deferred until the Safe Browsing check is completed. Logs each time the URL loader dispatches WillProcessResponse() and the Safe Browsing check doesn't block the URL. + + This metric is used to populate a dashboard on go/crsb-site. </summary> </histogram> @@ -910,32 +912,38 @@ </histogram> <histogram name="SafeBrowsing.Pref.Enhanced" enum="BooleanEnabled" - expires_after="2021-08-09"> + expires_after="2022-03-08"> <owner>bdea@chromium.org</owner> <owner>chrome-safebrowsing-alerts@google.com</owner> <summary> Whether the Safe Browsing enhanced protection service is currently enabled. Recorded for all non-Incognito profiles on profile startup. + + This metric is used to populate a dashboard on go/crsb-site. </summary> </histogram> <histogram name="SafeBrowsing.Pref.Extended" enum="BooleanEnabled" - expires_after="2021-08-09"> + expires_after="2022-03-08"> <owner>vakh@chromium.org</owner> <owner>chrome-safebrowsing-alerts@google.com</owner> <summary> Whether the Safe Browsing extended reporting service is currently enabled. Recorded for all non-Incognito profiles on profile startup. + + This metric is used to populate a dashboard on go/crsb-site. </summary> </histogram> <histogram name="SafeBrowsing.Pref.General" enum="BooleanEnabled" - expires_after="2021-08-09"> + expires_after="2022-03-08"> <owner>vakh@chromium.org</owner> <owner>chrome-safebrowsing-alerts@google.com</owner> <summary> Whether the Safe Browsing service is currently enabled. Recorded for all non-Incognito profiles on profile startup. + + This metric is used to populate a dashboard on go/crsb-site. </summary> </histogram>
diff --git a/tools/metrics/histograms/histograms_xml/sb_client/histograms.xml b/tools/metrics/histograms/histograms_xml/sb_client/histograms.xml index 29a57ee..26fa3fc 100644 --- a/tools/metrics/histograms/histograms_xml/sb_client/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/sb_client/histograms.xml
@@ -22,17 +22,19 @@ <histograms> <histogram name="SBClientDownload.CheckDownloadStats" - enum="SBClientDownloadCheckDownloadStats" expires_after="2021-08-15"> + enum="SBClientDownloadCheckDownloadStats" expires_after="2022-03-08"> <owner>vakh@chromium.org</owner> <owner>chrome-safebrowsing-alerts@google.com</owner> <owner>mattm@chromium.org</owner> <summary> - Records a histogram of the reason why downloads are marked as being - malicious or clean by the improved SafeBrowsing binary download protection. - Note that UNSUPPORTED_URL_SCHEME was split out of the INVALID_URL bucket in - M41. The NOT_BINARY_FILE check was moved before the UNSUPPORTED_URL_SCHEME - check in M42. The WHITELISTED_URL check was moved to before NOT_BINARY_FILE - in M62. + Records the reason why downloads are marked as being malicious or clean by + the improved SafeBrowsing binary download protection. Note that + UNSUPPORTED_URL_SCHEME was split out of the INVALID_URL bucket in M41. The + NOT_BINARY_FILE check was moved before the UNSUPPORTED_URL_SCHEME check in + M42. The WHITELISTED_URL check was moved to before NOT_BINARY_FILE in M62. + This is logged after after download scanned by Safe Browsing. + + This metric is used to populate a dashboard on go/crsb-site. </summary> </histogram> @@ -300,7 +302,7 @@ </histogram> <histogram name="SBClientPhishing.ClassificationStart" enum="BooleanHit" - expires_after="2021-07-18"> + expires_after="2022-03-08"> <owner>vakh@chromium.org</owner> <owner>chrome-safebrowsing-alerts@google.com</owner> <summary> @@ -308,6 +310,8 @@ number of top page navigations by users with SBClientPhishing enabled). The name is slightly misleading as it is recorded before "Preclassification" happens. + + This metric is used to populate a dashboard on go/crsb-site. </summary> </histogram> @@ -437,13 +441,15 @@ </histogram> <histogram name="SBClientPhishing.LocalModelDetectsPhishing" - enum="BooleanIsPhishing" expires_after="2021-09-17"> + enum="BooleanIsPhishing" expires_after="2022-03-08"> <owner>drubery@chromium.org</owner> <owner>chrome-safebrowsing-alerts@google.com</owner> <summary> Records whether the local phishing detection model detects phishing. This histogram is logged each time the model is run (roughly on every navigation to a non-allowlisted site) + + This metric is used to populate a dashboard on go/crsb-site. </summary> </histogram> @@ -471,10 +477,16 @@ </histogram> <histogram name="SBClientPhishing.PhishingDetectorResult" - enum="ClientSidePhishingResult" expires_after="2021-08-08"> + enum="ClientSidePhishingResult" expires_after="2022-03-08"> <owner>drubery@chromium.org</owner> <owner>chrome-safebrowsing-alerts@google.com</owner> - <summary>The result enum received from the renderer-side classifier</summary> + <summary> + The result enum received from the renderer-side classifier. This is recorded + after every renderer classification (roughly every page load not on the + allowlist). + + This metric is used to populate a dashboard on go/crsb-site. + </summary> </histogram> <histogram name="SBClientPhishing.PreClassificationCheckResult" @@ -535,13 +547,15 @@ </histogram> <histogram name="SBClientPhishing.ServerModelDetectsPhishing" - enum="BooleanIsPhishing" expires_after="2021-09-17"> + enum="BooleanIsPhishing" expires_after="2022-03-08"> <owner>drubery@chromium.org</owner> <owner>chrome-safebrowsing-alerts@google.com</owner> <summary> Records whether the server-side phishing detection model detects phishing. This histogram is logged each time we contact Safe Browsing to evaluate whether a site is phishing. + + This metric is used to populate a dashboard on go/crsb-site. </summary> </histogram>
diff --git a/tools/metrics/histograms/histograms_xml/uma/histograms.xml b/tools/metrics/histograms/histograms_xml/uma/histograms.xml index 5d910d9..3feea2cf 100644 --- a/tools/metrics/histograms/histograms_xml/uma/histograms.xml +++ b/tools/metrics/histograms/histograms_xml/uma/histograms.xml
@@ -287,7 +287,7 @@ </histogram> <histogram name="UMA.LogUpload.ResponseOrErrorCode.HTTP" - enum="CombinedHttpResponseAndNetErrorCode" expires_after="2021-04-15"> + enum="CombinedHttpResponseAndNetErrorCode" expires_after="2021-08-22"> <owner>holte@chromium.org</owner> <owner>asvitkine@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner>
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml index 7ec0cde..41a1f66f 100644 --- a/tools/metrics/ukm/ukm.xml +++ b/tools/metrics/ukm/ukm.xml
@@ -1929,6 +1929,22 @@ </metric> </event> +<event name="Blink.ContextMenu.ImageSelection"> + <owner>benwgold@google.com</owner> + <owner>flackr@chromium.org</owner> + <summary> + Sent when a user long presses or right clicks a document (and that an image + is found). Requires that the `EnablePenetratingImageSelection` feature is + enabled together with a `logUkm` specific finch param. + </summary> + <metric name="Outcome" enum="ImageSelectionOutcome"> + <summary> + Emits an integer id for a selection corresponding to the + ImageSelectionOutcome enum defined in Blink's context_menu_controller.h. + </summary> + </metric> +</event> + <event name="Blink.FindInPage" singular="True"> <owner>vmpstr@chromium.org</owner> <owner>chrishtr@chromium.org</owner>
diff --git a/tools/perf/core/bot_platforms.py b/tools/perf/core/bot_platforms.py index 9068304..a70837c4 100644 --- a/tools/perf/core/bot_platforms.py +++ b/tools/perf/core/bot_platforms.py
@@ -617,7 +617,7 @@ 'linux-perf-calibration', 'Ubuntu-18.04, 8 core, NVIDIA Quadro P400', _LINUX_PERF_CALIBRATION_BENCHMARK_CONFIGS, - 31, + 28, 'linux', is_calibration=True)
diff --git a/tools/perf/core/shard_maps/linux-perf-calibration_map.json b/tools/perf/core/shard_maps/linux-perf-calibration_map.json index 611fa37..ccdb7f1 100644 --- a/tools/perf/core/shard_maps/linux-perf-calibration_map.json +++ b/tools/perf/core/shard_maps/linux-perf-calibration_map.json
@@ -195,19 +195,10 @@ } } }, - "28": { - "benchmarks": {} - }, - "29": { - "benchmarks": {} - }, - "30": { - "benchmarks": {} - }, "extra_infos": { "num_stories": 1, - "predicted_min_shard_time": 0, - "predicted_min_shard_index": 28, + "predicted_min_shard_time": 63.0, + "predicted_min_shard_index": 0, "predicted_max_shard_time": 63.0, "predicted_max_shard_index": 0, "shard #0": 63.0, @@ -237,9 +228,6 @@ "shard #24": 63.0, "shard #25": 63.0, "shard #26": 63.0, - "shard #27": 63.0, - "shard #28": 0, - "shard #29": 0, - "shard #30": 0 + "shard #27": 63.0 } } \ No newline at end of file
diff --git a/ui/aura/BUILD.gn b/ui/aura/BUILD.gn index 22d0ec9..38f9f4f 100644 --- a/ui/aura/BUILD.gn +++ b/ui/aura/BUILD.gn
@@ -374,6 +374,13 @@ deps += [ "//ui/ozone" ] } + if (is_fuchsia) { + additional_manifests = [ + "//build/config/fuchsia/test/present_capabilities.test-cmx", + "//build/config/fuchsia/test/view_creation_capabilities.test-cmx", + ] + } + data_deps = [ "//third_party/mesa_headers" ] }
diff --git a/ui/compositor/BUILD.gn b/ui/compositor/BUILD.gn index 75b4168ed..61a99fd 100644 --- a/ui/compositor/BUILD.gn +++ b/ui/compositor/BUILD.gn
@@ -275,4 +275,14 @@ if (is_linux || is_chromeos) { deps += [ "//third_party/mesa_headers" ] } + + if (is_fuchsia) { + additional_manifests = [ + # TODO(crbug.com/1185811): Figure out why jit_capabilities is needed. + "//build/config/fuchsia/test/jit_capabilities.test-cmx", + + "//build/config/fuchsia/test/present_capabilities.test-cmx", + "//build/config/fuchsia/test/view_creation_capabilities.test-cmx", + ] + } }
diff --git a/ui/gfx/animation/keyframe/BUILD.gn b/ui/gfx/animation/keyframe/BUILD.gn index d49e385..de625052 100644 --- a/ui/gfx/animation/keyframe/BUILD.gn +++ b/ui/gfx/animation/keyframe/BUILD.gn
@@ -26,6 +26,7 @@ "keyframe_effect.h", "keyframe_model.cc", "keyframe_model.h", + "keyframed_animation_curve-inl.h", "keyframed_animation_curve.cc", "keyframed_animation_curve.h", "target_property.h",
diff --git a/ui/gfx/animation/keyframe/keyframe_effect.cc b/ui/gfx/animation/keyframe/keyframe_effect.cc index 84b0f11..a08825df 100644 --- a/ui/gfx/animation/keyframe/keyframe_effect.cc +++ b/ui/gfx/animation/keyframe/keyframe_effect.cc
@@ -223,6 +223,10 @@ }); } +void KeyframeEffect::RemoveAllKeyframeModels() { + keyframe_models_.clear(); +} + void KeyframeEffect::Tick(base::TimeTicks monotonic_time) { TickInternal(monotonic_time, true); } @@ -331,6 +335,10 @@ return false; } +bool KeyframeEffect::IsAnimating() const { + return !keyframe_models_.empty(); +} + float KeyframeEffect::GetTargetFloatValue(int target_property, float default_value) const { return GetTargetValue<float>(target_property, default_value);
diff --git a/ui/gfx/animation/keyframe/keyframe_effect.h b/ui/gfx/animation/keyframe/keyframe_effect.h index 6894cad..ea3805c 100644 --- a/ui/gfx/animation/keyframe/keyframe_effect.h +++ b/ui/gfx/animation/keyframe/keyframe_effect.h
@@ -46,6 +46,7 @@ void AddKeyframeModel(std::unique_ptr<KeyframeModel> keyframe_model); void RemoveKeyframeModel(int keyframe_model_id); void RemoveKeyframeModels(int target_property); + void RemoveAllKeyframeModels(); void Tick(base::TimeTicks monotonic_time); @@ -88,6 +89,7 @@ SkColor to); bool IsAnimatingProperty(int property) const; + bool IsAnimating() const; float GetTargetFloatValue(int target_property, float default_value) const; gfx::TransformOperations GetTargetTransformOperationsValue(
diff --git a/ui/gfx/animation/keyframe/keyframed_animation_curve-inl.h b/ui/gfx/animation/keyframe/keyframed_animation_curve-inl.h new file mode 100644 index 0000000..ac226f6 --- /dev/null +++ b/ui/gfx/animation/keyframe/keyframed_animation_curve-inl.h
@@ -0,0 +1,148 @@ +// Copyright 2021 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_GFX_ANIMATION_KEYFRAME_KEYFRAMED_ANIMATION_CURVE_INL_H_ +#define UI_GFX_ANIMATION_KEYFRAME_KEYFRAMED_ANIMATION_CURVE_INL_H_ + +namespace { + +template <class KeyframeType> +void InsertKeyframe(std::unique_ptr<KeyframeType> keyframe, + std::vector<std::unique_ptr<KeyframeType>>* keyframes) { + // Usually, the keyframes will be added in order, so this loop would be + // unnecessary and we should skip it if possible. + if (!keyframes->empty() && keyframe->Time() < keyframes->back()->Time()) { + for (size_t i = 0; i < keyframes->size(); ++i) { + if (keyframe->Time() < keyframes->at(i)->Time()) { + keyframes->insert(keyframes->begin() + i, std::move(keyframe)); + return; + } + } + } + + keyframes->push_back(std::move(keyframe)); +} + +struct TimeValues { + base::TimeDelta start_time; + base::TimeDelta duration; + double progress; +}; + +template <typename KeyframeType> +TimeValues GetTimeValues(const KeyframeType& start_frame, + const KeyframeType& end_frame, + double scaled_duration, + base::TimeDelta time) { + TimeValues values; + values.start_time = start_frame.Time() * scaled_duration; + values.duration = (end_frame.Time() * scaled_duration) - values.start_time; + const base::TimeDelta elapsed = time - values.start_time; + values.progress = (elapsed.is_inf() || values.duration.is_zero()) + ? 1.0 + : (elapsed / values.duration); + return values; +} + +template <typename KeyframeType> +base::TimeDelta TransformedAnimationTime( + const std::vector<std::unique_ptr<KeyframeType>>& keyframes, + const std::unique_ptr<gfx::TimingFunction>& timing_function, + double scaled_duration, + base::TimeDelta time) { + if (timing_function) { + const auto values = GetTimeValues(*keyframes.front(), *keyframes.back(), + scaled_duration, time); + time = (values.duration * timing_function->GetValue(values.progress)) + + values.start_time; + } + + return time; +} + +template <typename KeyframeType> +size_t GetActiveKeyframe( + const std::vector<std::unique_ptr<KeyframeType>>& keyframes, + double scaled_duration, + base::TimeDelta time) { + DCHECK_GE(keyframes.size(), 2ul); + size_t i = 0; + while ((i < keyframes.size() - 2) && // Last keyframe is never active. + (time >= (keyframes[i + 1]->Time() * scaled_duration))) + ++i; + + return i; +} + +template <typename KeyframeType> +double TransformedKeyframeProgress( + const std::vector<std::unique_ptr<KeyframeType>>& keyframes, + double scaled_duration, + base::TimeDelta time, + size_t i) { + const double progress = + GetTimeValues(*keyframes[i], *keyframes[i + 1], scaled_duration, time) + .progress; + return keyframes[i]->timing_function() + ? keyframes[i]->timing_function()->GetValue(progress) + : progress; +} + +int GetTimingFunctionSteps(const gfx::TimingFunction* timing_function) { + DCHECK(timing_function && + timing_function->GetType() == gfx::TimingFunction::Type::STEPS); + const gfx::StepsTimingFunction* steps_timing_function = + reinterpret_cast<const gfx::StepsTimingFunction*>(timing_function); + DCHECK(steps_timing_function); + return steps_timing_function->steps(); +} + +template <class KeyframeType> +base::TimeDelta ComputeTickInterval( + const std::unique_ptr<gfx::TimingFunction>& timing_function, + double scaled_duration, + const std::vector<std::unique_ptr<KeyframeType>>& keyframes) { + // TODO(crbug.com/1140603): include animation progress in order to pinpoint + // which keyframe's timing function is in effect at any point in time. + DCHECK_LT(0u, keyframes.size()); + gfx::TimingFunction::Type timing_function_type = + timing_function ? timing_function->GetType() + : gfx::TimingFunction::Type::LINEAR; + // Even if the keyframe's have step timing functions, a non-linear + // animation-wide timing function results in unevenly timed steps. + switch (timing_function_type) { + case gfx::TimingFunction::Type::LINEAR: { + base::TimeDelta min_interval = base::TimeDelta::Max(); + // If any keyframe uses non-step "easing", return 0, except for the last + // keyframe, whose "easing" is never used. + for (size_t ii = 0; ii < keyframes.size() - 1; ++ii) { + KeyframeType* keyframe = keyframes[ii].get(); + if (!keyframe->timing_function() || + keyframe->timing_function()->GetType() != + gfx::TimingFunction::Type::STEPS) { + return base::TimeDelta(); + } + KeyframeType* next_keyframe = keyframes[ii + 1].get(); + int steps = GetTimingFunctionSteps(keyframe->timing_function()); + DCHECK_LT(0, steps); + base::TimeDelta interval = (next_keyframe->Time() - keyframe->Time()) * + scaled_duration / steps; + if (interval < min_interval) + min_interval = interval; + } + return min_interval; + } + case gfx::TimingFunction::Type::STEPS: { + return (keyframes.back()->Time() - keyframes.front()->Time()) * + scaled_duration / GetTimingFunctionSteps(timing_function.get()); + } + case gfx::TimingFunction::Type::CUBIC_BEZIER: + break; + } + return base::TimeDelta(); +} + +} // namespace + +#endif // UI_GFX_ANIMATION_KEYFRAME_KEYFRAMED_ANIMATION_CURVE_INL_H_
diff --git a/ui/gfx/animation/keyframe/keyframed_animation_curve.cc b/ui/gfx/animation/keyframe/keyframed_animation_curve.cc index 6ff3361..c08f646 100644 --- a/ui/gfx/animation/keyframe/keyframed_animation_curve.cc +++ b/ui/gfx/animation/keyframe/keyframed_animation_curve.cc
@@ -11,151 +11,12 @@ #include <utility> #include "base/memory/ptr_util.h" +#include "ui/gfx/animation/keyframe/keyframed_animation_curve-inl.h" #include "ui/gfx/animation/tween.h" #include "ui/gfx/geometry/box_f.h" namespace gfx { -namespace { - -template <class KeyframeType> -void InsertKeyframe(std::unique_ptr<KeyframeType> keyframe, - std::vector<std::unique_ptr<KeyframeType>>* keyframes) { - // Usually, the keyframes will be added in order, so this loop would be - // unnecessary and we should skip it if possible. - if (!keyframes->empty() && keyframe->Time() < keyframes->back()->Time()) { - for (size_t i = 0; i < keyframes->size(); ++i) { - if (keyframe->Time() < keyframes->at(i)->Time()) { - keyframes->insert(keyframes->begin() + i, std::move(keyframe)); - return; - } - } - } - - keyframes->push_back(std::move(keyframe)); -} - -struct TimeValues { - base::TimeDelta start_time; - base::TimeDelta duration; - double progress; -}; - -template <typename KeyframeType> -TimeValues GetTimeValues(const KeyframeType& start_frame, - const KeyframeType& end_frame, - double scaled_duration, - base::TimeDelta time) { - TimeValues values; - values.start_time = start_frame.Time() * scaled_duration; - values.duration = (end_frame.Time() * scaled_duration) - values.start_time; - const base::TimeDelta elapsed = time - values.start_time; - values.progress = (elapsed.is_inf() || values.duration.is_zero()) - ? 1.0 - : (elapsed / values.duration); - return values; -} - -template <typename KeyframeType> -base::TimeDelta TransformedAnimationTime( - const std::vector<std::unique_ptr<KeyframeType>>& keyframes, - const std::unique_ptr<TimingFunction>& timing_function, - double scaled_duration, - base::TimeDelta time) { - if (timing_function) { - const auto values = GetTimeValues(*keyframes.front(), *keyframes.back(), - scaled_duration, time); - time = (values.duration * timing_function->GetValue(values.progress)) + - values.start_time; - } - - return time; -} - -template <typename KeyframeType> -size_t GetActiveKeyframe( - const std::vector<std::unique_ptr<KeyframeType>>& keyframes, - double scaled_duration, - base::TimeDelta time) { - DCHECK_GE(keyframes.size(), 2ul); - size_t i = 0; - while ((i < keyframes.size() - 2) && // Last keyframe is never active. - (time >= (keyframes[i + 1]->Time() * scaled_duration))) - ++i; - - return i; -} - -template <typename KeyframeType> -double TransformedKeyframeProgress( - const std::vector<std::unique_ptr<KeyframeType>>& keyframes, - double scaled_duration, - base::TimeDelta time, - size_t i) { - const double progress = - GetTimeValues(*keyframes[i], *keyframes[i + 1], scaled_duration, time) - .progress; - return keyframes[i]->timing_function() - ? keyframes[i]->timing_function()->GetValue(progress) - : progress; -} - -int GetTimingFunctionSteps(const TimingFunction* timing_function) { - DCHECK(timing_function && - timing_function->GetType() == TimingFunction::Type::STEPS); - const StepsTimingFunction* steps_timing_function = - reinterpret_cast<const StepsTimingFunction*>(timing_function); - DCHECK(steps_timing_function); - return steps_timing_function->steps(); -} - -template <class KeyframeType> -base::TimeDelta ComputeTickInterval( - const std::unique_ptr<TimingFunction>& timing_function, - double scaled_duration, - const std::vector<std::unique_ptr<KeyframeType>>& keyframes) { - // TODO(crbug.com/1140603): include animation progress in order to pinpoint - // which keyframe's timing function is in effect at any point in time. - DCHECK_LT(0u, keyframes.size()); - TimingFunction::Type timing_function_type = - timing_function ? timing_function->GetType() - : TimingFunction::Type::LINEAR; - // Even if the keyframe's have step timing functions, a non-linear - // animation-wide timing function results in unevenly timed steps. - switch (timing_function_type) { - case TimingFunction::Type::LINEAR: { - base::TimeDelta min_interval = base::TimeDelta::Max(); - // If any keyframe uses non-step "easing", return 0, except for the last - // keyframe, whose "easing" is never used. - for (size_t ii = 0; ii < keyframes.size() - 1; ++ii) { - KeyframeType* keyframe = keyframes[ii].get(); - if (!keyframe->timing_function() || - keyframe->timing_function()->GetType() != - TimingFunction::Type::STEPS) { - return base::TimeDelta(); - } - KeyframeType* next_keyframe = keyframes[ii + 1].get(); - int steps = GetTimingFunctionSteps(keyframe->timing_function()); - DCHECK_LT(0, steps); - base::TimeDelta interval = (next_keyframe->Time() - keyframe->Time()) * - scaled_duration / steps; - if (interval < min_interval) - min_interval = interval; - } - return min_interval; - } - case TimingFunction::Type::STEPS: { - return (keyframes.back()->Time() - keyframes.front()->Time()) * - scaled_duration / GetTimingFunctionSteps(timing_function.get()); - } - case TimingFunction::Type::CUBIC_BEZIER: - break; - } - return base::TimeDelta(); -} - -} // namespace - Keyframe::Keyframe(base::TimeDelta time, std::unique_ptr<TimingFunction> timing_function) : time_(time), timing_function_(std::move(timing_function)) {}
diff --git a/ui/gl/gl_surface.cc b/ui/gl/gl_surface.cc index 3f60bf4..6ed239b 100644 --- a/ui/gl/gl_surface.cc +++ b/ui/gl/gl_surface.cc
@@ -545,7 +545,7 @@ return surface_->SupportsDelegatedInk(); } -GLSurfaceAdapter::~GLSurfaceAdapter() {} +GLSurfaceAdapter::~GLSurfaceAdapter() = default; scoped_refptr<GLSurface> InitializeGLSurfaceWithFormat( scoped_refptr<GLSurface> surface, GLSurfaceFormat format) {
diff --git a/ui/gl/gl_surface_egl.cc b/ui/gl/gl_surface_egl.cc index d6ca1917..1dc9306 100644 --- a/ui/gl/gl_surface_egl.cc +++ b/ui/gl/gl_surface_egl.cc
@@ -1013,16 +1013,26 @@ g_egl_robust_resource_init_supported = HasEGLExtension("EGL_ANGLE_robust_resource_initialization"); - // TODO(oetuaho@nvidia.com): Surfaceless is disabled on Android as a temporary - // workaround, since code written for Android WebView takes different paths - // based on whether GL surface objects have underlying EGL surface handles, - // conflicting with the use of surfaceless. See https://crbug.com/382349 -#if defined(OS_ANDROID) - DCHECK(!g_egl_surfaceless_context_supported); -#else // Check if SurfacelessEGL is supported. g_egl_surfaceless_context_supported = HasEGLExtension("EGL_KHR_surfaceless_context"); + + // TODO(oetuaho@nvidia.com): Surfaceless is disabled on Android as a temporary + // workaround, since code written for Android WebView takes different paths + // based on whether GL surface objects have underlying EGL surface handles, + // conflicting with the use of surfaceless. ANGLE can still expose surfacelss + // because it is emulated with pbuffers if native support is not present. See + // https://crbug.com/382349. + +#if defined(OS_ANDROID) + // Use the WebGL compatibility extension for detecting ANGLE. ANGLE always + // exposes it. + bool is_angle = g_egl_create_context_webgl_compatability_supported; + if (!is_angle) { + g_egl_surfaceless_context_supported = false; + } +#endif + if (g_egl_surfaceless_context_supported) { // EGL_KHR_surfaceless_context is supported but ensure // GL_OES_surfaceless_context is also supported. We need a current context @@ -1040,7 +1050,6 @@ context->ReleaseCurrent(surface.get()); } } -#endif // The native fence sync extension is a bit complicated. It's reported as // present for ChromeOS, but Android currently doesn't report this extension
diff --git a/ui/snapshot/BUILD.gn b/ui/snapshot/BUILD.gn index 73e9cda..e11413b 100644 --- a/ui/snapshot/BUILD.gn +++ b/ui/snapshot/BUILD.gn
@@ -117,4 +117,14 @@ "//ui/wm", ] } + + if (is_fuchsia) { + additional_manifests = [ + # TODO(crbug.com/1185811): Figure out why jit_capabilities is needed. + "//build/config/fuchsia/test/jit_capabilities.test-cmx", + + "//build/config/fuchsia/test/present_capabilities.test-cmx", + "//build/config/fuchsia/test/view_creation_capabilities.test-cmx", + ] + } }
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc index 7476de34..db51c4a6 100644 --- a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc +++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc
@@ -878,7 +878,6 @@ void DesktopWindowTreeHostWin::HandleMove() { CheckForMonitorChange(); - native_widget_delegate_->OnNativeWidgetMove(); OnHostMovedInPixels(GetBoundsInPixels().origin()); }
diff --git a/ui/views/widget/widget_unittest.cc b/ui/views/widget/widget_unittest.cc index 113aa30..5705d56 100644 --- a/ui/views/widget/widget_unittest.cc +++ b/ui/views/widget/widget_unittest.cc
@@ -1143,36 +1143,29 @@ const int moves_during_init = delegate.move_count(); -#if defined(OS_WIN) - // Windows reliably notifies twice per origin change. https://crbug.com/864938 - constexpr int kDeltaPerMove = 2; -#else - constexpr int kDeltaPerMove = 1; -#endif - // Resize without changing origin. No move. widget->SetBounds(gfx::Rect(100, 100, 310, 210)); EXPECT_EQ(moves_during_init, delegate.move_count()); // Move without changing size. Moves. widget->SetBounds(gfx::Rect(110, 110, 310, 210)); - EXPECT_EQ(moves_during_init + kDeltaPerMove, delegate.move_count()); + EXPECT_EQ(moves_during_init + 1, delegate.move_count()); // Changing both moves. widget->SetBounds(gfx::Rect(90, 90, 330, 230)); - EXPECT_EQ(moves_during_init + 2 * kDeltaPerMove, delegate.move_count()); + EXPECT_EQ(moves_during_init + 2, delegate.move_count()); // Just grow vertically. On Mac, this changes the AppKit origin since it is // from the bottom left of the screen, but there is no move as far as views is // concerned. widget->SetBounds(gfx::Rect(90, 90, 330, 240)); // No change. - EXPECT_EQ(moves_during_init + 2 * kDeltaPerMove, delegate.move_count()); + EXPECT_EQ(moves_during_init + 2, delegate.move_count()); // For a similar reason, move the widget down by the same amount that it grows // vertically. The AppKit origin does not change, but it is a move. widget->SetBounds(gfx::Rect(90, 100, 330, 250)); - EXPECT_EQ(moves_during_init + 3 * kDeltaPerMove, delegate.move_count()); + EXPECT_EQ(moves_during_init + 3, delegate.move_count()); } // Test correct behavior when widgets close themselves in response to visibility
diff --git a/ui/webui/resources/cr_components/chromeos/cellular_setup/button_bar.html b/ui/webui/resources/cr_components/chromeos/cellular_setup/button_bar.html index 54b88a7..65323d3 100644 --- a/ui/webui/resources/cr_components/chromeos/cellular_setup/button_bar.html +++ b/ui/webui/resources/cr_components/chromeos/cellular_setup/button_bar.html
@@ -38,13 +38,6 @@ hidden$="[[isButtonHidden_(Button.CANCEL, buttonState.*)]]"> [[i18n('cancel')]] </cr-button> - <cr-button id="tryAgain" - class="action-button" - on-click="onTryAgainButtonClicked_" - disabled="[[isButtonDisabled_(Button.TRY_AGAIN, buttonState.*)]]" - hidden$="[[isButtonHidden_(Button.TRY_AGAIN, buttonState.*)]]"> - [[i18n('tryAgain')]] - </cr-button> <cr-button id="forward" class="action-button" on-click="onForwardButtonClicked_"
diff --git a/ui/webui/resources/cr_components/chromeos/cellular_setup/button_bar.js b/ui/webui/resources/cr_components/chromeos/cellular_setup/button_bar.js index 21dd2c9d..cee0ba0 100644 --- a/ui/webui/resources/cr_components/chromeos/cellular_setup/button_bar.js +++ b/ui/webui/resources/cr_components/chromeos/cellular_setup/button_bar.js
@@ -76,11 +76,6 @@ }, /** @private */ - onTryAgainButtonClicked_() { - this.fire('retry-requested'); - }, - - /** @private */ onForwardButtonClicked_() { this.fire('forward-nav-requested'); }, @@ -99,8 +94,6 @@ return this.buttonState.cancel; case cellularSetup.Button.FORWARD: return this.buttonState.forward; - case cellularSetup.Button.TRY_AGAIN: - return this.buttonState.tryAgain; default: assertNotReached(); return cellularSetup.ButtonState.ENABLED;
diff --git a/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_types.js b/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_types.js index 338e9ccd..d18f196 100644 --- a/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_types.js +++ b/ui/webui/resources/cr_components/chromeos/cellular_setup/cellular_types.js
@@ -24,7 +24,6 @@ BACKWARD: 1, CANCEL: 2, FORWARD: 3, - TRY_AGAIN: 4, }; /** @@ -32,7 +31,6 @@ * backward: (!cellularSetup.ButtonState|undefined), * cancel: (!cellularSetup.ButtonState|undefined), * forward: (!cellularSetup.ButtonState|undefined), - * tryAgain: (!cellularSetup.ButtonState|undefined), * }} */ /* #export */ let ButtonBarState;
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_config.html b/ui/webui/resources/cr_components/chromeos/network/network_config.html index d2d7443..839b46ce 100644 --- a/ui/webui/resources/cr_components/chromeos/network/network_config.html +++ b/ui/webui/resources/cr_components/chromeos/network/network_config.html
@@ -39,8 +39,7 @@ <template is="dom-if" if="[[isWiFi_(mojoType_)]]" restamp> <network-config-input id="ssid" label="[[i18n('OncWiFi-SSID')]]" value="{{configProperties_.typeConfig.wifi.ssid}}" - readonly="[[hasGuid_(guid)]]" - on-enter="onEnterPressedInInput_"> + readonly="[[hasGuid_(guid)]]"> </network-config-input> </template> @@ -61,7 +60,6 @@ <network-password-input id="wifi-passphrase" label="[[i18n('OncWiFi-Passphrase')]]" value="{{configProperties_.typeConfig.wifi.passphrase}}" - on-enter="onEnterPressedInInput_" property="[[managedProperties_.typeProperties.wifi.passphrase]]"> </network-password-input> </template> @@ -83,13 +81,11 @@ <template is="dom-if" if="[[!showVpn_.OpenVPN]]"> <network-config-input label="[[i18n('OncVPN-L2TP-Username')]]" value="{{configProperties_.typeConfig.vpn.l2tp.username}}" - property="[[managedProperties_.typeProperties.vpn.l2tp.username]]" - > + property="[[managedProperties_.typeProperties.vpn.l2tp.username]]"> </network-config-input> <network-password-input label="[[i18n('OncVPN-L2TP-Password')]]" value="{{configProperties_.typeConfig.vpn.l2tp.password}}" - property="[[managedProperties_.typeProperties.vpn.l2tp.password]]" - > + property="[[managedProperties_.typeProperties.vpn.l2tp.password]]"> </network-password-input> <network-config-input label="[[i18n('OncVPN-IPsec-Group')]]" value="{{configProperties_.typeConfig.vpn.ipSec.group}}" @@ -166,7 +162,7 @@ property="[[managedEapProperties_.clientCertType]]" device-certs-only="[[deviceCertsOnly_]]"> </network-config-select> - <network-config-input label="[[i18n('OncEAP-Identity')]]" + <network-config-input id="oncEAPIdentity" label="[[i18n('OncEAP-Identity')]]" value="{{eapProperties_.identity}}" hidden="[[!showEap_.Identity]]" property="[[managedEapProperties_.identity]]"> </network-config-input>
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_config.js b/ui/webui/resources/cr_components/chromeos/network/network_config.js index ea82a05..0f09dc9 100644 --- a/ui/webui/resources/cr_components/chromeos/network/network_config.js +++ b/ui/webui/resources/cr_components/chromeos/network/network_config.js
@@ -335,6 +335,8 @@ 'updateIsConfigured_(selectedUserCertHash_)', ], + listeners: {'enter': 'onEnterEvent_'}, + /** @const */ MIN_PASSPHRASE_LENGTH: 5, @@ -457,6 +459,18 @@ } }, + /** + * @param {!Event} event + * @private + */ + onEnterEvent_(event) { + if (event.path[0].localName === 'network-config-input' || + event.path[0].localName === 'network-password-input') { + this.onEnterPressedInInput_(); + event.stopPropagation(); + } + }, + /** @private */ onEnterPressedInInput_() { if (!this.isConfigured_) {
diff --git a/ui/webui/resources/cr_components/chromeos/network/onc_mojo.js b/ui/webui/resources/cr_components/chromeos/network/onc_mojo.js index 97f830e..7fdc048 100644 --- a/ui/webui/resources/cr_components/chromeos/network/onc_mojo.js +++ b/ui/webui/resources/cr_components/chromeos/network/onc_mojo.js
@@ -691,6 +691,10 @@ switch (properties.type) { case mojom.NetworkType.kCellular: const cellularProperties = properties.typeProperties.cellular; + networkState.typeState.cellular.iccid = + cellularProperties.iccid || ''; + networkState.typeState.cellular.eid = + cellularProperties.eid || ''; networkState.typeState.cellular.activationState = cellularProperties.activationState; networkState.typeState.cellular.networkTechnology =
diff --git a/ui/webui/resources/cr_elements/BUILD.gn b/ui/webui/resources/cr_elements/BUILD.gn index abae49c..d36037f7 100644 --- a/ui/webui/resources/cr_elements/BUILD.gn +++ b/ui/webui/resources/cr_elements/BUILD.gn
@@ -48,6 +48,7 @@ out_manifest = "$target_gen_dir/$preprocess_polymer2_manifest" in_files = [ "action_link_css.html", + "cr_actionable_row_style.html", "cr_action_menu/cr_action_menu.html", "cr_action_menu/cr_action_menu.js", "cr_button/cr_button.html", @@ -158,6 +159,7 @@ out_manifest = "$target_gen_dir/$preprocess_gen_manifest" in_files = [ "action_link_css.m.js", + "cr_actionable_row_style.m.js", "cr_action_menu/cr_action_menu.m.js", "cr_button/cr_button.m.js", "cr_checkbox/cr_checkbox.m.js", @@ -328,6 +330,12 @@ html_type = "style-module" } +polymer_modulizer("cr_actionable_row_style") { + js_file = "cr_actionable_row_style.m.js" + html_file = "cr_actionable_row_style.html" + html_type = "style-module" +} + polymer_modulizer("cr_page_host_style_css") { js_file = "cr_page_host_style_css.m.js" html_file = "cr_page_host_style_css.html" @@ -387,6 +395,7 @@ group("polymer3_elements") { public_deps = [ ":action_link_css_module", + ":cr_actionable_row_style_module", ":cr_icons_css_module", ":cr_page_host_style_css_module", ":hidden_style_css_module",
diff --git a/ui/webui/resources/cr_elements/cr_actionable_row_style.html b/ui/webui/resources/cr_elements/cr_actionable_row_style.html new file mode 100644 index 0000000..a8d1a5c --- /dev/null +++ b/ui/webui/resources/cr_elements/cr_actionable_row_style.html
@@ -0,0 +1,39 @@ +<link rel="import" href="../html/polymer.html"> + +<link rel="import" href="shared_vars_css.html"> + +<!-- + Styles dedicated to a single, actionable row where clicking anywhere on the + entire row will activate the row. +--> +<dom-module id="cr-actionable-row-style"> + <template> + <style> + :host { + align-items: center; + align-self: stretch; + cursor: pointer; + display: flex; + flex: 1; + margin: 0; + outline: none; + } + + :host(:hover) { + background-color: var(--cr-hover-background-color); + } + + :host(:active) { + background-color: var(--cr-active-background-color); + } + + /* Do not show hover or active states for cr-icon-buttons that are + * embedded within the row to avoid showing multiple layers of + * backgrounds. */ + cr-icon-button { + --cr-icon-button-hover-background-color: transparent; + --cr-icon-button-active-background-color: transparent; + } + </style> + </template> +</dom-module> \ No newline at end of file
diff --git a/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.html b/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.html index ab2fa36..99b9bde 100644 --- a/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.html +++ b/ui/webui/resources/cr_elements/cr_expand_button/cr_expand_button.html
@@ -1,20 +1,14 @@ <link rel="import" href="../../html/polymer.html"> <link rel="import" href="../../html/cr/ui/focus_without_ink.html"> +<link rel="import" href="../cr_actionable_row_style.html"> <link rel="import" href="../cr_icon_button/cr_icon_button.html"> <link rel="import" href="../icons.html"> <link rel="import" href="../shared_vars_css.html"> <dom-module id="cr-expand-button"> <template> - <style> - :host { - align-items: center; - cursor: pointer; - display: flex; - outline: none; - } - + <style include="cr-actionable-row-style"> :host([disabled]) { opacity: 0.65; pointer-events: none;
diff --git a/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.html b/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.html index 6e93129..859cbb3 100644 --- a/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.html +++ b/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.html
@@ -2,13 +2,11 @@ <link rel="import" href="../shared_vars_css.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> -<link rel="import" href="chrome://resources/polymer/v1_0/paper-behaviors/paper-ripple-behavior.html"> <dom-module id="cr-icon-button"> <template> <style> :host { - --cr-icon-button-fill-color: var(--google-grey-refresh-700); --cr-icon-button-icon-start-offset: 0; --cr-icon-button-icon-size: 20px; --cr-icon-button-size: 36px; @@ -17,7 +15,7 @@ --cr-icon-button-width: var(--cr-icon-button-size); /* Copied from paper-fab.html. Prevents square touch highlight. */ -webkit-tap-highlight-color: transparent; - border-radius: 4px; + border-radius: 50%; color: var(--cr-icon-button-stroke-color, var(--cr-icon-button-fill-color)); cursor: pointer; @@ -28,11 +26,27 @@ var(--cr-icon-ripple-margin)); margin-inline-start: var(--cr-icon-button-margin-start); outline: none; + overflow: hidden; user-select: none; vertical-align: middle; width: var(--cr-icon-button-width); } + :host(:hover) { + background-color: var(--cr-icon-button-hover-background-color, + var(--cr-hover-background-color)); + } + + :host(:focus-visible:focus) { + box-shadow: inset 0 0 0 2px var(--cr-icon-button-focus-outline-color, + var(--cr-focus-outline-color)); + } + + :host(:active) { + background-color: var(--cr-icon-button-active-background-color, + var(--cr-focus-outline-color)); + } + :host([disabled]) { cursor: initial; opacity: var(--cr-disabled-opacity); @@ -86,20 +100,10 @@ stroke var(--cr-icon-button-transition); } - paper-ripple { - /* GG900 .15 is about GG700 .21 */ - --paper-ripple-opacity: var(--cr-icon-button-ripple-opacity, .21); - } - - @media (prefers-color-scheme: dark) { :host { --cr-icon-button-fill-color: var(--google-grey-refresh-500); } - - paper-ripple { - --paper-ripple-opacity: var(--cr-icon-button-ripple-opacity, .4); - } } </style> <div id="icon">
diff --git a/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.js b/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.js index d06a35b..a5bb2d68 100644 --- a/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.js +++ b/ui/webui/resources/cr_elements/cr_icon_button/cr_icon_button.js
@@ -43,10 +43,6 @@ Polymer({ is: 'cr-icon-button', - behaviors: [ - Polymer.PaperRippleBehavior, - ], - properties: { disabled: { type: Boolean, @@ -69,23 +65,11 @@ reflectToAttribute: true, }, - noRippleOnFocus: { - type: Boolean, - value: false, - }, - /** @private */ multipleIcons_: { type: Boolean, reflectToAttribute: true, }, - - /** @private */ - rippleShowing_: { - type: Boolean, - value: false, - reflectToAttribute: true, - }, }, hostAttributes: { @@ -97,12 +81,8 @@ listeners: { blur: 'onBlur_', click: 'onClick_', - down: 'showRipple_', - focus: 'onFocus_', keydown: 'onKeyDown_', keyup: 'onKeyUp_', - pointerdown: 'ensureRipple', - up: 'hideRipple_', }, /** @@ -116,22 +96,6 @@ */ spaceKeyDown_: false, - /** @private */ - hideRipple_() { - if (this.hasRipple()) { - this.getRipple().clear(); - this.rippleShowing_ = false; - } - }, - - /** @private */ - showRipple_() { - if (!this.noink && !this.disabled) { - this.getRipple().showAndHoldDown(); - this.rippleShowing_ = true; - } - }, - /** * @param {boolean} newValue * @param {boolean} oldValue @@ -161,19 +125,8 @@ }, /** @private */ - onFocus_() { - if (!this.noRippleOnFocus) { - this.showRipple_(); - } - }, - - /** @private */ onBlur_() { this.spaceKeyDown_ = false; - - if (!this.noRippleOnFocus) { - this.hideRipple_(); - } }, /** @@ -203,14 +156,6 @@ .forEach(child => child.setAttribute('role', 'none')); } }); - if (!this.hasRipple()) { - return; - } - if (icons.length > 1) { - this.getRipple().classList.remove('circle'); - } else { - this.getRipple().classList.add('circle'); - } }, /** @@ -250,17 +195,5 @@ this.click(); } }, - - // customize the element's ripple - _createRipple() { - this._rippleContainer = this.$.icon; - const ripple = Polymer.PaperRippleBehavior._createRipple(); - ripple.id = 'ink'; - ripple.setAttribute('recenters', ''); - if (!(this.ironIcon || '').includes(',')) { - ripple.classList.add('circle'); - } - return ripple; - }, }); /* #ignore */ console.warn('crbug/1173575, non-JS module files deprecated.');
diff --git a/ui/webui/resources/cr_elements/cr_link_row/cr_link_row.html b/ui/webui/resources/cr_elements/cr_link_row/cr_link_row.html index 7b5da7e..280e7010 100644 --- a/ui/webui/resources/cr_elements/cr_link_row/cr_link_row.html +++ b/ui/webui/resources/cr_elements/cr_link_row/cr_link_row.html
@@ -1,5 +1,6 @@ <link rel="import" href="../../html/polymer.html"> +<link rel="import" href="../cr_actionable_row_style.html"> <link rel="import" href="../cr_icon_button/cr_icon_button.html"> <link rel="import" href="../hidden_style_css.html"> <link rel="import" href="../icons.html"> @@ -9,20 +10,13 @@ <dom-module id="cr-link-row"> <template strip-whitespace=""> - <style include="cr-shared-style cr-hidden-style"> + <style include="cr-actionable-row-style cr-shared-style cr-hidden-style"> :host { - align-items: center; - align-self: stretch; box-sizing: border-box; - cursor: pointer; - display: flex; - flex: 1; font-family: inherit; font-size: 100%; /* Specifically for Mac OSX, harmless elsewhere. */ line-height: 154%; /* 20px. */ - margin: 0; min-height: var(--cr-section-min-height); - outline: none; padding: 0; }
diff --git a/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.html b/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.html index 2470260a..fd733fc 100644 --- a/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.html +++ b/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.html
@@ -53,6 +53,7 @@ @media (prefers-color-scheme: light) { cr-icon-button { --cr-icon-button-fill-color: currentColor; + --cr-icon-button-focus-outline-color: white; } }
diff --git a/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.html b/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.html index 09d5386..92077cc 100644 --- a/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.html +++ b/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.html
@@ -31,6 +31,7 @@ @media (prefers-color-scheme: light) { cr-icon-button { + --cr-icon-button-focus-outline-color: white; --cr-icon-button-fill-color: var( --cr-toolbar-search-field-input-icon-color, white);
diff --git a/ui/webui/resources/cr_elements/shared_vars_css.html b/ui/webui/resources/cr_elements/shared_vars_css.html index 4e7eb2ad..d8bda6a 100644 --- a/ui/webui/resources/cr_elements/shared_vars_css.html +++ b/ui/webui/resources/cr_elements/shared_vars_css.html
@@ -97,6 +97,10 @@ --cr-title-text-color: rgb(90, 90, 90); --cr-toggle-color: var(--google-blue-500); --cr-toolbar-background-color: var(--google-blue-700); + + --cr-hover-background-color: rgba(var(--google-grey-900-rgb), .1); + --cr-active-background-color: rgba(var(--google-grey-900-rgb), .16); + --cr-focus-outline-color: rgba(var(--google-blue-600-rgb), .4); } @media (prefers-color-scheme: dark) { @@ -120,6 +124,10 @@ /* TODO(dbeam): --cr-toggle-color (CrOS only). */ --cr-title-text-color: var(--cr-primary-text-color); --cr-toolbar-background-color: var(--google-grey-900-white-4-percent); + + --cr-hover-background-color: rgba(255, 255, 255, .1); + --cr-active-background-color: rgba(var(--google-grey-200-rgb), .16); + --cr-focus-outline-color: rgba(var(--google-blue-300-rgb), .4); } }
diff --git a/weblayer/shell/browser/shell.cc b/weblayer/shell/browser/shell.cc index 0f72142..1ba2ee4 100644 --- a/weblayer/shell/browser/shell.cc +++ b/weblayer/shell/browser/shell.cc
@@ -39,10 +39,6 @@ tab()->AddObserver(this); tab()->GetNavigationController()->AddObserver(this); #if !defined(OS_ANDROID) // Android does this in Java. - - // TODO: how will tests work with this on android? can we get to the - // concrete type? - static_cast<TabImpl*>(tab())->profile()->SetDownloadDelegate(this); #endif } @@ -52,6 +48,9 @@ if (tab()) { tab()->GetNavigationController()->RemoveObserver(this); tab()->RemoveObserver(this); +#if !defined(OS_ANDROID) // Android does this in Java. + static_cast<TabImpl*>(tab())->profile()->SetDownloadDelegate(nullptr); +#endif } PlatformCleanUp();